opensim初级教程静态优化例

时间:2024-03-17 08:34:45

例子——静态优化

综述

静态优化是一种估计满足所给运动的位置、速度、加速度以及外部力(如地面反作用力)

时,muscle activations与肌肉力的方法之所以称为静态优化,是因为每一帧(或步)独立计算,不需要把每一步运动的运动方程联立求解。由于不需要联立方程求解,计算速度快,效率高,但他计算要考虑 activation dynamics 和肌腱顺应性

本例将在简化的示例模型(gait10dof18musc)中评估腓肠肌产生的muscle activations和肌肉力,告诉我们如何进行单步实验静态优化分析。

像其他任何分析、仿真一样,静态优化结果很大程度取决于输入:模型、运动和力。模型要反映质量、几何尺寸、实验参与者的strength(?),同时*度数、肌肉几何结构要与所研究的问题相对应。运动应该包含平滑、真实的加速度,准确测量运动过程中的所有外力(如地面反作用力)并应用在模型中。添加的附加力(如备用力和残余力)应该足够小,以免扰乱分析。输入的任何问题都可能带来不良的结果或导致分析失败。

许多用户遇到过这些问题,所以本例将:

1. 在没有错误消息或崩溃的情况下,运行初始静态优化分析

2. 使用改进的运动数据来提高muscle activations和肌肉力结果

3. 了解如何减少储备和剩余执行器的驱动(即减小附加力,备用力和残余力)

4. 添加被动力并观察其对肌肉活化(activation)的影响

Actuation动作  activation**,活化

准备工作

1)在完成教程之前,确保您已经从用户指南中查看了以下阅读资料,并完成了相应的教程。

2)您必须安装OpenSIM版本3.3

3)在文件夹StaticOptimizationExample中找到模型、安装程序和数据文件。该文件夹包含缩放模型、外力、运动(来自逆运动学分析)、模板驱动文件以及RRA的结果。

教程开始于模型缩放、逆运动学运行和残差减少分析的工作流程。本教程分为以下四个研究:

研究1:静态优化失败!

研究2:改进输入运动学

研究3:调整储备和剩余执行器

研究4:被动元件的静态优化

study1:静态优化失败!

study1中,首先加载模型,创建安装文件,并进行静态优化。然后,将学习如何调整欠驱动模型。

文件夹StaticOptimizationExample中包含的模型是一个简化的缩放过的步态模型,只有6个*度,集总肌群(例如,腓肠肌内侧肌和腓肠肌外侧肌复合成腓肠肌)。

静态优化的三个输入:(i)模型,(ii)所研究的运动(iii)任何外力(例如,地面反作用力)。静态优化使用GUI中的当前模型,因此只需要输入运动和任何外力。

注意设置:Leavethe Filter Coordinates box unchecked (we'll come back to this in Study 2).静态优化时,将对输入运动的每个时间帧/步进行分析。在每一步,更新模型坐标、外部载荷,并计算产生模型加速度所需的肌肉力和activations

message窗口可以查看分析详情。

opensim初级教程静态优化例

在这样的配置下,message窗口会显示“optimizer failed…”来提示你优化器在指定的时间内找不到合适的解决方案。静态优化是计算模型产生加速度的activation和力。出现这个问题是由于模型不能提供足够的力来产生加速度。静态优化工具已经产生了一组结果来帮助排除故障,但是这些输出无效。

肌肉不足以产生所需的力,model coordinates不具有任何驱动(如肌肉或其他执行器)都会导致模型欠驱动。在本例模型中,由于没有控制腰部屈曲/伸展的肌肉,所以所有其他的下部肌肉都试图控制躯干运动,虽然没有太大的成功

可以增加额外的肌肉来穿过腰椎关节,然而,在这一系列的研究中,我们只关注腓肠肌在行走过程中的activation。添加额外的肌肉将增加模型的复杂性,而且也不是分析所需要的。代替腰部肌肉,我们将在腰椎关节处增加扭矩致动器(actuators

我们还将在模型上增加备用和残余致动器。备用致动器可以在肌肉无法产生足够的加速度(例如,在加速中的尖峰)的步态循环的部分时候提供额外的致动力。残余致动器是“hand of god”力,它解释模型、测量的运动和力之间的差异(应该是小的),确保整个分析过程中的f= mA

备用和残余致动器加上一个扭矩致动器来控制腰椎伸展*度

区别:Append to model's force set:保留肌肉同时加上致动器

replace to model's force set:删除肌肉同时加上致动器

opensim初级教程静态优化例opensim初级教程静态优化例opensim初级教程静态优化例opensim初级教程静态优化例

 

我们现在有一个正常工作静态优化分析。能算出结果并不意味着结果是有效的;相反,我们有一个地方开始迭代以改进输出。在下面的研究中,我们将逐步提高输入的质量,以获得更好的结果。回顾下面的问题,以更好地理解当前的结果集的问题。

 

Study2:改进输入运动学

研究2的目的是评估改善的输入运动数据如何影响静态优化输出Muscle activationforce静态优化是试图计算产生输入运动中的加速度所需的肌肉力。如果这些加速度是杂乱,在肌肉**和力中会有噪声。在研究1中,我们看到,杂乱的运动数据很可能求解出杂乱的Muscle activationforce。我们将研究两种改善运动数据的方法:(i)输入运动学滤波(ii)使用残差缩减算法(RRA)来平滑运动。

输入运动学滤波会对运动数据进行样条拟合,过滤掉坐标位置,加速度降噪。如果使用IK结果作为静态优化的输入,则应始终在外部(例如,用MatlabPython)或使用OpenSIM筛选器对IK结果进行过滤。

由于使用残差缩减算法(RRA)来实现正向动力学仿真(模型的运动方程 integrated forward in time),输出运动学结果是连续的加速度,适用于静态优化。使用残差缩减算法(RRA)结果作为运动输入,不需要再过滤数据。使用RRA还具有产生一个更“动态一致”的模型和一组运动学和力的处。

opensim初级教程静态优化例opensim初级教程静态优化例

 

Study3: 调整储备和剩余执行器

在研究1中,我们添加了致动器来辅助模型的每个coordinate。然而,我们看到备用致动器贡献了大量的扭矩,尽管我们更希望这部分力矩是由肌肉提供的。在这项研究中,您将减少备用致动器的强度,并观察到备用致动器扭矩和腓肠肌activationforce的结果变化。

当前致动器文件设置:对于每个coordinate致动器具有最佳力100 N。当试图最小化**平方和时,优化器可以使用小的activation值来生成大的力。在这种情况下(最佳力=100),0.5的**将产生50 N的力。如果我们将最佳力改变为1,那么优化器现在必须使用非常高的**来产生任何有意义的力。在这种情况下(最佳力=1),0.5的**只产生0.5 N。因此,当最佳力非常小(小于1N)时,优化器在选用备用致动器是不经济的(最佳力小,所需的**就很大)

研究4:被动元件的静态优化

在这项研究中,你将增加脚踝弹簧模型,并观察对腓肠肌activation的影响。只有OpenSIM版本3.3静态优化可以正确处理被动力的使用,所以确保使用3.3或更高版本的软件。

添加脚踝弹簧,在scriptingshell

# Get a handle to the current model andcreate a new copy

baseModel = getCurrentModel()

ankleSpringModel = baseModel.clone()

ankleSpringModel.setName(baseModel.getName()+'_ankle_spring')

 

# Create the spring we'll add to the model(a CoordinateLimitForce in OpenSim)

ankleSpring =modeling.CoordinateLimitForce()

 

# Set the coordinate for the spring

ankleSpring.set_coordinate('ankle_angle_r')

ankleSpring.setName('AnkleLimitSpringDamper')

 

# Add the spring to the model

ankleSpringModel.addForce(ankleSpring)

 

# Load the model in the GUI

loadModel(ankleSpringModel)

 

# Set the spring's properties

ankleSpring.setUpperStiffness(10.0)

ankleSpring.setUpperLimit(5.0)

ankleSpring.setLowerStiffness(1.0)

ankleSpring.setLowerLimit(-90.0)

ankleSpring.setDamping(0.01)

ankleSpring.setTransition(2.0)

 

# Save the model to file

fullPathName = baseModel.getInputFileName()

newName = fullPathName.replace('.osim','_spring.osim')

ankleSpringModel.print(newName)

 

opensim初级教程静态优化例opensim初级教程静态优化例