「Arduino」タグアーカイブ

二足歩行ロボット SHISEIGYO-2 Walker 改 の検討2

前回は2軸のフライホイールによるバランスで倒立する2足歩行ロボット “SHISEIGYO-2 Walker 改” の実現に向けて足の製作を実施しました。

二足歩行ロボット SHISEIGYO-1 Walker 参 改 3

ここでは製作した足を実装して歩行動作を確認します。

 

 

足の実装

前回製作した足を2軸のホイール部に接続します。

以下は脚の動作確認のために平らな足先をつけて歩行させています。

問題なく歩行できていますね。。
しかしここでの目的はリアクションホイールによって倒立して歩行や旋回動作をさせることです。

倒立用の足先を製作

 

製作した足先によって点倒立動作を確認できました!

 

歩行・旋回動作

歩行動作確認。ちょこちょこバランスをとって歩いていますww

 

旋回動作は片方を支点に他方で地面をかいて実行します。

ちょっと電源コードが邪魔ですが旋回動作も確認できました!!

 

電源システム

これまでは電源を外部から供給していましたが内蔵してコードレス化をはかります。

電源システムは以下のようにしました。

 

 

動作

電源がコードレス化されて旋回もスムーズになりました。

 

歩行動作を堪能

 

ホイールの制御パラメータを最適化

頑張ってモチョモチョ動いております。

 

おわりに

ここでは2軸のフライホイールでのバランスによる二足歩行ロボットの歩行動作の確認を実施しました。
実現したかった旋回動作も確認できて満足です。

課題としましては

  • 足の機械強度向上
    3Dプリンタで平行リンクの機構を構成しているので若干強度が足りず歪みが発生
    前後進の経路が歪む。。どこかで金属部品で試したい
     
  • 足が短すぎる
    ホイール用にブラシレスモータを2個実装しており重量もあるので、足の長さを短くせざるを得なかった。
    いずれよりパワーのあるモータで高トルクのホイールを回して再挑戦したい
     
  • 足をスリムにしたい
    サーボのサイズが大きいため足がゴツくなってしまった。足自体の長さがないためより強調される。
    高額になってしまうが小型で大きいトルクのサーボモータでの足製作検討もしてみたい

以上のようにかなり課題は多いですが原理動作はバッチリ確認できました。
旋回動作させるには2軸ホイールバランスが必須であることが体感として理解できたことは大きいです。

フライホイールによるバランスを採用することによって足の機構を単純化でき、またその歩行の様子も独創的であると感じております。
この方向性でどんどん開発を進めていく所存です。

二足歩行ロボット SHISEIGYO-2 Walker 改 の検討1

前回は足首にモータを追加して旋回動作を確認しました。

二足歩行ロボット SHISEIGYO-1 Walker 改

1軸のホイールによるバランスでは旋回動作が難しいという結論を得ましたので、
ここでは2軸の検討を実施しました。

 

 

2軸での検討

2軸のホイールのバランスによる歩行は “SHISEIGYO-2 Wlaker” で確認済です。

SHISEIGYO-2 Wlaker では小さな足による歩行でしたので、ここではもう少し人間に近い足を目指し、
前後進・旋回運動の実現に向けて検討します。

 

2軸によるバランス検証

人間らしい足の製作の前に2軸ホイールによってどれほどの高さまで安定倒立が可能であるかを確かめました。

足長さ 30 mm

足長さ 48 mm

足長さ 58 mm

足長さ 68 mm

足長さ 78 mm

足長さ 88 mm

結論

以上の結果より、足の長さは80mm以下にする必要があることが分かりました。

 

足の製作

2軸ホイールによる安定性が確認できましたので、足の製作に取り掛かります。

まずは乱暴に以前 SHISEIGYO-1 Walker 参 用に制作した平行リンクによる足をつけてみました。

 

足が高すぎて倒立は出来ませんでした。。当然

足の小型化

2軸向けに足を小型化しました。

 

 

片足倒立

製作した足で倒立動作の確認を行いました。

無事に片足での倒立と屈伸運動を確認することができました。

 

もう一足製作

2足にするべく もう片方製作。

SHISEIGYO-1で歩行テスト

製作した2足を2軸で展開する前に、1軸のSHISEIGYO-1  で動作検証しました。

動作バッチリでしかもカワイイ!

足の小型化によって重心も低くなり、安定度も向上しましたww

 

おわりに

ここでは2軸のフライホイールによるバランスで倒立する2足歩行ロボット “SHISEIGYO-2 Walker 改” の実現に向けて足の製作を実施しました。

片足での動作と1軸ホイールバランスによる二足歩行動作を確認できました。

次回は2軸ホイールによるバランスでの二足歩行を目指します。

次の記事

SHISEIGYO-2 Walker 改 の検討2

二足歩行ロボット SHISEIGYO-1 Walker 参 改 5

前回はマイコンを削減してESP32単体で制御できるようにして、さらに24V DCDCモジュールの低価格化をはかりました。

二足歩行ロボット SHISEIGYO-1 Walker 参 改 5

ここでは足を改良して旋回動作できるようにしましたので報告します。

 

 

旋回したい

以前、初代 SHISEIGYO-1 Walkerの足を改良してサイドステップ動作を検討しました。

二足歩行ロボット SHISEIGYO-1 Walker 改

 

しかし、よくよく考えてみると足元にロール軸を設けてサイドステップ動作ができるようになっても横やナナメに動けるだけで旋回はできないですよね。。

 

ヨ―角の検討

そこで SHISEIGYO-1 Walker 参 改に更に改良を加え かかとにサーボを追加してヨ―角回転できるようにしました。

まずは片足で動作確認

 

なんか可能性ありそうということで両足に展開

 

旋回動作

旋回動作を確認

片足接地時に足首をひねって旋回させています。左右両方の足をひねっているのですが、バランスを保つのがツラそうです。。

 

片足のみ足首をひねるようにしました。左旋回の時は右足接地時に足首をひねります vice versa。
遅いですがなんとか旋回動作が実現できました。

 

おわりに

ここでは足首運動によるヨ―角旋回動作を確認しました。

フライホイールの回転軸から回転するように足首をひねり支点の角度がずれるので、外乱としては強烈なものがあります。
そのためバランスを保とうとするとゆっくり少しずつ旋回することを余儀なくされます。

しかし、実機で旋回動作の難しさを確認できたことは大きな収穫となりました。

結論としましては1軸では旋回動作は難しいかなという感想です。
こうなると2軸で検証したくなりますね。。(;゚д゚)ゴクリ…

次の記事

SHISEIGYO-2 Walker 改 の検討1

二足歩行ロボット SHISEIGYO-1 Walker 参 改 4

これまでSHISEIGYO-1 Walker 参 の改良版についてはマイコンを2台使用して制御していたが、今回削減をはかったので報告します。

二足歩行ロボット SHISEIGYO-1 Walker 参 改 4

 

 

従来システム構成

以下がこれまでのSHISEIGYO-1 Walker 参 改 のコントローラシステム構成です。

ATOMS3でフライホイールを制御し、Seeed XIAOで足のサーボモータLX-224 (6個)を制御していました。

 

新規システム構成

以下が今回の構成です。

ESP32の評価ボード1台でホイールと足のサーボモータを制御しています。

ESP32はデュアルコアで使用してそれぞれのコアでフライホイールとサーボを制御します。
各コアでの初期設定の振り分けにも注意を払いました。

IMUとしてはMPU6050を使用しました。

[amazonjs asin=”B081RHK82T” locale=”JP” title=”KKHMF 2個 MPU-6050 6DOF GY-521 MPU6050 3軸ジャイロスコープ + 加速度センサーモジュール Arduino用”]

 

LiPoバッテリは従来とおり2セルの7.4Vのバッテリを使用。

[amazonjs asin=”B08S2W21CV” locale=”JP” title=”SUNPADOW 2S 7.4V リポバッテリーパック、900mAh 25C JSTプラグ付き、FPV、ドローンに適用 2つの包装”]

 

モータ駆動用の24Vを生成するDCDCモジュールは従来のS18V20F24が価格が高騰し更に入手が困難になってしまったため、同じ石が載っている低価格な以下のモジュールを採用しました。

[bc url=”http://strawberry-linux.com/catalog/items?code=12340″]

 

動作

新規システム構成で歩行動作の確認を行いました。

新規システムでも問題なく動作しております。

 

おわりに

ここではマイコンの数の削減と24V DCDCモジュールの低価格化をはかりました。
変更したシステムでも問題なく歩行動作が確認できましたので非常に喜んでいます。

低価格で良いものができたのでお財布にも優しく構成も家庭的になりました。
HomeMadeGarbageの思想に即したシステムが構築できましたので、ここで得た自信を胸に更にまい進したい所存です。

次の記事

二足歩行ロボット SHISEIGYO-1 Walker 改

二足歩行ロボット SHISEIGYO-1 Walker 改

これまでは SHISEIGYO-1 Walker 参 の足を改良して二足歩行動作を検証してきました。

二足歩行ロボット SHISEIGYO-1 Walker 参 改 3

 

ここでは 初代 SHISEIGYO-1 Walker の足を改良して歩行動作の検証を実施しましたので報告します。

 

 

ロール軸

SHISEIGYO-1 Walker 参 改 で前後の歩行を楽しみ、更なる動作の拡張を目指してロール軸の追加を試みたのですが。。。

機械強度やフライホイールトルクの不足などで SHISEIGYO-1 Walker 参 改 でロール軸追加は断念していました。

初代 SHISEIGYO-1 Walker

そこで初代 SHISEIGYO-1 Walker を用いてロール軸の検討をすることにしました。

初代 SHISEIGYO-1 Walker はサーボにKRS-3301を使用しており、ロール軸には直交軸フレームを使用して非常にコンパクトになっております。

 

初代 SHISEIGYO-1 Walker 改

早速、参 改のように初代 SHISEIGYO-1 Walker の足も改良しました。

サーボのトルク不足で速い動作は難しいですが、歩行を確認することができました。

 

ロール軸によるサイドステップ

足の改良ができましたので、ロール軸も動かしてのサイドステップ動作を確認します。
以下のような動作を仕込んでみました。

動作

実際に倒立させての動作が以下です。

相変わらずトルク不足で苦しいですが、ギリギリサイドステップによる横移動が確認できました。

 

おわりに

ここでは初代 SHISEIGYO-1 Walker の足を改良してロール軸を用いたサイドステップ移動動作を確認しました。

かなり大きな可能性が見いだせたので嬉しい限りです。

十分なトルクを有するサーボを用いて、安定したロール軸機構も検討して
縦横無尽 に二足歩行するロボットの完成を目指したいと思います。

以下はまとめの動画です。

二足歩行ロボット SHISEIGYO-1 Walker 参 改 3

前回はSHISEIGYO-1 Walker 参 改 の足に平行リンク機構を導入しサーボ削減しての歩行動作を確認しました。

二足歩行ロボット SHISEIGYO-1 Walker 参 改 3

 
ここでは、通常の足に戻して再度歩行動作の検証を行いました。
 

 

足のサーボ配置変更

足のサーボモータX-244の配置構成を変更して直立時の高さを32 mm低くしました。
高さ低減に伴って必要トルクも減るので、フライホイールの重量も減らしました。

 

動作

直立時の足の高さを下げたことにより、安定性が増しました。
倒立時の必要トルク低減のためにホイールの軽量化をしたことも安定性向上に寄与していると考えます。

もっと小型でハイパワーのサーボを用いれば、スマートな足になると思います。

 

おわりに

ここでは足のサーボの配置を変更し直立時の高さを低減して、安定性の向上をはかりました。

 

もう少し小型でパワーのあるサーボを探して試してみたいなと考えております。

追記

歩行動作各種検討 (23/2/26)

次の記事

二足歩行ロボット SHISEIGYO-1 Walker 改

二足歩行ロボット SHISEIGYO-1 Walker 参 改 3

二足歩行ロボット SHISEIGYO-1 Walker 参 改 2

前回はSHISEIGYO-1 Walker 参 の足の構成を再検討し、2足歩行動作を実施しました。

SHISEIGYO-2 Walker の歩行を再検討3

ここでは更に足の構成を再々検討しましたので報告します。

 

 

平行リンク機構検討

前回は片足を3個のサーボモータX-244で構成しました。
足元のサーボは足先を常に水平に保つように動かしているため、平行リンクを使用すれば削減できると考えました。

早速Fusion360を使用して、設計を兼ねて検証。

いい感じ。このように平行リンクを導入すれば、片足2個のサーボモータで足が構成できそうです。

 

設計した治具を3Dプリントして足を作製いたしました。

 

片足完成!

動作、強度 ともに大きな問題はなさそうです。

 

足完成&歩行テスト

もう片方の治具も3Dプリントして足完成。

歩行動作

リアクションホイールでのバランスによる歩行も実現できました。

 

平行リンク機構の導入でサーボモータの削減に成功いたしました!

 

ロール軸検討

平行リンクによってサーボモータが削減できたので、足を広げるためのロール軸サーボの追加を検討してみました。

しかし足を機械的に強く固定することが難しくなり倒立すらできませんでした。

 

ロール軸の固定のほかにも足の高さが増したことや、リンク機構の複雑さによるブレでホイール動作が安定しないことも考えられます。

 

ちょっと現状ではロール軸の追加は難しいので、ロール軸については今後は初代 SHISEIGYO-1 Walker で検討を進めたいと思います。

 

おわりに

ここではSHISEIGYO-1 Walker 参 改 の足に平行リンク機構を導入しサーボ削減しての歩行動作を確認しました。

削減した分のサーボでロール軸追加の検討も実施しましたが、うまく倒立動作ができなかったため 次回は初代 SHISEIGYO-1 Walker で検討をできればと考えています。

初代 SHISEIGYO-1 Walker はサーボにKRS3301を使用しており、ロール軸機構もコンパクトに実装可能です。

次の記事

二足歩行ロボット SHISEIGYO-1 Walker 参 改 2

二足歩行ロボット SHISEIGYO-1 Walker 参 改

以前 製作した SHISEIGYO-1 Walker Jr. の足のブレードの距離を開けてみたところ。。。

特に問題なく歩行できることが分かりました。

左右の足の接地線の距離が離れると歩行のたびに大きく重心位置が変わりますが、
リアクションホイールに仕込んでいるIDRS (倒立角動的再調整システム) がうまく効いてバランスを保持しているようです。

IDRS (倒立角動的再調整システム)については以下参照ください。

DRV8876を採用してセンサレス姿勢制御モジュール ーリアクションホイールへの道55ー

 

この結果を受けて、リアクションホイールでバランスをとる二足歩行ロボットを再検証しましたので報告します。

 

 

SHISEIGYO-1 Walker 参 で検討

SHISEIGYO-1 Walker 参 を用いて足の構成の再検討を実施します。
足先を1直線状に動かしてモデル歩きのような動作をするロボットです。

足は高トルクのシリアルサーボLX-244で構成しています。

足構成検討

とりあえず、ロール用の最上部サーボを取り除いて固定してみました。

この足先の形状では、明らかにうまくいきそうもありません。

足先製作

足先をL字状のブレードにしてみました。

片足のみですが、倒立も問題ないようです。
この形状であれば、左右の足の距離も大きく開くこともありません。

両足製作し足踏み動作を確認しました。

足踏みによって接地する足が変わっても、IDRS機能によってバランスが保たれています。

またSHISEIGYO-1 Walker 参 ではESP32のデュアルコアを用いて1台でフライホイールと足のサーボモータを制御していましたが、ここでは処理精度向上のためにESP32を2台使用してホイールとサーボをそれぞれ制御しています。

 

歩行

歩行動作を確認しました。

ゆっくりで姿勢は低い状態ですが無事に歩行動作を実現できました!!
モデル歩きなんて難しい方法ではなく最初からこうすれば良かった。。。ww

歩行メソッドは SHISEIGYO-2 WalkerやSHISEIGYO-1 Walker Jr.に適応したものと同様で正弦波で振動を抑えて制御しております。

SHISEIGYO-2 Walker の歩行を再検討3

システム構成

フライホイールとサーボモータの制御のためにESP32を2個使用しておりましたが、冗長でもったいないためシステムを再構成しました。

ATOMS3でフライホイールを制御し、Seeed XIAOで足のサーボモータ(6個)を制御するようにしました。

ATOMS3をAPモードにしてWiFiでブラウザからホイールの制御パラメータや足の座標や動作モードを指示します。
ATOMS3とXIAOはUARTで通信します。

[amazonjs asin=”B08KVZXKH2″ locale=”JP” title=”SeeedStudio Seeeduino XIAO(Arduinoマイクロコントローラ) 102010328″]

電源には2セルのLiPoバッテリを使用します。
[amazonjs asin=”B08S2W21CV” locale=”JP” title=”SUNPADOW 2S 7.4V リポバッテリーパック、900mAh 25C JSTプラグ付き、FPV、ドローンに適用 2つの包装”]

 

動作

更新したシステム構成で歩行動作確認

無事に動作しました。
このロボットを”SHISEIGYO-1 Walker 参 改”と命名!

 
足の高さを上げて、更に歩行速度も上げてみました。

いい感じ!姿勢がよくなり人間に近づきましたね。

 
更に足をのばしてみました。

こちらはまだ調整が必要そうです。。

 

おわりに

ここではSHISEIGYO-1 Walker 参 の足の構成を再検討し、2足歩行動作を実施しました。

現状では片足3個づつのサーボモータをしようしていますが、平行リンク機構を適応すれば片足サーボ2個で足を構築できます。

ロール用のサーボモータを追加すれば更に豊かな動作が実現できるかもしれません。

こいつは忙しくなりそうだゼ

次の記事

二足歩行ロボット SHISEIGYO-1 Walker 参 改 2

極小姿勢制御モジュール SHISEIGYO-1 DC センサレス Jr. ーリアクションホイールへの道56ー

前回は電流センシング機能付きのモータドライバDRV8876を使用してエンコーダなしのセンサレス姿勢制御モジュールを製作しました。

極小姿勢制御モジュール SHISEIGYO-1 DC センサレス Jr. ーリアクションホイールへの道56ー

ここではミニ四駆用のモータより更に小さいモータを使用して、モジュールの小型化を目指します。
 

 

コアレスモータ

モータ電流からモータ回転速度を推定できるようになったことで、回転検知エンコーダが必要なくなりました。
それに伴ってモータ選定の幅が大きく広がりました。

ここでは姿勢制御モジュールの小型化を目指して、小型ドローンで使用されるコアレスモータの使用を検討します。

[amazonjs asin=”B07CQW4H4M” locale=”JP” title=”コアレスモーター 高速モーター プロペラ ヘリ マルチコプターボディパーツ 全3選択   – モータ電圧3.7V, 7x20x5mm(モーターサイズ)”]

 

単純にミニ四駆モータからコアレスモータに変えただけですが、回転制御は問題なくできそうです。

 

極小姿勢制御モジュール完成

コアレスモータ専用の筐体を製作しました。

 
専用のホイールも製作して、極小姿勢制御モジュール “SHISEIGYO-1 DC センサレス Jr.”の完成です。

 

制御の構成は前回と全く同様で、ATOMS3でモータドライバDRV8876を介してモータを制御しています。
 

5重倒立を目指して

今回作成したSHISEIGYO-1 DC センサレス Jr. をこれまで最小であったSHISEIGYO-1 DC に載せてみました。

なんと問題なく載せることができ、11分以上倒立しました。
ノーカット版は以下

 

こうなると以前挑戦した4重倒立のその上を目指したくなるのがチャレンジャーの性というもの。

3重倒立

SHISEIGYO-1 DC センサレス Jr.、SHISEIGYO-1 DC、SHISEIGYO-1 Jr. の3重に挑戦

まぁまぁイケてる。

4重倒立

さらに下にSHISEIGYO-1を置いて4重に挑戦。

ちょっと厳しい。。。
調整と練習が必要ですね。

5重倒立実現にむけて努力します!

 

専用基板作製

DRV8876専用の基板も作製しました。

専用基板によって更に小型化できましたので、5重倒立に向けて検討進めたいと思います!

DRV8876を採用してセンサレス姿勢制御モジュール ーリアクションホイールへの道55ー

前回は電流センサでモータ電流を検知して回転速度を推定し、磁気エンコーダなしでのセンサレス姿勢制御モジュールの倒立動作を実現しました。

SHISEIGYO-1 DC 完成!  ーリアクションホイールへの道47ー

 

ここでは電流センシング機能付きモータドライバを採用して更に部品点数の削減を試みました。

 

 

モータドライバ DRV8876

DRV8876は電流センシング機能付きのモータドライバです。
電流は以下のデータシートの図の通りドライバ下部のシャント抵抗で検知します。

DRV8876データシート

検知した電流をミラーしてIPROPIに流して外付け抵抗で電圧として測定できます。

 

ここではPololuのモジュールを購入しました。

Pololuのモジュールは電流センス用の抵抗やは逆起電力対策回路も内蔵で非常に使いやすかったです。

 

DRV8876による回転と電流検知

PololuのDRV8876モジュールで回転と電流検知を確認して観ます。

回転は以下のようにPhase / Enableモードで制御しました。

ENピンにPWM信号を入力し、PHピンで正転/反転を指示します。
CSピンの電圧で電流が検知できます。
 
 

ATOMS3をコントローラとして回転させました。
可変抵抗でENピンへのPWM信号のデューティ比を指定しています。
ボタンで正転/反転。

電流値も観測できました!
モータ電流の方向までは検知できないため、正転/反転信号で符号反転しました。

 

姿勢制御モジュール作製

DRV8876モジュールによる回転動作と電流センシングが確認できましたので、前回と同様にモータ電流を検知して回転速度を推定し、姿勢制御モジュールの倒立動作を目指します。

モータは普通のミニ四駆モータを使用します。
固定具を3Dプリントしました。

 

ATOMS3とDRV8876モジュールも配線。
モジュールに逆起電力対策回路や電源コンデンサもしっかり載ってるので非常に簡単に制御基板ができました。

 

動作

DRV8876によるセンサレス姿勢制御モジュールが完成しました!!
電流による推定回転速度でも力強い倒立が実現できております。

 

おわりに

これまではDCモータを用いた1軸 姿勢制御モジュールとしてSHISEIGYO-1 DCの製法レシピを販売しておりました。

SHISEIGYO-1 DC の製作レシピ

 
電流センサによって回転推定ができることがわかり磁気エンコーダが削減され、
モータもダブルシャフトではなく普通のモノが使用できるようになりました。
更にこの度モータドライバDRV8876を採用することで外付けの電流センサも必要がなくなり、部品点数の少ない1軸 DCモータ 姿勢制御モジュールが実現できました。

専用基板を設計して、より親しみやすいDCモータ 1軸 姿勢制御モジュールの製作レシピを完成できればと考えております。

次の記事

DRV8876を採用してセンサレス姿勢制御モジュール ーリアクションホイールへの道55ー

センサレス姿勢制御モジュール完成 ーリアクションホイールへの道54ー

先日は電流センサを用いて回転速度を推定するDCモータのセンサレス制御について学習しました。

SHISEIGYO-1 DC 完成!  ーリアクションホイールへの道47ー

 

ここではこのセンサレス回転速度制御を姿勢制御モジュールに応用してみます。

 

 

SHISEIGYO-1 DC 改造

1軸姿勢制御モジュール SHISEIGYO-1 DC をモータ電流をセンシングできるように改造して、回転速度を推定しての倒立を目指します。

SHISEIGYO-1 DC の製作レシピ

 

電流センサは以下を使用して、モータ配線間に挿入します。

[amazonjs asin=”B08QMCCYVZ” locale=”JP” title=”Hailege 2個セット ACS712 20A電流センサーモジュールACS712 20A電流検出範囲Arduino用”]

 
コントローラはセンサレス回転制御の検討時と同様にATOMS3を採用しました。

 

回転速度を推定するので磁気エンコーダは除去しました。
今回使用した基板はモータドライバ (DRV8835)を裏面に実装する古いものを使用しました。

 

回転速度推定

1軸姿勢制御モジュール SHISEIGYO-1 DC は以下のようにモジュールの姿勢角($θ_b$) とその角速度($\dotθ_b$) とモータの回転速度($\omega$) からモータに入力するべき電圧 (実際にはモータドライバに印可するPWM信号のデューティ比)を導出しています。
 $K_p$、$K_d$、$K_w$は調整パラデータ

$$V = K_p・θ_b+K_d・\dotθ_b+K_w・\omega (1)$$

ここではモータの回転速度($\omega$) を磁気エンコーダによるものから電流センサによる推定値に変更します。

モータは以下のようにモデル化できます。$E_m$は誘起電圧

上のモデルより回転速度($\omega$)は以下で導出できます。

$$\omega=\frac{V-(R+sL)I}{\Phi_m}\fallingdotseq\frac{V-RI}{\Phi_m}   (2)$$

インダクタンスの微分項は無視します。倒立時の応答はそれなりに早いので無視できない可能性ありますが簡単のために省略します!
Vは式(1)で算出された値、Iは電流センサで検出した値を用います。

モータの抵抗$R$と磁束密度$\Phi_m$は前回測定した値を使用します。

式(2)で得た推定回転速度を式(1)の$\omega$にフィードバックして姿勢制御回転をさせます。

参考文献

[amazonjs asin=”4789846342″ locale=”JP” title=”高トルク&高速応答! センサレス・モータ制御技術 (パワー・エレクトロニクス・シリーズ)”]

 

倒立動作

電流センサで回転速度を推定して倒立動作の検証を実施しました。

問題なく倒立動作が実現されました。
この変更に際して式(1)の$K_p$、$K_d$、$K_w$は再調整しました。

 

おわりに

ここでは電流を検知して回転速度を推定し、磁気エンコーダなしでの姿勢制御モジュールの倒立動作を実現しました。

センサレス姿勢制御モジュールの爆誕です!
(まぁ電流センサ使ってるんだけど。。)

DCモータはフライホイールと磁気エンコーダ用の円盤磁石を取り付けるためにダブルシャフトモータを使っておりました。

この度 磁気エンコーダの除去が実現されたので、普通のモータでも姿勢制御できそうです。
また、電流センシング機能付きモータドライバを採用することで更にコンパクトなシステムが実現できるかもしれません。

次の記事

DRV8876を採用してセンサレス姿勢制御モジュール ーリアクションホイールへの道55ー

ATOMS3 で姿勢制御モジュール  ーリアクションホイールへの道53ー

先日 ATOMS3 という製品がM5Stack社から発売されました。

[bc url=”https://docs.m5stack.com/en/core/AtomS3″]

M5ATOM MatrixのLEDマトリクスがLCD (128×128ピクセル)に変更され、コントローラとしてESP32-S3が採用されています。

この度 ATOMS3 を入手し姿勢制御モジュールを製作しましたので報告させていただきます。

 

 

ATOMS3

待ちわびた製品が到着。白くてカワイイ

 

コントローラがESP32-S3に変わったのでピン番号が変わっていますが、電源・GNDやIMUのI2Cピンなど構成はMatrixと同様です。

 

姿勢制御モジュールで味見

試しにM5ATOM Matrix を使って製作したSHISEIGYO-1  Jr. をATOMS3で試してみました。

 

ATOMS3のArduinoライブラリが用意されていましたが、この時点 (2022/12/28)ではコンパイルエラーで使用できませんでした。

ATOMS3ライブラリは使用せずにSHISEIGYO-1  Jr. のコードをそのまま使用し、対応するGPIOの番号を変えるのみで動作しました。
Arduino IDEでのボードは”ESP32S3 Dev Module”を選択。
ディスプレイはまだ駆動できていません。

もう1点 Matrixと比較してIMUセンサMPU6886の軸が異なっていました。
ATOM MatrixはLED基板の裏に実装されていましたが、ATOMS3は恐らく本体基板に普通に実装されてるようです (中みていないので確定ではないですが)。

傾きを算出する際に注意が必要となります。

 

ディスプレイ表示

ATOMS3には128×128のLCDが搭載されております。ピンアサインはパッケージに記載があるのですがドライバが不明で良くわからず。。
しかも専用ライブラリは現状使えないので途方に暮れていたのですが、Twitter上でM5GFXライブラリで表示可能との情報を得ました。

[bc url=”https://github.com/m5stack/M5GFX”]

 

早速 表示実験

M5GFXライブラリのおかげで何の設定もなしに簡単に表示できました。ありがたや。
小さいディスプレイですがコントラストも良く視野角も広くて素晴らしいです。

 

SHISEIGYO-1 Jr. S3

ディスプレイ表示ができるようになったので、姿勢制御モジュールを仕上げました。

SHISEIGYO-1 Jr. S3 爆誕
ということで ATOMS3 の白いボディに合わせて真っ白に仕上げてみました。
ディスプレイ表示もいい感じです♪

Arduino IDEコード

SHISEIGYO-1  Jr. のサンプルコードをベースにコーディングしました。

#include "MPU6886.h"
#include <Kalman.h>
#include "FastLED.h"
#include <WiFi.h>
#include <WebServer.h>
#include <Preferences.h>
#include <M5GFX.h>

M5GFX lcd;

WebServer server(80);

const char ssid[] = "SHISEIGYO-1 Jr.";  // SSID
const char pass[] = "password";   // password

const IPAddress ip(192, 168, 22, 10);      // IPアドレス
const IPAddress subnet(255, 255, 255, 0); // サブネットマスク

#define ENC_A 5
#define ENC_B 6
#define brake 7
#define rote_pin 1
#define PWM_pin 2
#define button 41

MPU6886 IMU;

unsigned long oldTime = 0, loopTime, nowTime;
float dt;

volatile byte pos;
volatile int  enc_count = 0;

float Kp = 1.8;
float Kd = 2;
float Kw = 0.4;
float IDRS = 0.6;

float getupRange = 0.1;
float injectRatio = 14;
int rotMaxL = 720;
int rotMaxR = 790;

int delayTime = 2;

int pwmDuty;
int GetUP = 0;
int GetUpCnt = 0;

float M;
float Aj = 0.0;

float accX = 0, accY = 0, accZ = 0;
float gyroX = 0, gyroY = 0, gyroZ = 0;
float temp = 0;

float theta_acc = 0.0;
float theta_dot = 0.0;

Kalman kalmanY;
float kalAngleY, kalAngleDotY;

Preferences preferences;


//加速度センサから傾きデータ取得 [deg]
float get_theta_acc() {
  IMU.getAccelData(&accX,&accY,&accZ);
  //傾斜角導出 単位はdeg
  theta_acc  = atan(-1.0 * accX / accZ) * 57.29578f;
  return theta_acc;
}

//Y軸 角速度取得
float get_gyro_data() {
  IMU.getGyroData(&gyroX,&gyroY,&gyroZ);
  theta_dot = gyroY;
  return theta_dot;
}

//起き上がり
void getup(){
  digitalWrite(brake, HIGH);
  int rotMax;
  //回転方向
  if(kalAngleY < 0.0){
    rotMax = rotMaxL;
    digitalWrite(rote_pin, LOW);
    GetUP = 1;
  }else{
    rotMax = rotMaxR;
    digitalWrite(rote_pin, HIGH);
    GetUP = 2;
  }

  for(int i = 1023; i >= rotMax; i--){
    ledcWrite(0, i);
    delay(5);
  }
  ledcWrite(0, rotMax);
  delay(300);
  
  if(kalAngleY > 0.0){
    digitalWrite(rote_pin, LOW);
  }else{
    digitalWrite(rote_pin, HIGH);
  }
}


//Core0
void display(void *pvParameters) {
  for (;;){
    lcd.setTextFont(4);
    lcd.setCursor(10, 2);
    lcd.printf("%+05.1f", kalAngleY);

    int yy = map(kalAngleY, 20, -20, 0, 127);
    yy = constrain(yy, 0, 127);
    uint32_t colorY;

    if(fabs(kalAngleY) <= 1.0){
      colorY = 0x00FF00U;
    }else if(fabs(kalAngleY) <= 15){
      colorY = 0x0000FFU;
    }else{
      colorY = 0xFF0000U;
    }
    lcd.fillRect(yy - 2, 25, 5, 128, colorY);
    delay(33);
    lcd.clear();

    disableCore0WDT();
  }
}

//ブラウザ表示
void handleRoot() {
  String temp ="<!DOCTYPE html> \n<html lang=\"ja\">";
  temp +="<head>";
  temp +="<meta charset=\"utf-8\">";
  temp +="<title>SHISEIGYO-1 Jr.</title>";
  temp +="<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">";
  temp +="<style>";
  temp +=".container{";
  temp +="  max-width: 500px;";
  temp +="  margin: auto;";
  temp +="  text-align: center;";
  temp +="  font-size: 1.2rem;";
  temp +="}";
  temp +="span,.pm{";
  temp +="  display: inline-block;";
  temp +="  border: 1px solid #ccc;";
  temp +="  width: 50px;";
  temp +="  height: 30px;";
  temp +="  vertical-align: middle;";
  temp +="  margin-bottom: 20px;";
  temp +="}";
  temp +="span{";
  temp +="  width: 120px;";
  temp +="}";
  temp +="button{";
  temp +="  width: 100px;";
  temp +="  height: 40px;";
  temp +="  font-weight: bold;";
  temp +="  margin-bottom: 20px;";
  temp +="}";
  temp +="</style>";
  temp +="</head>";
  
  temp +="<body>";
  temp +="<div class=\"container\">";
  temp +="<h3>SHISEIGYO-1 Jr.</h3>";
  
  //起き上がりボタン
  temp +="<button type=\"button\" ><a href=\"/GetUp\">GetUp</a></button><br>";

  //Kp
  temp +="Kp<br>";
  temp +="<a class=\"pm\" href=\"/KpM\">-</a>";
  temp +="<span>" + String(Kp) + "</span>";
  temp +="<a class=\"pm\" href=\"/KpP\">+</a><br>";

  //Kd
  temp +="Kd<br>";
  temp +="<a class=\"pm\" href=\"/KdM\">-</a>";
  temp +="<span>" + String(Kd) + "</span>";
  temp +="<a class=\"pm\" href=\"/KdP\">+</a><br>";

  //Kw
  temp +="Kw<br>";
  temp +="<a class=\"pm\" href=\"/KwM\">-</a>";
  temp +="<span>" + String(Kw) + "</span>";
  temp +="<a class=\"pm\" href=\"/KwP\">+</a><br>";

  //Rot Max L
  temp +="Rot Max L<br>";
  temp +="<a class=\"pm\" href=\"/rotMaxLm\">-</a>";
  temp +="<span>" + String(rotMaxL) + "</span>";
  temp +="<a class=\"pm\" href=\"/rotMaxLp\">+</a><br>";

  //Rot Max R
  temp +="Rot Max R<br>";
  temp +="<a class=\"pm\" href=\"/rotMaxRm\">-</a>";
  temp +="<span>" + String(rotMaxR) + "</span>";
  temp +="<a class=\"pm\" href=\"/rotMaxRp\">+</a><br>";

  //IDRS
  temp +="IDRS<br>";
  temp +="<a class=\"pm\" href=\"/IDRSm\">-</a>";
  temp +="<span>" + String(IDRS) + "</span>";
  temp +="<a class=\"pm\" href=\"/IDRSp\">+</a><br>";
  
  temp +="</div>";
  temp +="</body>";
  server.send(200, "text/HTML", temp);
}

void handleGetUp() {
  handleRoot();
  if(GetUP == 0){
    getup();
  }
}

void KpM() {
  if(Kp >= 0.1){
    Kp -= 0.1;
    preferences.putFloat("Kp", Kp);
  }
  handleRoot();
}

void KpP() {
  if(Kp <= 30){
    Kp += 0.1;
    preferences.putFloat("Kp", Kp);
  }
  handleRoot();
}

void KdM() {
  if(Kd >= 0.1){
    Kd -= 0.1;
    preferences.putFloat("Kd", Kd);
  }
  handleRoot();
}

void KdP() {
  if(Kd <= 30){
    Kd += 0.1;
    preferences.putFloat("Kd", Kd);
  }
  handleRoot();
}

void KwM() {
  if(Kw >= 0.1){
    Kw -= 0.1;
    preferences.putFloat("Kw", Kw);
  }
  handleRoot();
}

void KwP() {
  if(Kw <= 30){
    Kw += 0.1;
    preferences.putFloat("Kw", Kw);
  }
  handleRoot();
}

void handleRotMaxLm() {
  if(rotMaxL >= 10){
    rotMaxL -= 10;
    preferences.putInt("rotMaxL", rotMaxL);
  }
  handleRoot();
}

void handleRotMaxLp() {
  if(rotMaxL <= 1010){
    rotMaxL += 10;
    preferences.putInt("rotMaxL", rotMaxL);
  }
  handleRoot();
}

void handleRotMaxRm() {
  if(rotMaxR >= 10){
    rotMaxR -= 10;
    preferences.putInt("rotMaxR", rotMaxR);
  }
  handleRoot();
}

void handleRotMaxRp() {
  if(rotMaxR <= 1010){
    rotMaxR += 10;
    preferences.putInt("rotMaxR", rotMaxR);
  }
  handleRoot();
}

void IDRSm() {
  if(IDRS >= 0.1){
    IDRS -= 0.1;
    preferences.putFloat("IDRS", IDRS);
  }
  handleRoot();
}

void IDRSp() {
  if(IDRS <= 10){
    IDRS += 0.1;
    preferences.putFloat("IDRS", IDRS);
  }
  handleRoot();
}

void setup() {
  Serial.begin(115200);

  lcd.begin();
  lcd.setTextColor(0xFFFFFFU, 0x000000U); //1つ目の引数が文字色、2つ目の引数が背景色
  
  
  pinMode(ENC_A, INPUT);
  pinMode(ENC_B, INPUT);
  pinMode(brake, OUTPUT);
  pinMode(button, INPUT);
 
  attachInterrupt(ENC_A, ENC_READ, CHANGE);
  attachInterrupt(ENC_B, ENC_READ, CHANGE);

  IMU.Init();

  //フルスケールレンジ
  IMU.SetAccelFsr(IMU.AFS_2G);
  IMU.SetGyroFsr(IMU.GFS_250DPS);

  kalmanY.setAngle(get_theta_acc());

  ledcSetup(0, 20000, 10);
  ledcAttachPin(PWM_pin, 0);
  
  pinMode(rote_pin, OUTPUT);
  digitalWrite(brake, LOW);

  preferences.begin("parameter", false);

  //パラメータ初期値取得
  rotMaxL = preferences.getInt("rotMaxL", rotMaxL);
  rotMaxR = preferences.getInt("rotMaxR", rotMaxR);
  Kp = preferences.getFloat("Kp", Kp);
  Kd = preferences.getFloat("Kd", Kd);
  Kw = preferences.getFloat("Kw", Kw);
  IDRS = preferences.getFloat("IDRS", IDRS);
 

  WiFi.softAP(ssid, pass);           // SSIDとパスの設定
  delay(100);                        // 追記:このdelayを入れないと失敗する場合がある
  WiFi.softAPConfig(ip, ip, subnet); // IPアドレス、ゲートウェイ、サブネットマスクの設定
  
  IPAddress myIP = WiFi.softAPIP();  // WiFi.softAPIP()でWiFi起動

  server.on("/", handleRoot); 
  server.on("/GetUp", handleGetUp);
  
  server.on("/KpP", KpP);
  server.on("/KpM", KpM);
  server.on("/KdP", KdP);
  server.on("/KdM", KdM);
  server.on("/KwP", KwP);
  server.on("/KwM", KwM);
  
  server.on("/rotMaxLm", handleRotMaxLm);
  server.on("/rotMaxLp", handleRotMaxLp);
  server.on("/rotMaxRm", handleRotMaxRm);
  server.on("/rotMaxRp", handleRotMaxRp);

  server.on("/IDRSp", IDRSp);
  server.on("/IDRSm", IDRSm);
  
  server.begin();

  //回転位置検出 タスク
  xTaskCreatePinnedToCore(
    display
    ,  "display"   // A name just for humans
    ,  4096  // This stack size can be checked & adjusted by reading the Stack Highwater
    ,  NULL
    ,  1  // Priority, with 3 (configMAX_PRIORITIES - 1) being the highest, and 0 being the lowest.
    ,  NULL 
    ,  0);
}


void loop() {
  server.handleClient();
  
  //オフセット再計算&起き上がり
  if (digitalRead(button) == 0){
    getup();
  }
  
  nowTime = micros();
  loopTime = nowTime - oldTime;
  oldTime = nowTime;
  
  dt = (float)loopTime / 1000000.0; //sec
  
  //モータの角速度算出
  float theta_dotWheel = -1.0 * float(enc_count) * 3.6 / dt;
  enc_count = 0;
  
  //カルマンフィルタ 姿勢 傾き
  kalAngleY = kalmanY.getAngle(get_theta_acc(), get_gyro_data(), dt);
  
  //カルマンフィルタ 姿勢 角速度
  kalAngleDotY = kalmanY.getRate();


  if(GetUP == 1 || GetUP == 2){
    if(GetUP == 1 && kalAngleY >= getupRange){
      digitalWrite(brake, LOW);
      GetUP = 99;
    }else if(GetUP == 2 && kalAngleY <= -getupRange){
      digitalWrite(brake, LOW);
      GetUP = 99;
    }else{
      if(GetUP == 1 && kalAngleY < 0 || GetUP == 2 && kalAngleY > 0){
        ledcWrite(0, max(1023 - int(injectRatio * fabs(kalAngleY)), 0));
      }else {
        ledcWrite(0,511);
      }
    }
  }else {
    if (fabs(kalAngleY) < 1 && GetUP == 0){
      GetUP = 80;
    }

    /*
    Serial.print("Kp: ");
    Serial.print(Kp);
    Serial.print(", Kd: ");
    Serial.print(Kd,3);
    Serial.print(", Kw: ");
    Serial.print(Kw, 3);
    Serial.print(", kalAngleY: ");
    Serial.print(kalAngleY);
    */
      
    
    if(GetUP == 99 || GetUP == 80){
      //ブレーキ
      if(fabs(kalAngleY) > 15.0){
        digitalWrite(brake, LOW);
        Aj = 0.0;
        GetUP = 0;
      }else{
        digitalWrite(brake, HIGH);
      }
        
      //モータ回転
      if(GetUP == 80){
        M = Kp * kalAngleY / 90.0 + Kd * kalAngleDotY / 500.0 + Kw * theta_dotWheel / 20000.0;
        GetUpCnt++;
        if(GetUpCnt > 100){
          GetUpCnt = 0;
          GetUP = 99;
        }
      }else{
        Aj +=  IDRS * theta_dotWheel / 1000000.0;
        M = Kp * (kalAngleY + Aj) / 90.0 + Kd * kalAngleDotY / 500.0 + Kw * theta_dotWheel / 10000.0;
      }
      M = max(-1.0f, min(1.0f, M));
      pwmDuty = 1023 * (1.0 - fabs(M));
      
        
      //回転方向
      if(M > 0.0){
        digitalWrite(rote_pin, LOW);
        ledcWrite(0, pwmDuty);
      }else{
        digitalWrite(rote_pin, HIGH);
        ledcWrite(0, pwmDuty);
      }
    }
      
    
    Serial.print(", loopTime: ");
    Serial.print((float)loopTime / 1000.0);
    
    
    delay(delayTime);
      
    Serial.println("");
  }
}

//ブラシレスモータエンコーダ出力 割り込み処理
//参考:https://jumbleat.com/2016/12/17/encoder_1/
void ENC_READ() {
  byte cur = (!digitalRead(ENC_B) << 1) + !digitalRead(ENC_A);
  byte old = pos & B00000011;
  byte dir = (pos & B00110000) >> 4;
 
  if (cur == 3) cur = 2;
  else if (cur == 2) cur = 3;
 
  if (cur != old)
  {
    if (dir == 0)
    {
      if (cur == 1 || cur == 3) dir = cur;
    } else {
      if (cur == 0)
      {
        if (dir == 1 && old == 3) enc_count--;
        else if (dir == 3 && old == 1) enc_count++;
        dir = 0;
      }
    }
 
    bool rote = 0;
    if (cur == 3 && old == 0) rote = 0;
    else if (cur == 0 && old == 3) rote = 1;
    else if (cur > old) rote = 1;
 
    pos = (dir << 4) + (old << 2) + cur;
  }
}

 

ESP32-S3対応のためにGPIO番号を修正しています。
MPU6886.cppのI2Cピン番号も変更が必要です。 [ Wire1.begin(38,39,100000); ]

カルマンフィルタで誤差算出をするので、事前のIMUのオフセットの導出は必要ないことに気づいたので廃止しました。

ディスプレイはデュアルコアにしてcore0で表示させています。

 

モジュールの各変数はAPモードでESP32-S3とつなげて、ブラウザから調整できるようにしています。
調整した値は電源OFF後もフラッシュで記憶されます。
起き上がり動作ボタンも実装しています。

コードでは “SHISEIGYO-1 Jr.” にWiFi接続して (パスワード:”password”)、192.168.22.10にブラウザアクセスで設定画面が表示されます。

 

おわりに

ATOMS3を用いて姿勢制御モジュールの製作を楽しみました。
小型ですがきれいなディスプレイもついて しかも低価格なのでATOMS3は非常におすすめの製品です。

まだライブラリが整ていないようで、ツギハギのコードになってしまいましたが動けばこっちのもんです。

しかしこれまでのSHISEIGYO-1 もATOM Matrixのライブラリが成熟する前に製作したので、今度どこかのタイミングで最新ライブラリでコードをきれいにまとめたいなぁなんて思っています。

次の記事

SHISEIGYO-1 DC 完成!  ーリアクションホイールへの道47ー

SHISEIGYO-1 Walker Jr. 差動駆動型リンク機構で歩行

前回はSHISEIGYO-1 Walker Jr. の足に平行リンク機構を採用し、ヒザのある歩行を実現いたしました。

SHISEIGYO-1 Walker Jr. ヒザ爆誕

ここでは差動駆動型リンク機構を試しましたので報告いたします。

 

差動駆動型リンク機構

差動駆動型リンク機構を用いれば、モータを上部に2個配置するのみでヒザ上げや足の前後移動が可能になります。

 

早速 Fusin360上でSHISEIGYO-1 Walker Jr. の足に差動駆動型リンク機構を取り入れてみました。

非常にいい感じです。

足製作

CAD設計した足を3Dプリントして組み立てます。

 

片足完成。うまくいった。

 

もう片方も完成。遂に憧れの屈伸運動ができるようになりました。

参考

  • ROBO-ONEにチャレンジ! 二足歩行ロボット自作ガイド
    [amazonjs asin=”427422211X” locale=”JP” title=”ROBO-ONEにチャレンジ! 二足歩行ロボット自作ガイド”]

 

足動作検証

差動駆動型リンク機構の足が完成しましたので、歩行に向けて足踏み動作を確認しました。

 

機構の関節の締め付けが甘く足踏みのたびに回転してしまいましたが、調整で改善しました。

足踏み動作も実現されましたので いよいよ歩行に挑戦です。

 

逆運動学

差動駆動型リンク機構によって足先の上下、前後移動が可能になりました。
これまではサーボモータの角度を直接指定して動作させてきましたが、ここからは足先の座標を指定して逆運動学でサーボ角度を算出して制御します。

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

 

逆運動学 算出

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

$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}{y} \right)$$

$$       l_d = \sqrt{x^2 + y^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, y)からサーボモータの角度を導出できるようになりました。

動作

まずは逆運動学で足の高さを指定して、屈伸と足踏み動作を確認しました。

なめらかで非常に良い動きです。サーボの駆動音も低減されました。

 

歩行

いよいよ歩行です。
SHISEIGYO-2 Walkerで検証した歩行メソッドを適応させます。

 

ヒザによる足上げを伴う歩行が遂に実現されました。

 

歩みを徐々に速くしてみた。

 

おわりに

ここではSHISEIGYO-1 Walker Jr. の足に差動駆動型リンク機構を採用し、さらに足を逆運動学で制御することでの歩行動作を確認いたしました。

差動駆動型リンク機構によって片足サーボ2個のみで足先の上下前後動作ができ、
逆運動学によってスムーズな移動が実現されました。

その半面、機構が複雑になったことにより足のブレも大きくなり若干バランスが悪化しフライホイールの調整は難しかったです。
今後の課題といたしましては差動駆動型リンク機構による足の製作の精度向上が挙げられます。

SHISEIGYO-1 Walker Jr. は1週間ほどで大きく進化しましたので、引き続き取り組んでいきます!

SHISEIGYO-1 Walker Jr. ヒザ爆誕

前回は1個のリアクションホイールでバランスする小型の2足歩行ロボット”SHISEIGYO-1 Walker Jr. “の誕生を報告いたしました。

SHISEIGYO-1 Walker Jr. ヒザ爆誕

今回は足について更に検討してみましたので報告いたします。

 

リンク機構

足の検討に際しまして、まずリンク機構について学習しました。
CADソフトFusion360で機構を構成し動作を確認します。

上はオーソドックスな平行四辺形型のリンク機構動作を試したものです。
上辺を水平に固定すれば、縦の辺をどの角度にしても下辺は水平を保っています。

図らずも前回作製した SHISEIGYO-1 Walker Jr. の足はこの機構を使用しており、
長辺2つをサーボで動かしている格好となっております。


ロボット犬 Mini Pupper の足もこの機構の変形版であることが分かります。

平行リンク機構

更に辺を追加した平行リンク機構の動作は以下の通りです。

上辺を水平に固定すれば、残りの横の辺は水平を保持します。
更にヒザのような機構がうまれ下部の辺の角度も変えることで人間のような足の動作ができております。

差動駆動型リンク機構

平行リンク機構では下腿の角度を変えるにはヒザより下にモータを配置する必要があります。
以下の差動駆動型リンク機構を用いれば、上部にモータを配置することが可能となります。

差動駆動型リンク機構は上部にモータを2つ配置して、大腿と下腿を制御できる素晴らしい気候であることを学びました。

参考

平行リンク機構による足

ここでは平行リンク機構を用いでSHISEIGYO-1 Walker Jr.の足を再構築しヒザのある歩行を目指します。

 

足上部の大体の辺2本をサーボで動かし、下腿は直角固定で動かしてみます。

平行リンク機構の採用でヒザができました!生命感が少し増したようにも感じます。
前回に比べ足が長くなり高くなったのでフライホイールは2枚重ねにしてトルクを向上しています。

しかし下腿は直角で固定しましたので足を後方に下げた際に逆関節になってしまいます。

より生物らしい歩行を目指すのであれば、差動駆動型リンク機構を導入する必要がありそうです。

引き続き検討を進めます。

 

次の記事

SHISEIGYO-1 Walker Jr. 差動駆動型リンク機構で歩行