Docker上にROS1,ROS2の共存環境を作成＆ROS2(.db3)からROS1(.bag)へのbagファイル変換

## 環境
- Ubuntu20.04 LTS 
（Dockerを使うので環境は選ばないはずです）
## 経緯
ROS2の.db3をROS1のbagに変換するため、ros1_bridgetを用いてROS1とROS2を同時に動かしたい。既存の環境に他方のROSを追加してもいいが、環境が壊れるのが怖い。そこで、Docker上でROS1、ROS2の共存環境を作ることに。

## Dockerのインストール
以下のサイトのステップ２までをやりましょう。

https://www.digitalocean.com/community/tutorials/how-to-install-and-use-docker-on-ubuntu-20-04-ja

## 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
```
(参考サイト)
[参考1](https://www.sato-susumu.com/entry/docker-ros)
[参考2](https://qiita.com/karaage0703/items/957bdc7b4dabfc6639da)
## ROS2をインストール
前ステップで構築されたUbuntu18.04 & ROS1の環境にROS2を追加します。
下記サイトの``Ubuntu 18.04にROS2 Dashingをインストール``から進めましょう。
(ROS1のcatkin_wsを作ってない場合は作っても良いです)
VNC上のコマンドに打っていけばいいです。
動作テストもやってみると良いです。既にここで共存環境が出来上がっています。

https://qiita.com/k-koh/items/838c70004119c329c617

テストまで行ったら、~/.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
```
参照サイト↓

https://docs.ros.org/en/dashing/Tutorials/Ros2bag/Recording-And-Playing-Back-Data.html

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]
```