前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >自动驾驶 Apollo 源码分析系列,安全守护篇(一):为何紧急刹车?

自动驾驶 Apollo 源码分析系列,安全守护篇(一):为何紧急刹车?

作者头像
Frank909
发布2022-05-10 14:48:14
7810
发布2022-05-10 14:48:14
举报
文章被收录于专栏:Frank909Frank909

这篇文章主要分析 Apollo 6.0 中一个简单的模块:Guardian。 ​

先看下图:

在这里插入图片描述
在这里插入图片描述

可以看到主要接受 Control 模块的命令,然后输出内容给 CANBUS 模块。 ​

下面进行分析。 ​

从 GuardianComponent 入手

Apollo 基本上独立的功能都会被模块化成为某类 Component 子类。 ​

Component 是 CyberRT 框架中最核心的概念,有 2 种类型: 普通的 Component 定时器 Component ​

Guardian 模块是属于后者,代码路径:

代码语言:javascript
复制
 apollo/ modules / guardian

我们先看看 guardian_component.h 这个文件。 ​

在这里插入图片描述
在这里插入图片描述

可以看到 GuardianComponent 继承了 TimerComponent,说明它会定时触发,定时多久在配置文件中指定。 ​

除了 Init() 和 Proc() 两个典型方法外,有两个方法值得关注:PassThroughControlCommand() 和 TriggerSafetyMode(),看方法名也知道它们的作用一个是透传控制命令,一个是触发安全模式。这也是本文要分析的重点。 ​

另外,根据它定义的不多的几个变量,我们大致也能猜到它要读取底盘信息、控制命令、系统状态,然后发布经 Guardian 处理后的命令。 ​

所以,我们再打开这个头文件的源码。 ​

在这里插入图片描述
在这里插入图片描述

GuardianComponent 初始化的操作非常简单,一个是读取配置文件,一个是初始化数据通道的读写器。

在这里插入图片描述
在这里插入图片描述

如上所示,我们知道了定时器触发间隔是 10ms 一次,配置文件也指示了地址,其实内容非常简单。

代码语言:javascript
复制
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 轮控制命令设置

设置了油门和转向。 ​

代码语言:javascript
复制
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 有什么区别呢? ​

没多大区别,主要是设置刹车的参数。 ​

代码语言:javascript
复制
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,看看它有什么神秘之处。 ​

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022-01-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 从 GuardianComponent 入手
  • Proc() 处理了什么?
    • TriggerSafetyMode()
      • 第 1 轮判断
      • 第 1 轮控制命令设置
      • 第 2 轮判断
      • 第 2 轮控制命令设置
    • 扩展外的知识
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档