1. 程式人生 > >ROS原始碼閱讀(5):ROS程式的初始化——對ros:init()的總結

ROS原始碼閱讀(5):ROS程式的初始化——對ros:init()的總結

https://blog.csdn.net/wanghuiquan0712/article/details/78052093

回顧
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通訊實現進行了分析之後,再進行細緻地解析。