ROS可视化KITTI数据集

码途寻星说
• 阅读 2016

KITTI数据集是世界范围内影响力最广的自动驾驶数据集之一,由四个光学摄像头数据集、一个Velodyne 64线3D激光雷达数据集和标定文件等组成。

其中图像文件以png格式储存,点云数据以bin格式储存。

利用ROS系统下的RViz工具来进行图像和点云的同步可视化。

主要步骤如下:

  1. 创建一个catkin程序包

    cd ~/catkin_ws/src  #切换到ros工作空间
    catkin_create_pkg kitti_tutorial rospy  #创建新的package
    cd ..
    catkin_make
  2. 读取数据并进行发布
    重新整理一下ros发布话题的步骤吧
    ①首先初始化一个ros节点,这是ros通信的基础
    ②创建发布者,用于读取数据并将其以ros消息的形式发布出去
    ③设置发布速率
    ④发布消息
    这里我分别创建了data_utils.py和publish_utils.py工具包以简化主程序run.py
    将三个文件放在kitti_tutorial/src目录下

    """data_utils.py,用于协助读入图像和点云数据"""
    import cv2
    import numpy as np
    
    def read_camera(path):
     return cv2.imread(path)
    
    def read_point_cloud(path):
     return np.fromfile(path, dtype = np.float32).reshape(-1, 4)
    """publish_utils.py,用于协助ros进行消息的发布"""
    import rospy
    from visualization_msgs.msg import Marker
    from geometry_msgs.msg import Point
    from sensor_msgs.msg import Image, PointCloud2
    from cv_bridge import CvBridge
    from std_msgs.msg import Header
    import sensor_msgs.point_cloud2 as pcl2
    
    FRAME_ID = 'map' #坐标系名称
    
    def publish_camera(cam_publisher, bridge, image):
     cam_publisher.publish(bridge.cv2_to_imgmsg(image, 'bgr8')) #用于把opencv读入的图片转化为ros可以读取的格式
     
    def publish_point_cloud(pc_publisher, point_cloud):
     header = Header()
     header.stamp = rospy.Time.now()
     header.frame_id = FRAME_ID  #锚定坐标轴
     pc_publisher.publish(pcl2.create_cloud_xyz32(header, point_cloud[:,:3]))  #这里只发布了点云的xyz坐标
    
    def publish_ego_car(ego_car_publisher):
     '''在点云坐标系下发布45度的摄像机视野线'''
     marker = Marker()
     marker.header.frame_id = FRAME_ID
     marker.header.stamp = rospy.Time.now()
     
     marker.id = 0 #标志的唯一ID
     marker.action = Marker.ADD
     marker.lifetime = rospy.Duration() #生命周期
     marker.type = Marker.LINE_STRIP
     
     marker.color.r = 0.0
     marker.color.g = 1.0
     marker.color.b = 0.0
     marker.color.a = 1.0  #透明度
     marker.scale.x = 0.2  #线条宽度
     
     marker.points = []
     marker.points.append(Point(10, -10, 0))
     marker.points.append(Point(0, 0, 0))
     marker.points.append(Point(10, 10, 0))
     
     ego_car_publisher.publish(marker)
    """run.py,用于最终执行"""
    #!/usr/bin/env python #Shebang魔法指令
    import os
    import rospy
    from cv_bridge import CvBridge
    from visualization_msgs.msg import Marker
    from sensor_msgs.msg import Image, PointCloud2
    from data_utils import read_camera, read_point_cloud
    from publish_utils import publish_camera, publish_point_cloud, publish_ego_car
    
    DATA_PATH = '/home/zhangyuqin/Projects/KITTI/RowData/2011_09_26_drive_0070_sync/'
    
    if __name__ == '__main__':
     rospy.init_node('kitti_node', anonymous = True)  #初始化节点
     cam_publisher = rospy.Publisher('kitti_cam_publisher', Image, queue_size = 10)  #创建摄像头publiser
     pc_publisher = rospy.Publisher('kitti_pc_publisher', PointCloud2, queue_size = 10)  #创建激光雷达publiser
     ego_publisher = rospy.Publisher('kitti_ego_car', Marker, queue_size = 10)  #创建车辆模型publisher
     
     bridge = CvBridge()
     rate = rospy.Rate(5)
     frame = 0  #标记初始化帧数
     
     while not rospy.is_shutdown():
         img = read_camera(os.path.join(DATA_PATH, 'image_02/data/%010d.png'%frame))  #读入图片消息数据。格式化输出,%010d表示10位整数
         pc = read_point_cloud(os.path.join(DATA_PATH, 'velodyne_points/data/%010d.bin'%frame))  #读入点云消息数据
         publish_camera(cam_publisher, bridge, img)  #发布
         publish_point_cloud(pc_publisher, pc)
         publish_ego_car(ego_publisher)
         rospy.loginfo("camera image published")
         rate.sleep()
         frame += 1
         frame %= 420  #这个数据集一共420帧,其实可以多写几行来自动读取帧数,懒了
    

    编写好以上三个源文件后,还需要赋予run.py可执行权限,rosrun运行我们创建的节点

    roscd kitti_tutorial/src  #roscd一步到位,切换到ros工作空间
    chmod +x run.py  #赋予文件可执行权限
    rosrun kitti_tutorial run.py
  3. 启动图形化模拟环境rviz,接受消息并可视化
    打开rviz可视化工具

    rviz

    打开后是空界面,点左下角add,可以看到我们刚刚发布的话题,从中选择我们需要的消息并读入
    ROS可视化KITTI数据集
    可视化完成
    ROS可视化KITTI数据集

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Jacquelyn38 Jacquelyn38
4年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表(关于日期时间时分秒显示不出来)
在使用皕杰报表设计器时,数据据里面是日期型,但当你web预览时候,发现有日期时间类型的数据时分秒显示不出来,只有年月日能显示出来,时分秒显示为0:00:00。1.可以使用tochar解决,数据集用selecttochar(flowdate,"yyyyMMddHH:mm:ss")fromtablename2.也可以把数据库日期类型date改成timestamp
Wesley13 Wesley13
3年前
FLV文件格式
1.        FLV文件对齐方式FLV文件以大端对齐方式存放多字节整型。如存放数字无符号16位的数字300(0x012C),那么在FLV文件中存放的顺序是:|0x01|0x2C|。如果是无符号32位数字300(0x0000012C),那么在FLV文件中的存放顺序是:|0x00|0x00|0x00|0x01|0x2C。2.  
Wesley13 Wesley13
3年前
15个车辆信息检测数据集收集汇总(简介及链接)
车辆信息检测数据集收集汇总1\.UADETRAC2\.BDD100K自动驾驶数据集3\.综合汽车(CompCars)数据集4\.StanfordCarsDataset5\.OpenDataV11.0车辆重识别数据集VRID6\.NCARS数据集7\.MITDriveSeg
Stella981 Stella981
3年前
Apache Hudi重磅RFC解读之记录级别全局索引
1\.摘要Hudi表允许多种类型操作,包括非常常用的upsert,当然为支持upsert,Hudi依赖索引机制来定位记录在哪些文件中。当前Hudi支持分区和非分区的数据集。分区数据集是将一组文件(数据)放在称为分区的桶中的数据集。一个Hudi数据集可能由N个分区和M个文件组成,这种组织结构也非常方便hive/presto/sp
Wesley13 Wesley13
3年前
mysql修改表、字段、库的字符集_无需整理
修改数据库字符集:ALTERDATABASEdb\_nameDEFAULTCHARACTERSETcharacter\_name\COLLATE...\;把表默认的字符集和所有字符列(CHAR,VARCHAR,TEXT)改为新的字符集:ALTERTABLEtbl\_nameCONVERTTOCHARA
Stella981 Stella981
3年前
DataGear 制作按行滚动的轮播表格数据可视化看板
通过DataGear(https://www.oschina.net/action/GoToLink?urlhttp%3A%2F%2Fdatagear.tech%2F)的表格图表轮播设置项(1.13.0版本新增),可以轻松制作按行滚动的轮播表格数据可视化看板。首先,新建表格所需的数据集,以如下CSV数据集为例:name,v
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
美凌格栋栋酱 美凌格栋栋酱
5个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(