mROS 2 mbed をmbed studioで環境構築する

## はじめに
この記事ではmbed studioを使ってmROS 2の環境を構築できたので、備忘録も兼ねて投稿します。

## この記事の対象者
- ROS 2をstmマイコンで動かしたい人
- mROS 2の環境構築、開発をmbed studioでやりたい人

## 動作環境
- ROS 2 Humble
    - Ubuntu 22.04の入ったPCで動かします
- mbed studio
    - Windows 11,10 Ubuntu 22.04 で動作確認済
- mROS 2
    - NUCLEO F767ZI+ルーター

## ROS 2 Humbleのインストール
aptを使って入れます
```bash
sudo apt install software-properties-common
sudo add-apt-repository universe
sudo apt update
sudo apt install curl
sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu $(. /etc/os-release && echo $UBUNTU_CODENAME) main" | sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null
sudo apt update
sudo apt upgrade
```
desktop版なら
```bash
sudo apt install ros-humble-desktop
```

GUIを使われない方は
```bash
sudo apt install ros-humble-base
```
でHumbleを入れます。
インストールが終わったらbashrcをいじります
```bash
echo "source /opt/ros/humble/setup.bash" >> ~/.bashrc
```
これで起動時にHumbleがsource(ロードみたいな感じ)されます。

## mbed studioのインストール
[https://os.mbed.com/studio/](https://os.mbed.com/studio/)にアクセスしてmbed studioをダウンロードします。
インストールする際はドライバー(udev)を入れるか聞かれるのでyesしてください。
windowsならexe実行してmbed studioを入れてください。
Ubuntuは`sudo chmod +x MbedStudio-....sh`で実行権限を与えてshを実行してください。

## 依存関係
Python3を入れます。
入れるときにPathを通すところにチェックを入れるのを忘れないでください。
pipとJinja2を入れます。
```bash
python3 -m pip install --upgrade pip
pip install Jinja2
```
ほかにも必要なものがあるかもしれませんが、同じように `pip install`してください。

## mROS 2のインストール
Mbed Studioを開きます。
[mbed studio用に改造されたmros2](https://github.com/kazu-321/mros2-mbed-studio)を使います
このリポジトリはmbed studio用にmros2 mbedを修正させたものです。
現在プルリクを送っているのでurlが変わる可能性が高いです。

File -> Import Program で[このURL](https://github.com/kazu-321/mros2-mbed-studio)をコピペし、Add Programします。

少し待つと必要なファイルがダウンロードされます。

embeddedRTPS/thirdparty/の中にあるlwip Micro-CDRをplatform内に移動させます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1832609/23c12882-91f6-7d82-b8be-5579644a12a2.png)

## 動かす！
main.cppを開きます。
コードの説明は今は省きますが、いつか書きます。

## 設定
ルーターの設定でdhcpを利用している場合は、platform/mros2-platform.hをひらき、
10行目の`#define MROS2_IP_ADDRESS_STATIC`をコメントアウトします。
dhcpを使わない場合、同じくmros2-platform.hを開き、マイコンのIP等を設定します。
コードを書き終わったら、
```bash
python3 ./mros2/mros2_header_generator/templates_generator.py --indir ./
```
を実行します。
これはtopicの型を変えたり使うtopicを増やしたりしたら実行する必要します。

## 論よりRUN!!
マイコンをPCとつなぎます。
ルーターとマイコンをLANでつなぎます。
パソコンも同じルーターにwifiやLAN等で接続します。
早速実行マークを押してビルド＆書き込みします。
```
mros2-mbed start!
app name: echoback_string
Successfully connected to network
  IP Address: 192.168.11.2
[MROS2LIB] set IP address for RTPS communication
[MROS2LIB] mros2_init task start
mROS 2 initialization is completed

[MROS2LIB] create_node
[MROS2LIB] start creating participant
[MROS2LIB] successfully created participant
[MROS2LIB] create_publisher complete.
[MROS2LIB] create_subscription complete.
[MROS2LIB] Initilizing Domain complete
ready to pub/sub message

publishing msg: 'Hello from mros2-mbed onto NUCLEO_F767ZI: 0'
publishing msg: 'Hello from mros2-mbed onto NUCLEO_F767ZI: 1'
publishing msg: 'Hello from mros2-mbed onto NUCLEO_F767ZI: 2'
publishing msg: 'Hello from mros2-mbed onto NUCLEO_F767ZI: 3'
...(SNIPPED)...
```
このような出力があったら成功です！！

PCでターミナルを起動し、
```bash
ros2 topic echo to_linux
```
を実行することでデータを受け取れます。

## 通信できない場合
マイコンにpingが通る場合、以下の方法で通信を最適化できます。
- IPv6をオフにする
- ufw disable
- ROS_DOMAIN_IDの確認
pingが通らない場合は
- 同じルーターに接続しているか
- マイコンでエラーが出ていないか
- 同じルーターにつないだ他の端末へのpingが通るか

## 次は...
独自の型の実装& mROS 2と通信
ラジコンを改造してmROS 2経由で制御
色々やりたいことがあるのででき次第どんどん記事を書いていきます！！