迷路探索小型ロボット「マイクロマウス」の紹介

![IMG_0932.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542702/8fd1f4ed-e855-aebb-d90a-c37d2f707fd4.jpeg)

ドコモのアドベントカレンダーを見てくださった皆さま、こんにちは。
NTTドコモ 先進技術研究所 一年目社員の山田です。

私の普段の業務はサービス系の研究開発で、どちらかというとIT系の分野に取り組んでいるのですが、趣味は電子工作で、大学時代は専らロボコンに出たり、気の向くままに個人製作をして遊んでいました。

今回は私が作った（これからも作っていきたいと思っている）迷路を探索するロボットを紹介したいと思います。




# どんなロボットなの？
一言でいうと、自律制御で未知の迷路を走破する独立二輪ロボットです。
ロボットの目標は、下の写真のような迷路（N×Nの格子から成り、ところどころ格子の辺に通り抜け不可能な壁が存在する）をスタートからゴールまで壁を避けながらたどり着くことです。
![IMG_0938.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542702/b6702542-ee27-795c-723f-2edeee92aab5.jpeg)
(迷路上の白い線はロボットがまっすぐ走れているか目で見て分かりやすくするためのものなので、実質的な意味はあまりないです。)

想定としては、

- 迷路のサイズNは既知、各格子の寸法も既知
- スタート位置、ゴール位置は既知
- 必ずスタートからゴールまでの何かしらの経路は存在する。
- それ以外の情報は未知
- ロボットは自律制御で、いかなる遠隔操作も行われない

という感じです。

公式大会として、NTF財団が主催運営する[マイクロマウス](https://www.ntf.or.jp/mouse/)というロボットコンテストがありまして、そちらのルールではざっくりいうと、

- 柱（格子の頂点）に最低限一つの壁が存在する。
- 持ち時間T分の中で、M回までの走行（競技者がロボットのスタート宣言をしてから、競技者がロボットに触れるまでが１走行）が認められる。
- M回の走行のうち、スタートからゴールまでの最短時間を各競技者で競う。
- 迷路サイズNは32もしくは16、走行回数Mは5、持ち時間Tは5分から10分ぐらい

ということになっています。

さて、未知の迷路を自律制御で走破するには、ロボットにはどんな機能が必要でしょうか。
最低限必要なのは、ロボットの移動のための機構、壁の存在の検知手段、自己位置を推定するための手段といったところです。
私のロボット（ロボット名：Hound, 名前の由来：その瞬間瞬間の想定座標をひたすらトレースするプログラミングになっているので）は下写真のようにそれらの機能を実装しています。
![IMG_0937.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542702/b235b4eb-f197-a0c8-0e61-5dacf17e229a.jpeg)
赤外線センサと赤外線LEDはロボット前方に四組付いていて、4つのそれぞれの赤外線センサが取得した壁からの赤外線反射量から、機体の前方と左右の壁の存在を検知します。

自己位置推定のために機体のホイールの車軸に磁石が付いていて、その磁石の正面に磁気センサICがついています。この磁気センサICは磁界の回転を検知して正面の磁石が何度回転したかをピンポイントで教えてくれる便利なセンサとなっています。ゴール座標とスタート座標は既知ですのでホイールの回転数から自分がどこを走っているかとゴールまでどれぐらい離れているかが分かるわけです。


# どうやって作ったの？
### 回路図を描く
まず回路図を描きます。
画像が荒くて（回路も汚くて）申し訳ないのですが、下図のような感じで必要な部品を置いて、部品同士に電気的な配線(緑色の線)をつなぎます。
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542702/8ac2390a-e048-273c-d3d8-5da9521f0de8.png)
真ん中のでかい正方形みたいなのがマイコン（CPU的な存在）でこれにプログラミングを書き込みます。
そしてマイコンに必要なセンサ(赤外線センサや磁石の回転を読み取るセンサIC)や駆動系(モータやモータを駆動するIC)をつないで信号のやり取りをできるようにします。
そして各ICに電源がいきわたるように電源電圧(4Vくらい）をつないでやれば完成(ざっくりすぎて申し訳ないです)です。


### 配置図を描く
次に各電子パーツの物理的な配置を設計します。
先ほどの図が電気的なつながりだけだったのに対し、こちらの図ではパーツとパーツの位置関係（何センチ離れているかなど）を明記してやります。
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542702/4d8dc84e-d89e-7b16-0ac1-89b70854f1b7.png)
水色の線で電子パーツが描かれています。
赤い線が基盤の表面の配線で、緑の線が裏面の配線となっていて、2層構造で配線が基板上に張り巡らされています。
白い穴、黄色い穴が基盤の表面と裏面を繋ぐジャンクションになっています。

この図の情報を基板を作ってくれる工場に発注します。



### はんだ付けと組み立て
工場から届いた基板にはんだ付けをして、3Dプリンタで部品を作ってくれる会社に発注した部品(歯車やホイール)をくっつけると完成です。
![IMG_0927.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542702/0f2c6b49-ab3a-f7aa-8347-6b4bcdbdc7ab.jpeg)
モーター(銀色の筒状の物体)とホイール付き車軸を3Dプリンタで出力したプラスチック(黒色)に埋め込み、それを基板にネジ止めしています

ネジを外すとこんな感じです。
![IMG_0930.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542702/bd5f98b5-f50f-a514-96eb-e55750d44d84.jpeg)
基板に垂直に立っているのが磁気センサICです。


裏面はこんな感じです。機体の前後に家具スベールが貼ってあります。
![IMG_0931.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542702/dde28710-6987-e767-d7ef-78c81305815b.jpeg)


# どう動くの？

いくつか実際に動いている例をお見せします。
（実際のロボコンでは16×16や32×32の大きさの迷路に挑戦します）

まず探索走行です。
スタートは一番左下の格子、ゴールは一番右下の格子です。
スタートから最短でゴールの方向に向かおうとして、壁に阻まれ、方向転換をして、次に最短となる道筋でゴールを目指す...ということを繰り返しています。
（一応ゴールしたらしばらく間をおいてスタートまで戻ります）
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">探索走行１ <a href="https://t.co/UMQ0wJvR8h">pic.twitter.com/UMQ0wJvR8h</a></p>&mdash; qwrts (@qwrts2) <a href="https://twitter.com/qwrts2/status/1201872231032377344?ref_src=twsrc%5Etfw">December 3, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

次に第二走行として、探索した迷路から壁の存在を加味して最短の道筋でゴールへと向かいます。
探索とは違う経路をたどっていることと、迷路が小さいのでわかりにくいですが、直線時に加速してスピードを上げているのがミソです。
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">最短走行１ <a href="https://t.co/XVsR8OMPO8">pic.twitter.com/XVsR8OMPO8</a></p>&mdash; qwrts (@qwrts2) <a href="https://twitter.com/qwrts2/status/1201872764170313736?ref_src=twsrc%5Etfw">December 3, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

違う迷路のパターンの例です。
探索走行では迷わずゴールまでたどり着いて、スタートへの帰り道で違う経路を探索しています。
そして最短走行で、探索の帰りに見つけた経路を実践しているのがミソです。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">探索走行２ <a href="https://t.co/z1XRieueCa">pic.twitter.com/z1XRieueCa</a></p>&mdash; qwrts (@qwrts2) <a href="https://twitter.com/qwrts2/status/1201872559836467204?ref_src=twsrc%5Etfw">December 3, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">最短走行２ <a href="https://t.co/Zf47xpNecx">pic.twitter.com/Zf47xpNecx</a></p>&mdash; qwrts (@qwrts2) <a href="https://twitter.com/qwrts2/status/1201872640589336583?ref_src=twsrc%5Etfw">December 3, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


# 終わりに
全体を通してざっくりした説明になってしまい申し訳ありませんでした。
「マイクロマウス」で検索して頂けると各センサの詳細や多様な探索アルゴリズムなどについて解説している記事がでてくると思いますので、興味があれば是非。

直接的に現在の業務(IT系サービスの研究開発)に結び付きにくい趣味ではあるのですが、いずれサービスのデモロボットとか、開発したIT技術が組み込まれたデバイスとかの作成みたいな形で活かせればと思っています。