mROSの開発環境とビルド＆実行方法：Advent Calendar 2018版

（この記事は「[ROSアドベントカレンダー Advent Calendar 2018](https://qiita.com/advent-calendar/2018/ros)」の2日目です）
昨日は @hakuturu583 さんの「[LGSVL SimulatorとAutowareによる自動運転チュートリアル](https://qiita.com/hakuturu583/items/297adfd8ad0fa54d1a24)」でした．私もこの自動運転シミュレータ触ってみます！


# [mROS](https://github.com/tlk-emb/mROS)ってなにそれ？

[mROS](https://github.com/tlk-emb/mROS)は，**組込みデバイス向けのROS1ノード実行環境**で，要するにROS1コアコンポーネントのシュリンク版です．
ROS1はUbuntuのミドルウェアなのでリッチなプロセッサで動かすことが前提になり，省電力化やリアルタイム性の確保が困難となります．この問題を解決する方策として，私たちは組込みマイコンでも動作するROS1実行環境を研究開発しています．ROSのAPIと互換性を（だいたい）持たせて設計していますので，大きな強みとして既存のROS1パッケージ資産を組込みデバイス上にそのまま流用することが可能となります．
~~ROS2の話しはしていません．~~

![overview.jpg](https://qiita-image-store.s3.amazonaws.com/0/240349/19551c8e-4c0d-139b-65d9-b5c6c2613843.jpeg)

今年の[ROSCon JP 2018](https://roscon.jp)で登壇させていただきました！
詳細は講演の[ビデオアーカイブ](https://vimeo.com/292065411)と[スライド](https://www.slideshare.net/takasehideki/mrosros1)をご参照ください．

この記事では，mROSの開発環境とビルド・実行方法についてのアップデートを紹介します．
2018年3月まで主な開発を担っていた @m_ksg くんが[その時点での使い方](https://qiita.com/m_ksg/items/0060a8738e6a34a0f237)をまとめてくれていますが，いろいろと構成変更を実施しているので最新版として改めてまとめることにします．

現在はルネサスの[GR-PEACH](http://gadget.renesas.com/ja/product/peach.html)を対象として開発を進めています．
最終的には，上記の講演でデモとして示しているカメラ画像から特徴点を抽出する分散システムを動かせるようになります．[AUDIO CAMERA Shield](http://www.core.co.jp/product/m2m/gr-peach/audio-camera.html#audio_camera)も購入してください．

# 開発環境

IDEとコマンドラインの両方でビルド可能になりました．開発用PCのOSもWindows/macOS/Ubuntuのマルチサポートしています．以前はWindowsのみだったのでUbuntuラブなROSユーザには残念な感じだったかと思いますが，ROS開発とmROS開発の両方が同じPCで行えるようになって，便利になったのではないでしょうか！？（なお，macOSはTrueSTUDIOが動作しないためCUIのみになります）

下記に現時点で確認済みの動作環境をまとめます．

- IDE: [Atollic TrueSTUDIO](https://atollic.com/truestudio/)
  - Windows 10 Pro
  - Ubuntu 16.04.5
- CUI
  - macOS High Sierra 10.13.6 / arm-none-eabi version 5.4.1 20160609 (Launchpad)
  - Ubuntu 16.04 LTS / gcc-arm-none-eabi version 4.9.3 20150529 (apt package)
  - Ubuntu 14.04.5 LTS / gcc-arm-none-eabi version 4.9.3 20150529 (Launchpad)

TrueSTUDIOは，Eclipseベースの統合開発環境です．現時点ではv.8.0.0, v.9.0.1, v.9.1.0のバージョンでビルドできることを確認しています．これひとつインストールすればクロスコンパイラ込みで環境が整えられるのと，GUIベースでデバッグもできるので便利です．
TrueSTUDIOの提供元であるAtollicをSTMが買収して今後の動向が気がかりではありますが，最新版でもまだGR-PEACHを対象として使えています．

~~IDEを動かす人権が提供されていない~~，もとい，CUIでゴリゴリ開発したい方／macOSでビルドしたい方（私）のために，コマンドラインの`make`でもビルドできるようにしています．
arm-none-eabiのクロスコンパイラは，基本的には[Launchpad](https://launchpad.net/gcc-arm-embedded)が配布しているものを利用してください．上記一覧のバージョンが古いのはmROSメンテナがサボっているだけです．新しいバージョンで試してみてビルドできたよ！という方は，ぜひメンテナにお知らせください．
あるいはUbuntu16.04ユーザの方は，`apt`でもクロスコンパイラを入手可能です（14.04でaptインストールされるバージョンではライブラリが古くビルドできませんでした）

```shell-session
$ sudo apt install gcc-arm-none-eabi
```

Ubuntuな方は，mROSのコンポーネントとして使用しているTOPPERS/ASPカーネルのビルドの際に，libstdc++6の32ビット版が必要となります．

```shell-session
$ sudo apt install lib32stdc++6
```

# ビルド方法

まず基本のキはGitHubからのcloneです．
mROSで使用しているTOPPERS/ASPカーネル，mbedライブラリ，GR-PEACH対応OpenCVライブラリはそれぞれのGitHubリポジトリのsubmoduleとして配置しているので，`--recursive`オプションが必須です．

```shell-session
$ git clone --recursive https://github.com/tlk-emb/mROS
```

~~ディレクトリ構成の変更を実施している最新のbranchは`restruct`なのでブランチを切り替えてください．まだ`master`にはmergeしていません．~~
→ masterにmergeして[v1.0としてリリース](https://github.com/tlk-emb/mROS/releases/tag/v1.0)しました！
下記の通りv1.0に移行してください

```shell-session
$ cd <gitdir> 
$ git checkout v1.0
```


ここからは，TrueSTUDIO版とTerminal版それぞれで説明していきます．


## TrueSTUDIO版

`<gitdir>/workspace` をワークスペースとして指定してTrueSTUDIOを起動します．
![Screenshot from 2018-12-01 14:19:19.png](https://qiita-image-store.s3.amazonaws.com/0/240349/c8143366-5d1b-0158-41a8-08706f1d5289.png)

メニューの File > Import から「Exisiting Projects into Workspace」を選択します．
![Screenshot from 2018-12-01 14:22:26.png](https://qiita-image-store.s3.amazonaws.com/0/240349/6f48e892-1bf8-c108-2daa-c8ffb9a574fa.png)

「Select root directory: 」に`<gitdir>/workspace`をBrowseして，表示される3つのProjectsを選択したままFinishです（ルーっぽいな，，，）
![Screenshot from 2018-12-01 14:22:37.png](https://qiita-image-store.s3.amazonaws.com/0/240349/4ad34dc4-603f-2570-d008-1bedbc7b43b8.png)

`<gitdir>/workspace/camera_app/Makefile`の13行目に

```makefile
USE_TRUESTUDIO = true
```

と記述されていることを確認してください．

`camera_app`プロジェクトを選択してビルドします．
下記のように`check complete`と表示されて`asp.bin`が生成されたらビルド成功です．
![Screenshot from 2018-12-01 14:24:40.png](https://qiita-image-store.s3.amazonaws.com/0/240349/a4d2770a-5c5f-c9e9-61e1-1ebcebfcd7c0.png)

## Terminal版

`<gitdir>/workspace/camera_app/Makefile`の13行目をコメントアウトするか，

```makefile
USE_TRUESTUDIO = false
```

としてください．このマクロで開発環境を切り替えています．

あとは`<gitdir>/workspace/camera_app`で`make`するだけです．

```shell-session
$ cd <gitdir>/workspace/camera_app
$ make
```

# 実行方法

ROS側とmROS側それぞれで準備が必要です．

ROSの動作するホストPCとmROSは同一ネットワーク内に存在し，ルータ等からDHCPでIPが配られていることが必要です．また，mROSの動作するGR-PEACHは有線LAN接続されていることが前提です（これらはmbedライブラリの制約です）
ホストPCのIPアドレスは192.168.11.4となっている必要がありますが，これは`mros-lib/mros.cpp`の17行目で設定変更可能です．以降の説明もご自身の環境に合わせてください．

```mros-lib/mros.cpp
/***** congiuration ros master ******/
const char *m_ip = "192.168.11.4";	//ros master IP
const int m_port = 11311;	//ros master xmlrpc port
```

## ROS側の準備と実行

`<gitdir>/catkin_ws_sample/camera_app/README.md`にも（日本語で）説明がまとめてあります．

`<gitdir>/catkin_ws_sample/camera_app/`にある3つのディレクトリをcatkin workspaceの`src/`にコピーします．

```shell-session
$ cd <catkin_workspace>
$ cp -r <gitdir>/catkin_ws_sample/camera_app/fast src/
$ cp -r <gitdir>/catkin_ws_sample/camera_app/mask src/
$ cp -r <gitdir>/catkin_ws_sample/camera_app/preprocess src/
```

あとはいつものようにcatkin_make!

```shell-session
$ catkin_make
```

`$ROS_MASTER_URI`と`$ROS_HOSTNAME`を設定してください．

```shell-session
$ export ROS_MASTER_URI=http://192.168.11.4:11311
$ export ROS_HOSTNAME=192.168.11.4
```

`roslaunch`でroscoreとホスト側のノードを起動しておきます．

```shell-session
$ roslaunch fast mros.launch width:=160 height:=120 mask:=1 rate:=10 ch:=2
```

## mROS側の準備と実行

GR-PEACHは開発用PCにUSB接続するとUSBドライブとしてマウントされます．
ビルドした`<gitdir>/workspace/camera_app/asp.bin`をGR-PEACHにコピーすることでプログラムの書き込みが行われます．少し時間が掛かります．

プログラムの書き込みが完了したら再マウントされます．
その後にGR-PEACHのリセットボタンを押すことで，mROSノードが起動されます．

シリアル出力のメッセージを確認したい方は，下記の設定でシリアル接続してください．

- connection type: "Serial"
- Baud Rate: 115200bps
- Data Bits: 8bit
- Parity: None
- Stop Bits: 1
- Flow Control: None

# camera_appの実行結果

正常に動作したら，下記のようになるはずです．
`rqt_graph`でmROSノードが分散して存在していることも確認できます．

![demo.jpg](https://qiita-image-store.s3.amazonaws.com/0/240349/461d0d9c-9a40-56da-c32a-2f755be5ccba.jpeg)

**mROS**
**すごい**


# 現在の研究開発状況とロードマップ

現在，mROSについて私たちは下記の研究項目に取り組んでいます．

- STMへの対応：CubeMXとの組合せでマイコンのコンフィギュレーションも自在に！？？
- TOPPERS/ASP3カーネルのサポート：ティックレスタイマ管理と外部時刻同期機能によって機能強化とリアルタイム性向上！？？
- catkin_makeとの統合：ホスト側アプリと個別に開発＆ビルドしなくてよくなる！？？
- MessageTypeのサポート：より便利にホスト側ノードとPub/Subできる！？？



特にMessageType対応がなかなか鬼門でして，，，
今回のデモアプリは`sensor_msgs::Image`を使っていますが，その型定義の記述はかなりハンドメイド感があります．このあたりを自動化できたら私たちも楽になりますし，ユーザさんもノード開発で便利になると思っています．
~~そして，，，基本のキな`std_msgs::String`を使ったアプリがちゃんと動かなくなりました．昔は動いていたのですが，カメラ対応している際にどうもバグが入り込んでしまったようです．がむばってbug fixしますので，しばしお待ちください．（直せたら`master`にマージします）~~
→ masterにmergeして[v1.0としてリリース](https://github.com/tlk-emb/mROS/releases/tag/v1.0)しました！


下記のロードマップもご参照ください．

![roadmap.jpg](https://qiita-image-store.s3.amazonaws.com/0/240349/fcd367b0-2531-ddac-1fa2-24962f6a6108.jpeg)

mROSについてご興味ありましたらぜひお知らせください．また，mROSでこんなのできたら嬉しいな機能や要望も大歓迎です！それに応じて優先度を上げて研究を進めていきます．



# おわりに

さてさて次回の[ROSアドベントカレンダー Advent Calendar 2018](https://qiita.com/advent-calendar/2018/ros)は〜！？？
ってスッカスカですやん，，，
ROSはオープンソースのプロジェクト／コミュニティです．ただ投稿された記事を読んでいるだけじゃなく，学んだことやら作ったことやらを発信していくことが技術成熟にも大事ですし，そしてなにより学びが大きくなるはずです．みんなで盛り上げていきましょう！

**みなさまのアドベントカレンダーへのエントリーをお待ちしています！れっつろぼっと！！**