SCONEによる運動予測と二関節筋
By K.Yoshimi
SCONEは、人間や動物の運動を予測シミュレーションするためのオープンソース・ソフトウェアです。
SCONEを使うと、歩行速度やエネルギー効率といった高レベルの目標にしたがって、特定のタスクを最適に実行するための神経筋コントローラを定義し、最適化することができます。
SCONEは、筋骨格モデルをモデリングやシミュレーションするシステムで有名なオープンソースOpenSimの1プロジェクトとして開始されたようです。
この記事では、SCONEをインストールし、直立姿勢でバランスを取るチュートリアルを動かしてみます。
また、このチュートリアルの設定を変更して、二関節筋の重要性を確認します。
SCONEのインストール
SCONEは、下記のページからダウンロードします。
https://scone.software/doku.php?id=install
❗ SimTkのウェブサイトからダウンロードする際に、ユーザ登録が必要ですので、登録しましょう。
❗ Windows版が推奨されていまので、この記事では、Windows版を使用しました。
インストールは、インストーラーの指示にしたがいますと、問題なくできると思います。
直立バランスのチュートリアル
SCONEの基本的な使用法は、下記リンクにあるチュートリアルから学ぶことができます。
この記事では、「真っすぐ立ってバランスをとる」チュートリアル
- Standing Balance
を使用します。
SCONEの起動
まず、インストールしたSCONEを起動します。
Windowsでは、スタートから検索窓にSCONEと記入し、検索されたSCONEのアイコンをクリックすると起動します。
シナリオの読み込み
SCONEでは、シナリオファイル(*.scone)を使って、シミュレーションしたい運動を最適化問題として記述します。
チュートリアルには、直立してバランスをとるシナリオファイル
Tutorial 3a - Balance - OpenSim.scone
が用意されていますので、これを
- File > Open…
から開きます。
初期パラメターでのシミュレーション
キーボードで、「Ctrl + E」を押しますと、下図のように、あえなく後方に転倒する骸骨が描画されます。
この骸骨のシミュレーションは、初期パラメータで順解析した結果となります。
図中で、赤色から青色の筒状のものが見えますが、これらは筋肉を表現しています。 (赤色:筋肉の興奮度は高い、青色:筋肉の興奮度は低い)。
また、黄色い矢印は、足裏が床面から受ける力のベクトルを描画しています。

最適化するするパラメータは、Tutorials/data/ControllerReflexBalance.sconeにおいて定義されています。
# Some predefined variables we use later on
$L0 = ~0.5
$KL = ~1
$KP = 0~0.1
$KV = 0~0.1
$VDELAY = 0.1
$OFS = [ 0 0.5 0 ]
$DIR = [ 1 0 0 ]
ReflexController {
name = Balance
symmetric = 1
# Muscle length reflexes
MuscleReflex { target = iliopsoas L0 = $L0 KL = $KL delay = 0.010 }
MuscleReflex { target = glut_max L0 = $L0 KL = $KL delay = 0.010 }
MuscleReflex { target = rect_fem L0 = $L0 KL = $KL delay = 0.010 }
MuscleReflex { target = hamstrings L0 = $L0 KL = $KL delay = 0.010 }
MuscleReflex { target = vasti L0 = $L0 KL = $KL delay = 0.020 }
MuscleReflex { target = gastroc L0 = $L0 KL = $KL delay = 0.020 }
MuscleReflex { target = soleus L0 = $L0 KL = $KL delay = 0.035 }
MuscleReflex { target = tib_ant L0 = $L0 KL = $KL delay = 0.035 }
# Vestibular reflexes
BodyPointReflex { target = iliopsoas source = torso
KP = $KP KV = $KV delay = $VDELAY offset = $OFS direction = $DIR }
BodyPointReflex { target = rect_fem source = torso
KP = $KP KV = $KV delay = $VDELAY offset = $OFS direction = $DIR }
BodyPointReflex { target = vasti source = torso
KP = $KP KV = $KV delay = $VDELAY offset = $OFS direction = $DIR }
BodyPointReflex { target = tib_ant source = torso
KP = $KP KV = $KV delay = $VDELAY offset = $OFS direction = $DIR }
BodyPointReflex { target = glut_max source = torso
KP = $KP KV = $KV delay = $VDELAY offset = $OFS direction = $DIR }
BodyPointReflex { target = hamstrings source = torso
KP = $KP KV = $KV delay = $VDELAY offset = $OFS direction = $DIR }
BodyPointReflex { target = gastroc source = torso
KP = $KP KV = $KV delay = $VDELAY offset = $OFS direction = $DIR }
BodyPointReflex { target = soleus source = torso
KP = $KP KV = $KV delay = $VDELAY offset = $OFS direction = $DIR }
}
パラメータの最適化
それでは、この骸骨が直立してバランスを取れるように、パラメータを最適化します。
最適化計算の実行は、キーボード上で「Ctrl + F5」を叩きます。
❗ 最適化計算には時間がかかりますので、気長に待ちましょう。
しばらく待つと、計算が終わり、最適化の結果一覧がOptimization Results窓に表示されます。
この例では、Scoreが最も小さい値の結果が最適なケースとなります(下図の赤枠で囲ったケース)。
これをダブルクリックしますと、下図のように、直立したまま転倒しない骸骨が描画されます。
このことは、パラメータを最適化することによって、直立してバランスが取れるようになったことを示しています。

本ケースの目的関数は、Tutorials/data/MeasureBalance.sconeで定義されています。
この中で、CompositeMeasureに、転ばない、努力を最小限に抑える、膝を固定するよう最適化することが記述されています。
# Measure for standing balance
CompositeMeasure {
# Penalize falling
BalanceMeasure {
termination_height = 0.8
weight = 100
}
# Minimize effort
EffortMeasure {
name = Effort
weight = 0.01
measure_type = Wang2012
}
# Penalize locked knees
DofMeasure {
dof = knee_angle_r
position { min = -30 max = 0 abs_penalty = 10 }
}
}
二関節筋の有無による結果の違い
3対6筋の実効筋
ところでこのチュートリアルの人体モデル(筋骨格モデル)を見ますと、筋肉数が実際に比べてとても少いことに気づきます。
例えば、
https://imidas.jp/genre/detail/F-135-0045.html
にある図を参照すると、下肢には多くの筋肉が折り重なるように存在していることが分かります。

一方、このチュートリアルの人体モデルの太ももを見ると、 6つの筋肉(腸腰筋、大腿直筋、外側広筋、大殿筋、ハムストリング筋、大腿二頭筋短筋)しかありません。
しかし、筋肉をこれだけに絞って、なぜ安定して直立していられるのでしょうか?
実は、直立してバランスを取るような動作は、 2対の拮抗一関節筋と1対の拮抗二関節筋の3対6筋の協調活動によって、実現できるという理論があります。
詳しい説明は、3対6筋の機能別実効筋力(Functional Effective Muscle Strength: FEMS)のFEMS理論に譲ります (実効筋力評価システム FEMS)。
FEMS理論においては、2関節筋(2つの関節にまたがる関節筋)が重要な役割を演じます。
このチュートリアルでの二関節筋は、太ももの表側の大腿直筋(rect_fem)、裏側のハムストリング筋(hamstrings)が該当しています。
二関節筋の無効化
それでは、この二関節筋を無効化するとどうなるかをテストしてみましょう。
ここでは、表側の二関節筋である大腿直筋(rect_fem)を無効化してみましょう。
このチュートリアルの、シナリオファイルTutorials/Tutorial 3a - Balance.sconeを下記のように修正します。
CmaOptimizer {
signature_prefix = DATE_TIME
min_progress = 1e-3
SimulationObjective {
max_duration = 30
# Model used in simulation
ModelOpenSim3 {
model_file = data/H0918M_osim3.osim
# Override model properties
Properties {
rect_fem_l { max_isometric_force.factor = 0.0 }
rect_fem_r { max_isometric_force.factor = 0.0 }
}
state_init_file = data/InitStateStand.zml
initial_load = 1
fixed_control_step_size = 0.005
}
# Controller for reflex based balance (different file)
<< data/ControllerReflexBalance.scone >>
# Measure for standing balance (different file)
<< data/MeasureBalance.scone >>
}
}
それでは、このモデルについても、最適化計算を実行します(キーボードで「Ctrl + F5」を叩きます)。
しかし、今度は、最適化計算が収束する気配を見せません。
仕方がないので、計算を途中で止めて、描画してみましょう。
下図のように、非常に不安定になり、直立することができなくなっています。 このように、二関節筋の有無による違いをまざまざと見ることができました。

❗ 従来のヒト型ロボットの動きがぎこちないのは、多くの生き物が所有している、この二関節筋を模倣したアクチュエータを実装していないのも1つの原因と考えられています。
❗ イーロン・マスクが開発する人型ロボットには、二関節筋は実装されるのでしょうか?
おわりに
この記事では、運動を予測シミュレーションするオープンソースのSCONEを導入して、チュートリアルを試しました。
操作も簡単で、とても使いやすい印象でした。
また、直立してバランスを取るチュートリアルを通して、二関節筋の重要性を確認することができました。
お問い合わせ
FEMSに関するお問い合わせやご相談等は、こちらからお寄せください。
✉️ https://www.rccm.co.jp/contact/