1. ROS 基本概念:

計(jì)算圖級(jí)-------是 ROS 處理數(shù)據(jù)的一種點(diǎn)對(duì)點(diǎn)的網(wǎng)絡(luò)形式。程序運(yùn)行時(shí),所有進(jìn)程及它們所進(jìn)行的數(shù)據(jù)處理,將會(huì)通過一種點(diǎn)對(duì)點(diǎn)的網(wǎng)絡(luò)形式表現(xiàn)出來,即通過節(jié)點(diǎn)、節(jié)點(diǎn)管理器、話題、服務(wù)等來進(jìn)行表現(xiàn)。
ROS 中的基本計(jì)算圖級(jí)概念包括:節(jié)點(diǎn)、節(jié)點(diǎn)管理器、參數(shù)服務(wù)器、消息、服務(wù)、話題和包。這些概念以各種形式來提供數(shù)據(jù)。
- 1.1 節(jié)點(diǎn)( Node )
一個(gè)節(jié)點(diǎn)就是 ROS 功能包中的一個(gè)可執(zhí)行文件,節(jié)點(diǎn)之間可以通過 ROS 客戶端庫(如roscpp 、 rospy )相互通信。一個(gè)機(jī)器人控制系統(tǒng)由許多節(jié)點(diǎn)組成,這些節(jié)點(diǎn)各司其職,如,一個(gè)節(jié)點(diǎn)控制激光距離傳感器,一個(gè)節(jié)點(diǎn)控制輪子的馬達(dá),一個(gè)節(jié)點(diǎn)執(zhí)行定位,一個(gè)節(jié)點(diǎn)執(zhí)行路徑規(guī)劃,一個(gè)節(jié)點(diǎn)提供系統(tǒng)的整個(gè)視圖 ...... - 1.2 節(jié)點(diǎn)管理器( Master )
節(jié)點(diǎn)管理器是 ROS 名稱服務(wù),能夠幫助節(jié)點(diǎn)找到彼此。節(jié)點(diǎn)通過與節(jié)點(diǎn)管理器通信來報(bào)告他們的注冊信息。值得注意的是,當(dāng)這些節(jié)點(diǎn)和節(jié)點(diǎn)管理器通信時(shí),它們可以接受其他注冊節(jié)點(diǎn)的信息,并能保持通信正常。當(dāng)這些注冊信息改變時(shí),節(jié)點(diǎn)管理器也會(huì)回調(diào)這些節(jié)點(diǎn)。所以,沒有節(jié)點(diǎn)管理器,節(jié)點(diǎn)將不能相互找到,也不能進(jìn)行消息交換或者調(diào)用服務(wù)。 - 1.3 參數(shù)管理器( Parameter Server )
是節(jié)點(diǎn)管理器的一部分。其允許數(shù)據(jù)通過在一個(gè)中心位置的關(guān)鍵詞來存儲(chǔ)。 - 1.4 消息( Message )
消息是一種 ROS 數(shù)據(jù)類型,節(jié)點(diǎn)之間通過消息來互相通信。 - 1.5 話題( Topic )
話題是用于識(shí)別消息的名稱,節(jié)點(diǎn)可以發(fā)布消息到話題,也可以訂閱話題以接收消息。一個(gè)話題可能對(duì)應(yīng)有許多節(jié)點(diǎn)作為話題發(fā)布者和話題訂閱者,當(dāng)然,一個(gè)節(jié)點(diǎn)可以發(fā)布和訂閱許多話題。一個(gè)節(jié)點(diǎn)對(duì)某一類型的數(shù)據(jù)感興趣,它只需訂閱相關(guān)話題即可。一般來說。話題發(fā)布者和話題訂閱者不知道對(duì)方的存在。發(fā)布者將信息發(fā)布在一個(gè)全局的工作區(qū)內(nèi),當(dāng)訂閱者發(fā)現(xiàn)該信息是它所訂閱的,就可以接收到這個(gè)信息。 - 1.6 服務(wù)( Service )
我們可以看出,發(fā)布 / 訂閱模式是一種多對(duì)多的傳輸方式,顯然這種傳輸方式不適用于請(qǐng)求 / 回復(fù)的交互方式。請(qǐng)求 / 回復(fù)交互方式經(jīng)常被用于分布式系統(tǒng)中。請(qǐng)求服務(wù)通過 Service 來進(jìn)行, Service 被定義為一對(duì)消息結(jié)構(gòu):一個(gè)用于請(qǐng)求,一個(gè)用于回復(fù)。一個(gè)客戶通過發(fā)送請(qǐng)求信息并等待響應(yīng)來使用服務(wù)。( ROS中的請(qǐng)求 / 回復(fù)交互方式好像是一個(gè)遠(yuǎn)程程序調(diào)用。) - 1.7 消息記錄包( Bag )
消息記錄包是一種用于保存和回放 ROS 消息數(shù)據(jù)的格式。消息記錄包是檢索傳感器數(shù)據(jù)的重要機(jī)制,這些數(shù)據(jù)雖然很難收集,但是對(duì)于發(fā)展和測試算法很有必要。
2. 基本命令: roscore, rosnode, rosrun
ros 命令的說明及參數(shù)可以通過 < 命令 > -h (或 --help )來查看
例如:rosnode -h
- 2.1 roscore
在運(yùn)行所有有關(guān)具體操作的 ROS 程序之前首先要運(yùn)行該命令,然后打開新標(biāo)簽頁運(yùn)行其他 ROS 程序。
roscore - 2.2 rosnode
顯示當(dāng)前運(yùn)行的 ROS 節(jié)點(diǎn)信息。
列出活躍的節(jié)點(diǎn):
rosnode list
rosnode info 命令返回的是關(guān)于一個(gè)特定節(jié)點(diǎn)的信息:
rosnode info /rosout
- 2.3 rosrun
rosrun可以運(yùn)行 package 中的可執(zhí)行文件 , 不需要知道可執(zhí)行文件的位置
用法: rosrun [package_name] [node_name]
運(yùn)行 turtlesim 包中的節(jié)點(diǎn) turtlesim_node :
rosrun turtlesim turtlesim_node
通過命令來改變節(jié)點(diǎn)名稱為 my_turtle :
rosrun turtlesim turtlesim_node __name:=my_turtle
在新標(biāo)簽頁中運(yùn)行命令:
rosrun turtlesim turtle_teleop_key
需要注意的是,應(yīng)選中 turtle_teleop_key 所在的終端窗口,即最后打開的新標(biāo)簽頁,以確保鍵盤輸入能夠被捕獲。
在新的標(biāo)簽頁用rosnode list命令查看此時(shí)運(yùn)行的 ROS 節(jié)點(diǎn) :
rosnode list
可以看到,除了節(jié)點(diǎn) turtlesim ,現(xiàn)在又多出了節(jié)點(diǎn) teleop_turtle 。
可以用 rosnode ping 命令來測試節(jié)點(diǎn):
rosnode ping my_turtle
總結(jié):
roscore= ros+core : master (provides name service for ROS) + rosout(stdout/stderr) +parameter server (parameter server will be introducedlater)
rosnode = ros+node : ROS tool to get information about a node
rosrun = ros+run : runs a node from a given package
3. ROS Topic
用鍵盤控制小海龜運(yùn)動(dòng)這一過程的通信機(jī)制是怎樣的呢?其實(shí),這兩個(gè)節(jié)點(diǎn)是通過一個(gè) ROS 話題( Topic )來相互通信的, turtle_teleop_key 在這個(gè)話題上發(fā)布鍵盤輸入的的消息,而 turtlesim 則訂閱該話題以接收該消息。下面通過 rqt 功能包和 rostopic 命令來查看相關(guān)信息:
- 3.1 rqt 功能包
通過 rqt_graph 來查看當(dāng)前系統(tǒng)的運(yùn)行情況。在新的標(biāo)簽頁運(yùn)行如下命令:
rosrun rqt_graph rqt_graph

如圖所示,節(jié)點(diǎn) turtlesim_node 和節(jié)點(diǎn) turtle_teleop_key 正通過一個(gè)名為 /turtle1/cmd_vel 的話題來相互通信。
除了使用 rqt_graph ,還可以用 rqt_plot 來實(shí)時(shí)顯示一個(gè)發(fā)布到某個(gè)話題上的數(shù)據(jù)變化圖形。這里我們將
使用 rqt_plot 命令來繪制正在發(fā)布到 /turtle1/pose 話題上的數(shù)據(jù)變化圖形。首先,在一個(gè)新終端中運(yùn)行
rqt_plot命令。rosrun rqt_plot rqt_plot在彈出的新窗口左上角的一個(gè)文本框里面可以添加需要繪制的話題。在里面輸入/turtle1/pose/x 后按enter 鍵或點(diǎn)擊 “ +”號(hào)按鈕,并對(duì)/turtle1/pose/y 重復(fù)相同的過程。就會(huì)在圖形中看到 turtle 的 x-y 位置坐標(biāo)圖。

- 3.2 rostopic
使用 rostopic 命令工具能獲取有關(guān) ROS 話題的信息。
運(yùn)行下面命令查看 rostopic 子命令:
rostopic -h
1,rostopic echo:顯示某個(gè)話題上發(fā)布的數(shù)據(jù)。
用法:rostopic echo [topic]
rostopic echo /turtle1/cmd_vel
此時(shí)終端沒有任何數(shù)據(jù),切換到 turtle_teleop_key 節(jié)點(diǎn)運(yùn)行時(shí)所在的終端窗口,通過鍵盤方向鍵控制小海龜移動(dòng),然后再切換回原來的終端窗口。此時(shí)出現(xiàn)發(fā)布到話題上的數(shù)據(jù)。
2, rostopic list :能夠列出所有當(dāng)前訂閱和發(fā)布的話題。
先看一下 rostopic list 子命令需要哪些參數(shù)。運(yùn)行命令:
rostopic list -h
使用 verbose 選項(xiàng),以列出相關(guān)話題的詳細(xì)信息。運(yùn)行命令:
rostopic list -v
顯示了有關(guān)所發(fā)布和訂閱的話題的詳細(xì)信息,其中方括號(hào)中表示的是話題的類型。
3,rostopic type :用來查看所發(fā)布話題的消息類型。
用法: rostopic type [topic]運(yùn)行如下命令:
rostopic type /turtle1/cmd_vel
上面的 geometry_msgs/Twist 即為話題 /turtle1/cmd_vel 的消息類型,這在執(zhí)行命令 rostopic list -v 時(shí)
也有所體現(xiàn)。
下面用 rosmsg 命令來查看消息的詳細(xì)情況:
rosmsg show geometry_msgs/Twist

4, rostopic pub :把數(shù)據(jù)發(fā)布到當(dāng)前某個(gè)正在廣播的話題上。通過此命令可以通過直接在終端發(fā)送命令來控制小海龜
用法: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]'```
以上命令會(huì)發(fā)送一條消息給 turtlesim ( -1 表示命令只發(fā)布一次),這樣小海龜就會(huì)以 2.0 大小的線速度和 1.8 大小的角速度開始移動(dòng)。要想保持這個(gè)運(yùn)動(dòng), turtle 需要一個(gè) 1Hz 穩(wěn)定頻率的命令流來保持移動(dòng)狀態(tài)。
使用 `rostopic pub -r` 命令發(fā)布一個(gè)穩(wěn)定的命令流:
rostopic pub /turtle1/cmd_vel geometry_msgs/Twist -r 1 -- '[2.0, 0.0, 0.0]' '[0.0, 0.0, 1.8]'
此時(shí),我們再通過 rqt_graph 來查看當(dāng)前系統(tǒng)的運(yùn)行情況,即在新的標(biāo)簽頁,運(yùn)行:
`rosrun rqt_graph rqt_graph`

由上圖可以看出, rostopic pub 發(fā)布消息到話題 /turtle1/cmd_vel , rostopic echo 從該話題接收消息輸出到終端,所以此時(shí)我們可以在新的終端用 rostopic echo 命令查看不斷發(fā)布到話題的數(shù)據(jù)。
5, rostopic hz :命令可以用來查看數(shù)據(jù)發(fā)布的頻率。
用法: rostopic hz [topic]
之前我們用 rostopic pub -r 命令發(fā)布一個(gè) 1HZ 的穩(wěn)定命令流,現(xiàn)在我們用 rostopic hz 命令查看一下 :
`rostopic hz /turtle1/cmd_vel`
