如何获得将外力映射到广义力的矩阵?

How to get the matrix that maps external forces to generalized forces?

给定一个多体工厂,我需要找到将外力 lambda 转换为广义力的矩阵。 IE。以下等式中的 Phi(取自 Scott Kuindersma、Frank Permenter 和 Russ Tedrake 的 An Efficiently Solvable Quadratic Program for Stabilizing Dynamic Locomotion)。

我的猜测是,我需要先将相应的力添加到多体工厂中的相关物体中

left_foot_contact_force = plant.AddForceElement(plant.GetModelInstanceByName("l_foot"))
right_foot_contact_force = plant.AddForceElement(plant.GetModelInstanceByName("r_foot"))

但是,我不太确定如何继续获取矩阵 Phi。我怀疑我需要使用 CalcForceElementsContribution() 但不知道如何使用结果 MultibodyForce 来获得矩阵 Phi.

如果 λ 是在连接到物体 B 的点 Q 处施加的接触力,以世界坐标系表示,则该矩阵 Φ 是雅可比矩阵。您可以使用 CalcJacobianTranslationalVelocity as

计算雅可比矩阵
J = plant.CalcJacobianTranslationalVelocity(context, JacobianWrtVariable.kV, plant.GetBodyByName("l_foot"), p_BQ, plant.world_frame(), plant.world_frame())

其中p_BQ是Q点在脚架上测量和表示的位置

若λ为摩擦锥在Q点的边的权重(即接触力为f = ∑ᵢ λᵢeᵢ 其中eᵢ为摩擦锥在[=12=的第i条边) ],在世界坐标系中测量和表达),则矩阵 Φ 为 Φᵀ = Jᵀ*E 其中 E = [e₁, ..., eₘ] (即假设线性摩擦锥在点 [=12 处有 m 条边=],我们将这些摩擦锥边水平串联起来得到矩阵E).

这里我展示了如何计算单个点的 Φ。如果你有多个接触点,那么你可以分别计算每个点的 Φ,然后将它们连接在一起。