Apollo アプリケーションとソース コード分析: ガーディアンの緊急対応

目次

コンセプト

コード

分析する


コンセプト

Guardian モジュールの主な機能は、自動運転システムの状態を監視することであり、モジュールが故障すると、制御コマンドの出力を積極的に遮断し、ブレーキをかけます。

これは、フォールバック メカニズムを備えたヒューズのようなものです。

ガーディアン モジュールの主なトリガー条件は 2 つあります。

  1. モジュールのステータスを報告するメッセージ間隔が kSecondsTillTimeout (2.5 秒) を超えています
  2. 報告されたステータス メッセージに 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 つの駐車モードの違いは、設定された駐車強度が異なることです。そのため、快適性にちなんで名付けられました。

 

おすすめ

転載: blog.csdn.net/qq_32378713/article/details/128126473