1. 程式人生 > 其它 >4.4 ROS節點名稱重名

4.4 ROS節點名稱重名

4.4 ROS節點名稱重名

場景:ROS 中建立的節點是有名稱的,C++初始化節點時通過API:ros::init(argc,argv,"xxxx");來定義節點名稱,在Python中初始化節點則通過rospy.init_node("yyyy")來定義節點名稱。在ROS的網路拓撲中,是不可以出現重名的節點的,因為假設可以重名存在,那麼呼叫時會產生混淆,這也就意味著,不可以啟動重名節點或者同一個節點啟動多次,的確,在ROS中如果啟動重名節點的話,之前已經存在的節點會被直接關閉,但是如果有這種需求的話,怎麼優化呢?

在ROS中給出的解決策略是使用名稱空間名稱重對映


名稱空間就是為名稱新增字首,名稱重對映是為名稱起別名。這兩種策略都可以解決節點重名問題,兩種策略的實現途徑有多種:

  • rosrun 命令
  • launch 檔案
  • 編碼實現

以上三種途徑都可以通過名稱空間或名稱重對映的方式,來避免節點重名,本節將對三者的使用逐一演示,三者要實現的需求類似。

案例

啟動兩個 turtlesim_node 節點,當然如果直接開啟兩個終端,直接啟動,那麼第一次啟動的節點會關閉,並給出提示:

[ WARN] [1578812836.351049332]: Shutdown request received.
[ WARN] [1578812836.351207362]: Reason given for shutdown: [new node registered with same name]

因為兩個節點不能重名,接下來將會介紹解決重名問題的多種方案。


4.4.1 rosrun設定名稱空間與重對映

1.rosrun設定名稱空間

1.1設定名稱空間演示

語法: rosrun 包名 節點名 __ns:=新名稱

rosrun turtlesim turtlesim_node __ns:=/xxx

rosrun turtlesim turtlesim_node __ns:=/yyy

兩個節點都可以正常執行

1.2執行結果

rosnode list檢視節點資訊,顯示結果:

/xxx/turtlesim
/yyy/turtlesim

2.rosrun名稱重對映

2.1為節點起別名

語法: rosrun 包名 節點名 __name:=新名稱

rosrun turtlesim  turtlesim_node __name:=t1 |  rosrun turtlesim   turtlesim_node /turtlesim:=t1(不適用於python)

rosrun turtlesim  turtlesim_node __name:=t2 |  rosrun turtlesim   turtlesim_node /turtlesim:=t2(不適用於python)

兩個節點都可以執行

2.2執行結果

rosnode list檢視節點資訊,顯示結果:

/t1
/t2

3.rosrun名稱空間與名稱重對映疊加

3.1設定名稱空間同時名稱重對映

語法: rosrun 包名 節點名 __ns:=新名稱 __name:=新名稱

rosrun turtlesim turtlesim_node __ns:=/xxx __name:=tn
3.2執行結果

rosnode list檢視節點資訊,顯示結果:

/xxx/tn

使用環境變數也可以設定名稱空間,啟動節點前在終端鍵入如下命令:

export ROS_NAMESPACE=xxxx


4.4.2 launch檔案設定名稱空間與重對映

介紹 launch 檔案的使用語法時,在 node 標籤中有兩個屬性: name 和 ns,二者分別是用於實現名稱重對映與名稱空間設定的。使用launch檔案設定名稱空間與名稱重對映也比較簡單。

1.launch檔案

<launch>

    <node pkg="turtlesim" type="turtlesim_node" name="t1" />
    <node pkg="turtlesim" type="turtlesim_node" name="t2" />
    <node pkg="turtlesim" type="turtlesim_node" name="t1" ns="hello"/>

</launch>

在 node 標籤中,name 屬性是必須的,ns 可選。

2.執行

rosnode list檢視節點資訊,顯示結果:

/t1
/t2
/t1/hello