...

垂直跳びを学習するリンクセグメントモデルのコンピュータシミュレーション

by user

on
Category: Documents
11

views

Report

Comments

Transcript

垂直跳びを学習するリンクセグメントモデルのコンピュータシミュレーション
NAOSITE: Nagasaki University's Academic Output SITE
Title
垂直跳びを学習するリンクセグメントモデルのコンピュータシミュ
レーション
Author(s)
木村, 広
Citation
長崎大学教養部紀要. 自然科学篇. 1990, 31(1), p.133-167
Issue Date
1990-07
URL
http://hdl.handle.net/10069/16616
Right
This document is downloaded at: 2017-03-29T17:57:11Z
http://naosite.lb.nagasaki-u.ac.jp
長崎大学教養部紀要(自然科学篇) 第31巻 第1号 133-167 (1990年7月)
垂直跳びを学習するリンクセグメントモデルの
コンピュータシミュレーション
木村広
(1990年4月28日受理)
A Computer Simulation of Motor Learning
of Vertical Jump on Link-Segmental Model
Hiroshi KIMURA
Abstract
The previous studies about vertical jump reported that the joint torque patterns during
take off phase are different between persons.
The author believes that both redundancy of human body's structure and individuality of
human's motor learning make such difference.
In order to examine his idea, a computer simulation was done. The model in the simulation was designed to have structural redundancy, and various functions to evaluate its own
vertical jump performance were given to the model in order to make individual situation of
learning.
The vertical jumps that the model learned under the different function were looked alike,
but the torque patterns were much different. The author concluded that his theory about motor
learning of vertical jump was proved by this simulation.
§0.緒言
垂直跳びの踏切動作中の腰,膝および足の各関節で発揮されるトルクやパワーが個々人によっ
て大きな違いがあることが,従来の垂直跳び研究(佐川,佐谷と松本, HubleyとWells2),
桜井,池上と矢部3)など)によって報告されている.しかし,その原因は全く明らかにされて
いない。従来の垂直跳び研究は,垂直跳び運動を測定し,記述することに終始していた.
従来の垂直跳び研究に欠けていたものは,現象を説明する理論である.なぜ,人によって垂
直跳びのしかたが違うのかを明らかにしなければ,垂直跳び運動を理解したことにはならない.
筆者は,人間の身体構造の冗長性と運動学習の個別性が,垂直跳びのしかたが違う原因であ
ると考えている.身体構造の冗長性とは,たとえば,ある方向に力を発揮したいときに,その
力を脚で発揮するか,腕で発揮するかなど,多くの可能な方法があることを言う.運動学習の
個別性とは,ひとっの学習目標が与えられたとき,人によってその与えられた目標に近づいて
いく道筋が違うことを,ここでは言う.
134
木村広
この予想に基づいて,本稿では,構造的に冗長性のあるモデルがどんな学習をしたらどのよ
うな垂直跳び運動を獲得するかについてコンピュータシミュレーションをおこなった.コンピュー
タシミュレーションには,実験のノイズを計算誤差の範囲内にコントロールできること,実験
の再現性が完全であることなどの利点がある.さらに,検証されるべき理論がコンピュータプ
ログラムという厳密に定義された記号体系で記述されるため,理論の検証そのものが非常に容
易になることも見のがしてはならない.
シミュレーションの結果は筆者の予想を裏付けるものであった.
§1.方法
ここでのコンピュータシミュレーションの対象となる運動は,反動動作を伴わない垂直跳び
である.膝を曲げて静止した状態から,腕を体側につけたまま,その場で跳躍をおこなうもの
とし,跳躍動作の開始から足が地面から離れるまでをシミュレートする.自らの垂直跳びパフォー
マンスを観察しながら垂直跳びを繰り返し,垂直跳びパフォーマンスの向上に努めるよう,モ
デルをプログラムした.
§1. 1人間の力学的モデリング
人間の垂直跳び運動は左右対象であり,運動は矢状面内でおこなわれるものと仮定した.
今までの垂直跳び運動の研究では, Komor-に代表されるように,スプリングモデルスプリングやダンパ,力発生器を並列に並べたエレメントを,さらに垂直に数個並べたモデルー
ーを使ったものが多い.しかし,垂直跳びを深く研究するにはこのスプリングモデルでは不
十分である.スプリングモデルでは,各エレメントがどのような力発揮をしたとしても,モデ
ルの運動は鉛直方向にのみ限られている.高く跳ぶために大きな力を発揮すると同時に,動作
中の身体のバランスが崩れないような調整をおこなわなければ,垂直跳びは不可能である.
本稿では人体をリンクセグメントとしてモデリングする(図1参照).このモデルは体幹,
大腿,下腿および足に相当する4つのリンクと,腰関節,膝関節および足関節に相当する3つ
の関節からなっている.睦は垂直跳びの踏切中,地面から離れないと仮定した.このモデルの
自由度は3である.このモデルの垂心の鉛直方向速度を増大させるために必要な自由度は2だ
から,自由度は1あまり,このモデルは冗長性を持っていることになる.さらに,このリンク
セグメントモデルは不適当な関節トルクのもとでは決して垂直跳び運動ができない.このモデ
ルに不適当な関節トルクが与えられると,モデルは運動の途中で倒れることもあるし,跳躍で
きたとしても跳躍の方向が必ずしも垂直であるとは限らない.正しく垂直跳びができるような
関節トルク発揮のしかたを,モデル自身が学習によっていかに獲得するかが問題である.
シミュレーションの正確性を期するならば,人体の足部と地面との間にトルクの働かない第
4の関節があるものとして垂直跳びをモデリングしなおす必要がある.しかし,リンクの運動
をシミュレートするための計算量はリンクの関節数の4乗に比例して増えるから5),関節がひ
とっ増えただけでも,リンクの運動を計算するためにさらに膨大な時間がかかってしまうこと
になる.ここで行った3関節のリンクのシミュレーションでも,ひとっの試技を計算するのに
約10分かかっていて, 4つの関節を持っリンクの運動をコンピュータシミュレートし,ある
最適値を数多くの試技の中から探し出すことは現在のパソコンクラスの能力では不可能に近い.
将来,もっと大きなコンピュータパワーを使えるようになったら, 4番目の関節を考慮にいれ
てモデリングとシミュレーションをおこなうであろう.
垂直跳びを学習するリンクセグメントモデルのコンピュータシミュレーション135
§1. 2モデルの運動方程式
このリンクセグメントモデルの運動方程式はラグランジュ法を使って導いた.図1を参照さ
れたい.各リンクを足に対応するものから上方に向かってリンク0,リンク1,リンク2,リ
ンク3とする.リンクiとリンクi-1を結ぶ関節を関節iとする.リンクiの,長軸方向の長
∼
さをli,質量をmi,質量中心の位置を1ゥ.質量中心まわりの慣性モーメントをIiとする.一
般化座標Oiとして,リンクiの長軸とリンクi-1の長軸とがなす角度をとる.リンク1の接
地部分-人間の産に相当する-からリンクiの質量中心へのベクトルをsiで表すと,リ
ンクiの運動エネルギーKi,リンクiのポテンシャルエネルギーPi,およびリンクセグメント
モデル全体のラグランジアンLは,
Ki-÷Tl ̄i.2
-iSiSi+-Ii(280
zj=l
i-1
pi-mig(Zljsin^j+lgjsinZ#j)
j-ij-i
i-1
吾IjCOS Oj+lgjCOS吾oj
Si=
i-1
吾Ijsin Oj+lgjsin吾oj
3
3
L- ∑Ki-∑Pi
i-l
i-l
と書き表すことができる.
li, mi, lgiおよびIiの具体的な値については, Dempster6), Plagenhoef'を参照した.
足,膝,腰に相当する関節にはたらくトルクTi, T2, T3は,上記のラグランジュ運動方程
式から
′tヽ一′
・i-孟(豊)一票(i-l.2,3)
と導きだされる. Tiは3つの関節角度, 3つの関節角速度および3つの関節角加速度をパ
ラメータとする関数である.
Ti-Ti(β1,β。,β。,β1,8。.β。,β1,β2,β。)
このリンクセグメントモデルが垂直跳びを実行するために各関節に発揮する力は,リンクの
鉛直線に対する傾きをなくし,リンクセグメントモデル全体の質量中心の水平移動の速度をキャ
ンセルするような関節トルクによるものと仮定した. gaini,i,gains,2をそれぞれ,リンクの
傾きをキャンセルするためのフィードバックのゲイン,モデル全体の重心の水平速度をキャン
セルするためのフィードバックのゲインを表すことにして,以下の式で与えられるTiがモデ
ルの関節iにはたらくものとする.
木村広
136
1
Ti- (言-z oj)gaini,i+CGxgaini,2
ここでCG,はモデルの重心の水平速度を表している.このリンクセグメントモデルには
全部で6つのフィードバックループがあることになる.
このトルクTiを式(6)に代入して,それを関節角加速度について解き,関節角加速度を,
関節角度,関節角速度および関節トルクの関数として表す.
Oi-Oi(01,02.03,01,02,03.TIT2.T3)
この関数を使ってモデルの挙動をコンピュータシミュレートする.コンピュータシミュレー
ションの具体的な手川副ま以下の1-4のとおりである:
1.ある瞬間の関節トルクの大きさを,瞬間のモデルの状態-各関節の角度,角速度,
角加速度およびモデル全体の質量中心の水平速度-から式(7 )にしたがって求め
る∴
2.このトルクからどれほどの関節角速度が得られるかを式(8)から算出する.
3.新しい関節角速度および関節角度を, -瞬間前の関節角加速度,関節角速度および関節
角度からオイラー法を使って導きだす.
4.モデルの質量中心の鉛直上向きの速度が最大となるまで, 1-4を繰り返す.最大値が
得られたら計算を終わる.
フィードバックゲインが小さすぎるときなど,モデルに与えるパラメータによってはモデル
の質量中心の速度が全く増加しないこともある.そのときはジャンプをできないと判断して,
計算を打ち切った.
§1. 3学習のモデル
モデルが学習を進めるためには,学習の目標,学習状況を評価する手段,および,学習のア
ルゴリズムがモデルに与えられなけらばならない.
ここでシミュレーションでモデルに与えた目標は
1.跳躍時の身体姿勢が十分直立していること
2.跳躍方向が十分垂直であること
3.跳躍速度が十分大きいこと
の主っである.これらの目標間の関係は, 1と2とが並列, 3が1と2との上位目標となる
ように配置した.コンピュータ用語を使えば,目標1と2とは,それぞれ独立したループを作っ
ていて,両者は目標3のループの内側にあると言うことができる.この3つの目標がすべて達
成されたとき,モデルは垂直跳びを学習したと認めることができる.
上記の1. 2, 3に対応する学習の評価方法は,それぞれ,次にあげるr, 2', 3'である・.
1'.モデルの重心の垂直方向簿度が最大となったとき,各リンクiが鉛直線となる角度に
重みei (eiについては後述する)を乗じたものの絶対値の和が,与えられた大きさβerr
より小さくなること
3
Eei'
i-i,?,サ蝣<<?.
(9)
垂直跳びを学習するリンクセグメントモデルのコンピュータシミュレーション137
2 '.モデルの垂心の垂直方向速度が最大となったとき,モデルの重心の速度の垂直方向成
分ⅤⅤと水平方向成分Vhの比の絶対値が,与えられた大きさVerrより小さくなること
l豊<Ve
3'.モデルの重心の垂直方向速度が最大となったとき,モデルの重心の垂直方向速度の大
きさⅤⅤが,与えられた大きさVenoughより大きくなること
Vv ss*venough
運動学習の個別性をシミュレーション内に実賀するため,リンクiの傾きに重みeiをかけて
から姿勢を評価するようにし,また, 3つの関節トルクが一回の学習によって調整される大き
さにバイアスe'iを乗じることにした.たとえば, (ei, e2, e3,)が(2, 1, 1)であると
きはリンク1-下腿に相当する-の直立状態がリンク2,リンク3の直立状態よりも2
檀,重視されることになる.また,たとえば(e¥,e2,e3.が(1. 1. 2)であるとき,
モデルは関節3-腰関節に相当する-に加わるフィードバックゲインを,関節1,関節
2にはたらくフィードバックゲインよりも2倍速く増加/減少させながら調整して,垂直跳び
を学習することになる.そして,たとえば, (ei,ez,e3jが(2, 1. 1)であり,かつ,
(e'i, e2, e3.が(1. 1. 2)であるとき,下腿の傾きが気にかかっていて,かつ,その
傾きを腰関節トルクによって調整しようとしている人間の垂直跳び運動をシミュレートするこ
とになる.
モデルは1, 2, 3の目標を達成すべく, r, 2', 3'の方法を用いてモデル自身のパファー
マンスを評価しつつ,次の図2に示すアルゴリズムにしたがって垂直跳びを学習する.ここで
は,やや特殊なMathemetica事という新しいコンピュータ言語を使ってそのアルゴリズムを記
述した. Mathematicaについての詳しい説明は文献8)を参照されたい.ここに示したプログ
ラムは最も上位のものだけを抜き出したものであり,下請け的な作業をする上位のプログラム
については省略してある.コンピュータシミュレーションの全プログラムは付録に掲載した.
なお,図2に示したプログラム中の関数名や変数名は,一部,読者が理解しやすいよう,付録
にのせた実際のプログラム中に現れる関数名,変数名と変えたものがある.しかし,全体的な
プログラムの流れは同じである.プログラムをデバックするためのコードなども図2には示さ
なかった.
蛇足ながら,このプログラムについての説明を試みる. Mathematicaを知っていて,図2に
示したプログラムを理解できる読者は,ここから1. 4の前までを読み飛ばして差しつえな
い.
関数vjはフィ-ドバック情報と垂直跳びパフォーマンスを入力とする.ここで,フィード
バック情報とは,フィードバックゲインgain;jを表す行列である.もし,跳躍姿勢が十分直
立していて,かっ,跳躍方向が十分垂直で,かつ,跳躍速度が十分大きかったら,学習シミュ
レーションを終了する.そうでない場合,姿勢矯正ルーチンcaeと跳躍方向修正ルーチンchv
を呼び出す.その結果,パフォーマンスに改良が見られたら,改良されたパフォーマンスと,
そのパフォーマンスを実現したフィードバック情報を入力として,関数vjをふたたび実行す
* Mathematicaは, Wolfram Research Inc.の登録商標です。
138
木村広
る.パフォーマンスに改良が見られない場合,別に新しくフィードバック情報を候補として立
て,関数vjをやり直す.
関数caeでは, vjと同じくフィードバック情報と垂直跳びパフォーマンスを入力とするが,
もっぱら, vjの下請けとして働く.もし,跳躍姿勢が十分直立していると判断されたらcae
を呼び出した関数に戻る.そうでない場合は, 3つの関節に働く関節角度フィードバックのゲ
インを変化させたフィードバック情報を作り出し,そのフィードバック情報のもとで垂直跳び
のシミュレーションをしてみる.もし,跳躍姿勢に改良の見られる試技があれば,その試技を
実現したフィードバック情報とその試技のパフォーマンスを新しい入力として関数caeをやり
直す.跳躍姿勢の改善が見られなかった場合, caeを呼び出した関数に制御を戻す.
関数chvの流れは関数caeと同じでcaeに対してchvは次の二つの点で違っているだけで
ある:
・跳躍方向が十分垂直かどうかを判断すること
・フィードバック情報のうち,操作するのはリンクセグメントモデル全体の重心の水平速度
をキャンセルするためのフィードバックゲインであること
§1. 4シミュレーション
このモデルの各関節角度の初期値-モデルの運動開始直前の沈み込みの深さ-は,腰,
膝,足首の順に, -BO度, 90度, 50度とした.この角度は,リンクi-1に対するリンクiの
相対的な回転角度として表したものである.このデータは被験者1名の垂直跳び運動を測定し
た結果である.モデルは毎回,この姿勢からの垂直跳びを試みることになる.
βerr, Verr, Venoughはそれぞれ50-, 0.1, 2.0m/Sとした.これらが別な値をとれば
モデルは全く別の運動を学習する可能性があるが,ここではその点に関する調査をおこなわな
かった.
(eifez,es)は(1, 1. 1).(2, 1, 1),(1,2, 1),(1. 1. 2)の4通り,
(e'; e2,e3.も同じく(1, 1,1),(2,1,1),(1,2, 1),(1, 1, 2)の4
通り,計4×4の16通りの場合について調査した.
§2.結果
ここでの運動学習とは,垂直跳びを可能とするフィードバックゲインを見っけだすことには
かならない.不適当なフィードバックゲインのもとでは,リンクセグメントモデルが各関節で
発揮する関節トルクの大きさが垂直跳びに不適当なものとなり,このモデルは決して垂直跳び
ができない.
最終的に得られたフィードバックゲイインを表1に示した.これがモデルがeiとe'iとによっ
て表されるモデル自分自身の意識や評価関数にしたがって,垂直跳びを学習した結果である.
eiとe'iの16通りの組み合わせから11通りのフィードバックゲイン,すなわち,垂直跳びパ
フォーマンスが得られた.
与えられたすべてのeiとe'iに対して,モデルは,はぼ垂直跳びと認められる運動を獲得し
ている.シミュレーションによって得られた垂直跳びの踏切時間は0.179±0.016s,跳躍時の
重心の水平方向速度は0. 179±0. 12m/S,跳躍時の重心の垂直方向速度は2. 18±0. 21 m/Sで
あった.モデルの重心の踏切後の上昇高はモデルは離地後,放物運動をするものとして計算す
れば23.8cmとなる.シミュレーションで目標とした垂直速度2.0m/sはすべての試技で達成
されている.跨切時の姿勢についても, 16例中12例が目標とした範囲内におさまっていた.
垂直跳びを学習するリンクセグメントモデルのコンピュータシミュレーション139
跳躍方向についても16例中12例が目標とした範囲内におさまっていた.しかし,必ずしも跳
躍姿勢がよかった試技では跳躍方向も正しいというわけではない.
どのような道筋を辿ってモデルの学習が進んだかは, eiとe'iの値によってさまざまであった.
ここでは,典型的な学習のパターンとして2例のみを図3と図4に表す.図のように,モデル
は跳躍姿勢の矯正と,跳躍方向の修正とを繰り返しながら,垂直跳びパフォーマンスを向上さ
せていった.
モデルが学習によって獲得した垂直跳び運動をスティックピクチャとして図5-図15に示
した.図は踏切動作中の0.03秒ごとのモデルの姿勢を表している.図には同時に,モデルが
地面を離れる瞬間のモデルの重心の水平速度と垂直速度とを表示している.矢印の起点はモデ
ルの垂心を表してはいない.
モデルは図5-図15に示した踏切動作をするとき,モデルの3つの関節にはたらく関節ト
ルクのようすを図16-図26に示した.
§3.考察
シミュレーションは,従来の垂直跳び研究の報告と非常に一致する結果となった.
§3. 1現実の垂直跳び運動との比較
モデルの跨切時間は阿江9)の測定した``膝屈曲の浅い(約100度)跳躍"の踏切時間0. 169s
と非常に近い値となった.シミュレーションでは膝屈曲は90度であったから,シミュレーショ
ンの結果と実際の運動の測定結果とは非常に近い値となっている.跳躍時の水平方向速度は先
行文献中に見当たらず,比較の対象とならなかった.
関節トルクの大きさについては,先行研究によって,個人差が大きいものの,はば, 100500Nmの範囲内にあることが報告されている1)2)3)シミュレーションでも関節トルクの大
きさは一例を除いて100-500Nmの範囲内にあり,シミュレーションが現実の垂直跳びの良
い近似となっていることを裏付けている.
§3. 2垂直跳びは同じように見える
図5-図15を参照されたい.読者はそこに示されている11例のスティックピクチャを人間
の垂直跳びに似ていると認められるであろうか?さらに,読者は11例のスティックピクチャを
お互いに似ていると認められるであろうか?
読者に判断をゆだねるのにはわけがある.ある物とある物とが似ているか似ていないかを客
観的に決めるためには,なんらかの相関を計算すればよい,たとえば,二つのスティックピク
チャの相似度を示すために各関節角度の相関関数を計算してもいいだろう.しかし,ここでそ
のような機械的な尺度を導入しても,その尺度が,生きている人間が,複数の人の垂直跳びを
"似ている''と判断するときに用いている尺度でなかったら全く意味がないのである.本稿で
問題としているのは,人間という観察者が"似ている"と判断する二人の垂直跳びが,いいか
えれば, "垂直跳び"カテゴリーに入ると人間によって判断される二つの運動が,実際には関
節トルクバターンに大きな違いのある別の運動様式であるのはなぜか,という問題だからであ
る.人間が, "似ている"と判断するために持っている尺度でシミュレーションの結果を判断
しなければ研究の意味がなくなってしまう.人間の判断の基準とは何かを明らかにするのは非
常に大きな,困難な問題であり,現在でもほとんど明らかにされてはいないといっていいだろ
う.
木村広
140
それゆえ,ここでは読者の主観的な判断にゆだねるのである;スティックピクチャは人間の
垂直跳びに似ているであろうか?スティクビクチャはお互いに似ているであろうか?もし
読者が図5-図15を, "同じよな垂直跳びの絵を退屈に何枚も-"と思われるようであったら,
このシミュレーションは成功である.このとき, "モデルは異なる評価関数のもとでも,同じ
ような垂直跳び運動を学習した"ということができることになる.筆者には,スティックピク
チャは充分垂直跳びをしているように見え,かっ,スティックピクチャどうLはお互いに非常
●
●
●
●
●
に良く似ているように見える.
§3. 3垂直跳びは違っている
図16-図26を参照されたい.図16-図26は,モデルが踏切動作をしている最中の各関節
にはたらくトルクを表したものであった.
すべての場合で,モデルの各関節にはたらくトルクは,モデルが踏切動作を開始した直後に
不連続な増加をしていて,明らかに現実的な現象とはいえない.実際の動作中の関節トルクは,
身体が静止した状態のレベルから連続的に変化している1)3)シミュレーションが,やや,戟
実離れをしてしまった原因は,トルクを発生するフィードバックループ中に時間遅れ要素を入
れなかったためである.現実の人間の過度応答特性や筋の出力特性は.刺激と反応との間にタ
イムラグのない,理想的なものとはいい難い.フィードバックループに時間遅れ要素を入れた
シミュレーションによって,モデルの関節トルクの発揮パターンは現実の垂直跳びの関節トル
クパターンにどれほど近いものになるか,筆者は大きな興味を持っている. 4番目の関節に考
慮してシミュレーションをやり直すことと同様,フィードバックループに時間遅れ要素を入れ
てシミュレーションをやり直すことを,筆者の次の研究課題として,ここではかかわらないこ
とにする.
ここではもっと重要な,関節トルクの立ち上がり以降の変化パターンについて注目する必要
がある.垂直跳び運動中のトルクパターン-モデルが違う評価関数のもとで学習を進めて
獲得した-には客観的な違いを認めることができる.トルクの大きさが大きい方から足関
節,膝関節,腰関節トルクの順であるもの,あるいは,膝関節,足関節,腰関節のトルクの順
であるもの,動作の途中で足関節トルクの大きさと膝関節トルクの大きさとの順番が入れ替わ
るもの, 3つのトルクの大きさがほとんど同じものなどである.トルクには大きな差があって
も,すべてのモデルは垂直跳びをしている.この結果によって, ``モデルは異なる評価関数の
もとで,違った垂直跳び運動を学習した"と言うことができる.
●
●
●
§3. 4垂直跳びは同じように見えて,そして違っている
ァ3.2とァ3.3で,やや矛盾するような記述をした.二人の人間がおこなう運動を,そ
れらは同じ垂直跳びであると判断するのは観察者の主観であり,それらの運動様式が違うこと
を見っけるためには関節トルクの測定という機械的な操作が必要とされることを理解すること
によって矛盾は解決される.もっとも,運動の形は同じようでも,その運動を作り出している
カ-ここでは関節トルク-は,形を2回微分して得られるものであり,微分という操作
が小さな変化を拡大する性質のあることを考えれば,全く不思議な現象ではない.従来の垂直
跳び研究は, ``同じ垂直跳びであっても,人によってトルクパターンが違っていること"を問
題としているが,筆者の考えでは, ``客観的には全く違った運動を,人間がたまたま主観的に
判断して,ひとつの垂直跳びカテゴリーに入れて分類しているに過ぎないのだ"となる.
それでは,なぜ,同じ垂直跳びという課題が与えられたとき,その課題を遂行する二人の人
垂直跳びを学習するリンクセグメントモデルのコンピュータシミュレーション141
問の客観的な運動様式-関節トルクを発揮するパターン-が違ったのか?人間の身体
構造の冗長性と運動学習の個別性のためである,というのが筆者の考えである.人間の身体構
造は冗長性にあふれているし,同じ学習の方法や経緯を人間はとらないだろう.簡単な運動が
学習の目標として人間に与えられた場合,その構造的な冗長性のために,運動を実現する理論
的に可能な身体内部の状態が人間には多数ある.また,個別性のために,そのたくさんの可能
な身体内部の状態からどの状態を選ぶかが,人によって違ってくる.違う人間は状態を選ぶ,
内部的には違った状態が学習されたのだが,それら違った状態は,もともと,ひとっの簡単な
運動を実行するための解であったから,小さな違いを気にしなければ, (この``気にしない"
というのは主観のレベルである)それらは同じ運動と見える.
ここでおこなったシミュレーション-冗長性を持っモデルが,いろいろな学習者をみた
てた環境のもとで垂直跳びを学習する-では,主観的に言って"同じ",客観的には"違う''
垂直跳びをモデルは獲得し,その考えを十分に裏付けした.
ここでおこなったシミュレーションは完全なものとはいえないが,このシミュレーションに
よって新しいバイオメカニクスの可能性を示すことができたと,筆者は信じている.
【参考文献】
1)佐川和則,佐谷遺昭,松本晃雄,跳躍における下肢関節の瞬間的なトルク一角速度関係,
第8回日本バイオメカニクス学会大会論集, pp93-97, 1986.
2 ) Hubley, C. L. and R. P. Wells, A work-energy approach to determine individual joint
centributions to vetical jump performance. Eur. J. Appl. Physiol. 50 : 247-254 1983.
3)桜井伸二,池上康男,矢部京之助,垂直跳びの踏みきり動作における下肢関節の役乱第
8回日本バイオメカニクス学会大会論集, pp98-101, 1986.
4 ) Komor A., J. Morawaski and L. Pruski, Control analysis of the take-off phase of
the vertical jump, Biomechanics VII-B, pp257-263, 1981.
5 ) Brady, M., John, M. H., Timothy, L., J., Tomas, L., P. andMatthew, T., M. (eds),
Robot Motion, MIT Press, 1982.
6 ) Dempster, W. T., Space requirements of the seated operator, Wright-Patterson Air
Force Base, 1955.
7 ) Plagenhoef, S., Patters of Human Motion, Prentice Hall, 1971.
8 ) Wolfram, S., Mathematica, Addison Wesley, 1988.
9)阿江道良渋川侃こその場から高くとぶ跳躍J.J.SPORTS. SCI., vol.2, No.8, pp
590-599, 1983.
木村広
142
Table 1. What gainij was got when the model learnd vertical jump under ei and e'i?
e -1
e1
(1 ′1 ′1 )
(2 ′1 ′1 )
(1 ′2 ′1 )
(1 ′1 ′2 )
(1 ′1 ′1 〉
3 0 0 15 0
300
0
25 0
0
2 5 0 15 0
3 00
0
2 5 0 10 0
3 00 150
3 00
0
250
0
400
0
300
0
2 5 0 15 0
(2 ′1 ′1)
(1 ′2 ′1 〉
5 00
0
400
25 0
0
600
2 50
0
25 0
400 150 250
3 00
0
300
300 150 250
5 00
0
400
250
0
500
250
0
250
5 00
0
450
250
0
300
250
0
250
each cell representsl
(1 ′1 ′2 )
0
350
0
350
50 300
150 350
0
250
100 400
0
350
0
350
100 300
0
45 0
0
300
100 3 00
1 00
0
50
100
0
0
100
0
50
.0
0
15 0
ga ini,i g aim ,2
gain2,i g ain2,2
gain 3,i ga m 3,2
8i: angle of joint i
一ヽ′
刀: inertia of link i
mi: mass o川nk i
li: length of linki
Igi: distance from joint i to
link i's center of gravity
Figure 1. Description of variables.
垂直跳びを学習するリンクセグメントモデルのコンピュータシミュレーション
verticalJump【 {feedBack_, performance_) ] :'
Block【 {temp}.
Zf 【goodEnough 【performance】 ,
Return [ { feedBack, performance} ]
】l
temp = chv【cae【{feedBack,performance}日,I
Zf 【improved【t匂nP】 ,
Return 【verticalJump 【temp日′
Return 【vertxcalJump 【powerUp 【tempI日
HH
】
cae 【 {feedBack_,performance_日:=
Block[{fbl,
pl′
fb2,
p2′
fb3,
p3,
bestP},
=f 【 goodEnough.A 【performance】 ,
Return [ { feedBack, performance} I
HhH
fbl = modifyA【feedヱack, ankle′0】 ∫
fb2
=
modifyA【feedBack′
knee,
0];
fb3 = modifyA[feedBack, hip, 0];
pi = try[fbl];
p2 = try[fb2];
p3 = try[fb3];
bestP
=
bestA【{feedBack′performance}.
tml, pII′ tm2′ p21. tm3, p3日l
If
[equalP
【bestP′
performance】
,
Return [ { feedBack. performance} I ,
Return 【cae 【bestPH
I
】
chv【{feedBack ,performance }]
Block【{fbl,
pl,
fb2′
p2,
fb3,
p3,
bestP}′
Zf 【goodEnoughHV 【performance】.
Return [ { feedBack, performance} I
H
fbl = modifyV[feedBack, ankle] ;
fb2 = modifyV【feedBack, knee一 ,・
fb3 = modifyV【feedBack, hip】 ,・
pi = try【fbl】l
p2 = try[fb2];
p3 = try[fb3];
bestP
=
bestv【{feedBack,performance}
{fbl′
Zf【equalP【bestP′
Return
【
{
PII.{fb2,
performceI
′
p21′{fb3′
p3IIl
′
feedBack,performance}
I
′
Return 【chv【bestP】 】
I
】
Figure 2. The algorithm of learning vertical jump in this simulation.
143
ICE!
木村広
A result we got.
Figure 3. A process of vertical jump learning of the model
whosee;-(1, 1, 1)ande¥-(1, 1, 1)
垂直跳びを学習するリンクセグメントモデルのコンピュータシミュレーション
Figure 4. A process of vertical jump learning of the model
whoseei-(1, 1, 2)ande'i-(1, 2, 1)
145
木.村広
146
Figure5-Figure15.
Model 's Movement
土n every 0.03 sec.
Figureo.
gaani,j =
000
005
462
ニ
gaim,j
JHH-HJ
000
5
i
Figure7
Figure6.
gaini,j =
Figureb.
gami,j =
garni,う-
垂直跳びを学習するリンクセグメントモデルのコンピュータシミュレーション147
FlgurelO
garni, ラ
Figurell.
garni, j
gaini.〕
garni, j
木村
148
広
Figurel6-Figure26.
Joint torques computed during
vertical ∃ump take off phase.
Figurelb. gami,j =
o
一
0
o
o
i
0
o
n
(EN)anbjoア
V
I
o
0
O
a - a - B ト.…
c
o
(EN)anbjoi
0
h
0
n
o
I
0
0
0.0
.
0.I
0.1
Time(s)
Time(s)
Figurel8. gairu,j -
Figurel7. gaini,j -
00
00
2
(∈N)anbjoi
0.0
Figurel9. gaini,j
Figure20. gaini,j -
0.2
垂直跳びを学習するリンクセグメントモデルのコンピュータシミュレーション149
000
000
32
(tuN)enbjoト
P書
‡
‡奮
馨
な
巴 -chb
.
0.I
Time(s)
Figure22. gaini,j =
Figure21. gain土,〕 -
(EN)anbjoト
(tuN)anbJOi
0
0
→
ト
.
.ト
1
■
一
■
A
0
000
32
o
o
o
o
o
i n T t o c n -
0
0
B
II B
II H -W H 8-B 叫
1
\
0
0
0
.
-
0.1
0.2
gainア,j
0.2
Time(s)
Time(s)
Figure23.
0.I
=
際1.:)
Figure24. gaini.j -
0.I
(;:: 15:)
0.2
Ti me(s)
Figure25. gaini,j
/4500
Figure26. galni,j = 3000
¥300150J
鍾
付
垂直跳びを学習するリンクセグメントモデルのコンピュータシミュレーション
°
°
包Solving three jointed manipulator's Lagrangian
preparation
DThe followings have to be treated as constant in the differentions.
SetAttributes 【lowerLegMass. Constant]
SetAttributes 【thighMass. Constant]
SetAttnbutes
【trunkMass′
Constant】
SetAttributes 【lowerLegLen. Constant]
SetAttribites 【 lowerLegCenter, Constant]
SetAttributes
【thighLen′
Constant】
SetAttributes 【thighCenter, Constant ]
SetAttrxbutes
【trunkLen′
Constant]
SetAttributes 【trunkCenter, Constant】
SetAttrxbutes [lowerLeglnertia, Constant]
SetAttributes 【thighlnertia, Constant]
SetAttributes 【trunklnertxa, Constant]
Dt 【hipAiigle.
>
Dt 【kneeAngle,
rl
H
n
t
t
t
t
t
L
myRule = { Dt【ankleAngle.
ttI
ロLocal rules for representing time derivatives.
乱nkleAngVel ′
->
kneeAngVel′
-> hipAngVel,
Dt 【ankleAngVel, t] -> ankleAng,Acc,
Dt【kneeAngVel,t] -> kneeAngAcc.
Dt 【hipAngVel, t] -> hipAngAcc
};
for the lst link (lower leg segment)
kl
=
(lowerLegMass
★
(lowerLegCenter
Dt[ankleAngle′
lowerLeglnertia
t]
Dt【ankleAngle′t]
)-2
+
A2)!2
centerl := {lowerLegCenter Cos 【ankleAngle] ,
lowerLegCenter Sin 【誠kleAngle】
Il
pi
=
lowerLegMass
lowerLegCenter
gravity
Sin 【ankleAngle] ;
for the 2nd link (thigh segment)
the uectorto the centerofgrauity is:
★
/.
myRule;
153
木村広
154
center2 := {lowerLegLen Cos【ankleAngle】 +
thighCenter Cos 【ankleAngle+kneeAngle] ,
lowerLegLen Sin【ankleAngle】 +
thighCenter Sin 【 ankleAngle+kneeAngle I
堰
dcenter2 = Dt[center2,t] /. myRule
v2 = dcenter2.dcenter2
k2 = (thighMass v2 +
thighlnertia (ankl血gVel + kneeAngVel)A2 )/2;
I
p2 = thighぬss gravity (lowerLegLen Sin【ankleAngle】 +
thighCenter Sin 【ankleAngle+kneeAngle】 ) ∫
for the 3rd link (trunk, head and hand segmant)
centers :=
{lowerLegLen Cos 【ankleAngle] +
thxghLen Cos 【ankleAngle+kneeAngle】 +
trunkCenter Cos 【ankleAngle+kneeAngle+hxpAngle】 ,
loworLogLen Sxn【ankleAngle】 +
thxghLen Sin 【ankleAngle+kneeAxigleI +
trunkCenter Sxn 【ankleAxigle+kneeAngle+hipAngle I
Il
dcenter3=Dt[center3,t] /. myRule;
v3 = dcenter3.dcenter3
Ic3 = (trunkMass v3 +
trunklnertxa *
(ankleAngVel+kneeAngVel+hipAngVel ) A2 ) !2 ∫
p3 = trunkMass gravity ★
(lowerLegLen Sin【ankl色Angle] +
thighLen Sxn 【ankleAngle+kneeAjngleI +
trunkCenter Sxn 【ankleAngle+kneeAngle+hipAngle】 )
垂直跳びを学習するリンクセグメントモデルのコンピュータシミュレーション
°
事calculating lagrangian
(*
physical
parameters
★)
Pi 3.14
rad = 180/pi
height = 1.7(*m★)
weight = 60 (*kg*)
gravity = 9.8
lowerLegLen = 24.9 height/100
thighLen = 24.8 height/100
trunkLen = height - (lowerLegLen + thighLen)
lowerLogCenter = 0. 567 lowerLegLen
thighConter = 0.567 thighLen
trunkCenter = 0.4 trunkLen
lowerLegMass = 2 (4.7+1.7)weight/100
thighMass = 2 10.7 weight/100
trunkMass = weight- (lowerLegMass+thighMASS)
lowerLeglnertxa = 0.045*2
thighlnertia
=
0.110★2
trunklnertia = 1.90
lagrangian = kl + k2 + k3 - pi - p2 - p3/. myRule;
tOl = Dt【D【lagrangxan. ankleAngVelI ,t)D【lagrangian, ankleAngle】 !. myRulo;
tl = Simplify【tOl】l
tO2
=
Dt【D【lagrangian′kneeAngVel】.t)
-
D【lagrangian, kneeAngle】 !. myRule;
t2 = Simplify【tO2I,.
tO3 = Dt[D【lagrangian,hipAngVel] ,t]D【lagrangian,hipAngle】 !. myRule;
t3 = Simplify【tO3];
centerOfGravity := (1°werLegMass centerl +
thigh]ぬss center2 +
trun肋ss center3) /
( lowerLegMass +thighぬss+t run肋ass )
centorOfGravityVol ={0, 0}
equationAnswer =
Chop【Solve【{ankleでorq巳tl′
kneeでorq == t2′
hipでorq吉t3>,
{ankleAngAcc, kneeAngAcc, hipAngAcc} ] Hl日) ,・
155
木村広
156
田Simulation
human characters & desired values
degree = pi/180
ankleAngleDesired = pi/2
kneeAngleDesirod - pi/2
hipAngleDesired = pi/2
desiredAngle
=
{pi/2′
pi/2,
pi/2}
hVDesired = hPosDesired
vVDesxred = 3
dt=0.01
timeOut = 0.3
tab =一一\t一一
initAngles
=
{50degree′
90degree,
-80degree)
angle = 1
hV=2
hPos=vV=3
boundaryConditions
, enoughAxigle, enoughEV. enoughW}
{ evalWeight
evalWeight
evalWeight2
notSoMuch
notSoMuch∬V
soMuchW =
≡ t1,1.ll
= t1,1,1I
50 degree
=0.10
2.0
improveSteps =
{torqUp, torqDown, clearHV, powerUpRatio}
torqUp = 50
torqDown = 30
powerUpRatxo = 2
angles
=
{ankleAngle,
kneeAngle′
hipAngle}
angVels = {ankleAngVel, kneeAngVel, hipAngVel }
angAccs = { ankleAngAcc, kneeAngAcc, hipAngAccl
torqs = {ankleでorq′ kneeでorq, hipでorq}
垂直跳びを学習するリンクセグメントモデルのコンピュータシミュレーション
(* offset in the -performace- list *)
°
SMw1
′
°
′
hip
°
′
°
IIII
IIIIvin
ankle = 1;
knee
′
(* offset in pos and vel entry in performnee list *)
horizontal = 1;
vertical = 2;
initializing functions
initialize[] :=
Block[{},
{ankleAngle′
kneeAngle.
hipAngle}
=
inxtAngles;
ankleAngVel = kneeAngVel = hxpAngVel = 0;
{ankleでorq, kneeでorq′ hipでorq} =
Itl′t2,t3}
/.
{
ankleAngAcc
->
0′
kneeAngAcc -> 0.
hipAngAcc -> 0 };
{accl,acc2,acc3} =
{ankleAn9Acc, kneeAngAcc, hipAngAcc} !. equationAnswer;
time = 0.00;
overshoot: = {False, False. False, False, False);
I
157
木村広
158
feedback function
feedBackTorqs
【ⅡL′P」
:=
BlockHI′
Return[
I
m【 【ankle′angle日★
(ankleAngleDesired-p【 【ankleI I )I
m【 【ankle,hV日★
(hVDesired
-
p【【vel′horizontal]])
,
m[ [knee,angle] ]*
(kneeAngleDesired- (p【 【ankle日+pHknee日日+
m【 【knee′hV日★
(hVDesired - p日vel,horizontal] I ) ′
m[ [hip,angle] ]*
(kneeAngleDesired- (p 【 【ankle] ] +p 【 【knee日+p Hhip
m日hip′hV日★
(hVDesxred - p【 【vel,horxzontal日)
I
I
I
euler[val_, dotVal_,dt_] :=
Block[{},
Return【val + dotVal dt】
I
雷vertical Jump simulation
listQ【1 ] :=
工f【Head【l]==Head【{ }] ,
Return 【℡rue】 ′
Return【False】
′
Return 【FalseI
I
Dinnermost loop ( try【m】 )
try【matrix_] :=
Block【{ notyetJump.
oldPerformance
′
oldCenterOfGravity,
oldCenterOfGravityVel ,
コIimped ′
localPerformance
graphics ,
′
垂直跳びを学習するリンクセグメントモデルのコンピュータシミュレーション
aLine, mode3
I,
graphics = aLine = {);
mode3 = 0;
notYetJu皿P =でrue;
initialize[] ;
oldPerformance =. ;
oldCenterOfGravity = centerOfGravxty;
oldCentorOfGravityVel = centerOfGravityVel = {0, 0} ;
print 【matrix】 ;
while 【でrue, (★notYetJump,★)
oldCenterOfGravity = centerOfGravxty;
oldCenterOfGravityVol = conterOfGravityVel ;
localPerformCe ≡
{
ankleAjiglo′
kneeAngle.
hipAjngle′
centerOfGravity, centerOfGravityVel,
time
Il
oldPerformance = localPerformance;
If [printAll,
Print [time, tab,
centerOfGravxty日1日′ tab,
centerOfGravity日2] ] , tab,
centerOfGravityVel 【 【1日. tab′
centerOfGravityVol [ [2] ] , tab,
ankleTorq, tab,
kneeでorq, tab,
hipでorq, tab′
ankleAugle rad, tab,
(ankleAngle + kneeAngle) rad,tab,
(ankleAngle + kneeAngle + hxpAngle) rad
(*, tab, Chop【ankleAxigVel】 , tab,
Chop 【kneeAngVelj , tab,
Chop 【 hipAngVel I
★)
I
];
工f【makeGraph 捕 Mod【mode3,3] - 0.
aLme
=
Line[{{0,01′
{ lowerLegLen Cos 【ankle.Angle] ,
lowerLegLen Sxn【ankleAngle] } ,
{lowerLegLen Cos 【ankleAngle] +
thxghLen *
Cos
【ankleAngle
+
JcneeAngle】
′
lowerLegLen Sin【乱nkleAngle】 +
thighLen *
Sin【ankleAngle + kneeAngleI I ,
{lowerLegLen Cos 【ankleAngle] +
thighLen *
159
木村広
160
Cos 【ankleAngle + kneeAxigle】 +
trunkLen
★
Cos 【ankleAngle + kneeAxigle +
hxpAngle] ,
lowerLegLen Sin[ankleAngle] +
thighLen *
Sin【ankleAngle + kneeAngleI +
trunkLen *
Sin【ankleAngle + kneeAngle +
hipAugle1 I
日l
graphics Append 【 graphics , aLxneI
I;
工f 【notYetJump,
Zf 【ankl色Angle > ankleAngleDesxred,
overshoot 【 【ankle] ]でrue
】l
Zf【ankleAngle + kneeAngle <
kneeAngleDesired,
overshoot[ [knee]] = True
】l
If[singleAxigle + kneeAngle + hipAngle >
hxpAngleDesxred,
overshoot[ 【hip] I =でrue
II
If[centerOfGravityVel[ [l] ] < 0,
overshoot:Hvel] ] =でrue
I;
I;
{ ankleAngle , kneeAngle , hipAngle }
euler 【 { ankleAngle, kneeAngle. hipAxigle} ,
I
ankleAngVel,
kneeAngVel
,
hipAjigVel
)
′
5G
】l
{
ankleAngVel′
kneeAngVel,
hipAngVel
}
=
euler 【 { ankleAngVel, kneeAngVel , hipAngVel } ,
{accl,accz,acc3},
513
iuL
{ankleTorq, kneeTorq, hipTorq} =
feedBackTorqs 【matrix, localPerformanceI ,I
{accl, acc2, acc3) =
angAcc3 !. equationAnswer;
centerOfGravityVel =
( centerOfGravity-oldConterOfGravity) !dt ;
ェf 【notYetJump純
垂直跳びを学習するリンクセグメントモデルのコンピュータシミュレーション
oldCenterOfGravityVel日2] ] >
centerOfGravityVol [ [2] ] 」&
centerOfGravityVel[ [2] ] > 0,
つumped = oldPerfonnance;
notYetJump = False;
BreakH ∫
Il
Zf【time > ti皿eOut, Break日) ,.
Zf 【AbS 【ankleでorq】 >2000
AbS【kneeでorq】>2000 │ │
Abs [hipTorq] >2000 ,
Break日】 ,.
time += dt;
mode3 ++∫
】;(★ end while ★)
If [makeGraph,
Show [Graphics 【graphxcs】.
AspectRatio -> Automatic,
Axes -> Automatic,
℡icks -> {{.3}, {.5,1,1.5})]
】;
エf 【notYetJump,
Print【T'not jlamped-'] ; Return【False】 ,
Return 【 jumped】
I;
I
口clearing angle errors
angleError[p_] :=
If[listQ[p] ,
Return [ (
evalWeight
HankleH
errorA【p′
ankle】
evalWeight HkneeH errorA【p, knee] +
evalWeight
【
【hipH
errorA【p′
hip]
) * 3 / (evalWeight[[ankle]] +
evalWexght [ [knee日+
evalWeight [ [hip日
)
】′
Return[1000] ,
Return [1000]
I
+
161
木村広
162
goodEnoughA 【pJ : :
Return 【Zf【listQ【pI.
angleError【p】
<
notSoMuch′
False,
print【T'not
yet
get
performance一一】
;
False
I
I
errorA【p_, whxchOne_] :=
Block[{e, i},
e=0;
i=1;
Zf【Not【listQ【p日, (★ returned value xs False ★)
Return[1000]
】J
While 【 iく=WhichOne ,
e +=p【【1日l
i++;
】l
Return 【AbS 【desiredhngle【 【whxchOne] ] -eH ∫
I
biggestErrorA【performance_] :=
Block【{ea,ek,eh,sorted),
ea = orrorA【performance. ankle】 ,.
ek
=
errorA【performance′
knee一
,I
eh = errorA【performance, hip】 ,'
If [debug,
Print[-'IerrorI
=T■′lea,
ek,
eh}
rad,
.'Sum=", (ea+ek+eh)rad】 ,.
Print [ "overShoot=" , overshoot] ;
rhJ
If[ea=ek && ek==eh&& eh= 1000,
Return [0]
】l
If[ea > ek,
If[ea > eh,
Return [ankle] ,
Return [hip]
】′
エf【ek > eh.
Return
【knee】
Return [hxp]
I
I
I
′
垂直跳びを学習するリンクセグメントモデルのコンピュータシミュレーション
bestA【mp_,
mpl_′
mp2J
mp3_,
whichOne_]
Block【te. el, e2, e3, sortedList},
{angleError【np【【2日]r mp);
el = {乱ngloError【npl【【2日】′ mpl};
e2 = {angleError【mp2日2日】. mp2};
03 = {angleError【np3日2日】. mp3);
sortedLxst
Zf【debug2′
ort[{e,el′e2.e3}]
Print【一一sorted
List
;
=
",sortedList]]
Zf【sortedLxst【【1.1日== iooo. (★ not jumped *)
Return 【False】
】l
Return【30rtedListHl. 2日】 ;
】
modifyrm【matrix , whichOne_, upOrLow_]
Block[{temp, part),
temp = matrix;
part = whichOne + upOrLow;
Zf【 whichOne < ankle │ │ wchichOne < part,
Print 【 ''modifyFHA Rrrored'-I ;Break H
トun
If [overshoot [ [whichOne] ] ,
tempt 【whichOne + upOrLow, angleII -=
evalWeight2日whichOneI ] torqDown′
tempHwhxchOne + upOrLow, angleI 】 +=
ovalWeight2日whxchOneH torqfUp.
Print 【''something wrong in angle拭odify[] -I)
H
Return [temp] ;
I
;
163
木村広
164
cae【tn_′
p_}]
:=
Block【{whichOne′
(*
ClearAngleErrors
ml.
pl,
m2,
p2,
m3,
★)
p3,
bestMP)′
If[debug, Print["cae called"]];
Zf【Not【listQ【m日│ │ Not【listQ【p]],
Print【-'not yet get mp. nothing returns''.皿,P】 ,I
Return【(m, False}】 ;
I;
++i;
If[debug, Print["error = ",angleError[p] ] ] ;
Zf【goodEnoughA【p】 II i > iter,
Print【''cae passed-'] ;
Return[{m,p}]
】l
If[debug, Print[lfi=",i]];
(* whxchOne - biggestErrorÅ【pi ; *)
ml
m2
m3
=
=
=
modxfyFBA【m′
ankle,0】
modifyFBA【m′
modifyFBA【m′
knee,
hip,
,I
0】l
0】,・
pi = try【ml】l
p2 = try[m2];
p3 = try【m3】l
bestMP = bestAHm,pI,
fml,
tm2′
tm3,
pII′
p2I′
p31′
whxchOne] ;
If[bestMP == False, (★ not jumped *)
Return【cae【powerUp【 {m,p}日】
】l
Zf【bestMP【【1]] == m.
Print["not good angle error cancelinzed"] ;
Return 【bestMP] ;
H
ェf【debug, Print["Recursion in cae, select =一㌧
bestMP【 【1日目,・
Return 【cae 【bestMP] ] ;
】
蝪clearing horizontal velocity errors
hVError【P_J :=
Zf【listQ【p】 && Abs【p日vel,vertical]]]・= 0′
Return【AbS 【p【 【vel.horizontal日!p【 【vel.vertical] ] ] ] ,
Return[1000] ,
Return 【1000】
I
垂直跳びを学習するリンクセグメントモデルのコンピュータシミュレーション
goodEnoughEⅤ 【P_] : =
Return【rf【listQ【p】 ,
hVError [p】くnotSoMuchHV,
False,
Print【一一not
yet
get
performance
xn
hv一一】
∫
False
I
I
bestV[mp_, mpl_, mp2_, mp3_] :=
Block[{O, el, e2, e3, sortedList},
e = {hVError[mp日2日]fォap};
el = {hVError[mpl【【2日),叫pi);
e2 = {hVError【np2日2日】.聾p2>;
ゥ3 = {hVError【mp3日2日I. mp3);
sorte&List = Sort[{e.el,e2,e3日,・
工f【debug2, Print["sortedListHl.2】 ]=",
sortedもist] ] ;
Zf【sortedLxst【【1′1日== 1000′ (★ not jumped *)
Return [False]
】l
Return【sorted五iSt日1′ 2日】 ;
I
modifyFBV【matrix , whichOne ]
Block【 {temp} ,
temp = matrixl
=f【overshoot[ [vel] I.
temp[[whichOne, hV]] -= torqDown,
tempHwhxchOne, hV]] += torqUp,
Print[''something wrong xn angleModifyH in hv-']
】′
Return 【temp】 ∫
I
165
木村広
166
chv【lmJ
p_}]
Block【tnl,
:=
pl′
(*
ciearHorizontalVelocity
m2,
p2,
m3,
p3,
★)
bestMP},
Zf【debug, Print["chv called'一日,.
Zf【Not【listQ【m日日Not【listQ【p日,
Print[-'not
yet
get
mp.
nothing
returns(hv)
''′
m,p】l
ReturnHm′
FalseI)
,I
H
++i;
Zf 【debug, Print [一一errorhv一㌧ hVError【p日】 ,I
Zf【goodEnoughHV【pI I I i > iter,
Zf【debug, Print【''chv xs over"]] ;
If【debug, Print【''error xs ", hVError【p日】l
Return[{m,p} ]
Il
If[debug, Print["i=",i]];
ml - modxfyFBV【m, ankle】 ,I
m2 = modifyFBV[m, knee];
m3
=
modifyFBV【m′
hip】
,.
pi = try【ml】l
p2 = try[m2];
p3 = try[m3];
bestMP
=
bestvHm′pI,
tml. PII,
tn2′
p21,
{m3, p3}];
If[bestMP
==
False′
(★
not
jumped
*)
Return[chv[powerUp[{m,p) ] ] ]
];
Zf【bestMP日1日== m.
Print
[一一not
good
horxzotal
velocity cancelxnzed"] ;
Return 【bestMP】 ∫
Luu
=f【debug,
Print【一一Recursion
in
chv,
select
=一一,
bestMP【 【1日目,・
Return 【chv [bestMP日,・
】
ロgetting higher performance
powerUp 【np_I : 冒
Block[{m},
Zf【debug, Prxnt["powerUp called''H ∫
m=mp日111;
m日1′ 1日+= evalWeight2日1日torqUp;
m日2,1日+= evalWeightz【【2日torqUp;
m【【3,1日+= evalWeight2日3]]torqUp;
Return[ {m, try【m日】 ,・
I
垂直跳びを学習するリンクセグメントモデルのコンピュータシミュレーション
goodEnough[p_] ::
Return【 goodEnough.Å【p】鎚
goodEnoughV【pI 66
p【 【vel,vertical日> 30MuchW】
verticalJump【(午__′ P_日:=
Block【 tte叫Pl.
Zf
【goodEnough【p】
Print【l一good
′
Enough!一一】
,.
Return Hn, pH
Il
If[i++ > iter,
Print【-'Pm sorry, can not find'】,.
Return[ {m,p} ]
】l
temp = chv【cae[{m,p)日,'
Zf【debug, Print【'-temp【 【2日temp【 【2日目,・
Zf【temp【【1日= m′ (★ no improvement *)
Print
【.Tno
improvement一一1
,・
Return 【verticalJump 【powerUp 【temp日】 ,
Return 【vertxcalJumP 【temp日′
Prxnt
["verticalJump:
unknown
I;
】
simulate【m ] :=
Block【tl,
i=0;
vertxcalJumP【{m, try【mI H ∫
Print【''finished′
I
i
=一一,i】,・
matrix,一一,m】
167
Fly UP