1. 程式人生 > >roslaunch檔案中的區域性引數與全域性引數

roslaunch檔案中的區域性引數與全域性引數

最近在看在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