apollo:guardian源码分析,为何紧急刹车?

框架

在这里插入图片描述
可以看到主要接受 Control 模块的命令,然后输出内容给 CANBUS 模块。

Guardian模块作为系统的安全保护模块,会根据Monitor输出的系统监控和底盘传感器的数据来决定是否需要紧急停车。

  • 如果需要紧急停车,则发送GuardianCommand到canbus模块执行brake的操作。
  • 如果不需要紧急停车,那么就包装透传ControlCommand到canbus模块执行。

也就是说,当Guardian打开之后(需要同时打开Canbus中的FLAGS_receive_guardian选项),所有的ControlCommand需要通过Guardian包装以后透传给canbus模块,同时canbus将不再直接订阅处理ControlCommand,而是订阅处理GuardianCommand

从 GuardianComponent 入手

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

Component是CyberRT最核心的概念,有两种类型

  • 普通的 Component
  • 定时器 Component

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

 apollo/ modules / guardian

我们先看看 guardian_component.h 这个文件。
在这里插入图片描述

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

除了 Init() 和 Proc() 两个典型方法外,有两个方法值得关注:
在这里插入图片描述

PassThroughControlCommand() 和 TriggerSafetyMode(),看方法名也知道它们的作用一个是透传控制命令,一个是触发安全模式。

另外,根据它定义的不多的几个变量,我们大致也能猜到它要读取底盘信息,控制命令,系统状态,然后发布Guardian处理后的命令。
在这里插入图片描述

GuardianComponent::Init

在这里插入图片描述
GuardianComponent 初始化的操作非常简单,一个是读取配置文件,一个是初始化数据通道的读写器。
在这里插入图片描述
如上所示,我们知道了定时器触发间隔是 10ms 一次,配置文件也指示了地址,其实内容非常简单。

guardian_enable: true

初始化后,可以看看它的正常处理逻辑了。

Proc() 处理了什么?

在这里插入图片描述
先指定timeout时延为2.5s,然后进行判断。

如果再次状态接收时延大于2.5s就将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 state信息。 Guardian会 根据 Monitor 传输的 system status 信息判断是否需要紧急停车。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值