原文地址:http://www.corvin.cn/635.html,轉載主要方便隨時查閱,如有版權要求,請及時聯系。
0x00 為何需要配置ROS多機通信
眾所周知ROS是分布式系統,因此可以將機器人需要處理的復雜、計算量大的任務分解在多臺機器上分開運行,這樣就可以降低主系統出現異常的風險,因此我們就需要配置網絡保證各ROS主機之間可以互相通信。另外我們在開發時也經常在本地計算機上來監視遠程ROS主系統的運行狀態也需要配置多機通信,在這里我們使用zeroconf來配置多機通信,zeroconf的全稱是Zero Configuration Networking(零配置網絡),是一種用于自動生成可用IP地址的網絡技術,不需要額外的手動配置和專屬的配置服務器。其目標是讓非專業用戶也能便捷的連接各種網絡設備,例如計算機,打印機等。整個搭建網絡的過程都是通過程式自動化實現。如果沒有zeroconf,用戶必須手動配置一些服務,例如DHCP、DNS,計算機網絡的其他設置等。這些對非技術用戶和新用戶們來說是很難的事情。
當然現在使用的ROS1.0還不是真正的分布式系統,因為仍然是需要一個master主節點來協調各分節點的通信。在不久將來的ROS2.0更高程度上實現了去中心化,使用DDS(Data Distribution Service)即數據分發服務,?目前已經廣泛應用于國防、民航、工業控制等領域, 成為分布式實時系統中數據發布/訂閱的標準解決方案,更多關于DDS的介紹可以參考后面的參考資料提供的維基百科DDS的網址。
0x01 安裝軟件包并配置zeroconf
(1)保證多機時間同步
在ROS網絡中,由于tf轉換和很多消息類型都被標上了時間戳,機器之間的時間同步就非常重要了,一種使各計算機保持時間同步狀態的方法就是在各計算機上安裝chrony和ntpdate軟件包,該軟件包會保持計算機的時鐘與網絡上時間服務器的時鐘一致,我們使各計算機的時間與時間服務器時間同步來達到各計算機時間同步的目的,使用如下命令來安裝chrony和ntpdate:
sudo apt-get install -y chrony ntpdate
在這里我使用本地裝有indigo的臺式計算機和樹莓派裝有kinetic的系統作為演示,當然你選擇兩個筆記本電腦也是可以的,下面是安裝過程:
當安裝好軟件后就可以來進行時間同步了,時間同步命令如下:
sudo ntpdate -u cn.ntp.org.cn
(2)使用Zeroconf配置ROS主機間通信
在經常使用的Linux系統上,如ubuntu系統使用avahi來實現zeroconf,avahi 是Zeroconf規范的開源實現,其包含了一整套多播DNS(multicastDNS)/DNS-SD網絡服務的實現。Avahi允許程序在不需要進行手動網絡配置的情況下,在一個本地網絡中發布和獲知各種服務和主機。例如,當某用戶把他的計算機接入到某個局域網時,如果他的機器運行有Avahi服務,則Avahi程式自動廣播,從而發現網絡中可用的打印機、共享文件和可相互聊天的其他用戶。這有點象他正在接收局域網中的各種網絡廣告一樣。Linux下系統實際啟動的進程名,是avahi-daemon,通過以下命令可以查看當前系統上是否啟動了avahi-daemon守護進程:
ps aux|grep avahi
可以發現兩個ROS主機都已經默認啟動了avahi-daemon守護進程,那么接下來就可以來配置了:
-
獲取主機名稱并測試主機間連通性
使用hostname來得到主機名稱,那么相應的zeroconf主機名就是在該主機名稱后面加上“.local”即可:
-
設置ROS_MASTER_URI和ROS_HOSTNAME變量
在ROS網絡中,指定其中一臺設備作為ROS master主機,那么該主機將負責運行roscore進程,其他設備必須配置ROS_MASTER_URI環境變量來指向該master主機。對于所有的設備都必須要設置的是ROS_HOSTNAME變量,這個ROS_HOSTNAME變量就是我們上面得到的zeroconf主機名。
接下來我們分別修改臺式機和樹莓派的home目錄下的.bashrc文件,在其中增加如下框中配置,在這里我們把樹莓派作為ROS master主機,所以ROS_MASTER_URI指向的是自己robot.local。我們又設置了臺式機的ROS_MASTER_URI也指向robot.local,這就說明我們需要把臺式機作為ROS的一個從節點設備,當然如果想修改臺式機為master主機,樹莓派為從節點設備的話只需要將各自的ROS_MASTER_URI中的robot.local修改為臺式機的zeroconf主機名workspace.local即可。
?
0x02 測試ROS主從機之間的通信
當配置好ROS的ROS_HOSTNAME和ROS_MASTER_URI后,我們需要重新打開一個新終端才能使上述的配置生效。接下來我們就可以在master主機上啟動roscore來測試主從機的ROS通信是否正常了,在臺式機上使用rostopic list來看是否能獲取到話題列表,如果能獲取到說明ROS的主從機通信正常:
接下來測試使用臺式機來遙控master主機上的turtlesim,查看話題能否正常訂閱和發布:
-
在樹莓派上啟動roscore后,還需要啟動turtlesim一個仿真小烏龜的節點:
rosrun turtlesim turtlesim_node
-
在臺式機上運行鍵盤遙控小烏龜移動的節點:
rosrun turtlesim turtle_teleop_key
還可以啟動rqt_plot來同步查看小烏龜的一些數據,直接使用rqt_plot啟動即可,我們在rqt_plot中可視化turtle1/pose中各數據,當然我們在本地臺式機上打開rviz進行調試也是可以的,經常有小伙伴嘗試在樹莓派上打開rivz來進行調試,經常無法在樹莓派上正常啟動,因為rviz特別消耗系統資源,這樣我們就可以在本地臺式機上進行調試了,具體的測試效果如下所示:
-
接下來我們使用ssh來進行連接ROS主機就比較方便了,即使我們不知道對方的IP地址也可以連接了,只需要直接連接該主機的zeroconf主機名即可:
-
0x03 注意事項
[1].需要注意該配置過程是基于ROS主從機在同一個路由器下,即必須要求在同一個IP地址段內,如果想通過互聯網將在兩個不同地址段的ROS主機通信就比較復雜了(即一臺ROS主機在公司,你的ROS從機在家里,想通過在家里直接調試公司里的ROS機器人),不在本教程討論范圍內。
0x04 參考資料
[1].更多關于Zeroconf的介紹可以在官網地址查詢[OL].?http://www.zeroconf.org/
[2].維基百科上關于數據分發服務DDS的介紹[OL].?https://en.wikipedia.org/wiki/Data_Distribution_Service
[3].R.帕特里克-戈貝爾?著 J.羅哈斯 劉柯汕 彭也益 劉振東 李家能 黃玲玲 譯. ROS入門實例[M]. 廣州:中山大學出版社. 2016. 13-17.