mROS：組込みデバイス向けROSノード軽量実行環境の使い方

補足：mROSは日進月歩で(？)開発が進んでいます．
この記事は2018年2月時点の執筆記事となっているため，手順に一部古いところがあったりします．2018年12月時点の下記記事も併せてご参照ください．

- [mROSの開発環境とビルド＆実行方法：Advent Calendar 2018版
](https://qiita.com/takasehideki/items/7d783ecd605dcee29ee0)

## はじめに
TOPPERS/ASPカーネルとlwIP(mbed)を使用して，ROSシステム(マスタとノード)との通信をサポートする環境を作った(mROS)．
組込みデバイス上でROSチックに記述したコードがROSノードとして動く，ということを目的に設計した．
ROSマスタが動作するホストデバイスとその他のエッジデバイスとで構成される分散ロボットシステムを想定し，組込みデバイス上でROSノードが実行できるようになれば，エッジデバイスとして活用することが可能になる．
<img width="500" alt="mROS概要" src="https://qiita-image-store.s3.amazonaws.com/0/98159/01f0af3b-88f8-e7ed-9e7e-10df4fbde2eb.png">
雑に言ってしまえば，"トピックを購読出版するための軽量ライブラリ"．
mROSで実行するアプリケーションはROSのAPIを使用して記述できるように設計した．

- 分散ロボットシステムの省電力化
- リアルタイムシステムの設計が容易になる(かも)
- ROSAPI互換でアプリケーションが記述できる→パッケージの再利用が可能(?)

みたいなことが可能になる．


## 使いかた
### 使用する環境
#### デバイス
- UbuntuPC :(ROSを動かすホストデバイス，今回はUbuntu14.04LTSにROSindigoを導入)
- GR-PEACH :(mROSを動かすエッジデバイス)
- WindowsPC :(mROSアプリケーションの開発環境，今回は10を使用)

#### ソフトウェアコンポーネント
- mbed : (https://github.com/ncesnagoya/asp-gr_peach_gcc-mbed.git)
- TOPPERS/ASPカーネル : (http://toppers.jp/index.html)
- mROS : (https://github.com/tlk-emb/mROS.git)

### 導入
作業ディレクトリを\<git_clone_dir>とする．

1. asp-gr_peach_gcc-mbed のclone
  * `$ cd <git_clone_dir>`
  * `$ git clone https://github.com/ncesnagoya/asp-gr_peach_gcc-mbed.git`
2. 本リポジトリのclone
  * `$ cd <git_clone_dir>`
  * `$ git clone https://github.com/tlk-emb/mROS.git`
3. TrueSTUDIOからプロジェクトを設定する
  * <git_clone_dir>/mROS/truestudio をworkspaceとして指定して開く  
  <img width="500" alt="mROS概要" src="https://qiita-image-store.s3.amazonaws.com/0/98159/7ea1e096-93fb-0e86-1535-ae6d4f6baa55.png">
4. プロジェクト・エクスプローラーにプロジェクトが反映されていない場合
  * ファイル > インポート > 一般 > 既存プロジェクトをワークスペースへ
  * ルートディレクトリの選択: <git_clone_dir>/mROS/truestudio/(application_folder)
5. TrueSTUDIO上でビルドする
  *  TrueSTUDIOでプロジェクトをビルドすることで，asp.binが生成される．
  *  このファイルをUSB接続したmbedデバイスにドラッグ\&ドロップすることでプログラムを動作させることができる．
![asp_bin.png](https://qiita-image-store.s3.amazonaws.com/0/98159/9548c31e-b5f3-0623-8eb2-43d6b9bb885a.png)

以降で，具体的にアプリケーションを実行する場合の手順を説明する．

### アプリケーション実行例
今回は，mROSに含まれているappの実行手順を説明する．
appでは，
- パブリッシャ：超音波センサの値を文字列として出版
- サブスクライバ：制御命令を購読してLEDを点灯させる
というROSノードが記述されている．

#### ROSマスタIPの設定
現在，mROSでは静的なIPアドレスの割り当てができないため，ルータを使用してDHCPによるIP割り当てを行う．

まず，ROSマスタのIPを設定する．
##### mROS側の設定
/mROS/mros-lib/mros.cpp：15行目のmaster_ip変数にホストデバイスのIPアドレスをセットする．
##### ROS側の設定
ホストデバイスではROSのマスタURIとホストネームを指定する．
`$ export ROS_MASTER_URI=http://(IP_ADDRESS):11311`
`$ export ROS_HOSTNAME=(IP_ADDRESS)`

#### 実行
mROSのappをビルドして，GR-PEACHに焼く．
通信用ROSノードとして，/mROS/mros_testフォルダをcatkin_wsの/srcにコピーし，catkin_makeでビルドすることで実行可能になる．

先にホストデバイス側で，ROSマスタ，mros_talker，mros_listnerを実行する．
その後GR-PEACHのリセットボタンを押すことでmROSを実行する．

超音波センサをつないでいなくてもトピックのやり取りは観測できるはず．
![S__14639109.jpg](https://qiita-image-store.s3.amazonaws.com/0/98159/fafcc7ab-3b12-1899-8f3d-30008c79c707.jpeg)
![S__14639106.jpg](https://qiita-image-store.s3.amazonaws.com/0/98159/d085be32-dc16-a0b4-faed-f119e5e763cd.jpeg)
![Screenshot from 2017-07-19 16_37_18.png](https://qiita-image-store.s3.amazonaws.com/0/98159/e10de59b-0c67-da9e-0b62-83e8a45e16dd.png)

camera_appはカメラシールドを装備したGR-PEACから画像データを出版するアプリケーションになっている．

#### 使えるAPI
- ros::init()
- ros::NodeHandle
- ros::NodeHandle::advertise()
- ros::NodeHande::subscribe() ※コードのほうはsubscriberで実装してました修正予定
- ros::Publisher::publish()

対応しているデータタイプ等の制限はあるが，これらのAPIでノードをトピック通信ができるノードを記述可能である．

## まとめ
- mROS：TOPPRES/ASPカーネル+mbedでROSノードの実行環境を実現
- ROSシステムのメタ通信とトピックのデータ通信を実現

もっとわかりやすく書けとかなんでもいいのでご意見ください．