根据当前状态、期望状态、状态之间迁徙时间,通过迁徙时间和期望状态更新的迟滞算法来计算当前状态的类,能够过滤及稳定状态输出,同时带来一定的时间上的迟滞。
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 };
将状态初始化为设置的init_state(当前状态+期望状态)
Hysteresis(bool init_state)
├──> _state = init_state
└──> _requested_state = init_state
设置状态迁徙需要的时间,单位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 状态迁徙需要的时间
设置期望状态,并根据状态迁徙时间进行更新。
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)
根据迁徙时间及期望状态,更新当前状态。
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;
Hysteresis类,通过不同状态迁徙时间设置,期望状态调整,过滤了不稳定二值状态,同时带来了一定时间上的迟滞。