python点云可视化工具_救命!点云可视化(不需配置PCL)

分享一波简单的可视化bin格式点云的方法。

先大概讲下背景,目前激光雷达采集的点云文件大多基于ROS,然后转化为pcd、bin格式进行处理。(ros-pcd-bin格式之间相互转换格式有相应的工具,如果需要我后面更新在github)

大多数人都会使用pcl库来处理pcd格式点云,但不得不说,配置pcl的点云库真的真的太多坑,直接建议不要自己配环境,条件允许使用docker 找个合适的镜像就行。但是要进行点云可视化,在docker image里还要进行主机与容器之间的端口映射,如果远程服务器的话更复杂一些(不要问我怎么知道的/ )

如果仅需要进行可视化,建议参照KITTI数据集采用bin格式来处理,真的简单太多!!!下面是正文:(参考大佬的,做个记录)

方法一:numpy+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、需要Ubuntu16.04+ros kinetic环境

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

rospy_rviz

0.0.0

rospy_rviz

Hqss

TODO

catkin

rospy_rviz.launch

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

catkin_make

source devel/setup.bash

roslaunch rospy_rviz rospy_rviz.launch

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

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

你可能感兴趣的:(python点云可视化工具)