由淺到深理解ROS(3)-命名空間

全局命名空間

/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」是不一樣的,在這些編程語言中,系統中的其餘部分是不能訪問某個類的私有成員變量的。編程

相關文章
相關標籤/搜索