ros:init()

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

本站公眾號
   歡迎關注本站公眾號,獲取更多信息