自动驾驶 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 的时延?

自动驾驶 Apollo 源码分析系列,系统监控篇:Monitor模块如何监控通信中 channel 的时延?

自动驾驶 Apollo 源码分析系列,系统监控篇:Monitor模块如何监控硬件