BodySet
请先上传 .osim 文件
🛠️ 如何在 XML 中手动添加新节段 (Body)?
▼
要在 .osim (OpenSim 4.0+) 文件中添加新骨骼,请在 <BodySet> 标签内添加:
<!-- 放入 <BodySet><objects> 内;示例:附着在大腿上的外骨骼绑带(质量单位 kg,长度 m) -->
<Body name="exo_cuff">
<!-- 质量与质心(相对本节段坐标系) -->
<mass>0.5</mass>
<mass_center>0 -0.05 0</mass_center>
<!-- 惯性矩 [Ixx Iyy Izz Ixy Ixz Iyz] (kg·m²),关于质心 -->
<inertia>0.001 0.0005 0.001 0 0 0</inertia>
<attached_geometry>
<Mesh name="exo_cuff_geom">
<socket_frame>..</socket_frame>
<scale_factors>1 1 1</scale_factors>
<Appearance>
<opacity>1</opacity>
<color>0.2 0.7 0.5</color>
</Appearance>
<!-- 网格文件放在模型的 Geometry 目录;找不到时仅提示,不影响计算 -->
<mesh_file>exo_cuff.stl</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> 中添加:
<!-- 放入 <JointSet><objects> 内。每个新 Body 必须恰好作为一个关节的子节段 -->
<PinJoint name="exo_cuff_joint">
<!-- 1. 指向本关节 <frames> 中定义的偏移坐标系名称 -->
<socket_parent_frame>femur_r_cuff_offset</socket_parent_frame>
<socket_child_frame>exo_cuff_offset</socket_child_frame>
<!-- 2. PinJoint 恰好 1 个坐标(绕关节坐标系 Z 轴旋转);
BallJoint 3 个、UniversalJoint 2 个、WeldJoint 0 个;坐标名在全模型中必须唯一 -->
<coordinates>
<Coordinate name="exo_cuff_angle">
<default_value>0</default_value>
<range>-0.5 0.5</range>
<clamped>true</clamped>
<locked>false</locked>
</Coordinate>
</coordinates>
<!-- 3. 偏移坐标系:socket_parent 用绝对路径 /bodyset/节段名 -->
<frames>
<PhysicalOffsetFrame name="femur_r_cuff_offset">
<socket_parent>/bodyset/femur_r</socket_parent>
<translation>0 -0.2 0.05</translation>
<orientation>0 0 0</orientation>
</PhysicalOffsetFrame>
<PhysicalOffsetFrame name="exo_cuff_offset">
<socket_parent>/bodyset/exo_cuff</socket_parent>
<translation>0 0 0</translation>
<orientation>0 0 0</orientation>
</PhysicalOffsetFrame>
</frames>
<!-- 只有 CustomJoint 才有 <SpatialTransform>;PinJoint 等不能包含它 -->
</PinJoint>
ForceSet
📚 肌肉模型与参数指南
🧩 常用肌肉模型
Millard2012EquilibriumMuscle 计算稳定性高,考虑了肌腱的非线性弹性,是目前步态和运动分析的标准模型。
Thelen2003MuscleOpenSim 经典模型。允许通过参数精细调节力-长度曲线形状。
DeGrooteFregly2016Muscle曲线光滑可导,常用于直接配点优化 (OpenSim Moco)。
RigidTendonMuscle假设肌腱无限硬(不伸长)。计算速度最快,适用于肌腱很短或忽略肌腱储能的简化分析。
📐 核心生理参数 (通用)
Max Isometric Force最大等长收缩力 (N)。肌肉在最佳长度下不缩短也不伸长时能发出的最大主动力。
Optimal Fiber Length最佳肌纤维长度 (m)。肌肉产生主动力效率最高时的肌纤维长度。
Tendon Slack Length肌腱松弛长度 (m)。肌腱刚开始产生张力时的长度。此参数极其敏感,微小的改变会显著影响肌肉的发力时机。
Pennation Angle羽状角 (rad)。肌纤维与肌腱拉力方向的夹角。角度越大,力传递效率越低,但允许更快的收缩速度。
⏱️ 动力学与激活参数
Max Contraction Vel最大收缩速度(最佳纤维长度/秒)。OpenSim 默认 10。定义力-速度曲线的截距,即肌肉收缩多快时力降为零。
Activation Time Const激活时间常数 (s)。兴奋到激活的一阶动力学时间常数。OpenSim 默认:Thelen 0.015 s,Millard 0.01 s,DeGroote 0.015 s。
Deactivation Time Const去激活时间常数 (s)。激活衰减的时间常数,应大于激活常数。OpenSim 默认:Thelen 0.05 s,Millard 0.04 s,DeGroote 0.06 s。
📈 形状与高级因子 (Thelen/Millard)
Fmax Tendon Strain肌腱在最大等长力下的应变 (仅 Thelen;Millard 对应 TendonForceLengthCurve 的 strain_at_one_norm_force,DeGroote 对应 tendon_strain_at_one_norm_force)。默认 0.04 (4%),值越小肌腱越硬。
Kshape Active主动力-长度高斯曲线形状因子 (仅 Thelen)。OpenSim 默认 0.45 (Thelen 2003)。
Kshape Passive被动力-长度指数曲线形状因子 (仅 Thelen)。OpenSim 默认 5;与 FmaxMuscleStrain (默认 0.6,被动力达到最大等长力时的纤维应变) 共同决定被动力。
Af / Flen(仅 Thelen) Af 为力-速度曲线形状因子,默认 0.25;Flen 为最大离心(拉长)力与最大等长力之比,默认 1.4。
🛠️ 如何在 XML 中手动添加新肌肉 (Muscle)?
▼
肌肉属于 <ForceSet>。注意路径点需指定 socket_parent_frame。
<!-- 放入 <ForceSet><objects> 内;参数取 OpenSim Thelen2003Muscle 默认值,与下方参数指南一致 -->
<Thelen2003Muscle name="new_muscle">
<appliesForce>true</appliesForce>
<max_isometric_force>1000</max_isometric_force> <!-- N -->
<optimal_fiber_length>0.1</optimal_fiber_length> <!-- m -->
<tendon_slack_length>0.2</tendon_slack_length> <!-- m -->
<pennation_angle_at_optimal>0</pennation_angle_at_optimal> <!-- rad -->
<max_contraction_velocity>10</max_contraction_velocity> <!-- 最佳纤维长度/秒 -->
<activation_time_constant>0.015</activation_time_constant>
<deactivation_time_constant>0.05</deactivation_time_constant>
<FmaxTendonStrain>0.04</FmaxTendonStrain>
<FmaxMuscleStrain>0.6</FmaxMuscleStrain>
<KshapeActive>0.45</KshapeActive>
<KshapePassive>5</KshapePassive>
<Af>0.25</Af>
<Flen>1.4</Flen>
<GeometryPath name="path">
<PathPointSet>
<objects>
<PathPoint name="new_muscle-P1">
<socket_parent_frame>/bodyset/pelvis</socket_parent_frame>
<location>-0.05 -0.05 0.08</location>
</PathPoint>
<PathPoint name="new_muscle-P2">
<socket_parent_frame>/bodyset/femur_r</socket_parent_frame>
<location>0.02 -0.2 0.03</location>
</PathPoint>
</objects>
</PathPointSet>
<!-- 可选:绕行包裹体(WrapObject 须已定义在某个 Body 的 WrapObjectSet 中)
<PathWrapSet><objects>
<PathWrap name="new_muscle-wrap"><wrap_object>WrapName</wrap_object></PathWrap>
</objects></PathWrapSet> -->
<Appearance>
<color>0.8 0.1 0.1</color>
</Appearance>
</GeometryPath>
</Thelen2003Muscle>
工具箱(该区域的功能处于测试中)
⚙️ 配置文件同步
根据当前模型生成 RRA/CMC 执行器与跟踪任务模板(RRA_Actuators、RRA_Tasks、CMC_Actuators(SO 可用)、CMC_Tasks);或按模型清理已有配置中失效的坐标/节段引用
📊 实验数据坐标转换
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] 等待操作...