ROS/ROS2のGUIをWebブラウザ経由でお手軽に試せるDockerfileを公開しました

ROS/ROS2のGUIをWebブラウザ経由でお手軽に試せるDockerfileとDockerイメージを公開しています。その特徴と使用方法を紹介します。

今回紹介するのは

  • Ubuntu Desktop(LXDE)
  • VNCサーバ
  • Webブラウザから使用するVNCクライアント+WEBサーバ
  • ROS/ROS2

がインストールされた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イメージはセキュリティに対する配慮はありません。「お気軽に試す」以外の用途(公開サーバに放置、実環境への投入など)は避けた方がよいと思います。

公開しているもの

DockerfileとGitHub Actionsの設定を以下のページで公開しています。

ROS

Tiryoh/docker_ros-desktop-vnc
A Docker image to provide HTML5 VNC interface to access Ubuntu LXDE + ROS - Tiryoh/docker_ros-desktop-vnc

ビルドログ: https://github.com/Tiryoh/docker_ros-desktop-vnc/wiki

ROS 2

Tiryoh/docker_ros2-desktop-vnc
A Docker image to provide HTML5 VNC interface to access Ubuntu LXDE + ROS2 - Tiryoh/docker_ros2-desktop-vnc

ビルドログ: 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ブラウザを開いたりできます。

TurtleBot3をGazebo上で動かしている様子(ROS)

ROS 2 Dashing

同様に以下のコマンドを実行するとROS 2 Dashingがインストールされた環境を起動できます。

docker run -p 6080:80 --shm-size=512m tiryoh/ros2-desktop-vnc:dashing
Gazebo上で動かしている様子(ROS2)

そのほか

2020年5月1日現在、ROSは

ROS 2は

のDockerfileを公開しています。

最新情報についてはGitHubのREADMEの#docker-tagsを参照してください。

動作環境

Windows 10でもmacOSでもUbuntuでもDockerが動く環境であれば使用できることを確認しています。

Win10 HomeのWSL2+DockerでGUIのROS1/ROS2をセットアップする方法 - Qiita
@karaage0703さんが「Docker上でGUIのROS1/ROS2を一瞬でセットアップする方法」にて紹介してくださったDockerイメージ(tiryoh/ros-desktop-vncとtiryoh/ros2-desktop-...
Docker上でGUIのROS1/ROS2を一瞬でセットアップする方法 - Qiita
Docker上でGUIのROSを動かす  TiryohさんがGitHub上で素晴らしいリポジトリを公開していました。 Tiryoh/docker_ros-desktop-vnc(GitHub)  素晴らしさに感動してしまっ...

より便利に使うために

より便利に使うために便利な方法をいくつか紹介します。

クリップボードの共有

クリップボードは自動では共有されません。左側のメニューからClipboardを利用できます。

ホストPC -> Dokcerコンテナにクリップボードを共有する際は次のアニメーションのようにクリップボードのウィンドウに文字列を貼り付けます。

Dockerコンテナ内でコピーしたクリップボードの内容も参照できます。

古いバージョンで動作確認

例えば、2020年2月12日の最新バージョンのイメージを使いたい場合について紹介します。

それぞれのGitHubリポジトリのwikiにビルドログとスナップショットへのリンクを貼っています。

wikiを見てログを確認すると、melodic-20200212T0927が該当するタグであることを確認できます。

以下のコマンドを実行するとDockerイメージのタグmelodic-20200212T0927を明示してコンテナを起動することができます。

docker run -p 6080:80 --shm-size=512m tiryoh/ros-desktop-vnc:melodic-20200212T0927

2月12日にイメージを作成する際にmelodiclatestmelodic-20200212T0927の3つのタグを付けています(ログ: https://github.com/Tiryoh/docker_ros-desktop-vnc/runs/440655893)。melodiclatestのタグは次回の更新時に上書きされますが、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

CREATEDSTATUSを見てリスタートしたいコンテナの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複数Docker通信 - Qiita
背景 ・開発環境/ランタイムのアプリ依存は完全に排除することは非常に困難。 ・ROSアプリによっては特定のversionやpackageに依存する。(例えば、melodic依存など) ・docker使えば、上記は排除できるし、ア...

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のようにクリップボードも共有できたらいいなと思っています。

How-to
スポンサーリンク
ぜひこのエントリをシェアしてください!

Memotekiの管理人です。このブログには学んだことや共有しておきたいことをマイペースにメモしていきます。2020年からは日記も書き始めました。

Tiryohをフォローする
Memoteki

コメント