初めまして.私はあるロボット開発チームのメンバーとして,ROS2を使った自律走行ロボットの開発を行なっています.
M1チップ搭載のMacBook環境でROS2の開発を進める方法としては,まずUbuntuの仮想環境を利用する方法が考えられます12.私も以前はUTMを用いてUbuntuの仮想環境を構築しその上で開発を行っていましたが,UTMは動作が不安定で,突然フリーズすることが何度もありました.
そこで軽量かつ動作も安定していて,情報も豊富なDocker3を使うことにしました.私はロボットの中でも特にカメラによるPerceptionの部分を担当しています.
画像処理や画像認識の開発をする上で実際に画像を出力して確認したいことがあるので,ブラウザ経由でGUIを使用できるよう環境構築を行いました.
概要
今回は以下のGithubを参考にしました.
環境構築の流れ
まずはGithubからリポジトリをクローンします.
ros2-docker-dev
というディレクトリが生成され,必要ファイル群がダウンロードされます.次にそのディレクトリに移動します.
git clone https://github.com/adeeb10abbas/ros2-docker-dev.git
cd ros2-docker-dev
次にダウンロードしてきたDockerfileからイメージをビルドします.
docker build -t ros2-dev .
ビルドが正常に完了したら,環境構築は完了です.
動作確認
まずは環境変数の設定です.
export ROS_DEV_CONTAINER_NAME=ros2_dev_container
export ROS_PROJECT_PATH=$(pwd)
ROS_DEV_CONTAINER_NAME
はコンテナの名前で,ros2_dev_container
に設定しています.ROS_PROJECT_PATH
は,一旦現在のディレクトリに設定しています.
ROS_PROJECT_PATH
は、ROSプロジェクトのソースコードや設定ファイルが格納されているホスト側のディレクトリを指定します.これを指定することで、Dockerコンテナ内で編集することができるようになります.
先ほどビルドしたイメージからコンテナを起動します.ビルドした時と同じディレクトリで以下のコマンドを実行しましょう.
docker-compose up
今回は同ディレクトリ内のdocker-compose.yml
に定義された2つのコンテナ(ros2_dev_containerとros2-docker-dev-novnc-1)を起動させる必要があります.
以下のコマンドでコンテナの起動状態を確認してみましょう.新たに二つのコンテナros2_dev_container
,ros2-docker-dev-novnc-1
が起動中になっていることが確認できるはずです.
各コンテナの役割はこちら
ros2_dev_container
はROS2(Robot Operating System 2)の開発環境を提供するものです.このコンテナにはそのためのツールやライブラリがインストールされています。この環境内で開発を行います.
ros2-docker-dev-novnc-1
はVNCサーバーを立ち上げ、リモートデスクトップ環境を提供するものです.VNC(Virtual Network Computing)はリモートデスクトップ環境を提供するためのプロトコルで,このコンテナではnoVNCを使用してブラウザを介したリモートデスクトップアクセスが可能です.特に,RVizなどのGUIツールを使用するのでこちらのコンテナも起動しておく必要があります.
まとめるとros2_dev_container
は開発環境の提供,ros2-docker-dev-novnc-1
はその開発環境にブラウザでリモートアクセスするためのGUI環境を提供するものです.
docker ps
#出力
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
xxxxxx123456 ros2_dev_container "/ros_entrypoint.sh …" *** ago Up *** minutes ros2_dev_container
yyyyyy654321 sample/novnc:latest "/app/entrypoint.sh" *** ago Up *** minutes 0.0.0.0:8080->8080/tcp ros2-docker-dev-novnc-1
起動が確認できたら他のターミナルやVScodeからアタッチすることで開発・実行することが可能になります.
ターミナルからアタッチする時は,先ほど指定したコンテナ名に注意して以下のコマンドを実行します.
docker exec -it ros2_dev_container /bin/bash
#起動後,コンテナ内でターミナルが開始される
root@21cb948dd945:/# ls
bin boot dev etc home lib log media mnt opt proc root ros2_ws ros_entrypoint.sh run sbin srv sys tmp usr var
root@21cb948dd945:/# cd ros2_ws
root@21cb948dd945:/ros2_ws# ls
src