В настоящее время я работаю с данными о захвате движения из набора данных CMU MOCAP и анализирую ее с использованием модели Rajagopal2016 в GUI. /> Применяемое преобразование координат, если данные были в системе Z-UP. < /li>
Маркеры CMU с отображением с использованием имен маркеров OpenSim с использованием пользовательского отображения. < /li>
Экспортировал файл .trc и успешно выполнял инверс-kinematics (IK) в OpenSim gui. хорошо выглядите для прямой ходьбы. Однако в круговых или поворотных испытаниях движения ноги и бедра не вращаются и не следуют за дугой движения. Модель, по -видимому, идет на месте, а не вдоль кривой, хотя верхняя часть тела следует по правильному пути движения. < /P>
Я прикрепил две кадры ниже, показывающие эту проблему:
Изображение < /p>
Мои вопросы: < /p>
. Или смещенные маркеры ноги или бедра? /> Я поделился ниже кода Python, который создает .trc из файлов .c3d. < /p>
import ezc3d
import numpy as np
from scipy.spatial.transform import Rotation as R
# Load the C3D file
c3d = ezc3d.c3d("/Downloads/0005_Walking001.c3d")
# Extract marker data
points = c3d['data']['points'][:3] # (X, Y, Z)
# Detect if Z-up (vertical movement is mostly in the Z axis)
spread_y = np.ptp(points[1, :, :]) # Y range
spread_z = np.ptp(points[2, :, :]) # Z range
if spread_z > spread_y:
print("↪ Detected Z-up coordinate system. Rotating to Y-up for OpenSim...")
rot = R.from_euler('x', -90, degrees=True).as_matrix()
points = np.einsum('ij,jkl->ikl', rot, points)
else:
print("Coordinate system appears Y-up — no rotation applied.")
raw_labels = c3d['parameters']['POINT']['LABELS']['value']
labels = [l.split(':')[-1] for l in raw_labels] # Remove prefix like 'liu:'
# OpenSim model marker list (from Rajagopal2016.osim)
opensim_markers = [
"RACR", "LACR", "C7", "CLAV", "RASH", "RPSH", "LASH", "LPSH", "RSJC",
"RUA1", "RUA2", "RUA3", "RLEL", "RMEL", "RFAsuperior", "RFAradius", "RFAulna",
"LSJC", "LUA1", "LUA2", "LUA3", "LLEL", "LMEL", "LFAsuperior", "LFAradius", "LFAulna",
"RASI", "LASI", "RPSI", "LPSI", "LHJC", "RHJC", "RTH1", "RTH2", "RTH3",
"RLFC", "RMFC", "RKJC", "RTB1", "RTB2", "RTB3", "RLMAL", "RMMAL", "RAJC",
"RCAL", "RTOE", "RMT5", "LTH1", "LTH2", "LTH3", "LLFC", "LMFC", "LKJC",
"LTB1", "LTB2", "LTB3", "LLMAL", "LMMAL", "LAJC", "LCAL", "LTOE", "LMT5",
"REJC", "LEJC", "R_tibial_plateau", "L_tibial_plateau"
]
# Map TRC labels to OpenSim model names
rename_map = {
'LFWT': 'LASI', 'RFWT': 'RASI', 'LBWT': 'LPSI', 'RBWT': 'RPSI',
'LSHO': 'LASH', 'RSHO': 'RASH', 'LELB': 'LMEL', 'RELB': 'RMEL',
'LWRB': 'LFAradius', 'RWRB': 'RFAradius', 'LWRA': 'LFAradius', 'RWRA': 'RFAradius',
'LFRM': 'LFAsuperior', 'RFRM': 'RFAsuperior', 'LTHI': 'LTH1', 'RTHI': 'RTH1',
'LSHN': 'LTH3', 'RSHN': 'RTH3', 'LANK': 'LLMAL', 'RANK': 'RLMAL',
'LHEE': 'LCAL', 'RHEE': 'RCAL', 'LKNE': 'LKJC', 'RKNE': 'RKJC',
'LTOE': 'LTOE', 'RTOE': 'RTOE', 'LMT5': 'LMT5', 'RMT5': 'RMT5',
'STRN': 'CLAV', 'CLAV': 'CLAV', 'C7': 'C7'
}
# Reverse map for writing: only keep labels matching OpenSim markers
matched_indices = []
mapped_labels = []
used_names = set()
for i, label in enumerate(labels):
new_label = rename_map.get(label)
if new_label in opensim_markers and new_label not in used_names:
matched_indices.append(i)
mapped_labels.append(new_label)
used_names.add(new_label)
# Filter points
points_filtered = points[:, matched_indices, :]
# Prepare TRC content
n_frames = points.shape[2]
rate = c3d['header']['points']['frame_rate']
time = np.arange(n_frames) / rate
# Write TRC
trc_path = "0005_Walking001.trc"
with open(trc_path, 'w') as f:
f.write(f"PathFileType\t4\t(X/Y/Z)\t{trc_path}\n")
f.write("DataRate\tCameraRate\tNumFrames\tNumMarkers\tUnits\tOrigDataRate\tOrigDataStartFrame\tOrigNumFrames\n")
f.write(f"{rate:.2f}\t{rate:.2f}\t{n_frames}\t{len(mapped_labels)}\tmm\t{rate:.2f}\t1\t{n_frames}\n")
f.write("Frame#\tTime\t" + "\t\t".join(mapped_labels) + "\n")
f.write("\t" + "\t".join([f"{axis}{i+1}" for i in range(len(mapped_labels)) for axis in ["X", "Y", "Z"]]) + "\n")
for i in range(n_frames):
row = [str(i+1), f"{time:.5f}"]
for m in range(len(mapped_labels)):
x, y, z = points_filtered[:, m, i]
row.extend([f"{x:.5f}", f"{y:.5f}", f"{z:.5f}"])
f.write("\t".join(row) + "\n")
print(f"TRC file written to: {trc_path}")
Подробнее здесь: https://stackoverflow.com/questions/796 ... jagopal201
Ноги и бедро не вращаются во время круговой ходьбы - OpenSim Rajagopal2016 ⇐ Python
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение