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);
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;
106 double gear_ratio_ = 1.0;
107 double feed_constant_ = 1.0;
114 MotionMasterError init();
132 static double missing_data(std::vector<int32_t>& raw_positions,
133 std::vector<int32_t>& raw_velocities,
134 std::vector<int32_t>& raw_torques);
146 static int32_t calculate_linear_interpolation_step_value(
147 std::vector<int32_t> data, uint32_t first_zero_index,
148 uint32_t last_zero_index);
158 static void linear_interpolation(std::vector<int32_t>& raw_positions,
159 std::vector<int32_t>& raw_velocities,
160 std::vector<int32_t>& raw_torques);
169 MotionMasterError save_plant_model_to_flash(PlantModel m);
179 static std::vector<double> convert_position_to_si(
180 std::vector<int32_t> raw_positions, uint32_t singleturn_resolution);
192 static std::vector<double> convert_velocity_to_si(
193 const std::vector<int32_t>& raw_velocities,
double gear_ratio = 1.0,
194 double velocity_unit_scaling = 1,
double feed_constant = 1.0);
204 static std::vector<double> convert_torque_to_si(
205 const std::vector<int32_t>& raw_torques, uint32_t nominal_torque);
215 MotionMasterError check_input_signal_amplitudes(
216 const std::vector<int32_t>& torques,
217 const std::vector<double>& velocities);
229 static MotionMasterError check_input_signal_signs(
230 const std::vector<int16_t>& chirp_target_torques,
231 const std::vector<double>& velocities,
232 const std::vector<int32_t>& raw_positions);
239 MotionMasterError set_integral_limits();
251 static bool check_model_stability(
const PlantModel& m);
272 static PlantModel identify_plant_model(std::vector<double> velocities_si,
273 std::vector<double> torques_si,
286 static int32_t find_torque_sign_change(
287 const std::vector<int16_t>& chirp_target_torques);
300 static std::tuple<PlantModel, double> get_optimal_model(
301 std::vector<double> velocities_si, std::vector<double> torques_si,
303 const std::string& fileName =
"");
316 static double calculate_stability_margin(PlantModel m);
334 static double validate_sys_ident(PlantModel m,
335 const std::vector<double>& velocities_si,
336 const std::vector<double>& torques_si,
339 const std::string& =
"");
366 static PlantModel do_least_squares(std::vector<double> y,
367 std::vector<double> tau,
double time_step,
368 uint8_t order, uint16_t cutoff_frequency);
385 static std::vector<double> gpmf_filtering(std::vector<double> data,
386 uint16_t cutoff_frequency,
402 static std::tuple<dlib::matrix<double>, std::vector<double>,
404 create_data_matrix(std::vector<double> y, std::vector<double> tau,
405 double time_step, uint8_t order);
415 static std::vector<double> numerical_differentiation(std::vector<double> data,
418 static void write_sys_id_csv(
const std::string& filename,
419 const std::vector<double>& torques_si,
420 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)
Definition system_identification.cc:26