实战 | 详解Apollo 换道

作者 | 徐明  编辑 | 汽车人

原文链接:https://zhuanlan.zhihu.com/p/665125585

点击下方卡片,关注“自动驾驶之心”公众号

ADAS巨卷干货,即可获取

点击进入→自动驾驶之心【全栈算法】技术交流群

本文只做学术分享,如有侵权,联系删文

1. 介绍

1.1. 换道的功能

简单地说, 换道的作用就是从待选地参考线中选择其中一个参考线, 供 Planning 后续模块进行使用.

ad8aec094eb0e602fa8283b82ba52040.png

需要说明的是, Apollo 所开源出的换道代码经过了过多的删减, 只有一个简单的框架. 有很多功能, 比如主动换道, 由于障碍物产生的被动换道, 较为完整的状态机, 换道窗口和 Gap 的选择等等功能都是缺失的. 本技术文章也只展现现有框架上的内容. 关于其他的换道功能请期待后续的内容.

1.2. 换道状态机

Apollo 当前的换道状态机如下:

a167b66b5b054671407de7cbf949e218.png

对状态机有一下几点值得注意:

  • 这里的IN_CHANGE_LANE同时包含了换道执行和换道准备两个阶段. 正常情况下应该加以区分. Apollo 采取的是先切换参考线后执行换道动作的方法, 也有友商会采用先执行换道动作在切换参考线的方法(好处是切换参考线的那一帧, 自车的横向距离接近于 0).

  • 当前代码中并没有体现出什么时候会换道失败. 同样有理由相信是由于删除相关代码导致的.

  • 完整的换道状态应该至少包含: 换道准备, 换道执行, 换道保持, 换道取消, 换道完成等状态.

2. 代码解析

2.1. 整体流程

相关代码所在路径: modules/planning/tasks/deciders/lane_change_decider/http://lane_change_decider.cc

  1. 处理reference_line_info为空的异常情况.

  2. 如果配置了强制换道reckless_change_lanetrue, 则直接更新 Reference Line.

  3. 获取上一帧的换道状态prev_status, 刚进入程序时, 可能prev_status没有状态信息(!prev_status->has_status()), 此时直接认为处于换道完成状态.

  4. 如果reference_line_info的数量为 1(即has_change_lanefalse), 说明自车处在巡迹状态, 自车当前所在的车道拥有唯一的车道线, 周围没有可变车道, 所以直接更新换道状态即可.

  5. 切换换道的状态机

  • 上一帧处在换道状态ChangeLaneStatus::IN_CHANGE_LANE: 如果上一帧自车所在的 Lane 和这一帧所在的 Lane 相同, 说明自车还在往目标车道上走. 反之如果上一帧自车所在的 Lane 和这一帧所在的 Lane 不同, 说明自车已经在目标车道上了, 切换已经完成.

  • 上一帧处在换道失败状态ChangeLaneStatus::CHANGE_LANE_FAILED: 如果换道失败, 则冻结状态一段时间, 然后切换到正在换道状态, 为下一次换道做准备.

  • 上一帧处在换道完成状态ChangeLaneStatus::CHANGE_LANE_FINISHED: 换道成功后同样冻结一段时间, 然后切换到正在换道状态, 为下一次换道做准备. 这里冻结时间是为了避免频繁换道.

2.2. 安全检查

IsClearToChangeLane判断换道是否安全.

  1. 本安全判断方法不考虑虚拟障碍物(Virtual Obstacles)和静态障碍物(Static Obstacles).

  2. 计算动态障碍物在 Reference Line 上面的投影. 投影的几何意义如下图所示:

e1f9fe213ed52f825f696f773d0fe5a6.png
  1. 如果自车正在换道IsChangeLanePath, 利用上面计算的投影关系来忽略目标参考线的车道之外的障碍物.

  2. 判断障碍物的行驶方向是否和自车相同same_direction. 根据障碍物与自车的行驶方向的关系和速度关系分别计算前向安全距离和后向安全距离.

  3. 如果自车和障碍物之间的距离大于上面计算的安全距离, 则认为可以安全换道的. HysteresisFilter是一种 Open Close 逻辑, 目的是增加安全判断结果的稳定性(上一帧判断结果认为是安全的, 那么这一帧就更倾向于给出是安全的判断, 反之亦然).

2.3. 更新 Reference Line

LaneChangeDecider::PrioritizeChangeLane

  1. 输入: is_prioritize_change_lane. 如果is_prioritize_change_lanetrue, 则找自车要切换的目标参考线. 反之如果is_prioritize_change_lanefalse, 则找自车当前位置所在的 Lane 所在的参考线.

  2. reference_line_info->splice(reference_line_info->begin(),*reference_line_info, iter);将步骤 1 找到的iter所指向的参考线放在链表的最前面. 由于 Planning 后续模块使用的都是reference_line_info().front(), 所以链表的最前面就表示当帧就是使用的参考线. splice的使用详细说明见C++ 基础.

  3. 输出: ReferenceLineInfo链表.

参考文献

[1] Apollo Lane Change - Github

① 全网独家视频课程

BEV感知、毫米波雷达视觉融合多传感器标定多传感器融合多模态3D目标检测点云3D目标检测目标跟踪Occupancy、cuda与TensorRT模型部署协同感知语义分割、自动驾驶仿真、传感器部署、决策规划、轨迹预测等多个方向学习视频(扫码即可学习

6081c91192d5f738b78c82cb3c7f944e.png 视频官网:www.zdjszx.com

② 国内首个自动驾驶学习社区

近2000人的交流社区,涉及30+自动驾驶技术栈学习路线,想要了解更多自动驾驶感知(2D检测、分割、2D/3D车道线、BEV感知、3D目标检测、Occupancy、多传感器融合、多传感器标定、目标跟踪、光流估计)、自动驾驶定位建图(SLAM、高精地图、局部在线地图)、自动驾驶规划控制/轨迹预测等领域技术方案、AI模型部署落地实战、行业动态、岗位发布,欢迎扫描下方二维码,加入自动驾驶之心知识星球,这是一个真正有干货的地方,与领域大佬交流入门、学习、工作、跳槽上的各类难题,日常分享论文+代码+视频,期待交流!

e13223531282a98577321daf6bbe02fb.png

③【自动驾驶之心】技术交流群

自动驾驶之心是首个自动驾驶开发者社区,聚焦目标检测、语义分割、全景分割、实例分割、关键点检测、车道线、目标跟踪、3D目标检测、BEV感知、多模态感知、Occupancy、多传感器融合、transformer、大模型、点云处理、端到端自动驾驶、SLAM、光流估计、深度估计、轨迹预测、高精地图、NeRF、规划控制、模型部署落地、自动驾驶仿真测试、产品经理、硬件配置、AI求职交流等方向。扫码添加汽车人助理微信邀请入群,备注:学校/公司+方向+昵称(快速入群方式)

a3baa1c15a5eb0f7f70a0facf1f09cb6.jpeg

④【自动驾驶之心】平台矩阵,欢迎联系我们!

a8ca28e5a6c01f489c6d6c4d034d9df5.jpeg

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据引用中的解释,Apollo并没有明确的换道时机或状态来决定是否进行换道。相反,Apollo通过自身计算来确定换道时机和安全性。类似于人类驾驶员,只有在觉得安全和有必要的情况下才会执行换道动作。 换道的过程不仅仅局限于一个逻辑或任务,而是需要计算换道的边界,并规划出相应的换道轨迹。换道的必要性不是先有了需要换道才进行计算,而是通过计算来判断最终是否安全和有必要进行换道换道状态信息存储在Apollo的injector->planning_context()->mutable_planning_status()->mutable_change_lane()中。而LaneChangeDecider的主要作用是更新状态,具体实现是通过UpdateStatus函数来更新状态信息。 此外,引用提到了判断是否为可变车道的方法,如果车辆不在车道片段上,则该车道被视为可变车道。而引用中提到了是否强制换道的逻辑,如果启用了优先换道功能,则会调用相应的函数进行处理。 因此,Apollo进行换道的过程涉及到计算换道时机和安全性、更新换道状态信息以及判断是否为可变车道和是否强制换道。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Apollo Planning学习(3)-------LANE_CHANGE_DECIDER](https://blog.csdn.net/m0_71477431/article/details/128794250)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [百度Apollo5.0规划模块代码学习(四)换道决策分析](https://blog.csdn.net/wwyklnh/article/details/99069910)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值