ROS學習筆記26(ROS的命令列工具)
需要說明的是:本篇部落格內容來自於《ROS機器人程式設計 從基本概念到機器人應用程式程式設計實戰》的第五章,本是打算參考和翻譯官網相關資料,但官網資料的質量明顯沒有這本書描述的更為清楚,記錄於此僅僅是為了自己學習和查詢的方便!
1 ROS命令概述
ROS命令在http://wiki.ros.org/ROS/CommandLineTools上的維基頁面上有詳細描述。另外,在https://github.com/ros/cheatsheet/releases的儲存庫中,總結了本章中的一些重要命令。這些是本章內容的有用的輔助資料。
ROS可以通過在shell環境中輸入命令來進行檔案系統的使用、原始碼編輯、構建、除錯和功能包管理等。為了正確使用ROS,除了基本的Linux命令之外,還需要熟悉ROS專用命令。為了熟練掌握ROS的各種命令,我們對每個命令的功能進行了簡單的描述,並給出了例子。在介紹每條命令時,考慮到使用的頻率和重要性,標了星級評分。雖然很難從一開始就很熟練地使用所有的命令,但是隨著使用的次數增多,讀者會發現越來越方便快捷地使用各個ROS命令。
2 ROS shell 命令
ROS shell命令又被稱為rosbash 1 。這使我們可以在ROS開發環境中使用Linux中常用的bash shell命令。我們主要使用字首是ros且帶有多種字尾的命令,例如cd、pd、d、ls、ed、cp和run。相關命令如下。
我們來看看其中相對常見的roscd、rosls和rosed命令。
ROS shell命令的使用環境想要使用ROS shell命令,需要用以下命令安裝rosbash,並且只能在設定了source /opt/ros/<ros
distribution>/setup.bash的終端視窗中可以使用。這不需要單獨安裝,只要完成了ROS開發環境的搭建,則可以使用它。
$ sudo apt-get install ros-<ros distribution>-rosbash
2.1 roscd:移動ROS目錄
roscd [功能包名稱]
這是一個移動到儲存有功能包的目錄的命令。該命令的基本用法是在roscd命令之後將功能包名稱寫入引數。在以下中,turtlesim功能包位於安裝ROS的目錄中,但是,如果將建立的功能包名稱(例如建立的my_first_ros_pkg)作為引數,則會移至您指定的功能包的目錄。這是在使用基於命令列的ROS時常用的命令。
$ roscd turtlesim /opt/ros/kinetic/share/turtlesim $ $ roscd my_first_ros_pkg ~/catkin_ws/src/my_first_ros_pkg $
請注意,要執行此示例並獲得相同的結果,必須安裝相關功能包ros-kinetic-turtlesim。如果未安裝,請使用以下命令進行安裝。
$ sudo apt-get install ros-kinetic-turtlesim
如果已經安裝,將可以看到如下所示的功能包的訊息。
$ sudo apt-get install ros-kinetic-turtlesim
[sudo] password for USER:
Reading package lists... Done
Building dependency tree
Reading state information... Done
ros-kinetic-turtlesim is already the newest version (0.7.1-0xenial-20170613-170649-0800).
ros-kinetic-turtlesim set to manually installed.
0 upgraded, 0 newly installed, 0 to remove and 18 not upgraded.
2.2 rosls:ROS檔案列表
rosls [功能包名稱]
該命令檢視指定的ROS功能包的檔案列表。您可以使用roscd命令移動到功能包,然後使用正常的ls命令執行相同的功能,但有時需要立即檢視。實際中並不經常使用。
$ rosls turtlesim
cmake images msg srv package.xml
2.3 rosed:ROS編輯命令
rosed [功能包名稱] [檔名稱]
該命令用於編輯功能包中的特定檔案。執行時,它會用使用者設定的編輯器開啟檔案。用於快速修改相對簡單的內容。這時用到的編輯器可以在~/.bashrc檔案中進行指定,如:export EDITOR=‘emacs -nw’。如前所述,它用於需要在命令視窗中直接修改的
簡單任務,因此不推薦用於除此之外的編寫程式的任務。這不是一個經常使用的命令。
$ rosls turtlesim
cmake images msg srv package.xml
3 ROS執行命令
ROS執行命令管理ROS節點的執行。最重要的是,roscore被用作節點之間的名稱伺服器。執行命令是rosrun和roslaunch。rosrun執行一個節點,當執行多個節點或設定各種選項時使用roslaunch。rosclean是刪除節點執行時記錄的日誌的命令。
3.1 roscore:執行roscore
roscore [選項]
roscore命令會執行主節點,主節點管理節點之間的訊息通訊中的連線資訊。主節點是使用ROS時必須首先被執行的必要元素。ROS 主節點由roscore執行命令來驅動,並作為XMLRPC伺服器執行。主節點接收多種資訊的註冊,如節點的名稱、話題和服務名稱、訊息型別、URI地址和埠號,並在收到節點的請求時將此資訊通知給其他節點。此外,會執行rosout 2 ,這個命令用於記錄ROS中使用的ROS標準輸出日誌,例如DEBUG、INFO、WARN、ERROR和FATAL。它還執行一個管理引數的引數伺服器。當執行roscore時,將使用者設定的ROS_MASTER_URI作為主URI,並且驅動主節點。如ROS配置中介紹,使用者可在~/.bashrc設定ROS_MASTER_URI。
$ roscore
... logging to /home/pyo/.ros/log/c2d0b528-6536-11e7-935b-08d40c80c500/roslaunch-pyo-20002.log
Checking log directory for disk usage. This may take awhile.
Press Ctrl-C to interrupt
Done checking log file disk usage. Usage is <1GB.
started roslaunch server http://localhost:43517/
ros_comm version 1.12.7
SUMMARY
========
PARAMETERS
* /rosdistro: kinetic
* /rosversion: 1.12.7
NODES
auto-starting new master
process[master]: started with pid [20013]
ROS_MASTER_URI=http://localhost:11311/
setting /run_id to c2d0b528-6536-11e7-935b-08d40c80c500
process[rosout-1]: started with pid [20027]
started core service [/rosout]
從結果可以看出如下資訊:日誌儲存在/home/xxx/.ros/log/目錄中;可以使用[Ctrl+c]退出roscore;roslaunch server、ROS_MASTER_URI等資訊;/rosdistro和/rosversion的引數伺服器;/rosout節點正在執行。
3.1.1 Log 儲存位置
在上面的執行結果中,儲存日誌的位置是“/home/xxx/.ros/log/”,但實際上它被記錄在設定ROS_HOME環境變數的地方。如果ROS_HOME環境變數未設定,則預設值為“~/.ros/log/”。
3.2 rosrun:執行ROS節點
rosrun [功能包名稱] [節點名稱]
rosrun是執行指定的功能包中的一個節點的命令。以下例子執行turtlesim功能包的turtlesim_node節點。請注意,螢幕上出現的烏龜圖示是隨機選擇並執行的。
$ rosrun turtlesim turtlesim_node
[INFO] [1499667389.392898079]: Starting turtlesim with node name /turtlesim
[INFO] [1499667389.399276453]: Spawning turtle [turtle1] at x=[5.544445], y=[5.544445], theta=[0.000000]
3.3 roslaunch:執行多個ROS節點
roslaunch [功能包名稱] [launch檔名]
roslaunch是執行指定功能包中的一個或多個節點或設定執行選項的命令。通過執行openni_launch功能包,可以執行20個以上的節點和10個以上的引數伺服器,如camera_nodelet_manager、depth_metric、depth_metric_rect和depth_points。因此,使用launch檔案啟動的方式對於執行多個節點非常有用,這是ROS中常用的執行方法。有關建立“*.launch”檔案的更多資訊,請參閱 roslaunch用法。
$ roslaunch openni_launch openni.launch
~ 省略 ~
請注意,要執行此示例並獲得相同的結果,必須安裝相關功能包ros-kinetic-openni-launch。如果未安裝,請使用以下命令進行安裝。
$ sudo apt-get install ros-kinetic-openni-launch
3.4 rosclean:檢查及刪除ROS日誌
rosclean [選項]
該命令檢查或刪除ROS日誌檔案。在執行roscore時,對所有節點的記錄都會寫入日誌檔案,隨著時間的推移,需要定期使用rosclean命令刪除這些記錄。以下是檢查日誌使用情況的示例。
$ rosclean check
320K ROS node logs → 意味著ROS日誌一共佔320KB
當執行roscore時,如果顯示以下警告資訊,則意味著日誌檔案超過1GB,如果使用者覺得會讓系統不堪重負,請使用rosclean命令將其刪除。
WARNING: disk usage in log directory [/xxx/.ros/log] is over 1GB.
以下是刪除ROS日誌儲存庫(筆者是/home/rt/.ros/log)的所有日誌的示例。如果要刪除它,請按y按鈕將其刪除。
$ rosclean purge
Purging ROS node logs.
PLEASE BE CAREFUL TO VERIFY THE COMMAND BELOW!
Okay to perform:
rm -rf /home/pyo/.ros/log
(y/n)?
4 ROS資訊命令
ROS資訊命令用於識別話題、服務、節點和引數等資訊。尤其是rostopic、rosservice、rosnode和rosparam經常被使用,並且rosbag是ROS的主要特徵之一,它具有記錄資料和回放功能,務必要掌握。
4.1 執行節點
我們將使用下面的命令,利用ROS提供的turtlesim來了解相關的節點、話題和服務。在使用ROS資訊命令進行測試之前,需要做好以下準備工作。執行roscore,為確保順利進行,關閉所有以前執行的終端。然後開啟一個新的終端並執行以下命令。
$ roscore
為了執行turtlesim功能包中的turtlesim_node節點,開啟一個新的終端並執行以下命令。這將從turtlesim功能包執行turtlesim_node。使用者會在一個藍色的螢幕上看到烏龜。
$ rosrun turtlesim turtlesim_node
執行turtlesim功能包中的turtle_teleop_key節點開啟一個新的終端並執行以下命令。這將在turtlesim功能包中執行turtle_teleop_
key。一旦執行,可以在該終端視窗上,用鍵盤上的方向鍵控制烏龜。請自己嘗試。當您按下方向鍵時,螢幕上的烏龜會移動,這是一個簡單的模擬,但這是將驅動機器人所需的移動速度(m/s)和旋轉速度(rad/s)用訊息傳送的。
$ rosrun turtlesim turtle_teleop_key
4.2 rosnode:ROS節點
首先,我們需要了解節點(node),所以先複習術語。
4.2.1 rosnode list:列出正在執行中的所有節點
這是列出連線到roscore的所有節點的命令。如果已經運行了roscore和之前準備好的節(turtlesim_node,turtle_teleop_key),則可以看到終端中列出了用於在roscore進行日誌記錄的rosout,以及teleop_turtle和turtlesim節點。
$ rosnode list
/rosout
/teleop_turtle
/turtlesim
4.2.2 節點執行及實際節點的名稱
在前面的例子中執行的節點是turtlesim_node和turtle_teleop_key。rosnode list列表中有teleop_turtle和turtlesim的原因是執行的節點名稱與實際節點名稱不同。例如,turtle_teleop_key節點在原始檔中設定為“ros :: init (argc,argv,"teleop_turtle");”。筆者建議使可執行節點的名稱等於實際的節點名稱。
4.2.3 rosnode ping [節點名稱]:與指定的節點進行連線測試
以下是測試turtlesim節點是否確實連線到當前使用的計算機。如果已連線,它將從節點收到XMLRPC響應,如下所示。
$ rosnode ping /turtlesim
rosnode: node is [/turtlesim]
pinging /turtlesim with a timeout of 3.0s
xmlrpc reply from http://192.168.1.100:45470/ time=0.377178ms
如果在該節點執行出現問題或通訊中斷,則顯示以下錯誤訊息。
ERROR: connection refused to [http://192.168.1.100:55996/]
4.2.4 rosnode info [節點名稱]:檢查指定節點的資訊
使用rosnode info命令可以檢視指定節點的資訊。基本上,使用者可以檢查釋出者、訂閱者和服務等。此外,還可以檢查關於節點執行URI和話題輸入/輸出的資訊。由於會顯示大量資訊,因此省略了內容,所以請務必親自執行。
$ rosnode info /turtlesim
------------------------------------------------
Node [/turtlesim] Publications:
* /turtle1/color_sensor [turtlesim/Color]
~ 省略 ~
4.2.5 rosnode機器[PC名稱或IP]:檢視此PC上執行的所有節點
您可以看到指定裝置(PC或終端)上執行的所有節點。
$ rosnode machine 192.168.1.100
/rosout
/teleop_turtle
/turtlesim
4.2.6 rosnode kill [節點名稱]:終止指定節點的執行
這是一個終止正在執行的節點的命令。您可以在執行節點的終端視窗中使用[Ctrl+c]直接終止節點,但也可以指定要結束的的節點,如下所示。
$ rosnode kill /turtlesim
killing /turtlesim
killed
如果使用該命令終止了節點,則會在執行該節點的終端視窗上顯示如下警告訊息,並關閉該節點。
[WARN] [1499668430.215002371]: Shutdown request received.
[WARN] [1499668430.215031074]: Reason given for shutdown: [user request]
4.2.7 rosnode cleanup:刪除無法驗證連線資訊的虛擬節點的註冊資訊
刪除連線資訊未被確認的虛擬節點的註冊資訊。當節點由於意外事件而異常終止時,該命令將從節點目錄中刪除連線中斷的節點。這個命令很少使用,但是它非常有用,因為使用者不需要重新執行roscore。
$ rosnode cleanup
4.3 rostopic: ROS話題
首先,讓我們參考“ROS術語”,因為我們需要了解話題。
在執行ROS話題示例之前,請先關閉所有節點。通過在不同的終端視窗中分別執行以下命令來執行turtlesim_node和turtle_teleop_key。
$ roscore
$ rosrun turtlesim turtlesim_node
$ rosrun turtlesim turtle_teleop_key
4.3.1 rostopic list:列出活動話題
rostopic list命令顯示當前正在傳送和接收的所有話題的列表。
$ rostopic list
/rosout
/rosout_agg
/turtle1/cmd_vel
/turtle1/color_sensor
/turtle1/pose
通過將“-v”選項新增到rostopic list命令,可以分開發布話題和訂閱話題,並將每個話題的訊息型別一起顯示。
$ rostopic list -v
Published topics:
* /turtle1/color_sensor [turtlesim/Color] 1 publisher
* /turtle1/cmd_vel [geometry_msgs/Twist] 1 publisher
* /rosout [rosgraph_msgs/Log] 2 publishers
* /rosout_agg [rosgraph_msgs/Log] 1 publisher
* /turtle1/pose [turtlesim/Pose] 1 publisher
Subscribed topics:
* /turtle1/cmd_vel [geometry_msgs/Twist] 1 subscriber
* /rosout [rosgraph_msgs/Log] 1 subscriber
4.3.2 rostopic echo [話題名稱]:實時顯示指定話題的訊息內容
以下示例實時顯示組成/turtle1/pose話題的x、y、theta、linear_velocity和angular_velocity的資料。
$ rostopic echo /turtle1/pose
x: 5.35244464874
y: 5.544444561
theta: 0.0
linear_velocity: 0.0
angular_velocity: 0.0
~ 省略 ~
4.3.3 rostopic find [型別名稱]:顯示使用指定型別的訊息的話題
$ rostopic find turtlesim/Pose
/turtle1/pose
4.3.4 rostopic type [話題名稱]:顯示指定話題的訊息型別
$ rostopic type /turtle1/pose
turtlesim/Pose
4.3.5 rostopic bw [話題名稱]:顯示指定話題的訊息資料頻寬(bandwidth)
在以下示例中,用於/turtle1/pose話題的資料頻寬平均為每秒1.27 KB。
$ rostopic bw /turtle1/pose
subscribed to [/turtle1/pose]
average: 1.27KB/s
mean: 0.02KB min: 0.02KB max: 0.02KB window: 62 ...
~ 省略 ~
4.3.6 rostopic hz [話題名稱]:顯示指定話題的訊息資料釋出週期
在以下示例中,使用者可以檢查/turtle1/pose資料的釋出週期。從結果可以看出,該訊息以大約62.5Hz(0.016秒= 16毫秒)的頻率被髮布。
$ rostopic hz /turtle1/pose
subscribed to [/turtle1/pose]
average rate: 62.502
min: 0.016s max: 0.016s std dev: 0.00005s window: 62
4.3.7 rostopic info [話題名稱]:顯示指定話題的資訊
在以下示例中,使用者可以看到/turtle1/pose話題使用turtlesim/Pose訊息型別,釋出到/turtlesim節點,並且沒有實際訂閱的話題。
$ rostopic info /turtle1/pose
Type: turtlesim/Pose
Publishers:
* /turtlesim (http://192.168.1.100:42443/)
Subscribers: None
4.3.8 rostopic pub [話題名稱] [訊息型別] [引數]:使用指定的話題名稱釋出訊息
以下是使用/turtle1/cmd_vel話題名稱釋出型別為geometry_msgs/Twist的訊息的示例。
$ rostopic pub -1 /turtle1/cmd_vel geometry_msgs/Twist -- ‘[2.0, 0.0, 0.0]’ ‘[0.0, 0.0, 1.8]’
publishing and latching message for 3.0 seconds
每個選項的描述如下。
■ -1只發布一次訊息(實際上只執行一次,但會像以前的結果一樣執行3秒)。
■ /turtle1/cmd_vel 指定的話題名稱
■ geometry_msgs/Twist 要釋出的訊息型別名稱
■ -- ‘[2.0, 0.0, 0.0]’ ‘[0.0, 0.0, 1.8]’ 在x軸座標上以每秒2.0 m的速度移動,以z軸為中心,每秒旋轉1.8rad
4.4 rosservice:ROS服務
由於讀者需要了解該服務(service),請參閱“ROS術語”。
在執行ROS服務相關例子之前先關閉所有節點。通過在不同的終端視窗中執行以下命令來執行turtlesim_node和turtle_teleop_key。
$ roscore
$ rosrun turtlesim turtlesim_node
$ rosrun turtlesim turtle_teleop_key
4.4.1 rosservice list:顯示活動的服務資訊
顯示活動中的服務的資訊。會顯示在同一網路中使用的所有服務。
$ rosservice list
/clear
/kill
/reset
/rosout
/get_loggers
/rosout
/set_logger_level
/spawn
/teleop_turtle/get_loggers
/teleop_turtle/set_logger_level
/turtle1/set_pen
/turtle1/teleport_absolute
/turtle1/teleport_relative
/turtlesim/get_loggers
/turtlesim/set_logger_level
4.4.2 rosservice info [服務名稱]:顯示指定服務的資訊
以下是使用rosservice的info選項檢視/turtle1/set_pen服務的節點名稱、URI、型別和引數的示例。
$ rosservice info /turtle1/set_pen
Node: /turtlesim
URI: rosrpc://192.168.1.100:34715
Type: turtlesim/SetPen
Args: r g b width off
4.4.3 rosservice type [服務名稱]:顯示服務型別
在以下示例中,可以看到/turtle1/set_pen服務是turtlesim/SetPen型別。
$ rosservice type /turtle1/set_pen
turtlesim/SetPen
4.4.4 rosservice find [服務型別]:查詢指定服務型別的服務
以下示例搜尋turtlesim/SetPen型別的服務。因此,可以看到搜尋出/turtle1/set_pen。
$ rosservice find turtlesim/SetPen
/turtle1/set_pen
4.4.5 rosservice uri [服務名稱]:顯示ROSRPC uri服務
使用者也可以使用rosservice的uri選項來檢查/turtle1/set_pen服務的ROSRPC URI,如下所示:
$ rosservice uri /turtle1/set_pen
rosrpc://192.168.1.100:50624
4.4.6 rosservice args [服務名稱]:服務引數輸出
我們來看看/turtle1/set_pen服務的每個引數,如下例所示,該命令顯示在/turtle1/set_pen服務中使用r、g、b、width和off引數。
$ rosservice args /turtle1/set_pen
r g b width off
4.4.7 rosservice call [服務名稱] [引數]:用輸入的引數服務請求
以下示例是請求/turtle1/set_pen服務的命令。所使用的“255 0 0 5 0”是對應於用於/turtle1/set_pen服務的參(r,g,b,width,off)的值。紅色的r的最大值是255,因為g和b都是0,所以筆的顏色是紅色的。width設定為5,off為0(假)。rosservicecall是一個非常有用的命令,通常用於測試服務。
$ rosservice call /turtle1/set_pen 255 0 0 5 0
通過使用前面的命令,傳送了服務請求,更改了turtlesim中使用的筆的屬性,並且從turtle_teleop_key中下達了下移命令。作為結果,可以從下面圖中看到原來是白色的筆色顯示為紅色。
4.5 rosparam:ROS引數
由於讀者需要了解這些引數,請參閱“ROS術語”。
在執行ROS引數相關示例之前先關閉所有節點。通過在不同的終端視窗中執行以下命令來執行turtlesim_node和turtle_teleop_key。
$ roscore
$ rosrun turtlesim turtlesim_node
$ rosrun turtlesim turtle_teleop_key
4.5.1 rosparam list:檢視引數列表
顯示在同一網路中使用的引數列表。
$ rosparam list
/background_b
/background_g
/background_r
/rosdistro
/roslaunch/uris/host_192_168_1_100__39536
/rosversion
/run_id
4.5.2 rosparam get [引數名稱]:獲取引數值
如果要檢視特定引數的值,可以將該引數名稱指定為rosparam get命令的選項。
$ rosparam get /background_b
255
如果要檢查所有引數的值,而不是某一特定的引數,可以使用“/”作為選項來顯示所
有引數的值,如下所示。
$ rosparam get /
background_b: 255
background_g: 86
background_r: 69
rosdistro: 'kinetic'
roslaunch:
uris: {host_192_168_1_100__43517: 'http:// 192.168.1.100:43517/'}
rosversion: '1.12.7'
run_id: c2d0b528-6536-11e7-935b-08d40c80c500
4.5.3 rosparam dump [檔名]:將引數儲存到指定的檔案
以下示例將當前引數值儲存到parameters.yaml檔案中。因為它儲存了每次使用的引數值,並且可以在下次執行時使用(“~/”表示使用者的home目錄),所以很方便。
$ rosparam dump ~/parameters.yaml
4.5.4 rosparam set [引數名稱]:設定引數值
這是設定引數值的命令。在以下示例中,將turtlesim節點的background_b引數(與背景色相關的引數)設定為0。
$ rosparam set background_b 0
$ rosservice call clear
RGB從255,86,69變為0,86,69,所以變成深綠色,如圖5-4右圖所示。
但是,由於turtlesim節點並不是每次讀取引數,因此需要使用“rosparam set background_b 0”命令修改引數之後,用“rosservice call clear”命令重新整理螢幕。引數的反映結果決於節點的執行方式。
4.5.5 rosparam load [檔名稱]:將引數儲存到指定的檔案
此命令與rosparam dump相反,是讀取parameters.yaml檔案並將其用作當前引數值。如下例所示,執行“rosservice call clear”命令,引數值將會變為所載入的檔案的引數值,並且在執行dump命令時,圖5-4中變為綠色的背景將變為藍色背景。rosparam
load是一個非常有用的命令,會經常使用,讀者需要掌握。
$ rosparam load ~/parameters.yaml
$ rosservice call clear
4.5.6 rosparam delete [引數名稱]:刪除引數
該命令刪除指定的引數。
$ rosparam delete /background_b
4.6 rosmsg:ROS訊息
由於讀者需要了解訊息(message),所以我們參考“ROS術語”。
在執行ROS訊息資訊示例之前,先關閉所有節點。通過在不同的終端視窗中執行以下命令來執行turtlesim_node和turtle_teleop_key。
$ roscore
$ rosrun turtlesim turtlesim_node
$ rosrun turtlesim turtle_teleop_key
4.6.1 rosmsg list:顯示所有訊息
該命令顯示當前ROS中安裝的功能包的所有訊息。根據當前ROS中包含的功能包,顯示結果可能會有所不同。
$ rosmsg list
actionlib/TestAction
actionlib/TestActionFeedback
actionlib/TestActionGoal
actionlib/TestActionResult
actionlib/TestFeedback
actionlib/TestGoal
sensor_msgs/Joy
sensor_msgs/JoyFeedback
sensor_msgs/JoyFeedbackArray
sensor_msgs/LaserEcho
zeroconf_msgs/DiscoveredService
~ 省略 ~
4.6.2 rosmsg show [訊息名稱]:顯示指定的訊息資訊
顯示指定的訊息資訊。以下是顯示turtlesim/Pose訊息資訊的例子。float32是一個浮點變數,可以確認它是一個包含5條資訊(x、y、theta、linear_velocity和angular_velocity)的訊息。
$ rosmsg show turtlesim/Pose
float32 x
float32 y
float32 theta
float32 linear_velocity
float32 angular_velocity
4.6.3 rosmsg md5 [訊息名稱]:顯示md5sum
以下是檢視turtlesim/Pose訊息的md5資訊的示例。有時如果在訊息通訊期間遇到MD5問題,則需要檢查md5sum。這時會用到該命令,一般不常用。有關md5sum的解釋,請參見“ROS術語”。
$ rosmsg md5 turtlesim/Pose
863b248d5016ca62ea2e895ae5265cf9
4.6.4 rosmsg package [功能包名稱]:顯示用於指定功能包的所有訊息
可以看到特定功能包中使用的訊息。
$ rosmsg package turtlesim
turtlesim/Color
turtlesim/Pose
4.6.5 rosmsg packages:顯示使用訊息的所有功能包
$ rosmsg packages
actionlib
actionlib_msgs
actionlib_tutorials
base_local_planner
bond
control_msgs
costmap_2d
~省略~
4.7 rossrv:ROS服務資訊
因為讀者需要了解服務,所以參考 “ROS術語”中的服務(service)。
在執行ROS服務資訊相關示例之前,先關閉所有節點。通過在不同的終端視窗中執行以下命令來執行turtlesim_node和turtle_teleop_key。
$ roscore
$ rosrun turtlesim turtlesim_node
$ rosrun turtlesim turtle_teleop_key
4.7.1 rossrv list:顯示所有服務
該命令顯示了ROS上當前安裝的功能包的所有服務。根據目前包含在ROS中的功能包,顯示結果可能會有所不同。
$ rossrv list
control_msgs/QueryCalibrationState
control_msgs/QueryTrajectoryState
diagnostic_msgs/SelfTest
dynamic_reconfigure/Reconfigure
gazebo_msgs/ApplyBodyWrench
gazebo_msgs/ApplyJointEffort
gazebo_msgs/BodyRequest
gazebo_msgs/DeleteModel
~ 省略 ~
4.7.2 rossrv show [服務名稱]:顯示指定服務的資訊
以下示例顯示turtlesim/SetPen服務資訊。可以確認uint8是包含r、g、b、width和off等5種資訊的服務。請注意,“---”在服務檔案中用作請求和響應的分隔符。對於turtlesim/SetPen,使用者可以看到只有請求,沒有任何響應。
$ rossrv show turtlesim/SetPen
uint8 r
uint8 g
uint8 b
uint8 width
uint8 off
---
4.7.3 rossrv md5 [服務名稱]:顯示md5sum
在以下示例中,使用該命令來檢視turtlesim/SetPen服務的md5資訊。有時如果在服務請求和響應期間遇到MD5問題,則需要檢查md5sum。這時會用到該命令,一般不常用。
$ rossrv md5 turtlesim/SetPen
9f452acce566bf0c0954594f69a8e41b
4.7.4 rossrv package [功能包名稱]:顯示用於指定功能包的所有服務
可以看到指定功能包中用到的服務。
$ rossrv package turtlesim
turtlesim/Kill
turtlesim/SetPen
turtlesim/Spawn
turtlesim/TeleportAbsolute
turtlesim/TeleportRelative
4.7.5 rossrv packages:顯示使用服務的所有功能包
$ rossrv packages
control_msgs
diagnostic_msgs
dynamic_reconfigure
gazebo_msgs
map_msgs
nav_msgs
navfn nodelet
oroca_ros_tutorials
roscpp
sensor_msgs
std_srvs
tf
tf2_msgs
turtlesim
~省略~
4.8 rosbag:ROS日誌資訊
如在ROS中用bag格式儲存各種訊息,並在需要時將其回放,以便我們可以重現以前的情況。rosbag是一個實現生成、播放和壓縮等功能的程式,它具有以下幾種功能。
在執行ROS日誌資訊例子之前,先關閉所有節點。通過在不同的終端視窗中執行以下命令來執行turtlesim_node和turtle_teleop_key。
$ roscore
$ rosrun turtlesim turtlesim_node
$ rosrun turtlesim turtle_teleop_key
4.8.1 rosbag record [選項][話題名稱]:記錄指定話題的訊息
首先,使用rostopic list命令檢視ROS網路上當前正在使用的話題列表。
$ rostopic list
/rosout
/rosout_agg
/turtle1/cmd_vel
/turtle1/color_sensor
/turtle1/pose
如以下示例所示,把要進行記錄的話題作為record命令的選項來輸入,則會開始記錄於bag檔案中。在開始記錄之後,在執行turtle_teleop_key節點的終端視窗中用鍵盤的方向鍵移動烏龜,則會記錄選定的/turtle1/cmd_vel話題。然後按[Ctrl + c]結束記錄,則會生成一個檔名為“2017-07-10-14-16-28.bag”的bag檔案,如下所示。
$ rosbag record /turtle1/cmd_vel
[INFO] [1499663788.499650818]: Subscribing to /turtle1/cmd_vel
[INFO] [1499663788.502937962]: Recording to 2017-07-10-14-16-28.bag.
如果要同時記錄所有話題,而不是特定話題,請在命令中新增“-a”選項。
$ rosbag record -a
[WARN] [1499664121.243116836]: --max-splits is ignored without --split
[INFO] [1499664121.248582681]: Recording to 2017-07-10-14-22-01.bag.
[INFO] [1499664121.248879947]: Subscribing to /turtle1/color_sensor
[INFO] [1499664121.252689657]: Subscribing to /rosout
[INFO] [1499664121.257219911]: Subscribing to /rosout_agg
[INFO] [1499664121.260671283]: Subscribing to /turtle1/pose
4.8.2 rosbag info [bag檔名]:檢視bag檔案的資訊
使用者可以檢查bag檔案的資訊。以下示例記錄了/turtle1/cmd_vel話題,共記錄了373條訊息。使用的訊息型別是geometry_msgs/Twist。此外,還可以檢查路徑,bag版本和時間等資訊。
$ rosbag info 2017-07-10-14-16-28.bag
path:
2017-07-10-14-16-28.bag
version:
2.0
duration: 17.4s
start: Jul 10 2017 14:16:30.36 (1499663790.36)
end:
Jul 10 2017 14:16:47.78 (1499663807.78)
size:
44.5 KB
messages: 373
compression:
none [1/1 chunks]
types: geometry_msgs/Twist [9f195f881246fdfa2798d1d3eebca84a]
topics: /turtle1/cmd_vel 373 msgs : geometry_msgs/Twist
4.8.3 rosbag play [bag檔名]:回放指定的bag檔案
下面的例子是一個回放之前記錄的2017-07-10-14-16-28.bag檔案的命令。如此一來,當時記錄的/turtle1/cmd_vel訊息會原原本本地傳輸,因此在螢幕上可以看到烏龜移動的情況。但是,只有重新執行turtlesim_node,使得優先初始化機器人軌跡和機器人位
置,才可以獲得與圖中相同的結果。
$ rosbag play 2017-07-10-14-16-28.bag
[INFO] [1499664453.406867251]: Opening 2017-07-10-14-16-28.bag
Waiting 0.2 seconds after advertising topics... done.
Hit space to toggle paused, or 's' to step.
[RUNNING] Bag Time: 1499663790.357031 Duration: 0.000000 / 17.419737
[RUNNING] Bag Time: 1499663790.357031 Duration: 0.000000 / 17.419737
[RUNNING] Bag Time: 1499663790.357163 Duration: 0.000132 / 17.419737
~ 省略 ~
4.8.4 rosbag compress [bag檔名]:壓縮指定的bag檔案
短時間記錄的bag檔案因為不是很大,所以不成問題,但是長時間記錄資料時,bag檔案會佔用大量的硬碟儲存空間。如果使用本例中使用的命令對其進行壓縮,則將佔用很小的儲存空間。
$ rosbag compress 2017-07-10-14-16-28.bag
2017-07-10-14-16-28.bag 0% 0.0 KB 00:00
2017-07-10-14-16-28.bag 100% 35.0 KB 00:00
如下所示,前面的例子中的bag檔案被縮減為1/4。 壓縮前的原始檔案會以檔名新增“orig”的檔案另行儲存。
2017-07-10-14-16-28.bag 12.7kB
2017-07-10-14-16-28.orig.bag 45.5kB
4.8.5 rosbag decompress [bag檔名]:對指定的bag檔案解壓
要解壓縮,則需使用如下命令。這個命令會將檔案恢復到壓縮之前的狀態。
$ rosbag decompress 2017-07-10-14-16-28.bag
2017-07-10-14-16-28.bag 0% 0.0 KB 00:00
2017-07-10-14-16-28.bag 100% 35.0 KB 00:00
5 ROS catkin命令
ROS的catkin命令用於使用catkin 構建系統來構建功能包。
5.1 catkin_create_pkg:自動生成功能包
catkin_create_pkg [功能包名稱] [依賴性功能包1] [依賴性功能包2] ...
catkin_create_pkg是建立一個包含CMakeLists.txt和package.xml檔案的空功能包的命令。以下例子顯示了使用catkin_create_pkg命令建立一個依賴於roscpp和std_msgs的my_package功能包。
$ catkin_create_pkg my_package roscpp std_msgs
5.2 catkin_make:基於catkin 構建系統的構建
catkin_make [選項]
catkin_make是構建使用者建立的功能包或構建下載的功能包的命令。以下示例是構建~/catkin_ws/src目錄中所有功能包的示例。
$ cd ~/catkin_ws
$ catkin_make
如果要只構建一部分功能包,而不是全部功能包,請使用“--pkg [包名]”選項來執行,如下所示:
$ catkin_make --pkg user_ros_tutorials
5.3 catkin_eclipse:將以catkin構建系統生成的功能包修改成可以在Eclipse環境中使用的功能包
Eclipse是整合開發環境(IDE)之一,而catkin_eclipse命令用於構建一個可以使用Eclipse來管理和程式設計功能包的環境。這將為Eclipse建立一個~/catkin_ws/ build/.cproject和~/catkin_ws/build/.project等專案檔案。您可以通過從Eclipse選單中選擇
[Makefile Project with Existing Code]並選擇~/catkin_ws/build/來管理Eclipse中~/catkin_ws/src中的所有功能包。
$ cd ~/catkin_ws
$ catkin_eclipse
5.4 catkin_generate_changelog:生成CHANGELOG.rst檔案
catkin_generate_changelog命令在更新功能包的版本時建立一個描述更新記錄的CHANGE LOG.rst檔案。
catkin_prepare_release:準備釋出時用到的更新記錄和版本標記
catkin_prepare_release是用於更新由catkin_generate_changelog命令生成的CHANGELOG.rst檔案的命令。在把建立的功能包註冊到官方ROS儲存庫或更新功能包的版本時,會使用catkin_generate_changelog和catkin_prepare_release命令。
5.5 catkin_init_workspace:初始化catkin構建系統的工作目錄
catkin_init_workspace是初始化使用者工作目錄(~/catkin_ws/src)的命令。除了特殊情況外,這個命令在ROS安裝期間只執行一次。
$ cd ~/catkin_ws/src
$ catkin_init_workspace
5.6 catkin_find:搜尋catkin,找到並顯示工作空間
catkin_find是一個顯示各專案的工作目錄的命令。
catkin_find [功能包名稱]
使用者可以通過執行catkin_find命令來找出正在使用的所有工作目錄。此外,如果執行“catkin_find [功能包名稱]”,則會看到選項中指定的與功能包相關的工作目錄,如下所示。
$ catkin_find
/home/pyo/catkin_ws/devel/include
/home/pyo/catkin_ws/devel/lib
/home/pyo/catkin_ws/devel/share
/opt/ros/kinetic/bin
/opt/ros/kinetic/etc
/opt/ros/kinetic/include
/opt/ros/kinetic/lib
/opt/ros/kinetic/share
$ catkin_find turtlesim
/opt/ros/kinetic/include/turtlesim
/opt/ros/kinetic/lib/turtlesim
/opt/ros/kinetic/share/turtlesim
6 ROS功能包命令
ROS功能包命令用於操作ROS功能包,比如顯示功能包資訊、安裝相關功能包,等。
6.1 rospack:顯示指定的ROS功能包的相關資訊
rospack [選項] [功能包名稱]
rospack是一個命令,用於顯示與指定的ROS功能包相關的資訊,如儲存位置、依賴關係和整個功能包列表。可以使用find、list、depends-on、depends和profile等選項。如果在rospack查詢命令之後指定了功能包名稱,會顯示該功能包的儲存位置,如以下示例所示。
$ rospack find turtlesim
/opt/ros/kinetic/share/turtlesim
rospack list命令顯示PC上的所有功能包。使用者可以結合rospack list命令與Linux搜尋命令grep來輕鬆找到該功能包。例如,“rospack list | grep turtle”將顯示所有功能包中只與turtle相關的功能包。
$ rospack list
actionlib /opt/ros/kinetic/share/actionlib
actionlib_msgs /opt/ros/kinetic/share/actionlib_msgs
actionlib_tutorials /opt/ros/kinetic/share/actionlib_tutorials
amcl /opt/ros/kinetic/share/amcl
angles /opt/ros/kinetic/share/angles
base_local_planner /opt/ros/kinetic/share/base_local_planner
bfl /opt/ros/kinetic/share/bfl
$ rospack list | grep turtle
turtle_actionlib /opt/ros/kinetic/share/turtle_actionlib
turtle_tf /opt/ros/kinetic/share/turtle_tf
turtle_tf2 /opt/ros/kinetic/share/turtle_tf2
turtlesim /opt/ros/kinetic/share/turtlesim
如果在rospack depends-on命令之後指定了一個功能包名稱,則僅顯示使用指定功能包的功能包列表,如以下示例所示。
$ rospack depends-on turtlesim
turtle_tf2
turtle_tf
turtle_actionlib
如果在rospack depends命令之後指定了功能包名稱,則會看到執行該功能包所需的依賴性功能包的列表,如以下示例所示。
$ rospack depends turtlesim
cpp_common
rostime
roscpp_traits
roscpp_serialization
genmsg
genpy
message_runtime
std_msgs
geometry_msgs
catkin
gencpp
genlisp
message_generation
rosbuild
rosconsole
rosgraph_msgs
xmlrpcpp
roscpp
rospack
roslib
std_srvs
rospack profile命令通過檢查儲存功能包的工作目錄(例如“/opt/ros/kinetic/share”或“~/catkin_ws/src”)和功能包的資訊來重建功能包索引。當新新增的功能包使用“roscd”等時, 在列表中沒有顯示時可以使用該命令來更新索引。
$ rospack profile
Full tree crawl took 0.021790 seconds.
Directories marked with (*) contain no manifest. You may
want to delete these directories.
To get just of list of directories without manifests,
re-run the profile with --zombie-only
-------------------------------------------------------------
0.020444 /opt/ros/kinetic/share
0.000676 /home/pyo/catkin_ws/src
0.000606 /home/pyo/catkin_ws/src/ros_tutorials
0.000240 * /opt/ros/kinetic/share/OpenCV-3.2.0-dev
0.000054 * /opt/ros/kinetic/share/OpenCV-3.2.0-dev/haarcascades
0.000035 * /opt/ros/kinetic/share/doc
0.000020 * /opt/ros/kinetic/share/OpenCV-3.2.0-dev/lbpcascades
0.000008 * /opt/ros/kinetic/share/doc/liborocos-kdl
6.2 rosinstall:安裝ROS附加功能包
rosinstall是一個自動安裝或更新由原始碼管理軟體(SCM,如SVN、Mercurial、Git和Bazaar)管理的ROS包的命令。一旦像3.1節那樣執行它一次,之後當功能包有更新時,會自動安裝需要的功能包或更新。
6.3 rosdep:安裝該功能包的依賴性檔案
rosdep [選項]
rosdep是安裝指定功能包的依賴性檔案的命令。選項包括check、install、init和update。如下例所示,執行“rosdep check [功能包名]”,會檢查指定功能包的依賴關係。執行“rosdep install package name”,將安裝指定功能包的依賴功能包。還有
“rosdep init”和“rosdep update”,但請參閱實際用法。
$ rosdep check turtlesim
All system dependencies have been satisified
$ rosdep install turtlesim
All required rosdeps installed successfully
6.4 roslocate:顯示ROS功能包的資訊
roslocate [選項] [功能包名稱]
roslocate是顯示功能包相關資訊的命令,例如功能包正在使用的ROS的版本、SCM型別和儲存庫位置等。可用的選項是info、vcs、type、uri和repo等。在這裡,我們來看看一次顯示所有這些資訊的info。
$ roslocate info turtlesim
Using ROS_DISTRO: kinetic
- git:
local-name: turtlesim
uri: https://github.com/ros/ros_tutorials.git
version: kinetic-devel
6.5 roscreate-pkg:自動生成ROS功能包(用於舊的rosbuild系統)
roscreate-pkg是一個像catkin_create_pkg命令一樣自動建立一個功能包的命令。該命令是在catkin構建系統之前的舊的rosbuild系統中使用的命令。它被保留僅僅是為了版本相容性,現在基本不會用到。
6.6 rosmake:構建ROS功能包(用於舊的rosbuild系統)
rosmake是一個像catkin_make命令一樣構建功能包的命令。該命令是在catkin構建系統之前的舊的rosbuild系統中使用的命令。它被保留僅僅是為了版本相容性,現在基本不會用到。