前回の振り返り&今回の概要
前回の記事では、動歩行の実装に向けて、どのように進めていくかや進捗に関して示しました。今回は、動歩行の実装がほぼできたので、それについてまとめます。
前回の記事↓
開発リポジトリ
動歩行の実装
今回は、動歩行の理論の実装から、その理論をシミュレータ(Webots)上のヒューマノイドロボット(ROBOTIS OP2)に実装して実際に歩かせるところまでを行いました。具体的には、歩行パターンと各関節への動作命令を生成する歩行パターンジェネレータを開発し、ロボットに適用しました。
動歩行の理論
動歩行動作を実現するために、歩行パターンジェネレータは大きく分けて以下の2つの手順を含まなければなりません。
- 着地位置や進行方向などの直感的な情報から、重心の軌道やZMP位置などを生成。
- 生成された情報を元に、逆運動学を解くなどして各関節角度・角速度を取得。
ここで1番肝になってくるのが、手順1、つまり歩行パターンの生成です。この歩行パターンが、ロボットの歩行動作を決定づけます。
この歩行パターンを生成する理論は複数存在し、決定的な手法が定まっていません。ですので今回は、『ヒューマノイドロボット(改訂2版)』)にも示されており比較的単純である、ロボットを『3次元線形倒立振子』モデルに近似する手法を実装しました。
線形倒立振子モデル
この手法では、ロボットの重心から脚の足裏中心点を倒立振子で近似します。
まず、この線形倒立振子の考え方を述べます。重心にロボットの全質量が集中しているとして、重心を倒立振子の先端、重心から足裏中心点までを無質量のリンクで結び、足裏中心点を回転中心とします。また、リンクは伸縮できるものと考えます。足裏中心点を足の設置点として考えるため、足裏は床面と常に並行になると考えます。
ここで、片脚で全体重を支えて前進することを考えた時、重心は足裏中心点を回転中心として後方から前方へと移動します。この時、リンクが伸縮できることから重心の高さを一定に保つようにします。こうすることでZ軸方向の値が一定となるため、X,Y平面のみを考えるだけで良くなります。そして重心がある一定まで前進したら、脚を入れ替えます。入れ替えた結果、その直後の線形倒立振子は、重心が足裏中心点よりも後方にある状態になります。そしてまた、重心を足裏中心点を回転中心として後方から前方へと移動させます。
この繰り返しによって、線形倒立振子でモデル化されたロボットの歩行動作を考えていきます。
以上の説明を図にまとまると、以下のようになります。
次に、この線形倒立振子モデルを考えたときに生成するのは、重心軌道です。詳しい話は省略しますが、大まかな流れとして、
- 初めに歩行時に胴体を支える脚(支持脚)を置く位置(歩行パラメータともいう)を与え、
- 歩行パラメータを元に重心軌道を計算し、
- それと同時に重心軌道をより正確に実現するように歩行パラメータを修正
という手順を踏みます。
以上から得られた重心軌道と着地位置、加えて別で考える次の支持脚となる浮いている脚(遊脚)の軌道を元に逆運動学を解くことで、各脚の関節角度・角速度が得られます。
線形倒立振子モデルを用いた歩行パターンの生成結果
ここでは、前節で挙げた線形倒立振子モデルを用いた歩行パターン生成を、実際にプログラムに起こして計算した結果のグラフを示します。
ここで、想定するロボットはROBOTIS OP2(source: Webots Darwin-op.proto)とし、歩行パラメータは以下とします。なお、歩行パラメータの座標は初期右足裏中心点を基準(0, 0)とし、基準から見て左足方向をY軸の正方向、胴体から見て正面方向をX軸の正方向とします。また、腰の位置を両脚股関節Roll, Pitch軸位置の中心、高さを 0.171856[m] とします。
Time[s] | 0.0 | 0.8 | 1.6 | 2.4 | 3.2 | 4.0 | 4.8 | 5.6 |
---|---|---|---|---|---|---|---|---|
X Pos[m] | 0.0 | 0.0 | 0.05 | 0.10 | 0.15 | 0.2 | 0.2 | 0.2 |
Y Pos[m] | 0.037 | 0.074 | 0.0 | 0.074 | 0.0 | 0.074 | 0.037 | 0.037 |
以下に、生成した歩行パターンのグラフを示します。なお、座標の基準(0, 0)を初期右足裏中心点から初期胴体中心点に変更しています。また、制御周期は10[ms]としています。
このグラフから、Y方向では体を+ー方向に揺らし、X方向では着地位置に沿って前進できていることがわかります。
ヒューマノイドロボットを歩行させる
歩行パターンが生成できたので、次はそれを元にシミュレータ上のヒューマノイドロボットを歩かせます。実現のためには、前述したように逆運動学を解くことになりますが、特に今回の場合は、ここでもまたいくつか考えることがあります。
1つ目に、今回の単に直進する歩行パターンには以下の3つのステップが存在することです。
- 歩行開始時の支持脚と遊脚の動作
- 歩行中の支持脚と遊脚の動作
- 歩行終了時の支持脚と遊脚の動作
この3つは、全て動作が微妙に異なります。
- 初期重心位置のX座標が着地位置のX座標と同じであり初期速度が0。
- 初期重心位置が着地位置の後方にあり初期速度が≠0。
- 最終重心位置のX座標が着地位置のX座標と同じであり最終速度が0。
この違いを判定する必要があります。
2つ目に、遊脚の軌道を考えてやる必要があります。遊脚は前着地位置から次着地位置まで、足を浮かせて前に動かす必要があります。この遊脚の軌道も幾つか考えられますが、今回は正弦波を用いることにします。また、足を上げる瞬間と下げる瞬間においては、遊脚の各関節角速度を最大にしています。
以上の2点に注意しながら実装をします。
結果、以下の動作を得ることができました。なお、制御周期は10[ms]、遊脚の足上げ高さは0.08[m]としました。
(リンク先に動画があります。)
突っ込む点は幾つかありますが、動歩行動作ができていると言える動作ができています。
今後の改善点
今回得られている歩行動作から、以下の問題点が残っています。
- 遊脚が0.08[m]まで足を上げていない。
- 歩行途中で遊脚が床面を擦ってしまっているからか、向いている方向が変わってしまっている。
また、以下の発展が考えられます。
- 他の歩行パラメータを与えても歩行できる。
- エラーハンドリングを記述する。
- 歩行パターンジェネレータを他Nodeに分ける。
- etc...
最後に
今回は動歩行の理論から、実際にシミュレータのロボットへの実装までを行いました。ただ問題点や改善点など、まだまだ完璧とはいえないので、今後はそちらに取り組んでいきます、
開発リポジトリ