ROS學習筆記25(名稱空間和重對映)
1 名稱
1.1 Graph Resource Names
Graph Resource Names提供分層命名結構,用於ROS計算圖中的所有資源,例如節點,引數,主題和服務。這些名稱在ROS中非常強大,並且在ROS中組成更大和更復雜的系統是至關重要的,因此瞭解這些名稱如何工作以及如何操作它們至關重要。
在我們進一步描述名稱之前,這裡有一些示例名稱:
-
/ (the global namespace)
-
/foo
-
/stanford/robot/name
-
/wg/node1
Graph Resource Names是ROS中用於提供封裝的重要機制。每個資源都在名稱空間中定義,它可以與許多其他資源共享。
通常,資源可以在其名稱空間內建立資源,並且可以訪問其自己的名稱空間內或之上的資源。
1.2 有效名稱
有效名稱具有以下特徵:
-
第一個字元是字母字元([az | AZ]),代字號(〜)或正斜槓(/)
-
後續字元可以是字母數字([0-9 | az | AZ]),下劃線(_)或正斜槓(/)
例外:基本名稱(如下所述)不能包含正斜槓(/)或波浪號(〜)。
1.3 命名解析
ROS中有四種類型的圖形資源名稱:base,relative,global和private,它們具有以下語法:
-
base
-
relative/name
-
/global/name
-
~private/name
By default, resolution is done relative to the node's namespace。
例如,節點/wg/node1具有名稱空間/wg,因此名稱node2將解析為/wg/node2。沒有名稱空間限定符的名稱是基本名稱。基本名稱實際上是相對名稱的子類,具有相同的解析規則。基本名稱最常用於初始化節點名稱。以“/”開頭的名稱是全域性名稱。它們被認為是完全解析的。應儘可能避免全域性名稱,因為它們限制了程式碼的可移植性。以“〜”開頭的名稱是私有名稱。它們將節點的名稱轉換為名稱空間。例如,node1在名稱空間/WG/ 擁有私有名稱空間
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 |
1.4 示例
int main(int argc, char ** argv)
{
ros::init(argc,argc,"node1");
ros::NodeHandle nh;
ros::Publisher node1_pub = nh.advertise<std_msgs:Int32>("bar",10);
節點名稱為node1,上面的話題名稱與/bar具有相同的名字。 使用斜槓/字元作為全域性形式,話題名也是/bar。
ros::Publisher node1_pub = nh.advertise<std_msgs:Int32>("/bar",10);
但是當使用波浪線(~)將其宣告為私有,那麼話題名稱即是/node1/bar。
ros::Publisher node1_pub = nh.advertise<std_msgs:Int32>("~bar",10);
2 重對映
在命令列啟動節點時,可以重新對映ROS節點中的任何名稱。有關此功能的更多資訊,請參閱重對映引數。這是ROS的一個強大功能,它允許您從命令列在不同配置下啟動相同的節點。可以將重新對映的引數傳遞給任何節點,並使用語name:=new_name。例如,要將talker節點配置為釋出/wg/chatter話題而不是chatter話題。
rosrun rospy_tutorials talker chatter:=/wg/chatter
我們在匹配之前先進行解析引數。The effect of this is that you are remapping a full name, whereas before the remappings only applied to a specific string.例如,foo:=bar以前只匹配確切的字串foo,但它也匹配/<node_namespace>/foo。After resolution, a direct string match is used, so you cannot use it to remap parts of Names,即foo:=bar將匹配foo或/<node_namespace>/foo,但不匹配foo/baz。The one exception to this is when using searchParam, which keeps the old behavior. This is because searchParam itself works on unresolved names.
Node Namespace |
Remapping Argument |
Matching Names |
Final Resolved Name |
/ |
foo:=bar |
foo, /foo |
/bar |
/baz |
foo:=bar |
foo, /baz/foo |
/baz/bar |
/ |
/foo:=bar |
foo, /foo |
/bar |
/baz |
/foo:=bar |
/foo |
/baz/bar |
/baz |
/foo:=/a/b/c/bar |
/foo |
/a/b/c/bar |
2.1 "Pushing Down"
該ROS_NAMESPACE 環境變數,您可以更改正在啟動的節點,從而有效地重新對映所有在該節點名稱的名稱空間。當所有節點在全域性名稱空間中啟動時,這實際上將其“Pushing Down”到子名稱空間中。更改節點的名稱空間是一種簡單的整合程式碼的機制,因為節點中的所有名稱 - 節點名稱,主題,服務和引數 - 都將被重新調整。
注意:為了使此功能正常工作,重要的是您的程式避免使用全域性名稱,而是使用相對和私有名稱。
2.2 節點引數分配
您可以使用單個下劃線_作為字首直接從命令列為節點分配私有引數。例如,
rosrun rospy_tutorials talker _param:= 1.0
將~param設定為1.0。ROS使用YAML語法來確定引數型別。
2.3 Special keys
-
__name是“節點名稱”的特殊保留關鍵字。它允許您重新對映節點名稱,而無需知道其實際名稱。它只能在正在啟動的程式包含一個節點時使用。下面的節點名稱分別為A和B。
rosrun turtlesim turtlesim_node __name:=A
rosrun turtlesim turtlesim_node __name:=B
-
__log是一個保留關鍵字,用於指定應寫入節點日誌檔案的位置。通常不鼓勵使用此關鍵字 - 它主要供ROS工具(如roslaunch)使用。
-
__ip和__hostname是替代ROS_IP和ROS_HOSTNAME。通常不鼓勵使用此關鍵字,因為它是針對無法設定環境變數的特殊情況。
-
__master是ROS_MASTER_URI的替代品。通常不鼓勵使用此關鍵字,因為它是針對無法設定環境變數的特殊情況。
-
__ns是ROS_NAMESPACE的替代品。通常不鼓勵使用此關鍵字,因為它是針對無法設定環境變數的特殊情況。 下面的名稱空間分別為A和B。
rosrun turtlesim turtlesim_node __ns:=A
rosrun turtlesim turtlesim_node __ns:=B