由浅到深理解ROS(2)
ROS文件系統
用戶可以直接參看官網:?http://wiki.ros.org/ROS/Tutorials/NavigatingTheFilesystem
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。r?代表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?節點通常設計成了只管發布它們有用的信息,而不需要擔心是否有其他節點來訂閱
這些消息。這樣有助于減少各個節點之間的耦合度。
總結
以上是生活随笔為你收集整理的由浅到深理解ROS(2)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 信用卡违约金
- 下一篇: 浦发淘票票信用卡额度怎么查询