pydrake- 将 IiwaCommandSender 连接到 LcmPublisherSystem 时出错

pydrake- Error when connecting IiwaCommandSender to LcmPublisherSystem

我的程序中有以下几行-

lcm = DrakeLcm() 

lcm_command_sender = builder.AddSystem(IiwaCommandSender())

lcm_publisher = builder.AddSystem(LcmPublisherSystem.Make(channel="IIWA_COMMAND", lcm_type=lcmt_iiwa_command, lcm=lcm, publish_period=0.01))

//Connect controller to command sender
builder.Connect(controller.GetOutputPort("joint_positions"), lcm_command_sender.get_position_input_port())

//Connect lcm command sender to publisher
builder.Connect(lcm_command_sender.GetOutputPort("lcmt_iiwa_command"), lcm_publisher.get_input_port())

在 运行 之后,最后一行给出了以下运行时错误-

RuntimeError: DiagramBuilder::Connect: Mismatched value types while connecting output port lcmt_iiwa_command of System lcm_command_sender (type drake::lcmt_iiwa_command) to input port lcm_message of System LcmPublisherSystem(IIWA_COMMAND) (type drake::pydrake::Object)

我不知道为什么会这样,因为文档中明确说 IiwaCommandSender 的输出端口应该连接到 LcmPublisherSystem 的输入端口,并且它们都是这种类型AbstractValue。我错过了什么?

在上面的代码中,IiwaCommandSender 的输出端口是“drake::lcmt_iiwa_command”类型(一个 C++ class 包装在 Python 中),但是输入端口LcmPublisherSystem 的类型为“drake.lcmt_iiwa_command”(Python class)。这是两种不同的运行时类型,尽管它们都表示 LCM 消息。

在这种情况下,调用LcmPublisherSystem.Make时应设置use_cpp_serializer=True,使输入端口为C++类型,而不是Python类型。

https://drake.mit.edu/pydrake/pydrake.systems.lcm.html#pydrake.systems.lcm.LcmPublisherSystem.Make