目录
Guardian模块的主要作用是监控自动驾驶系统状态,当出现模块为失败状态的时候,会主动切断控制命令输出,并且刹车。
有点像是保险丝,有一个fallback机制。
guardian模块的触发条件主要有2个。
安全模式的步骤分为2步骤,第一步状态消息中需要紧急刹车或者超声波检测到障碍物,如果检测到障碍物则说明车已经非常接近障碍物了,该检测被称为硬件触发的检测,因为已经发现模块故障,也非常接近障碍物所以刹车会加急。第二步是普通刹车,刹车没有那么急。
guardian为定时模块,所以该过程中会一直发送消息,直到车辆停车。
当前版本代码屏蔽了上述超声波检测。
guardian模块的频率是10ms,因此最大会增加control命令的延时10ms。
- class GuardianComponent : public apollo::cyber::TimerComponent {
- public:
- bool Init() override;
- bool Proc() override;
-
- private:
- void PassThroughControlCommand();
- void TriggerSafetyMode();
-
- apollo::guardian::GuardianConf guardian_conf_;
- apollo::canbus::Chassis chassis_;
- apollo::monitor::SystemStatus system_status_;
- apollo::control::ControlCommand control_cmd_;
- apollo::guardian::GuardianCommand guardian_cmd_;
-
- double last_status_received_s_{};
-
- std::shared_ptr
> - chassis_reader_;
- std::shared_ptr
> - control_cmd_reader_;
- std::shared_ptr
> - system_status_reader_;
- std::shared_ptr
> - guardian_writer_;
-
- std::mutex mutex_;
- };
- bool GuardianComponent::Proc() {
- constexpr double kSecondsTillTimeout(2.5);
-
- bool safety_mode_triggered = false;
- if (guardian_conf_.guardian_enable()) {
- std::lock_guard
lock(mutex_) ; - if (Time::Now().ToSecond() - last_status_received_s_ >
- kSecondsTillTimeout) {
- safety_mode_triggered = true;
- }
- safety_mode_triggered =
- safety_mode_triggered || system_status_.has_safety_mode_trigger_time();
- }
-
- if (safety_mode_triggered) {
- ADEBUG << "Safety mode triggered, enable safety mode";
- TriggerSafetyMode();
- } else {
- ADEBUG << "Safety mode not triggered, bypass control command";
- PassThroughControlCommand();
- }
-
- common::util::FillHeader(node_->Name(), &guardian_cmd_);
- guardian_writer_->Write(guardian_cmd_);
- return true;
- }
核心函数就是Proc。
可以看到
- if (Time::Now().ToSecond() - last_status_received_s_ >
- kSecondsTillTimeout) {
- safety_mode_triggered = true;
- }
会判断monitor 是不是超时了,如果monitor 超时就直接刹车。
另外就是判断monitor 中summary_monitor 上报的system_state中是不是有safety_mode_trigger_time字段,如果有safety_mode_triggered 就设置True,调用安全模式接管。
这里的安全模式就是由TriggerSafetyMode函数调用的。
最终会调用set_brake执行guardian_cmd_emergency_stop_percentage模式停车或者guardian_cmd_soft_stop_percentage停车。
这俩中停车模式的区别就是配置的停车力度不同,所以用舒适度进行了命名。