環境
- Ubuntu20.04 LTS
(Dockerを使うので環境は選ばないはずです)
経緯
ROS2の.db3をROS1のbagに変換するため、ros1_bridgetを用いてROS1とROS2を同時に動かしたい。既存の環境に他方のROSを追加してもいいが、環境が壊れるのが怖い。そこで、Docker上でROS1、ROS2の共存環境を作ることに。
Dockerのインストール
以下のサイトのステップ2までをやりましょう。
Docker上に、Ubuntu18.04 & ROS1のコンテナを用意
コマンドで以下を入力します(--name rosの"ros"のところは任意に名前を付けられます)
docker run --name ros -p 6080:80 --shm-size=512m tiryoh/ros-desktop-vnc:melodic
ブラウザで以下にアクセスします
http://127.0.0.1:6080/
ここからはVNCで操作することになります。
以下のVNCに入った後、メニューからコマンドを立ち上げて下記を忘れずに行いましょう。
$ sudo apt update
$ sudo apt install gedit
$ sudo apt install iputils-ping net-tools tcpdump traceroute
止めるときは(rosの部分は--nameで指定した任意の名前)
docker stop ros
また立ち上げるときは
docker start ros
ROS2をインストール
前ステップで構築されたUbuntu18.04 & ROS1の環境にROS2を追加します。
下記サイトのUbuntu 18.04にROS2 Dashingをインストール
から進めましょう。
(ROS1のcatkin_wsを作ってない場合は作っても良いです)
VNC上のコマンドに打っていけばいいです。
動作テストもやってみると良いです。既にここで共存環境が出来上がっています。
テストまで行ったら、~/.bashrcに記載のsetup.bashをコメントアウトしておきましょう。ROS1,ROS2をつかうときはその都度コマンドに各々のsetup.bashを打ち込みましょう
# source /opt/ros/melodic/setup.bash
# source /opt/ros/dashing/setup.bash
ros2bagをインストール
どうもros2 bag コマンドが使えないので、個別にインストール。
$ sudo apt-get install ros-dashing-ros2bag \
ros-dashing-rosbag2-converter-default-plugins \
ros-dashing-rosbag2-storage-default-plugins
参照サイト↓
metadata.yamlとdb.3が入ったフォルダを指定してあげれば
$ ros2 bag play [folder_path]
動きます。
Docker コンテナをイメージ化 [任意] (ローカルのコマンドで行う)
ここまでで、ROS1,ROS2共存環境が整ったので、一旦コンテナをイメージ化しても良いです。
筆者はここから何回も詰まってdocker startできなくなったので、この時点でのイメージ化はおすすめです。
上記サイトでUbuntu&ROS1のコンテナをそのまま構築した際には、コンテナ名はrosになっていると思います。
わからなければ、$ docker ps -a
をローカルのコマンドに打てばNAMES
に示されています。
$ docker commit [コンテナ名] [任意のimage名]
$ docker images
〜imageの保存はどのような場合に役立つのか〜
※例えば、環境整えている間にエラーが出ると、次docker startしたときに、強制的にExitedになってしまう。
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
********** tiryoh/ros-desktop-vnc:melodic "/startup.sh" 2 hours ago Exited (1) 9 seconds ago ros
※もし、ERRORが出てコンテナが立ち上がらなくなったときはいつでも途中で保存したimagesから再開できる。
$ docker rm [ID]
$ docker run --name [任意のコンテナ名] -p 6080:80 --shm-size=512m [任意のimage名]:latest
python venv インストール&使用
ROS環境では直でpythonバージョンを変えるとERRORが起きて、コンテナが再びstartできなくなります。
そのため、venvを使って仮想環境で動かすようにしましょう。(例pyhton 3.9の場合)
初めは一度だけ下記を実行しましょう。
$ sudo apt install -y software-properties-common
$ sudo add-apt-repository ppa:deadsnakes/ppa
次に、特定のバージョンのpythonのvenvをインストールします。
$ sudo apt install -y python3.9-venv
(例)実行時は以下のようにして、pythonの仮想環境を構築します。
$ cd [対象ディレクトリ]
$ python3.9 -m venv [任意ネーム]
$ . [任意ネーム]/bin/activate
ROS2の.db3からROS1の.bagへ変換
ROS2(.db3)からROS1(.bag)へのbagの変換を行うために,以下のオープンソースをcloneします.
そして,python3.9の仮想環境に入ってビルドします.
$ git clone https://gitlab.com/MapIV/rosbags.git
$ cd rosbags
$ python3.9 -m venv venv
$ . venv/bin/activate
(venv)$ pip install -r requirements-dev.txt
(venv)$ pip install -e .
(venv)$ pytest
(venv)$ sphinx-build -a docs public
筆者はpytestやbuildのコマンドでエラーが出ても問題なかったです。
変換の際は,python3.9の仮想環境に入ってから行うようにして下さい.
$ cd rosbags
$ python3.9 -m venv venv
$ . venv/bin/activate
(venv)$ rosbags-convert-2to1 [ROS2 BAG pass]