歩行アルゴリズムのページ

概要

このページでは歩行アルゴリズムについて説明します。 なにをどう書くかについては、非常に悩むところです。2足歩行の説明そのものについては 本や論文がたくさんあるので、2L1で試したこと、その結果、考察(というよりは感想) 、考えた力学モデルを、しばらくは徒然なるままに書きます。あるていど 量がまとまってきたら、編集しようと思っています。


v6の歩き方(2002.08.05)

足の運び方
足の運び方(直進歩行のパターン)

1.標記の説明

  • 足跡1〜4:足跡です。
  • 紫の線:下図で説明している「仮重心」の移動軌跡を地面へ投影した線です。
  • 寸法:実際に2L1v6で使用した歩行パターンのパラメーターです。
2.歩き方の説明

  • 区間「1」−>「2」

      左図は足をそろえた状態から「はじめの一歩」を経て連続的に歩いている状態を 示しています。図から分かるように「仮重心」はジグザグに移動してゆきます。

      「1」−>「2」は右足に重心を移してゆく過程を表しています。仮重心は「1」で 加速をはじめ、「1」と「2」の中間点で最高速度に達し、「2」で停止します。
      途中仮重心が「a」まで来たときに左足を前に出し始めます。 「a」の位置は、実際に歩かせながら1から2の中間点付近に決めます。

      左足は「仮重心」が「a」から「2」へ移動する時間で「足跡1」から 「足跡3」へ移動します。「足跡3」に到着した時点で左足は数ミリ 浮かせておきます。

  • 区間「2」−>「3」

      「仮重心」を左右の足の中心まで戻します。 この間に左足を地面の高さまで下ろします。
      「仮重心」の移動速度はやはり中間点で最高となります。
  • 区間「3」−>「4」

      「1」−>「2」と同じです。
  • 区間「4」−>「5」

      「2」−>「3」と同じです。
    以上「1」−>「5」で1サイクルを構成します。ここで1,3,5点では ロボットの重心が両足の中間にあり、停止しています。この状態を「軌道切り替え 点」(直進から旋回等)と「モーターに負担の少ない停止点」として使用しました。

    3.軌跡の分割数

      RCサーボの目標位置の更新レートは毎秒25回で、「1」−>「2」等 各直線区間の分割数は19〜22です。内蔵する電池の重量により加減しています。 (重心が変わると揺れの周期が変わるためです。)

      周期が変わったときにはジャイロのゲインも変えた方が良いのですが、しませんでした。

  • 仮重心/関節座標の原点 計算の基準点(仮重心)

    左図の「重心マーク?」の場所を仮に重心位置と決めて、この仮重心の移動軌跡と、遊脚 (体を支えていない方の足)の軌跡を制御波形生成プログラムへの入力としています。

    また、この場所は逆運動学計算を行うとき、各関節の位置を定義する「原点」としても 使っています。


    歩行時のショックの吸収(2001.11.10)

    自動車等の「アクティブサスペンション」の考え方を取り入れています。 ごく一般的な自動車のサスペンションにはバネとオイルダンパーが付いて 受動的に動くだけですが、私が指す「アクティブサスペンション」とは、 このバネ・ダンパー系の特性をアクチュエーターの制御でシミュレート する事により、衝撃を吸収すると言うものです。

    2L1v5の動画を注意深く見ていただくと、足が接地したときに少しヒザを曲げている のが分かると思いますが、コレのことです。

    実際の所は、「力のフィードバック」をやっていないので、それっぽく動かしているだけです。(笑)


    力学モデルその1

    はじめにこんな形のモデルがどう動くかを考えました。

    力学モデル
  • 運動は平面内に限定する。
  • 関節B、Dは90度に固定
  • 足先A、Cには、地面との間に、適当な摩擦係数(静・動)がある
  • 支点がAからCに切り替わる時に、一定の割合で運動エネルギーが失われる
  • 質量はmの部分にだけある
  • 構造AB、BD、CDは剛体である
  • これから作るロボットの性質を考えて、空気の抵抗は考慮しない

    力学モデルその2

    足首にかかる力を評価するために考えたモデルの、一番簡単なものです。

    力学モデル
    垂直方向から、θ傾いた位置で質量mの重りを、j1に取り付けたモーターにて、静止状態で 支えるとします。 重力加速度をgとおき、重りにかかる力mgを、構造lの方向の力f1と、構造lと直角な方向 の力f2に分けて考えると、f2=mg・sinθになり、j1で発生しなければならない トルクt1はl・f2となります。

    例として前に倒れる境目の位置(mがつま先の上)まで来た時の必要トルクを2L1v5の 数値を使って簡単に計算してみます。各数値は概略で以下の物とします。
    m=1.45(kg)
    l=0.23(m)
    x=0.05(m)

    θ=asin(x/l)より約12.56度
    t1=0.23*1.45*9.812*sin(12.56)
    =0.7116(N・m)
    =7.2kg・cm

    と言うような感じの計算をし、足首の必要トルクの目安にしています。

    こんな風にして計算した値が、モーターのカタログスペックを常に越えるような状態を 発生させると、サーボモーターが壊れるという仕組みです。


    足先の加速・減速パターン

    以下の様な利点があるので、足先が通る軌道内部での加速・減速パターン にcos関数を使用しています。

  • 始めと終わりに速度がゼロ
  • 積分すると面積(距離)が1
  • コンパイラに標準装備の関数
  • ちょうど真ん中で加速度がゼロ(速度は最大)

    y = cos(PI * x) + 1
    0 <= x <= 1.0
    PI:円周率
    x軸:時間、y軸:速度

    この様に 面積(移動距離)1、経過時間1 の関数を単位ベクトルのように考えて、 任意の距離を任意の時間で移動する点列を作っています。
    軌道が3次元曲線の場合も、同じ長さを持つ直線上に点列を作り、曲線上に並べてゆく 事によって対応できます。


    計算を簡略化するための条件
  • 「地面は水平」と仮定する。
  • 足底面は常に地面と平行
  • 胴体は常に水平
  • 腰の高さは一定
  • 直進時に足は正面を向き、両足は平行

    モデル化の前提

  • サーボモーターは、外力に応じて入力信号から決まる目標位置とは異なる位置で止まって いると考えます。また外力によりバネ/ダッシュポット系の様な振る舞いをすると考えます。
  • 関節から関節までをつなぐフレームは剛体として取り扱います。

    制御の周期
    RCサーボに関していえば、50Hz(20msec)程度で入力のパルスを与えるためこの周波数が おおよその上限となります。1制御周期の間に12個のサーボ用の位置データをサーボ コントローラーに入力し、ジャイロ等のセンサーのデータを読み込みます。
    2L1v5の場合はサーボにパルスを出す1周期の時間に12回、8bitのパラレル入出力 を行う事が出来ます。しかし、入出力の対象が以下の様になっていますので、サーボの 1周期の間に全ての入出力が終わらないため、以下に示す制御の周期になります。

  • サーボデータをこれから送ることを知らせるコマンド(1バイト)
  • サーボの角度データ(12バイト/12個分)
  • これからセンサーのデータを読む事を知らせるコマンド(1バイト)
  • ジャイロのデータ(2バイト/2軸)
  • ADXL202のデータ(2バイト/2軸)
  • 足裏タッチセンサーのデータ(1バイト)
  • 合計 19バイト

  • サーボにパルスを出す周波数は47Hz

    制御の周波数=1/47*19/12=0.03369sec=29.68Hz

    姿勢の制御

  • 上記条件によれば、歩行中は胴体部分に回転運動が生じない事となりますので、 もしも回転運動が生じたら、姿勢を制御する必要が生じたとみなし、傾いてゆく方向と反対方向に 足首を動かします。姿勢制御動作の用のオフセットデータは、足先軌道から逆運動学計算により 求めた制御波形とは別に計算し、双方を重ね合わせて出力します。 軌道データには補正を加えません。
    この制御方法は、止まっている時、ゆっくりと動いている時、 もしくは動きを止めようとしている時に比較的うまく働きます。



  • 歩行パターンその1
    2L1v3で試した歩行パターンの足先軌道を図示してみました。
    フェイズ1 フェイズ1

    右の足に重心を移します。

    フェイズ2 フェイズ2

    左の足をその場で持ち上げ、前に送ります。そして、下ろします。

    ロボットの重心を、足首関節中心の真上に保持出来れば、足首に力はかからない 訳ですが、遊脚だけを動かすと、ロボット全体としての重心が変わりますので、 重心は支持点の周りを移動します。また、足先の到達可能範囲が十分でないため 支持点直上まで重心を持っていけない場合も、足首で支えることになります。

    この期間に、足型図形の中に重心があれば 転倒しませんが、足首のモーターが十分なトルクを発生できない場合は、支持点 から重心がずれるにつれて、だんだんとロボットが傾いてきます。

    遊脚の移動速度をだんだんと上げて行きますと、反動が大きくなってゆき、 反動を打ち消すような動作(例えば手を振る等)を行わない限り立って いられなくなります。

    フェイズ3 フェイズ3

    左の足に重心を移します。

    フェイズ4 フェイズ4

    右の足をその場で持ち上げ、前に送ります。そして、下ろします。




    戻る

    ホームへ戻る