ROS制御のレゴ・メカナム・ホイール・カー (1) 組み立て編

[SENSYN ROBOTICS（センシンロボティクス） Advent Calendar 2019](https://qiita.com/advent-calendar/2019/sensyn-robotics) の 13日目 担当の @nishimoto_ です。


<img alt="IMG_0405_s.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542895/9ea9d064-fd7d-2337-afbb-50924b33259a.jpeg" width="75%">

# ゴール

イチからROS制御できる車両ロボットを作ってみたいと思います。どういうルールで作るか、つまりしばりを決めて進めようと思うのですが、以下のようにしたいと思います。

-  フレームやシャーシなど、メカ部品は全てレゴで作る。
-  レゴ純正の部品バリエーションに存在しないものは、レゴ互換の物を使う。
-  ROSで制御する。
-  ラジコンとして操縦できる。
-  手元にある物を極力流用する。

前編が組み立て編、後編がソフト編でお届けしたいと思います。

# なぜメカナム・ホイール・カーを作るの？

DJIが発売したRobomaster S1、すごいですね。メカナム・ホイールと強力なモーターの馬力のおかげで、通常の車輪の車両ではあり得ない動きをします。また最近、それをハックしてROSで動かそうという~~狂人~~、もとい猛者も現れました(褒め言葉)。その記事は[RoboMasterS1を解析してROSで動かす！（みんなで動かそう編）](https://qiita.com/tatsuyai713/items/aa338d6b07af11bde88a)。もう凄すぎてため息しか出ない。
  
自分はメカナム・ホイールを扱った経験がないので、まずはメカナム・ホイールの仕組みを動かして理解するところから始めたいと思います。そして上手くいけばそれをどんどんROSで拡張して色んなことを試したいと思います。（雑ですが）そうやってると最終的に何かできるロボットができると思います。
  
なお、メカナム・ホイールの動作原理については[オムニホイールとメカナムホイール – Suzaku Lab. note - ](https://note.suzakugiken.jp/omni-mecanum-wheel-difference-ref-a/)が参考になると思います。

# 買った部品

## メカナム・ホイール

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542895/e214f646-5bcb-17ef-282d-a139a8622650.jpeg" alt="mecanum product" width="60%">

レゴ純正には残念ながらメカナム・ホイールは存在しません。またさらに残念なことに日本のeコマースサイトでは見つかりません。中国の[アリババ](https://ja.aliexpress.com/item/4000164280199.html)で買いました。  
  
3Dプリンタ用のデータも色んな方が公開しているので、最初はそれで作ることを考えたのですが、素材がネックになりました。大きな車輪の周りに斜めに配置されている小さい車輪をプラスティックで作ると床をグリップできず空回りします。そうすると横向きの力が逃げてしまい、メカナムホイールとして正しく動作しません。**メカナム・ホイールの小さい車輪はゴム製であること**は必須要件です。

## サーボモータ

-  5Vぐらいで駆動出来るサーボモータ
-  軸や筐体がレゴ互換の物

という条件のものを探しました。同様に中国の[Banggood](https://www.banggood.com/ja/Kittenbot-6V-360-Rotation-Programmable-Servo-Compatible-With-Microbit-Raspberry-Lego-For-DIY-RC-Robot-p-1561666.html?rmmds=search&cur_warehouse=CN)で見つけましたので、発注してドンブラコと2〜3週間ぐらい待ちます。品質は当たりハズレがありますので、時間を無駄にしないために欲しい数の1.5〜2倍の個数を買います。

<img alt="servo.jpeg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542895/560eca7e-01f2-59a9-181e-21459a04b425.jpeg" width="50%" >

## オリジナルのサスペンション用バネ

レゴにはサスペンションの部品が純正であります。ただこれが少しサイズが大きいのと、バネの反発力が強くて扱いが難しかったです。なので、↑のサーボの形を利用して、サスペンションの仕組みを作りました。仕組みは後述します。

<a href="https://www.amazon.co.jp/gp/product/B074T5TLPX/"><img alt="バネ.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542895/ec5d7795-09ec-d766-800b-cbc3a01b04ea.jpeg" width="50%"></a>


[Amazon](https://www.amazon.co.jp/gp/product/B074T5TLPX/)でレゴの軸に合うバネを買いました。

## モータードライバー

<img alt="motor_driver.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542895/27480105-b65e-cbda-ab19-e93c31596767.jpeg" width="50%">

[アマゾン](https://www.amazon.co.jp/gp/product/B01D1D0CX2/)でHiLetgo社のPCA9685 16チャンネル 12-ビット モータードライバーを購入しました。激安だったので品質が心配でしたが、問題なく動きました。

## 持っている流用した部品

<img alt"IMG_0460.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542895/683134ae-12bf-a056-fb34-6cdc8623d427.jpeg" width="50%" >

*  レゴテクニック。レゴ廃人なのでアホほど持ってます。
*  Raspberry Pi 3B+
*  モバイルバッテリー (3A出力)
*  単三電池が2個入る電池ボックス x 2個
*  単３型のエネループ 4個
*  トグルスイッチ1個、プッシュスイッチ2個
*  ブレッドボード用のケーブル
*  PS3コントローラ

# 組み立て

## レゴで箱を作る

ざっくりレゴでお弁当箱のような形状を作り、中に電気系の部品を入れるようにしました。サイズもなんとなくですが、気持ち大きめに作りました。レゴの良いところは何度でも作り直しができることなので、何度やり直しても苦になりません。

<img alt="IMG_0394.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542895/233bf62c-a71b-2ea5-e6f0-448b137a9285.jpeg" width="50%" >
<img alt="IMG_0395.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542895/c443234d-602e-72e5-e14b-2b7d0f1c8c3f.jpeg" width="50%" >

## サスペンション

メカナム・ホイールを動かしてみて分かったのですが、各車輪4個はそれぞれ異なる役割を持っています。もし一つでも機能しない状態になると、期待した移動になりません。メカナム・ホイールが機能しなくなる原因の一つに、**床と接していない**状態が考えられます。物を床に置いたときに3つの接点があれば安定します。そこに4つ目の点を加えて床に接するようにするには、**４つの点が完全に水平であること**が条件となります。これを実現する方法がサスペンションです。自重によりサスペンションが沈むことで4つの車輪が床に接するようになり(*)、4つとも床をグリップします。
  
(*厳密には「接していない時間を最小限にする」対策といえます。そもそもメカナム・メカナムの外周には小さな車輪が付いているので、厳密には真円ではありません。動かしてみると、次々と小さな車輪が床を蹴っているみたいに、小さくポコポコ跳ねながら回っているように見えます。)  
  
サスペンションを作ったと前述しましたが、作ったといってもレゴのAxle(軸)をバネに通してサーボをバネの下に配置するだけです。
  
伸びてる状態  
<img alt="サスペンション 伸び" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542895/cf1a0c5b-8f88-44d9-9ac4-60687fa82b87.jpeg" width=60%>


縮んでる状態
<img alt="サスペンション 縮み" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542895/76f67c49-1ff5-97e5-81c6-0790ebf293bb.jpeg" width=60%>

# 電気系部品を入れたところ

<img alt="IMG_0387.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542895/d88e1e15-361f-420d-2962-34f7a4b160e9.jpeg" width="70%" >

レゴの箱に電気系部品を入れます。特に固定せず置いただけです。  
  
サーボモーター4個とモータードライバーとラズパイの接続方法については、[adafruitのサイト](https://learn.adafruit.com/adafruit-16-channel-servo-driver-with-raspberry-pi/hooking-it-up)の通りです。サーボモータを挿す位置は

*  0:右の前
*  1:右の後ろ
*  2:左の後ろ
*  3:左の前

と時計回りにしました。16chのうちどこに挿すかは、好みの問題です。  
  
電池ボックスとモータードライバの配線時にトグルスイッチを挟んでいます。これでモーターの電源をON/OFFします。デバッグしているときはモーターが動いて欲しくないので、この切り替えは必要です。
  
プッシュスイッチの一つはライズパイの23番PINとGNDに接続しています。このスイッチを押せばラズパイを安全にシャットダウンできます。ラズパイはSDカードをストレージに使っており、動作中に電源断するとストレージが死ぬ可能性が非常に高いです(何度も痛い目にあった)。この対策は必須です。ソフト設定の方法は後編で紹介します。  
  
もう一つのプッシュスイッチはモータードライバーのSCLポートとGNDに接続しています。給電状態でラズパイの3番PINをHIGHにするとシステムが立ち上がるのですが、モータードライバーとのI2C通信が専有しています。このモータードライバーはピンが左右に1つずつ出ていますので、片方をラズパイと接続、もう片方の一部をスイッチと接続しています。こちらはソフト設定なく繋げれば動作します。

# 完成

~~自分の娘たちが気に入るように~~前後の向きが分かるように便宜上レゴの人形を置いて完成です。
<img alt="IMG_0403.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542895/41d5192d-99af-352a-b4b0-fb163c54673f.jpeg" width="70%">

裏面：
<img alt="IMG_0393.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542895/62c1622a-68d4-c058-6f99-754a147daa53.jpeg" width="70%">

次回[後編はソフト編](https://qiita.com/nishimoto_/items/2a4ebea60161f847d0bc)です。ROSの導入、モータードライバーの制御、PS3コントローラとの接続などの予定です。