作って分かったメカナムホイールロボットの設計ポイント

# 前置き
　ROSを使ったロボットを自前で製作したいという思いから試行錯誤を経て、 [MakerFaireTokyo2022](https://makezine.jp/event/mft2022/) で自前のメカナムホイールロボット出展できることとなりましたっ！
これを機に今回のメカナムホイールロボットを製作していった過程と共に、その設計ポイントを記載してみました。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212663/49d68a92-7b57-8449-ef11-78b4e447d4cd.jpeg" width="480">
　ちょっとハードウェアよりの内容ですが、他の方では当たり前だと思う点や、貴重な情報だと思ってもらえる様な内容まで、様々盛り込んでみましたのでご覧ください。

&nbsp;&nbsp;1.前回作ったロボット
&nbsp;&nbsp;2.浮かび上がった課題点
&nbsp;&nbsp;3.課題対策
&nbsp;&nbsp;4.メカ設計
&nbsp;&nbsp;5.SW設計
&nbsp;&nbsp;6.チューニング
&nbsp;&nbsp;7.更なる課題
&nbsp;&nbsp;8.部品追加
&nbsp;&nbsp;9.課題解消
&nbsp;&nbsp;10.参考資料

# 1.前回作ったロボット
　以前作ったロボットはこんな感じでした。このロボットによって本格的にROSを組み込んだロボットが自分のものとなり、様々勉強することが出来ました。そして様々な出会いやチャンスを頂くことができ、やはりロボットを作った意義を実感できました。
![IMG_2782.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212663/d72218e7-7292-9356-5cc1-b3a6426c1aa3.jpeg)


# 2.浮かび上がった課題点
　このロボットを動かしていった中で様々な課題が見えてきました。その課題の中で影響度が大きかったものから順番に列挙していきます。
### ①ステッピングモータのトルク不足
　これは当初から分かっていた部分もありましたが、この問題を解消するために新しいロボットを作ったと言っても過言ではありません。
　以前のロボットでは、メカナムホイール+アルミフレーム+ステッピングモータがセット品となって売られており、”これだ！”と意気込んで購入したことが、ロボットづくりの出発点であったため仕方ないとも思っています。またホイールとステッピングモータが直結した状態で売られているなら、何とか動くものが簡単にできるだろうと安易に考えていました。
![トルク問題.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212663/58c70df7-1ce1-25a1-5439-3f5171123780.jpeg)

　しかし実際には全然甘くなく、ホイールに直結されたステッピングモータで機体を動かすのは相当苦労しました。
　【苦労した点】
　　・ちょっとした加速、減速でもトルクに負けてしまいモータが脱調してしまう（ガタガタ
　　　するだけで動かない、止まらない）。そのためROSによる自動航行をさせる際にも
　　　加減速に応答できずうまく動かすことが出来なかった。
　　・動作停止時、ステッピングモータを励磁させることになるが、停止時が一番電力を
　　　食う。また停止時が一番発熱する。
　　・ステッピングモータのドライバにはモータ1個あたり1.5A程度の電流を流しており、
　　　4個で6A程度消費する。これを小さなバッテリーで動かすと20分程度しか動かすことが
　　　出来なかった。

### ②ステッピングモータドライバの発熱
　ステッピングモータドライバとして、3Dプリンタ用の基板上にドライバを4個載せて動かしていましたが、効率は約80%程度のドライバのため、残りの20％程度は熱へと変わった(12V ✕ 6A ✕0.2(20%) =14.4Wの発熱 )。これを小さなヒートシンクで冷やすには限界があり、何度もモータドライバを焼き壊してしまいました。
![ステッピングモータドライバ発熱.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212663/7ed29e7f-77f8-b1b1-eab5-07f8182cf3ad.jpeg)

### ③ロボットの重さ
　最初に作るロボットであるから、頑丈に作って”何が起きても壊れない”様に設計しました。そのためアルミフレームをBOX型に組み、その隙間に各ボードや構造物を配置しました。確かに頑丈そのもので壊れる心配がないため、いろいろな事をチャレンジできる機体に仕上がったのは良かったです。しかしアルミフレームをBOX型で組んだ分だけ重量も重く、全体で8kg程度となって機体の加減速にも影響を及ぼしていました。更にステッピングモータも出力の割に重く、この程度の機体には不釣り合いな重さ(4個で約1kg)でありました。
![アルミフレーム重量.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212663/8462bcae-b167-6379-7d91-6b4e3ea5dfcd.jpeg)


### ④ホイールの滑り
　メカナムホイールの特徴である前後進、左右、旋回移動が出来るようにするため。アルミフレームにモータ固定用のブラケットを取り付け、4輪のモータを同時に動かせるようにしていました。しかしアルミフレームの組立によって生まれた僅かな歪みによって、4輪全てが地面にちゃんと接地せず、ホイールが空転してしまうため、アルミフレームとブラケットの間にシム（薄いワッシャーなど）を入れて4輪全てが接地できるよう工夫しました。しかし僅かな地面の凹凸や歪みでもホイールは空転してしまい、思ったような動きにならない場面も多くありました。
![メカナムホイールの接地.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212663/ec6a2701-ff35-0078-1c15-93b9fce2b7cd.jpeg)


### ⑤オドメトリの取得
　実際ROSを使ったロボットを作る上で、自分の位置（自己位置）を知る必要があり、少なからずオドメトリを出力する機器が必要となります。その際、ステッピングモータを使えばステップごとに決まった角度で動くため、進んだ距離、スピードを算出するのは比較的簡単に出来ました。しかし上記の様な加減速による脱調や、地面の凹凸によってすぐに実際と取得したオドメトリの値がずれてしまい、あっという間に自分の位置を見失って崩壊していく場面が幾度となく繰り返えされました。
![オドメトリのズレ.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212663/27ab550d-cb15-365f-3c24-ba184cae3f6f.jpeg)


### ⑥RealsenseD435とRealsenseT265の組み合わせ
　上記の様に簡単に自己位置を見失っていたため、オドメトリの取得方法をモータのステップ数ではなく、センサ出力できるRealsenseT265を使って動かしてみたところ、自己位置については大分解消されました。この経験は本当にためになりました。更にRealsenseD435を組付けたことで3D点群を取得できるようになり、rtabmapと呼ばれる3D-SLAMや周囲の認識も格段と良くなりました。良かった反面、RealsenseD435の検出範囲（角度）だと限られた範囲でしか3D点群を取得できず、これ1台で周囲の障害物を認識するのは難しいと分かりました。
![オドメトリ.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212663/af2afcf3-d26c-7896-8a5d-3faeec9e320e.jpeg)

### ⑦LiDARの太陽光問題
　以前使っていたLiDARでは太陽光にとても弱く、日が入る窓ガラスの方へ向くだけでも日光によるノイズが混じり、ノイズ成分を障害物だと認識してしまい、拳銃で打たれたかの様にバシッ！バシッ！ノイズが入り障害物だと誤認識して向きを変えて（機体が退避して）しまいました。
![太陽光のノイズ.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212663/9c045eca-71f1-cb59-6783-adb7571f912c.jpeg)


### ⑧アームのリンク機構
　こちらの機構としては一見リアウイングにも見える形状から、アームが上方に持ち上がった後、前方の物体を掴む機構になっており、なかなか面白良い機構ではありましたが、ROSのjointを意識した機構になっていないため、うまく動作を再現できない課題がありました。
　![リンク機構アーム.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212663/68c7a972-b426-f448-2e7f-ad3d2e204ce6.jpeg)

# 3.課題対策
　上記課題に対して以下の対策を施したロボットがこちらです。
![DSC_0791.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212663/49d68a92-7b57-8449-ef11-78b4e447d4cd.jpeg)

### ①ステッピングモータ→DCギアドモータにする
 実際はブラシレスモータにしたいとも思っていたのですが、制御基板が大きい様に見えたのと、高い発熱量を抑えつつコンパクトに収めるには、様々な犠牲を伴い、結果的に全てが中途半端なものになると考え不採用にしました。この考え方は今回のロボットでは意外と合っていたと思います。また減速機のギア比1:100程度としており、機体のイナーシャにも十分勝てる動きを達成できました。
![DCギアドモータ.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212663/95213ee8-0cb2-57bc-eee5-b02fb525a948.jpeg)

### ②DCモータドライバで動かす
　ステッピングモータドライバに比べて、DCモータドライバは安くてしっかり動く！そう思いました。モータドライバとしてはこちらを購入したのですが、もちろんステッピングモータの様に停止時に発熱することも無く、動きも以前と比較にならない位機敏になりました。
https://products.suzakugiken.jp/cytron/cytron-mdd3a/
　余談になるかも知れませんが、それでもモータドライバ単体では回生エネルギーをうまく処理しきれない様で、そのままの値を入れて動かすと、減速時に回転速度を保持しようとする回路構成になっており、当初モータを止めることが出来ませんでした。しかし簡単なPD制御を組み込むと、あっさりとキレイに動くようになり満足できる制御が出来ました。
![ステッピングモータドライバ.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212663/e643211d-09f9-967c-25e3-1fa7850353aa.jpeg)


### ③ロボットの軽量化
　軽量化をする上で以前はアルミフレームをBOX構造に組んでいましたが、ここまで豪華にしなくても、そこそこな剛性を保つことができると考え、基本的な足回りは金属部品で剛性を確保しつつ、その他の箱部分は樹脂板を使って作り上げることにしました。これらの結果現在の重量は約7kg程度。あれ？あんまり軽くなってないｗ？それはアームやサスペンションなど追加した部品も多いため、相殺されてしまった部分も多かったですｗ。
![軽量化.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212663/7ef97768-1094-35ec-5fd5-00a8ca1dc1ca.jpeg)


### ④サスペンションをつける
　メカナムホイールで動かすには、4輪全てにしっかりとグリップ力を与えなければキレイに動かせません。また上記の様にちょっとした凹凸でも滑ったりするため、サスペンションを取り付けることでそれらを吸収させる様に考えました。サスペンションとしてはラジコン用に売られている部品を購入し、現物の反発力、ストロークを確認した後、中のコイルスプリングをカスタマイズして別途購入しました。
![サスペンション.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212663/bd8088f6-3ce6-ba75-df96-482227d75b2d.jpeg)



### ④ZED2を取り付ける
　Realsenseでは物足りなくなった私には、ZED2がキラキラ輝いて見えました！これがあればRealsenseD435とRealsenseT265の機能を1つでまかなえ、かつRealsenseD435よりも広角な範囲で３D点群を取得できることができ、とても役立っています。更に良かったのはこれで人物認識、骨格認識ができ、簡単に難しいとされていた3Dの物体認識ができるようになりました。
https://www.stereolabs.com/zed-2/

### ⑤JetsonXavierNXを搭載
　上記ZED2を使う条件としてCUDAを使えるボードでなければなりません。そこでコンパクトなボードでCUDAが使えると行ったら"Jetson"しか無いでしょう。そこでJetsonNanoよりも処理性能の高いJetsonXavierNXを搭載することにしました。良かった点として、この程度の消費電力であればマキタ18Vのバッテリーでも動かせるため、バッテリーの交換が容易に出来る構造を確保できました。またJetsonXavierNXを機体のほぼ中央に配置しており、通常であれば熱が籠ってしまいすぐに壊れてしまう可能性がありますが、JetsonXavierNXの直近に吸気口と排気口を設けることで最大限に動作させても常温で65℃程度で動かすことが出来ました。
![排熱.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212663/81827759-7f3e-f20a-3e34-69f802982e2b.jpeg)



### ⑥アーム機構の変更
　ROSのjointに則った形状でアームを動かせるように機構変更したことで、理想とするロボットに仕上がりました。またアームの第１軸目のスラスト荷重を支えるため、本来ならばクロスローラーベアリングを使用したかったのですが、予算の都合上、中華料理店等で使われている回転テーブル用のベアリングを使用しました。
![アーム.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212663/3d253bc2-0a94-e686-e98d-5dcf7a80c3b3.jpeg)


# 4.メカ設計
　これらを踏まえメカ設計の変遷は以下の図のような流れでした。
![メカナムロボットHW構成.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212663/7a302eb7-badc-aff4-7eda-93bee96c95c4.jpeg)

まずは取り付けたい部品を大まかに空中に配置して、各部品を繋げて行った流れです。この中でよく考えた部分は、各ホイールをどの様に車体と連結するか悩みました。中央ではBOX型に部品を収められるスペースを確保したいと考えていたため、よくある通常の車のようなダブルウィッシュボーン構造を取ると無駄に縦長になってしまい、スペースを有効活用できないと考えました。そこで思いついたのがこちらです。ロアアームが通常の自動車とは90度反転した配置とすることでフットプリントがほぼ正方形となる形状になりました。これによって縦横比（アスペクト比）が均一でメカナムホイールで旋回する際滑らかに回れる様になっています。
![ロアアーム.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212663/bdf5b83d-70d0-c0c5-2917-f1b2c3f46bf3.jpeg)
　またバッテリー交換を容易に行えるよう、バッテリーの取り付け方向を配慮した配置にしました。
![バッテリー取り出し方向.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212663/3abf27c3-ad6b-2257-6a43-55c4b47b3291.jpeg)


# 5.SW設計
 SW設計についてはROSのパッケージを様々使いつつ、独自に作成したパッケージで各ノードを繋げていきました。概要として以下の様になっております。
![ROSの構成.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212663/8543ff74-87bd-334c-6392-a2c44f917815.jpeg)

# 6.チューニング
　これらのROSパッケージを使用しながら開発しましたが、パッケージにあるそのままのパラメータ値では十分な性能は発揮できなかったため
以下のチューニングを行うことで性能を高めました。
①ZED2のチューニング
　depth:
　　quality: 4 #NURALの設定になる点群の位置精度が向上する
　　depth_downsample_factor: 0.1　#点群量を最大量の10%で出力する
　 pos_tracking:
　　two_d_mode: true #平坦な面を走行するならtrueがおすすめ。 


②move_base
　重要なパラメータ値であった点を列挙します。これはDCモータを使う上での特性を配慮した値となっているため、すべてのロボットで有用とは限りませんのでご了承ください。

　・resolution: 0.04　#0.04m程度にすることでCPUへの負荷、物体認識の取りこぼしを低減させた
　・inflation_radius: 0.15　#障害物からの膨張量を0.15m程度にすることで干渉を防ぐ
　・inf_is_valid: true　#これを入れることでスキャンできなかったところを逃げ道とは認識しなくなり、誤動作が減る
　・min_vel_x: 0.45　#0.5m/s以上にすることでDCモータの始動を良くする
　・acc_lim_x： 0.8　#0.8m/s^2以上にすることでDCモータの始動を良くする
　・min_vel_theta: 0.9　#0.9rad/s以上にすることでDCモータの始動を良くする
　・acc_lim_theta： 1.2　#1.2rad/s^2以上にすることでDCモータの始動を良くする

　あとはチューニングする際、出来る限りdynamic_reconfigureを使ってパラメータを動的に変化させつつ、動作と共に変化した状態を確認すると、最短の手数でチューニングしていけると実感しました。

# 7.更なる課題
　ZED2単体でNavigationを動かしたのですが、水平方向の視野角110°だと、残りの250°は死角になってしまい、障害物からの退避行動を行う際に他の障害物にぶつかってしまう場面が多くありました。
![死角.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212663/e7af238b-b886-f357-932d-425e750823b6.jpeg)

またAMCLによる自己位置推定を行う際、前方だけのスキャンデータでスキャンマッチングすると、自己位置の確度が低く、すぐに破綻してしまう場面が多くありました。


　
# 8.部品追加
　これらを補うため機体後方にLiDAR（LD06）を取り付け後方も測長できるようにしたところ、障害物の退避も正確にでき、AMCLが破綻することもかなり低減できました。またこのLD06というLiDARは、以前使っていたRPLiDAR（SLAMTEC製）よりも太陽光のノイズに強く、通常の屋内であればそこそこ動くことが分かりました。
![LiDAR追加.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212663/640d734d-4c0d-748d-d877-d7d6c1fa2838.jpeg)

# 9.課題解消
　これらによって課題が解消し、様々な動作ができるようになりました。こちらの様な動画です！これをMakerFaireTokyo2022でもお見せできるようにしたいです。
[メカナムホイールロボットの動作概要（Youtube）](https://www.youtube.com/watch?v=iuHW_DqAtio)
もしMakerFaireTokyo2022お越しになりましたらH-01-01(motoms)ブースに寄ってみて下さい！

# 10.参考資料
[MakerFaireTokyo2022](https://makezine.jp/event/mft2022/)
[Realsense t265](https://www.intelrealsense.com/tracking-camera-t265/)
[Realsense D435](https://www.intelrealsense.com/depth-camera-d435/)
[steleolabs ZED2](https://www.stereolabs.com/zed-2/)
[LiDAR LD06](https://ja.aliexpress.com/item/1005003539219968.html?spm=a2g0o.order_list.0.0.25cf585aoHpstd&gatewayAdapt=glo2jpn)
[teb_local_planner](http://wiki.ros.org/teb_local_planner)