pydrake连接IiwaCommandSender与LcmPublisherSystem出现类型匹配错误求助
问题解决方法
你遗漏了LcmPublisherSystem.Make方法的use_cpp_serializer参数配置,导致Python绑定默认创建了适配Python侧LCM类型的发布器,和C实现的IiwaCommandSender输出的原生C LCM类型不匹配。
方案1:使用封装好的ConnectLcmPublisher工具(推荐)
pydrake提供了自动处理类型匹配的连接工具,直接替换你手动创建发布器+连接的两行代码即可:
from pydrake.systems.lcm import ConnectLcmPublisher # 直接完成发布器创建和端口连接,自动处理类型匹配 ConnectLcmPublisher( output_port=lcm_command_sender.GetOutputPort("lcmt_iiwa_command"), channel="IIWA_COMMAND", lcm=lcm, publish_period=0.01, builder=builder )
方案2:手动创建发布器时补充参数
如果你需要手动控制发布器的创建流程,只需要在原有LcmPublisherSystem.Make调用中添加use_cpp_serializer=True参数即可:
lcm_publisher = builder.AddSystem(LcmPublisherSystem.Make( channel="IIWA_COMMAND", lcm_type=lcmt_iiwa_command, lcm=lcm, publish_period=0.01, use_cpp_serializer=True # 新增该配置项 )) # 后续的连接代码不需要修改 builder.Connect(lcm_command_sender.GetOutputPort("lcmt_iiwa_command"), lcm_publisher.get_input_port())
原理解释
IiwaCommandSender是C实现的系统,输出端口的类型是原生C结构体drake::lcmt_iiwa_command封装的抽象值。默认情况下Python侧调用LcmPublisherSystem.Make会创建适配Python端LCM类型的发布器,输入端口类型为通用Python对象drake::pydrake::Object,因此触发类型不匹配错误。添加use_cpp_serializer=True后,发布器会使用C侧的序列化逻辑,输入端口类型适配原生C LCM结构体,即可正常连接。
内容的提问来源于stack exchange,提问作者mantaray
相关产品推荐
相关产品推荐

