目次
コンセプト
Guardian モジュールの主な機能は、自動運転システムの状態を監視することであり、モジュールが故障すると、制御コマンドの出力を積極的に遮断し、ブレーキをかけます。
これは、フォールバック メカニズムを備えたヒューズのようなものです。
ガーディアン モジュールの主なトリガー条件は 2 つあります。
- モジュールのステータスを報告するメッセージ間隔が kSecondsTillTimeout (2.5 秒) を超えています
- 報告されたステータス メッセージに safety_mode_trigger_time フィールドがある場合、この時点でテイクオーバーがトリガーされます。
安全モードのステップは 2 つのステップに分かれています. 最初のステップでは、ステータス メッセージで緊急ブレーキまたは障害物の超音波検出が必要です. 障害物が検出された場合は、車が障害物に非常に接近していることを意味します. この検出は呼び出されますモジュールの障害が検出され、障害物が非常に近いため、ブレーキが加速されます。2 番目のステップは通常のブレーキングです。ブレーキングはそれほど緊急ではありません。
Guardian はタイミング モジュールであるため、車両が停止するまでの過程でメッセージが送信されます。
現在のバージョン コードは、上記の超音波検出をシールドします。
ガーディアン モジュールの周波数は 10ms であるため、制御コマンドの最大遅延は 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<apollo::cyber::Reader<apollo::canbus::Chassis>>
chassis_reader_;
std::shared_ptr<apollo::cyber::Reader<apollo::control::ControlCommand>>
control_cmd_reader_;
std::shared_ptr<apollo::cyber::Reader<apollo::monitor::SystemStatus>>
system_status_reader_;
std::shared_ptr<apollo::cyber::Writer<apollo::guardian::GuardianCommand>>
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<std::mutex> 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;
}
モニターがタイムアウトしたかどうかを判断し、モニターがタイムアウトした場合は直接ブレーキをかけます。
もう 1 つは、モニターの 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 の駐車が実行されます。
2 つの駐車モードの違いは、設定された駐車強度が異なることです。そのため、快適性にちなんで名付けられました。