更新日期:2022年11月23日
Autoware 是世界领先的自动驾驶开源软件架构1。Autoware 是基于 ROS 环境开发,大规模地促进了自动驾驶的商业部署。2022年,Autoware Foundation 官方发布了基于 ROS2 的更新版本,其中
本系列文章以翻译 Autoware.Universe 的官方文档4为基础,首先力求传达准确,再行扩展。在专业术语的表达上,尽量尊重原文,往往以中文翻译(原英文表达)的形式,在找不到合理的翻译的情况,则直接使用原英文术语。
笔者从开发者的角度,不希望只是笼统地照搬原文档,会适当加入自己的理解和笔记。更重要的是,概念要和实践相结合。理论很美好,我感兴趣的是,实际应用的效果如何,所以可以预期在每个主题中都会有一些代码级的实践和记录。
原始文档:Autoware.Universe官方文档:Behavior Path Planner 5
behavior_path_planner
模块负责生成
根据情况,系统会选择合适的场景模块,在行为树(behavior tree)系统上执行。
目前以下场景模块是被支持的:
对以下模块的支持目前还在开发中:
暂空。
/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_resolution
。为了防止量化导致规划模块不稳定,可行驶区域的位姿遵循以下规则。
drivable_area_resolution
量化。可行驶区域的大小动态变化,以实现降低计算成本和覆盖足够多的车道。对于第二个目的,可行驶区域覆盖一定长度的前向和后向车道,余量(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 |
在行为路径规划器中,行为树机制用于管理在哪些情况下激活哪些模块。总的来说,随着未来添加越来越多的模块,这种类似“行为管理器”的函数可以预期会变得更大。为了提高可维护性,我们采用了行为树。行为树具有以下优点:易于可视化,易于配置管理(可以通过替换配置文件来改变行为),与状态机相比具有较高的可扩展性。(笔者写有专门的文章比较行为树和状态机。6)
当前的行为树结构如下图所示。每个模块(LaneChange、Avoidance 等)都具有 Request、Ready 和 Plan 节点作为通用功能。
从路线的中心线生成路径。
对于需要车道变换的路线,生成的路径与车道末端有特定的距离余量(默认:12.0 m),以确保车道变换的最小距离。 (此功能不仅适用于车道跟随,而且适用于所有模块。)
当需要车道变换并可以安全执行时,车道变换模块会被激活。
preferred_lane
)上3.0 m
)。base_link
超过白色虚线之前,预测与对象发生碰撞(仅当 enable_abort_lane_change
为真时。)
10km/h
并且自车接近车道末端时,车道变换不会中止,自车会停住。然后,在预测不会有碰撞后,自车继续车道变换。ego_velocity * stop_time (2s)
),则判定为碰撞在自车速度恒定的假设下,在 n + m
秒内完成车道变换的路径。一旦执行车道变换,直到满足 “结束车道变换条件”(“finish-lane-change-condition” )后才会更新路径。
当要避让的动态对象存在并且可以安全地避让时,避让模块被激活。
满足以下条件的动态物体被认为是避让目标。
CAR
、TRUCK
或 BUS
1.0 m/s
)0.5 m
)1 m
余量)。为了防止自我位置附近的突然变化,在直线车道行驶一定距离后会生成一条避让路径。避让路径的生成过程如下:
2.0 m
)0.3 ~ 2.0 m/s^3
)如果有多个避让目标,并且这些目标的横向距离很近(默认值:< 0.5m
),则将这些对象视为单个避让目标,并通过单个转向操作同时执行避让。如果避让目标的横向距离与阈值相差很大,则使用多次转向操作来避让它们。
路径生成是在 Frenet 坐标系中计算的。用于避让的平移长度配置由四个分段恒定变加速度多项式生成,并添加到原始路径。由于横向变加速度可以近似地视为一种转向操作,因此该计算产生类似于回旋曲线(Clothoid curve)的结果。
当目标位置位于路肩车道(shoulder lane)时,靠边停车(Pull Over)模块将被激活。自车将停在目标处。
request_length
短(默认值:< 200m
)。1m
)0.01m/s
)。参数名 | 单位 | 类型 | 描述 | 默认值 |
---|---|---|---|---|
request_length |
[m] | double | 当自车接近目标至该距离时,模块被激活 | 200.0 |
th_arrived_distance |
[m] | double | 路径终端到达的距离阈值 | 1.0 |
th_stopped_velocity |
[m/s] | double | 到达路径终点的速度阈值 | 0.01 |
th_stopped_time |
[s] | double | 路径终端到达的时间阈值 | 2.0 |
pull_over_velocity |
[m/s] | double | 通过目标搜索区域减速到这个速度 | 2.0 |
pull_over_minimum_velocity |
[m/s] | double | 停止一次后的靠边停车的速度。这样可以防止过度减速。 | 1.38 |
margin_from_boundary |
[m] | double | 距路肩车道边缘的距离 | 0.5 |
decide_path_distance |
[m] | double | 判定路径相对于泊车位置是否接近到该距离。在这之后不进行路径规划和目标搜索 | 10.0 |
maximum_deceleration |
[m/s^2] | double | 最大减速度。防止突然找不到泊车路径时突然减速 | 1.0 |
从自车路径点生成轨迹,从占据网格相应晶格的值判定障碍物碰撞。
基于占据网格地图的碰撞检测参数
参数名 | 单位 | 类型 | 描述 | 默认值 |
---|---|---|---|---|
use_occupancy_grid |
[m] | double | 当自车接近目标至该距离时,模块被激活 | 200.0 |
use_occupancy_grid_for_longitudinal_margin |
[m] | double | 路径终端到达的距离阈值 | 1.0 |
occupancy_grid_collision_check_margin |
[m/s] | double | 到达路径终点的速度阈值 | 0.01 |
theta_size |
[s] | double | 路径终端到达的时间阈值 | 2.0 |
obstacle_threshold |
[m/s] | double | 通过目标搜索区域减速到这个速度 | 2.0 |
基于物体识别的碰撞检测参数
参数名 | 单位 | 类型 | 描述 | 默认值 |
---|---|---|---|---|
use_object_recognition |
- | bool | 是否使用物体识别用于碰撞检测的标志位 | true |
object_recognition_collision_check_margin |
[m] | double | 计算自车晶格到轨迹的余量 | 1.0 |
如果无法在给定目标处安全停车,则在路肩车道的特定范围内搜索 /planning/scenario_planning/modified_goal
。
视频链接:目标搜索是如何工作的
目标搜索的参数
参数名 | 单位 | 类型 | 描述 | 默认值 |
---|---|---|---|---|
search_priority |
- | double | 如果设置为 "efficient_path" , 使用一个可以生成高效路径的目标(优先级是 shift_parking -> arc_forward_parking -> arc_backward_parking)。如果设置为 "close_goal" , 使用最接近原始目标的目标。 |
"efficient_path" |
enable_goal_research |
- | bool | 是否开启搜索目标的标志位 | true |
forward_goal_search_length |
[m/s] | double | 从原始目标开始向前搜索的长度 | 20.0 |
backward_goal_search_length |
[s] | double | 从原始目标开始向后搜索的长度 | 20.0 |
goal_search_interval |
[m/s] | double | 目标搜索的距离间隔 | 2.0 |
longitudinal_margin |
[m/s] | double | 目标位置的自车与障碍物之间的距离余量 | 3.0 |
max_lateral_offset |
[m/s] | double | 横向目标搜索的最大偏移量 | 3.0 |
lateral_offset_interval |
[m/s] | double | 横向目标搜索距离间距 | 3.0 |
存在三种路径生成方法。生成的路径与路肩车道的左边界有一定的余量(默认值:0.5 m
)。
靠边停车距离由速度、横向偏差和横向变加速度计算得出。在预定的最小值和最大值中搜索横向加加速度,并且输出满足上述准备条件的横向变加速度。
视频链接:平移泊车是如何工作的
平移泊车的参数
参数名 | 单位 | 类型 | 描述 | 默认值 |
---|---|---|---|---|
enable_shift_parking |
- | bool | 是否启用平移泊车的标志位 | true |
pull_over_sampling_num |
- | int | 最小到最大横向变加速度之间的采样数 | 4 |
maximum_lateral_jerk |
[m/s^3] | double | 最大横向变加速度 | 2.0 |
minimum_lateral_jerk |
[m/s^3] | double | 最小横向变加速度 | 0.5 |
deceleration_interval |
[m] | double | 减速区间的距离 | 15.0 |
after_pull_over_straight_distance |
[m] | double | 靠边停车结束点后的直线距离 | 5.0 |
before_pull_over_straight_distance |
[m] | double | 靠边停车结束点前的直线距离。安全路径的距离应包括此 | 5.0 |
生成两条曲率不连续的圆弧路径。它在路径中间停了两次,用以原地控制转向。路径生成方法有前向和后向两种。有关算法的详细信息,另请参阅 7。还有一个简单的python实现。
几何侧方泊车的参数
参数名 | 单位 | 类型 | 描述 | 默认值 |
---|---|---|---|---|
arc_path_interval |
[m] | double | 圆弧路径的点间距 | 1.0 |
pull_over_max_steer_rad |
[rad] | double | 路径生成的最大转向角。停止时可能无法在 vehicle_info 中将转向控制到 max_steer_angle |
0.35 |
前向圆弧泊车(arc forward parking)
生成两条前向圆弧的路径。
图片:前向圆弧泊车(arc forward parking)
视频链接:前向圆弧泊车(arc forward parking)是如何工作的
前向圆弧泊车的参数
参数名 | 单位 | 类型 | 描述 | 默认值 |
---|---|---|---|---|
enable_arc_forward_parking |
- | bool | 标志是否启用弧形前向停车 | true |
after_forward_parking_straight_distance |
[m] | double | 靠边停车结束点后的直线距离 | 2.0 |
forward_parking_velocity |
[m/s] | double | 前向泊车的速度 | 1.38 |
forward_parking_lane_departure_margin |
[m/s] | double | 前向泊车时自车左前角的车道偏离余量 | 0.0 |
后向圆弧泊车(arc backward parking)
生成两条后向圆弧的路径。
图片:后向圆弧泊车(arc backward parking)
视频链接:后向圆弧泊车(arc backward parking)是如何工作的
后向圆弧泊车的参数
参数名 | 单位 | 类型 | 描述 | 默认值 |
---|---|---|---|---|
enable_arc_backward_parking |
- | bool | 是否启用后向泊车的标志位 | true |
after_backward_parking_straight_distance |
[m] | double | 靠边停车结束点后的直线距离 | 2.0 |
backward_parking_velocity |
[m/s] | double | 后向泊车的速度 | -1.38 |
backward_parking_lane_departure_margin |
[m/s] | double | 后向泊车时自车右前角的车道偏离余量 | 0.0 |
margin_from_boundary
设置为 0.0
等,则无法找到没有偏差的路径。当自车处于静止并且自车的轨迹包含在路肩车道中时,路边起步模块被激活。当自车并入道路时,该模块结束。
1.0m
)为准参数名 | 单位 | 类型 | 描述 | 默认值 |
---|---|---|---|---|
th_arrived_distance_m |
[m] | double | 到达路径终点的距离阈值 | 1.0 |
th_stopped_velocity_mps |
[m] | double | 到达路径终点的速度阈值 | 0.01 |
th_stopped_time_sec |
[m] | double | 到达路径终点的时间阈值 | 1.0 |
collision_check_margin |
[m] | double | 障碍物碰撞检测余量 | 1.0 |
pull_out_finish_judge_buffer |
[m] | double | 用于判定完成的到达路边起步结束点的距离阈值 | 1.0 |
1.0 m
),则判定为不安全路径有两种路径生成方法。
路边起步距离由速度、横向偏差和横向变加速度计算得出。横向变加速度在预定的最小值和最大值之间搜索,并选取能生成安全路径的那个变加速度。
视频链接:平移式路边起步是如何工作的
平移式路边起步的参数
参数名 | 单位 | 类型 | 描述 | 默认值 |
---|---|---|---|---|
enable_shift_pull_out |
[m] | bool | 是否启用平移式路边起步的标志位 | true |
shift_pull_out_velocity |
[m] | double | 平移式路边起步的速度 | 2.0 |
pull_out_sampling_num |
[m] | int | 横向变加速度(lateral_jerk )最小到最大范围内的采样数 |
4 |
before_pull_out_straight_distance |
[m] | double | 拉出起点前的距离 | 0.0 |
maximum_lateral_jerk |
[m] | double | 最大横向变加速度 | 2.0 |
minimum_lateral_jerk |
[m] | double | 最小横向变加速度 | 0.5 |
minimum_shift_pull_out_distance |
[m] | double | 最小平移式路边起步距离 | 20.0 |
生成两条曲率不连续的圆弧路径。自我车辆在路径中间停止一次以控制当场的转向。有关算法的详细信息,另请参阅 7。
视频链接:几何式路边起步是如何工作的
几何式路边起步的参数
参数名 | 单位 | 类型 | 描述 | 默认值 |
---|---|---|---|---|
enable_geometric_pull_out |
- | bool | 是否启用几何式路边起步的标志位 | true |
geometric_pull_out_velocity |
[m/s] | double | 几何式路边起步的速度 | 1.0 |
arc_path_interval |
[m] | double | 几何式路边起步的圆弧路径的路径点间距 | 1.0 |
lane_departure_margin |
[m] | double | 偏离右车道的余量 | 0.2 |
pull_out_max_steer_angle |
[rad] | double | 路径生成的最大方向盘转角 | 0.26 |
图片:后向路边起步起点搜索(backward pull out start point search)
视频链接:后向路边起步是如何工作的
后向路边起步的参数
参数名 | 单位 | 类型 | 描述 | 默认值 |
---|---|---|---|---|
enable_back |
- | bool | 是否向后搜索起点的标志位 | true |
search_priority |
- | string | 在设置为 efficient paths 情况下,使用比较高效的路径,即使后向距离更长。在设置为 short_back_distance 情况下,使用较短的后向距离 |
efficient paths |
max_back_distance |
[m] | double | 最大向后距离 | 15.0 |
backward_search_resolution |
[m] | double | 向后搜索路边起步起点的距离间隔 | 2.0 |
backward_path_update_duration |
[s] | double | 向后搜索路边起步起点的时间间隔。这可以防止反向驱动和路边起步之间的摆动。* | 3.0 |
* 也就是说避免自车一会向后走(向后搜索),一会儿向前走(路边起步)。
侧向平移模块的作用是响应外部指令(如远程操作)横向移动参考路径。
图中直线距离余量(straight margin distance
)是为了避免突然换挡,计算方式为 max(min_distance_to_start_shifting, ego_speed * time_to_start_shifting)
。平移距离(shifting distance
)由变加速度、最小速度和最小距离参数计算得出,如下表所述。最小速度用于防止自车停止时的急剧变化。
侧向平移的参数
参数名 | 单位 | 类型 | 描述 | 默认值 |
---|---|---|---|---|
min_distance_to_start_shifting |
[m] | double | 开始平移的最小距离 | 5.0 |
time_to_start_shifting |
[s] | double | 开始平移的时间 | 1.0 |
shifting_lateral_jerk |
[m/s^3] | double | 平移横向变加速度 | 0.2 |
min_shifting_distance |
[m] | double | 最小平移距离 | 5.0 |
min_shifting_speed |
[m/s] | double | 最小平移速度 | 5.56 |
如果目标路径包含目标点,则修改路径中的点,使路径和目标平滑连接。这个过程将改变路径的形状,距离目标为 refine_goal_search_radius_range
。注意这个逻辑依赖于后面模块中会执行的插值算法(目前使用的是样条插值),所以以后需要更新。
该模块下行为树的实现依赖于第三方库:“BehaviorTreeCpp8”。
Autoware官方网站 ↩︎
Autoware.Auto代码库地址 ↩︎
Autoware.Universe代码库地址 ↩︎
Autoware.Universe官方文档主页 ↩︎
Autoware.Universe官方文档:Behavior Path Planner ↩︎
浅谈行为树(Behavior Trees)与机器人行为规划(Behavior Planning) ↩︎
Hélène Vorobieva, Sébastien Glaser, Nicoleta Minoiu-Enache, Saïd Mammar, Geometric Path Planning for Automatic Parallel Parking in Tiny Spots, IFAC Proceedings Volumes, Volume 45, Issue 24, 2012 ↩︎ ↩︎
BehaviorTreeCpp. ↩︎