Drake Visualizer Python绑定点云可视化类型不匹配问题咨询
你遇到的类型匹配问题是Drake 0.35版本Python绑定的已知限制:该版本没有将lcmt_point_cloud对应的C序列化器暴露到Python层,同时PointCloudToLcm系统输出的是C侧原生的lcmt_point_cloud类型,和LcmPublisherSystem默认使用的Python序列化器期待的Python LCM类实例类型不兼容,才会出现两级报错。
0.35版本下的兼容解决方案
替换内置的PointCloudToLcm为自定义Python转换系统,适配Python序列化器的类型要求即可,完整修改示例如下:
- 先实现自定义转换系统:
import numpy as np from pydrake.systems.framework import LeafSystem, AbstractValue # 确保你已经导入对应lcm类型 from drake import lcmt_point_cloud class PyPointCloudToLcm(LeafSystem): def __init__(self): super().__init__() # 声明输入为PointCloud类型 self.input_port = self.DeclareAbstractInputPort( "point_cloud", AbstractValue.Make(PointCloud()) ) # 声明输出为Python侧lcmt_point_cloud实例 self.output_port = self.DeclareAbstractOutputPort( "lcm_message", AbstractValue.Make(lcmt_point_cloud()), self._convert_callback ) def _convert_callback(self, context, output): cloud = self.input_port.Eval(context) msg = lcmt_point_cloud() msg.utime = int(context.get_time() * 1e6) msg.num_points = cloud.size() # 填充点坐标 points = cloud.xyzs().T.astype(np.float32) msg.points = [p.tolist() for p in points] # 存在颜色信息则同步填充 if cloud.has_rgbs(): rgbs = cloud.rgbs().T msg.rgb = [(int(r) << 16) | (int(g) << 8) | int(b) for r, g, b in rgbs] output.set_value(msg)
- 修改你原来的系统搭建代码:
# 替换原来的PointCloudToLcm point_cloud_to_lcm_point_cloud = builder.AddSystem(PyPointCloudToLcm()) point_cloud_to_lcm_point_cloud.set_name('pointcloud_converter') builder.Connect( station.GetOutputPort('camera0_point_cloud'), point_cloud_to_lcm_point_cloud.input_port ) # LcmPublisher保持默认配置即可,不需要开启use_cpp_serializer point_cloud_lcm_publisher = builder.AddSystem( LcmPublisherSystem.Make( channel="DRAKE_POINT_CLOUD_camera0", lcm_type=lcmt_point_cloud, lcm=None, publish_period=0.2 ) ) point_cloud_lcm_publisher.set_name('point_cloud_publisher') builder.Connect( point_cloud_to_lcm_point_cloud.output_port, point_cloud_lcm_publisher.get_input_port() )
该方案完全适配drake-visualizer的点云接收逻辑,运行性能满足常规可视化需求,不会出现旧版Meshcat可视化的资源占用过高问题。
可选升级方案
如果可以升级Drake版本,升级到0.38及以上正式版即可,官方已经修复了lcmt_point_cloud序列化器的Python绑定问题,你最初的代码只需要保留use_cpp_serializer=True参数即可正常运行。
内容的提问来源于stack exchange,提问作者milLII3yway
相关产品推荐
相关产品推荐

