pypcd读取pcd时的坑

In [3]: pypcd.point_cloud_from_path("./1685500241500.pcd")
---------------------------------------------------------------------------
AssertionError                            Traceback (most recent call last)
Input In [3], in <cell line: 1>()
----> 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不一样.
我的点云格式是这样的.

在这里插入图片描述

打印报错的第625行后, 发现是这样的
在这里插入图片描述

在这里插入图片描述

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

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

在这里插入图片描述

而传进来的是从这里.

在这里插入图片描述所以其实就是第255行的问题. 不该用 metadata[“width”]
在这里插入图片描述

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

在这里插入图片描述

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