apollo lattice算法调试环境和源码分析 添加了动态障碍物
调试Apollo Lattice算法就像在玩高配版的《欧洲卡车模拟》——只不过翻车代价是删库。先打开三个终端:一个启动Dreamview看上帝视角,一个用cyber_monitor盯着数据流,还有个留着随时触发segmentation fault。
动态障碍物处理的核心藏在modules/planning/lattice/trajectory_generation这个目录。看看这段轨迹采样代码:
for (double s = 0; s < max_s; s += s_resolution_) { for (double t = 0; t < max_t; t += t_resolution_) { auto trajectory = GenerateSingularSegment(s, t, obstacles); if (!CheckCollision(trajectory)) { candidates.emplace_back(std::move(trajectory)); } } }这暴力美学堪比穷举法破解WiFi密码。sresolution和tresolution这两个参数调不好,要么规划出癫痫路径,要么直接把CPU烧到80度。上次我把分辨率调高0.1,自动驾驶车在十字路口跳起了8字舞。
动态障碍物的预测模块更刺激,看看障碍物状态预测的卡尔曼滤波实现:
void DynamicObstacle::Predict(double delta_t) { Eigen::MatrixXd transition(4, 4); // 状态矩阵: x,y,vx,vy transition << 1, 0, delta_t, 0, 0, 1, 0, delta_t, 0, 0, 1, 0, 0, 0, 0, 1; state_ = transition * state_; }这代码假设所有障碍物都在做匀速直线运动,现实中遇到变道加塞的司机,预测轨迹会比女朋友的心思还难猜。有次测试时遇到个突然刹车的假人障碍物,规划轨迹直接画出个麦田怪圈。
调试时必备的骚操作:
- 在local_integ.cc里插入ADEBUG << "轨迹第" << i << "点坐标:" << point.DebugString();
- 用python脚本实时绘制候选轨迹热力图
- 把规划周期从100ms改成500ms,看算法如何在延迟卡顿中挣扎求生
当算法终于避开动态障碍物时,别高兴太早——很可能只是因为它把静止的树当成了幽灵障碍物。这时候该去检查referencelineprovider是不是喝了假酒,或者st_graph的数据边界条件设成了俄罗斯轮盘赌模式。