申明:从KITTI官网下载到的激光雷达点云数据为.bin格式,为此找到了三种方法,现在分享出来大家一起讨论。


程序运行环境

运行测试系统:Ubuntu16.04

运行环境:python3.6


方法一:使用numpy库读取.bin数据并使用mayavi.mlab来可视化点云数据

1、安装通过下属命令安装依赖库

pip install numpy -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install mayavi -i https://pypi.tuna.tsinghua.edu.cn/simple

2、通过以下代码读取.bin文件并可视化

import numpy as np
import mayavi.mlab
 
# lidar_path换成自己的.bin文件路径
pointcloud = np.fromfile(str("lidar_path"), dtype=np.float32, count=-1).reshape([-1, 4])
 
x = pointcloud[:, 0]  # x position of point
y = pointcloud[:, 1]  # y position of point
z = pointcloud[:, 2]  # z position of point
 
r = pointcloud[:, 3]  # reflectance value of point
d = np.sqrt(x ** 2 + y ** 2)  # Map Distance from sensor
 
degr = np.degrees(np.arctan(z / d))
 
vals = 'height'
if vals == "height":
    col = z
else:
    col = d
 
fig = mayavi.mlab.figure(bgcolor=(0, 0, 0), size=(640, 500))
mayavi.mlab.points3d(x, y, z,
                     col,  # Values used for Color
                     mode="point",
                     colormap='spectral',  # 'bone', 'copper', 'gnuplot'
                     # color=(0, 1, 0),   # Used a fixed (r,g,b) instead
                     figure=fig,
                     )
 
mayavi.mlab.show()

3、运行时候可视化结果如下:

方法二:使用numpy进行读取数据与使用python_pcl进行可视化

1、安装通过下属命令安装依赖

pip install python_pcl-XXX.whl  #XXX为版本号,也可以不加

2、通过以下代码读取.bin文件并可视化

import numpy as np
import pcl.pcl_visualization
 
# lidar_path 指定一个kitti 数据的点云bin文件就行了
points = np.fromfile(lidar_path, dtype=np.float32).reshape(-1, 4)  # .astype(np.float16)
 
# 这里对第四列进行赋值,它代表颜色值,根据你自己的需要赋值即可;
points[:, 3] = 3329330
 
# PointCloud_PointXYZRGB 需要点云数据是N*4,分别表示x,y,z,RGB ,其中RGB 用一个整数表示颜色;
color_cloud = pcl.PointCloud_PointXYZRGB(points)
visual = pcl.pcl_visualization.CloudViewing()
visual.ShowColorCloud(color_cloud, b'cloud')
flag = True
while flag:
    flag != visual.WasStopped()

其中上述代码中的颜色值表如下所示:

白色:16777215   红色:16711680    绿色:65280    蓝色:255   牡丹红:16711935  
青色:65535   黄色:16776960     黑色:0    海蓝:7396243   巧克力色:6042391    
蓝紫色:10444703    黄铜色:11904578    亮金色:14276889      棕色:10911037    
青铜色:9205843    深棕:6045747    深绿:3100463    深铜绿色:4879982    
深橄榄绿:5197615    深兰花色:10040013    深紫色:8855416    深石板蓝:7021454    
深铅灰色:3100495  深棕褐色:9922895    深绿松石色:7377883    暗木色:8740418    
淡灰色:5526612    土灰玫瑰红色:8741731    长石色:13734517    火砖色:9315107    
森林绿:2330147    金色:13467442   鲜黄色:14408560    灰色:12632256    
铜绿色:5406582    青黄色:9689968    猎人绿:2186785    印度红:5123887    
土黄色:10461023    浅蓝色:12638681    浅灰色:11053224    浅钢蓝色:9408445    
浅木色:15319718     石灰绿色:3329330   桔黄色:14972979    褐红色:9315179    
中海蓝色:3329433   中蓝色:3289805    中森林绿:7048739  中鲜黄色:15395502    
中兰花色:9662683    中海绿色:4353858    中石板蓝色:8323327  中春绿色:8388352    
中绿松石色:7396315    中紫红色:14381203   中木色:10911844    深藏青色:3092303   
海军蓝:2302862    霓虹蓝:5066239    霓虹粉红:16740039   新深藏青色:156    
新棕褐色:15452062   暗金黄色:13612347    橙色:16744192    橙红色:16720896  
淡紫色:14381275   浅绿色:9419919    粉红色:12357519  李子色:15379946    
石英色:14277107    艳蓝色:5855659   鲑鱼色:7291458   猩红色:12326679    
海绿色:2330216    半甜巧克力色:7029286   赭色:9333539    银色:15132922    
天蓝:3316172   石板蓝:32767   艳粉红色:16719022   春绿色:65407    
钢蓝色:2321294   亮天蓝色:3715294  棕褐色:14390128   紫红色:14204888    
石板蓝色:11397866    浓深棕色:6045747    淡浅灰色:13487565   紫罗兰色:5189455  
紫罗兰红色:13382297    麦黄色:14211263    黄绿色:10079282

3、运行时候可视化结果如下(我赋值的时候为石灰绿色,结果出来的是黄色,原因未知,不过上手还是可以的):

方法三:使用numpy读取数据并使用rviz来进行数据可视化

1、首先需要在Ubuntu1604下安装ros环境

安装步骤可参考此篇博客https://blog.csdn.net/r1141207831/article/details/95337688

2、具体代码如下:

首先创建一个ros工程,参考下面的结构

test
    └── src
        └── rospy_rviz
            ├── CMakeLists.txt
            ├── data
            │   ├── readbin.png
            │   ├── readbin.py
            │   ├── read_pcl.py
            │   └── velodyne
            │       ├── 000000.bin
            │       ├── 000001.bin
            │       ├── 000002.bin
            │       ├── 000003.bin
            │       ├── 000004.bin
            ├── launch
            │   └── rospy_rviz.launch
            ├── package.xml
            ├── rviz
            │   └── rospy_rviz.rviz
            └── script
                └── rospy_rviz.py

rospy_rviz.py

#!/usr/bin/env python
# coding=utf-8
 
import os
import numpy as np
import rospy
 
 
from visualization_msgs.msg import *
from sensor_msgs.msg import PointCloud2
from sensor_msgs import point_cloud2 as pc2
import pcl.pcl_visualization
 
 
def get_data():
    file_name = list()
 
    file_path = rospy.get_param('file_path', "")  # 获取一个全局参数
 
    for filename in os.listdir(file_path):
        filename = os.path.join(file_path, filename)
        if filename.split('.')[-1] == "bin":
            # print(filename.split('/')[-1])
            file_name.append(filename.split('/')[-1])
    # print(file_name)
    return file_name
 
 
def main():
    rospy.init_node("point_cloud", anonymous=True)
 
    rate = rospy.Rate(10)
 
    pub_cloud = rospy.Publisher("/point_cloud", PointCloud2, queue_size=100)
 
    point_cloud2 = PointCloud2()
    point_cloud2.header.frame_id = "/velodyne"
 
    file_path = rospy.get_param('file_path', "")  # 获取一个全局参数
    file_name = get_data()
    for file in file_name:
        point_data = np.fromfile((file_path + file), dtype=np.float32, count=-1).reshape([-1, 4])
        # point_data = point_data[:10]
        cloud = pc2.create_cloud_xyz32(point_cloud2.header, point_data[:, :3])
 
        pub_cloud.publish(cloud)
 
        # 控制发布频率
        rate.sleep()
 
if __name__ == "__main__":    
    main()    

CMakeLists.txt

cmake_minimum_required(VERSION 2.8.3)
project(rospy_rviz)
 
find_package(catkin REQUIRED COMPONENTS
    message_generation
    std_msgs
    )
    
# do not wildcard install files since the root folder of the package will contain a debian folder for releasing
catkin_install_python(PROGRAMS
  script/rospy_rviz.py
  DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}/rospy_rviz
)
install(FILES
  launch/rospy_rviz.launch
  DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}/rospy_rviz
)

package.xml

<?xml version="1.0"?>
<package format="2">
  <name>rospy_rviz</name>
  <version>0.0.0</version>
  <description>rospy_rviz</description>
 
  <maintainer email="XXX@lzu.edu.cn">Hqss</maintainer>
 
  <license>TODO</license>
 
  <buildtool_depend>catkin</buildtool_depend>
 
</package>

rospy_rviz.launch

<launch>
  <node name="rospy_rviz" pkg="rospy_rviz" type="rospy_rviz.py" output="screen"/>
  <param name="file_path" value="$(find rospy_rviz)/data/velodyne/" />
  <node name="rviz" pkg="rviz" type="rviz" args="-d $(find rospy_rviz)/rviz/rospy_rviz.rviz" />
</launch>

3、使用下面命令运行程序

catkin_make
source devel/setup.bash
roslaunch rospy_rviz rospy_rviz.launch 

4、可视化结果如下图所示


至此三种方法都可以正常可视化点云数据。


附录:

python 可视化点云工具 python-pcl https://zhuanlan.zhihu.com/p/72116675