You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Drake Python绑定调用GetForceInWorld获取力始终为零的问题

问题分析与解决方案

你遇到的问题是因为MultibodyForces对象只是一个空容器,没有被填充任何力数据。GetForceInWorld方法是从这个容器中读取对应刚体的力,而非实时计算当前作用在刚体上的力。

解决步骤

在调用GetForceInWorld之前,必须先调用plant.CalcForceElementsContribution(),该函数会计算所有力元素(包括接触力、外施力等)并将数据填充到MultibodyForces对象中。

修正后的回调函数

def callback(self, root_context):
    nut = self._plant.GetBodyByName("nut")
    nut_context = self._plant.GetMyContextFromRoot(root_context)
    # 计算所有力元素并填充到_all_forces容器
    self._plant.CalcForceElementsContribution(nut_context, self._all_forces)
    self.add_data(root_context.get_time(),
                  nut.EvalPoseInWorld(nut_context),
                  nut.EvalSpatialVelocityInWorld(nut_context),
                  nut.EvalSpatialAccelerationInWorld(nut_context),
                  nut.GetForceInWorld(nut_context, self._all_forces))
    return EventStatus.DidNothing()

补充说明

  • 你之前初始化self._all_forces的方式是正确的,该对象可以在多次回调中重复使用,无需每次重新创建。
  • CalcForceElementsContribution会处理所有类型的力:包括接触力、通过ExternallyAppliedSpatialForce施加的外力、关节力等,因此修正后两种场景下的力都能被正确记录。
  • 加速度和速度能正常获取是因为它们属于仿真状态的一部分,直接存储在context中,无需额外计算;而力需要主动计算并填充到容器后才能读取。

内容的提问来源于stack exchange,提问作者Dmitri K

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 04:45:35