ros:init()
ros::init()是ROS程序调用的第一个函数,用于对ROS程序的初始化。
ros::init()函数的声明在ROS代码中的./src/ros_comm/roscpp/include/ros/init.h
文件中。
该函数的具体实现在./src/ros_comm/roscpp/src/libros/init.cpp
文件中。
该函数主要调用了以下五个函数对ROS程序进行初始化:
network::init(remappings);
master::init(remappings);
this_node::init(name, remappings, options);
file_log::init(remappings);
param::init(remappings);
network::init(remappings)
其实现在./src/ros_comm/roscpp/src/libros/network.cpp
中。
该函数从输入参数remappings提取信息,完成对 g_host 和 g_tcpros_server_port 两个变量的赋值。
g_host:(1)首先尝试 remappings[ __hostname ];(2)然后尝试 remappings[ __ip ];(3)最后尝试 determineHost()。
g_tcpros_server_port:尝试通过 remappings[ __tcpros_server_port]赋值。
master::init(remappings)
master::init()函数定义在./src/ros_comm/roscpp/src/libros/master.cpp
文件中。
该函数从输入参数remappings提取信息,对g_uri进行赋值,然后再将g_uri解析成g_host和g_port。
g_uri:(1)尝试通过remappings[ __master ]进行赋值;(2)尝试通过ROS_MASTER_URI的环境变量值进行赋值。
this_node::init(name, remappings, options)
this_node::init()函数的源代码在./src/ros_comm/roscpp/src/libros/this_node.cpp
该函数对ThisNode类进行初始化,具体地是对该类的成员变量 name_ 和 namespace_ 进行赋值。另外,在ROS程序中,ThisNode类的实例化用了单例模式,整个ROS程序只有singleton一个ThisNode类的对象。
name_:(1)用该函数的输入参数name对该变量进行赋值;(2)在remappings中查找remappings[ _name ],如果存在,则用该项的值覆盖name,并将disable_anon置成true。
namespace_:(1)尝试用ROS_NAMESPACE的环境变量值对其进行赋值;(2)在remappings中查找remappings[ _ns ],如果存在,则用该项的值覆盖namespace。
除此之外,该函数还
调用了names::init(remappings),将remappings映射为g_remappings和g_unresolved_remappings两个变量
调用了ros::console::setFixedFilterToken,增加了一项g_extra_fixed_tokens[node] = name_
file_log::init(remappings)
file_log::init()函数定义在./src/ros_comm/roscpp/src/libros/file_log.cpp
该函数主要是根据环境变量,生成日志文件的路径和文件名,并赋值给g_log_directory。
param::init(remappings)
该函数定义在./src/ros_comm/roscpp/src/libros/param.cpp
文件中。
该函数主要完成一些与执行XML-RPC相关的操作,实现的内容比较多,有待进一步的分析。
总结
根据分析,ros::init()调用的五个函数,即:
network::init(remappings);
master::init(remappings);
this_node::init(name, remappings, options);
file_log::init(remappings);
param::init(remappings);
中,最后一个函数涉及到执行XML-RPC相关操作,而XML-RPC协议是ROS节点通讯的核心调用机制,后续我们会着重进行分析。前面4个函数的功能都主要是对一些全局变量进行赋值。被赋值的变量有(与前面不同,在此我们加上的命名空间):
ros::network::g_host
ros::network::g_tcpros_server_port
ros::master::g_uri
ros::this_node::ThisNode.name_
ros::this_node::ThisNode.namespace_
ros::console::g_extra_fixed_tokens[node]
ros::file_log::g_log_directory
具体这些变量被赋值后,发挥了怎样的作用,在后续对ROS的XML-RPC通信实现进行了分析之后,再进行细致地解析。
参考链接:https://blog.csdn.net/wanghuiquan0712/article/details/78052093