ROS 教程之 network:多臺計算機之間網路通訊(1)
LZ在實驗室環境下要實現一臺臺式主機和移動機器人上的筆記本通訊。桌上型電腦作為主機,用rviz監控和無線操作移動機器人,筆記本上通過ROS實現移動機器人的自主定位和路徑規劃等程式。主機上用的虛擬機器裝的ubuntu 12.04,通過有線連線一個無線路由,而筆記本端是通過這個路由的wifi上網,桌上型電腦和筆記本是在同一個路由下。
由於LZ最開始的時候照著《ROS by example 1》中的4.12章節用Zeroconf實現ROS networking失敗,又跑去照著官網的ROS/Networking 教程 操作,還是失敗。兩臺電腦之間要麼就是無法解析主機名(resolve hostname),要麼就是桌上型電腦上虛擬機器這邊可以向筆記本傳送訊息,筆記本無法發訊息給桌上型電腦。本文紀錄LZ的實驗過程,希望能讓您少走彎路。
系列文章分為兩部分:
1.在該系列文章1即本文中實現官網ROS Networking的基礎教程:桌上型電腦上啟動talker.py節點,不斷向筆記本上傳送hello world。筆記本端啟動roscore,和listener.py節點,接受桌上型電腦發來的訊息。
2.在該系列文章2中實現:桌上型電腦上啟動rviz監控和操控小車,筆記本放在移動機器人實現自主定位和路徑規劃。
注:兩臺筆記本在同一個wifi路由下,直接使用《ROS by example 1》中的Zeroconf是可行的,如果無法解析,再接著下面的操作。
一、兩臺電腦通訊前的準備工作:
1.首先檢視兩臺電腦各自的ip資訊和主機名hostname:
檢視ip:在終端中輸入下面的命令
ifconfig
我實驗室桌上型電腦上得到結果如下:
桌上型電腦是有線連線的,在eth0這一欄裡找到你的ip地址,筆記本是通過wifi連線的,在wlan0一欄找到筆記本端的ip地址.
檢視兩電腦各自的主機名,在終端中輸入:
hostname
我桌上型電腦上的得到的結果如下:
桌上型電腦主機名為:hyjlab-virtual-machine,其實主機名hostname就是終端的標題欄上 @後面的那串字元,如上圖。
2.修改/etc資料夾下的hosts檔案:
修改hosts檔案的目的是將兩電腦的ip和主機名繫結,兩臺電腦之間通過hostname就能找到對方。沒有這一步的時候,你直接去ping 對方主機名時,結果是無法解析對方主機名。
這裡以修改桌上型電腦上的hosts檔案為例,筆記本上也要相同操作。由於電腦上的 hosts檔案是只讀檔案,直接修改後是儲存不了的。因此先用root方式對該檔案屬性進行修改。
第一種方式(推薦):
使用常用的gedit 修改,只是在gedit前面加上gksu,如:
gksu gedit /etc/hosts
這種方式修改大批量很方便。第二種方式,通過vim:
在終端裡輸入:
sudo chmod a+w /etc/hosts
修改了許可權以後,再輸入:
vim /etc/hosts
如果提示沒有vim命令,先sudo apt-get install vim 裝一下vim
開啟hosts後,你看到hosts檔案內開頭已經有了兩行,我們從第三行開始插入你剛剛查到的兩臺電腦的ip地址和主機名hostname,形式如下:
your_ip your_hostname
中間用tab鍵隔開,不是空格。LZ的桌上型電腦的hostname為:hyjlab-virtual-machine。筆記本為:hyj-F83VF。
如下圖所示:
輸入完以後,按下退出ESC鍵,然後按下 “ : ” 鍵,輸入wq! 回車就行了,如下圖:
修改完以後,在兩臺電腦上都輸入下列命令重啟以下網路:
sudo /etc/init.d/networking restart
二、實現兩臺電腦間通訊:
1.在兩臺電腦上裝上chrony包,用於實現同步:
sudo apt-get install chrony
2. 在兩臺電腦上都進行ssh伺服器的安裝
關於SSH命令可以參考下Ubuntu環境下SSH的安裝及使用,這裡只管使用,不細談SSH本身。
首先在終端中輸入下面的命令,安裝SSH伺服器,SSH的客服端Ubuntu自帶已經安裝好了:
sudo apt-get install openssh-server
安裝完以後,確認伺服器是否已經啟動:
ps -e|grep ssh
如果只有ssh-agent,那ssh-server還沒有啟動,需要/etc/init.d/ssh start,如果看到sshd那說明ssh-server已經啟動了。
3.正式開始通訊首先進行基本的ping操作,下面用desktop_hostname代表桌上型電腦的主機名,用laptop_hostname代表筆記本上的主機名:
第一步先檢查桌上型電腦去ping 筆記本,看通訊是否正常,輸入:
ssh desktop_hostname
ping laptop_hostname
你應該會得到如下的一些東西:
第二步,反過來從筆記本去ping桌上型電腦:
ssh laptop_hostname
ping desktop_hostname
如果你的桌上型電腦上是直接裝的Ubuntu,那應該也能返回正確的結果。這裡由於LZ是在臺式機的虛擬機器上執行的Ubuntu,然後上網方式是用的Nat方式,導致筆記本那段不能返回正確結果,也就是ping不通。LZ在查閱資料linux虛擬機器可以ping通主機,主機無法ping通虛擬機器後,給出解決辦法如下:
在虛擬機器設定裡面選擇將網路介面卡的網路連線方式由NAT改為橋接就行了。
第三步:跨機器執行talk/listener。如果前面的測試都通了,照著ROS在多機器人上的使用 操作一下,就能實現跨機器執行ROS節點。
這裡我們把筆記本當做主機master,在筆記本上啟動master:
ssh laptop_hostname
roscore
然後在新的終端裡啟動listener,並配置ROS_MASTER_URI,這樣就可以使用剛剛啟動的master了:export ROS_MASTER_URI=http://laptop_hostname:11311
rosrun rospy_tutorials listener.py
最後,在臺式機上啟動talker節點,在臺式機上要配置ROS_MASTER_URI,這樣桌上型電腦上的ROS才能指向筆記本上已經啟動的master:ssh desktop_hostname
export ROS_MASTER_URI=http://laptop_hostname:11311
rosrun rospy_tutorials talker.py
這時你將發現筆記本上的listener開始接受桌上型電腦上釋出的訊息了,這就實現了跨機器執行不同的ROS node。
接下來再反過來測試一下筆記本作為talker,往桌上型電腦釋出訊息,可以參考官網教程ROS在多機器人上的使用 :
先用Ctrl+C 終止你筆記本上的listener 和桌上型電腦上的talker,注意終端沒有關閉,然後不用多餘的變動,直接在筆記本的該終端下執行talker節點,在臺式機上的那個終端下執行listener節點。
只要你按著上面的一步一步過來的,反過來應該也是OK的。
到這裡,ROS Netwoking的基礎部分已經完成了,並且在設定了上面的這些步奏以後,《ROS by example 1》4.12中提到的Zeroconf可以使用了。接下來就開始運用在我們自己的專案上,請見下篇教程。
文章為原創,
請注重博主勞動成果,
錯誤請指出,轉載請註明。
--白巧克力reference: