写点什么

使用 kitti 数据集实现自动驾驶——发布照片、点云、IMU、GPS、显示 2D 和 3D 侦测框

作者:秃头小苏
  • 2022 年 7 月 17 日
  • 本文字数:2568 字

    阅读完需:约 8 分钟

本次内容主要是使用 kitti 数据集来可视化 kitti 车上一些传感器(相机、激光雷达、IMU)采集的资料以及对行人和车辆进行检测并在图像中画出行人和车辆的 2D 框、在点云中画出行人和车辆的 3D 框。


1、准备工作

1.1 数据集下载

在开始之前,先做一些准备工作,即从 kitti 上下载相关数据:kitty官网


如图所示:下载途中箭头所指的两个文件【注:需要先进行注册】



除了下载这两个文件,后面还需要下载汽车模型文件和标注文件,这里直接贴出下载地址:数据下载



1.2 创建工作空间并建立一些文件

  • 创建功能包


cd ~/catkin_ws/srccatkin_create_pkg kitti_turtorial rospy 
复制代码


  • 在刚创建的功能包下的 src 文件夹中创建以下 python 文件



2、详细步骤

说明:该部分只是自己的学习笔记,故只会贴出每一步比较核心的代码,要想看懂整个流程,建议完整的观看相关视频:视频

当然最后我也会贴出所有文件的源码供大家学习


2.1 发布照片

#创建一个摄像头的发布者cam_pub = rospy.Publisher('kitti_cam',Image,queue_size=10)#读取摄像机数据image = read_camera(os.path.join(DAtA_PATH, 'image_02/data/%010d.png'%frame))#发布数据publish_camera(cam_pub,bridge,image,boxes_2d,types)
复制代码



2.2 发布点云

#创建一个点云的发布者pcl_pub = rospy.Publisher('kitti_point_cloud',PointCloud2,queue_size=10)#读取点云数据point_cloud = read_point_cloud(os.path.join(DAtA_PATH,'velodyne_points/data/%010d.bin'%frame))#发布数据    publish_point_cloud(pcl_pub,point_cloud)
复制代码



2.3 画出自己车子以及照相机视野

#创建一个汽车的发布者ego_pub = rospy.Publisher('kitti_ego_car',MarkerArray,queue_size=10)#发布ego_car数据publish_ego_car(ego_pub)
##绘制车子的照相机视野marker.id = 0marker.action = marker.ADDmarker.lifetime = rospy.Duration()marker.type = Marker.LINE_STRIP
marker.color.r = 0.0marker.color.g = 1.0marker.color.b = 0.0marker.color.a = 1.0marker.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))
marker_array.markers.append(marker)
复制代码



2.4 发布 IMU

#创建一个IMU发布者imu_pub = rospy.Publisher('kitti_imu',Imu,queue_size=10)
#发布imu数据publish_imu(imu_pub,imu_data)
##IMU发布函数相关设置def publish_imu(imu_pub,imu_data): imu = Imu() imu.header.frame_id = FRAME_ID imu.header.stamp = rospy.Time.now() #设置旋转量 q = tf.transformations.quaternion_from_euler(float(imu_data.roll),float(imu_data.pitch),float(imu_data.yaw)); imu.orientation.x = q[0] imu.orientation.y = q[1] imu.orientation.z = q[2] imu.orientation.w = q[3] #设置线性加速度 imu.linear_acceleration.x = imu_data.af imu.linear_acceleration.y = imu_data.al imu.linear_acceleration.z = imu_data.au #设置角加速度 imu.angular_velocity.x = imu_data.wf imu.angular_velocity.y = imu_data.wl imu.angular_velocity.z = imu_data.wu imu_pub.publish(imu)
复制代码



2.5 发布 GPS

#创建一个GPS发布者gps_pub = rospy.Publisher('kitti_gps',NavSatFix,queue_size=10)#发布GPS数据publish_gps(gps_pub,imu_data) ##GPS发布函数相关设置def publish_gps(gps_pub,imu_data):    gps = NavSatFix()    gps.header.frame_id = FRAME_ID    gps.header.stamp = rospy.Time.now()        #gps经度、纬度、海拔高度    gps.latitude = imu_data.lat    gps.longitude = imu_data.lon    gps.altitude = imu_data.alt        gps_pub.publish(gps) 
复制代码


2.6 在 rviz 上显示 2D 侦测框

#读取2D检测框数据boxes_2d = np.array(df_tracking_frame[['bbox_left', 'bbox_top', 'bbox_right', 'bbox_bottom']])types = np.array(df_tracking_frame['type'])
## 2D框相关设置for typ,box in zip(types,boxes): top_left = int(box[0]),int(box[1]) bottom_right = int(box[2]),int(box[3]) cv2.rectangle(image,top_left,bottom_right,DETECTION_COLOR_DICT[typ],2)cam_pub.publish(bridge.cv2_to_imgmsg(image,"bgr8"))
复制代码



2.7 在 rviz 上显示 3D 侦测框

 #读取3D检测框数据boxes_3d = np.array(df_tracking_frame[['height', 'width', 'length', 'pos_x', 'pos_y', 'pos_z', 'rot_y']]      corners_3d_velos = []for box_3d in boxes_3d:    corners_3d_cam2 = compute_3d_box_cam2(*box_3d)    corners_3d_velo = calib.project_rect_to_velo(corners_3d_cam2.T)    corners_3d_velos += [corners_3d_velo]  ##3D框发布函数相关设置def publish_3dbox(box3d_pub,corners_3d_velos,types):    marker_array = MarkerArray()    for i, corners_3d_velo in enumerate(corners_3d_velos):        # 3d box        marker = Marker()        marker.header.frame_id = FRAME_ID        marker.header.stamp = rospy.Time.now()                marker.id = i        marker.action = Marker.ADD        marker.lifetime = rospy.Duration(LIFETIME)        marker.type = Marker.LINE_LIST                        b, g, r = DETECTION_COLOR_DICT[types[i]]            marker.color.r = r/255.0        marker.color.g = g/255.0        marker.color.b = b/255.0        marker.color.a = 1.0                marker.scale.x = 0.1                marker.points = []        for l in LINES:            p1 = corners_3d_velo[l[0]]            marker.points.append(Point(p1[0], p1[1], p1[2]))            p2 = corners_3d_velo[l[1]]            marker.points.append(Point(p2[0], p2[1], p2[2]))        marker_array.markers.append(marker)            box3d_pub.publish(marker_array)
复制代码


3、代码合集

代码托管在 Gitee 上,自行下载:代码


咻咻咻咻~~duang~~点个赞呗


下一篇:使用kitti数据集实现自动驾驶——绘制出所有物体的行驶轨迹

发布于: 刚刚阅读数: 3
用户头像

秃头小苏

关注

还未添加个人签名 2022.07.01 加入

还未添加个人简介

评论

发布
暂无评论
使用kitti数据集实现自动驾驶——发布照片、点云、IMU、GPS、显示2D和3D侦测框_7月月更_秃头小苏_InfoQ写作社区