二足歩行ロボットを作る(6)
「原因を特定した」を、2回撤回した
足の形を変えれば直るはずでした。そこから訂正が2回続きます
この記事に出てくる数値・結論は、すべてMuJoCo上のシミュレーションで測ったものです。実機による検証は経ていません。実際にロボットを組み立てて確かめた結果ではなく、計算機の中で起きたことである点をご承知おきください。
この連載は「専門家として正しさを保証する記事」ではなく、開発の実況記録です。うまくいかなかったことや、後から誤りだと分かったこともそのまま書いています。
前回のおさらいと、今回の3つの結末
前回、この機体の最も弱い方向が後方であること、そしてその弱さが足の取り付け位置という機体の形で説明がつくことが分かりました。設計図の比率41%と実測の比率42%が一致した、あの回です。
形が原因なら、形を変えれば直るはずです。今回はそれを試しました。
結果を先に、3段階で書きます。
| 段階 | 報告した内容 |
|---|---|
| 1回目 | 足の形を変えたら後方は直った。ただし別の性能が壊れたので不採用 |
| 2回目(訂正) | 壊れた原因は足の形ではなくコードのバグだった |
| 3回目(再訂正) | そのバグを直してみたら、ほとんど効かなかった |
「原因を特定した」という報告を、2回撤回しました。
今回はこの経緯そのものが記事の主題です。数字はほとんど動きません。動いたのは、何を根拠に「分かった」と言えるのかという部分でした。
訂正の回、しかも2回。書くほうは気が重いけど、これを書かないと嘘になるからね。
コストがまったく増えない設計案
後方が弱い理由ははっきりしています。足が足首より25mm前に付いているため、支えられる範囲が前85mm・後35mmと偏っているからです。
そこで機構設計の担当に検討してもらいました。実機を作る段階になってから動かす予定でしたが、形の効果はシミュレーションで確かめられるので前倒しです。
出てきた推奨案はシンプルでした。足の取り付けオフセットを+25mmから0mmにして、前後60mm・60mmの対称な足にする。
質量・外形・部品点数・コストが、いっさい変わりません。足を大きくするのでも重くするのでもなく、取り付け位置をずらすだけだからです。実機化を考えると、これほど都合の良い変更はありません。
6つの変種を作って測りました。
直った。ただし別のところが壊れた
| 変種 | 最も弱い方向 | 後方 | 側方 | 上限歩幅 |
|---|---|---|---|---|
| 現行 | 5.50N | 5.50N | 5.75N | 30mm |
| 推奨案 | 3.75N | 8.75N | 3.75N | 20mm |
この機体には、まだ上体(胴・腕・頭)がありません。骨盤の箱で終わっています。ここに出てくる30mmは、その「脚だけの機体」の上限歩幅です。
上体を載せれば、この数字は落ちます。重心が上がるからです。実機を組めば、さらに変わります。先に書いておきます。
後方は狙いどおりでした。5.50Nから8.75N、+59%です。設計の意図はきれいに実現しました。
ところが同じ表の、他の列を見てください。
- 前進歩行の上限歩幅が30mmから20mmに落ちた
- 足幅を1mmも変えていないのに、歩行中の側方が5.75Nから3.75Nへ35%落ちた
2つ目が理解できませんでした。変更したのは前後方向の取り付け位置だけです。左右方向には一切触っていません。にもかかわらず左右の耐性が落ちる。
さらに不思議なことに、立っているときの側方は全変種で14.00Nのまま完全に不変でした。静止していれば何も変わらないのに、歩き始めると3割以上落ちる。
差し引きで機体の実力は悪化するため、推奨案は不採用としました。
前回の「立位の数値は歩行中の実力ではない」という主題が、別の形でもう一度出てきたことになります。静的な支えの範囲では説明できない、歩いている最中にだけ起きる現象です。
設計案は、自分で書いた反証条件で死んだ
ここは、この開発で一番きれいだった場面かもしれません。
機構設計の担当は、案を出すときに1本の仮定の上に推論を組み立てていました。「押し出しの限界は、その方向の支えられる長さに比例する」という仮定です。
そして案書の中に、自分でこう書いていました。
「この仮定が外れていた場合、本書の推奨は根拠を失う」
測定側は、この仮定を3つに分解して個別に判定しました。
| 仮定の要素 | 判定 |
|---|---|
| 前後方向は分離して考えてよい | 成立(後方の支持長が同じ2変種で、後方の限界が完全に一致) |
| 比例する(ゼロを通る直線) | 外れ(切片が+2Nある直線だった) |
| 側方は影響を受けない | 外れ |
そして外れた項こそが、推奨を決めていた項でした。
ここで起きなかったことのほうが重要です。議論になりませんでした。「側方が落ちたのは測り方が悪いのでは」「いや設計は正しいはずだ」という応酬が一切なく、測定結果が出た時点で決着しました。
反証条件が先に書いてあったからです。何が起きたら自分の案が死ぬかを、案を出す側が先に宣言していた。だから測定は判定になり、交渉になりませんでした。
【訂正1】原因は足の形ではなく、コードだった
「足幅を変えていないのに側方が落ちる」という現象は、機序が分からないまま残っていました。それを追いかけた結果、原因は足の形ではありませんでした。
制御ソフトウェアのバグでした。
したがって、1回目の報告に書いた「足の形という方向は、今のやり方では使えない」という結論は撤回することになります。正しくは「制御側の未対応が理由で、足の形の案を正しく評価できていなかった」です。
数値の表そのものは有効です。ただしそれは「足の形が悪い」ことの証拠ではありませんでした。
偶然一致していた、2つの25mm
機序はこうです。
骨盤の横位置を制御する処理は、「接地している足の参照点を固定したまま骨盤を動かす」という計算を解いています。これが「接地面を動かさずに骨盤だけ動かす」と等しくなるのは、参照点が接地面の中心にあるときだけです。
そして現行の機体では——
- 足の実体が、足首の前方25mmにある
- 制御が見ている参照点も、足首の前方25mmにある
この2つが、偶然一致していました。一致しているあいだ、計算は正しく動きます。
ところが足の実体だけを動かすと、この一致が壊れます。参照点を固定しようとするあまり、接地面のほうが横に振られる。これが側方の悪化の正体でした。
実は、機構設計の担当はこの時点で「+25mmは2つあり、ハードウェアなのは片方だけだ」と気づいていました。そして設計を分けています。ただしその理由は「参照点を動かすと歩行のリーチが変わるから据え置く」というものでした。
正しい観察をしていたのに、正しい理由ではない結論を出していたことになります。実際には、その一致こそが制御を正しく動かしていたのです。
この調査で良かったこと
この機序を突き止める過程には、見習いたい点がいくつもありました。
- 予測を先に書いてから測った。5ラウンドすべてで、測定前に「この機序ならこうなるはず」を確定させています。そして5本中3本が外れました。外れた3本がそれぞれ仮説を1つずつ潰しています
- それらしい説明を、自分で退けた。途中で「ある指標を使うと13点中12点がきれいに分かれる」という発見がありましたが、「これは事後に選んだ指標だから証拠にしない」と自分で却下しています。採用していれば、もっともらしい物語が1本できていました
この機体は境界がカオス的なので、後付けの説明はいくらでも作れてしまいます。だからこそ、この自制は効いていました。
そして、思い込んでいた「現象」
もう1つ、印象的なことがありました。
1つの変種だけが傾向に反していたため、「正しい機序なら、この1点も説明できるはずだ」という縛りを設けていました。答えはこうでした。
説明すべき現象ではありませんでした。
基準の機体自身が、条件を変えると同じ指標で5.75〜6.25Nの幅を持っていたのです。問題の1点は、その幅の中にすっぽり収まっていました。単なる測定のばらつきを、現象だと思い込んでいたわけです。
これは、それまでの表全体への警告でもありました。基準自身が0.5Nの幅を持つのなら、0.25〜0.5Nの差を読み取って機序を論じた箇所は、すべて過剰解釈だった可能性があります。差を論じる前に、まず基準のばらつき幅を測って分母に置く——という手順が、ここでようやく確立しました。
【訂正2】直してみたら、効かなかった
原因が分かったので、直しました。
ほとんど効きませんでした。
| 項目 | 修正の効果 |
|---|---|
| 側方の耐性 | 最大 +0.25N |
| 前進歩行の上限歩幅 | 1mmも動かず |
しかもこのとき初めて測った「基準自身のばらつき幅」が0.50Nありました。つまり——
+0.25Nは、測定できる差ですらありません。ばらつきの半分です。「改善したが小さかった」ではなく、「改善したかどうか判定できない」が正しい表現になります。
直した内訳を測ると、こうでした。
| ずれが効いていた場所 | 割合 |
|---|---|
| 今回直した箇所 | 約 1/8 |
| 同じ処理の別の部分 | 約 3/8 |
| その処理の外側(着地計画・足の持ち上げ量など) | 約 半分 |
直した場所は、全体の8分の1でした。
どこで論理が飛んだのか
ここが、今回いちばん書き残したい部分です。
訂正1で「原因はこの処理だ」と判断した根拠は、次の実験でした。
「この処理を切ると、2つの機体の側方の差2.00Nが、-1.00Nへ逆転する」
強い結果に見えます。処理を切っただけで差が消えるどころか逆転するのだから、原因はこの処理の中にある——そう読みました。
しかし、この実験が実際に示していたのはこれだけです。
増幅器を切れば、増幅されない。
差が消えたことは、その処理が差の発生に必要であることしか意味しません。発生源がその処理の内部にある証明にはなっていないのです。実際、発生源の半分はその処理の外側にありました。
「Xを切ると差が消える」は、経路の必要性であって、発生源の同定ではありません。
言われてみれば当たり前です。水道の元栓を締めれば蛇口から水は出ませんが、それは元栓が水漏れの原因だという意味ではありません。それでも実験結果が鮮やかだと、必要性の検証を同定と読み違えます。
レビューも、同じ穴を通した
そしてここが、いちばん苦い部分です。
この判断にはレビューが入っていました。レビュー側はコードを直接読み、「たしかに固定しているのは参照点であって接地面ではない」という事実まで裏を取っています。
それでも通ってしまいました。確認していなかったのは、次の一段です。
その誤りが、2.00Nという差の大きさを説明するのか。
- 「コードにその誤りが実在する」——確認済み
- 「その誤りがこの現象を起こしている」——未確認
この2つは別のことです。前者だけを確認して、後者を認めてしまいました。
訂正1の回では、「予測を先に登録した」「後付けの指標を自分で退けた」と、証拠の作り方の良さを強調しました。それは事実です。実際、あの調査の手続きは厳密でした。
それでも、その回の結論そのものが、別の種類の論理の穴で間違っていました。手続きの厳密さは、検証していない一段が混ざることを防いでくれません。
Stage 2を締める
この2回の訂正を経て、いちばん確実に分かったことがあります。
側方の耐性と、上限歩幅は、別の機序でした。
ずれを制御側で補償すると側方は部分的に戻ります。しかし上限歩幅は1mmも動きません。ここまでこの2つを同じ現象として扱ってきましたが、別物です。そして足の形の案が復活する条件は上限歩幅のほうだったので、制御側の補償では1mmも近づいていませんでした。
4段かけて、1Nも上がっていない
ここでStage 2という区切りを締めることになりました。理由は明快です。
機体の実力を表す主指標が最後に動いたのは、前回の「歩けた」回です。それ以降の4段はすべて測定・否定的結果・自己訂正で、機体の実力は1Nも上がっていません。
否定的な結果には価値があります。「やっても無駄だと確定したこと」は、同じ穴を掘り直さないための資産です。股関節を広げるな、重量物を低く置いても効かない、ロール軸のトルクを増やすな、足の取り付け位置を動かすな——これらは「試して駄目だった」ではなく測定で潰したものです。
それでも4段続けば「問いの立て方が尽きた兆候」だ、というのが締めた理由でした。
機体は良くなりませんでしたが、測り方は確実に良くなりました。特に後半の2つは、今回の失敗そのものから出ています。
- 差を論じる前に、基準自身のばらつき幅を測って分母に置く(0.25〜0.5Nの差に機序の説明まで付けたが、幅が0.50Nだった。存在しない現象を説明していた)
- 「Xを切ると差が消える」は経路の必要性であって、発生源の同定ではない(これで結論を1回間違え、訂正が2通出た)
次回予告
今回の道のりをまとめます。
- 足の形を変えて、後方は+59%改善した。ただし側方と歩幅が壊れて不採用
- 設計案は自分で書いた反証条件で死んだ(議論にならなかった)
- 【訂正1】原因は足の形ではなく、偶然一致していた2つの25mmだった
- 【訂正2】直してみたら効かなかった。+0.25Nは測定できる差ですらない
- 「Xを切ると差が消える」は経路の必要性であって、発生源の同定ではない
そして次回、この開発でいちばん足元をすくわれる話が来ます。
ここまで6回かけて、押し出し限界、消費率、上限歩幅と、いろいろな数字を詰めてきました。その数字が全部、ある前提の上に乗っていたことが分かります。
