見出し画像

動かして学ぶバイオメカニクス #25 〜キック動作の全身解析 2〜

前章に続き,アメリカンフットボールのキック動作の解析例を示す.特に理論的な目新しさはないが,これまでの解析の復習と捉え,貴重なデータを用いて実際に動かし,自由にコードを書き換えることで学んでいただければと思う.数理を自分でコード化し,動かして確認することで,数理の理解がより強固になるはずである.



はじめに

前章

ではアメリカンフットボールのキック動作を最初に解析することを想定して例題として取り上げた.

モーションキャプチャとフォースプレートのデータを入力し,逆動力学計算(関節に作用するトルクなどの計算)を行うソフトウエア(Visual 3D, OpenSim, Skycom等)もあるが,よほど好条件で計測された場合を除けば,解析はノイズや精度との戦いで,フィルタリングのパラメータを調整せずに解析を行っても,良い結果は望めないだろう.

力学計算の基本は力計算で,モーションキャプチャを利用する場合,加速度計算,すなわち二階微分の演算の良し悪しが正しい結果を導くことを左右する.そもそも,なにが加速度の正解かがわからずフィルタリングを行っていることが多いと思うが,一度,加速度センサ(モーションセンサ,慣性センサ,IMU)などで計測し,比較することをおすすめする.多くの場合,必要以上にノイズをカットしてしまい,本来の加速度(力)の信号がかなり低減していることも多いのではないだろうか.波形すら示さない研究発表も多いが,数個の三角関数波形の重ね合わせのような滑らかな力やトルクが計算されている結果は,多くの場合,疑ったほうが良い.フィルタのさじ加減で統計結果などの事実は大きく変わる.そのぐらい慎重さが求められる作業だが,多くの人は気にしていないだろう.

もし力学計算を行ったことがある場合,皆さんの計算しているトルクなどの力学量が,本当に正しいか,正確な値に近いかどうか,間接的な方法だとしても確認してみるとよい.

どこかで,加速度センサとモーションキャプチャから計算する加速度のとの比較についても述べてみたいが,一般に計測空間を小さく設定し,十分なカメラの台数で計測する場合,つまり1つのマーカに対して多くのカメラでトラッキングされ,かつ分解能が高い環境では,モーションキャプチャから計算する加速度は加速度センサで計測する加速度とかなり一致する.ただし,平滑化スプラインなどの利用が前提だ.

ところが,スポーツのような運動で計測空間が広くなるにつれ,マーカをトラッキングするカメラの台数が減り,カメラが遠くなることで空間分解能が低くなり,必然的に加速度の精度はかなり低下する.断言するには検証が必要だが,筆者の経験からの私見ではあるが平滑化スプライン以外で加速度を計算することは考えにくい.もちろん平滑化スプラインにも限界はある.

このような理由からも,いつも同じ条件や環境で,計測や計算を行っている場合を除けば,前章のような準備過程が不可欠である.

さらに余計なことを述べるとモーションキャプチャが登場する以前の研究で見られる,高速度カメラで計測したデータを使用し,手動でデジタイズ,DLTなどで計算された力学データの研究結果の信頼性は疑ってみたほうがよいだろう.

この章の課題

この章では,モーションセンサなどとの正しい結果と比較していないので,フィルタリングのパラメータが適切であったかどうかはわからないが,それらの準備・確認をすませた前提で,アメリカンフットボールのキック動作の解析を行う.

ここではアメリカンフットボールのフィールドゴールを想定したキック動作の計測を行い,被験者は助走速度を変化させてキックを行っているが,一例だけを示す.解析もごく一部の結果を示すことになるが,ここで示したこと以外にも,ご自身で確認をしていただければと思う.今回も含めて,貴重なデータの公開に同意していただいたアスリートの方々にも御礼を述べる.詳細な解析は,どこかで発表できればと思う.

確認した動作環境とコードについて

いつものように,以下のGoogle ColaboratoryのリンクからブラウザでPythonコードを実行できる.なお,ログインするためには,Googleアカウントが必要となるので注意をされたい.

なお,前章で述べたように,これまで定義してきたクラスと関数の定義は,ファイルbody_link.pyにまとめた.このファイル(body_link.py)と,使用するモーションキャプチャのサンプルデータ(sample_optitrack_sec24.csv)は,各リンクからダウンロードし,Colabを利用する場合はマウントしたGoogle Driveに,ご自身の環境で動かす場合はご自身の環境にそれらをコピーしてご使用いただきたい.第24章ですでにダウンロードされた方は,同じファイルをご使用いただいて構わない.

注意: ファイル"body_link.py"をクリックするとファイルの中身が表示されるが,右上のメニュー"︙"からさらにダウンロードしていただきたい.
 ファイル"sample_optitrack_sec24.csv"は,ダウンロードしたファイルのファイル名が"sample_optitrack_sec24 - sample_optitrack_sec24.csv"となる不具合が発生している.その場合,お手数だがファイル名を"sample_optitrack_sec24.csv”へ変更するなどの対応をお願いしたい.

お詫び: 関節に作用するトルクに起因し,その関節$${i}$$から近位側$${i-1}$$に流入するエネルギーの時間変化(パワー)$${-\bm{\tau}_{i}^T \bm{\omega}_{i-1}}$$を計算する関数power_tau_parent()のコードにおける座標変換に誤りがあった.過去の記事(第17章)で使用した関数と計算は訂正を行った.お詫び申し上げる.

また,サンプルデータの取り扱いについては,このページの最後の【サンプルデータについて】をご参照いただきたい.

関数などが定義されたファイルbody_link.pyをGoogle Colabで利用する場合,データをGoogle Driveにマウント後,例えば下記のように,sys.path.append()関数で

# Google Colabの場合(例)
python_lib_path = '/content/drive/MyDrive/.../lib'
sys.path.append(python_lib_path)

import body_link as bl

のようにファイルbody_link.pyを置いたパスを設定し,importでbody_link.pyファイルを読み込めばよい.Colabではなく,ご自身の環境下でのPythonをご利用する場合も,適宜上記のパス(python_lib_path)を設定していただきたい.なお,このファイルを利用するためにimportする際に,上記のようにbody_link.py のモジュールを bl という名前で読み込んでいる.そこで,このファイルに収められている,関数や変数は

bl.joint_vec()

のようにbl.関数名bl.変数名で使用することができる.

これで,たくさんのセルを何度も評価する地獄からは開放されるはずだ.

body_link.pyを書き換えた場合:
 もし,一旦,importしたあとに,関数を定義したファイルbody_link.pyに修正を与えて保存しなおした場合は,残念ながら,再度,

import body_link as bl

を実行しても,修正・追加したコードは読み込まれない.そこで,

import importlib

os.chdir('/content/drive/MyDrive/.../lib')  # もし,カレントディレクトリ(階層)がbody_link.pyのある場所と異なる場合
importlib.reload(bl)

のように,importlibのモジュールをインポートし,importlib.reload(bl)でファイルbody_link.pyをリロードする必要がある.

また,Google ColaboratoryGoogle Driveの使用方法は,

を参照されたい.


アメリカンフットボールのキック動作の力学解析

Google Colabのファイルには示したが,関数の読み込み,データを格納し,力学計算の準備を整えた後に,

b_link[1].ID_Newton(bw, True);
b_link[1].ID_Euler(True);

を実行することで,全身の各部位(l_id = 1~15)の関節に作用する力とトルクが計算され,b_link[l_id].forceb_link[l_id].tau_globalに格納される.

そこで,まず図1~4にキック動作中(蹴り足:右)の,左右の下肢の関節に作用するトルクを比較する.ここで示すトルクの座標系は,各部位に固定された直交する座標軸まわりの回転で定義され,下記のように定義される.
1.伸展屈曲方向(青色,伸展と屈曲の方向は部位に依存)
2.各部位の長軸まわり(緑色,回旋方向)の回転
3.1と2に垂直な方向(オレンジ色.股関節:内外転方向.膝関節:内外反方向)

ここで,数学的に定義されたこの角度は,解剖学的な角度と一致しないが(そもそも解剖学的な角度定義があいまいであることに由来する),このキック動作の場合は運良く伸展屈曲運動が中心で,3の方向は内外転運動におおよそ相当すると考えて良い.

大腿と上腕の座標系は前章(第24章)

で定義し直しているが,第9章

に座標系の定義の仕方を述べたので参照していただきたい.

キック動作における関節に作用するトルクによるエネルギー流入

例えば,右大腿の原点である右股関節に作用するトルクは

tau_plot_range = (-700, 300)

# 関節に作用するトルクのグラフの描画に共通する,描画の設定
def data_plot_tau(legend):
    plt.axhline(y = 0, ls='dotted', c='.2')
    plt.axvline(x = time_lf_contact/sampling_rate, ls='--', c='b')  # 左足接地
    plt.axvline(x = time_i/sampling_rate, ls='--', c='.5')  # インパクト
    plt.axvline(x = time_lf_release/sampling_rate, ls='--', c='r')  # 左足離地
    plt.xlabel('Time [s]')
    plt.ylabel('Torque [Nm]')
    plt.legend(legend)
    plt.ylim(tau_plot_range[0], tau_plot_range[1]);
# 右大腿(右股関節)
plt.plot(t_list, bl.frame_to_local(bl.link_id(b_link, 'RThigh').rot, bl.link_id(b_link, 'RThigh').tau_global))
data_plot_tau(['Ext/Flex', 'Add/Abd', 'Ext/Int rot'])

で描くと,図1のようになる.ここで,青破線は左脚の着地,赤破線は離地を,グレーの破線はキックの時間を示している.

図1:右股関節に作用するトルク

さらに,右膝関節(図2),

図2:右膝関節に作用するトルク

左股関節(図3),

図3:左股関節に作用するトルク

左膝関節(図4)

図4:左膝関節に作用するトルク

のようになる.下肢のどの関節でも,伸展屈曲のトルク発揮が中心である.これは下肢の運動が矢状面(yz平面)内での運動が中心で,特に左脚では前方への運動を左脚で急激に受動的に止めているため,より大きな出力が伴う.

右脚はやはり股関節のほうが膝関節よりも出力が大きいが,左脚の着地前に大きな屈曲方向のトルク発揮が観察されるが,それと比較すると意外と伸展方向のトルクは小さい.また伸展方向のトルクはボールとの接触時に最大を迎えている.

以上から,おおまかなトルク(筋力)の発揮パターンについて理解した.

次に,エネルギーの時間変化率(パワー)を計算し,実際に右脚を動かすことになる右脚へのエネルギー流入は,トルクが中心ではなく,「内力」,すなわち「関節に作用する力」を媒介したエネルギー伝達が主体であることを示す.

「関節に作用する力(内力)」によるエネルギー伝達

# 3Dグラフ領域の作成
p_elev = 20
p_azim = -110

fig = plt.figure(figsize=(10, 10))
ax = fig.add_subplot(projection='3d')
ax.view_init(elev=p_elev, azim=p_azim)

f_max = 230  # 終わりのフレーム
step_frame = 5  # アニメーションの際の描画でスキップするフレーム数 (5より小さくするとメモリ不足で計算が止まるかもしれない)

cg = b_link[1].COG(bw, True)  # 重心位置
zmp = bl.estimated_cop(bw, b_link, origin_o, weight=.00001, sf=360., grav=9.8)
force = b_link[15].ext_force 

# アニメーション更新用関数の作成
def plot_3d(frame):
        ax.cla()
        stick_power25(ax, b_link,  [10,11,12,13,14,15], frame, time_lf_contact, time_lf_release, cg, zmp, force, \
                      lw = 2, f_para = .0008,  xrange = x_range_s, yrange = y_range_s, zrange = z_range_s, \
                      draw_f_power = True, draw_tau_power = False, draw_cm = False)

# アニメーションのオブジェクトを作成
anim = FuncAnimation(fig, plot_3d, frames = np.arange(0, f_max, step_frame), interval = 100)

# Jupyter内でアニメーションの表示
plt.close()  # 下記でファイル保存する場合は,コメントアウト
HTML(anim.to_jshtml())  # 下記でファイル保存する場合は,コメントアウト

上記コードで,下肢の内力によるエネルギー伝達のアニメーションを作成すると

のようになる.ここで,黒線は正(遠位側への流れ),グレーは負(近位側への流れ)を示している.つまり,黒色の線(太さで流れの大きさを表現)がその部位を加速し,グレーの線はその部位を減速させる効果がある.
これを,下記のコードで

# 以下のグラフィックスで使用するパラメータ
l_color = ['C0', 'C0', 'C1', 'C1']
link_id = [10,11,13,14]  # 右大腿,右下腿,左大腿,左下腿
l_style = ['-', '--', '-', '--']
power_plot_range = (-8500, 5000)

# 関節に作用するトルクのグラフの描画に共通する,描画の設定
def data_plot_power(legend = None):
    plt.axhline(y = 0, ls='dotted', c='.2')
    plt.axvline(x = time_lf_contact/sampling_rate, ls='--', c='b')  # 左足接地
    plt.axvline(x = time_i/sampling_rate, ls='--', c='.5')  # インパクト
    plt.axvline(x = time_lf_release/sampling_rate, ls='--', c='r')  # 左足離地
    plt.xlabel('Time [s]')
    plt.ylabel('Power [Nm/s]')
    if legend == None:
        plt.legend(['RThigh','RShin', 'LThigh', 'LShin'])
    else:
        plt.legend(legend)
    plt.ylim(power_plot_range[0], power_plot_range[1]);
[plt.plot(t_list, bl.power_f(b_link, link_id[i]), c = l_color[i], ls = l_style[i]) for i in range(4)]
data_plot_power()

内力を媒介した,右大腿,右下腿,左大腿,左下腿へのエネルギーの流れ(パワー,力学的エネルギーの時間変化)をグラフで示すと,

図5:右大腿,右下腿,左大腿,左下腿へのエネルギーの流れ

図5のようになる.右脚に注目すると,左脚の着地前から右大腿にエネルギーを流入し,着地後インパクトにかけて右下腿にエネルギーが流れている.

これは,次に示す関節に作用するトルクによって右大腿や右下腿へ流入するエネルギーの流れよりも速い.

「関節に作用するトルク」によるエネルギー供給・吸収: 遠位側への流れ

下記のスティックピクチャでは,関節から遠位側への流れと,近位側への流れを,線の太さと色で,流れの速さ(エネルギーの変化率の大きさ)と符号(赤:正,青:負)を表す.関節から遠位側の線が遠位側(同じ部位)への流れを,関節から近位側の部位への線が近位側(親の部位)への流れを示す.

詳細はコードを実行し,確認していただけたらと思う.

詳細は,第17章

や第21章

を参照していただきたいが,たとえば下腿の部位を$${i}$$番目のリンク(部位)とすると,膝関節まわりのトルクが生成するエネルギーは,下腿の原点(膝$${i}$$)から下腿への流れ$${\bm{\tau}_i^T \bm{\omega}_i}$$と,近位側の親の部位$${i-1}$$に相当する大腿への流れ$${-\bm{\tau}_i^T \bm{\omega}_{i-1}}$$に分かれる.

図6:関節に作用するトルクが供給するエネルギーの近位側と遠泳側への流れ(供給・吸収)

図7は,右大腿,右膝,左大腿,左下腿の部位の原点に相当する各関節(股・膝関節)の関節に作用するトルクから供給,または吸収するエネルギーの流れ(時間微分)のうち,遠位側(同じ部位)への流れを示したものである.

インパクトに近づくに連れ右下腿が鉛直方向を向くと,膝関節に作用するトルク由来のエネルギー(青破線)は下腿に,強いブレーキを与えている.

図7:各関節から遠位側へのエネルギー供給(正)と吸収(負)

図8,9はこのうち右脚に注目し,右大腿と右下腿の各関節から遠位側(同じ部位)への流れを,各座標軸に分解した.エネルギーの時間変化(パワー)はスカラー量であるが,これは

$$
\bm{\tau}_i^T \bm{\omega}_i =[\tau_{ix}~\tau_{iy}~\tau_{iz}]^T\begin{bmatrix}\omega_{ix}\\\omega_{iy}\\\omega_{iz}\end{bmatrix}=\tau_{ix}\omega_{ix} + \tau_{iy}\omega_{iy} + \tau_{iz}\omega_{iz}
$$

で示されるように,このエネルギーの時間変化がトルクベクトル$${\bm{\tau}_i}$$と角速度ベクトル$${\bm{\omega}_i}$$との内積で記述できていることを利用し,各軸成分への分解($${\tau_{ix}\omega_{ix},  \tau_{iy}\omega_{iy} , \tau_{iz}\omega_{iz}}$$)を行っている.

図8:右股関節(右大腿の原点)から右大腿へエネルギーの供給・吸収の各座標軸成分
図9:右膝関節(右下腿の原点)から右下腿へエネルギーの供給・吸収の各座標軸成分

図1〜4の関節に作用するトルクでも示したが,トルク由来のエネルギーの時間変化でも伸展屈曲による変化量(流れ)が大きいことが示されている.

なお,膝関節に関しては,オレンジ色の内外反方向のトルクやエネルギー変化が負の成分が大きいことは,外反方向への負荷がACL損傷へのリスクを高めることになる.すなわち,この方向に作用するトルクは筋肉が発揮しているトルクではなく,靭帯などの受動的な組織による力の吸収なので,脱臼を含めた靭帯などの組織への負担が大きいことを意味している.

ただし,前章でも述べたが,フォースプレートを用いず,外力としての床反力と力のモーメントを推定しているため,そもそも関節に作用するトルクの大きさなどは正確ではない.COPの推定精度が悪いことも示した.COPの推定精度は特に,内外反トルクの計算への精度に大きく影響を与えるため,真値がわからず軽々しく述べられないが,特にここで示している内外反方向のトルクの精度は,「ひどい」ぐらい考えていただいたほうがよいだろう.

「関節に作用するトルク」によるエネルギー供給・吸収: 近位側への流れ

次に図6の近位側(親の部位側)へのエネルギーの供給・吸収を観察する.

図10:各関節から近位側へのエネルギー供給(正)と吸収(負)

図7と比較すると,トルク由来の図10に示した近位側(親側)へのエネルギーの流れは相対的に小さい.関節からトルクとして供給,吸収される力学的エネルギーのうち,スイング運動を加速するために遠位側に主として供給しているためだろう.

右脚に注目すると

右脚のエネルギー変化に注目する.グラフと見比べるとよいが,スティックピクチャを眺めると,左足接地直後は右大腿のトルクで右脚にエネルギーを流入(赤色)している.そのあと,右下腿以下には,膝関節に作用するトルクよりも膝関節に作用する力(内力)で右下腿と右足にエネルギーを伝達している.さらに,インパクト(キック)直前には,右膝関節からの右下腿を止めるようにエネルギーを吸収しながらキックしている.この大きな内力による右下腿からのエネルギー吸収の物理的意味は,読者への課題としておこう.

おわりに

ここでは最初に,下肢の関節に作用するトルクについて観察し,さらに力学的エネルギーの時間変化(エネルギーの流れ)について観察した.トルクと比較し,エネルギーの流れのほうが,身体各部位の加速を理解するには適している.関節に作用するトルクは決して近くの関節を動かすことに寄与するとは限らない.

このマガジンの冒頭で,「身体に作用する力・トルクの解析を目指して」というタイトルを付けておいてなんだが,トルクを観察してもあまり意味はない.運動は力と速度(トルクと角速度)のセットで記述するのがよいということが,ここでも示さていると思う.

キック動作の速度も重要だが,特にアメリカンフットボールのキック動作では同時に正確性も重要な要素となる.高速にスイング運動を行いながら,正確性と両立させる戦略についても,力学的観点から検証することも面白いだろう.それらについては,またどこまで述べることとする.



スポーツセンシング 公式note
スポーツセンシング 運動習慣獲得支援サービス「FitClip」
スポーツセンシング アスリートサポート事業



【著作権・転載・免責について】

権利の帰属
本ホームページで提示しているソフトウェアならびにプログラムリストは,スポーツセンシング社の著作物であり,スポーツセンシング社に知的所有権がありますが,自由にご利用いただいて構いません.

本ページに掲載されている記事,ソフトウェア,プログラムなどに関する著作権および工業所有権については,株式会社スポーツセンシングに帰属するものです.非営利目的で行う研究用途に限り,無償での使用を許可します.

転載
本ページの内容の転載については非営利目的に限り,本ページの引用であることを明記したうえで,自由に行えるものとします.

免責
本ページで掲載されている内容は,特定の条件下についての内容である場合があります. ソフトウェアやプログラム等,本ページの内容を参照して研究などを行う場合には,その点を十分に踏まえた上で,自己責任でご利用ください.また,本ページの掲載内容によって生じた一切の損害については,株式会社スポーツセンシングおよび著者はその責を負わないものとします.

【プログラムの内容について】

プログラムや内容に対する質問に対しては,回答できないことのほうが多くなると思いますが,コメントには目は通します.回答は必要最低限にとどめますので,返信はあまり期待しないでいただけると幸いです,
「動かして学ぶ」という大それたタイトルをつけたものの,また,きれいなプログラムに対するこだわりはあるものの,実際のプログラミングのスキルは決して高くありません.最下部の方のコメント欄によるプログラムの間違いのご指摘は歓迎します.できるだけ反映します.

【サンプルデータについて】

ダウンロードしたサンプルデータは,研究室や所属団体内で自由にご利用いただいて結構です.ただし,学会発表,研究発表,論文などの体外的な活動でのご利用の場合は,株式会社スポーツセンシング社にご連絡ください.

【解析・受託開発について】

スポーツセンシングでは,豊富な知見を持つ,研究者や各種エンジニアが研究・開発のお手伝いをしております.研究・開発でお困りの方は,ぜひスポーツセンシングにご相談ください.
【例】
 ・データ解析の代行
 ・受託開発
  (ハードウェア、組込みソフトウェア、PC/モバイルアプリ)
 ・測定システム構築に関するコンサルティング など
その他,幅広い分野をカバーしておりますので,まずはお気軽にお問い合わせください.

【データの計測について】

スポーツセンシング社のスタジオで,フォースプレートやモーションキャプチャを利用した計測も行えます.出力されるデータと,ここで示したプログラム(入力データの取り込み関数を少々改変する必要があるが)で,同様な解析を行えますので,まずはお気軽にお問い合わせください.