码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • PX4模块设计之三十:Hysteresis类


    PX4模块设计之三十:Hysteresis类

    • 1. Hysteresis类简介
    • 2. Hysteresis类成员变量介绍
    • 3. Hysteresis类迟滞逻辑
    • 4. Hysteresis类重要方法
      • 4.1 Hysteresis(bool init_state)
      • 4.2 void set_hysteresis_time_from(const bool from_state, const hrt_abstime new_hysteresis_time_us)
      • 4.3 void set_state_and_update(const bool new_state, const hrt_abstime &now_us)
      • 4.4 void update(const hrt_abstime &now_us)
    • 5. 总结

    1. Hysteresis类简介

    根据当前状态、期望状态、状态之间迁徙时间,通过迁徙时间和期望状态更新的迟滞算法来计算当前状态的类,能够过滤及稳定状态输出,同时带来一定的时间上的迟滞。

    class Hysteresis

    49 class Hysteresis
    50 {
    51 public:
    52 	explicit Hysteresis(bool init_state) :
    53 		_state(init_state),
    54 		_requested_state(init_state)
    55 	{}
    56 	Hysteresis() = delete; // no default constructor
    57 
    58 	~Hysteresis() = default;
    59 
    60 	bool get_state() const { return _state; }
    61 
    62 	void set_hysteresis_time_from(const bool from_state, const hrt_abstime new_hysteresis_time_us);
    63 
    64 	void set_state_and_update(const bool new_state, const hrt_abstime &now_us);
    65 
    66 	void update(const hrt_abstime &now_us);
    67 
    68 private:
    69 
    70 	hrt_abstime _last_time_to_change_state{0};
    71 
    72 	hrt_abstime _time_from_true_us{0};
    73 	hrt_abstime _time_from_false_us{0};
    74 
    75 	bool _state;
    76 	bool _requested_state;
    77 };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    2. Hysteresis类成员变量介绍

    1. hrt_abstime _last_time_to_change_state: 上一次状态变更时间
    2. hrt_abstime _time_from_true_us: true --> false 状态变更迟滞时间
    3. hrt_abstime _time_from_false_us:false --> true 状态变更迟滞时间
    4. bool _state: 当前状态
    5. bool _requested_state: 期望状态

    3. Hysteresis类迟滞逻辑

    1. 期望状态与当前状态一致,则继续维持该状态
    2. 期望状态与当前状态不一致:若期望状态与上次期望状态一致,则表示期望状态稳定,维持当前期望状态,等待超时状态变更
    3. 期望状态与当前状态不一致:若期望状态与上次期望状态不一致,则表示期望状态不稳定,更新最新的期望状态,并更新期望状态更新时间,等待状态稳定,超时变更

    4. Hysteresis类重要方法

    4.1 Hysteresis(bool init_state)

    将状态初始化为设置的init_state(当前状态+期望状态)

    Hysteresis(bool init_state) 
     ├──> _state = init_state
     └──> _requested_state = init_state
    
    • 1
    • 2
    • 3

    4.2 void set_hysteresis_time_from(const bool from_state, const hrt_abstime new_hysteresis_time_us)

    设置状态迁徙需要的时间,单位us

    set_hysteresis_time_from(const bool from_state, const hrt_abstime new_hysteresis_time_us)
     ├──> 
     │   └──> _time_from_true_us = new_hysteresis_time_us  // true -> false 状态迁徙需要的时间
     └──> 
         └──> _time_from_false_us = new_hysteresis_time_us  // false -> true 状态迁徙需要的时间
    
    • 1
    • 2
    • 3
    • 4
    • 5

    4.3 void set_state_and_update(const bool new_state, const hrt_abstime &now_us)

    设置期望状态,并根据状态迁徙时间进行更新。

    set_state_and_update(const bool new_state, const hrt_abstime &now_us)
     ├──> 
     │   ├──> _requested_state = new_state
     │   └──> _last_time_to_change_state = now_us
     ├──> 
     │   └──> _requested_state = _state
     └──> update(now_us)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    4.4 void update(const hrt_abstime &now_us)

    根据迁徙时间及期望状态,更新当前状态。

    update(const hrt_abstime &now_us)
     └──> <_requested_state != _state>
         ├──> const hrt_abstime elapsed = now_us - _last_time_to_change_state
         ├──> <_state && !_requested_state>= _time_from_true_us>  // true -> false
         │   └──> _state = false;
         └──> = _time_from_false_us> // false -> true
             └──> _state = true;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    5. 总结

    Hysteresis类,通过不同状态迁徙时间设置,期望状态调整,过滤了不稳定二值状态,同时带来了一定时间上的迟滞。

  • 相关阅读:
    程序员下班为什么从来不关电脑?
    什么是美国服务器,有哪些优势,适用于什么场景?
    【遍历二叉树算法描述】
    Win11快捷复制粘贴不能用怎么办?Win11快捷复制粘贴不能用
    Linux(05) Debian 系统修改主机名
    Lambda 在集合中的应用
    Keras人工神经网络简介(一)
    智慧大屏是如何实现数据可视化的?
    PyTorch 深度学习之循环神经网络(基础篇)Basic RNN(十一)
    手把手教你使用LabVIEW人工智能视觉工具包快速实现图像读取与采集(含源码)
  • 原文地址:https://blog.csdn.net/lida2003/article/details/126716816
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号