• Apollo 应用与源码分析:Monitor监控 - Monitor_manage&recurrent_runner分析


    目录

    monitor_manager 分析

    结构分析

    单例模式宏定义

    描述现在的系统状态

    HMI上显示的状态信息

    仿真判断状态

    判断是不是自动驾驶状态

    日志缓存

    当前node

    所有monitor 的reader 管理map

    开启一次监控

    start frame分析

    end frame分析

    recurrent_runner 分析

    结构分析

    Tick 函数分析


    monitor_manager 分析

    结构分析

    1. // Centralized monitor config and status manager.
    2. class MonitorManager {
    3. public:
    4. void Init(const std::shared_ptr& node);
    5. // Start and end a monitoring frame.
    6. bool StartFrame(const double current_time);
    7. void EndFrame();
    8. // Getters.
    9. const apollo::dreamview::HMIMode& GetHMIMode() const { return mode_config_; }
    10. bool IsInAutonomousMode() const { return in_autonomous_driving_; }
    11. SystemStatus* GetStatus() { return &status_; }
    12. apollo::common::monitor::MonitorLogBuffer& LogBuffer() { return log_buffer_; }
    13. // Cyber reader / writer creator.
    14. template <class T>
    15. std::shared_ptr> CreateReader(const std::string& channel) {
    16. if (readers_.find(channel) == readers_.end()) {
    17. readers_.emplace(channel, node_->CreateReader(channel));
    18. }
    19. return std::dynamic_pointer_cast>(readers_[channel]);
    20. }
    21. template <class T>
    22. std::shared_ptr> CreateWriter(const std::string& channel) {
    23. return node_->CreateWriter(channel);
    24. }
    25. private:
    26. SystemStatus status_;
    27. // Input statuses.
    28. std::string current_mode_;
    29. const apollo::dreamview::HMIConfig hmi_config_;
    30. apollo::dreamview::HMIMode mode_config_;
    31. bool in_autonomous_driving_ = false;
    32. bool CheckAutonomousDriving(const double current_time);
    33. apollo::common::monitor::MonitorLogBuffer log_buffer_;
    34. std::shared_ptr node_;
    35. std::unordered_map> readers_;
    36. DECLARE_SINGLETON(MonitorManager)
    37. };
    38. DECLARE_SINGLETON(MonitorManager)

    单例模式宏定义

    1. #define DECLARE_SINGLETON(classname) \
    2. public: \
    3. static classname *Instance(bool create_if_needed = true) { \
    4. static classname *instance = nullptr; \
    5. if (!instance && create_if_needed) { \
    6. static std::once_flag flag; \
    7. std::call_once(flag, \
    8. [&] { instance = new (std::nothrow) classname(); }); \
    9. } \
    10. return instance; \
    11. } \
    12. \
    13. static void CleanUp() { \
    14. auto instance = Instance(false); \
    15. if (instance != nullptr) { \
    16. CallShutdown(instance); \
    17. } \
    18. } \
    19. \
    20. private: \
    21. classname(); \
    22. DISALLOW_COPY_AND_ASSIGN(classname)

    描述现在的系统状态

    SystemStatus status_

    HMI上显示的状态信息

    std::string current_mode_

    仿真判断状态

    const apollo::dreamview::HMIConfig hmi_config_;
    apollo::dreamview::HMIMode mode_config_;

    判断是不是自动驾驶状态

    bool in_autonomous_driving_ = false;
    bool CheckAutonomousDriving(const double current_time);

    日志缓存

      apollo::common::monitor::MonitorLogBuffer log_buffer_;

    当前node

    std::shared_ptr node_;

    所有monitor 的reader 管理map

     std::unordered_map> readers_;

    开启一次监控

    1. bool StartFrame(const double current_time);
    2. void EndFrame();
    3. bool MonitorManager::StartFrame(const double current_time) {
    4. // Get latest HMIStatus.
    5. static auto hmi_status_reader =
    6. CreateReader(FLAGS_hmi_status_topic);
    7. hmi_status_reader->Observe();
    8. const auto hmi_status = hmi_status_reader->GetLatestObserved();
    9. if (hmi_status == nullptr) {
    10. AERROR << "No HMIStatus was received.";
    11. return false;
    12. }
    13. if (current_mode_ != hmi_status->current_mode()) {
    14. // Mode changed, update configs and monitored.
    15. current_mode_ = hmi_status->current_mode();
    16. mode_config_ = HMIWorker::LoadMode(hmi_config_.modes().at(current_mode_));
    17. status_.clear_hmi_modules();
    18. for (const auto& iter : mode_config_.modules()) {
    19. status_.mutable_hmi_modules()->insert({iter.first, {}});
    20. }
    21. status_.clear_components();
    22. for (const auto& iter : mode_config_.monitored_components()) {
    23. status_.mutable_components()->insert({iter.first, {}});
    24. }
    25. status_.clear_other_components();
    26. for (const auto& iter : mode_config_.other_components()) {
    27. status_.mutable_other_components()->insert({iter.first, {}});
    28. }
    29. } else {
    30. // Mode not changed, clear component summary from the last frame.
    31. for (auto& iter : *status_.mutable_components()) {
    32. iter.second.clear_summary();
    33. }
    34. }
    35. in_autonomous_driving_ = CheckAutonomousDriving(current_time);
    36. return true;
    37. }
    38. void MonitorManager::EndFrame() {
    39. // Print and publish all monitor logs.
    40. log_buffer_.Publish();
    41. }

    start frame分析

    1. 获取最近的HMI状态

            1.1. 如果获取不到就返回false

    2. 如果当前的状态和上一次的状态(HMI状态)不同,就update

             2.1. status_ update 最新的状态

    3. 如果当前的状态与上一次的状态(HMI状态)相同,就清除component summary

    1. // Mode not changed, clear component summary from the last frame.
    2. for (auto& iter : *status_.mutable_components()) {
    3. iter.second.clear_summary();
    4. }

    end frame分析

    把当前的监控过程中利用MonitorLogBuffrt::AddMonitorMsgItem 添加的日志信息打印并发布出去

    发布topic: /apollo/monitor

    1. // modules/common/monitor_log/monitor_log_buffer.cc
    2. void MonitorLogBuffer::AddMonitorMsgItem(
    3. const MonitorMessageItem::LogLevel log_level, const std::string &msg) {
    4. level_ = log_level;
    5. monitor_msg_items_.push_back(std::make_pair(log_level, msg));
    6. }
    7. //modules/common/monitor_log/monitor_logger.cc
    8. MonitorLogger::MonitorLogger() {
    9. const std::string node_name =
    10. absl::StrCat("monitor_logger", Time::Now().ToNanosecond());
    11. node_ = cyber::CreateNode(node_name);
    12. if (node_ != nullptr) {
    13. monitor_msg_writer_ =
    14. node_->CreateWriter("/apollo/monitor");
    15. }
    16. }

    recurrent_runner 分析

    结构分析

    1. class RecurrentRunner {
    2. public:
    3. RecurrentRunner(const std::string &name, const double interval);
    4. virtual ~RecurrentRunner() = default;
    5. // Tick once, which may or may not execute the RunOnce() function, based on
    6. // the interval setting.
    7. void Tick(const double current_time);
    8. // Do the actual work.
    9. virtual void RunOnce(const double current_time) = 0;
    10. protected:
    11. std::string name_;
    12. unsigned int round_count_ = 0;
    13. private:
    14. double interval_;
    15. double next_round_ = 0;
    16. };

    从类的命名上可以看出,这个类是要负责重复工作的。

    Tick 的含义是钟表滴答,可以代表周期性执行任务,上面也有注视写了,Tick 函数可能会执行RunOnce函数,但是也可能不会,执行的周期是以下面的interval_来规定的。

    roundcount指的是执行了多少轮。

    nextround指的是下次执行的时间。

    RunOnce是一个纯虚函数,所以这个类是一个接口,并不可以直接new。

    Tick 函数分析

    1. void RecurrentRunner::Tick(const double current_time) {
    2. if (next_round_ <= current_time) {
    3. ++round_count_;
    4. AINFO_EVERY(100) << name_ << " is running round #" << round_count_;
    5. next_round_ = current_time + interval_;
    6. RunOnce(current_time);
    7. }
    8. }

    执行一次更新下一次要执行的时间,然后执行runOnce 函数,并把当前时间传入。

  • 相关阅读:
    【昇腾310】【mindspore 安装后测试报错】ImportError: libacl_tdt_channel.so
    lnmp架构之mysql的主从复制(一)
    1161 最大层内元素和——Leetcode天天刷【BFS】(2022.7.31)
    油猴脚本(JavaScript)-练手-简单的随机音乐播放器
    软件临界资源访问冲突
    supOS APP开发者课程练习册
    【产品经理】国内企业服务SAAS平台的生存与发展
    ESP8266-Arduino编程实例-HMC5883L磁场传感器
    神经网络 深度神经网络,脉冲神经网络原理
    基于MATLAB开发AUTOSAR软件应用层模块-part9.AUTOSAR工具箱的功能介绍-2
  • 原文地址:https://blog.csdn.net/qq_32378713/article/details/128052990