ROS/ROS 2のGUIをWebブラウザ経由でお手軽に試せるDockerfileとDockerイメージを公開しています。その特徴と使用方法を紹介します。
今回紹介するのは
- Ubuntu Desktop(LXDE)
- VNCサーバ
- Webブラウザから使用するVNCクライアント+WEBサーバ
- ROS/ROS 2
がインストールされたDockerイメージです。
特徴
Webブラウザから操作するVNCクライアント経由でUbuntu Desktopにアクセスし、ROS/ROS2のGUIを操作できます。dorowu/ubuntu-desktop-lxde-vnc(Docker Hub, GitHub)をベースにROSの環境をセットアップしています。
これと言って特殊な要素があるわけではなく、ネット上を探すと似たようなDockerイメージは公開されています。しかし、Dockerコンテナにログイン後、手動でapt install
などの操作をしたあとdocker commit
してイメージを固定している例が多く、最新版を入手できるようにはなっていないのがちょっとだけ不便でした。
そこでDockerfileを使ってDockerイメージを簡単に作成できるようにし、GitHub Actionsを使って自動更新するようにしたので、紹介します。動作環境やより便利に使う方法についてもあとから紹介します。
なお、このDockerfileで作成するDockerイメージはセキュリティに対する配慮はありません。「お気軽に試す」以外の用途(公開サーバに放置、実環境への投入など)は避けた方がよいと思います。
n番煎じだけどVNCサーバとVNCクライアントがセットになったROSインストール済みUbuntuのDockerファイルを公開しました – Tiryoh/docker_ros-desktop-vnc: A Doc… : https://t.co/buVzEHoSkD #miteru
— たいりょーくん (@Tiryoh) February 12, 2020
公開しているもの
DockerfileとGitHub Actionsの設定を以下のページで公開しています。
ROS
ビルドログ: https://github.com/Tiryoh/docker-ros-desktop-vnc/wiki
ROS 2
ビルドログ: https://github.com/Tiryoh/docker-ros2-desktop-vnc/wiki
使い方の紹介
ROS Melodic
Dockerがインストールされている環境で以下のコマンドを実行するとROS Melodicがインストールされた環境を起動できます。
docker run -p 6080:80 --shm-size=512m tiryoh/ros-desktop-vnc:melodic
Webブラウザでhttp://127.0.0.1:6080にアクセスすると、Dockerコンテナ内にアクセスできるVNCクライアントが立ち上がります。
VNCクライアントを経由して、この画像のようにWebブラウザからUbuntuのデスクトップ環境にアクセスして端末を開いたり、Gazeboを起動したり、やろうと思えばWebブラウザを開いたりできます。
ROS 2 Humble
同様に以下のコマンドを実行するとROS 2 Humbleがインストールされた環境を起動できます。
docker run -p 6080:80 --shm-size=512m tiryoh/ros2-desktop-vnc:humble
※スクリーンレコードはROS 2 Dashingのものです
そのほか
2020年5月1日現在、ROSは
ROS 2は
のDockerfileを公開しています。
2022年7月30日現在、下記対応のDockerfileも追加しています。
- Ubuntu 20.04 + ROS Noetic (Dockerfile)
- Ubuntu 20.04 + ROS 2 Foxy (Dockerfile)
- Ubuntu 20.04 + ROS 2 Galactic (Dockerfile)
- Ubuntu 22.04 + ROS 2 Humble (Dockerfile)
2022年7月30日現在、下記のROS distroはEOLになったため動作確認を停止しています。
- Kinetic
- Dashing
- Eloquent
最新情報についてはGitHubのREADMEの#docker-tagsを参照してください。
動作環境
Windows 10でもmacOSでもUbuntuでもDockerが動く環境であれば使用できることを確認しています。
より便利に使うために
より便利に使うために便利な方法をいくつか紹介します。
クリップボードの共有
クリップボードは自動では共有されません。左側のメニューからClipboardを利用できます。
ホストPC -> Dokcerコンテナにクリップボードを共有する際は次のアニメーションのようにクリップボードのウィンドウに文字列を貼り付けます。
Dockerコンテナ内でコピーしたクリップボードの内容も参照できます。
デスクトップのサイズ変更
デスクトップのサイズ(解像度)は最初にブラウザからアクセスしたときのブラウザのウィンドウサイズに固定されます。
これはブラウザを開き直しても変わりません。
http://127.0.0.1:6080/resize にアクセスすることでDockerコンテナを再起動することなく解像度を変更することができます。
古いバージョンで動作確認
例えば、2020年2月12日の最新バージョンのイメージを使いたい場合について紹介します。
それぞれのGitHubリポジトリのwikiにビルドログとスナップショットへのリンクを貼っています。
- https://github.com/Tiryoh/docker-ros-desktop-vnc/wiki
- https://github.com/Tiryoh/docker-ros2-desktop-vnc/wiki
wikiを見てログを確認すると、melodic-20200212T0927
が該当するタグであることを確認できます。
以下のコマンドを実行するとDockerイメージのタグmelodic-20200212T0927
を明示してコンテナを起動することができます。
docker run -p 6080:80 --shm-size=512m tiryoh/ros-desktop-vnc:melodic-20200212T0927
2月12日にイメージを作成する際にmelodic
、latest
、melodic-20200212T0927
の3つのタグを付けています(ログ: https://github.com/Tiryoh/docker_ros-desktop-vnc/runs/440655893)。melodic
、latest
のタグは次回の更新時に上書きされますが、melodic-20200212T0927
については更新していないので古いバージョンのイメージを指定してDockerコンテナを立ち上げることができます。
うっかりDockerコンテナを止めてしまった場合
docker ps -a
で止まっているコンテナも含めて表示されます。
$ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ab894a254b07 tiryoh/ros-desktop-vnc:melodic "/startup.sh" 52 seconds ago Exited (0) 35 seconds ago wizardly_hodgkin f418703aea16 tiryoh/ros2-desktop-vnc:dashing "/startup.sh" 3 hours ago Exited (137) 2 hours ago elastic_chatterjee f12b644c8ca3 tiryoh/ros-desktop-vnc:melodic "/startup.sh" 3 hours ago Exited (137) 2 hours ago keen_taussig
CREATED
とSTATUS
を見てリスタートしたいコンテナのIDを探します。3時間前に起動したROS 2のコンテナを再開したい場合、コンテナのIDはf418703aea16
のようなので、docker start f418703aea16
と実行すると再開できます。
外のノードとの通信
同じDockerネットワークにある外のノードとは通信することができるようです。
docker run
するときに--network
を指定すると同じDockerネットワークでDockerコンテナを起動できます。ここではros-test
という名前でDockerネットワークを作成し、そのネットワークを指定してDockerコンテナを2つ起動する例を示します。
docker network create ros-test docker run --network ros-test -p 6080:80 --shm-size=512m tiryoh/ros-desktop-vnc:melodic docker run --network ros-test -p 6081:80 --shm-size=512m tiryoh/ros2-desktop-vnc:dashing
ROSとROS 2の通信テストをするためのサンプルを動かしてみました。
ROS側
ROS側(http://127.0.0.1:6080)で以下の設定をします。
export ROS_MASTER_URI=http://`hostname`:11311 export ROS_HOSTNAME=`hostname`
端末を2つ用意し、それぞれで以下のコマンドを実行します。
roscore
rostopic pub /chatter std_msgs/String "this is ros:melodic"
ROS 2側
ROS 2側(http://127.0.0.1:6081)ではros-dashing-ros1-bridge
をインストール後、ROSと通信できるように設定します。今回はROS側のhostnameがf12b644c8ca3
だったので、そのhostnameをROS_MASTER_URI
に設定します。
export ROS_MASTER_URI=http://f12b644c8ca3:11311 export ROS_HOSTNAME=`hostname`
端末を2つ用意し、それぞれで以下のコマンドを実行します。
ros2 run ros1_bridge dynamic_bridge /chatter std_msgs/String
ros2 topic echo /chatter std_msgs/String
異なるコンテナ同士で通信できることを確認できました。
ホストマシンとの通信
Ubuntuではホストマシンとroscore
を共有して通信することもできましたが、macOSやWindowsではホストマシンとの通信は難しそうです。いい方法があれば教えてください。
今後について
Ubuntu 20.04が正式にリリースされたのでそのうちROS NoeticやROS 2 Foxyでも動かせるDockerfileを作成したいと思います。
できるのかどうかいまのところわかっていませんが、Chrome Remote Desktopのようにクリップボードも共有できたらいいなと思っています。
2022年7月30日現在、下記対応のDockerfileも追加しています。
- Ubuntu 20.04 + ROS Noetic (Dockerfile)
- Ubuntu 20.04 + ROS 2 Foxy (Dockerfile)
- Ubuntu 20.04 + ROS 2 Galactic (Dockerfile)
- Ubuntu 22.04 + ROS 2 Humble (Dockerfile)
謝辞
このDockerfileは@1222_takeshiさんの「GCP+Docker+GPUでrosを動かす (2) ~ VNCで動くDocker+ros環境の作成 ~」より着想を得たものです。
コメント
コメント一覧 (1件)
[…] https://memoteki.net/archives/2955 […]