3DプリンターとblenderとArduinoでオリジナルの四足歩行ロボを作る

#はじめに

コロナ禍で休日も自粛やステイホームが続く中、今まで四足歩行ロボットのキットや、ロボットアームキットを買ってプログラムで制御したことはあったのですが、どうせならパーツから自作できたら楽しいかなとふと思い、探していたところ、下記のようなサイトを発見しました。
[３日でできる！ 四足歩行ロボット「よつあし」フレームセット](https://make.dmm.com/item/946551/ "３日でできる！ 四足歩行ロボット「よつあし」フレームセット")
こちらのモデルを使わせてもらおうかなと思ったのですが、３Ｄプリンタも安価が進んでるのと、多少使い方がわかるblenderで作ったモデルを印刷できることを知り、自分で一から作ってみたいなという欲が出てき、作成してみることにしました。
　

#作りたいもの
　ロボットの形はいろいろ考えられますが、今回は比較的作りやすいらしい四足歩行ロボットを作成することにしました。四足だと一本の足を上げたとしても、残りの３本の足で重心をコントロールしバランスをとりやすく転びにくいなどの利点もあります。実際に作ったプログラムも、一本足を上げるときはほかの３本の足でバランスを取り、前に足を延ばしてバランスが崩れた後も、伸ばした足と2本の足でバランスをとる、といった形で前進させています。

#用意したもの
・３Ｄプリンター
セールでフィラメント込みで２万いかないくらいだったので、下記のプリンタを購入しました。
ＦＤＭ方式(熱溶解積層法)のプリンタの一種です。フィラメントはPLAを使用しました。
[ANYCUBIC Mega Zero 3D Printer-amazon](https://www.amazon.co.jp/ANYCUBIC-%E3%83%97%E3%83%AA%E3%83%B3%E3%82%BF%E3%83%BC-%E5%8D%B0%E5%88%B7%E3%82%B5%E3%82%A4%E3%82%BA220-250mm-%E5%AD%A6%E6%A0%A1%E7%AD%89%E5%90%91%E3%81%91/dp/B08C2M79QK "ANYCUBIC Mega Zero 3D Printer")

簡単に商品レビューをすると、近年低価格化が進む３Ｄプリンタの中でも、かなりコスパの良い商品でした。ＦＤＭ方式特有の積層痕は確認できますが、設計どおりの立体を印刷することができますので、今回のようなパーツを作成したいような場合は向いているかもしれません。

・ [Arduino Nano](https://www.amazon.co.jp/gp/product/B01I4KVWPE "Arduino Nano")
　－今回は純正のものを購入しましたが、サードパーティー製の安価なバージョン（1000円しないものもある）があるので、Arduinoのサーボのライブラリが動くのであれば、そちらの利用でもよいかもしれません。
・[KKHMF 2個 Nano V3.0 I/O 拡張ボード NANO I/Oシールド NANO IOボード Arduinoに対応](https://www.amazon.co.jp/gp/product/B083TVRSBG "KKHMF 2個 Nano V3.0 I/O 拡張ボード NANO I/Oシールド NANO IOボード Arduinoに対応")
　→Arduino nanoの拡張シールドです。今回はサーボを8つも使用するので使用します。上記のページのレビューにもありますが、入ってた二個買ったうちの基盤のピンのはんだ付けが曲がってて、サーボが接続できない部分があったので代替品を探すのも手です。
・[Digital Micro Servo SG90 ×８](https://www.amazon.co.jp/gp/product/B016FKJJ8M "Digital Micro Servo SG90")
　→類似品と比べると少々高めですが、信頼性が高いようなので購入しました。
・バッテリー
 　[Keenstone 9v Battery](https://www.amazon.co.jp/gp/product/B07868Z9SS "Keenstone 9v Battery")とスナップ（端子とつなぐためのケーブル）　
 　[ANKER PowerCore+ mini](https://www.amazon.co.jp/gp/product/B0146GSZYG "ANKER PowerCore+ mini")とUSB(A)オス-USB(miniB)オス 
　→arduino nanoと拡張ボード、それぞれに給電が必要のようなので、それぞれにバッテリーを用意しています。動作確認だけなら、モバイルバッテリーは特に上のものに限らずなんでもいいです。（小さくて軽いほどよし）
・Ｍ２サイズのネジ（サーボモーター固定用）＋ナット　×１６個
　→購入したのは下記ですが、六角ネジのため、特殊なドライバー(H1.3サイズの六角ネジドライバー？)が必要です。（本来十字のネジを買いたかったんですが、間違えて買いました。）
 [waves ケース付き M2 ２mm ステンレス 6角](https://www.amazon.co.jp/waves-%E3%82%B1%E3%83%BC%E3%82%B9%E4%BB%98%E3%81%8D-%E3%82%B9%E3%83%86%E3%83%B3%E3%83%AC%E3%82%B9-%E5%90%8430%E5%80%8B-%E8%A8%88230%E5%80%8B/dp/B07J4LCST6 "waves ケース付き M2 ２mm ステンレス")
プラスドライバーしか持ってないというかたは下記がいいかもしれません。
 [丸頭 小ネジ 十字穴付き](https://www.amazon.co.jp/gp/product/B083NXNBS9 "丸頭 小ネジ 十字穴付き プラスネジ ボルト")
・ [LEOBRO マジック結束バンド](https://www.amazon.co.jp/gp/product/B082SMN3XW "結束バンド")
　→上記バッテリーをボディの下部分に取り付けるのに使用しました。動作確認をしたいだけであれば、特に用意しなくても問題ないです。

#パーツを作る
　3Dプリンターで使用するデータを用意します。上記のサイトのように、３Ｄデータを公開しているものもあるので、利用させてもらってもよいですが、blenderなどの３Ｄオーサリングソフトを使用すれば、自分だけのカスタムロボットを作ることができます。（blenderでの3dプリンタ用モデル出力する際の注意点は[こちら](http://itosue.github.io/bl-cura_workflow/ "BlenderとCuraで快速3Dプリントワークフロー")を参照してください。）
![c.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276368/9359f35d-da1a-2ba4-ffa4-c6b882af474f.png)
　今回作成したパーツは下記の３点です。 
１.胴体（１つ）
→制御基板を乗せる部分です。
 各足の前後移動をつかさどるサーボもここに乗っけるので固定用に穴とM2サイズのネジのはいる穴をつくってます。
![body2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276368/91444e80-2c46-2c4e-41cc-5925e6bcaceb.png)
２.上脚部分（４つ）
→各足の前後移動を担当します。上下移動を担当する足用のサーボを設置するので、サーボ用の穴と固定用ネジ穴があいてます
![joint.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276368/e8bcc634-2ec5-6dd8-4101-b30ec4505705.png)

３.下脚部分（４つ）
→各足の上下運動 開閉を担当します。サーボのアーム固定用の穴が空いてます
![foot1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276368/17544dae-33ea-8523-d608-cce04659a9c1.png)


※実際に作成したモデルデータのデータは [こちら](https://github.com/shinacabbage/spider/blob/main/model.zip "モデル")です。
→使用は自由ですが、あまり洗練されたモデルでないので、ご注意ください。
→明らかに３Ｄプリンタを故障させるような、プリンタで印刷するのに無理のあるデータではないかと思いますが、使用する際は自己責任でお願いいたします。
→使用する3Dプリンタやフィラメントの種類によっても使い勝手は変わってくると思うので、適宜ご修正ください。
　
#組み立て

上記で作成したパーツを組み立てます。

①メインボディにサーボを四つ設置します
<img width="300" alt="DSC_1155.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276368/46df25bb-542d-ebcf-ddb9-00b17a3c152d.jpeg">
②下脚にサーボのアーム（画像の白いやつ）を取り付けます
<img width="200" alt="DSC_1160.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276368/b1b2437c-6e1a-7843-fe59-a441b64828f5.jpeg">
<img width="200" alt="DSC_1161.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276368/f78116b1-4551-7a83-b566-4cba06da22fb.jpeg">
③上脚にサーボとアームを取り付けます
<img width="300" alt="DSC_1163.JPG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276368/7d5f3a0b-8a6a-0d70-a973-794174a5a06e.jpeg">
④アームをそれぞれのサーボに取り付けるのですが、取り付ける前にサーボの角度と腕の角度を合わせる必要があります。アームを何度回転させたらどの位置に腕が来るか、を決めたうえでサーボにアームを設置する必要があるということですね。
　これは作ったロボットのサーボの初期設定のきめ方によって変わりますが、以下のポーズを基準としました。
![DSC_1159.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276368/6e1fbac8-ee7a-6aa2-d94c-b7fc9f65271f.jpeg)
![DSC_1162.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276368/61e43cc3-cb0b-d028-8617-06fd95bed4e0.jpeg)
githubのarduinoスケッチは、こちらのポーズをベースとして、モーションを作成しました。
スケッチの中のCalibration()という関数だけを実行すると、サーボの角度が動くので、その状態で上の画像のような足の向きでそれぞれのアームを取り付ければ、サンプルと同じように歩かせることができます。

#制御プログラムの作成
　組み立てが完了したので、制御するプログラムを書きます。Arduino IDEを使用し、プログラムを書いていきます。
　制御のアプローチとしては、各サーボの角度を調整していいかんじに前進できるようなモーションをつくる、というなんともテキトーな方針にしました。もう少しかっこつけた言い方をすると、この方式は順運動学的アプローチとなります。 
　順運動学とは、各間接の角度から最終的な位置を計算するという方法で、例えば、下記のような関節が二つあるロボットアームがある場合、各関節の角度が定まれば、最終的なロボットアームの先端の位置x,yは１つに定まり、原点からの座標の回転を一次変換(関節の角度をもとに次の関節の位置を計算)していくことで求めることができます。  
<img width="300" alt="a.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276368/3c33f514-1ae2-1e41-7fa7-466fa6a3c28b.png">

　一方、逆運動学では、最終的な位置が最初に与えられており、そこから逆算して各間接の角度を求めるという方法です。この方法は、例えばアームの先端を10cm右に動かしたい場合、そのために各関節をそれぞれ何度の角度にすればいいかを計算できる、という利点があります。  
<img width="300" alt="b.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276368/a9303ce1-2e87-7346-a216-e571ab85388b.png">

　 しかし逆運動学においては、各関節が１つに定まりません。最終的な座標が決まっていても、各関節の角度のパターンは複数あるためです。上図だと、最終的なx,yにする角度パターンは２あることが分かります。このパターンは各関節が多くなれば多くなるほど増え、計算も複雑になってきます。具体的な計算に興味があれば参考文献を読んでみてください。（ なお、これだけ書いておいて、今回は特に何の計算もしていないです。）

  そのため、各サーボの角度を組み合わせて、動きに必要なポーズになるよう調整していくという形にしました。
#プログラム（Arduinoのスケッチ）
[githubのコード＋モデルのデータ](https://github.com/shinacabbage/spider "github")

コードは下記の三つから成り立っています。(また、サーボを制御するためのArduinoのライブラリServo.hも使用しますので、忘れずインストールするようにしてください。)
・ServoMovingListクラス
　→サーボの角度を調整するクラスです。連結リストになっており、一つ目のポーズの角度→二つ目のポーズの角度・・・と登録すると、一つ目から順番に一定のスピードで角度を設定していってくれます。
・Spiderクラス
　→上記のServoMovingListクラスをつかって、「歩く」、「立ち上がる」、「座る」などのモーションを作成するクラスです。
・mainループ
　→上記のSpiderクラスを実行します。

#実行結果
<iframe src="https://player.vimeo.com/video/501215904" width="640" height="1138" frameborder="0" allow="autoplay; fullscreen; picture-in-picture" allowfullscreen></iframe>
<p><a href="https://vimeo.com/501215904">四足歩行ロボ</a> from <a href="https://vimeo.com/user131388060">shinacabbage</a> on <a href="https://vimeo.com">Vimeo</a>.</p>
かなり力強く歩けてますね。
#今後の展望
・ボディのさらなる改良
　→バッテリーをボディの下に固定したら、地面すれすれになってしまったので、再考が必要そうです。
・スマホで操作
　→bluetoothモジュールも買ってあるので、スマホからアプリで操作するなんてこともできそうです。
・効率のよい動きができる設計の模索
　→big dogやspotみたいないろんな地形に対応できるロボットとか作ってみたいですね。サーボも８つも使わなくてすむようなものも作ってみたい。
・ＡＩとの組み合わせ。
　→基盤をラズパイ４にして、学習する歩行ロボとかも面白そうですね。

#参考サイト・書籍
・[３日でできる！ 四足歩行ロボット「よつあし」フレームセット](https://make.dmm.com/item/946551/ "３日でできる！ 四足歩行ロボット「よつあし」フレームセット")
・[Arduino搭載四足歩行ロボットのプログラム](https://makezine.jp/blog/2016/12/robot-quadruped-arduino-program.html "Arduino搭載四足歩行ロボットのプログラム")
・[ロボット工学の基礎(第3版) ](https://www.amazon.co.jp/%E3%83%AD%E3%83%9C%E3%83%83%E3%83%88%E5%B7%A5%E5%AD%A6%E3%81%AE%E5%9F%BA%E7%A4%8E-%E7%AC%AC3%E7%89%88-%E5%B7%9D%EF%A8%91-%E6%99%B4%E4%B9%85/dp/4627913834 "ロボット工学の基礎(第3版) ")
・[BlenderとCuraで快速3Dプリントワークフロー](http://itosue.github.io/bl-cura_workflow/ "BlenderとCuraで快速3Dプリントワークフロー")