Software Development Environment for ROS2

アドカレ7日目です！
久しぶりのQiitaへの記事投稿になるので，お手柔らかに

# はじめに
この記事は，私が所属している[記号創発システム研究室](http://www.em.ci.ritsumei.ac.jp/jp/research/robotics/)で用いている開発環境を紹介します．

ROSを用いたシステムの開発のときには，次のような環境を準備することが多いと思います．
- ホストマシンに直接ROSをインストールする
- ROSに対応したDockerイメージを利用する

ホストマシンに直接ROSをインストールする場合，自分で全てのパッケージなどを管理するため，個人での開発する分には問題ないでしょう．また，ROSを中心に学ぶだけで良いため，システムの構築・運用の学習コストは引く傾向にあります．ROSに対応したDockerイメージを利用する場合，構築するシステムのモジュールを事前にイメージとして準備すします．そのため，再現性の高い環境を構築することが可能です．

## 問題点
上記のような環境で，大規模なシステムを開発する場合は以下の問題が出てきます．
ホストマシンに直接ROSをインストールする場合
- 複数のマシンに再現性の高い環境を構築することが困難
- マシンごとの相性によるパッケージのインストールが困難

ROSに対応したDockerイメージを利用する場合
- Docker環境やネットワーク関連の設定が大変なことが多い
- 全体のサービスを動作させるために，1つ1つコンテナを立ち上げて実行する

## 実例
例えば，次の動画の中では2つのデモンストレーションを見ることができます．
- Manipulationは，UR5eとWHILLの台車が連携して，ディストックタスクを解くシステムを見ることができます．
- Interactionは，TOYOTAのHSRを用いた人との物体把持や人とのインタラクションを解くシステムを見ることができます．
<iframe width="1496" height="696" src="https://www.youtube.com/embed/UsVPQqmM9VQ" title="Robotics Demonstration by Team NAIST-RITS-Panasonic (NaRiPa) - NaRiPa × KICK" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

実例を参考に考えてみましょう．
ホストマシンに直接ROSをインストールする場合，UR5eと台車を動かすためのパッケージが多数存在するため，管理がとても困難と予想できます．また，複数人で開発することを考えると，パッケージが依存しているモジュールがマシンによって，入れることが困難な場合が多々存在します．

このような問題を解決できるのが Software Development Environment（以下SDE）です．

# Software Development Environment とは

創発システム研究室は，現在は以下の画像の通りのROSベースの開発環境を用いています．

![Screenshot 2022-12-04 at 16.56.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238812/f212d375-d5c4-f136-013e-455f3d153a6b.png)

## ディレクトリ構成
```  
├── BUILD-DOCKER-IMAGE.bash    
├── catkin_ws    
│   ├── CMakeLists.txt  
│   └── src
├── CONTRIBUTING.md
├── docker
│   ├── docker-compose.yml
│   └── fetch-devel
│       ├── Dockerfile
│       └── scripts
│           ├── CompressedImage2Video
│           │   ├── CompressedImage2Video_Stereo.py
│           │   └── README.md
│           ├── fix-git-paths.bash
│           ├── fix-permission-issues.bash
│           ├── initialize-bash-shell.bash
│           ├── initialize-catkin-workspace.bash
│           ├── initialize-docker-container.bash
│           ├── kill-ros-nodes.bash
│           ├── print-interface-ip.py
│           ├── reset-catkin-workspace.bash
│           └── run-roslaunch-repeatedly.bash
├── gitlab-ci
│   └── PUSH-DOCKER-IMAGE.bash
├── INCL-SUDO-ENV.bash
├── INCL-USER-ENV.bash
├── LICENSE
├── README.md
├── RUN-DOCKER-CONTAINER.bash
├── RUN-TERMINATOR-TERMINAL.bash
├── SETUP-DEVEL-MACHINE.bash
└── terminator
    └── config
```

- SETUP-DEVEL-MACHINE.bash
Dockerの入っていない環境から環境を整えることが可能

- BUILD-DOCKER-IMAGE.bash
変更したDockerfileをビルド

- RUN-DOCKER-CONTAINER.bash
Dockerのコンテナを起動

- RUN-TERMINATOR-TERMINAL.bash
Terminator torminalを用いて，複数のDockerコンテナを起動


## launch システム

Terminator terminalから，起動したいlaunchファイルを事前に登録が可能
- rと入力
ロボットへ接続するための設定を同時に実行

- lと入力
シミュレーションへ接続するための設定を同時に実行

- cと入力
シェルの起動

![Screenshot 2022-12-04 at 16.57.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238812/8f2fc7e5-bead-cb7a-e620-f8e5b633e645.png)

## コマンドライン

- remote_modeコマンド
ロボットへ接続するための設定を読み込む

- local_modeコマンド
シミュレーションへ接続するための設定を同時に実行

![Screenshot 2022-12-04 at 16.58.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/238812/387d3b8f-d3e4-6e0f-4c23-2fe7b296339f.png)

## ファイルシステム

SDEのトップディレクトリ以下を全てDockerでマウントするため，ホストマシンで変更した内容はDocker側でも変更を確認することができます．

# まとめ

ここまで色々書きましたが，
- 大規模なシステムを構築する際には，Software Development Environmentが使いやすいよ！
- Software Development EnvironmentをROS2で動作するようにしたよ！
- 大規模なシステムの開発時には使いやすいので，使ってね！

ということが言いたかったです！

今回のこのシステムは[GitHub](https://github.com/ItoMasaki/ROS2Docker)に公開されているので，ぜひ使ってください！

# ついでに宣伝
僕もソースコード作成（３，７章）を手伝った『[ROS2とPythonで作って学ぶAIロボット入門](https://www.amazon.co.jp/ROS2%E3%81%A8Python%E3%81%A7%E4%BD%9C%E3%81%A3%E3%81%A6%E5%AD%A6%E3%81%B6AI%E3%83%AD%E3%83%9C%E3%83%83%E3%83%88%E5%85%A5%E9%96%80-KS%E7%90%86%E5%B7%A5%E5%AD%A6%E5%B0%82%E9%96%80%E6%9B%B8-%E5%87%BA%E6%9D%91-%E5%85%AC%E6%88%90/dp/4065289564)』ぜひ買って，勉強してください！

# Citations
Summaries of the development history, requirements, vision, and goals of the SDE have been published in the following papers:

- L. El Hafi, G. A. Garcia Ricardez, F. von Drigalski, Y. Inoue, M. Yamamoto, and T. Yamamoto, "Software Development Environment for Collaborative Research Workflow in Robotic System Integration", in RSJ Advanced Robotics (AR), Special Issue on Software Framework for Robot System Integration, vol. 36, no. 11, pp. 533-547, Jun. 3, 2022. DOI: https://doi.org/10.1080/01691864.2022.2068353

- L. El Hafi and T. Yamamoto, "Toward the Public Release of a Software Development Environment for Human Support Robots", in Proceedings of 2020 Annual Conference of the Robotics Society of Japan (RSJ 2020), ref. RSJ2020AC3E1-01, pp. 1-2, (Virtual), Oct. 9, 2020.

- L. El Hafi, S. Matsuzaki, S. Itadera, and T. Yamamoto, "Deployment of a Containerized Software Development Environment for Human Support Robots", in Proceedings of 2019 Annual Conference of the Robotics Society of Japan (RSJ 2019), ref. RSJ2019AC3K1-03, pp. 1-2, Tokyo, Japan, Sep. 3, 2019.

- L. El Hafi, Y. Hagiwara, and T. Taniguchi, "Abstraction-Rich Workflow for Agile Collaborative Development and Deployment of Robotic Solutions", in Proceedings of 2018 Annual Conference of the Robotics Society of Japan (RSJ 2018), ref. RSJ2018AC3D3-02, pp. 1-3, Kasugai, Japan, Sep. 5, 2018.

Note:
Cite these papers if you are using the SDE to implement your research!
It is crucially important to desseminate the SDE accros the robotics research community.