注意:

  • 再学习本系列教程时,应该已经安装过ROS了并且需要有一些ROS的基本知识

ubuntu版本:20.04
ros版本:noetic

课程回顾

ROS1结合自动驾驶数据集Kitti开发教程(一)Kitti资料介绍和可视化
ROS1结合自动驾驶数据集Kitti开发教程(二)发布图片

1.数据分析

在kitti数据集中给出了velodyne扫描并且已经修正的激光雷达数据。可以在2011_09_26_drive_0005_sync文件夹下的velodyne_points/data文件夹下看到数据。
如下所示:

可以看到这些数据是以.bin结尾的数据文件,和上一节一样一共有153个。文件中的数据都是数字,每一行有4个数据,分别是xyz三维点的坐标,最后一个数据是这一行这个点的反射率。

2.python源码

在上一节的kitti_node.py代码的基础上进行修改:

#!/usr/bin/env python3
# -*- coding:utf-8 -*-
import os
import cv2
from cv_bridge import CvBridge
import rospy
import numpy as np
from std_msgs.msg import Header
from sensor_msgs.msg import Image,PointCloud2
import sensor_msgs.point_cloud2 as pcl2

BASE_PATH = "/home/mckros/kitti/RawData/2011_09_26/2011_09_26_drive_0005_sync/"    

if __name__ == "__main__":
    rospy.init_node("kitti_node",anonymous=True)
    cam_color_left_pub  = rospy.Publisher("/kitti/cam_color_left", Image, queue_size=10)
    # cam_color_right_pub = rospy.Publisher("/kitti/cam_color_right", Image, queue_size=10)
    # cam_gray_left_pub   = rospy.Publisher("/kitti/cam_gray_left", Image, queue_size=10)
    # cam_gray_lright_pub = rospy.Publisher("/kitti/cam_gray_right", Image, queue_size=10)
    pcl_pub = rospy.Publisher("/kitti/pointcloud2", PointCloud2, queue_size=10)
    bridge = CvBridge()

    rate = rospy.Rate(10)
    num = 1
    while not rospy.is_shutdown():
        img = cv2.imread(os.path.join(BASE_PATH, "image_02/data/%010d.png"%num))
        # 使用numpy模块读取bin文件的数据
        point_cloud =np.fromfile(os.path.join(BASE_PATH, "velodyne_points/data/%010d.bin"%num), dtype=np.float32).reshape(-1,4)
        # 使用cvbridge模块将cv数据转换为msg数据格式
        cam_color_left_pub.publish(bridge.cv2_to_imgmsg(img,"bgr8"))
        header = Header()
        header.stamp = rospy.Time.now()
        header.frame_id = 'map'
        pcl_pub.publish(pcl2.create_cloud_xyz32(header,point_cloud[:,:3]))
        rospy.loginfo("kitti published")
        rate.sleep()
        num+=1
        num%=154

3.运行测试

使用如下命令打开测试环境,每一行需要单独打开一个终端:

$ roscore
$ rosrun kitti_tutorials kitti_node.py
$ rviz

打开rviz工具后选择Add->by topic可以看到如下场景,分别添加框选出来的两个节点:

如果一切顺利,显示效果如下所示:

结语

本文也是基于笔者的学习和使用经验总结的,主观性较强,如果有哪些不对的地方或者不明白的地方,欢迎评论区留言交流~

为了能和读者进一步讨论问题,建立了一个微信群,方便给大家解答问题,也可以一起讨论问题。
加群链接
✌Bye