先啟動roscore
roscore
為了獲取節點信息,可以使用rosnode命令
$ rosnode
獲取得一個可接受參數清單
使用rosrun命令啟動一個新的節點,如下所示
$ rosrun turtlesim turtlesim_node
我們可以看見出現了一個新窗口,窗口中間有一個小烏龜,如下圖:
出現一個新節點
使用主題與節點交互
現在要使用一個節點,並讓節點做如下工作:
$ rosrun turtlesim turtle_teleop_key
通過節點訂閱的主題,我們可以用箭頭鍵移動烏龜,如下圖:
為什么turtle_teleop_key執行時,小海龜會移動?
使用以下命令查看主題清單
$ rostopic list
使用echo參數,可以查看節點發出的信息。運行以下命令行並使用鍵盤出發消息
$ rostopic echo /turtle1/cmd_vel
看到類似顯示
使用命令行擦好看消息類型
rostopic type /turtle1/cmd_vel
如果你想看到消息字段,使用以下命令:
$ rosmsg show geometry_msgs/Twist
我們可以通過這些工具使用rostopic pub [topic] [msg_type] [args] 命令直接發布主題
$ rostopic pub -1 /turtle1/cmd_vel geometry_msgs/Twist -- '[2.0, 0.0, 0.0]' '[0.0, 0.0, 1.8]'
參數分析:
rostopic pub 這條命令將會發布消息到某個給定的話題。
-1 (單個破折號)這個參數選項使rostopic發布一條消息后馬上退出。
/turtle1/command_velocity 這是消息所發布到的話題名稱。
turtlesim/Velocity 這是所發布消息的類型。
-- (雙破折號)這會告訴命令選項解析器接下來的參數部分都不是命令選項。這在參數里面包含有破折號-(比如負號)時是必須要添加的。
2.0 1.8 正如之前提到的,在一個turtlesim/Velocity消息里面包含有兩個浮點型元素:linear和angular。在本例中,2.0是linear的值,1.8是angular的值。這些參數其實是按照YAML語法格式編寫的,這在YAML文檔中有更多的描述。
小烏龜畫圓:
你可能已經注意到turtle已經停止移動了。這是因為turtle需要一個穩定的頻率為1Hz的命令流來保持移動狀態。我們可以使用rostopic pub -r命令來發布一個穩定的命令流
rostopic pub /turtle1/cmd_vel geometry_msgs/Twist -r 1 -- '[2.0, 0.0, 0.0]' '[0.0, 0.0, 1.8]'
..使用 rostopic hz
rostopic hz命令可以用來查看數據發布的頻率。 用法: rostopic hz [topic]
我們看一下turtlesim_node發布/turtle/pose時有多快:
rostopic hz /turtle1/pose
現在我們可以知道了turtlesim正以大約60Hz的頻率發布數據給turtle。
1.理解ROS Topic
這個教程介紹ROS topic和rostopic和rqt_plot命令行工具.
1.1建立
1.1.1roscore
先在一個新的終端中運行roscore;
$ roscore
注意:只能運行一個roscore.
1.1.2tuetlesim
在新的終端中運行turtlesim;
$ rosrun turtlesim turtlesim_node
1.1.3turtle 鍵盤遙控
我們需要用一些東西去控制turtle,在新的終端運行:
$ rosrun turtlesim turtle_teleop_key
[ INFO] 1254264546.878445000: Started node [/teleop_turtle], pid [5528], bound on [aqy], xmlrpc port [43918], tcpros port [55936], logging to [~/ros/ros/log/teleop_turtle_5528.log], using [real] time
Use arrow keys to move the turtle.

現在你可以用鍵盤上的方向鍵控制小烏龜了(保持鍵盤輸入窗口在焦點).再看看窗口后面發生了什么.
1.2ROS Topic
turtlesim_node和turtle_teleop_key node之間用topic交流通信.
turtle_teleop_key 在這個topic上發布按鍵敲擊,而turtlesim訂閱同樣的topic接受按鍵敲擊.讓我們用rqt_graph顯示現在正在運行的topic和nodes.
如果你是用electric或更早的版本,建議用rxygrah替代。
1.2.1用rqt_grah
rqt_grah創建了一個動態的圖形顯示系統上正在進行什么,rqt_grah是qpt package的一部分.運行:
$ sudo apt-get install ros-<distro>-rqt
$ sudo apt-get install ros-<distro>-rqt-common-plugins
<distro>用你的ros版本名替代
再在新終端輸入:
$ rosrun rqt_graph rqt_graph
你將會看到:

如果把鼠標放上去將會高亮,node是藍色或者綠色,topic是紅色.正如你所見到的一樣,turtlesim_node and the turtle_teleop_key nodes 是通過叫做
/turtle1/command_velocity. 的在通信.


1.2.3介紹rostopic
rostopic工具允許你從rostopic中獲得信息.
通過:
$ rostopic -h
可以獲得等多命令選項
rostopic bw display bandwidth used by topic
rostopic echo print messages to screen
rostopic hz display publishing rate of topic
rostopic list print information about active topics
rostopic pub publish data to topic
rostopic type print topic type
讓我們用這些命令去檢驗一下turtlesim.
1.2.3使用rostopic echo
用法:
rostopic echo [topic]
允許我們看看turtle_teleop_key node. 發布的命令速度數據;
對於ROS Hydro和之后的版本,這個數據在發布在/turtle1/cmd_vel topic,在新終端,運行:
$ rostopic echo /turtle1/cmd_vel
選擇turtle_teleop_key終端,用方向鍵控制小烏龜,你將會看到
linear:
讓我們再來看看rqt_graph.點擊左上角的刷新按鈕顯示新的node.你將會看到rostopic echo也訂閱了turtle1/command_velocity topic.

1.2.4使用rostopic list
rostopic list會列出現在所有被訂閱和發布的topic.
看看這個命令需要什么參數,運行:
$ rostopic list -h
Usage: rostopic list [/topic]
-h, --help show this help message and exit
-v, --verbose list full details about each topic
對於verbose選項:
$ rostopic list -v
顯示詳細的一列topic信息包括發布的,訂閱的和它們的類型.
Published topics:
* /turtle1/color_sensor [turtlesim/Color] 1 publisher
* /turtle1/command_velocity [turtlesim/Velocity] 1 publisher
* /rosout [roslib/Log] 2 publishers
* /rosout_agg [roslib/Log] 1 publisher
* /turtle1/pose [turtlesim/Pose] 1 publisher
* /turtle1/command_velocity [turtlesim/Velocity] 1 subscriber
* /rosout [roslib/Log] 1 subscriber
1.3 ROS Messages
Topic上的通信通過在nodes之間發送messages來實現.對於發布者(turtle_teleop_key)和訂閱者(turtlesim_node)之間的通信必須使用相同的
message類型.這就意味着,topic的類型由發布的message類型決定.發布在topic上的message的類型可以由rostopic type來決定.
1.3.1使用rostopic type
rostopic type返回任何topic發布的message類型.
用法:
rostopic type [topic]
對於ROS Hydro 和之后的版本:
$ rostopic type /turtle1/cmd_vel
你會得到:
geometry_msgs/Twist
想得到詳細信息運行:
$ rosmsg show geometry_msgs/Twist
既然我們已經知道turtlesim期待什么類型的message了,我們可以發布命令給小烏龜.
1.4繼續rostopic
既然我們已經知道ros message 了,讓我們一起用ros messages吧。
1.4.1使用rostopic pub
rostopic pub把數據發布到正被廣播的topic上。
用法:
rostopic pub [topic] [msg_type] [args]
對於ROS Hydro和之后的版本:
$ rostopic pub -1 /turtle1/cmd_vel geometry_msgs/Twist -- '[2.0, 0.0, 0.0]' '[0.0, 0.0, 1.8]'
這會給turtle發布一個message告訴它線速度2.0,角速度1.8.

這個命令十分復雜,所以我們仔細看看它的每個參數
對於ROS Hydro和之后的版本:
這個命令會發送messages給給定的topic:
rostopic pub
這個選項使得rostopic只發布一條message然后退出:
-1
這是要發布給它信息的那個topic:
/turtle1/cmd_vel
這是發布topic時的message類型:
geometry_msgs/Twist
雙虛線告訴選項剖析器接下來的參數都不是選擇,以免把負號后面的參數當成參數選項。
--
一個geometry_msgs/Twist 有兩組由三個浮點元素組成得的向量:線性的和角度的.這樣的話,'[2.0, 0.0, 0.0]'就是線性值x=2.0,y=0.0,z=0.0,而'[0.0, 0.0, 1.8]'就是角度的值x=0.0,y=0.0,z=1.8.這些參數遵從YAML 語法規則。更多信息查看YAML command line documentation.
'[2.0, 0.0, 0.0]' '[0.0, 0.0, 1.8]'
你也許注意到小烏龜已經停止了;這是因為小烏龜需要穩定的1HZ的命令流去保持運動。我們可以用rostopic pub -r命令發布一個穩定的命令流。
對於ROS Hydro和之后的版本:
$ rostopic pub /turtle1/cmd_vel geometry_msgs/Twist -r 1 -- '[2.0, 0.0, 0.0]' '[0.0, 0.0, 1.8]'
這將以1HZ的速度去發布速度命令給速度topic.

再刷新一下rqt_graph,看到rostopic pub node 在和rostopic echo node 通信

當你看到小烏龜在繞圈圈的時候可以在一個新的終端輸入rostopic echo 命令看看turtlesim發布的數據。
1.4.2使用rostopic hz
rostopic hz 報告數據發布的速度
用法:
rostopic hz [topic]
來看看turtkesim node 以多快的速度發布/turtle1/pose。
$ rostopic hz /turtle1/pose
你會看到:
subscribed to [/turtle1/pose]
min: 0.005s max: 0.027s std dev: 0.00284s window: 58
min: 0.005s max: 0.027s std dev: 0.00271s window: 118
min: 0.004s max: 0.030s std dev: 0.00339s window: 177
min: 0.004s max: 0.030s std dev: 0.00380s window: 237
min: 0.004s max: 0.030s std dev: 0.00380s window: 290
現在我們知道turtlesim大概以60HZ的速度發布數據。也可以用rostopic type和rosmsg獲取關於topic進一步的信息。
對於ROS Hydro和之后的版本:
$ rostopic type /turtle1/cmd_vel | rosmsg show
現在我們已經用rostopic檢驗了topic,讓我們用其他工具看看turtlesim發布的數據把。
