使用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
相关产品推荐
相关产品推荐

