// 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)
过程
输入: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的详细过程就不详述了,一幅图解释,得到的是路(左右两侧)+ 路口的区域的点云
| | |
| | |
_______| | |_______
_______ _______
_______ _______
| | |
| | |
| . | |
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所占的格子里面
原文地址:http://blog.51cto.com/4075369/2072874