Help us understand the problem. What is going on with this article?

ROS複数Docker通信

More than 1 year has passed since last update.

背景

・開発環境/ランタイムのアプリ依存は完全に排除することは非常に困難。
・ROSアプリによっては特定のversionやpackageに依存する。(例えば、melodic依存など)
・docker使えば、上記は排除できるし、アプリ提供者がシステムを気にしなくてもいい。
・開発環境もランタイムもアプリごとに自由だし、界面もdockerでわかりやすい。

ここで試してみること

  1. ROSノードを複数のdockerで起動して通信できることを確認する。
  2. ROS2ノードを複数のdockerで起動して通信できることを確認する。
  3. ROS/ROS2ノードを複数のdockerで起動し、ros1_bridgeを利用してROS/ROS2間で通信できることを確認する。 (*) ROSのrosmasterはhostで動作させることにする。他のROS/ROS2ノードはすべてdockerでの実行。

環境

Host Linux: Ubuntu16.04.5 LTS
Docker: 18.09.0, build 4d60db4
Host Linux ROS version: kinetic

Docker imageの準備

Host LinuxのROS及びdocker自体のインストール設定は省きます。(ググればOK)

docker pull ros:kinetic
docker pull ros:melodic
docker pull osrf/ros2:bouncy-desktop
docker pull osrf/ros2:bouncy-ros1-bridge

docker images
REPOSITORY          TAG                  IMAGE ID            CREATED             SIZE
ros                 melodic              9425ec5f7a7f        3 days ago          1.27GB
osrf/ros2           bouncy-ros1-bridge   495f9879df9e        2 weeks ago         1.2GB
osrf/ros2           bouncy-desktop       3e9aa775362d        2 weeks ago         2.41GB
ros                 kinetic              6f91828bbf93        4 weeks ago         1.19GB

1. ROSノード複数Docker通信

[Overview]
image.png

[Procedure]
1-1. Host Linuxでroscore起動

# docker networkを利用するので以下の設定でroscoreを起動する。
export ROS_MASTER_URI=http://172.17.0.1:11311
export ROS_IP=172.17.0.1
roscore
...

1-2. ros:kinecit dockerでpublisher起動

# docker ros:kinetic start
docker run -it 6f91828bbf93

# net-tools install (IP addressを念の為確認するため)
apt update
apt install net-tools
ifconfig

# ROS IP setting
export ROS_MASTER_URI=http://172.17.0.1:11311
export ROS_IP=172.17.0.2

# topic publish start
rostopic pub -r 10 /chatter std_msgs/String "this is ros:kinetic"

1-3. ros:melodic dockerでsubscliber起動

# docker ros:melodic start
docker run -it 9425ec5f7a7f

# net-tools install (IP addressを念の為確認するため)
apt update
apt install net-tools
ifconfig

# ROS IP setting
export ROS_MASTER_URI=http://172.17.0.1:11311
export ROS_IP=172.17.0.3

# topic publish start
root@c489bf255877:/# rostopic echo /chatter
data: "this is ros:kinetic"

...

(当然ですが、)ROSノード間でPub/Sub通信できていることが確認できました。

2. ROS2ノード複数Docker通信

[Overview]
image.png

2-1. ros2:bouncy-desktop dockerでpublisher起動

# docker ros2:bouncy-desktop start
docker run -it 3e9aa775362d

# topic publish start
ros2 topic pub /chatter std_msgs/String "data: this is ros2:bouncy-desktop"
publisher: beginning loop
publishing #1: std_msgs.msg.String(data='this is ros2:bouncy-desktop')

2-2. ros2:bouncy-desktop dockerでsubscriber起動

# docker ros2:bouncy-desktop start
docker run -it 3e9aa775362d

# topic subscriber start
ros2 topic echo /chatter std_msgs/String
data: this is ros2:bouncy-desktop

ROS2ノードでdocker間通信ができました。

3. ROS/ROS2ノード複数Docker通信

[Overview]
image.png

3-1. Host Linuxでroscore起動

# docker networkを利用するので以下の設定でroscoreを起動する。
export ROS_MASTER_URI=http://172.17.0.1:11311
export ROS_IP=172.17.0.1
roscore
...

3-2. ros:melodic dockerでpublisher起動

# docker ros:melodic start
docker run -it 9425ec5f7a7f

# net-tools install (IP addressを念の為確認するため)
apt update
apt install net-tools
ifconfig

# ROS IP setting
export ROS_MASTER_URI=http://172.17.0.1:11311
export ROS_IP=172.17.0.2

# topic publish start
rostopic pub /chatter std_msgs/String "this is ros:melodic"

3-3. docker ros2:bouncy-ros1-bridge start

# docker ros2:bouncy-ros1-bridge start
docker run -it 495f9879df9e

# net-tools install (IP addressを念の為確認するため)
apt update
apt install net-tools
ifconfig

# ROS IP setting
export ROS_MASTER_URI=http://172.17.0.1:11311
export ROS_IP=172.17.0.5

# ROS/ROS2 bridge start
ros2 run ros1_bridge dynamic_bridge /chatter std_msgs/String
created 1to2 bridge for topic '/chatter' with ROS 1 type 'std_msgs/String' and ROS 2 type 'std_msgs/String'

3-4. ros2:bouncy-desktop dockerでsubscriber起動

# docker ros2:bouncy-desktop start
docker run -it 3e9aa775362d

# topic subscriber start
ros2 topic echo /chatter std_msgs/String
data: this is ros:melodic

ROS bridgeを利用して、docker間でROS/ROS2通信を確認できました。

ということで、dockerを使えばROS分散型開発が簡単にできる。

tomoyafujita
Software Developer for Operation System, Middleware Programming Language: C/C++, Python, Perl, Java CPU Architecture: ARM, SPARC, X86 Language: English, Japanese
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away