ABEJA Tech Blog

中の人の興味のある情報を発信していきます

Amazonに売ってるモノだけで6脚ロボットを完全自作してみた (3Dモデル+ソースコード付き)

はじめに

こんにちは!ABEJA PlatformやInsight for Retailの開発チームのマネージャーをしている大田黒です。ABEJAアドベントカレンダー2023の8日目の記事です。もうすぐ冬休みですね!皆さんはどんな年末を過ごされますでしょうか??積みゲーを消化する人もいるでしょう。そういえば、今年はアーマードコアの新作がついに発表されましたね!筆者は昔から多脚ロボットにロマンを感じているので、本日は趣味で多脚ロボットを実際に設計して作成してみた話について書いてみようかと思います。3Dモデルや制御系ソフト等も公開します。利用ポリシーについては最後の項目をご確認ください。

今回の設計思想は下記です。

  • 各種部品が身近なところ(Amazon)で手に入る
  • 手頃な価格の3Dプリンターで部材が印刷できる
    • 今回はEnder-3 S1 ProをAmazonで購入して利用

完成品イメージ (Tagurobot v1)

まず、各関節はこんな感じで動きます。(Gamepadから制御)

www.youtube.com

 

こんな感じで前に進むことができます。(後述のTripod Gaitを実装)

www.youtube.com

 

3Dモデルの全体像

今回の3Dモデルでは大きく分けて4つの部分が存在します。詳しく触れていきます。

  • 制御系回路・バッテリー搭載用ボード
  • 関節
  • アーム
  • End Effector

メイン構造体

github.com

制御系回路・バッテリー搭載用ボード

github.com

関節

github.com

アーム

github.com

End Effector

※Amazonで売っているこちらのアルミサーボホーンで設計しています。サーボモーターDS3218を購入すると付属でついています。

github.com

電源・制御系の全体像

 

特徴・設計思想は下記です

  • 動力系と制御系は分離して電源供給
    • 複数のサーボモーターが動く時に電圧降下が発生し、RaspberryPi側が不安定になるため
  • RaspberryPiを利用
    • Linux、Pythonが使えるので制御系構築が比較的楽
    • Wifi、Bluetoothが搭載されているため、外部制御や他デバイス連携がし易い
  • センサーや制御モジュールとの通信ではI2Cを利用
    • できるだけRaspberryPi周りの接続をスッキリさせる

実際の組み立てや接続には、M2.5・M3・M4のボルト・ナット・スペーサー類、配線類、XT30コネクタ等が必要になります。

モジュール紹介 (LiPoバッテリー)

意外と回路・バッテリー搭載用ボードが狭いので、載せられるバッテリーサイズの制約が厳しいです。今回は比較的小型な下記バッテリーを制御系とサーボモーター駆動用に利用しています。

モジュール紹介 (ヒューズ)

LiPoは大電流を流すことができる為、万が一回路がショートすると非常に危険です。今回、家に転がっていたカーヒューズを利用しました。Amazonでも売ってます。

モジュール紹介 (DC-DCコンバーター)

 幅広い入力電圧幅に対応しており、5Aの負荷容量を持つ下記を購入しました。

モジュール紹介 (RaspberryPi)

だいぶ値上がりしていますが、また市場に流通し始めていますね。今回は新規購入はせず、家にあったRaspberry Pi 3 ModelB+を利用しています。今後、ロボット制御に加えて、画像認識等色々やっていくなら上位モデルを購入するのが良さそうです。

モジュール紹介 (サーボモータードライバー:)

I2C経由で16chのPWM信号を制御できるIC(PCA9685)が搭載されたモジュールが手頃な価格で売っていたので、下記を購入しました。

注) ターミナル端子経由で給電&複数のサーボドライバーに同時に負荷をかけると、電源逆接続からサーボの焼損を防ぐ為のP-FETが電流に耐えきれない事があります。今回はP-FETを迂回するような経路で給電しています。

モジュール紹介 (サーボモーター)

Amazonオススメ、売れ筋ランキング上位になっていたのでとりあえず選択(後日談ですが、マイクロサーボを選んだほうがもっと手軽に作れたかもしれません....)

モジュール紹介 (加速度ジャイロセンサー)

Amazonオススメのセンサー。足を動かす為の必須部品ではありませんが、斜面における安定歩行や、データを取得しながらの継続的な歩行プログラムの改善に使いたかったので、I2Cで手頃に制御できそうなモジュールを今回使いました。(加速度もジャイロも3軸で手軽に取れるのすごい)

制御系ソフトウェアの全体像

簡単にですが、今回6脚ロボットを歩かせるに当たっての流れを説明します。今回、6足歩行を実装するために下記のような計算・制御フローを実装しています。

Tripod Gait(トライポッド歩容)の紹介

6本の足をどうやって制御しながら前に進むのか? どういうパターンを生成するか?(昆虫超苦手なのに.......)昆虫の歩き方をYoutubeで見て動作解析をしていましたが、すでにこの分野は研究が進んでいるようです。「Wave Gait」「Tripod gait」等と調べると歩容に関するいくつかの論文があります。今回はTripod Gait(トライポッド歩容)をベースに、足の動かし方のパターンについて簡単に解説します。

 

出典元:Tripod-walking Gait - The Tripod Gait as a Model for Robots

 

Tripod Gaitでは、常に3つの足が地面に接触しています。まず3つの足が地面にふれることで、ロボット自体の重心を支持脚安定領域の中心近くに保つことできるので、安定的に高速に移動する事ができます。

 

 

出典元:Tripod Gait - Insects & Robots

 

各足は「Power Stroke」「Return Stroke」という「地面を掻く動作」「元の場所に戻る動作」を繰り返します。常に3つの足が接地するように、各足のStrokeのタイミングを微妙にずらして動かすことで、Tripod Gaitの実装が可能です。今回は、三角関数でうまい感じに実装しています。

 

適切な関節角度を算出するための逆問題を解く

 

各足先を指定座標に持っていくためには、各足に存在する3つのサーボモーターの角度を適切に制御する必要性があります。ここでは逆運動学の観点から、下記のような数式で制御をしています。

 L = \sqrt{x^2+y^2}

 \theta_3 = \arccos{\frac{L_2^2 + L_3^2 - L^2}{2 \cdot L_2 \cdot L_3}}

 \theta_2 = \arccos{\frac{L^2 + L_2^2 - L_3^2}{2 \cdot L \cdot L_2}}  - \arctan{\frac{Y}{X}}

 

※導出手順は省きますが、基本的には余弦定理、三角関数の逆関数、平行線の錯角がベースに導出が可能です。中学生・高校生の時は「何に使うんだろう」「何に使えるんだろう」って思ってたので、長い時を経て答え合わせができた感覚です。

 

制御系ソフト

上記フローを組み込んだ制御ソフトを今回作成しました。ソースコードを下記リポジトリで公開しています。

  • Pythonをベースに実装。Tripod Gaitをベースに歩行を実施。
  • PyQTを用いた可視化
    • Top Viewからの各関節位置、Side Viewからの各関節位置を可視化

github.com


※突貫で書いたコードなので、時間があるときにリファクタリングします...

 

設計・作成しての学び

3Dプリント関連

  • 「小さくこまめに印刷」を心がける
    • アーム・関節系は同じ部品が6個必要な為、横着して一気に部材を印刷。すると造形失敗率が上がり、もじゃもじゃに
      • 2日間かけて失敗した時はショックで声が出なかった
    • ちなみに印刷に成功しても、積層割れ等のトラブル発生率が多かった
  • 部屋の湿度、3Dプリンターの設定には気を配る
    • 湿度が高いとPLAフィラメントが途中で折れたりする
    • レベリング・ノズル温度・印刷速度を正しく設定しないと、積層割れの原因になる
  • 「スティックのり」は3Dプリンター印刷の成功率を上げる
    • 特に「シワなし PiT」がオススメ
    • 造形物の最初のレイヤーをしっかり定着させてくれる
  • 3Dプリンターで作るネジ穴の精度や強度が思った以上に微妙
    • 予想はしていたが、市販品のネジが入りがよくなかった
      • タップを切ることがしばしば...
    • 軸方向に力がかかる場合は、強度に不安がある

機構・ソフトウェア設計関連

  • 組み立て工程を意識した3Dモデリングの重要性
    • 具体的に発生したトラブル:狙った場所に配線が通せない、工具と部材の干渉、3Dプリンターのサポート材剥がしが大変etc...
    • シミュレーションでもわからないことはある。小さく作り、検証、軌道修正を繰り返すのが重要(アジャイル開発に通じるものがありますね)
  • RaspberryPiを固定するための穴のサイズがM2.5。M3ではないため、ネジやスペーサーの入手性が微妙だった
  • 安定的なサーボモーターの動作には安定的な電源が必要
    • 具体的に発生したトラブル:サーボモーターがめちゃくちゃ振動したり、PWMで指示した角度にならない
    • 原因:DC-DCコンバーターの出力不足、配線・接触抵抗による電圧降下....
  • atan系関数が曲者
    • atan, atan2で帰ってくる値の値域が異なる
      • 例)atanは-π/2~+π/2、atan2は-π~+πまで返却
    • 理論をコードに落とし込むときに地味なハマりポイント

 

 v2に向けた改善点

  • 外部給電、大容量のバッテリーやDCDCコンバーターが搭載できるようにする
    • 現状、稼働時間が数十分程度である。短い.....
  • 電源・PWM制御回路を自作する
    • Amazonで安くそこそこ使えるモジュールが増えてきている...
    • 今後、回路の集約・小規模化、より安定的な電源供給をするためにはボードを自作したほうが良さそう
  • ソフトウェアなサーボモーターの電源制御
    • 電源供給中は指定した角度で位置を保持しつづける為、手で関節を曲げられない
    • いちいち電源を取り外さずのが大変なので、FET等で電源ON/OFFできるようにする
  •  坂道を登ったり、段差を乗り越えられるようにする
    •  搭載している加速度センサーやジャイロを使った制御
    • 画像認識、LiDARによる地面・障害物の認識

最後に

  • 今回、6脚ロボットのモデリングを行い、Amazonで売っている3Dプリンター・材料だけでTripod歩容させる事ができました
  • せっかくAIやDXを実現していく会社にいるので、今流行りのLLM技術を用いた状態認識・行動計画立案・制御を試してみたいと思っています。(時間があれば)

 

※3Dモデル・ソフトウェアの利用ポリシー

今回、知識のある理工学系の学生さんであれば誰でも作れるように、3Dモデルや一部ソフトウェアを公開しています。学習用途であればお気軽に使っていただいて構いません。一方で、学習用途以外で利用したい方は事前にご相談ください。 相談先=>X

  • LiPoバッテリーを利用する為、充電時やショートには十分ご注意ください
    • 大電流を流すことができるため、短絡すると非常に危険です
    • 回路を触るときは必ず電源OFFにしましょう
    • 充電時は過充電保護機能が搭載されている充電器を利用しましょう
  • サーボモーターのトルクが強いため、指挟み事故等には注意
  • 3Dプリンターの可動部・高温部に気をつける
    • FDMの場合、ノズル温度は約200度になります (PLAの場合)
  • 工具を利用する場合は、怪我に注意する
    • はんだごて、ニッパー、カッターによる受傷に注意

部品・工具の取り扱い、組み立て、テスト稼働には危険が伴います。作成時及び作成物に起因した事故は当方では責任は負いかねます。(At your own risk)

 

 

We Are Hiring!

ABEJAは、テクノロジーの社会実装に取り組んでいます。
技術はもちろん、技術をどのようにして社会やビジネスに組み込んでいくかを考えるのが好きな方は、下記採用ページからエントリーください!
(新卒の方のエントリーもお待ちしております)

careers.abejainc.com