ROS を使って Unity の仮想車両をマイコンシミュレータで制御する

#概要
ROS を使って Unity の仮想車両をマイコンシミュレータ上のプログラムで制御してみました．

自動運転制御系の開発で，車両制御をビジュアライズする手法としてはよくある感じなんですが，今回，TOPPERS の オープンソースを組み合わせて構築することに成功しましたのでご紹介します．

今回作成した構成は下図の通りで，青色のものが TOPPERS オープンソースです．残りは，ROS と Unity なので，いずれもフリーで利用可能です．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244147/e742bbfc-4e08-a2db-bfc7-679f1aa085ad.png)


2019/08/02-03の京都[オープンソースカンファレンス](https://www.ospn.jp/osc2019-kyoto/)の TOPPERS ブースにてデモ/説明させて頂きました．ご来場いただいた方々，ありがとうございました！
★ここで作成した成果は，ETロボコンにも応用可能ですし，
★自分の[ノルマ](https://qiita.com/kanetugu2018/items/833da7a268a3f34bead4)でもありますので，年内には一般公開します．
★乞うご期待ください！

以下，デモでお見せした内容をまとめます．

#Unityの登場物
まず，Unity上の登場物は以下の通りです．

##車両
今回作成した車両は下図のとおりで，見栄えはまだパッとしませんが，「走る」，「曲がる」，「止まる」は制御可能にしています．


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244147/65edb2a1-15aa-2aff-b919-637a229137ba.png)

ちなみに，この車両は以前，下記でご紹介したものを発展させたものです．

https://qiita.com/kanetugu2018/items/a6411ee86b2ed404031b


##障害物センサ
車両の先頭部分には障害物センサを付けました．青色のキューブです(浮いてますが・・)．
前方20m先の障害物を検出します．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244147/88434582-17c8-c9c4-044a-657c994ed44b.png)


##ライントレースセンサ
将来的にETロボコンでも使えるようにライントレースセンサを付けました．
下図の通り，車両の下にカメラをつけてテクスチャの色を数値変換してセンシングしています．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244147/13ba58ea-2a2b-1901-bc90-8367ccbad7a9.png)

##仮想マイコン
車両にマイコンをアタッチしている感をわかりやすくするために，マイコンのテキスチャ付けました(単なる遊び心です^^;)．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244147/b430b0bc-c42f-0488-02f3-d49f40b3d03c.png)

##走行コース
シンプルに四角状の道路を作りました．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244147/3a6cedec-3dbc-3296-77c4-ecb490b491f9.png)

##障害物
道路上にド～ンと壁を置きました．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244147/ed9a49da-ebeb-e553-b446-e08e3a03f41a.png)

あと，移動する邪魔者も置いてます．方向キーで自由自在に移動できます．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244147/2e3bd643-2f17-c706-0508-7c5a3ab2693d.png)

#マイコンシミュレータの登場物
##マイコンシミュレータ
マイコンシミュレータは，最近売り出し中の TOPPERS/athrill を使っています．TOPPERS の RTOS を動作させやすいです．athrillの紹介は下記記事を参照ください．

https://qiita.com/kanetugu2018/items/1f2ef93c9e1fa7a29f97

##TOPPERS/RTOS
車両制御アプリケーションをマイコン上で動作させるためのリアルタイムOSとしては，TOPPERS/ASP を利用しています．

https://www.toppers.jp/asp-kernel.html

##TOPPERS/mROS
マイコン上で ROS を利用するためのありがたいミドルウェアとしては，TOPPERS/mROS を利用しています．

※mROSについて詳しく知りたい方は，本家サイトを参照ください．
※https://qiita.com/takasehideki/items/7d783ecd605dcee29ee0
※https://qiita.com/m_ksg/items/0060a8738e6a34a0f237

##センサ/アクチュエータ
センサ/アクチュエータ処理は，基本的には ROS トピックの出版/購読で実現しています．
トピック情報としては下図のような感じです．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244147/7cb806de-74f7-ff2f-bd02-8f3cf34cbb04.png)

vehicle_controller ノードが，車両制御指示用のトピックを出版しています．
vehicle_sensor ノードは，車両のセンサ情報を購読しています．

rosbridge_websocket が中間にいますが，Unity と マイコンシミュレータの間に rosbridge が存在しているためです．

##車両制御
車両制御としては，まだあまり高度なことはやっていません．
シミュレーション実行時に直進開始させ，障害物検出したら一時停止させるくらいの制御です．
※将来的には MATLAB/Simulink で作成したコードを使ってみたいと考えています．

#デモ
論より証拠，デモをお見せします．

![mROS_unity_CAR2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244147/a00ee66f-e725-065d-e83c-445f45ac02f8.gif)