docs/应用实践/车辆集成教程/准备符合Apollo协议的车辆/符合Apollo线控标准的车辆.md
开发一台搭载 Apollo 系统的车辆,首先要建立 Apollo 与车辆底层之间的通信。
整车是通过 CAN 总线 (CAN bus,Controller Area Network)进行 各个控制器 ECU (Electronic Control Units)之间的通信。因此,Apollo 控制系统在接入车辆系统时,也通过 CAN 总线通信方式对车辆进行控制。车辆需要开放一部分底盘信号,将这些信号配置成符合 Apollo 的线控标准要求的 DBC 文件 (Database file,是一中用于描述 CAN 总线上数据的专用文件,能够方便用户快速构建车辆 CAN 通信的网络结构,定义 CAN 总线上的信号、报文等相关信息)。
这里推荐使用 canoe 软件 的 CANdb++ 编辑生成的文件。
Apollo 软件处理底盘 DBC 文件生成底盘适配代码模板。通过简单的编程开发,即可将车辆开放的底盘信号适配至 Apollo 的软件中,实现 Apollo 与车辆底盘间的通信。
了解 CAN 总线通信相关知识。
在开发车辆底盘控制信号时,需要参照 Apollo 官网车辆认证平台 发布的车辆线控标准:参见 乘用车标准 。
车辆线控标准规定了车辆底盘信号的需求,也规定了每一帧控制信号在底盘的响应时间要求。车辆底盘信号不仅需要在 功能上符合要求 ,也需要在 性能上符合控制要求 ,这样才能满足符合 Apollo 线控标准的车辆控制底盘。
在改造车辆底盘为线控底盘时,要 参考车辆线控标准满足控制的性能要求 ,如 转向信号要求响应时间在 100ms 内 、 最大超调量满足满足具体要求 等。
请仔细阅读线控列表内的性能要求,在 Apollo 车辆认证时,也会对底盘的性能进行相应测试。
在实际开发 DBC 的过程中,每个信号定义的细节也有具体的要求,这样做不仅可以节省您的时间,同时提高车辆认证的效率。请您重点理解并关注每个信号。Apollo 对车辆底盘信号的需求如下表所示:
线控转向
线控驱动及制动
车身控制功能
车辆的底盘控制是 Apollo 与底盘通信的基础,每一个控制信号都需要可靠和准确。人工接管和越界处理是保证在测试和使用时随时接管,确保突发情况发生时的行车安全。除了线控列表内对信号的详细要求外, 还需要注意横向和纵向使能信号的独立 , 底盘接管逻辑等特殊要求 ,下面对信号的功能特殊要求做详细说明。
转向使能信号是控制车辆进入或退出转向自动驾驶模式。该使能信号必须是通过 上升沿触发 方式的信号,使能信号原则上是 1 个信号。有些开发者若有不同信号同时控制,才能使能转向进入自动驾驶状态,需要在底层集成相关使能信号的逻辑控制,给 Apollo 使能信号原则上必须只有 1 个。
转向自动驾驶模式必须独立,使能信号必须独立,不与纵向的其他模块(如驱动、制动、档位、驻车等)使能信号相关联,需要满足:
单独使能进入转向自动驾驶模式,纵向所处驾驶模式不发生变化,下发方向盘转角或转速控制信号,车辆能够响应相应的转角和转速;
单独使能退出转向自动驾驶模式,纵向所处驾驶模式不发生变化,下发方向盘转角或转速控制信号,车辆不响应。
如果横向被接管,再次进入自动驾驶模式时,需要通过上升沿触发信号进入自动驾驶。
目标方向盘转角:控制方向盘转角的信号,单位是度(deg),控制方向盘(逆时针)左转为正值,控制方向盘(顺时针)右转为负值。
目标方向盘转速:多数车辆无法开放次控制信号接口,建议将方向盘转速设置为最大值,提高系统响应时间。
方向盘实际转角反馈:反馈方向盘实际转角,要求反馈准确,左转反馈为正值,右转反馈为负值。
转向驾驶模式反馈:反馈车辆当前所处的转向驾驶模式,至少需要 3 种模式:自动驾驶模式,手动驾驶模式,被人工接管模式。
故障信息反馈:反馈转向控制系统是否存在故障。
对于乘用车/商用车:
当人为施加的方向盘扭矩大于其接管门限时,车辆各个模块均退出自动驾驶,此时转向驾驶模式反馈被接管;
对于底盘小车等,当小车底盘接收到遥控器控制车辆转向的指令时,车辆各个模块均退出自动驾驶;
转向接管需要独立,此时转向驾驶模式反馈被人工接管模式,驱动驾驶模式、制动驾驶模式此时应反馈手动驾驶模式。
当转向自动驾驶被人工接管时,所有模块都退出自动驾驶模式。
越界处理的原则是越界拒绝执行,并退出自动驾驶模式。 当 Apollo 下发控制指令超过原控制指令的定义范围时,称为越界。发生越界时,转向需要退出自动驾驶模式。 如定义目标方向盘转角最大范围为 -500deg~500deg。若 Apollo 下发的转角指令不在此范围时,底盘需要对此越界拒绝执行,并退出自动驾驶模式。
驱动使能信号是控制车辆进入或退出驱动自动驾驶模式,该使能信号必须是通过 上升沿触发 方式的信号, 使能信号原则上是 1 个信号 。有些开发者若有不同信号同时控制,才能使能转向进入自动驾驶状态,需要在底层集成相关使能信号的逻辑控制,给 Apollo 使能信号原则上必须只有 1 个。
驱动使能信号必须独立,不与转向模块使能信号相关联,需要满足:
单独使能进入纵向自动驾驶模式,转向所处驾驶模式不发生变化,下发驱动控制信号,车辆能够响应相应的控制命令;
单独使能退出驱动自动驾驶模式,转向所处驾驶模式不发生变化,下发驱动控制信号,车辆不响应。
原则上驱动使能信号与制动、档位、驻车使能相互独立根据以往的实际经验 ,有些车辆在纵向驱动和制动使能信号归为一个信号,这样的特殊情况需要特别注意,务必确保纵向的使能与横向使能分开并独立,纵向各模块如果相互关联,则使能需要驱动、制动、档位、驻车一同进去自动驾驶模式,不使能一同退出自动驾驶模式。
如果横向被接管,再次进入自动驾驶模式时,需要通过上升沿触发信号进入自动驾驶。
目标加速踏板位置:控制量是加速踏板的位置百分比,范围是 0~100%,100% 代表加速踏板踩到最大位置。
车辆目标纵向加速度和车辆目标驱动扭矩是车辆控制信号可选项。
驾驶模式:反馈车辆当前所处的驱动驾驶模式,至少需要 3 种模式:自动驾驶模式,手动驾驶模式,被人工接管模式。
加速踏板位置:需准确反馈当前车辆实际踏板位置。
纵向加速度:需准确反馈当前车辆的纵向加速度。
车速:需准确反馈当前车辆车速,Apollo 需求的车速是 m/s,** 一般车辆反馈的车速单位是 km/h,此时需要在 DBC 转换为适配代码后单独进行单位转化** 。
轮速:对于乘用车,需提供相关轮速信号,轮速大小,单位:km/h。如果有条件,可提供车轮运动方向反馈,Value Description 按照以下顺序 0x00,FORWARD;0x01,BACKWARD;0x02,STANDSTILL;0x03,INVALID。
发动机/电机转速:需准确反馈当前发动机或电机转速,单位:r/min。
故障信息:反馈驱动系统是否存在故障。
发生越界时,转向需要退出自动驾驶模式。如定义目标加速踏板位置范围为 0~100%,若 Apollo 下发的控制踏板指令不在此范围时,底盘需要对此越界拒绝执行,并退出自动驾驶模式。
制动使能信号是控制车辆进入或退出驱动自动驾驶模式,该使能信号必须是通过 上升沿触发 方式的信号,使能信号原则上是 1 个信号;有些开发者若有不同信号同时控制,才能使能转向进入自动驾驶状态,需要开发者在底层自己集成相关使能信号的逻辑控制,给 Apollo 使能信号原则上必须只有 1 个。
制动使能信号必须独立,不能与转向模块使能信号相关联,需要满足:
单独使能进入纵向自动驾驶模式,转向所处驾驶模式不发生变化,下发制动控制信号,车辆能够响应相应的控制命令,
单独使能退出驱动自动驾驶模式,转向所处驾驶模式不发生变化,下发制动控制信号,车辆不响应。
原则上驱动使能信号与驱动、档位、驻车使能相互独立。根据以往的实际经验,有些车辆在纵向驱动和制动使能信号归为一个信号,这样的特殊情况需要特别注意,务必确保纵向的使能与横向使能分开并独立,纵向各模块如果相互关联,则使能需要驱动、制动、档位、驻车一同进去自动驾驶模式,不使能一同退出自动驾驶模式。
如果横向被接管,再次进入自动驾驶模式时,需要通过上升沿触发信号进入自动驾驶。
制动踏板目标位置:控制量是加速踏板的位置百分比,范围是 0~100%,100% 代表制动踏板踩到最大位置。
目标减速度:可选项,控制量是车辆的目标减速度大小。
制动灯控制:可选项,控制制动灯是否点亮,一般车辆的底盘会在制动时默认点亮制动灯。
驾驶模式:反馈车辆当前所处的制动驾驶模式,至少需要3种模式:自动驾驶模式,手动驾驶模式,被人工接管模式。
制动踏板位置:制动踏板位置,百分比。
刹车灯状态:反馈刹车灯是否点亮。
故障信息:反馈制动系统是否有故障。
发生越界时,转向需要退出自动驾驶模式。如定义目标制动踏板位置范围为 0~100%,若 Apollo 下发的控制踏板指令不在此范围时,底盘需要对此越界拒绝执行,并使所有模式退出自动驾驶模式。
使能独立,不与横向控制相关联。可以与纵向使能信号关联,也可独立使能。档位使能信号必须是通过上升沿触发方式的信号,使能信号原则上是 1 个信号。
控制档位信号,档位信号必须按照以下顺序:0x00:N档;0x01:D;0x02:R;0x03:P;0x04:NONE。多余的不必再增加。
档位信息:反馈当前档位信号,反馈顺序与控制档位信号顺序一致:0x00:N档;0x01:D;0x02:R;0x03:P;0x04:NONE。多余的不必再增加。
故障信息:反馈换挡系统是否存在故障。
使能独立,不与横向控制相关联。可以与纵向使能信号关联,也可独立使能。驻车使能信号必须是通过上升沿触发方式的信号,使能信号原则上是 1 个信号。
驻车信号有效,电子手刹抱死,车辆驻车;驻车信号无效,电子手刹松开,车辆不驻车。
EPB 开关状态:反馈当前电子手刹是否抱死或松开。
驻车状态反馈:反馈当前驻车是自动驾驶模式还是手动控制模式。至少需要 2 种模式:自动驾驶模式,手动驾驶模式,被人工接管模式。
驻车系统故障反馈:反馈驻车系统故障。
包括线控灯光,主要控制远、近光灯、转向灯、危险警报灯的打开和关闭,已经相应的状态反馈信号。
还有雨刮和喇叭控制,作为可选项。
VIN 码一般 17 位。按照 ASCII 码格式,每一个 ASCII 占 1 字节,需要 3 帧报文连续发出,但是 VIN 码不需要实时更新。所以,在系统请求进入自动驾驶时,VIN 码通过 CAN 总线发出,并一直保持该值不再更新,也可减少总线的负载。
熟悉了上述 Apollo 对车辆底盘信号的要求,第二步是进行车辆底盘信号 database(DBC)文件进行编辑,设置通信的网络结构,每个信号的初值、符号类型、精度、大小范围、取值等,进而组合成相应的 CAN 通信报文(message)与 Apollo 进行通信。下面使用 CANdb++ 软件对 DBC 文件进行编辑,有较好的可视化界面,该软件目前只适用于 Windows 系统。
因为 DBC 文件后面会根据 Apollo 的转译脚本工具,将底盘定义的报文(message)、信号(signal)转化为 C++ 程序代码。因此,在编辑 DBC 时,对信号的名称定义、注释、赋值等就要符合 C++ 语言定义规范,这样以确保在后期调试时不会因为 DBC 文件的问题无法调通 CANBUS 通信。根据 Apollo 代码要求,请注意以下事项。
控制信号名称建议为 ACU。
在定义网络上 ECU 名称时,建议定义 Apollo 端的控制器名称为 ACU(Apollo Control Unit)。
CAN信号 ID 建议不大于 2048。
目前乘用车 CAN 通信建议采用标准帧格式(CAN Standard 2.0),Message ID 范围 0 - 2047,不建议使用扩展帧。
注释不能有回车符和换行符,comment(注释)必须为英文。
每帧报文(message)如果有注释,注释内不要有换行,不能写中文,必须为英文格式。
VAL_(枚举值)(Value Description)需要使用英文,且不能有相同定义名称,必须为字母或字母和数字组合,不能有符号。
对于大部分状态反馈信号和控制信号,如档位反馈、驾驶模式反馈等,需要对信号进行定义,在信号定义的 Value Description 项内进行定义,定义的名称要遵循 C++ 命名规范,要求使用英文,且不能有相同定义名称,必须为字母或字母和数字组合,不能有符号。如下图是的档位反馈信号的 Value Description 定义。
反馈信号和控制信号中如车速、轮速、加速度、踏板位置(百分比)等 double 类型的反馈和控制信号在 DBC 中 Value Description 项中必须为空。
对于实时数值反馈信号和数值控制信号,如车速(实际车速)、轮速反馈(实际轮速),踏板控制(百分比),转角控制(实际转角值)等,此类信号在定义 Value Description 项中不能加任何内容。
转向信号的范围,在定义时要填写准确的取值范围,注意控制转角的精度一般不高于 0.05deg,踏板百分比精度(factor)不高于 0.1。
对于所有报文的 Byte Order,一个 DBC 内的信号只能统一定义,全部是 Motorola 格式或者全部是 Intel 格式。