用Python打造无人驾驶车-激光雷达数据(1)

ROS环境安装ROS/Tutorials - ROS Wiki

ROS数据包Udacity Didi Challenge - Round 2 Dataset

前言:

激光雷达是无人驾驶车的一个重要数据源,同时也是最难处理的数据之一。相对于图像数据而言,激光雷达有着更可靠的深度数据。特斯拉的辅助驾驶系统曾因为过度依赖图像数据产生的误判而造成严重的事故,而有了激光雷达之后,就可以避免因为图像造成的误判。本文将介绍如何初步的处理激光雷达生成的点云数据

数据可视化

在处理数据之前,让我们先来看看原始数据什么样。使用ROS自带的rviz可以很轻松的查看各种数据。

可以看出,激光雷达的点云是环状的,这是因为一个激光雷达由多个线构成,每个线都在不停的旋转扫描,获取返回的数据,本文使用的数据包中,激光雷达数据来自与一个velodyne 32线雷达。从可视化的图中,可以看出点云采样展示了周边的物体和地形情况。

聚类数据(=>识别点云中的物体)

为了能够让机器学习的算法识别点云中的物体,我们先要进行一些预处理,将点云数据进行聚类,区分不同的物体

读取数据:

import os
import rosbag
import numpy as np
import sensor_msgs.point_cloud2 as pc2

# car 本文主要介绍如何分离出物体,故在读取数据时先将地面和天空中的物体去除,以简化聚类。
zmin=-1.0
zmax=0.2

files = os.listdir(bag_file_dir)

pointclouds = []

bag = rosbag.Bag(os.path.join(bag_file_dir, 'pointcloud.bag'))

for topic, msg, t in bag.read_messages(
    topics = [
        '/velodyne_points'
    ]):
    lidar = pc2.read_points(msg)
    points = np.array(list(lidar))
    points = points[np.where([zmin <= point[2] <= zmax for point in points])]
    
    pointclouds.append(points)

由于无人车本体是已知的数据,所以可以在点云中首先过滤掉,减少之后处理的数据量。

car_x_max = 3.8-1.5494
car_x_min = -1.5494-0.8128
car_y_max = 1.5748/2
car_y_min = -1.5748/2
def remove_self(pointcloud):
    return pointcloud[
        np.where(
            [np.logical_not(car_x_min <= point[0] <= car_x_max and car_y_min <= point[1] <= car_y_max) for point in pointcloud]
        )
    ]

接下来就只剩下需要聚类的数据了。

聚类数据使用简化的K-D-Tree算法。简单的说,就是选一个点,然后聚类在这个点附近一定范围内的点,以此递归,直到一定范围内没有点为止,再聚类下一个物体。同时,我们知道道路上的物体一般都是在地面上的,一般不会悬浮在空中,所以这里只需要对xy轴数据进行处理就好了。

def cluster(points, radius=0.2):
    """
    points: pointcloud
    radius: max cluster range
    """
    items = []
    while len(points)>1:
        item = np.array([points[0]])
        base = points[0]
        points = np.delete(points, 0, 0)
        distance = (points[:,0]-base[0])**2+(points[:,1]-base[1])**2
        infected_points = np.where(distance <= radius**2)
        item = np.append(item, points[infected_points], axis=0)
        border_points = points[infected_points]
        points = np.delete(points, infected_points, 0)
        while len(border_points) > 0:
            border_base = border_points[0]
            border_points = np.delete(border_points, 0, 0)
            border_distance = (points[:,0]-border_base[0])**2+(points[:,1]-border_base[1])**2
            border_infected_points = np.where(border_distance <= radius**2)
            item = np.append(item, points[border_infected_points], axis=0)
            border_points = points[border_infected_points]
            points = np.delete(points, border_infected_points, 0)
        items.append(item)
    return items

处理过后,可以matplotlib查看聚类出来的数据,如果你使用jupyter notebook建议使用%matplotlib的方式,这样可以在新窗口用鼠标动态三维的查看数据。

import matplotlib
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
%matplotlib

fig = plt.figure()
ax = Axes3D(fig)
fig = plt.figure()
ax = Axes3D(fig)
ax.scatter(item[:,0], item[:,1], item[:,2], s=1)
fig.show()

 

看出来这是一辆车了吗?激光雷达只能探测到靠近自身的一侧,所以这是一辆车的后部,也就是在自身的前方的车。

一点思考

1.现在的地面数据处理方法有什么弊端?

2.对地面数据有没有更好的处理方法?

3.聚类最佳参数是多少?

4.如何过滤无用的障碍物?

5.激光雷达产生点云除了有xyz数据,还有强度和线圈数据,有什么用处吗?

相关论文参考

[2016] Lidar-based Methods for Tracking and Identification [ref][youtube]

 

 

 

 

### 回答1: 激光雷达数据处理是通过处理激光雷达测量的点云数据来实现的。在Python中,可以使用一些常用的库来处理激光雷达数据,如numpy和matplotlib。 首先,需要将激光雷达的原始数据转换为点云数据,通常是以文本文件的形式存在。可以使用Python中的文件读取函数将数据读取到内存中。 读取到内存后,可以使用numpy库对数据进行进一步处理,如计算点的距离或者角度等。numpy库提供了强大的数组操作功能,可以方便地进行数据处理和计算。 接着,可以使用matplotlib库对处理后的点云数据进行可视化。matplotlib库提供了丰富的绘图函数,可以绘制出点云的三维形状或者二维投影图等。 在处理激光雷达数据时,还可以根据需求进行其他更复杂的处理,例如滤波、地面提取、障碍物检测等。这些处理可以使用其他相关的Python库来实现,如scipy、scikit-learn等。 最后,根据实际需求对数据进行分析和应用。例如可以使用机器学习算法对点云数据进行分类、分割或者聚类等。可以使用scikit-learn库来实现一些常见的机器学习算法,如支持向量机、随机森林等。 总之,通过使用Python中的各种库和函数,可以方便地进行激光雷达数据处理实验。可以根据实际需求选择合适的库和算法,对数据进行处理、分析和应用。 ### 回答2: 激光雷达数据处理是一个常见的技术,用于获取和分析激光雷达传感器返回的数据。在Python中,可以使用一些库和模块来处理激光雷达数据,如PCL(点云库)和ROS(机器人操作系统)。 下面是一个简单的激光雷达数据处理实验代码的示例: ``` import numpy as np import pcl # 读取激光雷达数据文件 cloud = pcl.load("laser_data.pcd") # 将点云数据转换为numpy数组 points = np.array(cloud) # 进行数据处理操作,如降采样、滤波、聚类等 # 例如,进行体素网格下采样 vox = cloud.make_voxel_grid_filter() vox.set_leaf_size(0.01, 0.01, 0.01) downsampled_cloud = vox.filter() # 进行聚类分割 seg = downsampled_cloud.make_segmenter() seg.set_model_type(pcl.SACMODEL_PLANE) seg.set_method_type(pcl.SAC_RANSAC) seg.set_distance_threshold(0.01) cluster_indices, coefficients = seg.segment() # 可根据需要执行其他操作,如可视化、保存结果等 ``` 这段代码首先使用pcl库加载激光雷达数据文件,然后将点云数据转换为numpy数组以进行进一步处理。之后,可以进行各种数据处理操作,本示例中演示了体素网格下采样和聚类分割。可以根据需要进行其他操作,如可视化结果或保存处理后的数据等。 需要注意的是,这只是一个简单的示例代码,实际的激光雷达数据处理可能涉及更多的复杂操作和算法,需要根据具体的需求进行更多的代码编写和测试。 ### 回答3: 激光雷达数据处理是一项非常重要的技术,在无人驾驶、机器人导航等领域起着关键作用。Python作为一种脚本语言,在激光雷达数据处理中也有广泛的应用。下面将简要介绍一种基于Python激光雷达数据处理实验代码。 首先,我们需要导入一些必要的Python库,例如numpy、matplotlib等。这些库提供了丰富的数据处理和可视化功能,能够方便地对激光雷达数据进行处理和展示。 接着,我们需要读取激光雷达数据。通常,激光雷达数据保存在文本文件或者二进制文件中,我们可以使用Python的文件读取功能将其读入内存中。读取完成后,可以将其存储为一个numpy数组,方便后续的处理。 在处理数据之前,我们通常需要对激光雷达数据进行滤波。常见的滤波方法包括高斯滤波、中值滤波等,可以有效地去除噪声和异常值。通过调用相应的库函数,我们可以很方便地进行滤波操作。 接下来,我们需要对滤波后的数据进行处理。例如,可以将数据转换为极坐标形式,计算激光雷达点云的密度、角度分布等统计量。这些统计量可以帮助我们更好地理解和分析激光雷达数据。 最后,我们可以使用matplotlib库进行数据可视化。通过绘制散点图、雷达图等形式,可以直观地展示激光雷达数据的分布和特征。这样可以帮助我们更好地理解和分析激光雷达数据,并辅助后续的决策和控制。 综上所述,基于Python激光雷达数据处理实验代码可以帮助我们方便地对激光雷达数据进行处理、分析和可视化。这种代码的开发和运行需要一定的Python编程基础和相关领域知识,但是通过学习和实践,我们可以更好地应用激光雷达数据处理技术,为实际应用提供有效的支持。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值