OpenPose で人の動きを取得し3D再構成するシリーズの最終回です。OpenPose の導入(Part 1)、カメラ校正(Part 2)、3D再構成(Part 3)、OpenSim でのキネマティクス(Part 4)と進めてきました。今回はさらに一歩踏み込み、キネティクス(動力学)シミュレーション——筋活動と地面反力の推定——を行います。

内部では、OpenCap は OpenSim Moco(最適制御ライブラリ)と自動微分を用います。Part 4 でスケーリングした筋骨格モデルとキネマティクスを融合し、その動きを生み出すために筋がどう働いたか、そしてどんな地面反力が生じたかを解きます。
動力学シミュレーションの設定
該当するPythonは、OpenCap の UtilsDynamicSimulations と自動微分コード(OpenSimAD)にあります。OpenCap のリポジトリをクローンし、それらのパスを追加して、必要な2つの関数をインポートします。あとはスケーリング済みモデルと Part 4 のモーション/キネマティクスファイルを指定します。

OpenCap にはいくつかの設定があります: 動作が地面上(overground)かトレッドミル上か、そして動作タイプ(スクワット、立ち座り、ジャンプ、歩行、走行…)。ここではスクワットなので motion_type = 'squats'。trial name はモーションファイル名と一致させます。変数を入れて tracking 関数を実行します。
時間窓(time window)に注意。 反復動作(スクワット、立ち座り)は1回分(repetition)で扱います。連続動作(歩行、走行)では時間窓を指定しますが、約2秒以内にする必要があります。それより長いと収束せず(反復回数が多すぎる)失敗しがちなので、短く保ちます。
実行するとパイプラインは時間がかかります: モデルのダウンロード/調整、筋のラッピング面や足–地面接触の追加、自動微分用の外部関数の生成、ヤコビアンの計算、そして求解。完了すると、キネティクスデータが用意できます。
筋活動(Muscle activation)
結果は自動生成される Dynamics フォルダ(動作名のサブフォルダ)に入ります。OpenSim の GUI でスケーリング済みモデルを開き、activations のモーションファイルを読み込みます。再生すると、各筋が活動度に応じて色付けされ、動作中にどの筋が働いているかが分かります。

地面反力(Ground reaction force)
地面反力(GRF)も可視化できます。「associate motion data」で合成GRF(x・y・zを合成)を読み込むと、矢印として表示され、スクワットらしく上向きを指します。必要なら成分ごとに分けて読み込むこともできます。

これまでと同様、校正の不完全さでスクワットは少し歪んでいますが、結果は十分に使えます。そしてこれが要点です——動画と OpenPose(あるいは任意の姿勢推定器)だけから始めて、OpenCap と OpenSim のおかげで完全な動力学まで推定できます。マーカーレス・モーションキャプチャの可能性を実感できます。
シリーズ全体
- Part 1 — OpenPose セットアップ
- Part 2 — カメラキャリブレーション
- Part 3 — 3D再構成
- Part 4 — キネマティクスシミュレーション
- Part 5 — キネティクスシミュレーション(本記事)
シリーズを最後までご覧いただきありがとうございました。ご質問は YouTube のコメント、またはお問い合わせフォームからどうぞ。
著者について
Takashi Fukushima — スポーツ・運動科学 × Human Pose Estimation × Computer Vision × XR を横断して研究・開発しています。
- YouTube(登録): Takashi Fukushima|Sports Science & Pose Estimation
- 研究(ORCID): orcid.org/0000-0002-7318-3384
- ウェブサイト: takashifukushima.com
- お問い合わせ: お問い合わせフォーム