pydrake中builder.Connect()报错“无法将Python实例转换为C++类型”排查
问题原因分析
你遇到的类型转换错误,核心是输出端口和输入端口的抽象值类型不匹配——尽管打印端口时显示的模板参数都是float,但底层的抽象值容器类型存在差异:
- 输出端口:使用
alloc=SpatialForce时,Drake会自动将其包装为Value[SpatialForce]类型的抽象值(Value是Drake对具体类型的通用包装器)。 - 输入端口:
AbstractValue.Make(SpatialForce())创建的是AbstractValue的直接实例,其底层存储SpatialForce,但容器类型是AbstractValue而非Value[SpatialForce]。
Drake的端口连接要求两端的抽象值类型严格一致,这种容器类型的差异导致了C++类型转换失败。
解决方案
修正任意一端的端口声明,让两边的抽象值容器类型匹配即可,两种可选方式:
方式1:调整输出端口的alloc参数
将输出端口的alloc改为返回AbstractValue.Make(SpatialForce())的lambda,确保和输入端口类型一致:
producer.DeclareAbstractOutputPort("output", alloc=lambda: AbstractValue.Make(SpatialForce()), calc=fake_calc)
方式2:调整输入端口的model_value参数
将输入端口的model_value改为Value[SpatialForce](),匹配输出端口的Value容器类型:
consumer.DeclareAbstractInputPort("input", model_value=Value[SpatialForce]())
内容的提问来源于stack exchange,提问作者Eric Cousineau
相关产品推荐
相关产品推荐

