Moco求解最优化问题使用教程

理论部分

最简单的例子,流程

输出结果分析

理论部分

moco最终是调用CasAdi求解器来进行求解

对不常见的几个符号表达式含义进行解释:

多刚体动力学公式代表系统中,f_inertial (惯性力和科里奥利力);f_app (外力和接触力);λ在机器人中其实就是外部接触力,此处称作拉格朗日乘子λ,用于在求解包含约束的动力学问题时,找到满足所有约束条件的广义约束力,;辅助动力学 (Auxiliary Dynamics)指从关节到肌肉求解过程中,包含了肌肉激活动力学与肌腱顺应性模型(muscle activation dynamics and tendon compliance);位置级(全约束)运动学约束 (Position-level (Holonomic) Kinematic Constraints),p位置,q速度;运动学约束雅可比矩阵 (Kinematic Constraint Jacobian G),一般用J表示;

路径约束,g: 表示代数路径约束的函数,与边界约束不同,路径约束在整个运动路径上都是有效的,而不仅仅是在特定的时间点或状态点上;Cost中,含有初始和最终时间t,初始和最终状态y,控制输入x,运动学约束乘子(用于计算关节力),时间不变参数(如物理常数、系统参数等)p,积分项 (Integral Terms)Sc,j 和 Sb,k,Sc,j表示控制输入的平方积分(评估控制量),Sb,k可能表示与边界约束违反程度相关的积分项;

边界约束与路径约束的区分:路径约束函数包含t,是动态变化的,更加复杂,与系统的当前状态、历史状态和未来状态相关;边界约束是硬约束确保系统稳定性,路径约束可以被视为软性;

最简单的例子,流程

官方给出一个最简单的质点一维运动的实力,要求质量小球在规定的时间以规定的速度到达规定的最终位置。包含了,建模,问题配置,求解以及可视化整套流程,主要使用方法在注释中:

import os
import opensim as osim

# 加载模型
model = osim.Model()
# 模型名称
model.setName('sliding_mass')
# 设定重力,设置模型中的重力向量,9.81为竖直向下
model.set_gravity(osim.Vec3(9.81, 0, 0))
# 创建一个新的刚体对象,刚体名称是body,质量为2kg,刚体质心坐标(0,0,0),主惯性矩
Ixx = 2 * (0.5 * 2.0 * 0.1**2)  # 假设的x轴惯性矩  
Iyy = Ixx                 # 假设的y轴惯性矩,与x轴相同  
Izz = 0.5 * 2.0 * 0.1**2        # z轴(圆柱体中心轴)的惯性矩  
Ixy = 0                        # 无x-y平面内的不对称性  
Ixz = 0                        # 无x-z平面内的不对称性
Iyz = 0                        # 无y-z平面内的不对称性
body_inertia = osim.Inertia(Ixx, Iyy, Izz, Ixy, Ixz, Iyz)  
# body = osim.Body('body', 2.0, osim.Vec3(0), osim.Inertia(0))
#
body = osim.Body('body', 2.0, osim.Vec3(0,0,0), body_inertia)
# 将定义好的刚体添加到模型中
model.addComponent(body)

# 添加滑动关节,配置关节参数 Allows translation along x.
# 两个刚体之间沿着一个轴进行相对滑动。
# 指定关节的名称为slider、父刚体为getGround和子刚体(要连接的刚体)。
joint = osim.SliderJoint('slider', model.getGround(), body)
# 获取与关节相关联的坐标对象的引用
coord = joint.updCoordinate()
# 设置坐标的名称为position
coord.setName('position')
# 将定义好的关节添加到模型中
model.addComponent(joint)

# 添加致动元件,设置名称,
actu = osim.CoordinateActuator()
# 作用在关节坐标上
actu.setCoordinate(coord)
actu.setName('actuator')
# 肌肉或致动器在特定条件下能够产生的最大力量的一个参数
actu.setOptimalForce(1)
# 将定义好的致动元件添加到模型中
model.addComponent(actu)
# 将刚体的外形显示成0.05的一个球体
body.attachGeometry(osim.Sphere(0.05))
# 模型的所有组件(如骨骼、关节、肌肉、力等)都被添加到模型中之后调用
# 内部数据结构被初始化,准备进行模拟
model.finalizeConnections()

# 创建一个study对象
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值