1. 程式人生 > >apollo2.0 lidar代碼分析(未寫完)

apollo2.0 lidar代碼分析(未寫完)

自動駕駛 激光雷達

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)
過程

  1. 從hdmap取得ROI
  2. BaseROIFilter的子類過濾掉roi以外的點雲 輸出PointCloudPtr roi_cloud
  3. BaseSegmentation子類分割點雲,輸出std::vector<ObjectPtr> objects
  4. BaseObjectBuilder子類初始化objects的部分成員變量
  5. 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代碼分析(未寫完)