1. 程式人生 > >ROS 教程之 network:多臺計算機之間網路通訊(1)

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: