感知要实现的功能:
看代码从此处开始
dag文件启动:
mainboard -d 路径/***.dag
上图所示为conf文件下一个64线Lidar的配置文件。
value:对应配置文件的目录
流程:
点云预处理→3D障碍物检测→目标追踪→融合
输出:
type类型(车辆、行人、非机动车道?)、distance目前空间中的位置、velocity(当前速度)、航向角(heading)
首先需要了解dag文件。
上图流程中检测到的障碍物detection objects是单帧的。
module_config:
module_library:说明最终会生成一个二进制文件.so
components:实现哪些功能
components/config_file_path:即1.3.1中的config文件,其config目录
reader:该模块读取哪个channel的数据
检测模块
上游:128线激光雷达拿到的数据
点云补偿等
输出:检测到的障碍物
追踪模块
输出:融合之前的障碍物
融合模块
fusion_method:概率融合
通过.so可执行文件搜索其源码,可知它由如下build文件产生。
deps:再查看deps中的target——inner_lidar又由什么生成,同理一层一层寻找。
可在component的BUILD里边查看。
代码结构
proto文件和配置文件相互对应
设计模式
比如右侧detector:可通过多种方式实现,但实现的时候只能采用其中一。通过配置文件选取指定detector。
补充CNN和Pointpillars
图片是三个通道。
9个通道:
(x,y,z):空间位置
r:点云强度
xc:中心
其他点云点相对于中心的偏移
再类似图像的3个通道卷积,这里对9个通道进行卷积操作。
紫色圆框:先缩小分辨率;再上采样(方便检测体积不同的障碍物)
代码结构
匹配过程中考虑因素:类型相近、大小、heading等。
得到障碍物轨迹后可用来做预测:如下2为直行趋势,3为右转趋势。
optimizer里边。
1可以匹配的有a和b,所以可暂时1匹配a;
2可以匹配的有b和c,所以可暂时2匹配b;
此时3已无新的可匹配项,故让3匹配a,再让1匹配另一个(此时1还有得选),依次推到2也要更改匹配为c。
d:可能是新出现的障碍物
4:可能是已经消失的障碍物,若持续几帧还未检测到,则将之抛弃。
location距离不会相差太大;
direction即heading也不会相差太大,不太可能前一帧向前后一帧向后;
大小。
最下函数专门计算各个维度的distance。
代码结构
右下思维导图解析:
卡尔曼滤波
假设它匀速运动,可得到Xt时刻的位置:
Xm为地图测量得到的位置
此时该信哪一个位置呢?Xt还是Xm?
可通过权重分配进行计算,若传感器精度较为精确,可赋予Xm更高的权重后进行计算:
上述tracking障碍物已具有速度。
代码结构
左上:max_lidar_invisible_period,允许最大跟丢时间;不同传感器设定不同阈值;
右下:每个传感器特性不一样因此每个传感器融合的距离也有所不一。
配置文件先打开。
从include里边找到依赖库
此时是基类,可查看是哪里引用了它,便可找到它的派生类。
DS证据理论
dag文件
若果没有红绿灯信息会返回进行下一次的查询;
获取红绿灯ID后获取其在点云中的位置(高精地图中的位置);
长焦摄像头:
短焦摄像头:
这张会被舍去,转而锁定短焦摄像头那一张;若两张摄像头都可见,则选择清晰的那一张。
投影后:
时序预测修正