gmt_m2_ctrl_fsm_positionner/
lib.rs1#![allow(non_upper_case_globals)]
2#![allow(non_camel_case_types)]
3#![allow(non_snake_case)]
4#![allow(improper_ctypes)]
5
6include!(concat!(env!("OUT_DIR"), "/bindings.rs"));
7
8include!(concat!(env!("OUT_DIR"), "/controller.rs"));
9
10#[cfg(test)]
11mod tests {
12 use std::f64::EPSILON;
13
14 use super::*;
15 use matio_rs::MatFile;
16
17 #[test]
18 fn impulse() {
19 let path = std::path::Path::new(env!("CARGO_MANIFEST_DIR"))
20 .join("..")
21 .join("simulink-models")
22 .join("m2fsm_tests.mat");
23 let mat = MatFile::load(path.to_str().unwrap()).unwrap();
24 let m2pact_fb_imp_t: Vec<f64> = mat.var("m2pact_fb_imp_t").unwrap();
25 let m2pact_fb_imp_y: Vec<f64> = mat.var("m2pact_fb_imp_y").unwrap();
26
27 let n = m2pact_fb_imp_t.len();
28
29 let sim_y: Vec<_> = m2pact_fb_imp_y; dbg!(&sim_y[..10]);
31
32 let mut ctrl = FsmPositionner::new();
33 let mut y = vec![];
34 for i in 0..n {
35 ctrl.inputs.M2pAct_E = if i == 0 { 1000f64 } else { 0f64 };
36 ctrl.step();
37 y.push(ctrl.outputs.M2pAct_U);
38 }
39 dbg!(&y[..10]);
40
41 let n = sim_y.len();
42 let y_err = (sim_y
43 .into_iter()
44 .zip(&y)
45 .map(|(sim_y, y)| 1. - y / sim_y)
46 .map(|x| x * x)
47 .sum::<f64>()
48 / (n as f64))
49 .sqrt();
50 assert!(dbg!(y_err) < EPSILON * 1e4);
51 }
52}