• 欢迎访问开心洋葱网站,在线教程,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站,欢迎加入开心洋葱 QQ群
  • 为方便开心洋葱网用户,开心洋葱官网已经开启复制功能!
  • 欢迎访问开心洋葱网站,手机也能访问哦~欢迎加入开心洋葱多维思维学习平台 QQ群
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏开心洋葱吧~~~~~~~~~~~~~!
  • 由于近期流量激增,小站的ECS没能经的起亲们的访问,本站依然没有盈利,如果各位看如果觉着文字不错,还请看官给小站打个赏~~~~~~~~~~~~~!

室外低速自动导航车的设计(2)——多线激光雷达的点云解析

人工智能 麻辣小蘑菇 2009次浏览 0个评论

室外低速自动导航车的设计(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 当获取到了点云以后,我们就获得了环境(或者说障碍)与的雷达之间的距离和方位信息,接下来,我们就可以利用这个信息,来进行导航车的初步移动了。    


开心洋葱 , 版权所有丨如未注明 , 均为原创丨未经授权请勿修改 , 转载请注明室外低速自动导航车的设计(2)——多线激光雷达的点云解析
喜欢 (0)

您必须 登录 才能发表评论!

加载中……