apollo_logo
15
0

Planing 2.0综述

1、模块概述

1.1 功能概述

Planning模块在自动驾驶系统中扮演着至关重要的角色,它在遵守交通规则的前提下,将车辆从当前位置沿着路由线路导航到终点位置。

Planning进行轨迹规划时,需要满足的基础要求有三个:

  • 遵守道路交通规则,比如在人行道前停止让行,在交通灯变红时停车,变绿时通行等
  • 对路上遇到的其他交通参与者,如行人,车辆,路边固定障碍物等,不能产生碰撞
  • 规划输出的轨迹,包括路径曲率,速度,加速度等不能超出车辆执行能力边界

同时,Planning模块还要考虑在满足基础要求的前提下,尽量提高车辆的舒适性,避免加减速变化过于突兀,方向盘角度变化过快等不舒适的情况。

1.2 运行流程

如下图所示,Planning模块的上游是Localization, Prediction, Routing模块,而下游是Control模块。Routing模块先规划出一条导航线路,然后Planning模块根据这条线路做局部优化,如果Planning模块发现短期规划的线路行不通(比如前面修路,或者错过了路口),会触发Routing模块重新规划线路,因此这两个模块的数据流是双向的。

1.3 模块原理

Apollo 规划模块功能的实现是基于场景(scenario-based)实现的,针对不同的场景,规划模块通过一系列独立的 任务(task) 组合来完成轨迹的规划。开发者可以根据自己的使用需求,调整支持运行的场景列表,或者场景中支持的任务类型来满足自己的需求。

Apollo 规划架构示意图如上,其中部分重要模块如下:

  • 状态机(Apollo FSM(Finite State Machine)):一个有限状态机,结合导航、环境等信息确定自动驾驶车辆的驾驶场景
  • 规划分发器(Planning Dispatcher):根据状态机与车辆相关信息,调用合适当前场景的规划器
  • 规划器(Planner):结合上游模块信息,通过一系列的任务组合,完成自动驾驶车辆的轨迹规划
  • 决策器 & 优化器(Deciders & Optimizers):一组实现决策和优化任务的 task 集合。优化器用于优化车辆的轨迹和速度。决策器则基于规则,确定自动驾驶车辆何时换车道、何时停车、何时蠕行(慢速行进)或蠕行何时完成等驾驶行为。

2、功能列表

Planning模块目前支持的功能列表如下:

功能名称

功能描述

功能相关代码包

lane follow

车辆沿指令中的路由线路行驶,从地图中查询路由中的车道信息,规划沿车道线行驶的轨迹

LaneFollowScenarioLaneFollowPath

nudge

如果道路前方有静止或低速障碍物占据车道,但当前车道内还有足够空间,车辆可以在当前车道内绕过障碍物行驶。

LaneFollowScenarioLaneFollowPath

lane change

车辆沿RoutingResponse中的路由线路行驶的过程中,从一个车道切换到相邻车道。

LaneFollowScenarioLaneChangePath

lane borrow

如果道路前方有障碍物长时间停留阻塞道路,车辆无法通过在当前车道内绕过,需要往相邻车道借道,绕过当前障碍物。当车辆经过障碍物之后,车辆会立即回到原车道行驶。

LaneFollowScenarioLaneBorrowPath

pull over

当车辆接近终点时,可以通过配置选择是否在终点处靠边停车。如果使能终点靠边停车,车辆在终点附近查找一个可以停车的位置,并将车辆停在这个位置上。如果这个位置前后有其他障碍物,车辆可以通过OpenSpace的泊车算法,将车辆停在这个位置。

PullOverScenarioPullOverPath

park and go

如果车辆停车位置不在道路上,再次启动的时候,车辆会先从当前位置使用OpenSpace规划算法(如有必要)先行驶到车道线上,然后再正常沿道路行驶。

ParkAndGoScenario

crosswalk

当车辆行驶到人行道前时,如果有行人通过,车辆会停车等待行人通过后再通行。

Crosswalk

bare intersection

车辆行驶到无交通灯和停止标志的交通路口,因为对向车辆没有明确通行指示,所以需要车辆根据路口交通情况决定是否通行。

BareIntersectionUnprotectedScenario

traffic light protected/unprotected

车辆经过有红绿灯的交通灯路口时,如果交通灯有左转/右转通行箭头,车辆在红灯亮起时停止,绿灯亮起时通行;如果交通灯不是箭头指示灯,车辆在通过路口时可能还有对向车辆经过,这时就需要在通过路口前减速慢行,没有冲突时再通过路口。

TrafficLightTrafficLightProtectedScenarioTrafficLightUnprotectedLeftTurnScenarioTrafficLightUnprotectedRightTurnScenario

stop sign

当车辆前方有停止标志时,先停车观察,没有其他行人或车辆冲突时再通行。

StopSignStopSignUnprotectedScenario

yield sign

当车辆在没有交通灯的路口,有让行标志时,优先让其他对向车辆通行后自车再通行。

YieldSignYieldSignScenario

keep clear area

车辆经过Keep Clear Area区域时,不能在这个区域内停车。

KeepClear

rerouting

如果车辆在道路上被阻塞超出一段时间后,planning发出重新路由的请求以便脱困。

Rerouting

valet parking

给定地图上某一个停车位的id,车辆从当前位置导航到停车位,并泊车入库。

ValetParkingScenario

emergency pull over

在车辆行驶过程中,可以接收外部命令紧急靠边停车。

EmergencyPullOverScenario


3、更新说明

planning在新版本中在降低学习和二次开发成本上进行了一些重要的优化,下面对这些优化进行详细介绍。

3.1 外部接口升级

apollo原来的接口是通过topic发送,接口调用是,命令直接分发到PNC的各个模块,数据流如下图所示:

在新版本中对这些接口进行了优化和升级:

  • 统一梳理和封装,调用接口时,命令统一转发到"ExternalCommandProcessor"模块,通过封装,当PNC内部模块接口升级时,可以保持外部命令接口不变。
  • 改用cyber中service-client机制调用,用户可以通过client查询当前任务的执行状态。
  • 对RoutingRequest的导航命令做了精简:
    • 原来的导航命令需要查询地图,找到路由点和终点最近的车道,并得到在车道上对应的投影点;精简后的命令只需要给出坐标和朝向即可。
    • 发送导航命令不再需要发送车辆当前的位置作为起点位置,PNC会自动获取并处理起点位置。

升级后的命令数据流程如下图:

升级前后命令功能保持不变,对照关系如下表所示:

功能

升级前命令

升级后命令

升级说明

点到点沿道路行驶

routing::RoutingRequest

LaneFollowCommand

精简了路由点信息,新的命令给出坐标和朝向,不需要查询地图找到最近的LaneWayPoint

泊车

routing::RoutingRequest(包含parking_space_id)

ValetParkingCommand

升级前后都是给定parking_space_id进行泊车

PULL_OVER,START,STOP流程控制

planning::PadMessage

ActionCommand

升级后合并流程操作到一个命令中

切换自动/手动模式

control::PadMessage

ActionCommand

升级后合并流程操作到一个命令中


升级后的接口有以下几个优点:

  • 命令调用更清晰简便,新的导航接口精简了数据,用户只需要设置必要的坐标和朝向信息即可。
  • 使用service/client的调用方式,新的接口可以通过client获取命令执行的状态,查看命令是正在执行中,已经完成或有错误发生。
  • 新的接口支持用户自定义扩展自己的命令。

3.2 插件化

插件是新版本中的支持用户灵活扩展新功能的一种方式,用户新扩展的插件符合父类程序接口规范,通过重写接口的实现来增加新的功能,插件以独立包的方式发布。

在planning中主要对scenario,task和traffic rules进行了插件化,用户可以根据场景需要,自定义添加自己的场景,任务或交通规则,具体插件添加的方式后续文档中有详细的介绍。

例如用户新增左转待转场景插件,增加一个包left_turn_waiting_zone,在这个包中添加左转待转场景的实现代码,以及相关的工程文件,编译调试后发布即可。

需要运行这个场景时,在planning的配置文件中,添加这个场景的pipeline:

旧版本中不使用插件的方式,用户新增一个scenario,task,traffic rules,需要修改planning component流程代码,用于创建新的类型对象,添加新增对象的流程调用,修改proto文件等。这样的问题一个是修改处较多,修改过程繁琐;另外就是当用户在planning中增加了一个新的scenario,task,traffic rules时,后续apollo升级时,用户无法直接跟着升级,需要手动merge自己修改的代码。

使用插件的方式扩展scenario,task,traffic rules,可以实现:

  • 用户根据自己的场景,使用包管理的方式,选择性下载安装自己需要的scenario,task,traffic rules即可。
  • 用户新增的插件独立开发,编译,发布和运行。
  • 用户新增了插件后,可以直接跟随apollo一起升级。

3.3 参数配置改造

planning中的配置参数量较大,入门调试时难度较高,用户想要修改的功能对应的参数不直观,并且不易快速定位需要修改的参数位置。针对这些问题,对配置参数进行了以下调整:

  • 将参数分成全局变量和局部变量,全局变量是多个算法或插件中共同使用的参数;局部变量是专属于某个算法或插件的参数。如果用户需要调整某个插件的参数,直接在插件的目录中查找。

planning的全部变量在planning/planning_base/conf目录下:

planning的局部变量在插件自身的目录下,如lane_change_path这个Task插件的参数:

添加对常用功能使用到的参数的说明文档,方便用户调试时查询。对参数目录进行重新梳理和作用范围的划分,有以下优点:

  • 参数的目录跟随作用范围和功能,这样对参数的定位更清晰和直观。
  • 用户新增的插件所使用的参数,可以跟随插件进行发布和管理。

4、实践案例:安装PnC工程

为了便于初学者学习,本实践项目基于Apollo alpha版发布了PnC示例工程,工程内已经编写好了PnC相关的依赖包(cyberfile.xml),安装更便捷,可满足2023星火PnC培训以及赛事使用。本版本对电脑最低要求4核 16G以上,GPU无要求。

4.1 安装基础软件

4.1.1 安装Linux - Ubuntu

安装 Ubuntu 操作系统,请参见。

注意:推荐您使用 Ubuntu 18.04.5 或以上的版本作为您主机的操作系统,若采用18.04版本可使用:

Ubuntu系统安装完成请更新相关软件:

sudoapt-get update
sudoapt-get upgrade

注意:更新过程中请务必保持网络链接畅通。

4.1.2 安装 Docker Engine

Apollo 依赖于 Docker 19.03+。安装 Docker 引擎,您可以根据官方文档进行安装:

  • 参见。
  • 您还可以者通过 Apollo 提供的安装脚本直接安装:这个过程可能会运行多次脚本,根据脚本提示执行即可。
wget http://apollo-pkg-beta.bj.bcebos.com/docker_install.sh
bash docker_install.sh

4.2 安装 Apollo 环境管理工具

Apollo 环境管理工具是一个管理和启动 Apollo 环境容器的命令行工具,详细信息可参见: aem-Apollo环境管理工具

4.2.1 基础环境准备

4.2.1 基础环境准备4.2.1 基础环境准备

# 添加访问认证
wget -O - https://apollo-pkg-beta.cdn.bcebos.com/neo/beta/key/deb.gpg.key | sudo apt-key add -
# Apollo -alpha 版源地址
sudo bash -c "echo 'deb https://apollo-pkg-beta.cdn.bcebos.com/apollo/core bionic main' >> /etc/apt/sources.list.d/apolloauto.list"
# 更新源
sudo apt update

注意:如果之前已经安装过8.0版本的apollo的话,在您的宿主机/etc/apt/sources.list文件中会有形如deb https://apollo-pkg-beta.cdn.bcebos.com/neo/beta bionic main的配置,请直接删除。

4.2.2 安装aem工具

apollo 9.0.0-alpha1版本的aem兼容apollo 8.0aem,请使用以下指令进行更新。

sudo apt install apollo-neo-env-manager-dev --reinstall

安装成功后,可以使用以下指令进行查看aem工具功能。

aem -h

4.3 下载 PnC工程

4.3.1 下载工程代码

git clone https://github.com/ApolloAuto/application-pnc.git

4.3.2 进入工程目录

cd application-pnc
  • 目录结构说明
  • core目录,系统依赖包,里面cyberfile.xml描述了使用
  • WORKSPACE:与bazel相关的一些配置信息,一般不需要用户关注。

4.4 调试pnc工程

4.4.1 进入Docker环境

# 拉取并启动docker容器
aem start
# 进入容器
aem enter
# 下载安装依赖包: 会拉取安装core目录下的cyberfile.xml里面所有的依赖包
buildtool build

4.4.2 启动Dreamview

aem bootstrap start

原创声明,本文由作者授权发布于Apollo开发者社区,未经许可,不得转载。
发表评论已发表 0 条评论
登录后可评论,请前往 登录
暂无评论~快去发表自己的独特见解吧!
目录
1、模块概述
1.1 功能概述
1.2 运行流程
1.3 模块原理
2、功能列表
3、更新说明
3.1 外部接口升级
3.2 插件化
3.3 参数配置改造
4、实践案例:安装PnC工程
4.1 安装基础软件
4.2 安装 Apollo 环境管理工具
4.3 下载 PnC工程
4.4 调试pnc工程