ros::init()是ROS程序調用的第一個函數,用於對ROS程序的初始化。node
ros::init()函數的聲明在ROS代碼中的./src/ros_comm/roscpp/include/ros/init.h
文件中。app
該函數的具體實如今./src/ros_comm/roscpp/src/libros/init.cpp
文件中。tcp
該函數主要調用瞭如下五個函數對ROS程序進行初始化:函數
network::init(remappings);
master::init(remappings);
this_node::init(name, remappings, options);
file_log::init(remappings);
param::init(remappings);
ui
network::init(remappings)
其實如今./src/ros_comm/roscpp/src/libros/network.cpp
中。this
該函數從輸入參數remappings提取信息,完成對 g_host 和 g_tcpros_server_port 兩個變量的賦值。spa
g_host:(1)首先嚐試 remappings[ __hostname ];(2)而後嘗試 remappings[ __ip ];(3)最後嘗試 determineHost()。
g_tcpros_server_port:嘗試經過 remappings[ __tcpros_server_port]賦值。.net
master::init(remappings)
日誌
master::init()函數定義在./src/ros_comm/roscpp/src/libros/master.cpp
文件中。code
該函數從輸入參數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