サッカーボールを強く蹴るにはどの筋肉を鍛えたらよいか?(2)
By K.Yoshimi
この記事では、以前の記事
に続いて、「どの筋肉を鍛えたらよいか?」を、CMA-ES(共分散行列適応進化戦略、Covariance Matrix Adaptation Evolution Strategy)を用いて、検討します。
❗ 本記事の結果については、如何なる保証もありませんので、ご注意ください。
最適化問題
本記事では、前記事と同様、OpenSimのSoccer Kickingの例題を使用します。
「サッカーボールを強く蹴るにはどの筋肉を鍛えればよいか?」の疑問に対して、この例題に最適化手法を適用して検討します。
まず、最適化問題を設定しましょう。
動かすパラメータは4つで
- Hamstings (ハムストリング筋):膝を屈曲させる筋
- Rec Fem (大腿直筋):膝を進展させる筋
- Scleus (ヒラメ筋):踵を上げてつま先立ちにする筋
- Tibialis Anterior (前脛骨筋):足先を持ち上げる筋
の最大等長力(maximum isometric force)を0~9000(N)の範囲で動かして、蹴り出した「ボールの最大速度」を最大化します。
各筋肉の場所は、下図をご覧ください。
CMA-ES(共分散行列適応進化戦略)による最適化
それでは、上記の最適化問題を解いていきましょう。
pycma
ここでは、最適化問題を解くために、CMA-ESのPython実装であるpycmaを使用します。
💡 CMA-ES(共分散行列適応進化戦略)
CMA-ESとは、連続探索空間における困難な最適化問題(非凸、非条件、マルチモーダル、多峰性、ノイズ)に対する 勾配法を使わない確率数値最適化アルゴリズムです。
pycmaのOpenSimへの適用
pycmaを、OpenSimのSoccer Kickingの例題に適用するために、
Soccer Kickingのソースコード
C:/Users/ユーザー名/Documents/OpenSim/4.3/Models/SoccerKick
にあるSoccerDemoWithReset.py
を下記のように改変して、SoccerKickingOptimization.pyという名称で同じフォルダに置きます。
主な改変内容は下記です。
OpenSimのGUIから筋骨格モデルシミュレーション部分を分離- 筋骨格モデルシミュレーションに
pycmaを適用
import opensim as osim
import numpy as np
import time
import cma
def getSpeed():
data = np.genfromtxt('kick/leg6dof9musc_knee_stop_Kinematics_u.sto', dtype='float', names=True, autostrip=True, skip_header=10)
return np.max(data['ball_tx'])
# OBJECTIVE FUNCTION
# Runs a forward simulation using the initial conditions specified in the
# candidate solution vector (candsol) and computes the corresponding
# objective function value (i.e. the maximum speed of the ball).
def succer_kicking_objective_function(candsol):
global all_max_speeds, all_candsols
model = osim.Model('SoccerKickingModel.osim')
# Set the initial max isometric forces
model.getMuscles().get('bifemlh_r').setMaxIsometricForce(candsol[0])
model.getMuscles().get('rect_fem_r').setMaxIsometricForce(candsol[1])
model.getMuscles().get('soleus_r').setMaxIsometricForce(candsol[2])
model.getMuscles().get('tib_ant_r').setMaxIsometricForce(candsol[3])
# Simulate
tool = osim.ForwardTool('runFD.xml', True, False)
tool.setModel(model)
tool.run()
x = getSpeed()
# Store the candidate solution and the distance traveled.
all_candsols.append(candsol)
all_max_speeds.append(x)
print(candsol)
print(f'Max speed: {x} m/s')
# To maximize max speed, minimize its negative.
J = -x
return (J)
# MAIN
# Perform an optimization using cma with the above objective function.
global all_max_speeds, all_candsols
all_max_speeds = []
all_candsols = []
# Load OpenSim model.
model = osim.Model('SoccerKickingModel.osim')
# Create candidate solution vector. If the optimizer is working
# correctly, it should increase this value to 9000.0 (the upper bound); see the
# penalty calculation in the objective function.
candsol = []
candsol.append(model.getMuscles().get('bifemlh_r').getMaxIsometricForce())
candsol.append(model.getMuscles().get('rect_fem_r').getMaxIsometricForce())
candsol.append(model.getMuscles().get('soleus_r').getMaxIsometricForce())
candsol.append(model.getMuscles().get('tib_ant_r').getMaxIsometricForce())
# Optimize.
t_start = time.time()
# For a description of arguments to fmin(), run cma.CMAOptions() or see
# http://cma.gforge.inria.fr/apidocs-pycma/cma.evolution_strategy.html#fmin
x, es = cma.fmin(succer_kicking_objective_function, candsol, 200.0,
options = {'popsize':20, 'tolfun':1e-3, 'tolx':1e-3,
'bounds': [0.0, 9000.0]})
t_elapsed = time.time() - t_start
print(f'Elapsed time: {t_elapsed} seconds')
# Find the best solution.
max_speed = max(all_max_speeds)
print(f'Best max speed: {max_speed} m/s')
idx = all_max_speeds.index(max_speed)
bestsol = all_candsols[idx]
print(bestsol)
スクリプトの実行は、フォルダ
C:/Users/ユーザー名/Documents/OpenSim/4.3/Models/SoccerKick
に移動してから、下記を実行します。
> python SoccerKickingOptimization.py
❗ 実際にスクリプトを実行するには、Python環境に、
opensimとpycmaのモジュールが必要ですので、 あらかじめインストールしておいてください。
最適化の結果
この最適化計算は、時間がかかるので、最大速度が小数点以下2桁で変化しなくなった1540回までの最適解をみてみます。
まず、初期の最大等長力
- Hamstings (ハムストリング筋):2594.0 N
- Rec Fem (大腿直筋):1169.0 N
- Scleus (ヒラメ筋):5137.0 N
- Tibialis Anterior (前脛骨筋):1759.0 N
における、キックをみましょう(ボールの最大速度は11.150(m/s)。

次に、算出された最適な最大等長力
- Hamstings (ハムストリング筋):2818.156 N
- Rec Fem (大腿直筋):2708.278 N
- Scleus (ヒラメ筋):0.00039 N
- Tibialis Anterior (前脛骨筋):1502.394 N
におけるキックを見ます。
このときのボールの最大速度は13.493(m/s)と、初期のキックより、2.34(m/s)ほど速く、約20%のアップしました。

最大等長力の初期値と最適値を比較したのが下のグラフです。

以上より、サッカーボールを強く蹴るには
- ハムストリング筋と大腿直筋は同じくらいの力が出るよう鍛える
- ヒラメ筋はそんなに鍛えるは必要ない
- 前脛骨筋は、ハムストリング筋や大腿直筋の半分くらいの力が出るように鍛える
と良いことが分かります。(怪しいですが・・・😐)
おわりに
「サッカーボールを強く蹴るにはどの筋肉を鍛えたらよいか?」を最適化問題として検討し、 鍛えるべき筋肉の指針を得ました。
しかしながら、最適なキックの場合、蹴った後に、足が単振り子のようにブラブラしており、かなり不自然にみえます。
おそらくは、この最適化問題を解くには、 目的関数に何らかのペナルティー項を追加する必要があるかもしれません。
やはり、鍛えるべき筋肉の指針を得るには、理学療法士さんに見ていただくなど、専門的な知識が必要ですね。
お問い合わせ
もし、ご自身の足の筋力がどのくらいの強さなのかを測定したい場合は、弊社までお問い合わせください。
✉️ https://www.rccm.co.jp/contact/