在 Drake 中模拟 MultiBodyPlant 时可以绕过 SpatialInertia 吗?
Can SpatialInertia be bypassed when simulating a MultiBodyPlant in Drake?
我正在尝试使用 Drake 来模拟水下操纵器。在水下的一个重要因素是,除了机械手方程中的刚体质量项之外,还有一个附加的质量项。从 CalcInverseDynamics() 函数文档中,运动树的逆动力学方程为:
tau = M(q)v' + C(q, v)v - tau_app - 总和(施加的空间力)
要包括增加的质量,这应该变成:
tau = (M(q)+AM(q))v' + C(q, v)v - tau_app - 总和(施加的空间力)
其中 AM(q) 是依赖于配置的附加质量。我之前使用 Newton-Euler 递归方法通过在每个 link 的空间惯性矩阵中包含“附加质量”来求解逆动力学。然而,正如在上一个问题 () 中所讨论的,增加的质量会产生一个空间惯性,其质量子矩阵具有三个不同的质量而不是一个均匀的质量([m1 m2 m3] 的对角线而不是 [m m m]) ,因此不能由 Drake 中的 SpatialInertia 对象表示。
我现在的后续问题是,在 Drake 的框架内是否可以在没有 SpatialInertia 对象的情况下对运动树执行反向和正向动力学,或者以某种方式使用 ArticulatedBodyInertias 代替? 在之前的 post 中有人建议 ArticulatedBodyInertia 可以表示具有附加质量的空间惯性,但我不清楚它如何用于 forward/inverse 动力学和模拟。
从阅读源代码(我对 C++ 的理解非常有限)来看,SpatialInertia 似乎是多体植物的正向和反向动态函数以及模拟的基本构建块。
我应该学习 C++,但现在我正在使用 Drake 的 Python 绑定,并且不愿意大量修改 Drake C++ 代码。
提前感谢您对此事的任何想法。
不幸的是,简短的回答是否定的,你不能那样做。
但是,如果您告诉我们有关此问题的更多信息,我们可以帮助您。据我所知,我们的 SpatialInertia 对象的最大假设是在引擎盖下它们导致 SPD 6x6 矩阵。如果你的新惯性包括虚拟质量项有这个 属性,我不明白为什么我们不能为这种建模打开大门。从 我看到你只需要在每个方向上有不同的质量值。我相信只要我们“添加”到原始惯性,就很容易证明它应该保持 SPD。
长话短说,你能告诉我们更多关于这个新的 6x6 物体的数学特性吗?
奇思妙想
您可以将虚拟质量建模为植物上的外力。但是,由于这种外力取决于加速度,因此您不可避免地会创建一个 Drake 无法解析的代数环。
快速而肮脏的解决方案是在虚拟质量系统块和工厂之间添加一个短暂的延迟。如果延迟明显小于问题的时间尺度,那么你会没事的,Drake 集成商会轻而易举地工作。
实现此目的的一种方法是在 MBP 计算的加速度(您可以使用 get_body_spatial_accelerations_output_port()
访问它们)和计算流体动力的系统块之间添加一个 FirstOrderLowPassFilter
。由于 FirstOrderLowPassFilter
有状态,如果您将依赖于空间加速度的流体动力直接连接到 MBP 的输入,就会破坏直接馈通。
您需要选择滤波器的时间常数 tau。您可以通过考虑您不关心的高于 1/tau 的频率来选择时间常数(此处的 lil Bode 分析将引导您朝着正确的方向前进)。
总结一下,这是我对你的图的 ASCII 草图的错误尝试:
┌───────────────────┐
│ │
applied_spatial_force │ │ body_spatial_accelerations
┌─────►│ MultibodyPlant ├────────────────────────┐
│ │ │ │
│ │ │ │
│ └───────────────────┘ ┌───────────────┴─────────────────┐
│ │ │
│ │ SpatialAccelerationToBasicVector│
│ │ │
│ └───────────────┬─────────────────┘
│ │
│ ┌─────────────┐ ┌──────────────┐ │
│ │ │ │ │ │
└────┤ HydroForces │◄──────┤ LowPassFilter├─────────┘
│ │ │ │
└─────────────┘ └──────────────┘
您需要自己编写 SpatialAccelerationBasicVector 以将 MBP 输出的内容 (SpatialAccleration) 转换为 LowPassFilter 消耗的内容 (BasicVector)。
我正在尝试使用 Drake 来模拟水下操纵器。在水下的一个重要因素是,除了机械手方程中的刚体质量项之外,还有一个附加的质量项。从 CalcInverseDynamics() 函数文档中,运动树的逆动力学方程为:
tau = M(q)v' + C(q, v)v - tau_app - 总和(施加的空间力)
要包括增加的质量,这应该变成:
tau = (M(q)+AM(q))v' + C(q, v)v - tau_app - 总和(施加的空间力)
其中 AM(q) 是依赖于配置的附加质量。我之前使用 Newton-Euler 递归方法通过在每个 link 的空间惯性矩阵中包含“附加质量”来求解逆动力学。然而,正如在上一个问题 (
我现在的后续问题是,在 Drake 的框架内是否可以在没有 SpatialInertia 对象的情况下对运动树执行反向和正向动力学,或者以某种方式使用 ArticulatedBodyInertias 代替? 在之前的 post 中有人建议 ArticulatedBodyInertia 可以表示具有附加质量的空间惯性,但我不清楚它如何用于 forward/inverse 动力学和模拟。
从阅读源代码(我对 C++ 的理解非常有限)来看,SpatialInertia 似乎是多体植物的正向和反向动态函数以及模拟的基本构建块。
我应该学习 C++,但现在我正在使用 Drake 的 Python 绑定,并且不愿意大量修改 Drake C++ 代码。
提前感谢您对此事的任何想法。
不幸的是,简短的回答是否定的,你不能那样做。
但是,如果您告诉我们有关此问题的更多信息,我们可以帮助您。据我所知,我们的 SpatialInertia 对象的最大假设是在引擎盖下它们导致 SPD 6x6 矩阵。如果你的新惯性包括虚拟质量项有这个 属性,我不明白为什么我们不能为这种建模打开大门。从
长话短说,你能告诉我们更多关于这个新的 6x6 物体的数学特性吗?
奇思妙想
您可以将虚拟质量建模为植物上的外力。但是,由于这种外力取决于加速度,因此您不可避免地会创建一个 Drake 无法解析的代数环。 快速而肮脏的解决方案是在虚拟质量系统块和工厂之间添加一个短暂的延迟。如果延迟明显小于问题的时间尺度,那么你会没事的,Drake 集成商会轻而易举地工作。
实现此目的的一种方法是在 MBP 计算的加速度(您可以使用 get_body_spatial_accelerations_output_port()
访问它们)和计算流体动力的系统块之间添加一个 FirstOrderLowPassFilter
。由于 FirstOrderLowPassFilter
有状态,如果您将依赖于空间加速度的流体动力直接连接到 MBP 的输入,就会破坏直接馈通。
您需要选择滤波器的时间常数 tau。您可以通过考虑您不关心的高于 1/tau 的频率来选择时间常数(此处的 lil Bode 分析将引导您朝着正确的方向前进)。
总结一下,这是我对你的图的 ASCII 草图的错误尝试:
┌───────────────────┐ │ │ applied_spatial_force │ │ body_spatial_accelerations ┌─────►│ MultibodyPlant ├────────────────────────┐ │ │ │ │ │ │ │ │ │ └───────────────────┘ ┌───────────────┴─────────────────┐ │ │ │ │ │ SpatialAccelerationToBasicVector│ │ │ │ │ └───────────────┬─────────────────┘ │ │ │ ┌─────────────┐ ┌──────────────┐ │ │ │ │ │ │ │ └────┤ HydroForces │◄──────┤ LowPassFilter├─────────┘ │ │ │ │ └─────────────┘ └──────────────┘
您需要自己编写 SpatialAccelerationBasicVector 以将 MBP 输出的内容 (SpatialAccleration) 转换为 LowPassFilter 消耗的内容 (BasicVector)。