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

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

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

1、准备工作

1.1数据集下载

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

如图所示:下载途中箭头所指的两个文件【注:需要先进行注册】08f6057cb16344da8b53773b594f85b8.png除了下载这两个文件,后面还需要下载汽车模型文件和标注文件,这里直接贴出下载地址:数据下载

248c795b18844d75b904ddb22e59c01a.png

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

  • 创建功能包
cd ~/catkin_ws/src
catkin_create_pkg kitti_turtorial rospy 
  • 在刚创建的功能包下的src文件夹中创建以下python文件6e933a44fdea4da783e4531ede18d1a9.png

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)

35ef51f76e574d8c84aa4c0283fb5c8c.png

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)

b1239ac954e242a5a4d5d843c3516c45.png

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

#创建一个汽车的发布者
ego_pub = rospy.Publisher('kitti_ego_car',MarkerArray,queue_size=10)
#发布ego_car数据
publish_ego_car(ego_pub)
##绘制车子的照相机视野
marker.id = 0
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))
marker_array.markers.append(marker)

365369d4c177490ebbde87241c7211d9.png

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)

823e64f7ae4a409ab2d565b005a9e619.png

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"))

744ecf199def476a9dc7c6096c89b6e9.png

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)

3e9fff17c1ca44558870587957afe396.png

3、代码合集

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



相关文章
|
2月前
|
传感器 算法 数据处理
yolo目标检测+目标跟踪+车辆计数+车辆分割+车道线变更检测+速度估计
yolo目标检测+目标跟踪+车辆计数+车辆分割+车道线变更检测+速度估计
125 0
|
2月前
|
存储 传感器 数据安全/隐私保护
CVPR 2024 Highlight:基于单曝光压缩成像,不依赖生成模型也能从单张图像中重建三维场景
【5月更文挑战第15天】CVPR 2024会议上,清华大学研究人员提出的SCINeRF利用单曝光压缩成像(SCI)技术结合神经辐射场(NeRF)进行3D场景重建。SCI以低成本捕捉高维数据,而SCINeRF将SCI的成像过程融入NeRF训练,实现复杂场景的高效重建。实验显示,该方法在图像重建和多视角图像生成方面取得优越性能,但实际应用仍需解决SCI系统设计、训练效率和模型泛化等挑战。[Link: https://arxiv.org/abs/2403.20018]
57 2
|
2月前
|
机器学习/深度学习 算法 前端开发
高速公路表面图像裂缝检测程序
高速公路表面图像裂缝检测程序
|
2月前
|
算法 定位技术 图形学
基于Pix4Dmapper的运动结构恢复无人机影像三维模型重建
基于Pix4Dmapper的运动结构恢复无人机影像三维模型重建
|
2月前
|
传感器 机器学习/深度学习 存储
使用激光雷达(LiDAR)和相机进行3D物体跟踪
使用激光雷达(LiDAR)和相机进行3D物体跟踪
|
机器学习/深度学习 JavaScript 前端开发
Mediapipe三维实时人体关键点检测与追踪(一)
Mediapipe三维实时人体关键点检测与追踪(一)
1124 0
|
传感器 存储 编解码
使用激光雷达数据构建地图并使用SLAM算法估计车辆轨迹
使用激光雷达数据构建地图并使用SLAM算法估计车辆轨迹。
171 0
|
计算机视觉 C++
【影像配准】遥感影像配准精度评价—特征点检测精度评价(附有完整代码)
【影像配准】遥感影像配准精度评价—特征点检测精度评价(附有完整代码)
|
自动驾驶 算法 Python
车道线识别(附代码)
车道线识别(附代码)
208 0
车道线识别(附代码)
|
传感器 机器学习/深度学习 算法
SIGGRAPH | 6个惯性传感器和1个手机实现人体动作捕捉、定位与环境重建(1)
SIGGRAPH | 6个惯性传感器和1个手机实现人体动作捕捉、定位与环境重建
181 0