ZMPと転倒条件

Robotics
succoによるPixabayからの画像

今回はロボットの転倒条件と転倒を回避する手法について話していきます.

モデル化

まず,次のようなモデルを仮定します.

  • ロボットの質量: \(m\)
  • ロボットの重心位置: \(x_g\)
  • 床反力の垂直成分: \(f_n\)
  • 床反力の作用点の位置: \(x_n\)
  • 前輪の位置: \(x_f\)
  • 後輪の位置: \(x_r\)
  • 重力加速度: \(g\)

さらに次の状態を仮定します.

  • ロボットは静止している
  • 外力は働いていない

この時の力の釣り合いを考えると次の式が成り立ちます.
\begin{align}
mg = f_n
\end{align}
続いて,重心周りの力のモーメントについて考えます.
\begin{align}
0 = f_n ( x_n – x_g)
\end{align}
\(f_n = 0\),つまり\(m=0\)であることはないので次の関係が成立します.
\begin{align}
x_n = x_g
\end{align}
この式は,床反力の作用点の位置は重心の位置を床面に投影したものと等しいことを表しています.

転倒条件

続いて,転倒条件について考えていきます.転倒する条件は次の式が成立できなくなった時です.

\begin{align}
x_n = x_g
\end{align}

ここで \(x_n\) の値の範囲を考えていきます.当然ですが,床反力は床とロボットの間に発生する力です.したがって,\(x_n\)の値域は次のようになります(図の赤く塗られた範囲).

\begin{align}
x_f \le x_n \le x_r
\end{align}

つまり,重心が車輪の外側に出たら倒れる(接地点周りに回転する)ということです.逆の見方をすると, \(x_n = x_f\) あるいは \(x_n = x_l\) の時にロボットは不安定となり転倒し始めます.ちなみにこれはセンター試験の物理で出題されるような問題です(棒が倒れる条件).

以上のことから,ロボットを転倒させないためには重心の位置が大切であることがわかると思います.ルンバのような手足のないロボットの場合,ロボット内の重心位置は変わりません.そのため,設計時に計算できる重心位置から,ロボットがいつ転倒するのか容易に予測することができます(例えば,どの程度の傾斜が登れるのか).しかし,ASIMOSpotMiniのように手足のあるロボットの場合は,ロボットの姿勢に応じて重心の位置が変化します.ロボットは自分が転倒しないように重心の位置を制御しなければいけません.ところが,重心の位置をモデルから高精度に,かつリアルタイムに計算するのは非常に難しいです.

ZMP, COP

前述の通り重心の位置 \(x_g\) を求めることは難しいので,その代わりに \(x_n\) を求めます.ロボットは \(x_n\) が \( x_f \le x_n \le x_r\) の範囲内に収まるように姿勢を制御します.ここでロボットには複数の足あるいは車輪があると考えます.そして各足(計 \(l\) 本)に加わっている床反力の垂直成分とその作用点を \(f_{n1}, f_{n2}, \cdots, f_{nl}$, $x_{n1}, x_{n2}, \cdots, x_{nl}\) とそれぞれ置きます.さらに\(f_n\),\(x_n\)を各足の床反力の合力とその位置と再定義します.この時 \(f_n\) と \(x_n\) は次のように書けます(単純な合力の計算です).

\begin{align}
f_n &= \sum_{i=1}^{l}f_i \\
x_n &= \frac{\sum_{i=1}^{l}f_i x_i}{\sum_{i=1}^{l}f_i}
\end{align}

合力の作用点は,その力によるモーメントが0になる点です.そのことから \(x_n\) を Zero Moment Point, ZMP と呼びます.また,力センサの大きさが全て等しければ \(x_n\) を床反力による圧力の中心とみなすことができます.そのため,Center of Pressures, COP と呼ぶこともあります.したがって,ZMPとCOPは捉え方が異なるだけで本質的には同じものです.ロボット系ではどちらも使われるので注意してください.

支持多角形

ここまでは,1次元で床を考えてきましたが実際の床は2次元です.そのため,転倒条件を単純に \( x_f \le x_n \le x_r\) と書くことができません.そこでこれを2次元に拡張したものが支持多角形です.

支持多角形はロボットの着地している足の面を凸包したものとして定義されます(より正確にいうと床に接している力センサを凸包したもの).ZMPが支持多角形の境界状になければロボットは転倒しません.逆にZMPが支持多角形の境界にあるときにロボットは転倒し始めます.勘違いしやすいのですが,ZMPは床反力の合力の作用点なので支持多角形の外側には存在しません.

ZMPによる制御の問題点

ここまでの話の通り,ZMPを支持多角形の中に収めることでロボットは転倒せずに姿勢を変えることができます.ただし,この理論が成り立つのは最初に述べ通り次の条件があります.

  • ロボットは静止している
  • 外力は働いていない

もちろん完全に静止していてはロボットは動けないので,ロボットは静止しているとみなせるぐらいゆっくり動くことになります.また,足が床に対して滑らないことを重視すると,忍び足のように動くことになります.

また,ZMPによる制御では(人の歩行のように)バネの振動のような運動ができないのでエネルギー効率が悪いという側面もあります.名工大の佐野先生の研究ではZMPどころか電子制御を行っていない受動型歩行ロボットを扱っており,このロボットは人に近いエネルギー効率の良い歩き方をします.

研究的な側面では弱いですが,足1つに対して力センサが3つ以上必要になるのでロボットが高価になりやすいという面もあります.これは足1つでも支持多角形(三角形)を定義できるようにするためです.

(補足) 重心位置をモデルから計算することが難しい理由

そもそも.重心はどのように求めればいいのでしょうか? 理科の教科書には物体に紐をつけてぶら下げる方法が載っていましたが,もちろんこれでは高精度に計測することはできません.CADで計算することもできますが,CADの場合は物体の密度が均一であることを前提としているのでどうしても誤差が生まれます.さらに, ロボットの姿勢の計算には角度センサが使われますが,角度のわずかな違いで重心は大きく動きますし,リンクが大きいほど角度の誤差は累積していってしまいます.

(余談) 人の運動制御

ちなみに,人は普段の歩行ではZMPを重視して歩いていないのかもしれません.人は日常の動作においては十分に学習がなされているので,オープンループな制御を行うことで素早い動作ができています.一方で平均台のように日常的な動作にない学習の進んでいない運動の場合は,ZMPを重視してゆっくり動くのではないでしょうか.


誤字や数式の間違いなどがありましたら,指摘していただけると助かります.

コメント