micro-ROS for ArduinoによるROS2対応IMUデバイス（第1報）

# はじめに
[ROS/ROS2 Advent Calendar 2020][1]で12/24の記事として[micro-ROS][2]に関する記事を投稿することを予定していた．[micro-ROS for Arduino][3]のToy ExampleとしてIMUデバイスを作っていたが，記事としてまとめるまでに大きく遅れてしまった．後からAdvent Calendarに投稿できるかのテストも兼ねて，Advent Calendarに紐付けて投稿する．

# 記事概要
一定時刻毎に並進加速度や角速度，および磁束密度を検出，ROS2のTopicとしてPublishするIMUデバイスを製作したので，使用しているテクニックについて報告する．
第1報ではまずゴールイメージとしてのデモンストレーションとIMUデバイスの仕様，および第2報以降の章立て（予定）について述べる．

|`linear_acceleration`|`angular_velocity`|
|:---:|:---:|
|![linear_acceleration.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574178/bf95b9e6-74b9-ae06-e277-45fdb82acf4f.gif)|![angular_velocity.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574178/9a9e9e09-ab15-a040-8ba2-69cf1c5c5318.gif)|

# 動機
micro-ROS for Arduinoの習作として何か作りたいと考えていたことと，少し前に[ros2arduino][4]を使って今回と同様のデバイスを作っていたこともあり，micro-ROS for Arduino版のデバイスを作ることを思い立った（ros2arduino版についてはいずれ記事化するつもりであるが，その時には供養記事になっているかもしれない）．

# 目的
- micro-ROS for Arduinoを用いたROS2対応IMUデバイスの作り方を公開し，他のセンサデバイスでも作ってみようという気運を高めること
- SBCをホストとしてその下にマイコンをぶら下げる構成に対し，ロボット制御用のスタンドアロンシステムとしての可能性を感じてもらうこと

# 本論

## デモンストレーション

|`linear_acceleration`|`angular_velocity`|
|:---:|:---:|
|![linear_acceleration.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574178/bf95b9e6-74b9-ae06-e277-45fdb82acf4f.gif)|![angular_velocity.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574178/9a9e9e09-ab15-a040-8ba2-69cf1c5c5318.gif)|

※GIF動画では`linear_acceleration`と`angular_velocity`をプロットしているが，`magnetic_filed`も別のTopicとして実装されている

### デモシステムの概要（詳細は第4報にて）

- IMUデバイスはホスト（RaspberryPi4B 2GB）とUSB接続（給電およびUSB-Serial通信）
- ホストではROS2 Foxy環境下で`micro-ROS Agent`が走っていて，USB-Serial経由でIMUデバイスと通信している
- `micro-ROS Agent`はIMUデバイスからのデータをROS2 DDSネットワークにPublishしている
- `rqt_plot`での可視化のため，ホストではTopicの`Reliability Policy`（`QoS Profile`の一部）を変換するROS2 Nodeが走っている
- Android端末はホストと同じネットワークに接続されていて，`USERLAND`内に構築された`rqt_plot（ROS2 Dashing）`でTopicを可視化している

### 数値データの確認
※RaspberryPi4Bにリモートログインしたターミナルで確認

`sensor_msgs/msg/Imu`
![imu_echo.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574178/4ca01c18-fcf4-dd19-fad1-c5f5961478de.gif)

`sensor_msgs/msg/MagneticField`
![mag_echo.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574178/e24bef31-2c66-b2f1-9e90-3bcfae62739e.gif)


### Publishレートの確認
※RaspberryPi4Bにリモートログインしたターミナルで確認

`sensor_msgs/msg/Imu`
![imu_hz.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574178/d31bd2cb-914b-adcf-5150-d5fa08f19d75.gif)

`sensor_msgs/msg/MagneticField`
![mag_hz.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574178/86587658-f11a-1596-6ef4-5d4b32e00241.gif)

## IMUデバイスの仕様



|||
|---|---|
|外観|![ae-bmx055_xiao.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574178/5f20cd4d-b84b-8489-4ef0-b479f13dafc5.png)|
|サイズ|W : 18[mm] x D : 33[mm] x H : 10[mm]|
|センサモジュール|AE-BMX055@（株）秋月電子通商|
|センサチップ|BMX055@Bosch Sensortec GmbH|
|マイコンモジュール|Seeeduino XIAO@Seeed Technology Co., Ltd.|
|マイコンチップ|SAMD21G18@Microchip Technology Inc.|
|ホストとの接続方式|USB2.0 Type-C|
|給電方式|USBバスパワー|
|並進加速度検出範囲（各軸）|±16[g]|
|角速度検出範囲（各軸）|±2000[deg/s]|
|磁束密度検出範囲|XY-axis : ±1300 x 10<sup>-6</sup> [T], Z-axis : ±2500 x 10<sup>-6</sup> [T]|
|Type of Topic|`sensor_msgs/msg/Imu`, `sensor_msgs/msg/MagneticField`|
|サンプルレート（ = Publishレート）|200[Hz]|
|ホスト要件|ROS2 Foxy環境下で`micro-ROS Agent`を動かせること|


## 第2報以降の章立て（予定）

- 第1報（本記事）
  - ゴールイメージとしてのデモンストレーションとIMUデバイスの仕様
- 第2報
  - IMUデバイスのハードウェア
      - Schematics
  - IMUデバイスのファームウェア
      - 開発環境設定（ArduinoIDE）
      - Arduino Sketch
- 第3報
  - センサデータ可視化のためのReliability Policy変換ノード
      - ソースコード
- 第4報
  - デモシステムの構成
      - ホスト側コンピュータとしてのRaspberryPi4Bセットアップ
          - USBメモリからのUbuntu20.04ブート
          - micro-ROS Agentのビルド
          - Reliability Policy変換ノードのビルド
      - Android端末でのrqt_plot表示
          - Android端末へのUbuntu18.04デスクトップ環境構築（USERLAND，VNC Viewer）
          - ROS2 Dashingのインストール

# 参考資料
1.[ROS/ROS2 Advent Calendar 2020][1]
2.[micro-ROS][2]
3.[micro-ROS for Arduino][3]
4.[ros2arduino][4]
5.[@MAEHARA_Keisukeのポータル記事][5]

[1]:https://qiita.com/advent-calendar/2020/ros
[2]:https://micro-ros.github.io/
[3]:https://github.com/micro-ROS/micro_ros_arduino
[4]:https://github.com/ROBOTIS-GIT/ros2arduino
[5]:https://qiita.com/MAEHARA_Keisuke/items/31faa68cf5c51831acc6