希望你们一切顺利 我有一个 LiDAR,它是 Livox Mid 70。它有这样的扫描模式。 scan_pattern ,这取决于时间并创建整个场景。
我使用 ros 从特定主题获取数据并创建 numpy 数组。
def callback(data):
pc = rNp.numpify(data)
points = np.zeros((pc.shape[0], 4))
points[:,0]=pc['x']
points[:,1]=pc['y']
points[:,2]=pc['z']
points[:,3]=pc['intensity']
po = np.array(points, dtype=np.float32)
然后我创建一个 (x, y) 数组,其中包含该点云数据的 X 和 Y 坐标,并尝试像这样缩放它:
p = (arr/np.max(arr)*255).astype(np.uint8) #arr = (x, y) numpy array
但不幸的是它没有给我任何可以理解的图片
然后我尝试了ros命令:
rosrun pcl_ros convert_pointcloud_to_image input:=/livox/lidar output:=/img
但是错误消息是:
[ERROR] [1651119689.192807544]: Input point cloud is not organized, ignoring!
我在 matlab 上看到了一些技术,即 pcorganize,但是要使用它,我需要给它一些参数,例如
params = lidarParameters(sensorName,horizontalResolution) params = lidarParameters(verticalResolution,verticalFoV,horizontalResolution) params = lidarParameters(verticalBeamAngles,horizontalResolution) params = lidarParameters(___,HorizontalFoV=horizontalFoV)
但是这个激光雷达没有任何水平或垂直分辨率、光束角度 所以可能我无法使用此函数来组织此 pcl 数据。
我的问题:
- 如何组织这些无组织的 pcl 数据并从中创建图像?
- 是否可以通过 cv2.imshow() 查看此图像?
最佳答案
答案:
如果需要,将来自 LiDAR 的 PointCloud2 消息缓冲在写入节点中(最好是 Python)(仅当扫描模式需要时间来运行整个扫描时,例如整个扫描需要 2 秒)。看看 Velodyne LiDAR,他们不需要它,因为有平面扫描 LiDAR,即从运行的第一秒开始就获得完整的详细图像。正如我提到的,只有当您的 LiDAR 具有 Lissajous 扫描模式 ( https://www.nature.com/articles/s41598-017-13634-3 ) 或其他模式(需要时间来进行完整的场景扫描)时,才有必要这样做。
情况 1: 扫描模式需要时间:自定义缓冲时间(1 秒、2 秒或 4 秒...)- 与您附加的扫描模式相比)。然后你就得到了一个完整的扫描。
情况2:扫描模式不需要任何缓冲时间:从一开始就进行丰富详细的扫描,通常不需要缓冲
在下一步中,您应该使用此节点: https://github.com/mjshiggins/ros-examples/blob/master/src/lidar/src/lidar_node.cpp
该节点获取您的 pointcloud2 消息并生成鸟瞰图像。我在论文中使用了这个节点,并更改了一些内容,以便更容易理解和更好的解决方案。我可以与您共享此文件,或者如果您想自己探索此节点并且不时需要帮助,例如更改 LiDAR 位置、更改单元分辨率(将顶部 View 缩放到图像)、图像颜色等。此外,我还使用 LiDAR 的给定数据添加图像颜色 channel 的编码:强度、密度、高度(原始代码中仅高度编码)。
使用 OpenCV,您可以将此图像视为打开的窗口,或将其可视化为 RViz 中已发布的主题。
关于python - 从无组织的典型扫描模式激光雷达的点云数据生成图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72038696/