26 std::vector<double>& times,
bool resample =
false,
27 double timeStep = 0,
size_t size = 0)
43 for (
size_t si = 0; si < x.size(); si++)
44 new_x[si] = x[si] - (x[si] - bx[si]) * (t - bt) * invTS;
72 const std::function<
void()>& started_callback = {},
73 const std::function<void(motionmaster::MotionMasterMessage::Status::
74 SystemIdentification::Warning::Code,
75 std::string)>& warning_callback = {},
76 bool next_gen_sys_id =
false,
bool skip_chirp_signal =
false);
88 MotionMasterError
start();
91 uint32_t device_address_;
92 Cia402Drive& cia402_drive_;
97 const std::function<void()>& started_callback_;
98 const std::function<void(motionmaster::MotionMasterMessage::Status::
99 SystemIdentification::Warning::Code,
100 std::string)>& warning_callback_;
102 SiUnitVelocity si_unit_velocity_;
104 bool next_gen_sys_id_ =
false;
105 bool skip_chirp_signal_ =
false;
107 double gear_ratio_ = 1.0;
108 double feed_constant_ = 1.0;
115 MotionMasterError init();
133 static double missing_data(std::vector<int32_t>& raw_positions,
134 std::vector<int32_t>& raw_velocities,
135 std::vector<int32_t>& raw_torques);
147 static int32_t calculate_linear_interpolation_step_value(
148 std::vector<int32_t> data, uint32_t first_zero_index,
149 uint32_t last_zero_index);
159 static void linear_interpolation(std::vector<int32_t>& raw_positions,
160 std::vector<int32_t>& raw_velocities,
161 std::vector<int32_t>& raw_torques);
170 MotionMasterError save_plant_model_to_flash(PlantModel m);
180 static std::vector<double> convert_position_to_si(
181 std::vector<int32_t> raw_positions, uint32_t singleturn_resolution);
193 static std::vector<double> convert_velocity_to_si(
194 const std::vector<int32_t>& raw_velocities,
double gear_ratio = 1.0,
195 double velocity_unit_scaling = 1,
double feed_constant = 1.0);
205 static std::vector<double> convert_torque_to_si(
206 const std::vector<int32_t>& raw_torques, uint32_t nominal_torque);
216 MotionMasterError check_input_signal_amplitudes(
217 const std::vector<int32_t>& torques,
218 const std::vector<double>& velocities);
230 static MotionMasterError check_input_signal_signs(
231 const std::vector<int16_t>& chirp_target_torques,
232 const std::vector<double>& velocities,
233 const std::vector<int32_t>& raw_positions);
240 MotionMasterError set_integral_limits();
252 static bool check_model_stability(
const PlantModel& m);
273 static PlantModel identify_plant_model(std::vector<double> velocities_si,
274 std::vector<double> torques_si,
287 static int32_t find_torque_sign_change(
288 const std::vector<int16_t>& chirp_target_torques);
301 static std::tuple<PlantModel, double> get_optimal_model(
302 std::vector<double> velocities_si, std::vector<double> torques_si,
304 const std::string& fileName =
"");
317 static double calculate_stability_margin(PlantModel m);
335 static double validate_sys_ident(PlantModel m,
336 const std::vector<double>& velocities_si,
337 const std::vector<double>& torques_si,
340 const std::string& =
"");
367 static PlantModel do_least_squares(std::vector<double> y,
368 std::vector<double> tau,
double time_step,
369 uint8_t order, uint16_t cutoff_frequency);
386 static std::vector<double> gpmf_filtering(std::vector<double> data,
387 uint16_t cutoff_frequency,
403 static std::tuple<dlib::matrix<double>, std::vector<double>,
405 create_data_matrix(std::vector<double> y, std::vector<double> tau,
406 double time_step, uint8_t order);
416 static std::vector<double> numerical_differentiation(std::vector<double> data,
419 static void write_sys_id_csv(
const std::string& filename,
420 const std::vector<double>& torques_si,
421 const std::vector<double>& velocities_si);
SystemIdentification(uint32_t device_address, Cia402Drive &cia402_drive, TuningParameters tuning_params, const std::function< void()> &started_callback={}, const std::function< void(motionmaster::MotionMasterMessage::Status::SystemIdentification::Warning::Code, std::string)> &warning_callback={}, bool next_gen_sys_id=false, bool skip_chirp_signal=false)
Definition system_identification.cc:27