前提
三次元動作解析装置で得られた位置座標データから,各フレームの角度情報の算出を考えております。座標を手で入力して算出するための計算式はわかったものの,全てのフレームを一括で算出する方法が分かりません…
実現したいこと
三次元動作解析装置で得られた位置座標から,角度を1〜12000フレーム分を一括で算出する。
- 膝関節の屈伸(hipとkneeおよびkneeとankleをそれぞれ結んだ線の角度)
hip_x | hip_y | hip_z | knee_x | knee_y | knee_z | ankle_x | ankle_y | ankle_z | |
---|---|---|---|---|---|---|---|---|---|
1 | 725 | -57 | 1418 | 744 | -260 | 984 | 902 | -139 | 76 |
2 | 720 | -56 | 1420 | 736 | -264 | 988 | 898 | -131 | 99 |
3 | … | … | … | … | … | … | … | … | … |
出力例:
1 150°
2 152°
3 152°
・
・
・
12000 90°
試したこと
1フレームのhipとkneeとankleの位置座標は手入力で入れています。
Python
1hip = np.array([ 725, -57, 1418]) 2knee = np.array([ 744, -260, -264]) 3ankle = np.array([902, -139, 76]) 4 5f = knee - hip 6t = ankle - knee 7 8cos_theta = np.dot(f, t) / (np.linalg.norm(f) * np.linalg.norm(t)) 9 10theta = np.arccos(cos_theta) * 180 / np.pi 11knee_angle = round(theta, 1) 12print("knee_angle:", knee_angle, "°") 13 14#TCC: 152.8
補足情報(FW/ツールのバージョンなど)
- jupyter notebookを使用
- プログラミングは初学者レベル
12000フレーム分の位置座標全部手入力で角度の計算だけプログラムに任せる感じですか
> 角度を1〜12000フレーム分を一括で算出する。
データフレームから1行ずつデータを取り出して計算することは出来るが、”一括で”処理する方法が分からないので教えてほしい、という質問ですか? それともデータフレームから1行ずつデータを取り出す方法も分からない、という質問でしょうか?
言葉足らずで大変申し訳ございません。
位置座標をデータフレームとして読み込みはできており,1フレーム毎に手入力であれば角度を算出はできるものの,12000フレーム分を全て手作業で行うのは非現実であるため,1行ずつの角度算出をプログラムに任せられたらと思っております。
・現在のコードでは計算結果をprint出力していますがこの仕様はそのままでしょうか?
・質問のコードを関数化することは出来ますでしょうか?
※ コードはimport文含めて書かれると回答者に分かりやすいです。
※ 追加の情報は質問本文に追記なさってください。
ndarrayは変なことしなくてもリストごとにそのまま計算できます。
上の例だとf=knee-hipの計算をしてますよね。
kneeもhipも一次元リストですが二次元にしてもちゃんと計算してくれます
建設的なコメントありがとうございます。
・"実現したいこと"の出力例のような形式を考えておりますが,可能であれば,各行の角度を表の最後に追加できると嬉しいです。
・非エンジニア(医療職)のため関数の作成方法は分かりません…
なお,importからデータの読み込みは下記の通りです。
import pandas as pd
import numpy as np
df = pd.read_csv('フォルダ名.csv')
Sobasenbei様:私の知識が疎いため,具体的な方法をご教示いただけますと嬉しいです。
お手数ですが、情報の追加・修正は質問本文へ反映お願いします。この欄ですと他の回答者の目に触れにくいのがその理由となります。
pandasのDataFrameを使ってるなら、たとえば
df["hip_x"]-df["knee_x"]
と書けばそれだけで12000個の値全部計算してくれます。
出力の型はSeriesと言ってpandasの一次元リストみたいなもんです
meg_様:質問本文とはどこでしょうか。始めたばかりで分からず,投稿するボタンとは違うのでしょうか。
この欄は”質問への追記・修正の依頼”欄です。
質問を編集したいときは質問欄の左下にある”編集”を押してください。
ご教示いただきありがとうございます(基本的な機能かもしれないのに,すみません…)。また,私の実現したことを丁寧に汲み取ってご尽力いただきましたことも心から感謝申し上げます。
回答3件
あなたの回答
tips
プレビュー