ROS2の勉強　第1弾：環境構築

# #プログラミング ROS2< 環境構築 >

##はじめに
ROS(Robot Operating System)はある程度使えるようになった．あとは，経験を積んでいく中で洗練できると思う．その経験についての記録は，気まぐれに投稿することとする．続いては，ROS2も扱えるようになりたいということで，ROS2(バージョンアップしたROS)を難なく扱えるようになることが目的である．その第1弾として，「環境構築」を扱う．

##環境
#####仮想環境
|||
|:-:|:--|
|ソフト|VMware Workstation 15|
|実装RAM|2 GB|
|OS|Ubuntu 64 ビット|
|isoファイル|ubuntu-20.04.3-desktop-amd64.iso|

#####コンピュータ
|||
|:-:|:--|
|デバイス|MSI|
|プロセッサ|Intel(R) Core(TM) i5-7300HQ CPU @ 2.50GHz 2.50GHz|
|実装RAM|8.00 GB (7.89 GB 使用可能)|
|OS|Windows (Windows 10 Home, バージョン：21H1)|

#####ROS2
|||
|:-:|:--|
|Distribution|foxy|

##ROS2の環境構築

###環境構築のための準備
環境構築については，上田隆一氏の講義「ロボットシステム学講義：ロボットシステム学第11回（ROS2）」を参考にさせていただいた．

https://www.youtube.com/watch?v=QmRhucWxhac&list=PLbUh9y6MXvjdIB5A9uhrZVrhAaXc61Pzz&index=16&t=1737s

以下のgithubにROS2をインストールするための手順をシェルスクリプトにまとめてくれている．このおかげで非常に楽に環境構築できる．

https://github.com/ryuichiueda/ros2_setup_scripts

シェルスクリプトの中身を以下に示しておく．

```xml:ros2_setup_scripts
#!/bin/bash -e 

[ "${ROS_VERSION}" = "1" ] && echo ROS1 is set. Please comment out the lines of source for ROS1 on .bashrc and restart a terminal. && exit 1
[ "${ROS_VERSION}" = "2" ] && echo ROS2 is set. Please comment out the lines of source for ROS2 on .bashrc and restart a terminal. && exit 1

sudo apt-get install curl gnupg2
#curl http://repo.ros2.org/repos.key |
#sudo apt-key add - 

UBUNTU_VER=$(lsb_release -sc)
ROS_VER=dashing
[ "$UBUNTU_VER" = "focal" ] && ROS_VER=foxy

echo "deb [arch=amd64,arm64] http://packages.ros.org/ros2/ubuntu ${UBUNTU_VER} main" |
sudo tee /etc/apt/sources.list.d/ros2-latest.list

sudo apt-get update

sudo apt-get install ros-${ROS_VER}-desktop python3-colcon-common-extensions python3-rosdep python3-argcomplete

sudo rm -f /etc/ros/rosdep/sources.list.d/20-default.list
sudo rosdep init
sudo rosdep fix-permissions

echo "source /opt/ros/${ROS_VER}/setup.bash" >> ~/.bashrc

rosdep update

echo '***INSTRUCTION*****************'
echo '* do the following command    *'
echo '* $ source ~/.bashrc          *'
echo '*******************************'
```

###シェルスクリプト実行
先ほど示したシェルスクリプトを実行すればよいかなと思ったが，そのままだとエラーが出てくる．
シェルスクリプトの中身をよく見てみると，まず3行目[ "${ROS_VERSION}" = "1" ] &...の部分はコメントアウトしてもよさそうだ．また，6，7行目がコメントアウトされているが，レポジトリにアクセスする際に必要な部分となるため，コメントアウトを外しておく．編集した結果を以下に示す．

```xml:ros2_setup_scripts
#!/bin/bash -e 

#[ "${ROS_VERSION}" = "1" ] && echo ROS1 is set. Please comment out the lines of source for ROS1 on .bashrc and restart a terminal. && exit 1
[ "${ROS_VERSION}" = "2" ] && echo ROS2 is set. Please comment out the lines of source for ROS2 on .bashrc and restart a terminal. && exit 1

sudo apt-get install curl gnupg2
curl http://repo.ros2.org/repos.key |
sudo apt-key add - 

UBUNTU_VER=$(lsb_release -sc)
ROS_VER=dashing
[ "$UBUNTU_VER" = "focal" ] && ROS_VER=foxy

echo "deb [arch=amd64,arm64] http://packages.ros.org/ros2/ubuntu ${UBUNTU_VER} main" |
sudo tee /etc/apt/sources.list.d/ros2-latest.list

sudo apt-get update

sudo apt-get install ros-${ROS_VER}-desktop python3-colcon-common-extensions python3-rosdep python3-argcomplete

sudo rm -f /etc/ros/rosdep/sources.list.d/20-default.list
sudo rosdep init
sudo rosdep fix-permissions

echo "source /opt/ros/${ROS_VER}/setup.bash" >> ~/.bashrc

rosdep update

echo '***INSTRUCTION*****************'
echo '* do the following command    *'
echo '* $ source ~/.bashrc          *'
echo '*******************************'
```
これで，実行準備が整った．
あとは，以下のコマンドで実行して，待つだけでROS2の環境が構築できる．

```
./setup.bash
```

##ROS2環境の確認
###インストールできたか
パスを通す（先ほどのシェルスクリプト内ですでにbashrcファイルにros2のパスを通すコマンドが書き込まれている; 下から8行目）

```
source ~/.bashrc
```
ROS2が使える状態か確認：ROS2ではros2が基本コマンドとしてあるため，ros2と入力するだけ

```
ros2
```

```:出力
usage: ros2 [-h] Call `ros2 <command> -h` for more detailed usage. ...

ros2 is an extensible command-line tool for ROS 2.
（以下略）
```
このように出力されていれば，問題ない．
ここまでで，環境の確認までできた．最後に実際に動くかの確認として，サンプルコードを動かす．

###サンプルコードの実行
ROS2にもサンプルプログラムが用意されている．ここでは，PublisherとSubscriberのサンプルプログラムを実行してみる．

##### 実行コマンド
rosrunではなくros2 runになっている．

```:terminal_1（文字列を配信する）
ros2 run demo_nodes_py talker
```

```:terminal_2（配信されている文字列を受け取る）
ros2 run demo_nodes_py listener
```

##### 実行結果
![talker_listener.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/951300/f9e48c0e-3f22-03bb-baa4-fe70e220f557.png)
左：terminal_1（talker）　　　　　　　右：terminal_2（listener）

##### topicの確認
rostopicもros2 topicになっている．

```:topicの確認コマンド
ros2 topic list
```
```:topicの確認
/chatter
/parameter_events
/rosout
```

ros2 topic infoでは配信・購読の数を確認できる．

```:topicの情報確認コマンド
ros2 topic info /chatter
```

```:topicの情報確認
Type: std_msgs/msg/String
Publisher count: 1
Subscription count: 1
```

ここでは，共通のトピックとして``/chatter``がある．このchatterに配信しているのがPublisherであり，それを購読しているのがSubscriberである．また，ROSとは異なり，roscore（マスター）の立ち上げが不要であることにも注目しておきたい．ただ，ros2 topic infoでどのノードが配信者で購読者であるかが分からなくなってしまっている．もしかすると，何かオプションをつけると以前のrostopic infoのときのように見えるのかもしれないが，いまのところ分からない．

##感想
いよいよROS2も勉強し始めた．今回はその導入として環境構築ができた．ROSのときで培った概念などはそのまま受け継がれているため，そこまで分かりにくいという部分はいまのところなさそうである．またpythonは私のメインのプログラミング言語であるため，pythonde記述されたpythonファイルに関しても特に抵抗はない．ただ，ROSを割と勉強してきているため，まだまだ慣れはしていない．どちらも使えるようにできればと思う．ROS2についてもまだまだ知らないことも多いと思うため，ここから詰めていく．

##参考
- ロボットシステム学講義：ロボットシステム学第11回（ROS2）　　上田隆一 氏

https://www.youtube.com/watch?v=QmRhucWxhac&list=PLbUh9y6MXvjdIB5A9uhrZVrhAaXc61Pzz&index=16&t=1737s

- ros2_setup_script

https://github.com/ryuichiueda/ros2_setup_scripts

- ロボットプログラミングROS2入門　玉川大学　岡田浩之　著，科学情報出版株式会社