Skip to main content

variable_period_position/
variable_period_position.rs

1use ladrc_no_std::{LadrcSecondOrder, LadrcSecondOrderConfig, OutputLimit};
2
3fn main() -> Result<(), ladrc_no_std::ConfigError> {
4    let nominal_dt = 0.001;
5    let target_position = 1.0;
6
7    let config = LadrcSecondOrderConfig::from_bandwidth(nominal_dt, 2.0, 12.0, 60.0)
8        .with_output_limit(OutputLimit::new(-5.0, 5.0));
9
10    let mut controller = LadrcSecondOrder::new(config)?;
11    let mut now_ms = 0_u64;
12    let mut position = 0.0;
13    let mut velocity = 0.0;
14    let mut control = 0.0;
15
16    controller.reset_at_millis(now_ms, position);
17
18    let poll_periods_ms = [1_u64, 2, 1, 1, 2];
19
20    for step in 0..5_000 {
21        let actual_dt_ms = poll_periods_ms[step % poll_periods_ms.len()];
22        let actual_dt = actual_dt_ms as f32 * 0.001;
23        now_ms += actual_dt_ms;
24
25        let out = controller.update_at_millis(now_ms, target_position, position)?;
26        control = out.control;
27
28        let load_disturbance = if step > 2_000 { -0.8 } else { 0.0 };
29        let acceleration = -1.2 * velocity - 4.0 * position + 2.0 * control + load_disturbance;
30
31        velocity += actual_dt * acceleration;
32        position += actual_dt * velocity;
33    }
34
35    println!("target position: {target_position:.3}");
36    println!("final position:  {position:.3}");
37    println!("final velocity:  {velocity:.3}");
38    println!("final command:   {control:.3}");
39    println!("final time:      {:.3} s", now_ms as f32 * 0.001);
40
41    Ok(())
42}