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