apollo2.0 lidar代碼分析(未寫完)
阿新 • • 發佈:2018-02-25
自動駕駛 激光雷達 1. 概述
// lidar輸出數據定義
class Velodyne的產品RawFrame : public SensorRawFrame
{
public:
VelodyneRawFrame() {}
~VelodyneRawFrame() {}
public:
pclutil::PointCloudPtr cloud;
};
主函數
bool LidarProcess::Process(const double timestamp, PointCloudPtr point_cloud,
std::shared_ptr<Matrix4d> velodyne_trans)
過程
- 從hdmap取得ROI
- BaseROIFilter的子類過濾掉roi以外的點雲 輸出PointCloudPtr roi_cloud
- BaseSegmentation子類分割點雲,輸出std::vector<ObjectPtr> objects
- BaseObjectBuilder子類初始化objects的部分成員變量
- BaseTracker子類跟蹤object,形成軌跡
2. 從hdmap取得ROI
輸入:lidar位置變化,std::shared_ptr<Eigen::Matrix4d> velodyne_trans FLAGS_map_radius,ROI半徑,命令行參數map_radius,定義在perception_gflags.h中,默認60.0 輸出:HdmapStructPtr hdmap struct alignas(16) HdmapStruct { std::vector<RoadBoundary> road_boundary; std::vector<PolygonDType> junction; }; struct alignas(16) RoadBoundary { PolygonDType left_boundary; PolygonDType right_boundary; }; PolygonDType是pcl_util::PointDCloud類型 過程:1. 依據lidar位置變化,把坐標原點做一次仿射變換 2. 調用函數bool HDMapInput::GetROI,找到指定中心位置和半徑的roi 在apollo-master-2.0/modules/map/data/demo目錄裏面,可以找到apollo默認的hdmap數據,txt格式 GetROI的詳細過程就不詳述了,一幅圖解釋,得到的是路(左右兩側)+ 路口的區域的點雲 | | | | | | _______| | |_______ _______ _______ _______ _______ | | | | | | | . | |
3. roi_filter過濾掉roi以外的點雲
BaseROIFilter有兩個子類 |--- DummyROIFilter(默認的,純粹打醬油) |--- HdmapROIFilter(實際有作用的) 我們只關註bool HdmapROIFilter::Filter這個函數,過程如下 1. 道路和路口的區域合二為一,std::vector<PolygonDType> polygons 2. TransformFrame,cloud和polygons變換到同一坐標系 3. FilterWithPolygonMask過濾cloud,過程如下 a. 抽取第一步得到的polygons的x,y坐標,z坐標拋棄,得到std::vector<PolygonScanConverter::Polygon> raw_polygons 若x的範圍大,則選取x方向位主方向(MajorDirection)。反之,取y b. 構建一個Bitmap2D,Bitmap2D是一個vector嵌套vector的結構,它的行數和列數是這樣定義的 把x(-range_, -range_),y(range_, range_)這樣的範圍按照(cell_size_, cell_size_)的大小,劃分成許多個小格子 Bitmap2D的行數等於主方向上的格子數,列數等於另一個方向上的格子數做如下數學運算,(dims[op_dir_major_] >> 6) + 1; c. DrawPolygonInBitmap把polygons全部畫到這張圖上,示例圖沒畫(以後補上) 邊界連線可能占一個格子的任何一小塊,於是,要確定polygons是否應該占這個格子,這個函數就是把polygons所占的格子打上標記 d. 依次檢查cloud的點是否在polygons所占的格子裏面
4. 分割點雲
apollo2.0 lidar代碼分析(未寫完)