1. 程式人生 > >ROS學習筆記25(名稱空間和重對映)

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 有效名稱

有效名稱具有以下特徵:

  1. 第一個字元是字母字元([az | AZ]),代字號(〜)或正斜槓(/)

  2. 後續字元可以是字母數字([0-9 | az | AZ]),下劃線(_)或正斜槓(/)

例外:基本名稱(如下所述)不能包含正斜槓(/)或波浪號(〜)。

1.3 命名解析

ROS中有四種類型的圖形資源名稱:baserelativeglobalprivate,它們具有以下語法:

  • 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/ 擁有私有名稱空間

/wg/node1。專用名稱對於通過引數伺服器將引數傳遞到特定節點很有用。以下是一些名稱解析示例:

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>/fooAfter resolution, a direct string match is used, so you cannot use it to remap parts of Names,即foo:=bar將匹配foo或/<node_namespace>/foo,但不匹配foo/bazThe 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