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

原文地址:https://www.cnblogs.com/klcf0220/p/11049857.html