由淺到深理解ROS(2)


ROS文件系統

ROS文件系統中的兩個最基本的概念:Package和Manifest,即包和清單文件。

(1)Package是組織ROS代碼的最基本單位,每一個Package都可以包括庫文件,可執行文件,腳本及其它的一些文件。

(2)Manifest文件是對Package的相關信息的一個描述。他提供了Package之間的依賴性,以及一個包的元信息,比如版本、維護着和許可證等信息。

catkin 編譯構建系統的功能包 ——編譯產生的可執行文件並未存放在功能包目錄下,而是存放在一個單獨的標准化目錄層次結構中。對於使用 apt-get 安裝的功能包,其所在根目錄為/opt/ros/indigo。可執行文件存儲在這個根目錄下的 lib 子目錄里。同樣,在自動生成的頭文件存儲在 include 子目錄下。當有需要時,ROS通過搜索 CMAKE_PREFIX_PATH 環境變量列出的目錄,這個環境變量由 setup.bash 自動設置。

注意:你有可能在一些文檔中看到功能包集( stack)的概念。功能包集是緊密相關的功能包的集合。從ROS的 groovy版本開始,功能包集的概念被逐步淘汰,取而代之的是元功能包( metapackages),元功能包像其他功能包一樣有功能包清單,但其目錄下沒有其他的功能包,而功能包集則將其包含的功能包存放在其目錄下。

 

節點管理器(The Master)

ROS 的一個基本目標是使機器人的很多節點node(可執行文件,幾乎相對獨立的小程序)能夠同時運行。為此,這些節點必須能夠彼此通信。ROS 中實現通信的關鍵部分就是ROS 節點管理器。要啟動節點管理器,使用如下命令:roscore  。節點管理器應該在使用 ROS 的全部時間內持續運行。一個合理的工作流程是在一個終端啟動roscore,然后打開其他終端運行其他程序。當結束時可以通過在 roscore 終端鍵入Ctrl-C 停止節點管理器。如果roscore 被終止,當前運行的其他節點將無法建立新的連接,即使 稍后重啟 roscore 也無濟於事。
roslaunch 是個啟動文件,其目的是一次性啟動多個節點。每一個啟動文件都應該和一個特定的功能包關聯起來。通常的命名方案是以.launch 作為啟動文件的后綴。這是一個自適應工具,如果啟動多節點時沒有節點管理器運行,它會自動啟動節點管理器;如果已經有一個節點 管理器在運行,則會使用已有的。rosrun 一次只能啟動 一個節點,而 roslaunch 可以同時啟動多個節點。一般launch文件會放在功能包的根目錄中。
以后會專門講一下roslaunch  http://www.cnblogs.com/zjiaxing/p/5542614.html
 

節點(Nodes)

一旦啟動roscore后,便可以運行ROS程序了。 ROS程序的運行實例被稱為節點(node) ,例如 rosrun turtlesim turtlesim_node  這個節點是可執行文件 turtlesim_node 的實例化,負責創建 turtlesim窗口和模擬海龜的運動。可以看出rosrun 命令有兩個參數,其中第一個參數是功能包的名稱,第二個參數是該軟件包中的可執行文件的名稱。還要注意的是通過節點管理器注冊成為 ROS 節點發生在程序的內部,而不是通過 rosrun 命令。
啟動roscore后運行rosnode list 可以看到出現節點/ rosout  。rosout 節點是一個特殊的節點,通過 roscore 自動啟動。其作用有點類似於控制台程序中使用的標准輸出(即 std:cout)。
/rosout也是話題,所有的節點發布都向話題/rosout 發布消息,該話題由同名的 /rosout 節點訂閱。這個話題的作用是用來生成各個節點的文本日志消息。在某些地方/rosout 既指節點又指話題。但 ROS 並不會這種重復的名字而混淆,因為 ROS 會根據上下文來推測我們討論的是/rosout節點,還是/rosout話題。
舉個例子來說明也許會更好,這個例子將在話題和消息里說明
 
讀者還要注意的是rosrun 命令中可執行文件的名稱與節點名稱並不一定相同。節點名稱是在代碼中命名的例如ros::init (argc, argv, "odom");而可執行文件名稱是在CMakeLists.txt中命名的。但可以使用 rosrun 命令顯式設置節點的名稱,語法如下:rosrun package-name executable-name _ _name:=node-name 這種方法將使用 node-name 參數給出的名稱覆蓋節點的默認名。因為 ROS 中要求每個節點有不同的名稱,因此該方法很重要尤其是移植程序中。
 
話題和消息

ROS節點之間進行通信所利用的最重要的機制就是消息傳遞。在ROS中,消息有組織地存放在話題里。消息傳遞的理念是:當一個節點想要分享信息時,它就會發布
(publish)消息到對應的一個或者多個話題;當一個節點想要接收信息時,它就會訂閱(subscribe)它所需要的一個或者多個話題。ROS節點管理器負責確保發布節點和訂閱節點能找到對方;而且消息是直接地從發布節點傳遞到訂閱節點,中間並不經過節點管理器轉交。

查看節點構成的計算圖:先介紹個工具rqt_graph,要查看節點之間的連接關系,恐怕將其表示為圖形是最便於查看的。在ROS 系統中查看節點之間的發布-訂閱關系的最簡單方式就是在終端輸入如下令:rqt_graph。代表ROS,qt 指的是用來實現這個可視化程序的Qt 圖形界面(GUI)工具包。

 

 

在該圖中,橢圓形表示節點,有向邊表示其兩端節點間的發布-訂閱關系。該計算圖告訴們,/teleop_turtle節點向話題/turtle1/cmd_vel發布消,而/turtlesim 節點訂閱了這些消息(“cmd_vel”是“command velocity”的縮寫)。但是其中省略了調試節點,包括 rosout 節點,這是因為在默認情況下,rqt_graph 隱藏了其認為只在調試過程中使用的節點。你可以通過取消“Hide debug”選項來禁止這個特性,下圖是完整的:

 

 

 

 

 
請注意 rqt_graph 本身就是一個節點。所有的節點發布都向話題/rosout 發布消息,該話題由同名的 /rosout 節點訂閱。正如之前講過的,這個話題的作用是用來生成各個節點的文本日志消息,此處的名稱/rosout 既指節點又指話題。但 ROS 並不會因這種重復的名字而混淆,因為 ROS 會根據上下文來推測我們討論是/rosout 節點還是/rosout 話題。
與ROS服務不同,ROS 節點通常設計成了只管發布它們有用的信息,而不需要擔心是否有其他節點來訂閱
這些消息。這樣有助於減少各個節點之間的耦合度。
 
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM