Kittidata处理-B站教程
一,kitti资料介绍与可视化
1,所用数据集
2011_09_26_drive_0005_sync
2,使用kitti2bag,把kitti数据集转换为ros的bag文件,可供ros读取。
1,安装kitti2bag
pip install kitti2bag
2,用kitti2bag命令把数据转换为包
在下面放着三个标定文件
kitti2bag -t 2011_09_26 -r 0005 raw_synced
上面的数据参考数据集的序号:2011_09_26_drive_0005_sync
生成以下的话题
3,执行生成的bag文件
rqt_bag kitti_2011_09_26_drive_0005_synced.bag
选中一个话题,右键可以查看相关的图像
4,也可以用rviz查看
roscore
rviz
rosbag play -l kitti_2011_10_03_drive_0042_synced.bag
只转化lidar数据为bag文件:
二,发布照片
使用自己写的程序来publish照片,并用rviz可视化
1,建立功能包kitti_tutorial 依赖于rospy
python代码如下
# coding=UTF-8 #! /usr/bin/env python import rospy from sensor_msgs.msg import Image import cv2 #图片以opencv的形式展现,导入opencv的包 import os #文件拼接要用这个 from cv_bridge import CvBridge """ 1,导入包 2,创建节点 3,创建发布者 4,发布者循环发布数据 """ DATA_PATH = "/home/l/kittidata/1kittiros/RawData/2011_09_26/2011_09_26_drive_0005_sync" if __name__ == "__main__": frame = 0 # 1,导入包 rospy.init_node("kitti_node", anonymous=True) cam_pub = rospy.Publisher("kitti_cam", Image, queue_size=10) brideg = CvBridge() #cv的图片格式转换为ros图片格式的桥梁 rate = rospy.Rate(10) while not rospy.is_shutdown(): #文件路径拼接,%010d 是一个十位的整数,%0是第零号,0000000000 # img = cv2.imread(os.path.join(DATA_PATH, "image_02/data/%010d.png"%0)) img = cv2.imread(os.path.join(DATA_PATH, "image_02/data/%010d.png"%frame)) #把cv和ros的图片格式进行相互的转换 cam_pub.publish(brideg.cv2_to_imgmsg(img,"bgr8")) rospy.loginfo("left color camera published") frame += 1 #frame最大为153,过了153后,不会出错,然后循环,从零开始 frame %=154 rate.sleep()
三,发布点云资料
发布点云资料,在rviz中
# coding=UTF-8 #! /usr/bin/env python import rospy from std_msgs.msg import Header from sensor_msgs.msg import Image, PointCloud2 #ros里专门用来发布点云的格式 import sensor_msgs.point_cloud2 as pcl2 import cv2 #图片以opencv的形式展现,导入opencv的包 import os #文件拼接要用这个 from cv_bridge import CvBridge import numpy as np #导入处理数据的资料库 """ 1,导入包 2,创建节点 3,创建发布者 4,发布者循环发布数据 """ DATA_PATH = "/home/l/kittidata/1kittiros/RawData/2011_09_26/2011_09_26_drive_0005_sync" if __name__ == "__main__": frame = 0 # 1,导入包 rospy.init_node("kitti_node", anonymous=True) cam_pub = rospy.Publisher("kitti_cam", Image, queue_size=10) pcl_pub = rospy.Publisher("kitti_point_cloud", PointCloud2, queue_size=10) brideg = CvBridge() #cv的图片格式转换为ros图片格式的桥梁 rate = rospy.Rate(10) while not rospy.is_shutdown(): #文件路径拼接,%010d 是一个十位的整数,%0是第零号,0000000000 # img = cv2.imread(os.path.join(DATA_PATH, "image_02/data/%010d.png"%0)) img = cv2.imread(os.path.join(DATA_PATH, "image_02/data/%010d.png"%frame)) #把cv和ros的图片格式进行相互的转换 cam_pub.publish(brideg.cv2_to_imgmsg(img,"bgr8")) #用numpy来读取数据,并转换为numpy的格式,从bin里读取数据,必须告诉他是浮点数float32的数据格式,读取的数据是一维的阵列,把他变成n行4列的矩阵格式 #point__cloud是n*4的矩阵 point_cloud = np.fromfile(os.path.join(DATA_PATH, "velodyne_points/data/%010d.bin"%frame),dtype=np.float32).reshape(-1,4) #将点云正确的以PointCloud2的格式发布出去,用sensor_msgs.point_cloud2的资料库 #建立Header,告诉他现在的资讯 header = Header() header.stamp = rospy.Time.now() #时间点 header.frame_id = "map" #坐标系的名称,可以随便改 #读取的点云的xyz坐标都是float32的形态,并把它转换为ros里的pointcloud2的格式 #pcl2.create_cloud_xyz32,只接受xyz三个坐标,不接受反射率的资料,因此point_cloud[:, :3],第一个:指导入所有的点,第二个:指的是取这个资料的前三列 pcl_pub.publish(pcl2.create_cloud_xyz32(header, point_cloud[:, :3])) rospy.loginfo("published,第%d帧",frame) rate.sleep() frame += 1 #frame最大为153,过了153后,不会出错,然后循环,从零开始 frame %=154
四,画出自己的车子和相机的视野
五,发布IMU资料
六,发布GPS资料
七,下载tracking资料并读取
八,画出2d侦测框
九,画出所有的2d侦测框
十,在rviz上显示2d侦测框
十一,画出3d侦测框
https://github.com/charlesq34/frustum-pointnets
计算坐标
十二,画出所有3d侦测框
1,rawdata转换为kitti2bag
2,
1, 学会用tutorial
2, 代码复现