
ブラシレスモータで2足歩行ロボット9 ー CAN通信導入 ー
前回は足踏みや歩行動作の検討を実施しました。
足のロール軸駆動をサーボモータからブラシレスモータにして立派な動作を実現できると思ったのですが、左右の足動作の切り替え自動化が難しかったです。
左右の足動作の切り替えを時間指定ではなくIMUセンサでうまいことウェイトシフト検知して実施したいと思ったのですが上手くいかず、結局 足上げ着地後に振動が収まるのをIMUで検知してから他方の足の動作を開始させることとなりスムーズ動作は実現できませんでした。
前回の結論としてIMUセンサによるウエイトシフト検知は難しいということがわかりました。
ロール軸モータによってIMU搭載ATOM Matrixが載ったボディを平行にしようとする制御がなされることもウェイトシフト検知を難しくしています。
そこでここでは別のウェイトシフト検知手法を検討しましたので報告します。
目次
ウェイトシフト検知
あらためて本ロボットの足の動作を足踏みで説明します。
- 片足で地面を蹴ってから足を上げる
足の蹴る量と速さ、そして上げる高さと速さはパラメータ値として指定 - 蹴り上げによって傾いた機体が戻るタイミングをIMU角速度の符号反転で検知してあげた足を初期高さに下げる。
- 戻した足が接地してウエイトが乗ったら反対の足の蹴り上げ動作を開始
上記を繰り返して足踏み動作とするのですが、反対の足を動かすトリガとなる、足の接地具合つまりウェイトシフトの検知が難しいと感じています。
ロール軸は機体姿勢を極力平行に保つようにIMU値で常に制御させています。
足接地後に十分時間をとったり前回のようにIMUで振動が収まる待つのは面白くないから嫌だ。
動作がかなりもたつくことになるので。。。せっかくロール軸もブラシレスモータにしたのにねぇ。
かといってIMUによる機体姿勢や角速度で足のウェイトの乗り具合の判定は難しい。。
そこでウェイトシフトを足モータのトルクつまり電流値で検知したいと思います。
トルクを直接測ればウェイトシフト検知が容易にできると考えたのです。
CAN通信
本ロボットの現状の通信システムは以下のとおり
中枢コントローラATOM Matrixからロール軸や足のモータに動作信号を送っています。
通信はUARTシリアル通信で実施しています。
ESP32はシリアルポートが3つと制限があります (1つはプログラム書き込み用のため実質2個)。
そのため足への信号は片足に送ってから他方に再度送るなどの工夫をしています。
このシステムでさらにモータトルク通信を追加するのはちょっと難しい。。。やりたくない。
CAN通信導入
そこでいい機会ですのでバス通信を導入します。
最近よく耳にするCAN通信でやってみようと思います。
よく聞くってことは良いものなのだろうから。
早速 CAN-UART変換モジュール VP230を購入
ESP32のライブラリにはデフォルトでCAN通信が用意されています。
但し、CANではなくTWAI (Two-Wire Automotive Interface) という名前でうたわれています。
まぁなんか事情があるのでしょう。使えればいいから こちとら
CAN通信 (ESP32の世界ではTWAIというらしい)
ふーん
1対1だと何の感情も湧かないね pic.twitter.com/AHTB7oKzTE— HomeMadeGarbage (@H0meMadeGarbage) March 22, 2025
まずはロール軸に導入して中枢コントローラATOM MatrixからCAN通信で角度指定して動かしてみました。
なんとなくいい感じがする。。誉れ高き差動通信が心強いです。
IMU搭載ハイパー中枢コントローラATOMからCANもといTWAI通信にてロール軸制御
これまでは野蛮なUART通信で実施していたが動きが全然違う
艶が出た pic.twitter.com/D6lHvDGUD7
— HomeMadeGarbage (@H0meMadeGarbage) March 23, 2025
そのまま足モータ間にもCANを導入
同様にATOM Matrixから足座標をそれぞれに送信
CAN通信システム完成
動作が実にエレガントこれで通信のせいで動かないとか言い訳できなくなった
現状は中枢コントローラATOMから各モータへ座標や角度を送信のみだがゆくゆくはモータのトルクなんかも共有してさらに豊かな動作を目指したい pic.twitter.com/EwPJhIOW50
— HomeMadeGarbage (@H0meMadeGarbage) March 23, 2025
いままでの通信システムがお粗末だったので、動作も若干良くなりました。
気のせいかもしれないが
CAN通信による足踏み
ハンパない艶が違う艶が pic.twitter.com/ALXMdZ508M— HomeMadeGarbage (@H0meMadeGarbage) March 23, 2025
ちなみにCAN通信ボーレートは1Mbpsとしました。
モータトルク取得
CAN通信システムが確立できたのでモータトルク検知の検討を進めたいと思います。
まずは足のコントローラにUSBケーブルをつないで直接ブラシレスモータの電流を観測してみました。
足踏み時の右足電流観測
意外なのが他方の足蹴り上げ時にもトルク減るんだなと
ちょっとジャンプしちゃってるんだな (そりゃ滑るわ。。まぁおいおい調整)太ももモータでもふくらはぎモータでも波形に差はないから1個づつ観測でステーツ分類できそうだ pic.twitter.com/9008EK35mN
— HomeMadeGarbage (@H0meMadeGarbage) March 24, 2025
足の動作に連動してモータの電流値が変動しているのがわかります。
リンク機構の足の2個のモータの電流をみていますが、それぞれに大きな差は無いのでいづれか1つの電流をみれば十分そうです。
ちなみに基板むき出しが転んだりすると怖くなってきたので、アーマーを付けました。
各足の1個のモータ(ふくらはぎ) の電流値をATOM MatrixにCAN送信するようにしました。
足モータのトルクも監視できるようになった
この左右の大小とかでウェイトシフト検知できるような気がする pic.twitter.com/BwgDdOVtre— HomeMadeGarbage (@H0meMadeGarbage) March 24, 2025
足踏みによって左右のモータの電流が動作に応じて変動しています。
CAN通信は端末ではなくデータ自体にIDをつけて管理します。使ってみると非常に良い仕様です。
ここでは以下のようにしました。
バス通信内に色々なデータが飛び交うので各モータコントローラには必要なデータだけを受信するようIDを指定してマスクしました (twai_filter_config_t)。
来るデータ全部に対して選別処理すると実際動作が遅くなります。
この辺はAIに助けてもらいながら実施しました。
ウェイトシフト検知
中枢コントローラATOM Matrix で左右の足のトルク (ふくらはぎ) が得られるようになったのでウェイトシフト検知を目指します。
足上げ動作時の左右のモータ電流の差分を見てみました。
左右のふくらはぎトルク差分でウェイトシフト判定できそう
着地時波形の山の頂上なのか谷なのかその後なのかを
トリガに左右足上げ運動の切り替えをすればいいんじゃないかと pic.twitter.com/ZgNoP3VvOr— HomeMadeGarbage (@H0meMadeGarbage) March 25, 2025
動作に応じて左右のモータ電流の差分が大きく変動します。
この差分の増加・減少を検知することで以下の3ステートを明確に検知できるようになりました。
① 足上げで浮いている
② 足下げによる接地
③ 接地後の反動による他方へのウェイトシフト
差分のさらに変動をみてステータス検知しているので床の傾きや外乱の影響も小さいと考えられます。
上記 検知ステータス③で左右足動作切り替えて足踏みをしてみました。
足踏み
念願のモータトルクからウェイトシフト検知して足切換自動化
やっとできたわ。 pic.twitter.com/ybZTfLDgAT— HomeMadeGarbage (@H0meMadeGarbage) March 25, 2025
非常に安定した足踏みが実現できました!!
見事に目論み通り モータ電流 (トルク) によるウェイトシフト検知で左右足動作の切り替えができました。
おわりに
ここではCAN通信を導入してモータトルクによるウェイトシフト検知での足踏み動作を確認しました。
ウェイトシフト検知で左右足動作切り替えを自動化でき、動作も安定しています。
次回は左右動作切換タイミングの更なる深掘りや歩行について検証したいと思います。
それではまた