天天看點

ROS命名空間

ROS指令空間是一個很重要的内容,官方文檔:http://wiki.ros.org/Names

分為三類:relative,global,private。下邊是一個官網給的示例。

Node Relative (default) Global Private
/node1 bar -> /bar /bar -> /bar ~bar -> /node1/bar
/wg/node2 bar -> /wg/bar /bar -> /bar ~bar -> /wg/node2/bar
/wg/node3 foo/bar -> /wg/foo/bar /foo/bar -> /foo/bar ~foo/bar -> /wg/node3/foo/bar

global最好了解,隻要字首是/,那麼命名空間就和寫的一樣,不會改變。

private也好了解,字首是~,那麼命名空間的字首包含節點的命名空間,相當于是節點命名空間下的一個屬性。

relative直覺的看起來,是和節點的命名空間并列的,即和節點的命名空間相比,擁有相同的字首。

下邊用一個launch檔案和param獲得參數的例子說明一下

1. relative的方式

launch檔案

<launch>
    <arg name="id" default="0"/>
    <node name="uav$(arg id)" pkg="test_limit" type="main" output="screen"/>
    <param name="id" type="int" value="$(arg id)"/>
</launch>
           

cpp檔案部分

ros::NodeHandle nh;
nh.param<int>("id", id, 1);
           

2. private的方式

launch檔案

<launch>
    <arg name="id" default="0"/>
    <node name="uav$(arg id)" pkg="test_limit" type="main" output="screen">
        <param name="id" type="int" value="$(arg id)"/>
    </node>
</launch>
           

cpp檔案部分

ros::NodeHandle nh_private("~");
nh_private.param<int>("id", id, 1);
           

可以看出cpp檔案部分param的參數都是"id",但是launch檔案部分不同,relative方式的node和param是并列的,而在private的方式裡param是node的部分。

relative方式的launch檔案如果有多個同時啟動,則id的值就會被互相覆寫,因為多個檔案中的id的命名空間都是/id。之前不知道private方式的用法,通過加group的方式解決的,走彎路了。一般從launch檔案中擷取節點的參數時都是用private的方式。

ros