解读Autoware.Universe规划模块:Behavior Path Planner
更新日期:2022年11月23日
前言
Autoware 是世界领先的自动驾驶开源软件架构1。Autoware 是基于 ROS 环境开发,大规模地促进了自动驾驶的商业部署。2022年,Autoware Foundation 官方发布了基于 ROS2 的更新版本,其中
- Autoware.Auto 2 是继 Autoware.AI 之后到基于 ROS2 的升级版本。
- Autoware.Universe 3 则是为研究者和开发者建立的一个更具有试验性和更前沿的 ROS packages的存储库(repository)。
- Autoware.Core 是基于 Autoware.Auto 和 Autoware.Universe,是高质量和稳定的 ROS packages 的主要存储库(main repository)。(目前还是空的,会逐渐从 Autoware.Universe 导入代码。)
本系列文章以翻译 Autoware.Universe 的官方文档4为基础,首先力求传达准确,再行扩展。在专业术语的表达上,尽量尊重原文,往往以中文翻译(原英文表达)的形式,在找不到合理的翻译的情况,则直接使用原英文术语。
笔者从开发者的角度,不希望只是笼统地照搬原文档,会适当加入自己的理解和笔记。更重要的是,概念要和实践相结合。理论很美好,我感兴趣的是,实际应用的效果如何,所以可以预期在每个主题中都会有一些代码级的实践和记录。
文章列表
行为路径规划器(Behavior Path Planner)
原始文档:Autoware.Universe官方文档:Behavior Path Planner 5
目的(Purpose)
behavior_path_planner
模块负责生成
- 基于交通状况的路径(path),
- 车辆可以移动的可行驶区域(drivable area)(在路径消息中定义),
- 将被发送到车辆接口的转向信号(turn signal) 命令。
场景(Use cases)
根据情况,系统会选择合适的场景模块,在行为树(behavior tree)系统上执行。
目前以下场景模块是被支持的:
- 车道跟随(Lane Following):从地图生成车道中心线。
- 车道变换(Lane Change):执行车道变换。该模块在必要时执行,并清除与其他车辆的碰撞检测。
- 避障(Obstacle Avoidance):执行避障。该模块用于避让停在车道边缘的车辆或超越(overtake)低速障碍物。
- 靠边停车(Pull Over):执行路边停车。当自车在道路车道上并且目标在路肩车道(shoulder lane)上时执行此模块。自车将停在目标位置。
- 路边起步(Pull Out):执行路边起步。当自车静止并且自车的车身包含在路肩车道(shoulder lane)中时执行此模块。当自车并入道路时,该模块结束。
- 侧向平移(Side Shift):(用于远程控制)根据外部指令将路径向左或向右移动。
对以下模块的支持目前还在开发中:
- 自由空间(Free Space): NA.
图片:当前支持的部分场景
设计
暂空。
输入 / 输出 / 接口
输入
/planning/mission_planning/route
[autoware_auto_planning_msgs/HADMapRoute
] : 当前从起始位置到目标位置的路线。/map/vector_map
[autoware_auto_mapping_msgs/HADMapBin
] : 地图信息。/perception/object_recognition/objects
[autoware_auto_perception_msgs/PredictedObjects
] : 从感知获取的动态物体。/perception/occupancy_grid_map/map
[nav_msgs/msg/OccupancyGrid
] : 从感知模块得到的占据网格地图(occupancy grid map),仅用于靠边停车模块。/tf
[tf2_msgs/TFMessage
] : 用于自车位姿。- /
localization/kinematic_state
[nav_msgs/Odometry
] : 用于自车速度。 path_change_approval
[std_msgs::Bool
] : 用于远程控制。path_change_force
[tier4_planning_msgs::PathChangeModule
] : 用于远程控制。
输出
path
[autoware_auto_planning_msgs/PathWithLaneId
] : 由模块生成的路径。path_candidate
[autoware_auto_planning_msgs/Path
] : 模块将要采用的路径。获得外部批准后立即执行。turn_indicators_cmd
[autoware_auto_vehicle_msgs/TurnIndicatorsCommand
] : 转向指示灯命令。hazard_lights_cmd
[autoware_auto_vehicle_msgs/HazardLightsCommand
] : 危险信号灯命令。force_available
[tier4_planning_msgs/PathChangeModuleArray
] :(用于远程控制)可强制执行的模块。ready_module
[tier4_planning_msgs/PathChangeModule
] : (用于远程控制)准备执行的模块。running_modules
[tier4_planning_msgs/PathChangeModuleArray
] : (用于远程控制)当前运行的模块。
内部工作 / 算法
可行驶区域生成(Drivable Area Generation)
被量化的可行驶车道被绘制成可行驶区域,其分辨率为 drivable_area_resolution
。为了防止量化导致规划模块不稳定,可行驶区域的位姿遵循以下规则。
- 在地图坐标中生成可行驶区域。
- 它的位置用
drivable_area_resolution
量化。 - 它的方向为 0。
可行驶区域的大小动态变化,以实现降低计算成本和覆盖足够多的车道。对于第二个目的,可行驶区域覆盖一定长度的前向和后向车道,余量(margin)由一些参数来定义。
用于可行驶区域生成的参数
参数名 | 单位 | 类型 | 描述 | 默认值 |
---|---|---|---|---|
drivable_area_resolution |
[m] | double | 可行驶区域图像的分辨率 | 0.1 |
drivable_lane_forward_length |
[m] | double | 可行驶区域覆盖的自车前向车道的长度 | 50.0 |
drivable_lane_backward_length |
[m] | double | 可行驶区域覆盖的自车后向车道的长度 | 5.0 |
drivable_lane_margin |
[m] | double | 可行驶区域覆盖的自车前向和后向车道余量 | 3.0 |
drivable_area_margin |
[m] | double | 可行驶区域的宽度和高度的余量 | 6.0 |
行为树(Behavior Tree)
在行为路径规划器中,行为树机制用于管理在哪些情况下激活哪些模块。总的来说,随着未来添加越来越多的模块,这种类似“行为管理器”的函数可以预期会变得更大。为了提高可维护性,我们采用了行为树。行为树具有以下优点:易于可视化,易于配置管理(可以通过替换配置文件来改变行为),与状态机相比具有较高的可扩展性。(笔者写有专门的文章比较行为树和状态机。6)
当前的行为树结构如下图所示。每个模块(LaneChange、Avoidance 等)都具有 Request、Ready 和 Plan 节点作为通用功能。
- Request:检查是否有来自模块的请求(例如 LaneChange 会在有多车道且车辆不在首选车道上时发出请求),
- Ready:检查执行计划是否安全(例如,当 lane_change 路径与 S-T 空间上的其他动态对象没有任何冲突时,LaneChange 准备就绪)。
- Plan:计算路径并将其设置为行为树的输出。它将会处于 running 状态,不会跳转到其他模块,直到内部状态返回 SUCCESS。
- ForceApproval:一个车道变换专有的节点,当从外部发出强制车道变换命令时,它会覆盖 Ready 的结果。
图片:当前的行为树结构
车道跟随(Lane Following)
从路线的中心线生成路径。
特殊情况
对于需要车道变换的路线,生成的路径与车道末端有特定的距离余量(默认:12.0 m),以确保车道变换的最小距离。 (此功能不仅适用于车道跟随,而且适用于所有模块。)