使用kitti資料集實現自動駕駛——釋出照片、點雲、IMU、GPS、顯示2D和3D偵測框

語言: CN / TW / HK

持續創作,加速成長!這是我參與「掘金日新計劃 · 6 月更文挑戰」的第13天,點選檢視活動詳情

本次內容主要是使用kitti資料集來視覺化kitti車上一些感測器(相機、鐳射雷達、IMU)採集的資料以及對行人和車輛進行檢測並在影象中畫出行人和車輛的2D框、在點雲中畫出行人和車輛的3D框。

首先先看看最終實現的效果:

視訊

看了上面的效果視訊,是不是充滿好奇了呢,下面讓我們一步步的來學習。。。

1、準備工作

1.1資料集下載

在開始之前,先做一些準備工作,即從kitti上下載相關資料:kitty官網

如圖所示:下載途中箭頭所指的兩個檔案【注:需要先進行註冊】

<img src="C:\Users\WSJ\AppData\Roaming\Typora\typora-user-images\image-20211219110748221.png" alt="image-20211219110748221" style="zoom:50%;" />

除了下載這兩個檔案,後面還需要下載汽車模型檔案和標註檔案,這裡直接貼出下載地址:資料下載

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-OnhRasMG-1639920546758)(C:\Users\WSJ\AppData\Roaming\Typora\typora-user-images\image-20211219111558235.png)]

1.2 建立工作空間並建立一些檔案

  • 建立功能包

c cd ~/catkin_ws/src catkin_create_pkg kitti_turtorial rospy

  • 在剛建立的功能包下的src資料夾中建立以下python檔案

<img src="C:\Users\WSJ\AppData\Roaming\Typora\typora-user-images\image-20211219204219255.png" alt="image-20211219204219255" style="zoom:67%;" />

2、詳細步驟

說明:該部分只是自己的學習筆記,故只會貼出每一步比較核心的程式碼,要想看懂整個流程,建議完整的觀看相關視訊:視訊

當然最後我也會貼出所有檔案的原始碼供大家學習

   

2.1 釋出照片

```python

建立一個攝像頭的釋出者

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

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-jcSwXiK1-1639920546763)(C:\Users\WSJ\AppData\Roaming\Typora\typora-user-images\image-20211219203514146.png)]

2.2 釋出點雲

```python

建立一個點雲的釋出者

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

<img src="C:\Users\WSJ\AppData\Roaming\Typora\typora-user-images\image-20211219203024911.png" alt="image-20211219203024911" style="zoom:67%;" />

2.3 畫出自己車子以及照相機視野

```python

建立一個汽車的釋出者

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

<img src="C:\Users\WSJ\AppData\Roaming\Typora\typora-user-images\image-20211219203102041.png" alt="image-20211219203102041" style="zoom:67%;" />

2.4 釋出IMU

```python

建立一個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)

```

<img src="C:\Users\WSJ\AppData\Roaming\Typora\typora-user-images\image-20211219203127402.png" alt="image-20211219203127402" style="zoom:67%;" />

2.5 釋出GPS

```python

建立一個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偵測框

```python

讀取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")) ```

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-VlxeydG9-1639920546766)(C:\Users\WSJ\AppData\Roaming\Typora\typora-user-images\image-20211219203301610.png)]

2.7 在rviz上顯示3D 偵測框

```python #讀取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)

```

<img src="C:\Users\WSJ\AppData\Roaming\Typora\typora-user-images\image-20211219203355050.png" alt="image-20211219203355050" style="zoom:67%;" />

3、程式碼合集

程式碼託管在Gitee上,自行下載:程式碼

   

咻咻咻咻~~duang\~~點個讚唄