ROS2個人用初期設定

[ROS2関係トップページへ](https://qiita.com/NeK/items/7ac0f4ec10d51dbca084)

変更:
2023/01/19: もしかしたら必要となるかもしれないpythonモジュール]を[ROS2 + pipenv install](https://qiita.com/NeK/items/196783d7125a3fabf372)に移動
2023/01/18: [もしかしたら必要となるかもしれないpythonモジュール](#もしかしたら必要となるかもしれないpythonモジュール)を追加
2021/07/23: アンダーレイの設定に関して修正．colcon_cdの設定≠アンダーレイの設定，アンダーレイの設定＝ROS2の全体設定．

# 初期設定
ROS2を使用するために，以下の5種類(1種類は必要に応じて)の設定を行う．

* colcon_cdの設定
    * exportでcolcon_cdコマンドが管理するディレクトリを指定
* ROS2の全体設定(アンダーレイの設定)
    * /opt/ros/\<distro\>/setup.bash
    * 使用するバージョンに応じて\<distro\>を変更
    * 複数terminalにてそれぞれ異なるバージョンを指定することでバージョンを混在させて使用可能
    * 詳しくは[ROS2に関する基本情報](https://qiita.com/NeK/items/18ff9e9c443295d5d805)を参照
* プロジェクト・プログラムの設定
    * install/setup.bash
* ROS_DOMAIN_ID
    * 他の人のノードと混ざらないため．ノード空間を分けるもの．逆に言うと，これが同じ値であれば異なる人が実行したノード間であっても通信・やりとりできる．
    * 自分が使ってるPCのみで使用し，他のコンピュータ(上で動いている他の人のノード)と勝手にやり取りをしないために，以下のオプションが付け加えられたので活用．
        * ROS_LOCALHOST_ONLY
            * もしかしたらhumbleからなのかもしれない．
* 動的なノード発見範囲の設定について(やりたいときに設定)
    * ROS_AUTOMATIC_DISCOVERY_RANGE={SUBNET,LOCALHOST,OFF,SYSTEM_DEFAULT}
    * ROS_STATIC_PEERS={IPアドレス,FQDNなど}
    * 詳しくは[こことか](https://docs.ros.org/en/jazzy/Tutorials/Advanced/Improved-Dynamic-Discovery.html#improveddynamicdiscovery)

\<distro\>のところがバージョン．個々の\<distro\>の部分は以下の通り．

* \<distro\>の部分
    * Galactic Geocheloneの場合
        * galactic
    * Foxy Fizroyの場合
        * foxy
    * Humble Hawksbillの場合
        * humble

下記の例ではcolcon_cdで管理するディレクトリを`~/ros2_install`としている．個人的には`~/program/ros2`としている．echoでえいっと設定するか`.bashrc`を直接編集するか好きな方で．

## とりあえずechoでえいっと設定する場合

```Bash:terminal
$ echo "source /usr/share/colcon_cd/function/colcon_cd.sh" >> ~/.bashrc
$ echo "export _colcon_cd_root=~/ros2_install" >> ~/.bashrc
$ echo "source /opt/ros/<distro>/setup.bash" >> ~/.bashrc
$ echo "export ROS_DOMAIN_ID=<自分に割り当てられた番号>" >> ~/.bashrc
```

ROS_DOMAIN_IDに関しては一人で使用する分には `0`を割り当てるか `ROS_LOCALHOST_ONLY=1` をexportする．
詳しくは[同一ネットワーク内で複数人がROS2を使用する場合](https://qiita.com/NeK/items/6163d5a307665a3c9c1c)を参照のこと．


## .bashrcを編集して少し工夫して設定する場合

```bash:.bashrc
...
# for ROS2
## User settings
ROS2_TOP_DIRECTORY="$HOME/ros2_install"
## 使用するディストロを有効化(コメントアウト)
#DISTRO_ROS2="eloquent"
DISTRO_ROS2="foxy"
#DISTRO_ROS2="galactic"
#DISTRO_ROS2="humble"
ID=0 # pleas contact Kurashige
## commands
if [ -f /usr/share/colcon_cd/function/colcon_cd.sh ]; then
        source /usr/share/colcon_cd/function/colcon_cd.sh
        echo "colcon cd root is $ROS2_TOP_DIRECTORY ."
        export _colcon_cd_root=$ROS2_TOP_DIRECTORY
fi

if [ -f /opt/ros/$DISTRO_ROS2/setup.bash ]; then
        echo "ROS2 $DISTRO_ROS2 is activated."
        source /opt/ros/$DISTRO_ROS2/setup.bash
fi
if [ $ID -eq 0 ]; then
        echo "ROS2 is executed only for local."
        export ROS_LOCALHOST_ONLY=1
else
        echo "ROS2 is executed through a network."
        export ROS_DOMAIN_ID=$ID
fi
```

# ROS2プログラムのexamples
もし興味があれば，[公式githubのexamples](https://github.com/ros2/examples)をDLしておく．ただあまり必要ではない．というのは，ブラウザで[公式githubのexamples](https://github.com/ros2/examples)を見る方が勉強しやすいから(個人的意見)．

DL・コンパイル・実行の方法は，[公式チュートリアル](https://index.ros.org/doc/ros2/Tutorials/)の一番初めである[Using Colcon to build packages](https://index.ros.org/doc/ros2/Tutorials/Colcon-Tutorial/)にある．
ここではDLの方法のみ記載しておく．

```Bash:terminal
$ mkdir -p ~/ros2_example_ws/src
$ cd ~/ros2_example_ws
$ git clone https://github.com/ros2/examples src/examples
```

~/ros2_example_ws/src/rclcpp以下にc++用のコードがあり，~/ros2_example_ws/src/rclpy以下にpython用のコードがある．