Приложение Apollo и анализ исходного кода: реагирование на чрезвычайные ситуации Guardian

Оглавление

концепция

код

анализировать


концепция

Основная функция модуля Guardian — следить за состоянием системы автоматического вождения, при выходе из строя модуля он активно отключает вывод команды управления и тормозит.

Это немного похоже на предохранитель, но с аварийным механизмом.

Существует два основных условия срабатывания модуля Guardian.

  1. Интервал сообщения для сообщения о состоянии модуля превышает kSecondsTillTimeout (2,5 секунды)
  2. Если в отчетном сообщении о статусе есть поле safety_mode_trigger_time, в это время будет инициировано поглощение.

Шаги режима безопасности разделены на 2 шага.Первый шаг требует экстренного торможения или ультразвукового обнаружения препятствий в сообщении о состоянии.Если препятствие обнаружено, это означает, что автомобиль находится очень близко к препятствию.Это обнаружение называется обнаружение, запускаемое аппаратным обеспечением.Поскольку обнаружен сбой модуля, а препятствие находится очень близко, тормоза будут ускорены. Второй шаг – обычное торможение, торможение не столь экстренное.

Guardian — это модуль синхронизации, поэтому сообщения будут отправляться в процессе до тех пор, пока транспортное средство не остановится.

Текущий код версии защищает указанное выше ультразвуковое обнаружение.

Частота модуля защиты составляет 10 мс, поэтому максимальная задержка команды управления будет увеличена на 10 мс.

код

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;
    }

Он будет судить, истек ли срок ожидания монитора, и, если время ожидания монитора истекло, он сразу затормозит.

Другой — определить, есть ли поле safety_mode_trigger_time в system_state, о котором сообщает summary_monitor в мониторе.

Безопасный режим здесь вызывается функцией TriggerSafetyMode.

Наконец, set_brake будет вызываться для выполнения режима парковки guardian_cmd_emergency_stop_percentage или парковки guardian_cmd_soft_stop_percentage.

Разница между двумя режимами парковки заключается в том, что настроенная сила парковки различна, поэтому они названы в честь комфорта.

 

Guess you like

Origin blog.csdn.net/qq_32378713/article/details/128126473