框架

可以看到主要接受 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 信息判断是否需要紧急停车。
1075

被折叠的 条评论
为什么被折叠?



