ROS 遠端連線

其實機器人本身就是一台電腦,不管你今天是用什麼主機板或開發版,到最後,一定得再接上網路,才可能跑 ROS (除非你把機器人有連上網卡的主機設成熱點,不過這樣好像治標不治本),否則會顯示「找不到 master」等錯誤訊息。其實,我們常常也會碰到需要遠端監控或操作的狀況,除了看起來比較酷以外,還有更實際的原因:我們需要將比較需要做運算的演算法,在另外一台電腦上執行,而機器人上的主機,只需要收感測器資料加控制馬達就可以了。ROS便提供了多台主機共享
Topics 的方法,藉由乙太網路存取資源,實際上多台電腦用起來,跟用一台電腦差不多,但省去許多要熟悉 Socket架設之類的麻煩。好,不囉嗦,步驟如下:

內容一覽:

1         準備步驟

1.1        自我連線檢測

1.2        雙方連線檢測

2         遠端連線

3         ROS 資源共享

1. 準備步驟
1.1 自我連線檢測

我們實際的例子,就是一台電腦連機器人:

Fig. 1.

遠端連線機器人示意圖

首先,必須先確認 Robot 端主機和 Client 端主機皆連線到同一個乙太網內。我們打開機器人電腦上的終端機,用ping 做連線檢測。這邊有兩種方式:
(1)  
IP 來檢測。如果不知道自己的IP的話,在終端機輸入:

$ ifconfig

終端機應該會輸出以下訊息:

請看 wlan0中 inet addr IP位址,這就是這台電腦的 IP 位址。看你是用什麼方式連線,如果網路是直接接在數據機上的話,應該是看 io 那部分找對應的 IP。這樣的位址會隨著你連線到不同的路由器或子網路而變更,因此如果今天要是由其他裝置遠端
ping 這台機器的話,必須先在這端知道自己的 IP。不過好處是,你將會很確定自己的位址只是對,因此連不上去可能是另外一台的網路設定出問題。

那麼現在就可以來 ping 自己。假設我取得了我的 IP,是192.168.120.101,現在來試試看:

$ ping 192.168.2.109

順利的話,終端機會出現以下訊息,

PING 192.168.2.109 (192.168.2.109) 56(84) bytes of data.
64 bytes from 192.168.2.109: icmp_seq=1 ttl=64 time=0.045 ms
64 bytes from 192.168.2.109: icmp_seq=2 ttl=64 time=0.046 ms
64 bytes from 192.168.2.109: icmp_seq=3 ttl=64 time=0.046 ms
64 bytes from 192.168.2.109: icmp_seq=4 ttl=64 time=0.042 ms
^C
— 192.168.2.109 ping statistics —
4 packets transmitted, 4 received, 0% packet loss, time 2997ms
rtt min/avg/max/mdev = 0.042/0.044/0.046/0.008 ms

表示自我連線測試成功。如果沒有,請確認實體連線是否正常,然後再檢測 Linux上網路連線設定是否正確。可以參考「埃羅魯巴特」中的疑難排解。
(2)  
使用 Zeroconf 的方式 ping 自己。Zeroconf 是一系列能自動整合網路連線的技術。你可以直接使用 Zeroconf 的名稱來取代 IP,因此就算你有多台機器都同時連線在另外一個網域上,在不清楚每台的IP情況下,仍然可以透過 Zeroconf 找到對方。Zeroconf
的名稱,就是:

[hostname的名稱].local
直接在終端機上打:

$ hostname

回覆的訊息,就是你這台主機的 hostname,譬如我的是 charly-MSI,那麼zeroconf就是 charly-MSI.local,如下:

charly-MSI

Ping 自己:

$ ping charly-MSI.local

回覆的訊息跟方法 (1) 中一樣,連線正常。

PING charly-MSI (127.0.1.1) 56(84) bytes of data.
64 bytes from charly-MSI (127.0.1.1): icmp_seq=1 ttl=64 time=0.012 ms
64 bytes from charly-MSI (127.0.1.1): icmp_seq=2 ttl=64 time=0.045 ms
64 bytes from charly-MSI (127.0.1.1): icmp_seq=3 ttl=64 time=0.046 ms
64 bytes from charly-MSI (127.0.1.1): icmp_seq=4 ttl=64 time=0.047 ms
^C
— charly-MSI ping statistics —
4 packets transmitted, 4 received, 0% packet loss, time 2999ms
rtt min/avg/max/mdev = 0.012/0.037/0.047/0.015 ms

 1.2. 雙方連線檢測

我們再次使用 ping 來互測對方連線,如果從 Client 端能連線到 Robot 端,並且反之亦然,表示連線正常。那麼我們就可以進入到下一個步驟。

Client 端終端機輸入:

$ ping myRobot.local

接著在 Robot端終端機輸入:

$ ping myClient.local

都能連上,跳到下一步。

2. 遠端連線

我們可以使用 ssh從 Client 端連線到 Robot 端:

$ ssh myRobot.local

如果你機器人的 ssh 要求比較多的話,那就連登入的使用者名稱都寫下去:

$ ssh myRobot@myRobot.local

那如果你還想要遠端連線時遠端存取圖形化使用者介面(GUI),那記得把 Xorg 打開,如下:

$ ssh –X myRobot.local

連線得到的話,輸入被遠端連線的電腦密碼,登入。

3. ROS資源共享

為了讓每台主機上的 ROS 都能共用資源,我們必須確認 Client 能知道誰是 Master,因此,我們可以打開用起來最順手的文件編輯器,譬如說我打開 vim,將以下指令存入 ~/.bashrc

$ vim ~/.bashrc

譬如說我的機器人 hostname叫 myRobot,那我們則拉到文件最後一行,在下面寫:

export ROS_HOSTNAME=myRobot.local

Client 端則也寫上

export ROS_HOSTNAME=myClient.local

那現在要讓大家知道誰是老大。如果你像我們的例子一樣,一個電腦連一個接器人的話,通常機器人會被設為 Master,電腦則為 Client,那麼就在 Client 端的 ~/.bashrc中,加入:

export ROS_MASTER_URI=http://myRobot.local:11311

這樣 Client 就知道機器人是老大。記得後面的 :11311 要加上去喔!其實你也可以將
Master 設在 Client 端,但是不管怎麼樣,永遠只能有一個 Master!這很重要,所以請容許我強調三次:

永遠只能有一個 Master

永遠只能有一個 Master

永遠只能有一個 Master

那你可能會問,那萬一有時候我想要在一台機器測完某個功能後,再連上
Master 怎麼辦?很簡單,涼拌!開玩笑的!你可以回到
~/.bashrc
中,把 export ROS_MASTER_URI那行給註解掉,儲存離開,關掉你現在在使用的終端機以及裡面的所有分頁,然後再打開新的終端機,啟動
roscore,這樣子,你就可以將這台電腦與 master
的主機徹底切割!(可謂又是另一種別開生面的神切割啊啊啊啊啊!)

接著,為了讓兩台以上的電腦同步,請記得使用
chrony
來同步時間,如果沒有這個軟體的話,在終端機中這樣安裝:

$ sudo apt-get install chrony

安裝完後,再安裝 ntpdate,一切就緒後,在 Client端終端機打:

$ ntpdate myRobot.local

如果一切正確,電腦會顯示兩者電腦的時間差,並會自動同步。

相關主題文章:

更多精采文章,請回目錄瀏覽!

Advertisements

3 thoughts on “ROS 遠端連線

  1. Hi 想請教您一個問題(舉手)
    不曉得您有沒有試過Client端某一個node與Robot端的master不直接連接,然後是透過與Client端的一個Node溝通是可以跟Master端的Node溝通的?因為目前如果在Client端開太多Node與Master連接就會導致lag,雖然可能是網路的問題,但是想試著解決Master的負擔。

    整理一下以上問題,總共有三個Node。
    A為Master端發送msg的Node;B為Client端接收msg的Node與Master連接;C為Client端Node與B可溝通但沒有直接與A連接,必要時才溝通。

    謝謝:)

    喜歡

    • 嗨,Alyson,

      首先,你是要拿這樣的架構做什麼呢?要達到什麼樣的效果?

      舉個例子好了,如果今天在Master端收感測器資料,Client端做些大計算量程式或顯示,那麼我個人最直接的方式,就是直接把要收感測器資料且更新頻率相對高的節點都會放在Master 端,剩下的一些節點,例如你說 C 節點,則放在 Client 端。其實在有限頻寬下,ROS有提供 topic_tools 作一些傳輸上的優化,例如說使用 throttle 限制節點傳輸或接收的頻率,或者在 Client 端使用 relay讓 msg 集中傳過來,作一個中繼點再傳給 Client 端的節點。最好的例子,可以去參考 RTABMap 教學

      這幾樣工具跑得起來的話,應該可以幫你解決傳輸上的問題!

      喜歡

      • 感謝您的回覆^^ 目前主要的架構其實可以只用Master跟Client兩邊就可以解決。
        但是想到之後可能會在不同的平台上運行Node,而目前測試的過程中遇到太多人與Master連接會使整個系統lag,所以才想要解決這個問題。
        謝謝您的建議,感覺是個很棒的方向。

        Liked by 1 person

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com Logo

您的留言將使用 WordPress.com 帳號。 登出 / 變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 / 變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 / 變更 )

Google+ photo

您的留言將使用 Google+ 帳號。 登出 / 變更 )

連結到 %s