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

2022-07-29 20:27:16 字數 1830 閱讀 3373

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

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

rosout前面的反斜槓 表明該節點名稱屬於全域性命名空間。之所以叫做全域性名稱因為它們在任何地方 包括 命令列工具 圖形介面工具等的任何地方 都可以使用。無論這些名稱用作眾多命令列工具的引數還是用在節點內部,它們都有明確的含義。這些名稱從來不會產生二義性,也無需額外的上下文資訊來決定名稱指的哪個資...

Java由淺到深 遞迴學習N皇后問題

借鑑於 國際西洋棋棋手馬克斯 貝瑟爾於1848年提出 在8 8格的西洋棋上擺放八個皇后,使其不能互相攻擊,即任意兩個皇后都不能處於同一行 同一列或同一斜線上,問有多少種擺法?對於這個問題,我一開始首先想到是用二維陣列來解決這個問題但是無奈不會。看了大神的 我感到收益匪淺。向大神致敬!好了,這個部落格...

由淺到深玩轉Python爬蟲 一 初識爬蟲

由於自身對爬蟲技術的熱衷以及在爬蟲領域踩坑多年的經驗,決定綜合爬蟲領域的技術及我個人的經歷寫成一系列由淺到深的爬蟲技術文章,希望以最簡單方式 最實用的方式為爬蟲初學者帶來學習上的幫助 對從事爬蟲領域的工程師帶來新的感官 其實最大的初衷則是為未來的自己留下曾經在這個領域待過的足跡!後續的章節中會覆蓋爬...