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

使用PiecewisePolynomial.FirstOrderHold遇SNOPT碰撞检测错误求助

解决Drake中Box-Box穿透查询的AutoDiffXd错误

核心原因

Drake的碰撞检测模块中,Box与Box的穿透查询(penetration query)不支持drake::AutoDiffXd标量类型。当DirectCollocation优化过程中(使用自动微分计算代价/约束导数)触发了这类碰撞检测,就会抛出该错误。仅初始+最终状态时正常,说明中间断点或轨迹插值后的状态存在碰撞,导致优化时执行了不支持的穿透计算。

排查与解决步骤

  • 检查所有断点对应的状态是否存在碰撞:
    手动验证每个断点的x[t]对应的机器人构型,确认是否有Box形状的连杆发生碰撞。如果某个断点本身就处于碰撞状态,优化过程中会尝试计算碰撞约束的导数,触发错误。
  • 禁用不必要的碰撞约束:
    如果你不需要碰撞避免约束,检查是否在DirectCollocation或场景图中意外启用了碰撞检测约束。可以通过RemoveCollisionPair或配置SceneGraph的碰撞过滤规则,关闭Box-Box之间的碰撞检测。
  • 替换碰撞查询类型:
    若必须保留碰撞约束,将Box形状替换为支持AutoDiffXd穿透查询的形状(比如Sphere、Capsule),或者改用距离查询(distance query)替代穿透查询——Drake对多数形状组合的距离查询支持AutoDiff,可通过MinimumDistanceConstraint来实现碰撞避免,而非依赖穿透检测。
  • 检查轨迹插值的影响:
    即使断点状态无碰撞,轨迹插值(比如DirectCollocation默认的分段多项式插值)可能在断点间生成碰撞状态。可以尝试:
    1. 增加断点数量,缩小插值区间,避免中间构型碰撞;
    2. 改用更保守的插值方式,或在相邻断点间添加碰撞约束。
  • 验证约束配置:
    确认是否误将碰撞相关约束(如PenetrationConstraint)添加到了DirectCollocation的约束列表中。这类约束在AutoDiff上下文下对Box-Box组合不兼容,需替换为MinimumDistanceConstraint。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 03:44:57