roslaunch檔案中的區域性引數與全域性引數
阿新 • • 發佈:2018-12-30
最近在看在C++中用roslaunch載入引數, 為了講解清楚下面給出一些例子.
Node Handles
首先,來看兩種不同的建立方式:
ros::NodeHandle n;
ros::NodeHandle nh(“~”);
波浪符代表節點控制代碼的名稱空間,其作用與C++的”this”指標和python中的”self”類似.在ros中可以使用 roslaunch 進行引數傳遞. 在 launch 標籤內的是全域性引數,而在node 標籤內的則是區域性引數。
來看一些例項,程式碼可以在git上下載。 https://github.com/dougbot01/ros_param_test.
<launch>
<param name="serial" value="5" />
<node name="___" pkg="ros_param_test" type="___" output="screen">
<param name="serial" value="10" />
</node>
</launch>
上訴程式碼中有兩個同名引數. 在launch 標籤內的是全域性引數值為5, node 標籤內的是區域性引數其有效域是當前節點。 下面我們分析下在node handle的不同名稱空間下取值情況。
Case 1
ros::NodeHandle無波浪符
#include <ros/ros.h>
int main(int argc, char* argv[])
{
int serial_number = -1;
ros::init(argc, argv, "parameter_test");
//n is in the global namespace
ros::NodeHandle n;
n.getParam("serial", serial_number);
ros::Rate loop_rate(10);
ROS_INFO ("Serial was %d", serial_number);
while (ros::ok())
{
ros::spinOnce();
loop_rate.sleep();
}
}
執行節點
$ roslaunch ros_param_test case_1.launch
結果如下
process[param_test_global-2]: started with pid [11714]
[ INFO] [1347251105.803738523]: Serial was 5
可以看到,返回的是全域性引數. 新建命令列視窗,輸入
$ rosparam dump dump.yaml
$ cat dump.yaml
將所有引數存入dump.yaml並列印在視窗上. 結果如下
param_test_global: {serial: 10}
serial: 5
Case 2
ros::NodeHandle有波浪符
...
ros::NodeHandle n("~");
n.getParam("serial", serial_number);
...
執行節點,結果輸出如下
$ roslaunch ros_param_test case_2.launch
process[param_test_local-2]: started with pid [12023]
[ INFO] [1347252255.817196129]: Serial was 10
Case 3
如果我們使用node空間,但是想使用全域性空間的引數怎麼辦?只要在變數前面加上”/”就獲得全域性引數。 如 “/serial”
...
ros::NodeHandle n("~");
n.getParam("/serial", serial_number);
..
$ roslaunch ros_param_test case_3.launch
process[param_test_global_from_local-2]: started with pid [12095]
[ INFO] [1347252568.093727493]: Serial was 5
Case 4
如果想在全域性空間使用node空間的變數又該怎樣?只需在變數前面加上node名稱空間的值就可以了。例如 “/param_test_local_from_global/serial”
...
ros::NodeHandle n;
n.getParam("/param_test_local_from_global/serial", serial_number);
...
$ roslaunch ros_param_test case_4.launch
process[param_test_local_from_global-2]: started with pid [12162]
[ INFO] [1347252635.929627917]: Serial was 10