2020年11月3日 星期二

[ROS] roslaunch: <machine> 標籤的用法

<machine> 標籤可以用來宣告一台設備,以便可以在這台設備上啟動節點。若你只要在本地端啟動所有的節點,就不需要使用到此標籤。這個 <machine> 標籤主要用來宣告遠端設備的 SSH 登入和環境變數等設定。

 

 

標籤說明

 

  • <machine>

 

此標籤主要用來宣告一台用於啟動節點的遠端設備,有下列屬性可以使用:

 

name="machine-name" : 指定一個設備名稱,此設備名稱用於 <node> 標籤的 machine 屬性中。

 

address="blah.willowgarage.com" : 此設備的網路位址 (network address) 或主機名稱 (hostname)

 

env-loader="/opt/ros/fuerte/env.sh" : 指定在遠端設備上的環境設定文件,此環境設定文件是一個 shell script 文件,用以設定遠端設備上所有需要的環境變數,並且以提供的參數執行 exec 指令。

 

default="true|false|never" (optional) : 指定是否作為啟動節點的默認設備。只對相同範圍內,且宣告在其後的節點發生作用。

 

user="username" (optional) : SSH 的帳號名稱,用於登入此設備。若不需要可以省略。

 

password="passwhat" (optional, strongly discouraged) : SSH 的密碼,不建議在此輸入密碼。建議改採 SSH keys SSH agent 的方式,使用憑證來登入。

 

timeout="10.0" (optional) : 若在此設定的時間內,仍無法順利啟動節點,就認定為啟動失敗。預設為 10 秒。通常不需要修改此設定,當修改這個設定以允許較慢的連線,一般就表示 ROS 節點之間的連線有些狀況。

 

 

實例說明

 

下面舉一些例子來做說明。假設有兩台設備,主機名稱與網路 IP 如下:

 

ros-device  192.168.0.19  (遠端主機)

ros-master  192.168.0.20  (本地端主機)

 

從本地端主機執行 roslaunch,在 launch 文件中使用 <machine> 標籤,透過 SSH 連線到遠端主機啟動節點。所以遠端主機上必須先安裝 SSH Server,並且設定好登入的帳號、密碼或憑證。關於 SSH 的安裝與設定,這裡就不多做說明。其餘設定如下:

 

[ 遠端主機設定 ]

 

-- /opt/ros/kinetic/ros-env.sh

#!/usr/bin/env bash

 

source /opt/ros/kinetic/setup.bash

source /home/ros/catkin_ws/devel/setup.bash

 

exec "$@"

 

[ 本地端主機設定 ]

 

-- /etc/hosts

192.168.0.19    ros-device

192.168.0.20    ros-master

 

-- ~/.bashrc

export ROS_HOSTNAME=ros-master

export ROS_MASTER_URI=http://${ROS_HOSTNAME}:11311

export ROSLAUNCH_SSH_UNKNOWN=1

 

在本地端主機的 mypackage 套件裡面的 launch 目錄,新增一個簡單的 launch 文件來做測試。其中使用到的兩個 Python 程式:listener.py  talker.py,取自官網的範例《Writing a Simple Publisher and Subscriber (Python)》。

 

-- machine1.launch

<launch>

  <machine name="mymachine" address="ros-device" env-loader="/opt/ros/kinetic/ros-env.sh" user="ros" />

  <node pkg="mypackage" type="listener.py" name="listener" output="screen" />

  <node pkg="mypackage" type="talker.py" name="talker" machine="mymachine" />

</launch>

 

talker 節點的 <node> 標籤設定 machine 屬性,讓它在遠端主機上運行。至於 listener 節點則是在本地端主機運行。執行 roslaunch mypackage machine1.launch 之後,可以看到下列訊息,顯示已經在遠端主機啟動 talker 節點,並且 listener 節點也接收到 talker 節點發佈的訊息。

 

remote[ros-device-0]: ssh connection created

 

SUMMARY

========

 

PARAMETERS

 * /rosdistro: kinetic

 * /rosversion: 1.12.16

 

MACHINES

 * mymachine

 

NODES

  /

    listener (mypackage/listener.py)

    talker (mypackage/talker.py)

 

ROS_MASTER_URI=http://192.168.0.20:11311

 

process[listener-1]: started with pid [3887]

[ros-device-0]: launching nodes...

[ros-device-0]: ROS_MASTER_URI=http://192.168.0.20:11311

[ros-device-0]: process[talker-1]: started with pid [3921]

[ros-device-0]: ... done launching nodes

[INFO] [1604395509.618868]: /listenerI heard hello world 1604395509.61

[INFO] [1604395509.718797]: /listenerI heard hello world 1604395509.71

[INFO] [1604395509.819721]: /listenerI heard hello world 1604395509.81

[INFO] [1604395509.919073]: /listenerI heard hello world 1604395509.91

[INFO] [1604395510.019122]: /listenerI heard hello world 1604395510.01

[INFO] [1604395510.120283]: /listenerI heard hello world 1604395510.11

 

 

參考資料

 

  • roslaunch: <machine> tag

http://wiki.ros.org/roslaunch/XML/machine

 

  • ROS學習---遠程啓動ROS節點

https://www.twblogs.net/a/5efea6c05352062f754e47b7

 

沒有留言:

張貼留言

和我聯絡

名稱

以電子郵件傳送 *

訊息 *