此 <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
沒有留言:
張貼留言