OpenSim教程二——OpenSim的人体建模理论_意大利铭哥的博客-程序员宅基地

技术标签: OpenSim  生物力学  仿真建模与分析  

概述

国内用于人体运动仿真的软件主要有LifeMOD、AnyBody、ANSYS等,这些软件有自身的缺点,如肌肉控制不精确、价钱昂贵等。为了更好地解决人体运动仿真问题,斯坦福大学研发了OpenSim,它是一款应用于人体肌肉骨骼模型开发、模拟仿真和运动分析的开源免费软件。本文以计算机建模和数学理论推导为基础,对OpenSim的建模理论和仿真步骤作详细介绍,为国内从事生物力学及相关研究的学者提供一些参考。
OpenSim的人体建模理论主要来源于Hill方程和Hill肌肉三元素模型。整个模拟过程主要由模型缩放(scaling)、逆向运动学(inverse kinematics, IK)、残差缩减(residual reduction algorithm, RRA)和肌肉计算控制(computed muscle control, CMC)四步组成,如下图所示。
simulation steps

模型缩放

OpenSim常采用某一个人的身高、体重数据以及肌肉特征数据建立通用模型,要得到个体化的模型就需要对通用模型进行缩放。模型缩放以实验室测试标记点数据为依据,根据实验数据与通用模型中人体环节点之间的比例,对各环节的长度和质量进行缩放。在缩放过程中,用最小二乘法控制实验中标记点与模型中理论点之间的误差。

逆向运动学

运动学是不考虑产生动作的力和力矩的情况下对运动的研究。所以在做运动学分析(比如逆运动学)时,不需要知道物体的质量和惯性。逆运动学的目标是找到能最好复现特定物体实验运动学的模型关节角度。这里逆运动学工具用到的实验运动学是基于实验标记点的。
逆运动学遍历动作的每个时间步,或每一帧,然后计算一组关节角度能让模型“最好地”匹配实验运动学。OpenSim通过解决最小化标记误差的带权最小二乘优化问题来找到“最佳匹配”。
标记误差被定义为实验标记点与对应虚拟标记点之间的距离。每个标记点有一个权值,表示该标记误差项在最小二乘问题当中最小化的程度。在每一帧中,逆运动学工具找到一个广义坐标向量(比如关节角度),q,最小化标记点误差的加权和,表示为:
min ⁡ q [ ∑ i ∈ m a k e r s w i ∥ x i e x p − x i ( q ) ∥ 2 ] \min_q\left[\sum_{i \in makers}w_i\Vert x_i^{exp} -x_i(\mathbf q)\Vert^2\right] minq[imakerswixiexpxi(q)2]

其中 x i e x p x_i^{exp} xiexp是实验标记点 i i i的位置, x i ( q ) x_i (q) xi(q)是对应虚拟标记点 i i i(取决于q)的位置, w i w_i wi是标记点 i i i对应的权重。

肌肉计算控制

肌肉计算控制(Computed Muscle Control, CMC)的目的是计算一组肌肉兴奋点,使动态肌肉骨骼模型追踪在给定外部施力下的期望动作,它通过比例微分(PD)控制和静态优化的组合实现。
在执行CMC算法之前,先计算模型的初始状态。初始状态包括广义坐标(关节角度)、广义速度(关节角加速度)和肌肉状态(如肌肉活性度和纤维长度)。广义坐标和速度的值可以从定义的期望动作中获取,而肌肉状态的初始值通常是不知道的。为了计算可用的初始肌肉状态,CMC在期望动作的前0.03秒开始执行。因为肌肉状态通常是不均衡的,且肌肉力在初始时间间隔中会显著变化,所以在这个时间间隔中的仿真通常不准确,为此我们要保证CMC至少得提前0.03秒开始。
CMC

残差缩减

残差缩减(Residual Reduction)是一个正向运动学仿真的形式,它用追踪控制器来追踪逆运动学产生的模型运动学。CMC作为控制器,在没有肌肉的情况下,模型的骨架能用来生成与地面反作用力一致的质量分布和关节运动学。
RRA
残差缩减主要用于如行走和跑步等与地面接触并受到地面反坐作用力的运动。这里我们用步态模型gait2354_simbody.osim举例,它包含10个刚体结构(骨头),23个广义坐标,其中的17个(自由度)表示关节转动的角度,每个自由度由扭矩致动器驱动,剩下的6个广义坐标表示模型骨盆与地面间的6个自由度(3个平移,3个旋转)。为了模拟行走,我们需要表示模型如何推动自身相对于地面向前运动。我们把这骨盆与地面间的6个自由度表示成一个6自由度的关节,每个自由度由自己的扭矩致动器驱动。每一个致动器叫做一个残差驱动器(residual actuator)。所以我们的模型一共有23个自由度和23个驱动器,其中驱动骨盆与地面之间3个平移自由度的力叫做剩余力,用 F x F_x Fx F y F_y Fy F z F_z Fz表示。三个旋转自由度由剩余扭矩(或力矩)驱动,用 M x M_x Mx, M y M_y My M z M_z Mz表示。
通常,模型假设(比如没有胳膊)、噪声和其他动作捕获的误差会导致动态不一致性。本质上,地面反作用力和从标记点估计的加速度满足牛顿第二定律
F = m a F=ma F=ma
粗略来说,6个残余量相当于在等式左边加了一个力,从而导致不一致性:
F + F r e s i d u a l = m a F+F_{residual}=ma F+Fresidual=ma
如果地面反作用力测试和模型都没有误差, F r e s i d u a l F_{residual} Fresidual的理论值是0,但误差不可避免,只能通过轨迹优化和环节质量调整等方法来减少。一般认为力的最大残差在0-10N为好,力矩残差在0-50N·m为好。

总结

OpenSim以肌肉形态参数为基础建立通用人体肌肉骨骼模型,我们可以通过实验室测得的实验数据对通用模型进行缩放,从而建立符合个体特征的个性化模型;接着通过逆向运动学求解,使建立的模型与人体实际情况最佳匹配;然后通过RRA方法把外部力,即地面反作用力与人体惯性参数相结合,把逆向动力学计算时的误差控制到最小;最后通过CMC改变肌肉参数,得到模拟仿真结果。
由于OpenSim具有对肌肉形态参数控制精细、计算误差小、计算速度快等特点,越来越多地被应用在神经肌肉性疾病病因分析、动作的神经肌肉控制策略研究等方面,也日益受到生物力学专家和学者的关注。

参考资料

【1】宋和胜, 钱竞光, 唐潇. 基于软件OpenSim的人体运动建模理论及其应用领域概述[J]. 医用生物力学, 2015, 30(4):373-379.
【2】黄磊. 基于OpenSim的人体下肢与康复机器人耦合仿真[D]. 天津大学, 2015.
【3】官方Examples and Tutorials

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/lrm15659833890/article/details/78059468

智能推荐

剑桥大学等提出MAGIC,一个即插即用、无需训练的图像-文本生成框架_PaperWeekly的博客-程序员宅基地

作者 | 苏熠暄单位 | 剑桥大学研究方向 | 文本生成和表征学习本文提出了一个全新的 MAGIC (iMAge-guided text GeneratIon with CLIP) 框架。该框架可以使用图片模态的信息指导预训练语言模型完成一系列跨模态生成任务,例如 image captioning 和 visually grounded story generation...

走亲访友不慌!手把手教你怎样用Mask R-CNN和Python做一个抢车位神器_IT派的博客-程序员宅基地

现在大家都忙着过大年,按照传统习俗,各种走亲访友。这时候的商场、饭馆也都是“人声鼎沸”,毕竟走亲戚串门必不可少要带点礼品、聚餐喝茶。热闹归热闹,这个时候最难的问题可能就是...

Java 利用 svnKit 操作SVN 【获取所有文件夹、添加文件、文件下载】_java获取svn目录_WinterChen的博客的博客-程序员宅基地

又遇到了一个功能点,网上的参考内容挺少的,终于把功能实现了,记一下,方便以后遇到坑的时候看看主要功能点获取一个SVN目录中的所有子文件夹以及文件 可以利用参数控制是否进行递归获取所有的文件夹中的子类可以利用参数控制获取的是文件还是文件夹通过输出流下载SVN中的文件为SVN中添加目录将不同级别的目录中的文件目录(内含子类)copy到一个指定的文件夹中功能实现..._java获取svn目录

Netty整合protobuf解决多message的多协议实现的项目演示_protobuf 多个message_唉.的博客-程序员宅基地

上一篇文章已经实现了通过Netty整合protobuf进行简单的客户端给服务端发消息,功能上来说protobuf确实不太能看出有其他业务能力,但是性能上来说确实是提升了很多毕竟主要作用是序列化后和反序列化。但是一个问题是如果.proto里面有多个message,那么方法内该如何识别传输/接收哪个message属性呢???接下来说一下解决这个问题的步骤:可以将多个message放在外部,然后一个主..._protobuf 多个message

OVN IPsec指南_ovn使用手册_redwingz的博客-程序员宅基地

本文档提供了一个步骤指南,描述在Open Virtual Network (OVN)中使用IPSec加密隧道流量。OVN隧道流量由物理路由器和交换机传输。这些物理设备可能不受信任(公共网络中的设备)或可能受到危害。为隧道流量启用IPSec加密可以阻止流量数据被监控和操纵。有关OVN IPsec设计的更多详细信息,请参见ovn-architecture(7)手册页。本文档假设OVN安装在你的系统中..._ovn使用手册

哲学家进餐问题的三种解决方法(C++11)_凌桓丶的博客-程序员宅基地

文章目录哲学家进餐问题方法一:当两边的叉子都可用时才拿方法二:限制就餐的哲学家数量方法三:奇数先左后右,偶数先右后左哲学家进餐问题方法一:当两边的叉子都可用时才拿方法二:限制就餐的哲学家数量方法三:奇数先左后右,偶数先右后左..._哲学家进餐问题

随便推点

Mysql8.0密码忘了怎么办?集百家之大成,亲测有效!_mysql8.0.32密码是多少_Janet_fan的博客-程序员宅基地

Mysql8.0改密码步骤准备开始吧,Let's go1.安装MySql2.初始化, 获取密码3.启动Mysql4.输入密码5.修改密码6.查看数据库生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入准备开始吧,Let..._mysql8.0.32密码是多少

HDU 3681 Prison Break(BFS+二分+状态压缩DP)__bubble的博客-程序员宅基地

用BFS处理每个点之间的距离,二分答案,用状态DP判断是否能够可以。dp[i][j]表示当前位于i点已经遍历集合j时的最大能量值。#include #include #include #include #include #include #include #include using namespace std;typedef long long LL;const in

小程序 雷达图_℡╮荆棘鸟゛的博客-程序员宅基地

有些数据不需要可以不填 如region、text、score直接写入可能不能直接运行 需要自己看着改下 把不需要得数据删了//初始化数据// var numCount = 5; //元素个数var sys = wx.getSystemInfoSync();var windowWidth = sys.windowWidth;var numSlot = 4; //一条线上的总节点数var...

第3章 shell结构化命令------------(C式的for循环)_chonghe1987的博客-程序员宅基地

3.4.2 读取变量与读取命令 Shell脚本中经常发生的是积累了存储于变量中的一个值列表,然后需要通过列表迭代。代码可以使用另一种赋值语句向包含在变量中大已存在列表添加(或连接)一条项目。 生成列表中使用的值的另一种方法是使用命令的输出。可以使用反引号..._shell c格式for 循环

Matlab常见问题之 浮点数精度问题_matlab可以控制intersect的精度吗_CarnivoreRabbit的博客-程序员宅基地

Matlab 常见问题之浮点数的精度问题_matlab可以控制intersect的精度吗

HDU1007Quoit Design(最小点对)_quoitdesign(hdu1007)_猪猪奋斗记的博客-程序员宅基地

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1007求所有点中最近两点的距离的一半;zui_quoitdesign(hdu1007)

推荐文章

热门文章

相关标签