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轴指向前方。
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] 等待操作...