docker中的ROS容器與ROS主機的連接

docker中的ROS容器與遠端ROS主機的連接

docker是目前一個比較流行的開源的應用容器引擎,ROS(robot operating system)是流行的機器人操作系統。結合二者,在雲機器人研究方面是一種可能性的嘗試方案。

1. 準備

(1)兩臺電腦AB,最好在同一網段;
(2)電腦A-安裝了Docker,並下載了ros鏡像,電腦B下載並安裝了與A中相同distribution的ROS(非鏡像);

2. 配置3個環境

(1)獲取主機A和B的ip地址,我的主機A的ip是 192.168.1.102,主機B的ip是192.168.1.103;

(2)在主機A中運行ros鏡像,得到ros容器(關於容器-container的理解,借用官網的解釋-“A running instance of image“),在容器中運行ifconfig 得到容器在主機A中的相對ip地址,我的是“172.17.0.3 “;
這裏寫圖片描述

f8289b197a45 代表容器ID,其實這個ID  很長,這裏也只是截取了前幾位便於操作

(3)在主機A中的 .bashrc (home目錄下的隱藏文件,crtl+H顯化)文件中添加:

export ROS_HOSTNAME=192.168.1.102
export ROS_MASTER_URI=http://192.168.1.103:11311

其中,11311端口是下面試驗的turtlesim的通訊端口。
(4)在主機B中的 .bashrc 文件中添加:

export ROS_HOSTNAME=192.168.1.103
export ROS_MASTER_URI=http://192.168.1.103:11311

(5)在主機A的ROS容器中(上述查看了ip)添加變量
在目錄/etc/profile中添加環境變量,容器中可提供的編輯器vi, 而vim nano gedit等需要重新在容器中下載。關於vi的用法,主要記住命令模式 (command mode)、插入模式(insert mode)、底行模式(command mode)這三種模式下的操作的不同,搞混了的話,會感覺輸入很奇怪。
在profile的輸入內容爲:

export ROS_HOSTNAME=172.17.0.3
export ROS_MASTER_URI=http://192.168.1.103:11311

保存 退出。
運行命令使其生效:

$ source /etc/profile
$ source /opt/ros/indigo/setup.bash

3. 測試

(1)在主機B(裝有ROS系統)中運行以下命令:
開啓ros服務:

$ roscore

新開一個窗口,運行turtlesim:

$ rosrun turtlesim turtlesim_ndoe

(2)在主機A中測試rostopic, rosnode是否顯示:
分別輸入命令:

$ rostopic list
$ rosnode list

這裏寫圖片描述

能顯示,說明主機A中可以與ROS主機B通訊,接下來測試容器中的連接情況。

(3)在主機A中的docker的ros容器,測試rostopic, rosnode是否顯示:
類似於上述命令
這裏寫圖片描述
可以顯示,說明ROS容器內部可以與遠端的ROS主機通訊。

4. 關於數據傳輸的測試

初步設想:傳輸rosbag數據,在ROS容器裏面通過運行rosrun turtlesim turtle_teleop_key命令,操控鍵盤,能夠控制遠端的ROS系統中的turtlesim的移動。

嘗試1:A主機-》B主機,在主機A中,不考慮容器的話,可以控制遠端ROS主機B中 turtlesim中的小烏龜的移動。

嘗試2:A主機中容器ROS-》A主機,(可以理解A中容器與主機A系統隔離,類似於虛擬機),在A中的容器中運行控制命令,可以控制A中主機的turtlesim的小烏龜的移動。

嘗試3:A主機中的容器ROS-》(A主機)-》B主機
類似上面的控制,希望在A主機中的容器ROS中運行控制命令,控制主機B中運行的turtleism的小烏龜的移動。
在這種情況的時候,雖然在容器ROS中運行rostopic list rosnode list 都能夠捕捉到B主機運行的turtlesim的相關的topic和list,但是無法控制小烏龜的移動。在輸出速度的值的時候也是無反應,

$ rostopic echo /turtle1/cmd_vel

在窗口中的速度並沒有顯示。暫時不知道原因,還在探究中,若有新發現,將會在後續的博客中寫出來。

控制turtlesim中的小烏龜的移動效果應該如下:

這裏寫圖片描述

5. 注意情況

(1)開啓同一個容器的多個窗口:
通常,我們進行命令行操作的時候,要打開多個窗口,對於docker容器的操作也是如此。
開啓docker容器的另外的終端框,有兩種命令:

docker attach <Container's ID>
docker exec -ti <Container's ID> /bin/bash

這裏,適用於我們的操作的是第二種docker exec
對於而者的區別,我google到的解釋,
這裏寫圖片描述

stackoverflow大概總結爲下表。

命令 描述
docker attach 容器ID attaching to the running process
docker exec -ti 容器ID /bin/bash running new things, it would be a shell

前者附在進程上,後者開新的交互shell.

(2)打開新shell後,輸入rostopic, rosnode 報錯 cannot find this command
在容器中,輸入如下命令:

$ source /opt/ros/indigo/setup.bash 

可參考:Let’s install turtlesim packages

(3)遇到 turtlesim這個package沒有找到的問題。
這是因爲,不同的ROS鏡像中自帶的package不一定是完整的,有些只是包含了核心的一些package, 缺少什麼package就安裝什麼就可以了。

$ apt-get install ros-indigo-turtlesim 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章