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轴指向前方。
原始数据(Old) -> 新数据(New)
New X=
New Y=
New Z=

🚀 MATLAB 批处理生成器

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

🔄 C3D 格式转换器

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