rosbridge + ssh –R 反向連接阿里雲伺服器實現ros機器人遠程web圖形界面

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?

yq.aliyun.com

  • 機器人終端命令:

在 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

測試:在catkin_ws/src/rbx2_gui/scripts 路徑下運行:(書上的rosrun命令不行,不知原因)

且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

然後再次運行命令。

瀏覽器中打開 localhost:8181/simple_g 效果:

  • 阿里雲伺服器:

在伺服器上,為了能訪問 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

瀏覽器中輸入47.92.5.66:8282/simple_


推薦閱讀:

TAG:阿里雲 | 機器人操作平台ROS | SSH |