1#ifndef ERROR_TRIGGERS_H
2#define ERROR_TRIGGERS_H
4#if defined(ARDUINO_TEENSY36) || defined(ARDUINO_TEENSY41)
17namespace error_triggers_state
19 bool triggered_error =
false;
22 const float motor_inertia_threshold = 0.01;
23 float left_prev_velocity = 0;
24 float right_prev_velocity = 0;
27 const float motor_position_alpha = 0.1;
28 const float motor_position_tolerance = 10;
29 float filtered_motor_position_left = 0;
30 float filtered_motor_position_right = 0;
31 const std::pair<float, float> left_position_bounds = std::make_pair<float, float> (12-motor_position_tolerance, 10+motor_position_tolerance);
32 const std::pair<float, float> right_position_bounds = std::make_pair<float, float> (12-motor_position_tolerance, 10+motor_position_tolerance);
35 const float torque_output_alpha = 0.2;
36 const float torque_output_threshold = 45;
37 float average_torque_output_left = 0;
38 float average_torque_output_right = 0;
41 const int failure_count_threshold = 2;
43 const int torque_std_dev_multiple = 10;
44 const float torque_window_size = 100;
45 std::queue<float> torque_sensor_queue_left;
46 std::queue<float> torque_sensor_queue_right;
47 int torque_failure_count_left = 0;
48 int torque_failure_count_right = 0;
50 const int force_std_dev_multiple = 10;
51 const float force_window_size = 100;
52 std::queue<float> force_sensor_queue_left;
53 std::queue<float> force_sensor_queue_right;
54 int force_failure_count_left = 0;
55 int force_failure_count_right = 0;
58 const float tracking_alpha = 0.1;
59 const float tracking_threshold = 15;
60 float average_tracking_error_left = 0;
61 float average_tracking_error_right = 0;
64 const float transmission_efficiency_alpha = 0.1;
65 const float transmission_efficiency_threshold = 0.01;
66 float average_motor_torque_left = 0;
67 float average_motor_torque_right = 0;
71 const float pjmc_state_time = 25;
72 const float pjmc_state_alpha = 2 / ((pjmc_state_time *
LOOP_FREQ_HZ) + 1);
73 const float pjmc_state_threshold = 0.95;
74 float average_pjmc_state_left = 0;
75 float average_pjmc_state_right = 0;
79namespace error_triggers
81 int soft(Exo* exo,
ExoData* exo_data)
88 int hard(Exo* exo,
ExoData* exo_data)
110 int fatal(Exo* exo,
ExoData* exo_data)
121 error_triggers_state::average_torque_output_left, error_triggers_state::torque_output_alpha);
123 error_triggers_state::average_torque_output_right, error_triggers_state::torque_output_alpha);
124 bool left_torque_error = (abs(error_triggers_state::average_torque_output_left) > error_triggers_state::torque_output_threshold);
125 bool right_torque_error = (abs(error_triggers_state::average_torque_output_right) > error_triggers_state::torque_output_threshold);
126 if (left_torque_error || right_torque_error)
129 error_triggers_state::triggered_error =
true;
155 if (error_triggers_state::torque_sensor_queue_left.
size() > error_triggers_state::torque_window_size)
157 error_triggers_state::torque_sensor_queue_left.pop();
158 error_triggers_state::torque_sensor_queue_right.pop();
160 std::pair<float, float> left_population_vals =
utils::online_std_dev(error_triggers_state::torque_sensor_queue_left);
161 std::pair<float, float> right_population_vals =
utils::online_std_dev(error_triggers_state::torque_sensor_queue_right);
162 std::pair<float, float> left_bounds = std::make_pair(left_population_vals.first - error_triggers_state::torque_std_dev_multiple*left_population_vals.second,
163 left_population_vals.first + error_triggers_state::torque_std_dev_multiple*left_population_vals.second);
164 std::pair<float, float> right_bounds = std::make_pair(right_population_vals.first - error_triggers_state::torque_std_dev_multiple*right_population_vals.second,
165 right_population_vals.first + error_triggers_state::torque_std_dev_multiple*right_population_vals.second);
169 bool left_torque_variance_error = (error_triggers_state::torque_failure_count_left > error_triggers_state::failure_count_threshold);
170 bool right_torque_variance_error = (error_triggers_state::torque_failure_count_right > error_triggers_state::failure_count_threshold);
171 if (left_torque_variance_error || right_torque_variance_error)
174 error_triggers_state::triggered_error =
true;
181 error_triggers_state::force_sensor_queue_left.push(exo_data->
left_leg.
toe_fsr);
182 error_triggers_state::force_sensor_queue_right.push(exo_data->
right_leg.
toe_fsr);
183 if (error_triggers_state::force_sensor_queue_left.
size() > error_triggers_state::force_window_size)
185 error_triggers_state::force_sensor_queue_left.pop();
186 error_triggers_state::force_sensor_queue_right.pop();
188 std::pair<float, float> left_population_vals =
utils::online_std_dev(error_triggers_state::force_sensor_queue_left);
189 std::pair<float, float> right_population_vals =
utils::online_std_dev(error_triggers_state::force_sensor_queue_right);
190 std::pair<float, float> left_bounds = std::make_pair(left_population_vals.first - error_triggers_state::force_std_dev_multiple*left_population_vals.second,
191 left_population_vals.first + error_triggers_state::force_std_dev_multiple*left_population_vals.second);
192 std::pair<float, float> right_bounds = std::make_pair(right_population_vals.first - error_triggers_state::force_std_dev_multiple*right_population_vals.second,
193 right_population_vals.first + error_triggers_state::force_std_dev_multiple*right_population_vals.second);
199 if (error_triggers_state::force_failure_count_left > error_triggers_state::failure_count_threshold ||
200 error_triggers_state::force_failure_count_right > error_triggers_state::failure_count_threshold)
202 error_triggers_state::triggered_error =
true;
#define LOOP_FREQ_HZ
Definition Config.h:17
Declares for the different exo class that all the other components will live in.
Declares a class used to store data for the Exo to access.
Declares the functions needed and defines mapping between the INI keys and the exo components.
Class to store all the data related to the exo.
Definition ExoData.h:38
LegData right_leg
Definition ExoData.h:122
int error_joint_id
Definition ExoData.h:130
uint8_t * config
Definition ExoData.h:126
LegData left_leg
Definition ExoData.h:121
float torque_reading
Definition JointData.h:47
JointData ankle
Definition LegData.h:44
float toe_fsr
Definition LegData.h:59
@ FORCE_VARIANCE_ERROR
Definition error_types.h:31
@ TORQUE_OUT_OF_BOUNDS
Definition error_types.h:29
@ TORQUE_VARIANCE_ERROR
Definition error_types.h:30
@ NO_ERROR
Definition error_types.h:15
int size()
Check the size of the FIFO queue.
Definition BleMessageQueue.cpp:55
std::pair< float, float > online_std_dev(std::queue< float > set)
Given a set of data and maximum size. Returns the new mean and standard deviation.
Definition Utilities.cpp:350
float ewma(float new_value, float filter_value, float alpha)
Exponential Weighted Moving Average. Used to smooth out noisy data.
Definition Utilities.cpp:317
bool is_outside_range(float val, float min, float max)
Checks if a value is outside of a range.
Definition Utilities.cpp:384