全局命名空間:
/rosout前面的反斜杠“/”表明該節點名稱屬於全局命名空間。之所以叫做全局名稱因為它們在任何地方(包括代碼、命令行工具、圖形界面工具等的任何地方)都可以使用。無論這些名稱用作眾多命令行工具的參數還是用在節點內部,它們都有明確的含義。這些名稱從來不會產生二義性,也無需額外的上下文信息來決定名稱指的哪個資源。如/turtle1/cmd_vel 由斜杠分開的一系列命名空間(namespace),每個斜杠代表一級命名空間。命名空間用於將相關的計算圖源(節點、話題、服務和參數統稱為計算圖源,而每個計算圖源由一個叫計算圖源名稱(graph resource name)的短字符串識)歸類在一起。
為了指明一個計算圖源,需要完整列出其所屬的命名空間,尤其是有時候命名空間層次比較多,這可能會讓你抓狂。這時,一個主要替代方案是讓ROS為計算圖源提供一個默認的命名空間,具有此特征的名稱叫做相對計算圖源名稱(ralative graph resource name),或簡稱為相對名稱(relative name)。
相對名稱:
相對名稱的典型特征是它缺少全局名稱帶有的前斜杠“/”。例如:cmd_vel 及 count_and_log/set_logger_level理解相對名稱的關鍵是,如果不知道ROS 解析某個計算圖源時所使用的默認命名空間,相對名稱並不能和特定計算圖源匹配。
解析相對名稱:將相對名稱轉化為全局名稱的過程相當簡單。ROS將當前默認的命名空間的名稱加在相對名稱的前面,從而將相對名解析為全局名稱。比如,如果我們在默認命名空間為/turtle1 的地方使用相對名稱cmd_vel,那么ROS 通過組合方法得 /turtle1 + cmd_vel ⇒ /turtle1/cmd_vel
相對名稱也可以以一系列的命名空間開始,這些命名空間被看作是默認命名空間中的嵌套空間。舉個例子,如果我們在默認命名空間為/a/b/c/d/e/f 的地方使用相對空間g/h/i/j/k,ROS 將會將其進行組合為全局命名空間/a/b/c/d/e/f /g/h/i/j/k/l 得到的全局名稱就可以用於確定一個特定的計算圖源,就像前面介紹全局名稱的使用時一樣。
當一個節點內的計算圖源全部使用相對名稱時,這本質上給用戶提供了一種非常簡單的移植手段,即用戶能方便地將此節點和話題移植到其他的(比如用戶自己程序的) 命名空間,而節點的原設計者並不一定參與這個過程。這種靈活性可以使得一個系統的組織結構更清晰,更重要的是能夠防止在整合來自不同來源的節點發生名稱沖突。作為對比,如果所有節點都使用全局名稱命名自己的計算圖源, 就很難實現這種高效資源整合。所以,除非一些特殊情況有特殊要求,否則編寫節點時並不推薦使用全局名稱。
私有名稱:
私有名稱,以一個波浪字符(~)開始,是第三類也是最后一類計算圖源名稱。和相對名稱一樣,私有名稱並不能完全確定它們自身所在的命名空間,而是需要ROS 客戶端庫將這個名稱解析為一個全局名稱。與相對名稱的主要差別在於,私有名稱不是用當前默認命名空間,而是用的它們節點名稱作為命名空間。例如,有一個節點,它的全局名稱是 /sim1/pubvel,ROS 將其私有名稱∼max_vel 轉換至如下全局名稱:/sim1/pubvel + ~max_vel⇒ /sim1/pubvel/max_vel 這種命名方式適用的地方是每個節點內部都有這樣一些資源,這些資源只與本節點有關,而不會與其他節點打交道,這些資源就可以使用私有名稱,與松耦合性相對的。私有名稱的關鍵字“private”僅僅表示其他節點不會使用它們所在的命名空間,也就是僅在命名空間層面上有意義。對於其他節點來講,只要知道私有名稱解析后的全局名稱,都可以通過其全局名稱訪問這些計算圖源。這和C++等其他類似編程語言中的關鍵字“private”是不同的,在這些編程語言中,系統中的其他部分是不能訪問某個類的私有成員變量的。