pypcd读取pcd时的坑

In [3]: pypcd.point_cloud_from_path("./1685500241500.pcd")
---------------------------------------------------------------------------
AssertionError                            Traceback (most recent call last)
Input In [3], in ()
----> 1 pypcd.point_cloud_from_path("./1685500241500.pcd")

File ~/.local/lib/python3.9/site-packages/pypcd/pypcd.py:295, in point_cloud_from_path(fname)
    292 """ load point cloud in binary format
    293 """
    294 with open(fname, 'rb') as f:
--> 295     pc = point_cloud_from_fileobj(f)
    296 return pc

File ~/.local/lib/python3.9/site-packages/pypcd/pypcd.py:288, in point_cloud_from_fileobj(f)
    285 else:
    286     print('DATA field is neither "ascii" or "binary" or\
    287             "binary_compressed"')
--> 288 return PointCloud(metadata, pc_data)

File ~/.local/lib/python3.9/site-packages/pypcd/pypcd.py:612, in PointCloud.__init__(self, metadata, pc_data)
    610 self.__dict__.update(metadata)
    611 self.pc_data = pc_data
--> 612 self.check_sanity()

File ~/.local/lib/python3.9/site-packages/pypcd/pypcd.py:625, in PointCloud.check_sanity(self)
    623 md = self.get_metadata()
    624 assert(_metadata_is_consistent(md))
--> 625 assert(len(self.pc_data) == self.points)
    626 assert(self.width*self.height == self.points)
    627 assert(len(self.fields) == len(self.count))

AssertionError:

可以看到报错说是数和pc_data不一样.
我的点云格式是这样的.

pypcd读取pcd时的坑_第1张图片

打印报错的第625行后, 发现是这样的
pypcd读取pcd时的坑_第2张图片

pypcd读取pcd时的坑_第3张图片

显然, pc_data的长度不合理. 不应该是1.

接下来看一下pypcd里面的 self.pc_data和self.points是如何定义的.

pypcd读取pcd时的坑_第4张图片

而传进来的是从这里.

pypcd读取pcd时的坑_第5张图片所以其实就是第255行的问题. 不该用 metadata[“width”]
pypcd读取pcd时的坑_第6张图片

因此这样改了之后就可以读了.

pypcd读取pcd时的坑_第7张图片

当然这个问题, 也可以直接把点云的header手动改一下, 即把 width和height的值互换一下. 这样就不用改pypcd的源码. 但是改源码更合适一些. 不同的点云, 有的是width等于点数,有的是height等于点数.

你可能感兴趣的:(python)