室外低速自动导航车的设计(2)——多线激光雷达的点云解析
我们在前面硬件系统的构建中通过网络接收到了多线激光雷达的原始数据,这些数据在空间中形成了一个个的点,每一个点都代表了某个物体表面的回波。我们采用的激光雷达是16线的。不太严格的说,16线就代表了这个雷达在空间的z轴上扫过16个平面。每个平面又包含一组xy平面的信息。 这些多平面的激光雷达的回波点被称作点云(PointCloud,PCL),通过点云,我们就能够以机器人为基点构建出整个三维场景信息。 想要读懂这篇博客,我们首先要按照这篇博客: https://blog.csdn.net/z824074989y/article/details/95495883 构建出点云信息,而且在看后边的内容之前,我们得学习一些机器人操作系统ROS的基础,ROS可以在这个网站上学习: http://wiki.ros.org/ROS/Tutorials
点云的基本表示
我们先来研究一下点云在ROS中基本的表示,我使用我们的雷达采集了一组空间三维数据集,大概10s左右,这个数据集我存在了我的csdn库中,各位可以自行下载: https://download.csdn.net/download/z824074989y/11339559 使用rosbag指令循环播放这个bag: rosbag play [文件] –clock -l 就能够发布我预存的所有数据,打开一个Rviz终端,就能够还原出这个厂房在当天的三维数据,如图:
实际播放的时候,三维数据是动态的。在这些点云的点中,每一个点都对应着一组xyz坐标,这个坐标又对应着实体的表面。 三维点云是由PointCloud2结构体表示的,它的构成为: std_msgs/Header header #ROS信息的标准头 uint32 seq time stamp string frame_id uint32 height #高度(z通道数量) uint32 width #x/y平面点数 sensor_msgs/PointField[] fields #通道说明 bool is_bigendian #大端存储(暂时用不到) uint32 point_step uint32 row_step uint8[] data #数据(无法直接读取,需要用类处理) bool is_dense #是否包含无用数据,True表示都有用 下面我们使用Python对点云进行初步处理。
使用Python对点云进行初步处理
引用库 #!/usr/bin/env python # -*- coding=utf-8 -*- import rospy, math, random import numpy as np from sensor_msgs.msg import PointCloud2 as pcl2 from sensor_msgs import point_cloud2 as pc2 from laser_geometry import LaserProjection 构建一个雷达处理的类 class Lidar_Processor: def __init__(self, scan_topic=”/rslidar_points”): 在类中申明回调函数和一个LaserProejction类 self.scan_sub = rospy.Subscriber(scan_topic, pcl2, self.on_scan) self.laser_projector = LaserProjection() 在类中申明回调函数,并且使用pc2的方法对pcl2进行处理 def on_scan(self, scan): print scan rospy.loginfo(“Got scan, projecting”) pp=pc2.read_points(scan, field_names = (“x”, “y”, “z”), skip_nans=True) #print len(pp) for p in pp: …(处理函数) if __name__==’__main__’: rospy.init_node(‘asd’) l=Lidar_Processor() rospy.spin() 只要在处理函数中加入一个简单的print,就可以简单输出点云中的所有点了,如下列表: x : 0.216155 y: -0.619667 z: -0.000087 x : 0.214098 y: -0.620380 z: -0.000087 x : 0.215381 y: -0.630511 z: 0.000089 x : 0.210196 y: -0.621713 z: -0.000087 x : 0.208242 y: -0.622370 z: -0.000087 x : 0.209318 y: -0.632550 z: 0.000089 x : 0.207330 y: -0.633204 z: 0.000089 x : 0.202258 y: -0.624340 z: -0.000087 x : 0.203347 y: -0.634494 z: 0.000089 x : 0.204375 y: -0.644661 z: 0.000266 x : 0.202348 y: -0.645300 z: 0.000266 x : 0.203282 y: -0.655482 z: 0.000443 x : 0.204153 y: -0.665676 z: 0.000620 x : 0.201944 y: -0.666350 z: 0.000620 x : 0.202720 y: -0.676559 z: 0.000797 x : 0.079345 y: 0.711867 z: 0.000974 当获取到了点云以后,我们就获得了环境(或者说障碍)与的雷达之间的距离和方位信息,接下来,我们就可以利用这个信息,来进行导航车的初步移动了。