rosbridge + ssh –R 反向連接阿里雲伺服器實現ros機器人遠程web圖形界面
《ROS by Example(Volume2)》中第13章《利用rosbridge包為機器人構建web圖形界面》,我們希望的使用場景是在機器人運行時(不在人身邊),可以在網路中的另一台設備(手機或PC)上查看顯示機器人相關信息的web圖形界面。
這裡有個問題,所謂的「網路中」指的是機器人與設備必須在同一區域網下(如實驗室wifi),但實際應用中顯然是無法滿足的,如何在互聯網上實現呢? 而且機器人運行的網路環境每次不同,使用動態IP,即IP地址不固定。
原理:利用阿里雲伺服器作為跳板機,先讓小車主機 ssh –R 反向連接阿里雲伺服器,把小車上的 3 個 port(8080,8181,9090)打通到阿里雲上去。(A和B無法相互訪問,但是A能訪問C,B也能訪問C。怎麼通過C讓AB能相互訪問?)
參考教程:
https://yq.aliyun.com/articles/8469- 機器人終端命令:
在 robot 主機上,我們可以用這幾個命令:
ssh -R 47.92.5.66:8080:127.0.0.1:8080 root@47.92.5.66ssh -R 47.92.5.66:9090:127.0.0.1:9090 root@47.92.5.66ssh -R 47.92.5.66:8181:127.0.0.1:8181 root@47.92.5.66
分別反向鏈接雲伺服器,這裡使用的是伺服器公網彈性IP,不會變化。(需要密碼,每打一個命令都需要輸入一次密碼,之後會進入阿里雲伺服器)
做完這些就可以可瀏覽器上打開 47.92.5.66:8181 了。
然而這樣一個一個打命令始終是很麻煩的,所以用 nodejs 寫了一個一站式程序,只
要運行:
node tunnelling.js (在 tunnelling.js 的目錄下),就可以連接了。
tunnelling.js :
//tunnel is a ssh2 clientConnection object var tunnel = require(reverse-tunnel-ssh);host_ip = 47.92.5.66;username = root;password = ××××××××;//改成自己的密碼dstHost = 0.0.0.0; // bind to all IPv4 interfaces web_port = 8181;rosbridge_port = 9090;mjpeg_port = 8080;var conn_web = tunnel({ host: host_ip, username: username, password: password, dstHost: dstHost, dstPort: web_port, //srcHost: 127.0.0.1, // default //srcPort: dstPort // default is the same as dstPort }, function(error, clientConnection) { // });var conn_rosbridge = tunnel({ host: host_ip, username: username, password: password, dstHost: dstHost, dstPort: rosbridge_port, //srcHost: 127.0.0.1, // default //srcPort: dstPort // default is the same as dstPort }, function(error, clientConnection) { // });var conn_mjpeg = tunnel({ host: host_ip, username: username, password: password, dstHost: dstHost, dstPort: mjpeg_port, //srcHost: 127.0.0.1, // default //srcPort: dstPort // default is the same as dstPort }, function(error, clientConnection) { // });conn_web.on(forward-in, function (port) { console.log(Forwarding from + host_ip + : + port);});conn_rosbridge.on(forward-in, function (port) { console.log(Forwarding from + host_ip + : + port);});conn_mjpeg.on(forward-in, function (port) { console.log(Forwarding from + host_ip + : + port);});
- 附加 nodejs 安裝方法:
$ cd /tmp$ wget http://nodejs.org/dist/v8.11.1/node-v8.11.1-linux-x64.tar.gz$ tar xvfz node-v8.11.1-linux-x64.tar.gz$ mkdir -p /usr/local/nodejs$ mv node-v8.11.1-linux-x64/* /usr/local/nodejs在 bashrc 里添加:export PATH=$PATH:/usr/local/nodejs/bin
注意不要使用使用shell中默認apt-get install node- 會使得版本過低。
完成後使用node -v命令來測試(而不是nodejs -v)
- 安裝reverse-tunnel-ssh第三方模塊:
npm i reverse-tunnel-ssh
否則運行tunning.js時會找不到模塊
- 機器人終端安裝使用rosbridge
參考書中P405,但書中有許多錯誤
- Ubuntu 16.04 + Ros Kinetic 安裝rosbridge:( 雙擊tab自動補全,否則就是源里沒有這個包)
$ sudo apt-get update$ sudo apt-get install ros-kinetic-rosbridge-*
- 安裝web_video_server程序包
$ sudo apt-get install ros-kinetic-web-video-server
- 安裝一個簡單的Web伺服器(mini-http)
$ sudo apt-get install mini-httpd
且rbx2代碼包有錯,需要把mini-httpd.sh文件中最後一行的兩個mini-httpd改為mini_httpd
$ sh ./mini-httpd.sh
- 使用步驟:(以網路攝像頭為例,即電腦自帶攝像頭),啟動兩個終端,分別運行:
$ roslaunch rbx2_vision usb_cam.launch$ roslaunch rbx2_gui rosbridge.launch
如果第一條命令出現報錯「sh: 1: v4l2-ctl: not found」則需要安裝v4l2:
$ sudo apt-get install v4l-utils
然後再次運行命令。
瀏覽器中打開 http://localhost:8181/simple_gui.html 效果:- 阿里雲伺服器:
在伺服器上,為了能訪問 port8080等,需要在控制台更改安全組規則,來開啟入埠的訪問許可權
添加安全組規則_安全組_用戶指南_雲伺服器 ECS-阿里雲
在反向 ssh 的時候會遇到的 bug:
How to release ports on the SSH server when a reverse ssh tunnel disconnects abruptly/uncleanly?
when-a-reverse-ssh-tunnel-disconnects-abr
when we are using ssh reverse, any connection broken from local will cause server
listening on certain port forever, so we need to set:
ClientAliveInterval 15
in /etc/ssh/sshd_config
注:對於已經設置好了的伺服器,不需要多設置這些,除非伺服器重啟了等。
- 遠程監控步驟:
$ node tunneling.js $ roslaunch rbx2_vision usb_cam.launch$ roslaunch rbx2_gui rosbridge.launch
瀏覽器中輸入http://47.92.5.66:8282/simple_gui.html
推薦閱讀:
TAG:阿里雲 | 機器人操作平台ROS | SSH |