Apollo 5.0 源碼學習筆記(四)| 感知模塊 | 激光感知

本系列博客旨在記錄自己在學習百度無人駕駛開源框架Apollo的心得和體會,歡迎大家閱讀和點贊,並提出寶貴意見,大家相互學習,如需轉載,請註明出處,謝謝!

激光感知模塊目錄結構

文件夾結構:以下文件夾都是在perception/lidar/
app——lidar應用類,主處理類,即最終應用程序應該是實例化該文件夾下的類來完成
common——定義lidar感知模塊需要用的通用數據結構,例如LidarFrame,通用處理方法等;
lib——激光雷達感知中算法實現庫
interface——各種算法類的基類定義,作爲算法通用類的接口
lib/roi_filter——包含hdmap_roi_filter和roi_service_filter兩個文件夾,前者用來利用高精度地圖的信息來對LidarFrame中給出的高精度地圖查詢信息對點雲進行ROI限制。

perception/map/hdmap——用在感知模塊用來查詢與高精度地圖相關的信息。

DAG文件描述了整個系統的拓撲關係,也定義了每個Component需要訂閱的話題:modules/perception/production/dag/dag_streaming_perception.dag;

激光雷達感知模塊的目標https://github.com/ApolloAuto/apollo/issues/9588

傳感器配置:

配置參數:
proto定義:modules/perception/proto/sensor_meta_schema.proto
具體實現:modules/perception/production/data/perception/common/sensor_meta.pt
傳感器管理類:
SensorManager類:modules/perception/common/sensor_manager/sensor_manager.h

Lidar處理流程:

激光雷達感知模塊處理過程包括點雲分割-》目標分類-》目標跟蹤,涉及到的處理類有SegmentationComponentRecognitionComponent

我們首先看一下激光感知處理過程中的消息變化和對應的話題:

drivers::PointCloud[/apollo/sensor/velodyne128、/apollo/sensor/lidar_front, lidar_rear_left, lidar_rear_right]->LidarFrameMessage[/perception/inner/SegmentationObjects]->SensorFrameMessage[/perception/inner/PrefusedObjects]->
PerceptionObstacles[/apollo/perception/obstacles]

Lidar相關類型定義:

LidarFrame[modules/perception/lidar/common/lidar_frame.h]——一幀的激光雷達幀數據,包含該幀激光雷達原始點雲cloud、世界座標系下點雲world_cloud、激光雷達位姿lidar2world_pose、分割出的目標序列segmented_objects、跟蹤目標序列tracked_objects,以及其他一些屬性;

SegmentationComponent—— 點雲分割類

modules/perception/onboard/component/segmentation_component.h
輸入drivers::PointCloud類型點雲,
輸出LidarFrameMessage,話題名爲:/perception/inner/SegmentationObjects
該類配置參數proto定義:modules/perception/onboard/proto/lidar_component_config.proto
具體實現文件在:modules/perception/production/conf/perception/lidar/velodyne16_segmentation_conf.pb.txt,每個激光雷達一個實現文件。

通過modules/perception/lidar/app/lidar_obstacle_segmentation.cc中的LidarObstacleSegmentation類完成實際激光雷達點雲分割工作;

LidarObstacleSegmentation——點雲分割類

目的:分割原始點雲,得到分割目標序列,即完成對點雲目標的分割,得到屬於該分割目標的點雲,並擬合輪廓,得到bbox等屬性;

LidarObstacleSegmentation::Process函數
1、首先進行點雲預處理——主要對輸入點雲進行範圍濾波、範圍限定等操作,填充lidar_frame->cloud,同時進行座標變換,得到world_cloud
2、然後調用MapManager::Update,在絕對座標系下即高精度地圖座標系下根據激光雷達的絕對位置找到周圍感興趣區域,填充lidar_frame->hdmap_struct
3、調用分割算法:實際調用的是CNNSegmentation::Segment填充lidar_frame->segmented_objects向量
4、調用ObjectBuilder::Build函數計算segmented_objects中目標的polygon、center、anchor_point等屬性;
5、調用ObjectFilterBank:對分割後目標進行ROIBoundaryFilter
即調用之前找到的激光雷達周圍高精度地圖感興趣區域,來限定部分激光雷達目標;

RecognitionComponent——目標識別與跟蹤

modules/perception/onboard/component/recognition_component.h
輸入LidarFrameMessage
輸出SensorFrameMessage,話題名:"/perception/inner/PrefusedObjects"
跟蹤分割後的點雲目標,估計目標運動信息,填充LidarFrametracked_objects數據域。
參數配置:
具體實現文件在:modules/perception/production/conf/perception/lidar/recognition_conf.pb.txt
主傳感器是velodyne64Apollo5.5改爲velodyne128了。
具體算法流程:
通過modules/perception/lidar/app/lidar_obstacle_tracking.cc中的LidarObstacleTracking類完成
算法類的配置參數定義在:modules/perception/production/data/perception/lidar/models/lidar_obstacle_pipeline/velodyne16/lidar_obstacle_tracking.conf
可以看出實際使用的multi_target_trackerMlfEngine,fusion_classifierFusedClassifier
調用多目標跟蹤算法:實際調用的是MlfEngine類的Track函數;
調用FusedClassifier算法:對目標序列進行分類,填充目標類型信息;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章