二足歩行ロボット開発日記(3) その場足踏みで、余裕の97%を使い切った

ロボット開発
開発日記 #3

二足歩行ロボットを作る(3)
その場足踏みで、余裕の97%を使い切った

歩く前に、「そもそも余裕はどれだけ残っているのか」を測りました

使用ツール: MuJoCo / Python ゴール: その場足踏みと、余裕の定量化

前回のおさらいと、今回の問い

第1回で「押されても倒れない」制御を作り、第2回で「大きく押されたら一歩踏み出す」制御を足しました。現時点で耐えられるのは前方15.5N・側方14Nです。

ここで、当然の疑問が出てきます。

今回の問い

この余裕は、実際に歩くときに足りているのか?

押されても耐えられる、というのはじっと立っている状態で測った数字です。しかし歩けば、ロボットは自分で自分を揺らします。片足を上げれば重心は動くし、着地すれば衝撃が来ます。外から押されなくても、歩くこと自体が外乱を生むわけです。

その自己外乱がどれくらいなのかを測らないまま歩かせても、「なぜか転ぶ」の繰り返しになります。そこで今回は、いきなり歩くのではなくその場で足踏みさせて、そのときの揺れを測ることから始めました。

結果を先に書きます。側方は、足踏みするだけで余裕の97%を使い切っていました。

黄昏の戯れ
中の人

まだ一歩も前に進んでないのに、もう余裕がないの…?

その場足踏みは、実は簡単なはずだった

作りとしては、前回の踏み出し制御をほぼそのまま流用できます。変えたのは2点だけです。

  • いつ足を出すか: 前回は「倒れそうになったら」でした。今回は「一定時間ごとに、左右交互に」に変えます
  • どこに足を出すか: 前回は「止まれる位置」を計算していました。今回は「今いる場所 + 歩幅」に変えます

歩幅をゼロにすれば、同じ場所に足を戻すだけ——つまりその場足踏みになります。歩幅に数字を入れれば、そのまま前進歩行になるはずです。

理屈のうえでは、これで足踏みも歩行もできます。理屈のうえでは。

つまずき1: 足の間隔が、じわじわ詰まっていく

足踏みを始めてすぐ、おかしなことに気づきました。左右の足の間隔が、1歩ごとに少しずつ狭くなっていくのです。

本来の足の間隔は0.12m。それが6歩ほどで0.06m未満まで詰まりました。このまま続ければ、左右の脚が交差します。歩幅ゼロで「その場」に戻しているだけなのに、なぜ動くのか。

誤差が、毎回持ち越されていた

原因は、着地位置の決め方でした。各ステップの目標を「今のその足のセンサ位置」を基準に計算していたのです。

1歩ごとの着地には、必ず小さな誤差があります。この設計だと、その誤差を含んだ結果が次の歩の基準になります。誤差の上に誤差が積まれ、雪だるま式に増えていきます。

解決は、基準を「コントローラ自身が計画した座標」に変えることでした。実際にどこへ着いたかではなく、どこへ着けるつもりだったかを基準にする。これで積み上がりは止まりました。

ただし、代償がある

この直し方には裏があります。実際に押されて足が計画位置からズレても、ロボットは自己修正しません。計画どおりの場所に足を出し続けます。今は足踏みだけなので問題になっていませんが、外乱に反応する制御と歩行制御を統合するときには、必ずここに戻ってくることになります。宿題として記録しておきます。

つまずき2: 立ち直る時間が足りていなかった

足の間隔は直りました。それでも5〜7歩で転倒します。

記録を追うと、1歩の踏み出しが生む傾き(ロール0.09〜0.12rad)が、次の一歩が始まる時点でまだ収まっていないことが分かりました。揺れが残っているうちに次の足を出すので、揺れの上に揺れが乗っていきます。

そこで、押されていない状態で単発のステップを実行し、完全に元に戻るまでを測りました。水平に戻り、左右の荷重が50対50に戻るまで、約1秒かかっていました。

ところが設定していた待ち時間は0.25秒。前回の踏み出し制御からそのまま流用した値です。4倍足りていませんでした。歩行の間隔を1.5秒まで伸ばすと、この経路の転倒はなくなりました。

学び

前の段階で決めたパラメータを、次の段階にそのまま持ち込むのは危険でした。「緊急時に一度だけ踏み出す」ときの0.25秒と、「延々と足を出し続ける」ときの必要時間は、まったく別の性質の数字です。流用するなら、その前提が今も成り立つかを測り直す——当たり前のことですが、実際にやるのは面倒で、つい飛ばしてしまいます。

つまずき3: 足を速く振りすぎていた

待ち時間を伸ばしても、まだ6歩前後で転倒するケースが残りました。

最初に疑ったのは、足の滑りです。床と足裏の摩擦が足りず、着地した足がズレているのではないか。そこで摩擦係数を実験的に2倍にして試しました。

結果は、改善なし。むしろわずかに悪化しました。

原因は、自分の足の振り方だった

前回、「片足を上げると必ず左右対称の傾きが出る」ことは分かっていました。問題は、その傾きの大きさです。

使っていた足の振り方は、前回の「緊急時に素早く踏み出す」ための設定のままでした。振り上げの高さ0.05m、足を運ぶ時間0.18秒。とにかく速く、大きく振る設定です。

緊急時ならそれでいいのです。倒れかけているのですから、多少乱暴でも間に合わせる必要があります。しかしその場足踏みは違います。前に進む勢いがないぶん、振った反動を相殺できるものが何もないのです。

そこで、ゆっくり・低く・膝をほとんど伸ばしたまま動かす設定に変えました。

項目前回(緊急時用)今回(足踏み用)
振り上げの高さ0.05m0.02m
足を運ぶ時間0.18秒0.4秒
着地時の膝の角度0.12rad0.03rad

この変更で、その場足踏みは30歩以上、安定して続くようになりました。摩擦を疑って半日使ったあとの結論が「自分の動きが荒かった」だったのは、少し情けなかったです。

本題: その余裕は、歩行に足りているのか

ようやく本題です。足踏み12歩分の骨盤の動きを記録し、「これは外から押されたとしたら何Nに相当するのか」を逆算しました。第1回・第2回で測った「押されても耐えられる限界」と、同じ土俵で比べるためです。

指標足踏みで自分が生む外乱耐えられる限界に対して
前後方向の等価外乱8.3N限界16.0Nの52%
左右方向の等価外乱8.2N限界14.0Nの59%
最大の前後の傾き3.7°限界時(14.4°)の26%
最大の左右の傾き6.0°限界時(6.2°)の97%

最後の行です。左右の傾きが、限界の97%。

これは、その場で足踏みしているだけで、横方向に押されたときの「あと耐えられる余地」をほぼ使い切っているということです。この状態で誰かに横から軽く押されたら、まず倒れます。

前後方向はまだ余裕があるように見えます。しかしこれは歩幅ゼロ——一歩も前に進んでいない状態での数字です。実際に前進すれば、前後方向の外乱はもっと大きくなるはずです。

正直な結論

「15.5N/14Nの余裕は歩行に十分か」という問いへの答えは、側方については、ほぼ十分ではないでした。想定より厳しい結果です。制御のチューニングで足りるのか、機体の設計から変える必要があるのか——この時点では分かりませんでした。

測り方について、ひとつ補足

「等価外乱力」は、着地の瞬間の力をそのまま出したものではありません。着地衝撃だけを見ると前後55.8N・左右37.0Nという、限界値をはるかに超える数字が出ます。

ただしこれは、1〜2計算ステップだけのごく短いスパイクです。これまで測ってきた「一定の力を0.1秒間かけ続ける」押し出しとは、性質がまったく違います。同じ土俵で比べるべきではないと判断し、0.1秒の窓で速度変化から逆算した実効的な力を採用しました。参考値として、瞬間値も記録には残してあります。

黄昏の戯れ
中の人

都合のいい数字のほうを選んだわけじゃない、ってところは書いておかないとね。

つまずき4: 歩幅1cmで、崖から落ちた

足踏みは30歩以上続くようになりました。設計上、あとは歩幅に数字を入れるだけで前進歩行になるはずです。

そこで、ごく小さく1cmだけ入れてみました。

2歩以内に転倒しました。

驚いたのは、その壊れ方です。歩幅を増やすにつれて徐々に不安定になる——という、なだらかな悪化ではありませんでした。歩幅ゼロでは30歩以上続くのに、1cm入れた瞬間に2歩で倒れる。崖から落ちるような、急峻な変化でした。

これは「調整が足りない」ときの壊れ方ではありません。パラメータをどれだけ丁寧に振っても、崖は崖のままです。もっと構造的な何かが間違っている——そう考えるべき壊れ方でした。

実際、あとで全パターンを網羅的に試した結果がこれです。

条件20秒間生き残った割合
その場足踏み(歩幅ゼロ)216通り中84通り
前進歩行(歩幅あり)216通り中0通り

ゼロ。パラメータの組み合わせを216通り試して、一度も前に進めませんでした。ここまで完全にゼロだと、逆に「調整の問題ではない」とはっきりします。

原因: ロボットがムーンウォークしていた

後日、原因が特定されました。着地位置の決め方そのものでした。

着地目標を「反対の足の位置 + 歩幅」で決めていたのですが、この定義だと妙なことが起きます。

足だけが前に出て、胴体が置いていかれる

1歩ごとに、足は歩幅ぶんきっちり前進します。ところが骨盤は歩幅の半分ほどしか前に進みません。差は1歩ごとに開いていき、3歩目で骨盤は両足の中点より3cm後ろに取り残されます。そして4歩目で、左右の傾きが0.16radから0.76radへ一気に発散して転倒します。

なぜ胴体が遅れるのか

ここが面白いところでした。

足が着地したあと、支持している脚はバランス制御によって「体の真下」に戻ろうとします。これはバランスを取るうえでは正しい動きです。ところが着地した足は、摩擦で床に固定されていて動けません。

動けない足を体の下に引き寄せようとすれば、どうなるか。反作用で、胴体のほうが後ろへ押されます。

足は前に出る。しかし体は、その足を引き寄せようとして後ろに下がる。差し引きで、体は半分しか進まない。——ロボットはムーンウォークをしていたのです。

学び

歩幅の大小の問題ではなく、着地目標の定義そのものが破綻していました。だから歩幅1cmでも壊れるし、パラメータをどう振っても直らない。「調整で直らないときは、調整している対象が間違っている」という、身も蓋もない教訓です。

対策として4案を試し、全部失敗しました。位置サーボに現在の角度を指令すると脚が脱力する。床下に足を置いて押し付けようとすると爪先立ちになる。足を世界座標に固定すると、滑りの補正が胴体を後ろに加速させる形に化ける。足裏を水平に保とうとすると、第1回で作った足首のバランス戦略の83%を打ち消してしまう。

どれも「なぜ駄目だったか」まで記録して、次に持ち越しました。うまくいかなかった4つの機序が分かっているぶん、次の一手は絞り込めます。

黄昏の戯れ
中の人

4回失敗して4回とも理由が分かってるなら、それはもう前進だと思うよ。

次回予告

今回の成果をまとめます。

  • その場足踏みが30歩以上続くようになった
  • ただし側方の余裕を97%使い切っていることが判明した
  • 前進歩行は216通り中0通り。原因は着地目標の定義そのもの(ムーンウォーク現象)

「歩けるようになりました」と書ける回ではありませんでした。むしろ、足踏みという最小の動きですら余裕がほとんど残らないという、厳しい現実を突きつけられた回です。

ただ、測る前より確実に分かったことがあります。横方向が弱い。第2回で「踏み出しても側方はまったく改善しなかった」と書きましたが、今回それが数字で裏づけられた形です。ここを直さない限り、この先はありません。

次回予告

次回は、この「横方向の弱さ」を正面から追いかけます。バランス制御を根本から設計し直し、機体の寸法(足を大きくする・重心を下げる)まで検討することになります。そして最終的にたどり着いたのは、まったく予想していない場所でした。次回もぜひ読みに来ていただけると嬉しいです。

タイトルとURLをコピーしました