apollo_logo
4
0

apollo汽车底盘适配(二十六)

汽车底盘

传统的汽车是通过刹车踏板、油门踏板、档位控制杆和方向盘来控制,传动方式是机械传动,也就是通过人脚踩踏板,然后带动液压或者齿轮等来控制汽车的油门、刹车大小和方向转角。

而自动驾驶系统运行在电脑上,输出的控制命令是电信号,因此这里就需要能够把电信号转换为油门、刹车、方向盘力矩的装置,这就是我们所说的线控系统

一辆汽车想要支持自动驾驶,就必须要有线控系统。通常情况下包括控制动力的线控油门,控制刹车的线控刹车,控制档位的线控档位以及控制方向盘的线控转向,只有集齐上述4个线控系统,自动驾驶才能够成功控制汽车行驶。

底盘适配

市面上不是所有的车都具备线控系统,例如传统的汽油车,只有少数,例如林肯MKZ支持线控系统,这也是为什么早期很多自动驾驶公司采用林肯MKZ改装做自动驾驶车的原因。当然现在有纯电动的车了,而电动车支持线控有天然的优势,因为电动车的动力是由电机提供,本身就是电信号控制,比之前用油门更加好控制。

只要车辆支持线控系统,就可以改装为自动驾驶车辆,前提是控制车辆的canbus协议开放,因为上述的线控系统是通过canbus协议控制的,这里我们再进一步总结一下,一辆新车改装成自动驾驶需要的条件。

  • 汽车底盘。支持线控的汽车底盘,并且控制命令的canbus协议开放
  • canbus卡。用于运行自动驾驶系统的电脑发送canbus命令
  • canbus驱动。自动驾驶系统支持该canbus卡的驱动

因为canbus卡和canbus驱动都是标准产品,因此当我们判断一辆汽车是否能改装成自动驾驶汽车的前提条件就是:具备上述4种线控系统,并且canbus协议开放

适配器

实际上除了必须要有的线控系统,汽车实际上还需要一些辅助功能,例如远光灯、近光灯、转向灯、雨刷和喇叭等功能需要功能自动控制。同时还需要能够给出汽车是处在自动驾驶状态还是退出自动驾驶接管状态,以避免和人类抢夺驾驶权,在讲到自动驾驶接管和退出接管的方式我们再详细论述。最后汽车底盘还需要反馈一些状态,比如当前的里程、电量、轮速、以及上述控制装置的状态,比如制动百分比、油门百分比、方向盘转角等。

除了上述功能之外,每个汽车厂家可能有一些自己独有的功能,有些还提供定制按钮的功能。上述这些是具体的功能,体现到canbus协议上,各个厂家的控制命令也各不相同,例如大众的canbus油门控制指令是0x401,而吉利的油门控制指令可能是0x230,这需要根据不同汽车厂家提供的canbus命令手册来确定。

这里我非常推荐一种改装的方案,因为汽车的canbus一般有保密的需求,避免被黑客攻击,因此不会轻易给出canbus协议,这里我们引入一个适配器,自动驾驶通过适配器把控制命令转换为车辆加密的canbus命令,这样不仅没有暴露车辆底层canbus协议,而且更加灵活,同样的适配器可以适配到多个车型。

接下来还有2个非常重要的功能,一是如何进入自动驾驶,二是如何退出自动驾驶。车辆为了保证安全,只有满足一定的条件才能够进入自动驾驶,如果能够随便触发进入自动驾驶那么会导致安全问题。进入自动驾驶之后如何退出也需要优先考虑,否则进入自动驾驶之后,人类驾驶员接管不了车辆,也会产生交通事故。

进入自动驾驶

自动驾驶汽车默认处于人工驾驶模式,只有在一定的条件下才能进入自动驾驶模式。进入自动驾驶一般需要满足以下条件。

  • 解锁紧急按钮,紧急按钮一般为红色的机械按钮,在汽车关闭的时候按下,在进入自动驾驶之前解锁。紧急按钮会切断自动驾驶系统和汽车底盘的canbus总线,也就是说在极端情况下,通常是软件故障,可以通过按下紧急按钮强制关闭自动驾驶系统和汽车底盘的命令,从硬件上保证不会抢夺汽车的控制权。
  • 自动驾驶系统没有报错,自动驾驶系统在启动之后,往往会检查车辆状态是否正常,传感器是否正常,自动驾驶模块是否正常工作,在一切准备就绪后,才可以进入自动驾驶。
  • 最后,进入自动驾驶可以通过控制面板触发,或者通过汽车上自定义的按钮进行触发,触发之后汽车进入自动驾驶状态,进入自动驾驶之后可以明显感觉方向盘有一个稳定力矩,同时也可以通过观察可视化界面上自动驾驶汽车当前的状态来查看是否成功进入自动驾驶。

不同的汽车底盘进入自动驾驶的流程可能稍有区别,但总体上为了保证安全,一般需要满足特定的条件触发才会进入自动驾驶状态,特斯拉就是通过专门的拨杆来进入自动驾驶状态。

退出自动驾驶

当发生意外状态,安全员需要介入控制车辆,这时候要退出自动驾驶模式,进入接管模式。

通过转动方向盘、踩刹车、切换档位都可以主动退出自动驾驶状态。这时候车辆控制权重新回到人类手中。这时候主要是判断刹车、方向盘的变换率大于一定的阈值,那么就判定人类驾驶员在接管车辆,这时候汽车底盘主动退出自动驾驶状态。虽然这时候汽车底盘不会接受控制指令,但是还可以重新进入自动驾驶状态,为了避免错误,自动驾驶系统感应到退出自动驾驶模式之后,需要主动停止发送控制指令以免和驾驶员人工接管争夺控制权。

这时候在可视化界面上也会显示当前的状态处于接管状态。

进入接管状态之后,必须要清除接管状态之后才能够重新进入自动驾驶状态,否则无法再次进入自动驾驶。

一般人工接管自动驾驶驾驶都是遇到了突发状况,这时候为了解决问题,需要知道当时所处的环境,如果一直录制Bag包,硬盘的容量不够,这时候就需要触发保存数据,在进入接管模式的时候,触发保存接管之前10s到接管之后5s左右的数据,来帮助工程师定位问题。

canbus模块

介绍完上述功能之后,那么我们如何移植新的汽车底盘到apollo呢?我们首先要适配canbus协议,apollo中每种不同型号的车的协议在目录"modules\canbus\vehicle"中

├── ch
├── devkit
├── ge3
├── gem
├── lexus
├── lincoln
├── neolix_edu
├── transit
├── wey
└── zhongyun

下面以ch为例来说明如何添加一辆新车,ch是apollo d-kit小车中的一款的汽车底盘。

Protocol协议

首先根据汽车的canbus协议完成对应的命令,包括控制命令和反馈指令,也就是需要实现控制油门的接口、刹车接口、档位切换的接口以及方向盘转角接口。具体的工作就是根据车辆的canbus手册,把对应的控制命令的数值发送到对应的地址。

Apollo有提供通过dbc文件自动生成protocol的工具,由于我们没有获取到dbc文件,我是参考代码纯手动写的,主要是根据协议仔细核对命令,难度倒是不大。

control类

接下来还要实现control类,也就是对canbus命令的封装,把不同车辆的控制命令都统一为同样的接口。这部分和prototol一样参考ch模块中的代码实现即可,主要是注意接管程序的接口"SecurityDogThreadFunc",因为启动时单独的线程监控自动驾驶是否已经接管。

.
├── BUILD
├── ch_controller.cc
├── ch_controller.h
├── ch_controller_test.cc
├── ch_message_manager.cc
├── ch_message_manager.h
├── ch_message_manager_test.cc
├── ch_vehicle_factory.cc
├── ch_vehicle_factory.h
├── ch_vehicle_factory_test.cc
└── protocol

chassis_detail

除了汽车的控制指令之外,还需要上报汽车的状况,这里需要先添加对应的状态proto文件,例如"ch.proto",然后在"chassis_detail.proto"中添加。

canbus_conf.pb.txt

最后在canbus_conf.pb.txt中修改"vehicle_parameter"为对应的品牌就可以了

vehicle_parameter {
brand: ch // 汽车型号
max_enable_fail_attempt: 5
driving_mode: COMPLETE_AUTO_DRIVE
}

总结

自此,如何添加一个新的汽车底盘的分析就完成了,实际上目前的汽车底盘一些控制指令还没有和自动驾驶系统做深度的融合,不知道前装的自动驾驶系统是不是会有更加融合创新的设计。


原创声明,本文由作者授权发布于Apollo开发者社区,未经许可,不得转载。
发表评论已发表 0 条评论
登录后可评论,请前往 登录
暂无评论~快去发表自己的独特见解吧!
目录
汽车底盘
底盘适配
适配器
进入自动驾驶
退出自动驾驶
canbus模块
总结