Titan(AIBO)には各足ごとに3つの独立した関節があります。
[1]
これらはPID制御のサーボモータになっており、一度、指示角を与えると
LSIが指示角を目標にして、関節角を近付けていき、最終的には
指示角を保つように自動制御します。
なお、足首にあたる部分は見た目には関節があるようにも見えますが、
実際には板バネにより可動するだけで、モータは入っていません。
また、今回の歩行動作では使用していませんが、各関節には
角度センサーがついており、実際の角度を測定することもできます。
歩行動作のためには、各位相に応じて、関節を適切な角度に制御する必要が
あります。一つの足に注目すると、接地している支持脚期間と、接地していない
遊脚期間とがあります。
ここでは前進歩行を考えます。
肩関節を原点としたとき、足先の動きを考えてみます。
支持脚期間では垂直方向の成分を一定の高さに保ちつつ、
水平方向には一定の速度で後方に進んでいくと、その反作用で体が水平に
前進することになるので、理想的な動きになると考えられます。
つまり足先の位置を指定した場合に適切な関節角度が求められると便利です。
しかし、このために足の形状データに基いた厳密なモデル化を行うと
やや複雑なモデルになることがわかります。
複雑になる主な原因は関節の付き方と、関節間の距離にあります。
厳密なモデルでも関節角から足先の位置を計算することは比較的簡単です。
しかし、ここでは逆に足先位置から関節角を計算する必要があり、
このための逆関数を得る必要があります。
ところが、こうした逆関数を一般的に求めるのは困難で、多くの場合は、
数値解析演算により近似解を得る必要があります。
そこで、Titanでは、こうした重い数値解析演算を避けるために、
モデルを可能な限り単純化して扱うことにしました。
これにより、モデル近似の誤差が含まれる代りに演算処理は軽くなります。
ここでは関節をサーボモータの名前についた番号順に、肩関節(J1)、
脇関節(J2)、膝関節(J3)と呼ぶことにします。
ここで、歩行動作のために特に重要なのは、肩関節(J1)と膝関節(J2)です。
また、足先の位置を P とします。
脇関節(J2)は方向転換のために重要なのですが、ここではひとまず無視して
J1 と J3 からなる 2 関節モデルを考えることにします。
さらにモデルを単純化するため肩から膝までの距離と、膝から足先までの距離を
近似的に同じとみなして、共に定数 l (スモールエル)とします。
またこのとき、肩(J1)から足先(P)までの直線の距離を L とします。(図1参照)
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の関数として 次のように解析的に解くことができます。
t1 = acos(-z / (+-)sqrt(x2 + z2)) - acos((+-)sqrt(x2 + z2) / (2 * l)) t3 = 2 * acos((+-)sqrt(x2 + z2) / (2 * l))が得られます。
足先の位置から関節角度を任意に制御することができると、
足の曲げ具合を調節することで、体の高さ調整ができます。
具体的には足先の垂直方向(z軸方向)の位置を決めることで、
最大、-2 * l < z < -l の範囲内で高さ調整ができます。
もちろん、これは水平方向(x軸方向)の制御幅と関係します。
理論上は、水平方向の制御幅は高い姿勢のときは小さくなり、
低い姿勢のときは大きくなります。
しかし、実際には低い姿勢のときにも前後の膝が接触する問題があり、
これを避けるために、結局は水平方向の制御幅が制約を受けます。
また、歩行のために遊脚の先端を上げるためのマージンも、
他の支持脚による姿勢の高さに関係します。
四足歩行の場合、いくつかの歩行様式があり、基本的なものには名前がついています。
[2]
これらは表 1 に示すように、接地率と各足の位相差で特徴付けられます。
接地率 β | 支持脚数 | 左右の位相差 | 前後の位相差 | 歩容 | 歩行速度 |
0.75以上 | 3 または 4 | 0.5 | 1 - β | クロール | 小 |
0.75〜0.5 | 3 | ウォーク | 中 | ||
0.5 | 2 | トロット | 大 | ||
0 | ペース | ||||
0 | 0.5 | バウンス |
前進運動は支持脚の足先が後方へ一定の速度で移動することにより、
その反作用として発生します。
このためには、垂直成分 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 が提供するサンプルプログラムもすべてビルドできました。
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