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. 分割点云