予算3万円でつくる BLDC 2足歩行ロボット 第2号
ー足のIKを楽しむー

Home > 電子工作 > 予算3万円でつくる BLDC 2足歩行ロボット 第2号ー足のIKを楽しむー
すき 0
うんこ 0

前号では記念すべき創刊ということでSimpleFOCによるBLDC制御についてもろもろ紹介させていただきました。

予算3万円でつくる BLDC 2足歩行ロボット 創刊号ーSimpleFOCでBLDC動作を楽しむー

 

本号ではロボットの左足となる足を1本完成させます。
足を上下前後に移動するための逆運動学についても紹介いたします。

 

AudiostockでBGM・効果音を販売中!

はじめに

ここからは足の完成に向けて組み立て手順通りに記載します。

作業前の前提としましては創刊号の FOC回転位置制御が書き込まれ、モータ回転方向やエンコーダオフセット初期値設定がさせているものとします。

ギア等は外しておいてください。

 

また裏面のスペーサも必要ないので外してください。

 

本号で必要な部品

主な必要部品及び数量は創刊号 と全く一緒です。
ねじ等は足組み立てのために各種必要となります。

  • BLDCコントローラ MKS ESP32 FOC V2.0 :1個

      
  • BLDC 5010 360KV:2個

     
  • 磁気エンコーダ AS5600:2個


     

  • LiPoバッテリ 3セル 11.1V:1個
    本号では安定化電源 (12V)の使用を想定していますが、完成ロボはLiPoバッテリを使用します。

     
  • PS4コントローラ
    本ロボは基本的にはPS4コントローラでの操作となります。必須ではないですがあると便利です。

     
  • その他
    10mm以上のねじスペーサ:4個
    M2ナット:6個
    M2 12mm なべネジ:4本
    M2 14mm なべネジ:2本
    M2 20mm なべネジ:6本
    M2 25mm なべネジ:2本
    M3ナイロンネジ:2本
    M3ナット:2個
    M3 14mm なべネジ:2本
    M3 18mm なべネジ:1本
    M3 20mm なべネジ:1本
    M3 25mm なべネジ:5本
    M3 30mm なべネジ:1本

 

ロボット完成に必要な主な部品

AliExpressでの部品購入は到着までに日数がかかるので、あらかじめロボ完成までの部品を購入しておきたい方のために主な必要部品をまとめておきます。

# 品目 数量
1 MKS ESP32 FOC V2.0 3
2 BLDC 5010 360KV 6
3 磁気エンコーダ AS5600 6
4 ATOM Matrix 1
5 CANコントローラボード 4
6 4ピン GHコネクタケーブル 150mm 4
7 LiPoバッテリ 3セル 11.1V 1

 

3Dモデル

今回使用する追加の筐体の3Dモデルデータは以下で販売しております。
zipファイルでダウンロードされますので解凍してご利用ください。

https://shop.homemadegarbage.com/product/bldcrobo3d02/

データには21個のstlファイルがあり leg7.stl,  M2-102.stl, 
M3-155.stlは2個づつプリントし、その他は1個づつ印刷してください。

足の組み立てには一部を除いて創刊号のモデルも使用します。
M2-52.stlにつきましては合計10個使用しますので追加でプリントしてください。

 

足上部組立て

boardFix.stlの面4つ角の穴をM3ネジでねじ切りして10mmスペーサを付けます。

 

以下のようにboardFix.stlをmotorFix.stlに2か所ねじ止めします (M3 14mm なべネジ:2本)。

 

以下のように MKS ESP32 FOC V2.0 をスペーサにM3 ナイロンネジで2か所止めます (必須ではありません)。
モータやエンコーダのコネクタを配線後に cover.stl をかぶせてM3 18mm、M3 25mm なべネジで固定します。

 

MKS ESP32 FOC V2.0のネジ穴周辺にスペースがないので、以下のようにナイロンネジの頭を切って小型化して使用しています。

 

足フレーム組立て

3Dプリント品を組んでリンク機構の足を作ります。

leg8.stlとleg11.stlのくぼみにM3ナットをはめ込んで、foot.stlを挟んでM3-155を通してねじ止め (M3 25mm なべネジ:2本)。

leg8.stlとleg11.stlの上図右写真の赤〇の穴はあらかじめM2ネジサイズでねじ切りしてください (反対側も)。

 

gear56-70-L.stl (創刊号付属モデル)の下部の穴にleg9.stlの突起穴を通して、leg8.stlの穴にねじ止め (M2 20mm なべネジ)。
M2-149.stlをleg9.stlとleg10.stlの穴に通してねじ止め (M2 25mm なべネジ)。

 

leg4-L.stl の下部の2つ穴にM2-52.stlを通して、leg11.stlの穴にねじ止め (M2 20mm なべネジ:2本)。
leg5.stlの穴にM2-152とM2-52.stlをとおしてM2ナットをはめてgear56-70-Lstlとleg4-Lstlにねじ止め (それぞれ M2 25mm, 12mm なべネジ)。

 

leg6.stl の下部の2つ穴にM2-52.stlを通して、leg11.stlの中段穴にねじ止め (M2 20mm なべネジ:2本)。
leg7.stlの穴にM2-102とM2-52.stlをとおしてM2ナットをはめてleg4-Lstlとleg6.stlにねじ止め (それぞれ M2 20mm, 12mm なべネジ)。

 

leg4-L.stl の上部の穴にM3-178.stlを通して、leg2-L .stlとgear56-L.stlを通す。
leg6.stlの穴にM2-52.stlをとおしてM2ナットをはめてgear56-L.stlにねじ止め (M2 12mm なべネジ)。
leg7.stlの穴にM2-102とM2-52.stlをとおしてleg4-Lstlとleg6.stlにねじ止め (それぞれ M2 12mm, 20mm なべネジ)。
leg6.stlの中段の穴はM2ネジサイズであらかじめねじ切りしてください 

 

以上で左足フレームが完成です。

 

足完成

足フレームを足上部に取り付け 足を完成させます。

leg1.stl (創刊号付属モデル)の突起をgear56-70-L.stlの穴に通して、motorFix .stlにねじ止め (M3 25mm なべネジ)。
M3-178 .stlの穴にM3 30mm なべネジをとおして、motorFix .stlにねじ止め。

 

leg4-L .stlの穴にM3-55.stlをとおして、motorFix .stlにねじ止め (M3 20mm なべネジ)。
leg3 .stlの穴にM3-105.stlをとおして、motorFix .stlにねじ止め (M3 25mm なべネジ)。

 

gear56-70-L.stl、gear56-L.stlのアームがだいたい45°になる位置でモータのgearFix.stlにgear10.stlをはめます。
この際にモータは初期位置であることをご確認ください。

 

45°の目安としてgear56-70とgear56-L.stlにマーキングを入れてあります。
逆三角マークの下頂点がそれぞれleg1.stlとleg2-L.stlの上辺にかかる点が傾き45°となります。
ここではだいたい45°で問題ありません。ブラウザアプリのangleOffsetで微調整できます。

 

穴にM2-52.stlを通してM2 14mm なべネジでギアを固定します。

 

以上で足が完成です。

動作

創刊号のFOC回転位置制御Arduinoコードで足を動かします。
あらかじめブラウザアプリのangleOffsetで足位置の微調整を実施しておいてください。

PS4コントローラのジョイスティックでモータを回転させることでリンク機構の足が上下に動きます。

前回のコードではモータの電圧・電流を3V, 2Aと低出力にしているため (L. 46, 47) トルクが低く上の動画のように足を浮かさないと動きません。

 

逆運動学 (IK)

足が完成し、動作が確認できました。
ここからは逆運動学 (Inverse Kinematics:IK)でリンク機構の足先の位置を指定してモータの回転を制御します。

座標は以下のように定義しました。

motor1で駆動するギアの回転軸を原点として、足先 (足首前方)の前後をx軸、高さをz軸とします。

motor1で大腿の角度、motor0で下腿の角度をギア比5.6の歯車を介して制御します。
大腿、下腿は同一の長さで70mmです。

逆運動学 算出

足先の座標 (x, z)から大腿、下腿の角度$θ_1$, $θ_2$を算出します。

角度$θ_1$は余弦定理を用いて導出します。ちなみに$L$は大腿、下腿の長さ(70mm)。

$L^2 = L^2 + {l_d}^2 – 2{L}{l_d}\cos{θ_1}’  $

${θ_1}’ = \cos^{-1} \left(\frac{l_d}{2{L}} \right)$

$$θ_1 = φ + {θ_1}’  = φ +\cos^{-1} \left(\frac{l_d}{2{L}} \right) $$

$$      但し、φ = \tan^{-1} \left(\frac{x}{z} \right)$$

$$       l_d = \sqrt{x^2 + z^2}$$

 

後方サーボの角度$θ_2$も余弦定理を用いて導出します。

${l_d}^2 = L^2 + L^2 – 2{L}{L}\cos{θ_2}’ = 2L^2 – 2L^2\cos{θ_2}’$

${θ_2}’ = \cos^{-1} \left(\frac{2L^2-{l_d}^2}{2{L}^2} \right)$

$$θ_2 =\pi-θ_1-{θ_2}’ = \pi-θ_1-\cos^{-1} \left(\frac{2L^2-{l_d}^2}{2{L}^2} \right)$$

以上より、足先の座標(x, z)を指定することで大腿、下腿の角度$θ_1$, $θ_2$を導出できるようになりました。

$θ_1$, $θ_2$にギア比5.6をかけることでモータの回転位置となります。

Arduinoコード

創刊号のFOC回転位置制御Arduinoコードを改良して、IKで足を制御できるようにします。

環境バージョンは前回と同様です。
 Arduino IDEバージョン:ver. 1.8.19
 ESP32ライブラリ:ver. 2.0.13
 SimpleFOCライブラリ:ver. 2.3.3
 PS4Controllerライブラリ:ver. 1.1.0

エンコーダオフセット値 (zero_electric_angle)は前回測定した値を入力してください。

 

創刊号のFOC回転位置制御Arduinoコードとの差分のみ説明します。

L. 39 L = 70.0  下腿、大腿の長さを指定 (70.0mm)
L. 40 足先の初期高さを99mmと指定
 初期の足の角度を45°とするため ($\sqrt{2} × 70 \approx 99$)。

L. 48 電流リミットを2Aから6Aにしてモータトルクを向上させます。
 電源は十分電流能力があるものを使用ください

L. 356~369 PS4コントローラ 左ジョイスティック動作
 上下に加えて前後も指定してIKで足を動かします。

L. 493~498 モータ初期設定
  モータ回転方向とエンコーダオフセット値は前回の測定値を入力してください。

 
L. 539~556 逆運動学の計算 ik(x, z)
 足先の前後:xと高さzを指定してモータの角度を算出しています。
 L. 551, 552 下腿や大腿の初期角度を45°として(ギア比5.6で換算)、
       モータは-80°~120°までの回転で制限しています (干渉による過電流防止)。

ブラウザアプリ動作やPS4コントローラ接続については創刊号と全く同じです。

動作

Arduinoコードを書き込んでPS4コントローラと接続すると、左ジョイスティックで前後上下に足が動きます。

以上でIKによる足制御ができるようになりました。

 

演習問題

1-パラメータ調整

IKのコードでブラウザアプリやコードを修正するなどして各PIDパラメータ値を変更して動作にどう影響するのか体験してみよう。

電流リミットは6A以上にすると過電流でMKS ESP32 FOC V2.0のパワートランジスタが壊れる可能性がありますのでご注意ください。

2-ジャンプ動作

ここではPS4コントローラのジョイスティックでのIKを楽しみましたが
コードを改良してボタンを押すとジャンプするようにしてみましょう。

ik(x, z)関数でジャンプ動作のシーケンスを組んでみましょう。

 

おわりに

本号ではロボットの足を完成させて、IKによる制御を楽しみました。
モータ角度ではなく足の位置での制御が可能になるとより豊かな動作が実現できるようになります。

次回はロボットの股関節を製作し動作を楽しみたいと思います。

コメントはこちらから

メールアドレスが公開されることはありません。コメントのみでもOKです。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください