BodySet

请先上传 .osim 文件
🛠️ 如何在 XML 中手动添加新节段 (Body)?

要在 .osim (OpenSim 4.0+) 文件中添加新骨骼,请在 <BodySet> 标签内添加:

<Body name="Your_New_Body_Name"> <FrameGeometry name= "frame_geometry"> <socket_frame>..<socket_frame> <scale_factors> 0.20000000000000001 0.20000000000000001 0.20000000000000001 <scale_factors> <FrameGeometry/> <mass> 5.0 </mass> <mass_center> 0 0 0 </mass_center> <!-- OpenSim 4.x 惯性矩 [Ixx Iyy Izz Ixy Ixz Iyz] --> <inertia> 0.1 0.1 0.1 0 0 0 </inertia> <attached_geometry> <Mesh name="new_geom"> <socket_frame>..<socket_frame> <scale_factors> 1 1 1 <scale_factors> <Appearance> <opacity> 1 <opacity/> <color 1 1 1 <color/> <Appearance/> <贴图路径 --> <mesh_file> femur_r.vtp </mesh_file> </Mesh> </attached_geometry> </Body>

注意: 添加 Body 后,必须同时添加一个 Joint 将其连接到父物体。

JointSet

📚 关节类型说明

PinJoint (铰链)1 DOF (旋转)。适用于膝关节(简化)、肘关节。
WeldJoint (焊接)0 DOF。完全固定。
BallJoint (球窝)3 DOF。适用于髋关节。
CustomJoint (自定义)OpenSim 通用类型,支持使用自定义函数约束关节运动。
SliderJoint (滑块)1 DOF (平移)。适用于活塞或特殊结构。
FreeJoint (自由)6 DOF。通常用于Ground-Pelvis连接。
UniversalJoint (万向)2 DOF。适用于腕关节等。
🛠️ 如何在 XML 中手动添加新关节 (Joint)?

OpenSim 4.x 关节连接的是 Frame (坐标系) 而非直接连接 Body。请在 <JointSet> 中添加:

<PinJoint name="new_knee_joint"> <!-- 1. 关节连接的是下方定义的 Frame 名字 --> <socket_parent_frame> femur_offset </socket_parent_frame> <socket_child_frame> tibia_offset </socket_child_frame> <!-- 第一个自由度 --> <coordinates> <Coordinate name="knee_angle_r"> <default_value> 0 </default_value> <range> -2.0 0.1 </range> </Coordinate> </coordinates> <!-- 第二个自由度 --> <coordinates> <Coordinate name="knee_angle_r"> <default_value> 0 </default_value> <range> -2.0 0.1 </range> </Coordinate> </coordinates> <!-- 第三个自由度 --> <coordinates> <Coordinate name="knee_angle_r"> <default_value> 0 </default_value> <range> -2.0 0.1 </range> </Coordinate> </coordinates> <!-- 2. 在此处定义 Frame 并连接到具体的 Body --> <frames> <PhysicalOffsetFrame name="femur_offset"> <FrameGeometry name= "frame_geometry"> <socket_frame>..<socket_frame> <scale_factors> 0.20000000000000001 0.20000000000000001 0.20000000000000001 <scale_factors> <FrameGeometry/> <socket_parent> /bodyset/femur_r </socket_parent> <translation> 0 -0.4 0 </translation> <orientation> 0 0 0 </orientation> </PhysicalOffsetFrame> <PhysicalOffsetFrame name="tibia_offset"> <FrameGeometry name= "frame_geometry"> <socket_frame>..<socket_frame> <scale_factors> 0.20000000000000001 0.20000000000000001 0.20000000000000001 <scale_factors> <FrameGeometry/> <socket_parent> /bodyset/tibia_r </socket_parent> <translation> 0 0 0 </translation> <orientation> 0 0 0 </orientation> </PhysicalOffsetFrame> </frames> </PinJoint>

ForceSet

📚 肌肉模型与参数指南

🧩 常用肌肉模型
Millard2012EquilibriumMuscle 计算稳定性高,考虑了肌腱的非线性弹性,是目前步态和运动分析的标准模型。
Thelen2003MuscleOpenSim 经典模型。允许通过参数精细调节力-长度曲线形状。
RigidTendonMuscle假设肌腱无限硬(不伸长)。计算速度最快,适用于肌腱很短或忽略肌腱储能的简化分析。
📐 核心生理参数 (通用)
Max Isometric Force最大等长收缩力 (N)。肌肉在最佳长度下不缩短也不伸长时能发出的最大主动力。
Optimal Fiber Length最佳肌纤维长度 (m)。肌肉产生主动力效率最高时的肌纤维长度。
Tendon Slack Length肌腱松弛长度 (m)。肌腱刚开始产生张力时的长度。此参数极其敏感,微小的改变会显著影响肌肉的发力时机。
Pennation Angle羽状角 (rad)。肌纤维与肌腱拉力方向的夹角。角度越大,力传递效率越低,但允许更快的收缩速度。
⏱️ 动力学与激活参数
Max Contraction Vel最大收缩速度 (Lo/s)。通常设为 10。定义了力-速度曲线的截距,即肌肉收缩多快时力会降为零。
Activation Time Const激活时间常数 (s)。神经信号到达后,钙离子释放导致肌肉开始发力的延迟。通常约 0.01s (10ms)。
Deactivation Time Const去激活时间常数 (s)。神经信号停止后,钙离子回收导致力衰退的时间。通常约 0.04s (40ms),必定大于激活常数。
📈 形状与高级因子 (Thelen/Millard)
Fmax Tendon Strain最大肌腱应变。肌肉发出最大力时肌腱被拉长的比例。默认 0.04 (4%)。值越小表示肌腱越硬(如跟腱较软,指伸肌腱较硬)。
Kshape Active主动力曲线形状因子 (仅Thelen)。调节高斯曲线的“宽窄”。标准值约 0.5。
Kshape Passive被动力曲线形状因子 (仅Thelen)。调节肌肉被拉伸时被动力的指数增长速率。标准值 4.0。
Af (F_ecc)离心力增强系数 (仅Thelen)。肌肉被快速拉长时能产生的最大力倍数。通常为 1.4 (即最大离心力是最大等长力的 1.4 倍)。
🛠️ 如何在 XML 中手动添加新肌肉 (Muscle)?

肌肉属于 <ForceSet>。注意路径点需指定 socket_parent_frame

<Thelen2003Muscle name="new_muscle"> <appliesForce> true </appliesForce> <!-- 肌肉参数 --> <max_isometric_force> 1000 </max_isometric_force> <optimal_fiber_length> 0.1 </optimal_fiber_length> <tendon_slack_length> 0.2 </tendon_slack_length> <pennation_angle_at_optimal> 0 </pennation_angle_at_optimal> <max_contraction_velocity> 1000 </max_contraction_velocity> <FmaxTendonStrain> 0.1 </FmaxTendonStrain> <FmaxMuscleStrain> 0.2 </FmaxMuscleStrain> <KshapeActive> 0 </KshapeActive> <KshapePassive> 1000 </KshapePassive> <Af> 0.1 </Af> <Flen> 0.2 </Flen> <activation_time_constant> 0 </activation_time_constant> <deactivation_time_constant> 0 </deactivation_time_constant> <GeometryPath> <PathPointSet> <objects> <PathPoint name="origin"> <location> 0 0.1 0 </location> <socket_parent_frame> /bodyset/pelvis </socket_parent_frame> </PathPoint> <PathPoint name="insertion"> <location> 0 0.1 0 </location> <socket_parent_frame> /bodyset/femur_r </socket_parent_frame> </PathPoint> </objects> </PathPointSet> <!-- 肌肉包裹的定义 --> </PathWrapSet> 0 < </objects> 0 </objects> </groups> 0 </groups> <//PathWrapSet> <!-- 肌肉颜色,RGB值确定 --> <Appearance> 0 0 0,</Appearance> </GeometryPath> </Thelen2003Muscle>

工具箱(该区域的功能处于测试中)

⚙️ 配置文件同步

RRA/CMC Task & Actuator 配置文件自动清洗与生成

📊 实验数据坐标转换

TRC/MOT 坐标系转换。
OpenSim 默认: Y轴指向天空, X轴指向前方
原始数据(Old) -> 新数据(New)
New X=
New Y=
New Z=

🚀 MATLAB 批处理生成器

勾选分析步骤,生成 OpenSim API 批处理代码。
流程:

🔄 C3D 格式转换器

读取C3D文件并将其转换为 .trc (Markers) 和 .mot (Analog/Forces)文件。
✂️ 截取(s): -
📝 操作日志 (Operation History) [清空日志]
  • [System] 等待操作...