在前幾天我們將我們的 ROS 環境給搭建起來了,並且知道了大部分的架構,接下來就準備開始運行我們的程式碼,但在運行之前,我們必須要知道整個通訊架構。
一台機器人他有很多的部分都是需要控制的,像是下面這台 PR2 機器人
他有多個模塊是需要我們去進行控制的,像是以下這些模塊
那我們該怎麼來控制這些模塊,來讓彼此能夠進行溝通呢? 首先我們要有一個 OP 管理員,來管理全部的程序 master(節點管理器),首先每一個 node 都需要跟 master 進行註冊(白名單),在註冊後才能運行,如果有多個 node 時,他們本身是互不認識的,但是透過 master,他們就可以互相溝通了,所以在 ROS 啟動時,我們便需要去把 master 給喚醒,輸入下面這個指令進行喚醒,在喚醒 master 的同時也會將 rosout、parameter server 給喚醒(召喚小怪),而 rosout 是負責將現在系統的資訊給輸出的 node, 看警告跟錯誤的地方便是這裡,並將這些訊息存在 log 中,而parameter server 就是進行一些參數配置的地方。
roscore
Node 是什麼呢? 你可以把它看成是一個程序,在之前我們有說過一個 package 可以有多個可執行文件,他們被讀取後便會成為一個個 node,我們在回來看剛剛 PR2 機器人的圖片,每一個模塊他都是一個 node , 而他的啟動方法是:
rosrun [package name] [node name]
還有一些指令可以用來輔助 node
列出當前運行的 node 訊息
rosnode list
顯示某個 node 的詳細訊息
rosnode info [node name]
結束某個 node
rosnode kill [node name]
測試連接節點
rosnode ping
列出某台機器上運行中的節點
rosnode machine
將沒有連接到的節點給砍了
rosnode cleanup
這個時候你可能會有疑問,如果我一次要開一堆 node , 不就需要開好幾次嗎? 這時候我們可以用 roslaunch, 在昨天有講道說我們有一個 launch 文件, roslaunch 就是拿來輔助我們開啟 launch 文件 然後一次把 master 跟多個 node 一起啟動了:
roslaunch [package name] [launch file name]
我們來看一下 launch 他會長什麼樣子
<launch> <!--頭標籤-->
<node> <!--需要啟動的node及其參數-->
<include> <!--包含其他launch-->
<machine> <!--指定運行的機器-->
<env-loader> <!--設置環境變數-->
<param> <!--定義參數到參數服務器-->
<rosparam> <!--啟動yaml文件參數到參數服務器-->
<arg> <!--定義變數-->
<remap> <!--設定參數映射-->
<group> <!--設定命名空間-->
</launch> <!--頭標籤-->
我們來看一下 PR2 機器人 有多少個節點吧~
在明天我們將要來說明 ROS 中最重要的一環 通訊方式
#Arm Arm Platforms