線形倒立振子モデルに基づく,歩行解析
概要
こんなモデルを考える.
右足,左足を切り替えて歩行を実現していくのが,今回の目標である.
モーター等の入力はなく,粘性等のエネルギー損失もないので,初速・初期位置で動作が決定することに注意してほしい.
歩行イメージ
2本の足両方が着地し,安定状態になることはないとする.
片足をつけて,移動し,反対の足を着地しを繰り返す.
線形倒立振子モデルにおけるZMP方程式
次に数式モデルについて解説する.
足に重みはなく,胴体に質点があるモデル使う.
質点の質量を$m$とすると.
運動方程式は
m \ddot{x}=f \cos\theta\\
m \ddot{y}=f \sin \theta -mg
足より伝わる力$f$は,足の接地方向と一致する.
なぜなら,方向がずれていた場合
といえる
以上より
\frac{\sin \theta}{\cos \theta} = \frac{\ddot{y} + g}{\ddot{x}} = \frac{y}{x-x_z}\\
といえる.$\frac{y}{x-x_z}$は
より出した.
ここでものすごい強引な仮定を導入する
y = const
つまり,$\ddot{y} = 0$とするのである.
\frac{\sin \theta}{\cos \theta} = \frac{ g}{\ddot{x}} = \frac{y}{x-x_z}\\
\therefore \frac{ g}{\ddot{x}} = \frac{y}{x-x_z}\\
\therefore x-x_z = \frac{y}{g} \ddot{x}
この式が,線形倒立振子モデルにおけるZMP方程式であり,運動方程式である.
ZMP方程式の考察
ZMP方程式を簡略化した式
\frac{y}{g} \ddot{x} = x -x_z
に従うと以上より考えられる.
$x_z$を中心として,発散する不安定なシステムである.
$x,\dot{x}$がある状態の時に着地足を切り替えることで,足の着地点$x_z$の更新が行われる.
その時,次の二つの動作が考えられる.
では,この動作2になる条件を考えよう.一度,反時計回りに回りだしたら.戻らないのは想像がつく.よって,速度が一度でも負になれば,歩行に失敗したといえる.
歩行条件
$\dot{x}$が正になるのが,動作2の条件である.
$\ddot{x}$は切り替え始めは負で速度が減っていき,山を越えると(頂点を超えると)正になり速度が増していく.そして,着地足を切り替える
では,速度$\dot{x}$が正になる条件を考えよう.
二階微分の微分方程式なので,
\frac{y}{g} \ddot{x} = x -x_z
には,解が存在する.
x -x_z = A \exp( \sqrt{\frac{g}{y} }t) + B \exp( -\sqrt{\frac{g}{y} }t)
速度$vx$は
vx= A \sqrt{\frac{g}{y} } \exp( \sqrt{\frac{g}{y} }t) - B \sqrt{\frac{g}{y} } \exp( -\sqrt{\frac{g}{y} }t)
となる.
初期状態を$x_0,vx_0$とし,着地足の場所を$x_z$とすると
x_0 =A+B + x_z\\
vx_0 = (A-B) \sqrt{\frac{g}{y} } \\
となり,$A,B$を求められ,$x,vx$が計算できる.
速度$vx$が負になると,切り替え(歩行)に失敗したということになる.
A=\frac{x_0 - x_z + \sqrt{\frac{y}{g} } vx_0 }{2}\\
B=\frac{x_0 - x_z - \sqrt{\frac{y}{g} } vx_0 }{2}\\
である.代入し
\begin{align}
vx &=& \sqrt{\frac{g}{y} } \{ A \exp( \sqrt{\frac{g}{y} }t) - B \exp( -\sqrt{\frac{g}{y} }t) \}\\
&=& \sqrt{\frac{g}{y} } \{ (x_0 -x_z) \sinh(\sqrt{\frac{g}{y} }t) + \sqrt{\frac{y}{g} } vx_0 \cosh(\sqrt{\frac{g}{y} }t) \}\\
\end{align}
さらに
\begin{align}
x &=&(x_0 -x_z) \cosh(\sqrt{\frac{g}{y} }t) + \sqrt{\frac{y}{g} } vx_0 \sinh(\sqrt{\frac{g}{y} }t) + x_z\\
\end{align}
が得られる.
とりあえず,シミュレーションしてみよう!
import numpy as np
import math
import matplotlib.pyplot as plt
x0 = 0
v0 = 5
xz = 1
x_switch = 1
g=9.81
y=1
t=0
t_now = 0
dt = 0.0001
#保存用
T=[]
x_save=[]
v_save=[]
while True:
if t_now>10:
break
x=(x0 - xz)*np.cosh(math.sqrt(g/y) * t)+math.sqrt(y/g) *v0 * np.sinh(math.sqrt(g/y) * t) + xz
v= math.sqrt(g/y) * ( (x0 - xz)*np.sinh(math.sqrt(g/y) * t)
+math.sqrt(y/g) *v0 * np.cosh(math.sqrt(g/y) * t) )
x_save.append(x)
v_save.append(v)
T.append(t_now)
if x - xz > x_switch:
"""
足を切り替える.
いろいろ更新
"""
print(x,xz)
xz = xz + 2
x0 = x
v0 = v
t = 0
plot_max = 100
if x<-1 *plot_max or x>plot_max:
break
t= t+dt
t_now = t_now + dt
plt.figure(0)
plt.title('x')
plt.grid(True)
plt.xlabel('t')
plt.ylabel('x')
#plt.ylim(0,20)
plt.plot(T, x_save)
plt.show()
plt.figure(1)
plt.title('v')
plt.grid(True)
plt.xlabel('t')
plt.ylabel('v')
#plt.ylim(0,50)
plt.plot(T, v_save)
plt.show()
こんな感じで一定歩行が実現できています.
次の目標は,切り替えタイミングと歩行失敗の関連付けです.
切り替えタイミングと歩行成功条件
歩行時の一歩の大きさ$x_{step}$と切り替え時の足の速度$v_0$を与えた際,歩行が成立する条件は速度がずっと正であることより
-\frac{x_{step}}{2} \sinh (wt) + \frac{v_0 }{w} \cosh (wt) > 0\\
w = \sqrt{\frac{g}{y}}\\
となることである.$-\frac{x_{step}}{2} \sinh (wt) + \frac{v_0 }{w} \cosh (wt)$のグラフを書くことで成功するか判断できる.
最後に歩行時の一歩の大きさ$x_{step}$のみを与えた際の,歩行が成立する切り替え時の足の速度$v_0$はいくつになるか考えてみよう.
v_0 > \frac{x_{step} w}{2} \tanh (wt)\\
と変形できるので,$ \frac{x_{step} w}{2} \tanh (wt) $で最小速度がわかりそうですが,経過時間$t$の最大値が不明のため,少々難しい.あきらめる.
$tanh$は-1~1なので,あまり考えず$\frac{x_{step} w}{2}$の歩行速度を持たせれば確実に歩行させることができる.
v0 = 2*math.sqrt(g/y) / 2 + 0.001
v0 = 2*math.sqrt(g/y) / 2
最後に
次は,足に面積があるものの歩行解析をしてみようと思います.
Author And Source
この問題について(線形倒立振子モデルに基づく,歩行解析), 我々は、より多くの情報をここで見つけました https://qiita.com/hiRina/items/d86685db2aa37b14b227著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .