ROS源代码阅读(5):ROS程序的初始化——对ros:init()的总结

回顾

ros::init()是ROS程序调用的第一个函数,用于对ROS程序的初始化。该函数主要调用了以下五个函数对ROS程序进行初始化:

  • network::init(remappings);
  • master::init(remappings);
  • this_node::init(name, remappings, options);
  • file_log::init(remappings);
  • param::init(remappings);

详述见我的博文从ros:init()出发。

network::init(remappings)

分析详见我的博文从ros:init()出发。
该函数从输入参数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)

分析详见我的博文从ros:init()出发。

该函数从输入参数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()

该函数对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()和param::init()。
该函数主要是根据环境变量,生成日志文件的路径和文件名,并赋值给g_log_directory。

param::init(remappings)

分析详见我的博文file_log::init()和param::init()。
该函数主要完成一些与执行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通信实现进行了分析之后,再进行细致地解析。

你可能感兴趣的:(ROS解析)