はじめに - 経緯あるいは要望
ROS/ROS2に触れたことのない私が、ホスト間かつコンテナ間でROS2ノード同士の通信をする必要にかられて今なお苦しんでいるお話です。
ホスト間かつ Docker コンテナ間で ROS2 ノード同士の通信をするという目標はまだ達成できていません。
タイトルにつられて訪問した方にはタイトル詐欺になっているかもしれません。
各種ホスト・環境の構成や設定は記載するので、単一ホスト・環境に ROS2 をインストールして使いたい方には必要な情報へのポインターになるかもしれません。
あるとき Autoware Open AD Kit を動かしてみようとしました。
手持ちの Windows PC (x86) と M1 Mac (ARM) で。
だってx86ホストとARMホストで通信する図が載ってるじゃないですか。
……ぜんぜん動きません。
もう少し正確に言うと各ホスト上でコンテナは動きますが通信できません。
確かに Minimum requirements は守ってないし。
「このドキュメントは Open AD Kit version 1.0 から持ってきたもので 2.0 用に更新が必要」とか書いてあるし。
それにしても ROS2 でホスト間コンテナ間で通信するってそんなに難しいの?
と思って意地になって、各種ホスト・環境間の ROS2 通信可否を調べました。
最初の目的はコンテナ上の ROS2 ノード同士で通信させることでしたが、
なかなか疎通できないのでホストで直接 ROS2 ノードを動かすケースも調べました。
調べたこと
- Windows (Intel x86 PC), MacBook, Raspberry Pi 4, Raspberry Pi 5 など各種ホストに ROS2 をインストールし、
- ホスト上で直接、または Docker コンテナで ROS2 ノードを動かし、
- 各種ホスト・環境間での通信可否を調べました。
まだ試してないこと
- クラウド上のホスト(AWS EC2 と Transit Gateway でホスト間通信できたという情報は同僚から聞いています)
- 他のバージョンでの動作確認
- 家庭内LAN・ルーター以外のネットワークでの動作確認
Autoware Open AD Kit
Autoware Open AD Kit は自動運転を開発するためのオープンソースソフトウェアです。
シミュレーションが動くデモを手持ちのPCで動かしたかったのですが、動かないのを調査していたら ROS のホスト間コンテナ間通信の沼で迷っていました。
ROS/ROS2
ROS はロボットアプリケーション開発するためのオープンソースソフトウェアです。
コンテナで ROS を動かしている人は世の中にたくさんいますし、複数ホスト間で通信させている人もいるようです。
複数ホスト(非コンテナ)間通信であれば私も再現できています。
ですが、複数ホストのコンテナ間で通信させるのでこんなにハマるとは予想していませんでした。
(動くパターンもあるという情報は聞いていますが私はまだ再現していません)
ROS/ROS2 と Ubuntu の対応バージョンの組み合わせは決まっています。
ROS2 の使用バージョンが決まっているなら Ubuntu のバージョンを合わせる必要があり、 Ubuntu の使用バージョンが決まっているなら ROS2 のバージョンを合わせる必要があります。
ROS2 バージョン | Ubuntu 対応バージョン |
---|---|
ROS2 Jazzy LTS | Ubuntu 24.04 LTS (Noble Numbat) |
ROS2 Iron | Ubuntu 22.04 LTS (Jammy Jellyfish) |
ROS2 Humble LTS | Ubuntu 22.04 LTS (Jammy Jellyfish) |
ROS2 Galactic (EOL) | Ubuntu 20.04 LTS (Focal Fossa) |
ROS2 Foxy LTS (EOL) | Ubuntu 20.04 LTS (Focal Fossa) |
バージョンの組み合わせをまとめているサイトもありますが、
最新状況は公式サイトを見るのが良いでしょう。
例えば現時点で最新LTSバージョンの ROS2 Jazzy Jalisco のドキュメントには以下のように書かれています。
見逃しがちですが、この画面の左下に他のバージョンへのリンクがあります。
他のバージョンの対応を見るときはここからたどると良いでしょう。
余談ですが、いま私が「ROS Mac install」でググると ROS2 Crystal のドキュメントが最上位に出てきます。
ROS2 Crystal は EOL (End Of Life) となっており、対応 Ubuntu バージョンは 16.04 または 18.04 となっています。
古すぎて辛いですね。
私はこれで Google 検索を無条件に信頼する無邪気な純真さを失いました。
ROS 公式サイトが SEO に手が回ってないのだろうと察しますが。
ROS2 Crystal, Dashing, Eloquent, Foxy は macOS へのソースとバイナリの両方のインストールドキュメントがありますが、Galactic, Humble, Iron, Jazzy では macOS へソースからのインストールしかドキュメントがありません。
Mac へのバイナリインストールのサポートは止められたようです。
ホスト間通信を妨げる落とし穴たち
ufw, ファイアウォール
sudo ufw allow 11311
としてポートを許可する設定は ROS1 向けのものです。
ROS1 はマスターノードがポート 11311 で待ち構えていてその他のノードはマスターノードにつなげることで通信できました。
ROS2 ではマスターノードは不要となり IGMP で他ホストのノードを自動的に探します。
IGMP は L3 のプロトコルなのでポート番号では制御できません。
結論: ufw は無効化 (sudo ufw disable
) しました。
NOTE: 私はまだ試していませんが、ufw で IGMP を許可する方法はありそうです。
Docker Desktop
Docker Desktop の host ネットワークは L4 で動くので、TCP や UDP より下のプロトコルである IGMP はサポートされません。
Docker Desktop ではなく、Docker Community Edition を使いましょう。
各環境の構成と設定
Mac, Docker Desktop, XQuartz で Open AD Kit を動かす
構成 | 備考 |
---|---|
MacBook Pro | M1 Max チップ, 64GB メモリ |
macOS Sonoma 14.6.1 | |
Docker Desktop 4.32.0 | Docker Engine v27.0.3 |
XQuartz 2.8.5 | |
Autoware Open AD Kit |
ces-demo ブランチ, containers と visualizer イメージ |
$ git clone https://github.com/autowarefoundation/open_ad_kit.git
$ cd open_ad_kit/docker/autoware-openadk/
$ ./run-containers.sh
#### simulator と planning-control が動きます。
$ cd open_ad_kit/docker/autoware-openadk/
$ ./run-visualizer.sh
#### Docker Desktop のエミュレーション機能で x86_64 イメージが動きますが、
#### Mac に X Server を入れていないので異常終了します。
WARNING: The requested image's platform (linux/amd64) does not match the detected host platform (linux/arm64/v8) and no specific platform was requested
qt.qpa.xcb: could not connect to display
qt.qpa.plugin: Could not load the Qt platform plugin "xcb" in "" even though it was found.
This application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this problem.
Available platform plugins are: eglfs, linuxfb, minimal, minimalegl, offscreen, vnc, xcb.
/autoware/scenario-sim/rviz/launch_rviz.sh: line 3: 65 Aborted rviz2 -d /autoware/scenario-sim/rviz/scenario_simulator_v2.rviz
Mac 用の X Server として XQuartz 2.8.5 をダウンロード、インストールします。
XQuartz > 設定 > セキュリティ のタブで、接続を認証 と ネットワーク・クライアントからの接続を許可 の両方にチェックをつけて、XQuartz を再起動します。
$ xhost + 192.168.xx.xx
#### Mac ホストの IP アドレスから XQuartz への接続を許可します。
$ ./run-visualizer.sh
#### RViz のウィンドウは見えないのですが、何かが動いています。
Mac, Lima
構成 | 備考 |
---|---|
MacBook Pro | M1 Max チップ, 64GB メモリ |
macOS Sonoma 14.6.1 | |
Lima 0.22.0 | |
XQuartz 2.8.5 | |
Autoware Open AD Kit |
ces-demo ブランチ, containers と visualizer イメージ |
Mac で Docker Desktop ではなく Lima を使ってコンテナを起動します。
ROS2 が動いてデスクトップ接続もできるコンテナイメージを使わせていただきます。
$ brew install lima
$ limactl --version
limactl version 0.22.0
$ curl -O https://raw.githubusercontent.com/lima-vm/lima/master/examples/docker.yaml
$ limactl start docker.yaml
$ limactl list
$ ln -nfs ~/.lima/docker/sock/docker.sock ~/.docker/run/docker.sock
$ docker version
$ docker run --net=host --security-opt seccomp=unconfined --shm-size=512m tiryoh/ros2-desktop-vnc:humble
$ docker exec -it ros2-desktop-vnc bash
# sudo su - ubuntu
$ ros2 run demo_nodes_cpp talker --ros-args --remap __node:=lima_talker
$ ros2 run demo_nodes_cpp listener --ros-args --remap __node:=lima_listener
コンテナ内で送信したメッセージをコンテナ内で受信することができます。
$ conda activate ros_env
$ ros2 run demo_nodes_cpp listener --ros-args --remap __node:=mac_listener
$ ros2 run demo_nodes_cpp talker --ros-args --remap __node:=mac_talker
コンテナ内で送信したメッセージをMacホストで受信できません。
Macホストで送信したメッセージをコンテナ内で受信することもできません。
ネットワークの設定がまずいのでしょうか。
こちらを試してみます。
$ limactl list
NAME STATUS SSH CPUS MEMORY DISK
docker Running 127.0.0.1:60467 4 4GiB 100GiB
$ limactl stop docker
$ limactl delete docker
$ diff -u docker.yaml
# This template requires Lima v0.8.0 or later
+vmType: "vz"
+networks:
+- vzNAT: true
images:
$ limactl start docker.yaml
$ docker run --net=host --security-opt seccomp=unconfined --shm-size=512m tiryoh/ros2-desktop-vnc:humble
これで試してもやはりホストとコンテナの間では通信できませんでした。
Mac ホストで ROS2 Humble を動かす
構成 | 備考 |
---|---|
MacBook Pro | M1 Max チップ, 64GB メモリ |
macOS Sonoma 14.6.1 | |
XQuartz 2.8.5 | |
ROS2 Humble |
Mac ホスト環境を汚すのは避けたかったのですが、Docker でホスト間の疎通確認ができないので仕方ありません。
Mac に直接 ROS2 をインストールして疎通してみます。
ROS 公式サイトにソースからのビルド・インストール方法は載っていますが、Qiita の記事で一つ前の LTS バージョンである ROS2 Humble をバイナリインストールする方法が解説されているのでそちらを使います。
$ mkdir -p ~/miniconda3
$ curl https://repo.anaconda.com/miniconda/Miniconda3-latest-MacOSX-arm64.sh -o ~/miniconda3/miniconda.sh
$ bash ~/miniconda3/miniconda.sh -b -u -p ~/miniconda3
$ rm -rf ~/miniconda3/miniconda.sh
$ ~/miniconda3/bin/conda init bash
$ ~/miniconda3/bin/conda init zsh
$ conda install mamba -c conda-forge
$ mamba init zsh
$ conda create -n ros_env
$ conda activate ros_env
$ conda config --env --add channels conda-forge
$ conda config --env --add channels robostack-staging
$ conda config --env --remove channels defaults
$ conda install ros-humble-desktop
$ conda deactivate
$ conda activate ros_env
$ conda install compilers cmake pkg-config make ninja colcon-common-extensions catkin_tools
$ rviz2
macOS で RViz2 が動きました。
$ conda activate ros_env
$ rqt_graph
macOS で rqt_graph が動きました。
$ conda activate ros_env
$ git clone https://github.com/autowarefoundation/open_ad_kit.git
$ rviz2 -d open_ad_kit/docker/autoware-openadk/etc/simulation/rviz/scenario_simulator_v2.rviz
[INFO] [1721888082.392052032] [rviz2]: Stereo is NOT SUPPORTED
[INFO] [1721888082.392117990] [rviz2]: OpenGl version: 2.1 (GLSL 1.2)
[INFO] [1721888082.447662237] [rviz2]: Stereo is NOT SUPPORTED
[ERROR] [1721888082.588325781] [rviz2]: PluginlibFactory: The plugin for class 'rviz_plugins/SteeringAngle' failed to load. Error: According to the loaded plugin descriptions the class rviz_plugins/SteeringAngle with base class type rviz_common::Display does not exist. Declared types are rviz_default_plugins/AccelStamped rviz_default_plugins/Axes rviz_default_plugins/Camera rviz_default_plugins/DepthCloud rviz_default_plugins/Effort rviz_default_plugins/FluidPressure rviz_default_plugins/Grid rviz_default_plugins/GridCells rviz_default_plugins/Illuminance rviz_default_plugins/Image rviz_default_plugins/InteractiveMarkers rviz_default_plugins/LaserScan rviz_default_plugins/Map rviz_default_plugins/Marker rviz_default_plugins/MarkerArray rviz_default_plugins/Odometry rviz_default_plugins/Path rviz_default_plugins/PointCloud rviz_default_plugins/PointCloud2 rviz_default_plugins/PointStamped rviz_default_plugins/Polygon rviz_default_plugins/Pose rviz_default_plugins/PoseArray rviz_default_plugins/PoseWithCovariance rviz_default_plugins/Range rviz_default_plugins/RelativeHumidity rviz_default_plugins/RobotModel rviz_default_plugins/TF rviz_default_plugins/Temperature rviz_default_plugins/TwistStamped rviz_default_plugins/Wrench
Open AD Kit visualizer 相当のコマンドを実行してみると RViz2 が起動しましたが、
真っ黒な画面で何が動いているのか分かりません。
$ conda activate ros_env
$ ros2 run demo_nodes_cpp talker
[INFO] [1722581932.923304764] [talker]: Publishing: 'Hello World: 1'
...
Macホストで talker が動きました。
$ conda activate ros_env
$ ros2 run demo_nodes_cpp listener
[INFO] [1722581962.922649664] [listener]: I heard: [Hello World: 31]
...
Macホスト内で talker のメッセージを listener が受信できました。
$ conda activate ros_env
$ ros2 node list
/listener
/talker
$ rqt_graph
listener, talker の2ノードと chatter 1トピックの接続グラフが表示されます。
Windows, Docker Desktop で Open AD Kit を動かす
構成 | 備考 |
---|---|
DELL Latitude 5530 | Intel i7-1265 CPU, 16GB RAM |
Windows 10 Enterprise | |
Docker Desktop 4.33.0 | Docker Engine v27.1.1 |
Autoware Open AD Kit |
ces-demo ブランチ, containers と visualizer イメージ |
> git clone https://github.com/autowarefoundation/open_ad_kit.git
> cd open_ad_kit\docker\autoware-openadk
> bash run-containers.sh
#### Docker Desktop のエミュレーション機能で aarch64 イメージの simulator と planning-control が動きます。
> cd open_ad_kit\docker\autoware-openadk
> bash run-visualizer.sh
#### 一瞬 RViz のウィンドウが表示された直後にエラーで消えます。
MESA: error: ZINK: failed to choose pdev
glx: failed to create drisw screen
failed to load driver: zink
The X11 connection broke: I/O error (code 1)
XIO: fatal IO error 2 (No such file or directory) on X server ":0"
after 19 requests (19 known processed) with 0 events remaining.
> docker run -it --net=host -v /dev/shm:/dev/shm -e ROS_DOMAIN_ID=88 -e DISPLAY=192.168.xx.xx:0.0 -v /tmp/.X11-unix/:/tmp/.X11-unix -e XDG_RUNTIME_DIR=/tmp/runtime-root ghcr.io/oguzkaganozt/autoware-openadk:ces-visualizer-x86_64 /autoware/scenario-sim/rviz/launch_rviz.sh
#### run-visualizer.sh の中のコマンドを書き換えて Windows ホストの IP アドレス (192.168.xx.xx) を指定すると、先ほどとは異なるエラー (Mac で X Server なしのときと同じエラー) に変わりました。
qt.qpa.xcb: could not connect to display 192.168.xx.xx:0.0
qt.qpa.plugin: Could not load the Qt platform plugin "xcb" in "" even though it was found.
This application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this problem.
Available platform plugins are: eglfs, linuxfb, minimal, minimalegl, offscreen, vnc, xcb.
/autoware/scenario-sim/rviz/launch_rviz.sh: line 3: 65 Aborted rviz2 -d /autoware/scenario-sim/rviz/scenario_simulator_v2.rviz
Windows, WSL, Docker CE で Open AD Kit を動かす
構成 | 備考 |
---|---|
DELL Latitude 5530 | Intel i7-1265 CPU, 16GB RAM |
Windows 10 Enterprise | |
WSL 2.1.5.0 | |
Ubuntu 20.04 | |
Docker CE | |
VcXsrv 64.1.20.14.0 | |
Autoware Open AD Kit |
ces-demo ブランチ, containers と visualizer イメージ |
> wsl --install -d Ubuntu-20.04
WSLのインストール後、Windowsを再起動します。
Docker をインストールします。
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
$ echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
$ sudo apt update
$ sudo apt install docker-ce docker-ce-cli containerd.io docker-compose-plugin
$ docker --version
Docker version 27.1.1, build 6312585
$ docker run hello-world
#### サンプルコンテナが動きます。
$ cd open_ad_kit/docker/autoware-openadk
$ ./run-containers.sh
#### x86 ホストで ARM64 イメージの simulator と planning-control は動きません。
$ git clone https://github.com/autowarefoundation/open_ad_kit.git
$ cd open_ad_kit/docker/autoware-openadk
$ ./run-visualizer.sh
MESA: error: ZINK: failed to choose pdev
glx: failed to create drisw screen
failed to load driver: zink
The X11 connection broke: I/O error (code 1)
XIO: fatal IO error 2 (No such file or directory) on X server ":0"
after 19 requests (19 known processed) with 0 events remaining.
#### RViz のウィンドウが一瞬表示された直後にエラーで消えます。
Windows 用の X Server として VcXsrv 64.1.20.14.0 をダウンロード、インストールします。
C:\Program Files\VcXsrv\X0.hosts
に Windows ホストの IP アドレス 192.168.xx.xx を追記します。
もしくは、VcXsrv 起動時のオプション Disable access control にチェックを付けます。
$ cd open_ad_kit/docker/autoware-openadk
$ ./run-visualizer.sh
#### RViz のウィンドウは見えないのですが、何かが動いています。
Windows ホストで ROS2 Jazzy を動かす
構成 | 備考 |
---|---|
DELL Latitude 5530 | Intel i7-1265 CPU, 16GB RAM |
Windows 10 Enterprise | |
ROS2 Jazzy |
> Set-ExecutionPolicy Bypass -Scope Process -Force; iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))
> choco install -y python --version 3.8.3
> choco install -y vcredist2013 vcredist140
> choco install -y openssl --version 1.1.1.2100
> setx -m OPENSSL_CONF "C:\Program Files\OpenSSL-Win64\bin\openssl.cfg"
#### 設定 > 環境変数 > Path > C:\Program Files\OpenSSL-Win64\bin を追加しなくても追加されていました。
ROS公式サイトには Visual Studio Community 2019 をインストールするとありますが、もう利用できません。
現在だと Visual Studio Community 2022 しかダウンロードできないですね。
ROS2 の動作確認をするのが目的で、ビルドをする予定がないので私はインストールしませんでした。
から opencv-3.4.6-vc16.VS2019.zip をダウンロード、すべて展開し、内容を C:\opencvへ移動
> setx /m OpenCV_DIR C:\opencv
> choco install -y cmake
設定 > 環境変数 > Path > C:\opencv\x64\vc16\bin を追加
設定 > 環境変数 > Path > C:\Program Files\CMake\bin を追加
から以下のファイルをダウンロード
asio.1.12.1.nupkg, bullet.3.17.nupkg, cunit.2.1.3.nupkg, eigen.3.3.4.nupkg, log4cxx.0.10.0-2.nupkg, log4cxx.0.10.0.nupkg, tinyxml-usestl.2.6.2.nupkg, tinyxml2.6.0.0.nupkg
> choco install -y -s C:\Users\MY_USER_NAME\Downloads asio bullet cunit eigen log4cxx tinyxml-usestl tinyxml2
PATH反映のためPowerShellを管理者で再起動
> python -m pip install -U pip setuptools==59.6.0
> python -m pip install -U catkin_pkg cryptography empy importlib-metadata jsonschema lark==1.1.1 lxml matplotlib netifaces numpy opencv-python PyQt5 pillow psutil pycairo pydot pyparsing==2.4.7 pytest pyyaml rosdistro
> choco install -y 7zip
から libxml2-2.9.3-win32-x86_64.7z, iconv-1.14-win32-x86_64.7z, zlib-1.2.8-win32-x86_64.7z をダウンロード、C:\xmllintに解凍
設定 > 環境変数 > Path > C:\xmllint\bin を追加
ROS公式サイトには Qt5 をインストールするとありますが、Qt アプリの開発をするつもりがなく ROS デモの疎通確認をするには必要ないので、私はインストールしませんでした。
> choco install -y graphviz
設定 > 環境変数 > Path > C:\Program Files\Graphviz\bin を追加
から ros2-jazzy-20240705-windows-release-amd64.zip をダウンロード、すべて展開し、展開された内容を C:\dev\ros2へ移動
設定 > 環境変数 > Path > C:\dev\ros2\Scripts を追加
> call C:\dev\ros2\local_setup.bat
> ros2 run demo_nodes_cpp talker --ros-args --remap __node:=win_talker
...
Windows ホストで talker が動きました。
> call C:\dev\ros2\local_setup.bat
> ros2 run demo_nodes_py listener --ros-args --remap __node:=win_listener
Windows ホスト内で talker のメッセージを listener が受信できました。
> call C:\dev\ros2\local_setup.bat
> ros2 node list
> rqt_graph
> rviz2
Windows ホスト内でノードリストを見ることができ、接続グラフが表示され、RVizが起動しました。
> Unblock-File C:\dev\ros2\*.ps1
> C:\dev\ros2\local_setup.ps1
> ros2 run demo_nodes_cpp talker --ros-args --remap __node:=win_talker
> ros2 run demo_nodes_py listener --ros-args --remap __node:=win_listener
> ros2 node list
> rqt_graph
> rviz2
Windows ホストと WSL Docker コンテナで通信する
ホスト | コンテナ |
---|---|
Windows | Windows, WSL, Ubuntu, Docker CE |
ROS/ROS2 が動いてデスクトップ接続もできるコンテナイメージが公開されているのでありがたく使わせていただきます。
$ docker run -p 6080:80 --security-opt seccomp=unconfined --shm-size=512m tiryoh/ros2-desktop-vnc:humble
ブラウザで http://127.0.0.1:6080/ を開く > noVNC > 接続 > Terminator
$ ros2 run demo_nodes_cpp talker --ros-args --remap __node:=docker_talker
...
> c:\dev\ros2\local_setup.ps1
> ros2 run demo_nodes_cpp listener --ros-args --remap __node:=win_listener
この状態ではコンテナ内のメッセージを受信できません。
次に --net=host
オプションを付けて実行します。
$ docker run --net=host --security-opt seccomp=unconfined --shm-size=512m tiryoh/ros2-desktop-vnc:humble
--net=host
を付けると -p 6080:80
が無効になり VNC 接続はできなくなります。
$ docker exec -it ros2-desktop-vnc bash
# sudo su - ubuntu
$ ros2 run demo_nodes_cpp talker --ros-args --remap __node:=docker_talker
...
> c:\dev\ros2\local_setup.ps1
> ros2 run demo_nodes_cpp listener --ros-args --remap __node:=win_listener
コンテナ内のメッセージをホストで受信できました。
逆にホストからのメッセージをコンテナ内で受信することもできました。
Raspberry Pi 5, Ubuntu 24.04, Docker CE で Open AD Kit を動かす
構成 | 備考 |
---|---|
Raspberry Pi 5 | |
Ubuntu 24.04 Server | |
Docker CE | |
Autoware Open AD Kit |
ces-demo ブランチ, containers と visualizer イメージ |
$ curl -fsSL https://get.docker.com -o get-docker.sh
$ sudo sh get-docker.sh
$ sudo apt install -y uidmap
$ dockerd-rootless-setuptool.sh install
$ git clone https://github.com/autowarefoundation/open_ad_kit.git
$ cd open_ad_kit/docker/autoware-openadk
$ ./run-containers.sh
$ cd open_ad_kit/docker/autoware-openadk
$ ./run-visualizer.sh
#### ARM プロセッサで x86 バイナリが動きません。
WARNING: The requested image's platform (linux/amd64) does not match the detected host platform (linux/arm64/v8) and no specific platform was requested
exec /ros_entrypoint.sh: exec format error
ROS2 が動いてデスクトップ接続もできるコンテナイメージを使って疎通確認します。
$ docker run --net=host --security-opt seccomp=unconfined --shm-size=512m tiryoh/ros2-desktop-vnc:humble
humble を jazzy に変えても挙動は変わりません。
$ docker exec -it $(docker ps -q) bash
# sudo su - ubuntu
$ ros2 run demo_nodes_cpp talker --ros-args --remap __node:=pi5docker_talker
$ docker exec -it $(docker ps -q) bash
# sudo su - ubuntu
$ ros2 run demo_nodes_cpp listener --ros-args --remap __node:=pi5docker_listener
同じコンテナ内の talker と listener で通信できます。
ラズパイ5ホストとコンテナでは通信できません。
ラズパイ5コンテナと Windows ホストでも通信できません。
Raspberry Pi 5, Ubuntu 24.04, ROS2 Jazzy
構成 | 備考 |
---|---|
Raspberry Pi 5 | |
Ubuntu 24.04 Server | |
ROS2 Jazzy |
$ cat /etc/os-release
PRETTY_NAME="Ubuntu 24.04 LTS"
VERSION="24.04 LTS (Noble Numbat)"
Ubuntu 24.04 (Noble Numbat) に適合する ROS2 Jazzy LTS をインストールする。
ラズパイであっても Ubuntu であれば Ubuntu のインストール方法で良いとある。
$ locale
LANG=C.UTF-8
UTF-8なのでそのままでOK。
$ sudo apt install software-properties-common
$ sudo add-apt-repository universe
$ sudo apt update && sudo apt install curl -y
$ sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg
$ echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu $(. /etc/os-release && echo $UBUNTU_CODENAME) main" | sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null
$ cat /etc/apt/sources.list.d/ros2.list
deb [arch=arm64 signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu noble main
ROSパッケージのビルドや開発はとりあえずしないので ros-dev-tools のインストールはスキップする。
$ sudo apt update
$ sudo apt upgrade
$ sudo apt install ros-jazzy-ros-base
Pending kernel upgrade!
Running kernel version:
6.8.0-1004-raspi
Diagnostics:
The currently running kernel version is not the expected kernel version 6.8.0-1010-raspi.
Restarting the system to load the new kernel will not be handled automatically, so you should consider rebooting.
$ sudo reboot
カーネルバージョンアップが保留されてるのでラズパイ5を再起動
$ sudo apt install ros-jazzy-desktop
$ source /opt/ros/jazzy/setup.bash
$ ros2 run demo_nodes_cpp talker --ros-args --remap __node:=pi5talker
$ source /opt/ros/jazzy/setup.bash
$ ros2 run demo_nodes_py listener --ros-args --remap __node:=pi5listener
ラズパイ5ホスト内で talker と listener が通信できました。
ラズパイ4、ラズパイ5、Windows ホストからのメッセージもそれぞれのホストで受信できました。
Raspberry Pi 4, Ubuntu 20.04, Docker CE
構成 | 備考 |
---|---|
Raspberry Pi 4 Model B | |
Ubuntu 20.04.4 Server | |
Docker CE | |
ROS2 Foxy |
$ curl -fsSL https://get.docker.com -o get-docker.sh
$ sudo sh get-docker.sh
$ sudo apt install -y uidmap
$ dockerd-rootless-setuptool.sh install
ROS2 が動いてデスクトップ接続もできるコンテナイメージを使って疎通確認します。
$ docker run --net=host --security-opt seccomp=unconfined --shm-size=512m tiryoh/ros2-desktop-vnc:humble
$ docker exec -it $(docker ps -q) bash
# sudo su - ubuntu
$ ros2 run demo_nodes_cpp talker --ros-args --remap __node:=pi4docker_talker
$ docker exec -it $(docker ps -q) bash
# sudo su - ubuntu
$ ros2 run demo_nodes_cpp listener --ros-args --remap __node:=pi4docker_listener
同じコンテナ内の talker と listener で通信できます。
ラズパイ5ホストや Windows ホストからのメッセージをラズパイ4コンテナでは受信できました。
ラズパイ4ホストや WSL コンテナからのメッセージをラズパイ4コンテナで受信できません。
Raspberry Pi 4, Ubuntu 20.04, ROS2 Foxy
構成 | 備考 |
---|---|
Raspberry Pi 4 Model B | |
Ubuntu 20.04.4 Server | |
ROS2 Foxy |
$ cat /etc/os-release
NAME="Ubuntu"
VERSION="20.04.4 LTS (Focal Fossa)"
Ubuntu 20.04 に適合する ROS2 LTS は Foxy なので Foxy のインストール方法を見る。
ラズパイであっても Ubuntu であれば Ubuntu のインストール方法で良いとある。
$ locale
LANG=C.UTF-8
UTF-8なのでそのままでOK。
$ sudo apt install software-properties-common
$ sudo apt add-apt-repository universe
'universe' distribution component is already enabled for all sources.
$ sudo apt update && sudo apt install curl -y
$ sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg
$ echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu $(. /etc/os-release && echo $UBUNTU_CODENAME) main" | sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null
$ cat /etc/apt/sources.list.d/ros2.list
deb [arch=arm64 signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu focal main
$ sudo apt update
$ sudo apt upgrade
$ sudo apt install python3-argcomplete
$ sudo apt install ros-foxy-ros-base
$ sudo apt install ros-foxy-desktop
Errors were encountered while processing:
/var/cache/apt/archives/libgl-dev_1.3.2-1~ubuntu0.20.04.2_arm64.deb
/var/cache/apt/archives/libegl-dev_1.3.2-1~ubuntu0.20.04.2_arm64.deb
/var/cache/apt/archives/libgles-dev_1.3.2-1~ubuntu0.20.04.2_arm64.deb
E: Sub-process /usr/bin/dpkg returned an error code (1)
ros-foxy-ros-base はエラーなくインストールできたが、ros-foxy-desktop はエラー。
Ubuntu 20.04.4 Server だからデスクトップ周りのライブラリがないのか。
$ source /opt/ros/foxy/setup.bash
$ ros2 run demo_nodes_cpp talker --ros-args --remap __node:=pi4talker
$ source /opt/ros/foxy/setup.bash
$ ros2 run demo_nodes_cpp listener --ros-args --remap __node:=pi4listener
ラズパイ4からのメッセージがラズパイ4で受信できる。
ラズパイ4からのメッセージが Windows で受信できないし、Windows からのメッセージがラズパイ4で受信できない。
ファイアウォールのせいか。
$ sudo ufw disable
Firewall stopped and disabled on system startup
ファイアウォールを無効にしたら、ラズパイ4、ラズパイ5、Windows ホスト間でそれぞれのメッセージをそれぞれが受信できるようになりました。
各環境の疎通確認の状況
ROS2 公式のデモ talker/listener を異なるホスト・環境で動かして通信できたかどうかを以下の表にまとめます。
同じホストかつ同じ環境の talker/listener は普通に通信できるので省略します。
また、左右を入れ替えた逆方向の通信も普通にできるので省略します。
talker | listener | 通信 |
---|---|---|
Mac, ROS2 Humble | Windows, ROS2 Jazzy | ok |
Mac, ROS2 Humble | Windows, WSL, Docker CE, ROS2 Humble | NG |
Windows, ROS2 Jazzy | Windows, WSL, Docker CE, ROS2 Humble | ok |
Windows, ROS2 Jazzy | RPi4, Ubuntu 20.04, ROS2 Foxy | ok |
Windows, ROS2 Jazzy | RPi4, Ubuntu 20.04, Docker CE, ROS2 Humble | ok |
Windows, ROS2 Jazzy | RPi5, Ubuntu 24.04, ROS2 Jazzy | ok |
Windows, ROS2 Jazzy | RPi5, Ubuntu 24.04, Docker CE, ROS2 Jazzy | NG |
Windows, WSL, Docker CE, ROS2 Humble | RPi4, Ubuntu 20.04, Docker CE, ROS2 Humble | NG |
RPi4, Ubuntu 20.04, ROS2 Foxy | RPi4, Ubuntu 20.04, Docker CE, ROS2 Humble | NG |
RPi4, Ubuntu 20.04, ROS2 Foxy | RPi5, Ubuntu 24.04, ROS2 Jazzy | ok |
RPi4, Ubuntu 20.04, Docker CE, ROS2 Humble | RPi5, Ubuntu 24.04, ROS2 Jazzy | ok |
RPi5, Ubuntu 24.04, ROS2 Jazzy | RPi5, Ubuntu 24.04, Docker CE, ROS2 Jazzy | NG |
次の表は Open AD Kit の containers/visualizer を異なるホスト・環境で動かして通信できたかどうかの結果です。
containers | visualizer | 通信 |
---|---|---|
Windows, Docker Desktop | Windows, Docker Desktop, VcXsrv | NG |
Mac, Docker Desktop | Mac, Docker Desktop, XQuartz | NG |
RPi4, Ubuntu 20.04, Docker CE | Windows, WSL, Ubuntu 20.04, Docker CE | NG |
RPi4, Ubuntu 20.04, Docker CE | Windows, WSL, Ubuntu 24.04, Docker CE | NG |