二足歩行ロボットを作る(3)
その場足踏みで、余裕の97%を使い切った
歩く前に、「そもそも余裕はどれだけ残っているのか」を測りました
前回のおさらいと、今回の問い
第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.05m | 0.02m |
| 足を運ぶ時間 | 0.18秒 | 0.4秒 |
| 着地時の膝の角度 | 0.12rad | 0.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回で「踏み出しても側方はまったく改善しなかった」と書きましたが、今回それが数字で裏づけられた形です。ここを直さない限り、この先はありません。

