[home] [up]

Titan の歩行動作について

http://www.bekkoame.ne.jp/~jun1967/aibo/tec_walking_j.html

河井 淳
jun1967@pis.bekkoame.ne.jp


このページでは私の所有するAIBO Titan(AIBO ERS-210A)が採用している 歩行動作について解説します。
OPEN-R SDKが一般公開されているのを知り、AIBOを2002年7月に購入し、 とりあえず歩行制御の研究をはじめてみようと思いたってから、 現在(2002年12月)までに調査し、歩行処理を自分で独自に開発し、 実装した結果をまとめてみました。 開発期間は約4ヶ月で、実質的な開発工数は約1人月程度です。

なお、ここに解説してある方式で実装したプログラムを使用して、 2002年12月1日に東京、お台場の日本未来科学館で開催された OPEN-R SDK TECHNO FORUM 2002 in Japanのレース競技で 意外にも第2位の成績を納めることができました。

足関節の制御

Titan(AIBO)には各足ごとに3つの独立した関節があります。 [1]
これらはPID制御のサーボモータになっており、一度、指示角を与えると LSIが指示角を目標にして、関節角を近付けていき、最終的には 指示角を保つように自動制御します。 なお、足首にあたる部分は見た目には関節があるようにも見えますが、 実際には板バネにより可動するだけで、モータは入っていません。 また、今回の歩行動作では使用していませんが、各関節には 角度センサーがついており、実際の角度を測定することもできます。

歩行動作のためには、各位相に応じて、関節を適切な角度に制御する必要が あります。一つの足に注目すると、接地している支持脚期間と、接地していない 遊脚期間とがあります。 ここでは前進歩行を考えます。 肩関節を原点としたとき、足先の動きを考えてみます。 支持脚期間では垂直方向の成分を一定の高さに保ちつつ、 水平方向には一定の速度で後方に進んでいくと、その反作用で体が水平に 前進することになるので、理想的な動きになると考えられます。 つまり足先の位置を指定した場合に適切な関節角度が求められると便利です。 しかし、このために足の形状データに基いた厳密なモデル化を行うと やや複雑なモデルになることがわかります。 複雑になる主な原因は関節の付き方と、関節間の距離にあります。 厳密なモデルでも関節角から足先の位置を計算することは比較的簡単です。 しかし、ここでは逆に足先位置から関節角を計算する必要があり、 このための逆関数を得る必要があります。 ところが、こうした逆関数を一般的に求めるのは困難で、多くの場合は、 数値解析演算により近似解を得る必要があります。 そこで、Titanでは、こうした重い数値解析演算を避けるために、 モデルを可能な限り単純化して扱うことにしました。 これにより、モデル近似の誤差が含まれる代りに演算処理は軽くなります。

ここでは関節をサーボモータの名前についた番号順に、肩関節(J1)、 脇関節(J2)、膝関節(J3)と呼ぶことにします。 ここで、歩行動作のために特に重要なのは、肩関節(J1)と膝関節(J2)です。 また、足先の位置を P とします。 脇関節(J2)は方向転換のために重要なのですが、ここではひとまず無視して J1 と J3 からなる 2 関節モデルを考えることにします。 さらにモデルを単純化するため肩から膝までの距離と、膝から足先までの距離を 近似的に同じとみなして、共に定数 l (スモールエル)とします。 またこのとき、肩(J1)から足先(P)までの直線の距離を L とします。(図1参照)

inverse kinetics
図 1 足を単純化した2関節モデル


すると肩から足先までの直線(J1-P)を底辺とし、膝関節 J3 を頂点とする 二等辺三角形ができます。 また、肩関節 J1 を原点にとり、水平方向をx、垂直方向を z とします。 このときの肩関節角を t1 、膝関節角を t3 とします。
このとき、J1-J3-Pの二等辺三角形の底辺と2辺のなす角は、三角形の内角の和が πであることより、幾何学的にt3/2であることがわかります。 従って、足先の座標P(x, z)に関して、次の関係式が成立します。
    x = L * sin(t1 + t3/2)
    z = - L * cos(t1 + t3/2)

    ただし、
    L = 2 * l * cos(t3/2)
これはt1、t3からx、zを求める順運動学の式になっています。 しかしここで必要なのは、むしろx、zからt1、t3を求める逆運動学の関係式です。 ここではモデルを単純化しているため、この関係式はt1、t3についてx、zの関数として 次のように解析的に解くことができます。
この関係式では、L2 = x2 + z2 であることに注意して、 最終的に、
    t1 = acos(-z / (+-)sqrt(x2 + z2)) - acos((+-)sqrt(x2 + z2) / (2 * l))
    t3 = 2 * acos((+-)sqrt(x2 + z2) / (2 * l))
が得られます。
ここにacos()はcos()の逆関数、sqrt()は平方根演算です。 (+-)は正または負の符号を表します。
これは正負2通りの解があり、膝関節 J3 が肩から足先への直線 J1-P のどちら側に あるのかということに対応しています。 つまり、膝関節角 t3 の正負に対応しています。 ここでは膝関節角 t3 が常に正でなければならないという条件により、 正の方の解が一意に決まります。

高さ制御

足先の位置から関節角度を任意に制御することができると、 足の曲げ具合を調節することで、体の高さ調整ができます。 具体的には足先の垂直方向(z軸方向)の位置を決めることで、 最大、-2 * l < z < -l の範囲内で高さ調整ができます。 もちろん、これは水平方向(x軸方向)の制御幅と関係します。
理論上は、水平方向の制御幅は高い姿勢のときは小さくなり、 低い姿勢のときは大きくなります。 しかし、実際には低い姿勢のときにも前後の膝が接触する問題があり、 これを避けるために、結局は水平方向の制御幅が制約を受けます。
また、歩行のために遊脚の先端を上げるためのマージンも、 他の支持脚による姿勢の高さに関係します。

歩容

四足歩行の場合、いくつかの歩行様式があり、基本的なものには名前がついています。 [2]
これらは表 1 に示すように、接地率と各足の位相差で特徴付けられます。

表 1 四足歩行の歩容の分類
接地率 β 支持脚数 左右の位相差 前後の位相差 歩容 歩行速度
0.75以上 3 または 4 0.5 1 - β クロール
0.75〜0.5 3 ウォーク
0.5 2 トロット
0 ペース
0 0.5 バウンス

ここで、接地率というのは、一本の足に着目した場合に、一周期の間で その足が地面に接地している期間の割合です。 また、位相差というのは、各足の間の周期のずれを表しています。 表中での単位は2πradです。

このうち、最も基本的なものがクロール歩容と呼ばれるもので、爬虫類や哺乳類の 低速歩行にみられる歩行様式です。 これはムカデやゲジゲジなどの多足動物にみられるウェーブ歩容の一種で、 後から前に波が伝わるように位相が移動していく歩行様式の四足版と言えます。 具体的には右前足、左後足、左前足、右後足と、∞の字を描くような順で 位相が遅れています。
クロール歩容の特徴は常に少なくとも3足が接地しています。 これは重心がその3点の中に入っていることにより、常に転倒しないことが保証 され、どの状態でも静止することが可能です。 このように常に安定余裕を保つ方式の歩行は静歩行と呼ばれます。
次に代表的なものに、トロット歩容があります。 これは常に対角線上の2足を接地して歩行する方式です。 基本的には2点でしか支持されないため、各瞬間の状態は不安定といえます。 しかし、歩行動作を連続して行うことにより、動的な安定な状態を 保つことができます。 このように歩行動作を続けることによって安定を得る方式の歩行は 動歩行と呼ばれます。

歩行速度の面で比較した場合、一般的に言って、トロットの方が クロールよりも速いと言えます。 しかし、各足にかかる負荷を考慮すると、支持脚の数が少ない分、 トロットの方がクロールより各足あたりの負荷が大きいと言えます。 つまり、クロールは速度が遅い代りにモータのパワーを地面に伝達する 能力は高く、逆にトロットは速度が速い代りにパワーを伝達する能力は 低くなります。 このように速度と力強さの間にはトレードオフの関係があります。
速度と力強さのトレードオフは、これ以外にも、肩関節の位置から 足先までの距離にも関係します。この距離が近いほど、遅い代りに力強く、 この距離が遠いほど速い代りに力は弱くなります。
また、関節角度の変化率(角速度)を大きくすると速くなりそうな気もしますが、 そう単純には行きません。脚の動きを速くしようとしても、モータのトルク不足 で、なかなか追従できなくなります。また、仮に脚が速く動かせたとしても、 足裏と地面の摩擦係数が小さくなり、脚がすべって空回りすることもあります。

これらのトレードオフは、自動車や自転車の変速ギヤと同様の関係です。 低速ギヤでは馬力がでますが走行速度は遅く、高速ギヤでは馬力はでませんが、 走行速度は速くなります。 これと同様に、適切な速度で関節角度の制御を行い、力が無駄なく地面に 伝わるように工夫する必要があります。

Titanの場合は、前後、左右の位相差を設定し、接地率を制御することにより、 クロール、ウォーク、トロットでの歩行が可能なようにしてあります。 なお、トロット歩容の場合も動力学的な安定化制御は行っていません。 しかし、転倒する方向が次の支持脚となるため、自然に転倒せず歩行することが 可能です。
因みにOPEN-R SDK TECHNO FORUM 2002 in Japanの競技の際にはトロット歩容を 使用しました。

前進、後進、静止

前進運動は支持脚の足先が後方へ一定の速度で移動することにより、 その反作用として発生します。 このためには、垂直成分 z を一定値に保ち、水平成分 x を一定の速度で 変化させる必要があります。 これは上で求めた逆運動学による関係式で x、z から関節角を計算することで 実現できます。

また、前進、後進、静止を柔軟に行うためには少し工夫が必要です。 一つの方法は、動作の最小単位を決めて、ある位相のときにしか動作変更を 許さないことです。こうしておくと、比較的安定なタイミングを選ぶことで 安全に動作変更できるという利点があります。 しかし、この方法では急な動作変更ができないため、動作の柔軟性が犠牲になります。

Titanの場合は、どの位相からでも動作変更できるように工夫しました。
まず、静止して直立している状態ですが、これはある時点の位相に 固定した状態にします。このとき、遊脚を地面に付けるように垂直成分を調整する ことで、支持脚と高さをそろえて安定した状態で静止させます。 モデルの誤差や関節角度の制限により多少ずれることはありますが、 それでも体が傾くことなく、その位相のまま静止できます。
前進、後進の整合性を取るために、後進のときは位相を逆転させて制御します。 つまり、位相変化率を前進時は正に、後進時は負にします。 ある足に着目した場合に、位相が同じときには、前進と後進で支持脚の足先の位置は 全く同じになります。 一方、遊脚の方は早目に次の支持位置へ移動させるよう制御するため、前進時と 後進時では少し位置がずれます。

方向転換

進行方向を変更するためには、いくつかの方法が考えられます。
一つの方法は、左右の足の歩幅に差をつけることです。 直進するように足を運んでも、歩幅の小さい方へ曲る力が働き、 進行方向が変化します。
もう一つの方法は、支持脚を動かす方向を斜めにずらすことで、 進行方向を変化させます。 この方法の場合は、足のずらし方によっては、体の向きを変化させずに 斜めに平行移動させることもできます。
この他にはその場で自転するように回転歩容による運動をすることで 方向転換する方法もあります。

Titanの場合は、歩幅制御と足運びの方向制御の両方を併用し、 体の向きを変化させながら方向転換するようにしました。
なお、Titanでは、その場で回転する方向転換は、まだ実装していません。 しかし、方向転換しながらの前進と後進を交互に行うことで、 切り返しをすることはできます。

起き上がり動作

急な方向転換などを行おうとした場合などに、足がもつれて転倒することが あります。 このような転倒状態から自動的に起き上がって、もとの活動できる状態に復帰する 必要があります。
まず、加速度センサーを監視することで、転倒状態を検出します。 AIBOにはx, y, zの独立した加速度センサーが内蔵されています。 静止状態でも垂直の z 方向に重力加速度 -g が検出されます。 歩行中も水平方向の加速運動や振動などにより、加速度ベクトルは変化しますが、 その成分の多くは重力加速度です。 従って、加速度ベクトルの向きを判定することで、転倒状態を容易に検出できます。
具体的には、加速度ベクトルの x-y 水平面への射影の大きさが、加速度ベクトル の大きさの80%以上になったときに、転倒状態であると認識し、起き上がり動作に 状態遷移するようにしました。

起き上がり動作の方法ですが、転倒方向を認識して、適切な起き上がり動作の パターンを選ぶ方法もありますが、 Titanの場合は、簡単のため、どのような転倒状態からでも必ず起き上がれるような 動作方法を採用することにしました。
具体的には、まず、のびをするように、ややそりかえり気味(肩関節角 90度以上)に 前後に足を伸ばします。 このとき、仮に転倒方向が前後の場合(前のめりや尻もち状態)であっても、 一旦は横倒し状態になります。 次に脇関節を拡げながら、足を縮めていきます。 これにより、起き上がる方向に体が横に転がる力が働きます。 最後に、足を伸ばして起立姿勢に移ります。 これら一連の起き上がり動作は、固定的な関節データを用意して再生しています。

実装

私が使用した開発環境は次のとおりです。

  PC:    VAIO 505
  OS:    Windows 95 OSR2(ただし、SonyがSDKの動作保証するのはWindows 2000またはXP)
  Tools: Cygwin(g++, GNU make, perl, etc.), OPEN-R SDK, emacs(Meadow)
  Media: Memory Stick(8M, 16M), PC Card Adapter(MSAC-PC2)
  WLAN:  WLAN Card for AIBO(ERA-201D1), WLAN Card for PC(WN-B11/PCM[IO DATA])
  AIBO:  ERS-210A/B
ここでWindows 95を使用しているのは、動作保証の範囲外なので注意が必要です。 私が試したところでは、Windows 95 上で Cygwin も OPEN-R SDK も問題なく動作し、 Sony が提供するサンプルプログラムもすべてビルドできました。
しかし、メモリースティックのカードアダプタを使う場合には注意が必要です。 Windows 95ではメモリースティックのカードアダプタを初めて使う場合に リムーバルメディアとして認識してくれないため、デバイスを手動でリムーバル メディアに設定してやる必要があります。 これを怠ると、メモリスティックが破壊されて使えなくなってしまいます。 (単にデータが壊れるだけでなく、使用不可の状態になります。)
OPEN-R SDKの開発ツールやサンプルプログラムはSonyの提供する OPEN-R SDKのホームページより無料でダウンロードできます。 [3]
ただし、会員登録が必要です。(無料)
足関節制御のためにはC++で独自のクラスライブラリを作成しました。 このクラスは位相を指定することで、足先の位置や関節の角度を 計算することができます。 なお、このクラスはOPEN-Rとは独立しています。
さらにOPEN-R SDKのサンプルプログラムの一つであるBallTrackingHeadをもとに 改造して、上記クラスを組込むことで、ボールを追い掛けて方向を変えながら 歩行するようにしました。

まとめ

OPEN-R SDK TECHNO FORUM 2002 in Japanでのレース競技では、 2.350[m]の距離を14.40[s]のタイムでトロット歩行しました。 このときの歩行速度は次のようになります。

  トロット歩容による歩行速度: 0.163[m/s]
故障を避けるため、関節が過負荷にならないように安全性を考慮する必要は ありますが、まだもう少し歩行速度を改善する余地はあるように思います。

今回、この研究を通じて、あらためて、歩行運動の奥深さを感じました。 この研究をはじめてから、自然界の動物達(犬、猫、蛙、ゲジゲジなど)の 歩行運動を注意して観察するようになりました。 しかし、見ればみるほど彼らの運動性能の高さや柔軟性の高さに驚き、 それを模倣することさえ遠く及ばないことに気付かされます。 彼らがこのような高い運動能力を進化の過程で獲得してきたということは 全く驚きに値することだと思いました。
今後は歩容と歩行速度のより柔軟な制御や、バウンスなどのより高度な 歩容についても研究を進めていきたいと考えています。

参考文献

[1] OPEN-RプログラミングSIG, C++でAIBOを自在に動かす OPEN-R プログラミング入門
[2] Takashi Tomiyama, BROKEN's Advanced Vehicle Laboratory (http://homepage1.nifty.com/BROKEN/project/walk/memo.htm)
[3] OPEN-R SDK Homepage(http://www.jp.aibo.com/openr/j_regi/index.jsp)

Last updated on 16 Dec 2002

e-mail: jun1967@pis.bekkoame.ne.jp
(C)Fukurou, 2002. All rights reserved.