自动驾驶 Apollo 源码分析系列,安全守护篇:为何紧急刹车?
Posted frank909
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了自动驾驶 Apollo 源码分析系列,安全守护篇:为何紧急刹车?相关的知识,希望对你有一定的参考价值。
这篇文章主要分析 Apollo 6.0 中一个简单的模块:Guardian。
先看下图:
可以看到主要接受 Control 模块的命令,然后输出内容给 CANBUS 模块。
下面进行分析。
从 GuardianComponent 入手
Apollo 基本上独立的功能都会被模块化成为某类 Component 子类。
Component 是 CyberRT 框架中最核心的概念,有 2 种类型:
普通的 Component
定时器 Component
Guardian 模块是属于后者,代码路径:
apollo/ modules / guardian
我们先看看 guardian_component.h 这个文件。
可以看到 GuardianComponent 继承了 TimerComponent,说明它会定时触发,定时多久在配置文件中指定。
除了 Init() 和 Proc() 两个典型方法外,有两个方法值得关注:PassThroughControlCommand() 和 TriggerSafetyMode(),看方法名也知道它们的作用一个是透传控制命令,一个是触发安全模式。这也是本文要分析的重点。
另外,根据它定义的不多的几个变量,我们大致也能猜到它要读取底盘信息、控制命令、系统状态,然后发布经 Guardian 处理后的命令。
所以,我们再打开这个头文件的源码。
GuardianComponent 初始化的操作非常简单,一个是读取配置文件,一个是初始化数据通道的读写器。
如上所示,我们知道了定时器触发间隔是 10ms 一次,配置文件也指示了地址,其实内容非常简单。
guardian_enable: true
初始化后,可以看看它的正常处理逻辑了。
Proc() 处理了什么?
同样很简单。
先指定 timeout 时延为 2.5 s,然后进行判断。
如果再次状态接收时延大于 2.5 s 就将 safety_mode_triggered 状态置为 true。
或者 system_status 本身已经内置了安全模式触发信息,那么 safety_mode_triggered 状态置为 true。
解决安全模式会进入 TriggerSafetyMode() 或者 PassThroughControlCommand()。
TriggerSafetyMode()
代码不多,梳理可得到下面的流程图:
大概进行了 2 轮判断,2 轮控制命令设计。
第 1 轮判断
判断的是传感器失效还是障碍物检测。
这里的传感器主要是 UltraSonic sensor,也就是超声波雷达,判断失效的依据有 2 个:
- 传感器没有正常使能
- 传感器自身异常
如果传感器本身没有异常,那么就进入到另外一个分支判断。
如果探测到了 2.5m 范围内的障碍物或者探测到了超声波数据异常,都会将障碍物检测的标志位置为 true。
第 1 轮控制命令设置
设置了油门和转向。
guardian_cmd_.mutable_control_command()->set_throttle(0.0);
guardian_cmd_.mutable_control_command()->set_steering_target(0.0);
guardian_cmd_.mutable_control_command()->set_steering_rate(25.0);
guardian_cmd_.mutable_control_command()->set_is_in_safe_mode(true);
让油门和转向复位,并且指定了转向的变化率。
第 2 轮判断
这里判断的是要执行 Emergency Stop 还是 Soft Stop。
判断的依据,如果 system_status 申请了 Emergency Stop 或者传感器失效或者探测到了近距离物体都要执行 Emergency Stop,否则执行 Soft Stop。
第 2 轮控制命令设置
Emergency Stop 和 Soft Stop 有什么区别呢?
没多大区别,主要是设置刹车的参数。
guardian_cmd_.mutable_control_command()->set_brake(
guardian_conf_.guardian_cmd_emergency_stop_percentage());
guardian_cmd_.mutable_control_command()->set_brake(
guardian_conf_.guardian_cmd_soft_stop_percentage());
两个不同的参数在 conf 文件中有指定。
可以看到两者刹车的力度不一样,Soft 柔和一点。
扩展外的知识
Guardian 模块上面就讲完了,作用相当于保险丝起熔断作用。
但仔细看这张图。
我们可以知道,有一个 Monitor 模块给 Guardian 模块传递数据,猜测没错的话,应该是 system status 信息。单纯解析 Guardian 模块是不过瘾的,所以,下篇文章我开始分析 Monitor,看看它有什么神秘之处。
以上是关于自动驾驶 Apollo 源码分析系列,安全守护篇:为何紧急刹车?的主要内容,如果未能解决你的问题,请参考以下文章
自动驾驶 Apollo 源码分析系列,安全守护篇:为何紧急刹车?
自动驾驶 Apollo 源码分析系列,系统监控篇:Monitor模块如何监控通信中 channel 的时延?
自动驾驶 Apollo 源码分析系列,系统监控篇:Monitor模块如何监控通信中 channel 的时延?
自动驾驶 Apollo 源码分析系列,系统监控篇:Monitor模块如何监控通信中 channel 的时延?