ROS常用命令
功能包/軟件包(Packages)
在 ROS 中,所有軟件都被組織爲軟件包的形式,稱爲 ROS 軟件包或功能包,有時也簡稱爲包。 ROS 軟件包是一組用於實現特定功能的相關文件的集合,包括可執行文件和其他支持文件。比如說,我們小烏龜的例子使用的兩個可執行文件turtlesim_node 和turtle_teleop_key 都屬於 turtlesim 包。
查找軟件包列表(rospack list)
每個程序包由一個清單文件(文件名爲 package.xml)定義。該文件定義關於包的一些細節,包括其名稱、 版本、 維護者和依賴關係。包含 package.xml 文件的目錄被稱爲軟件包目錄。
rospack list package-name
查找軟件包目錄(rospack find)
rospack find package-name
查看軟件包(rosls)
要查看軟件包目錄下的文件,使用如下命令:
rosls package_name
切換到軟件包目錄(roscd)
如果想“訪問”某軟件包目錄,可以將當前目錄切換至此軟件包目錄,使用如下命令:
roscd package_name
節點管理器(Master)
ROS 的一個基本目標是使機器人專家設計的很多稱爲節點(node) 的幾乎相對獨立的小程序能夠同時運行。爲此,這些節點必須能夠彼此通信。 ROS 中實現通信的關鍵部分就是 ROS 節點管理器。要啓動節點管理器,使用如下命令:
roscore
節點管理器應該在使用 ROS 的全部時間內持續運行。一個合理的工作流程是在一個終端啓動 roscore,然後打開其他終端運行其他程序。除非你已經完成 ROS 的相關工作,否則一般沒有理由終止 roscore 命令。當結束時,可以通過在 roscore 終端鍵入 Ctrl-C停止節點管理器。
節點(Nodes)
一旦啓動roscore後,便可以運行ROS程序了。 ROS程序的運行實例被稱爲節點(node).
啓動節點(rosrun)
rosrun 命令有兩個參數,其中第一個參數是功能包的名稱, 這在 2.4 節中已經討論過; 第二個參數是該軟件包中的可執行文件的名稱。
rosrun package-name executable-name
通過節點管理器註冊成爲 ROS 節點發生在程序的內部,而不是通過 rosrun 命令
查看節點列表(rosnode list)
rosnode list
查看節點信息(rosnode info)
rosnode info node_name
這個命令的輸出包括話題列表——節點是這些話題的發佈者(publisher)或訂閱者(subscriber),關於話題請參考 2.7.2 節; 服務列表——這些服務是該節點提供的,關於服務請參考第 8 章; 其Linux 進程標識符(process identifier, PID);以及和與其他節點的所有連接。
終止節點(rosnode kill)
rosnode kill node_name
還可以用 Ctrl-C 命令終止節點。但使用這種方法時可能不會在節點管理器中註銷該節點, 因此會導致已終止的節點仍然在 rosnode 列表中。這雖然沒有什麼壞處,但可能會讓用戶對當前系統的行爲感到困擾。此時可以使用下面的命令將節點從列表中刪除:
rosnode cleanup
話題(topics)
ROS節點之間進行通信所利用的最重要的機制就是消息傳遞。在ROS中,消息有組織地存放在話題裏 19。消息傳遞的理念是:當一個節點想要分享信息時,它就會**發佈(publish)消息到對應的一個或者多個話題;當一個節點想要接收信息時,它就會訂閱(subscribe)**它所需要的一個或者多個話題。 ROS節點管理器負責確保發佈節點和訂閱節點能找到對方;而且消息是直接地從發佈節點傳遞到訂閱節點,中間並不經過節點管理器轉交。
當前話題列表(rostopic list)
rostopic list
打印消息內容 (rostopic echo)
爲了查看某個話題上發佈的消息:
rostopic echo topic_name
測量發佈頻率(hz bw)
有兩個命令可以用來測量消息發佈的頻率以及這些消息所佔用的帶寬:
rostopic hz topic_name
rostopic bw topic_name
其中第一條命令輸出每秒發佈的消息數量,第二條命令輸出每秒發佈消息所佔的字節量。
查看話題(rostopic info)
rostopic info topic_name
可以得到話題發佈的消息類型,發佈者和訂閱者以及具體的消息
查看消息類型(rosmsg show)
rosmsg show message-type-name
用命令行發佈消息(rostopic pub)
rostopic pub -r rate-in-hz topic_name message_type message_content
問題檢查(roswtf)
roswtf
這條命令會進行全面而深入的檢測,包括檢測你的環境變量、安裝的文件以及運行的節點。例如, roswtf 將會檢測在安裝過程中 rosdep 初始化是否完成, 任何節點是否出現了意外的掛起或者終止, 以及活躍的節點是否正確地和其他節點相連接等。可惜的是,由 roswtf 檢測的完整列表只能在 Python 源碼中才能找到。
創建工作區
mkdir -p ~/test/src //工作區目錄
cd ~/test/src
catkin_init_workspace //初始化工作區
cd ../
catkin_make
創建功能包(packages)
每次打開一個終端,都要重新source一下工作區的環境變量
source ~/test/src/devel/setup.bash //當前工作區的環境變量
創建功能包:
catkin_create_pkg package_name
創建了一個存放這個功能包的目錄,並在那個目錄下生成了兩個配置文件(CMakeLists.txt和package.xml)。
功能包創建完畢之後可以在該功能包文件夾下創建代碼文件。
編譯功能包
聲明依賴庫
首先,我們需要聲明程序所依賴的其他功能包。對於 c++程序而言,此步驟是必要的,以確保 catkin 能夠向 c++編譯器提供合適的標記來定位編譯功能包所需的頭文件和鏈接庫。
爲了給出依賴庫,編輯包目錄下的 CMakeLists.txt 文件。該文件的默認版本含有如下行:
find_package(catkin REQUIRED)
所依賴的其他 catkin包可以添加到這一行的 COMPONENTS關鍵字後面,如下所示:
find_package(catkin REQUIRED COMPONENTS package-names)
我們同樣需要在包的清單文件(package.xml)中列出依賴庫,通過使用build_depend (編譯依賴) 和 run_depend(運行依賴) 兩個關鍵字實現:
<build_depend>package-name</build_depend>
<run_depend>package-name</run_depend>
聲明可執行文件
接下來,我們需要在 CMakeLists.txt 中添加兩行,來聲明我們需要創建的可執行文件。其一般形式是:
add_executable(executable-name source-files)
target_link_libraries(executable-name ${catkin_LIBRARIES})
第一行聲明瞭我們想要的可執行文件的文件名,以及生成此可執行文件所需的源文件列表。如果你有多個源文件,把它們列在此處,並用空格將其區分開。第二行告訴 Cmake 當鏈接此可執行文件時需要鏈接哪些庫(在上面的 find_package 中定義)。如果你的包中包括多個可執行文件,爲每一個可執行文件複製和修改上述兩行代碼。
編譯工作區
cd ~/test
catkin_make
如果你看到來自 catkin_make 的錯誤, 提示無法找到ros/ros.h 頭文件,或者 ros::init 等 ROS 函數未定義的錯誤,最大的可能性是你的 CMakeLists.txt沒有正確聲明對 roscpp的依賴。
sourcing setup.bash
最後的步驟是執行名爲 setup.bash 的腳本文件,它是 catkin_make 在你工作區的 devel 子目錄下生成的。
source devel/setup.bash
執行完之後就可以rosrun運行功能包下的節點。