使用kitti資料集實現自動駕駛——釋出照片、點雲、IMU、GPS、顯示2D和3D偵測框
持續創作,加速成長!這是我參與「掘金日新計劃 · 6 月更文挑戰」的第13天,點選檢視活動詳情
本次內容主要是使用kitti資料集來視覺化kitti車上一些感測器(相機、鐳射雷達、IMU)採集的資料以及對行人和車輛進行檢測並在影象中畫出行人和車輛的2D框、在點雲中畫出行人和車輛的3D框。
首先先看看最終實現的效果:
看了上面的效果視訊,是不是充滿好奇了呢,下面讓我們一步步的來學習。。。
1、準備工作
1.1資料集下載
在開始之前,先做一些準備工作,即從kitti上下載相關資料:kitty官網
如圖所示:下載途中箭頭所指的兩個檔案【注:需要先進行註冊】
除了下載這兩個檔案,後面還需要下載汽車模型檔案和標註檔案,這裡直接貼出下載地址:資料下載
1.2 建立工作空間並建立一些檔案
- 建立功能包
c
cd ~/catkin_ws/src
catkin_create_pkg kitti_turtorial rospy
- 在剛建立的功能包下的src資料夾中建立以下python檔案
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) ```
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) ```
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) ```
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)
```
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")) ```
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)
```
3、程式碼合集
程式碼託管在Gitee上,自行下載:程式碼
咻咻咻咻~~duang\~~點個讚唄
- 兔年到了,一起來寫個春聯吧
- CV攻城獅入門VIT(vision transformer)之旅——VIT程式碼實戰篇
- 對抗生成網路GAN系列——GANomaly原理及原始碼解析
- 對抗生成網路GAN系列——WGAN原理及實戰演練
- CV攻城獅入門VIT(vision transformer)之旅——近年超火的Transformer你再不瞭解就晚了!
- 對抗生成網路GAN系列——DCGAN簡介及人臉影象生成案例
- 對抗生成網路GAN系列——CycleGAN簡介及圖片春冬變換案例
- 對抗生成網路GAN系列——AnoGAN原理及缺陷檢測實戰
- 目標檢測系列——Faster R-CNN原理詳解
- 目標檢測系列——Fast R-CNN原理詳解
- 目標檢測系列——開山之作RCNN原理詳解
- 【古月21講】ROS入門系列(4)——引數使用與程式設計方法、座標管理系統、tf座標系廣播與監聽的程式設計實現、launch啟動檔案的使用方法
- 使用kitti資料集實現自動駕駛——繪製出所有物體的行駛軌跡
- 使用kitti資料集實現自動駕駛——釋出照片、點雲、IMU、GPS、顯示2D和3D偵測框
- 基於pytorch搭建ResNet神經網路用於花類識別
- 基於pytorch搭建GoogleNet神經網路用於花類識別
- 基於pytorch搭建VGGNet神經網路用於花類識別
- UWB原理分析
- 論文閱讀:RRPN:RADAR REGION PROPOSAL NETWORK FOR OBJECT DETECTION IN AUTONOMOUS
- 凸優化理論基礎2——凸集和錐