diff --git a/figs/detail_control_cf_analytical_effect_alpha.pdf b/figs/detail_control_cf_analytical_effect_alpha.pdf new file mode 100644 index 0000000..33b0e47 Binary files /dev/null and b/figs/detail_control_cf_analytical_effect_alpha.pdf differ diff --git a/figs/detail_control_cf_analytical_effect_alpha.png b/figs/detail_control_cf_analytical_effect_alpha.png new file mode 100644 index 0000000..b7fb90f Binary files /dev/null and b/figs/detail_control_cf_analytical_effect_alpha.png differ diff --git a/figs/detail_control_cf_analytical_effect_w0.pdf b/figs/detail_control_cf_analytical_effect_w0.pdf new file mode 100644 index 0000000..10e10ce Binary files /dev/null and b/figs/detail_control_cf_analytical_effect_w0.pdf differ diff --git a/figs/detail_control_cf_analytical_effect_w0.png b/figs/detail_control_cf_analytical_effect_w0.png new file mode 100644 index 0000000..a4afa90 Binary files /dev/null and b/figs/detail_control_cf_analytical_effect_w0.png differ diff --git a/figs/detail_control_cf_arch.pdf b/figs/detail_control_cf_arch.pdf index 432d753..845f6aa 100644 Binary files a/figs/detail_control_cf_arch.pdf and b/figs/detail_control_cf_arch.pdf differ diff --git a/figs/detail_control_cf_arch.png b/figs/detail_control_cf_arch.png index 9607600..cbd536e 100644 Binary files a/figs/detail_control_cf_arch.png and b/figs/detail_control_cf_arch.png differ diff --git a/figs/detail_control_cf_arch.svg b/figs/detail_control_cf_arch.svg index 435cdb8..9fb33db 100644 --- a/figs/detail_control_cf_arch.svg +++ b/figs/detail_control_cf_arch.svg @@ -1,201 +1,244 @@ - + - + + + + + + + + + + + + + + + + + + + + + + + + + - + - - - - - - - - - - - - - - - - - - - - - - + - + + + + + + + + + + + + + + + + + + + + + + - + - - + + - - + + - - + + + + + - + - + - + - + - + - + - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + + + + + - + - + - + - + - - - - + + + + - + - - - - - - - - - + + + + + + + + + - + - - - - - - + + + + + + - + - + - - + + - + - + - - - + + + + + + + + + + - - - - - - - - - - + - + - + - - + + - + - + diff --git a/figs/detail_control_cf_arch_class.pdf b/figs/detail_control_cf_arch_class.pdf index efc07f9..af7b501 100644 Binary files a/figs/detail_control_cf_arch_class.pdf and b/figs/detail_control_cf_arch_class.pdf differ diff --git a/figs/detail_control_cf_arch_class.png b/figs/detail_control_cf_arch_class.png index 1a77087..243c936 100644 Binary files a/figs/detail_control_cf_arch_class.png and b/figs/detail_control_cf_arch_class.png differ diff --git a/figs/detail_control_cf_arch_class.svg b/figs/detail_control_cf_arch_class.svg index ad16d83..c5ae36a 100644 --- a/figs/detail_control_cf_arch_class.svg +++ b/figs/detail_control_cf_arch_class.svg @@ -1,142 +1,196 @@ - + - + + + + + + + + + + + + + + + + + + + + + + + + + - + - - - - - - - - - - - - - - - - - - - - - - + - + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - + - + - + + + + - - - - - - - - - - - - - - - - - - - - - - - + - + - - - - - + - + - - - - - + + + - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - - - - - + + + + + + + + + + + + + + + + + + - + - + - - - - - - - + + + + + - - - - - - - - + - + + + + + + + + + + + + + + + + + + + + + diff --git a/figs/detail_control_cf_arch_eq.pdf b/figs/detail_control_cf_arch_eq.pdf index 7219665..dc7a296 100644 Binary files a/figs/detail_control_cf_arch_eq.pdf and b/figs/detail_control_cf_arch_eq.pdf differ diff --git a/figs/detail_control_cf_arch_eq.png b/figs/detail_control_cf_arch_eq.png index 257ecf3..a54599c 100644 Binary files a/figs/detail_control_cf_arch_eq.png and b/figs/detail_control_cf_arch_eq.png differ diff --git a/figs/detail_control_cf_arch_eq.svg b/figs/detail_control_cf_arch_eq.svg index 0cee983..730ce0a 100644 --- a/figs/detail_control_cf_arch_eq.svg +++ b/figs/detail_control_cf_arch_eq.svg @@ -1,199 +1,177 @@ - + - - - - - - - - - - - - - - - - - - - - - - - - - + - + - + + + + + + + + + + + + + + + + + + + + + + - + - + - + - + - + - + - + - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + + + + + + - + + + + + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - - - - - - + + + + + + - + - - - - - - - - - + + + + + + + + + + + + + + + + - - - - - + - + - - - - + + + + + + + + + + + + - + - - - - - + + - - - - - - + - + - - - - - - - - - - - - - + + diff --git a/figs/detail_control_cf_arch_tunable_params.pdf b/figs/detail_control_cf_arch_tunable_params.pdf new file mode 100644 index 0000000..8da358b Binary files /dev/null and b/figs/detail_control_cf_arch_tunable_params.pdf differ diff --git a/figs/detail_control_cf_arch_tunable_params.png b/figs/detail_control_cf_arch_tunable_params.png new file mode 100644 index 0000000..0aa62ea Binary files /dev/null and b/figs/detail_control_cf_arch_tunable_params.png differ diff --git a/figs/detail_control_cf_arch_tunable_params.svg b/figs/detail_control_cf_arch_tunable_params.svg new file mode 100644 index 0000000..73e4661 --- /dev/null +++ b/figs/detail_control_cf_arch_tunable_params.svg @@ -0,0 +1,246 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/figs/detail_control_cf_bode_Kfb.pdf b/figs/detail_control_cf_bode_Kfb.pdf index 37bdb06..70ba175 100644 Binary files a/figs/detail_control_cf_bode_Kfb.pdf and b/figs/detail_control_cf_bode_Kfb.pdf differ diff --git a/figs/detail_control_cf_bode_Kfb.png b/figs/detail_control_cf_bode_Kfb.png index ce79e58..0448391 100644 Binary files a/figs/detail_control_cf_bode_Kfb.png and b/figs/detail_control_cf_bode_Kfb.png differ diff --git a/figs/detail_control_cf_bode_plot_loop_gain_robustness.pdf b/figs/detail_control_cf_bode_plot_loop_gain_robustness.pdf index 68c5c14..593f26d 100644 Binary files a/figs/detail_control_cf_bode_plot_loop_gain_robustness.pdf and b/figs/detail_control_cf_bode_plot_loop_gain_robustness.pdf differ diff --git a/figs/detail_control_cf_bode_plot_loop_gain_robustness.png b/figs/detail_control_cf_bode_plot_loop_gain_robustness.png index 15ecc6a..48c6f53 100644 Binary files a/figs/detail_control_cf_bode_plot_loop_gain_robustness.png and b/figs/detail_control_cf_bode_plot_loop_gain_robustness.png differ diff --git a/figs/detail_control_cf_bode_plot_mech_sys.pdf b/figs/detail_control_cf_bode_plot_mech_sys.pdf index d172b0b..3a297a5 100644 Binary files a/figs/detail_control_cf_bode_plot_mech_sys.pdf and b/figs/detail_control_cf_bode_plot_mech_sys.pdf differ diff --git a/figs/detail_control_cf_bode_plot_mech_sys.png b/figs/detail_control_cf_bode_plot_mech_sys.png index 37f6caa..1ddb2ee 100644 Binary files a/figs/detail_control_cf_bode_plot_mech_sys.png and b/figs/detail_control_cf_bode_plot_mech_sys.png differ diff --git a/figs/detail_control_cf_hinf_filters_result_weights.pdf b/figs/detail_control_cf_hinf_filters_result_weights.pdf index 47917d6..41dacd7 100644 Binary files a/figs/detail_control_cf_hinf_filters_result_weights.pdf and b/figs/detail_control_cf_hinf_filters_result_weights.pdf differ diff --git a/figs/detail_control_cf_hinf_filters_result_weights.png b/figs/detail_control_cf_hinf_filters_result_weights.png index 5a9c645..1e35bbc 100644 Binary files a/figs/detail_control_cf_hinf_filters_result_weights.png and b/figs/detail_control_cf_hinf_filters_result_weights.png differ diff --git a/figs/detail_control_cf_nyquist_robustness.pdf b/figs/detail_control_cf_nyquist_robustness.pdf index d219f4a..b9f2e10 100644 Binary files a/figs/detail_control_cf_nyquist_robustness.pdf and b/figs/detail_control_cf_nyquist_robustness.pdf differ diff --git a/figs/detail_control_cf_nyquist_robustness.png b/figs/detail_control_cf_nyquist_robustness.png index 6ae1524..9382810 100644 Binary files a/figs/detail_control_cf_nyquist_robustness.png and b/figs/detail_control_cf_nyquist_robustness.png differ diff --git a/figs/detail_control_cf_nyquist_uncertainty.pdf b/figs/detail_control_cf_nyquist_uncertainty.pdf new file mode 100644 index 0000000..27288b5 Binary files /dev/null and b/figs/detail_control_cf_nyquist_uncertainty.pdf differ diff --git a/figs/detail_control_cf_nyquist_uncertainty.png b/figs/detail_control_cf_nyquist_uncertainty.png new file mode 100644 index 0000000..6f6e92a Binary files /dev/null and b/figs/detail_control_cf_nyquist_uncertainty.png differ diff --git a/figs/detail_control_cf_robust_perf.pdf b/figs/detail_control_cf_robust_perf.pdf index b12b3f4..a213bc3 100644 Binary files a/figs/detail_control_cf_robust_perf.pdf and b/figs/detail_control_cf_robust_perf.pdf differ diff --git a/figs/detail_control_cf_robust_perf.png b/figs/detail_control_cf_robust_perf.png index 7d27d6d..269266a 100644 Binary files a/figs/detail_control_cf_robust_perf.png and b/figs/detail_control_cf_robust_perf.png differ diff --git a/figs/detail_control_cf_specs_S_T.pdf b/figs/detail_control_cf_specs_S_T.pdf index 19774df..291be12 100644 Binary files a/figs/detail_control_cf_specs_S_T.pdf and b/figs/detail_control_cf_specs_S_T.pdf differ diff --git a/figs/detail_control_cf_specs_S_T.png b/figs/detail_control_cf_specs_S_T.png index c7710bd..74d4266 100644 Binary files a/figs/detail_control_cf_specs_S_T.png and b/figs/detail_control_cf_specs_S_T.png differ diff --git a/figs/detail_control_cf_test_model.pdf b/figs/detail_control_cf_test_model.pdf new file mode 100644 index 0000000..d471c37 Binary files /dev/null and b/figs/detail_control_cf_test_model.pdf differ diff --git a/figs/detail_control_cf_test_model.png b/figs/detail_control_cf_test_model.png new file mode 100644 index 0000000..9172586 Binary files /dev/null and b/figs/detail_control_cf_test_model.png differ diff --git a/figs/detail_control_decoupling_control_jacobian.pdf b/figs/detail_control_decoupling_control_jacobian.pdf index 667c485..6bee5e2 100644 Binary files a/figs/detail_control_decoupling_control_jacobian.pdf and b/figs/detail_control_decoupling_control_jacobian.pdf differ diff --git a/figs/detail_control_decoupling_control_jacobian.png b/figs/detail_control_decoupling_control_jacobian.png index 1db7640..4d7d5a5 100644 Binary files a/figs/detail_control_decoupling_control_jacobian.png and b/figs/detail_control_decoupling_control_jacobian.png differ diff --git a/figs/detail_control_decoupling_control_jacobian.svg b/figs/detail_control_decoupling_control_jacobian.svg index b455d99..abf9f37 100644 --- a/figs/detail_control_decoupling_control_jacobian.svg +++ b/figs/detail_control_decoupling_control_jacobian.svg @@ -26,19 +26,19 @@ - - - - + + + + - + - + @@ -79,32 +79,32 @@ - + - + - + - + - + - + - + - + @@ -120,7 +120,7 @@ - + @@ -139,7 +139,7 @@ - + @@ -147,7 +147,7 @@ - + diff --git a/figs/detail_control_decoupling_control_jacobian_CoK.pdf b/figs/detail_control_decoupling_control_jacobian_CoK.pdf index 9f65a60..ce87fbc 100644 Binary files a/figs/detail_control_decoupling_control_jacobian_CoK.pdf and b/figs/detail_control_decoupling_control_jacobian_CoK.pdf differ diff --git a/figs/detail_control_decoupling_control_jacobian_CoK.png b/figs/detail_control_decoupling_control_jacobian_CoK.png index 44b63fe..00f0891 100644 Binary files a/figs/detail_control_decoupling_control_jacobian_CoK.png and b/figs/detail_control_decoupling_control_jacobian_CoK.png differ diff --git a/figs/detail_control_decoupling_control_jacobian_CoK.svg b/figs/detail_control_decoupling_control_jacobian_CoK.svg index 3e32c96..5229023 100644 --- a/figs/detail_control_decoupling_control_jacobian_CoK.svg +++ b/figs/detail_control_decoupling_control_jacobian_CoK.svg @@ -6,6 +6,9 @@ + + + @@ -23,11 +26,8 @@ - - - - + @@ -79,41 +79,41 @@ - + - + - + - + - + - + - + - + - + - + - + - + @@ -134,7 +134,7 @@ - + @@ -147,7 +147,7 @@ - + diff --git a/figs/detail_control_decoupling_control_jacobian_CoM.pdf b/figs/detail_control_decoupling_control_jacobian_CoM.pdf index da6fc03..555da28 100644 Binary files a/figs/detail_control_decoupling_control_jacobian_CoM.pdf and b/figs/detail_control_decoupling_control_jacobian_CoM.pdf differ diff --git a/figs/detail_control_decoupling_control_jacobian_CoM.png b/figs/detail_control_decoupling_control_jacobian_CoM.png index 6109571..e2b2cc7 100644 Binary files a/figs/detail_control_decoupling_control_jacobian_CoM.png and b/figs/detail_control_decoupling_control_jacobian_CoM.png differ diff --git a/figs/detail_control_decoupling_control_jacobian_CoM.svg b/figs/detail_control_decoupling_control_jacobian_CoM.svg index aa2f1d3..76b7bc4 100644 --- a/figs/detail_control_decoupling_control_jacobian_CoM.svg +++ b/figs/detail_control_decoupling_control_jacobian_CoM.svg @@ -6,6 +6,9 @@ + + + @@ -23,11 +26,8 @@ - - - - + @@ -79,41 +79,41 @@ - + - + - + - + - + - + - + - + - + - + - + - + @@ -134,7 +134,7 @@ - + @@ -147,7 +147,7 @@ - + diff --git a/figs/detail_control_decoupling_modal.pdf b/figs/detail_control_decoupling_modal.pdf index 752f26c..a26a780 100644 Binary files a/figs/detail_control_decoupling_modal.pdf and b/figs/detail_control_decoupling_modal.pdf differ diff --git a/figs/detail_control_decoupling_modal.png b/figs/detail_control_decoupling_modal.png index 4ee737c..4360065 100644 Binary files a/figs/detail_control_decoupling_modal.png and b/figs/detail_control_decoupling_modal.png differ diff --git a/figs/detail_control_decoupling_modal.svg b/figs/detail_control_decoupling_modal.svg index c88df93..8946449 100644 --- a/figs/detail_control_decoupling_modal.svg +++ b/figs/detail_control_decoupling_modal.svg @@ -15,9 +15,6 @@ - - - @@ -33,18 +30,21 @@ - + - + + + + - + - + @@ -76,61 +76,61 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -143,13 +143,13 @@ - + - + @@ -162,18 +162,18 @@ - + - + - + @@ -184,7 +184,7 @@ - + diff --git a/figs/detail_control_decoupling_model_test.pdf b/figs/detail_control_decoupling_model_test.pdf index 42a6d35..2e32e26 100644 Binary files a/figs/detail_control_decoupling_model_test.pdf and b/figs/detail_control_decoupling_model_test.pdf differ diff --git a/figs/detail_control_decoupling_model_test_CoK.pdf b/figs/detail_control_decoupling_model_test_CoK.pdf index 2411b8c..bd134d8 100644 Binary files a/figs/detail_control_decoupling_model_test_CoK.pdf and b/figs/detail_control_decoupling_model_test_CoK.pdf differ diff --git a/figs/detail_control_decoupling_model_test_CoK.png b/figs/detail_control_decoupling_model_test_CoK.png index 4de4059..27fa28b 100644 Binary files a/figs/detail_control_decoupling_model_test_CoK.png and b/figs/detail_control_decoupling_model_test_CoK.png differ diff --git a/figs/detail_control_decoupling_model_test_CoM.pdf b/figs/detail_control_decoupling_model_test_CoM.pdf index d63fbdb..eb7419e 100644 Binary files a/figs/detail_control_decoupling_model_test_CoM.pdf and b/figs/detail_control_decoupling_model_test_CoM.pdf differ diff --git a/figs/detail_control_decoupling_model_test_alt.pdf b/figs/detail_control_decoupling_model_test_alt.pdf index e7e979b..ff47926 100644 Binary files a/figs/detail_control_decoupling_model_test_alt.pdf and b/figs/detail_control_decoupling_model_test_alt.pdf differ diff --git a/figs/detail_control_decoupling_model_test_modal.pdf b/figs/detail_control_decoupling_model_test_modal.pdf index bb4392c..b9bfbc5 100644 Binary files a/figs/detail_control_decoupling_model_test_modal.pdf and b/figs/detail_control_decoupling_model_test_modal.pdf differ diff --git a/figs/detail_control_decoupling_strut_model.pdf b/figs/detail_control_decoupling_strut_model.pdf index 6ac9a3f..b0de00d 100644 Binary files a/figs/detail_control_decoupling_strut_model.pdf and b/figs/detail_control_decoupling_strut_model.pdf differ diff --git a/figs/detail_control_decoupling_svd.pdf b/figs/detail_control_decoupling_svd.pdf index 2f68520..9e2194a 100644 Binary files a/figs/detail_control_decoupling_svd.pdf and b/figs/detail_control_decoupling_svd.pdf differ diff --git a/figs/detail_control_decoupling_svd.png b/figs/detail_control_decoupling_svd.png index ab3be13..7f09dd8 100644 Binary files a/figs/detail_control_decoupling_svd.png and b/figs/detail_control_decoupling_svd.png differ diff --git a/figs/detail_control_decoupling_svd.svg b/figs/detail_control_decoupling_svd.svg index 83c9f1a..283dd2c 100644 --- a/figs/detail_control_decoupling_svd.svg +++ b/figs/detail_control_decoupling_svd.svg @@ -42,7 +42,7 @@ - + @@ -84,13 +84,13 @@ - + - + - + diff --git a/figs/inkscape/convert_svg.sh b/figs/inkscape/convert_svg.sh new file mode 100755 index 0000000..c9c1755 --- /dev/null +++ b/figs/inkscape/convert_svg.sh @@ -0,0 +1,18 @@ +#!/bin/bash + +# Directory containing SVG files +INPUT_DIR="." + +# Loop through all SVG files in the directory +for svg_file in "$INPUT_DIR"/*.svg; do + # Check if there are SVG files in the directory + if [ -f "$svg_file" ]; then + # Output PDF file name + pdf_file="../${svg_file%.svg}.pdf" + png_file="../${svg_file%.svg}" + + # Convert SVG to PDF using Inkscape + inkscape "$svg_file" --export-filename="$pdf_file" && \ + pdftocairo -png -singlefile -cropbox "$pdf_file" "$png_file" + fi +done diff --git a/figs/inkscape/detail_control_cf_nyquist_uncertainty.svg b/figs/inkscape/detail_control_cf_nyquist_uncertainty.svg new file mode 100644 index 0000000..3e11a8b --- /dev/null +++ b/figs/inkscape/detail_control_cf_nyquist_uncertainty.svg @@ -0,0 +1,1014 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Re + Im + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/figs/inkscape/detail_control_cf_specs_S_T.svg b/figs/inkscape/detail_control_cf_specs_S_T.svg new file mode 100644 index 0000000..30cfad6 --- /dev/null +++ b/figs/inkscape/detail_control_cf_specs_S_T.svg @@ -0,0 +1,3570 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + NoiseFiltering + + + Robust Stability + Nominal Performance + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/figs/inkscape/detail_control_cf_test_model.svg b/figs/inkscape/detail_control_cf_test_model.svg new file mode 100644 index 0000000..df56994 --- /dev/null +++ b/figs/inkscape/detail_control_cf_test_model.svg @@ -0,0 +1,1532 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Payload + + X-ray + + + + + + + + + + + + + diff --git a/figs/detail_control_decoupling_model_test.svg b/figs/inkscape/detail_control_decoupling_model_test.svg similarity index 100% rename from figs/detail_control_decoupling_model_test.svg rename to figs/inkscape/detail_control_decoupling_model_test.svg diff --git a/figs/detail_control_decoupling_model_test_CoK.svg b/figs/inkscape/detail_control_decoupling_model_test_CoK.svg similarity index 99% rename from figs/detail_control_decoupling_model_test_CoK.svg rename to figs/inkscape/detail_control_decoupling_model_test_CoK.svg index 5fb5926..f558d69 100644 --- a/figs/detail_control_decoupling_model_test_CoK.svg +++ b/figs/inkscape/detail_control_decoupling_model_test_CoK.svg @@ -6,7 +6,7 @@ version="1.1" id="svg1203" inkscape:version="1.4.1 (93de688d07, 2025-03-30)" - sodipodi:docname="detail_control_model_test_CoK.svg" + sodipodi:docname="detail_control_decoupling_model_test_CoK.svg" inkscape:export-filename="/home/thomas/Cloud/thesis/matlab/svd-control/figs/gravimeter_model.png" inkscape:export-xdpi="252" inkscape:export-ydpi="252" @@ -26,16 +26,16 @@ inkscape:pageopacity="0.0" inkscape:pageshadow="2" inkscape:zoom="4" - inkscape:cx="71.125" + inkscape:cx="71" inkscape:cy="98.75" inkscape:document-units="mm" inkscape:current-layer="layer1" inkscape:document-rotation="0" showgrid="false" - inkscape:window-width="2534" - inkscape:window-height="1367" - inkscape:window-x="11" - inkscape:window-y="60" + inkscape:window-width="2560" + inkscape:window-height="1440" + inkscape:window-x="0" + inkscape:window-y="0" inkscape:window-maximized="1" inkscape:snap-midpoints="true" inkscape:showpageshadow="2" @@ -2217,6 +2217,16 @@ y="20.428562" inkscape:export-xdpi="252" inkscape:export-ydpi="252" /> + 1) = 360; + % Compute Phase Uncertainty + Dphi = 180/pi*asin(abs(squeeze(freqresp(W, freqs, 'Hz')))); + Dphi(abs(squeeze(freqresp(W, freqs, 'Hz'))) > 1) = 360; - % Compute Plant Phase - G_ang = 180/pi*angle(squeeze(freqresp(args.G, freqs, 'Hz'))); + % Compute Plant Phase + if args.unwrap + G_ang = 180/pi*unwrap(angle(squeeze(freqresp(args.G, freqs, 'Hz')))); + else + G_ang = 180/pi*angle(squeeze(freqresp(args.G, freqs, 'Hz'))); + end - p = patch([freqs flip(freqs)], [G_ang+Dphi; flip(G_ang-Dphi)], 'w', ... - 'DisplayName', args.DisplayName); + p = patch([freqs flip(freqs)], [G_ang+Dphi; flip(G_ang-Dphi)], 'w', ... + 'DisplayName', args.DisplayName); - if args.color_i == 0 - p.FaceColor = [0; 0; 0]; - else - p.FaceColor = colors(args.color_i, :); - end - p.EdgeColor = 'none'; - p.FaceAlpha = args.opacity; + if args.color_i == 0 + p.FaceColor = [0; 0; 0]; + else + p.FaceColor = colors(args.color_i, :); + end + p.EdgeColor = 'none'; + p.FaceAlpha = args.opacity; - end +end diff --git a/nass-control.org b/nass-control.org index c379b54..a568e0e 100644 --- a/nass-control.org +++ b/nass-control.org @@ -143,7 +143,7 @@ The output $\hat{x}$ is linked to the inputs by eqref:eq:detail_control_closed_l \hat{x} = \underbrace{\frac{1}{1 + L(s)}}_{S(s)} \hat{x}_1 + \underbrace{\frac{L(s)}{1 + L(s)}}_{T(s)} \hat{x}_2 \end{equation} -As for any classical feedback architecture, we have that the sum of the sensitivity trancfer function $S(s)$ and complementary sensitivity trancfer function $T_(s)$ is equal to one eqref:eq:detail_control_sensitivity_sum. +As for any classical feedback architecture, we have that the sum of the sensitivity transfer function $S(s)$ and complementary sensitivity transfer function $T_(s)$ is equal to one eqref:eq:detail_control_sensitivity_sum. \begin{equation}\label{eq:detail_control_sensitivity_sum} S(s) + T(s) = 1 @@ -209,7 +209,7 @@ The output of the synthesis is a filter $L(s)$ such that the "closed-loop" $\mat \left\| \begin{matrix} \frac{z}{w_1} \\ \frac{z}{w_2} \end{matrix} \right\|_\infty = \left\| \begin{matrix} \frac{1}{1 + L(s)} W_1(s) \\ \frac{L(s)}{1 + L(s)} W_2(s) \end{matrix} \right\|_\infty \le 1 \end{equation} -If the synthesis is succescful, the trancfer functions from $\hat{x}_1$ to $\hat{x}$ and from $\hat{x}_2$ to $\hat{x}$ have their magnitude bounded by the inverse magnitude of the corresponding weighting functions. +If the synthesis is succescful, the transfer functions from $\hat{x}_1$ to $\hat{x}$ and from $\hat{x}_2$ to $\hat{x}$ have their magnitude bounded by the inverse magnitude of the corresponding weighting functions. The sensor fusion can then be implemented using the feedback architecture in Figure ref:fig:detail_control_feedback_sensor_fusion_arch or more classically as shown in Figure ref:fig:detail_control_sensor_fusion_overview by defining the two complementary filters using eqref:eq:detail_control_comp_filters_feedback. The two architectures are equivalent regarding their inputs/outputs relationships. @@ -436,7 +436,7 @@ disp(J_CoM); M = diag([m, m, I]); K_struts = diag([k, k, k]); -% Trancform stiffness and damping to Cartesian space +% Transform stiffness and damping to Cartesian space K = J_CoM' * K_struts * J_CoM; disp('Mass Matrix (M):'); @@ -720,6 +720,42 @@ exportFig('figs/detail_control_svd_plant_spurious.pdf', 'width', 'wide', 'height #+RESULTS: [[file:figs/detail_control_svd_plant_spurious.png]] +*** Analytical formula for complementary filters +#+begin_src matlab +%% 1st order complementary filters +% Declaration of the symbolic variables +syms w0 Ts s z + +% Bilinear Transform +s = 2/Ts*(z - 1)/(z + 1); + +% First Order Low Pass Filter +Hl = 1/(1 + s/w0); + +% Get numerator and denominator +[N,D] = numden(Hl); + +% Extract coefficients (from z^0 to z^n) +num = coeffs(N, z); +den = coeffs(D, z); + +sprintf('Hl: num = (%s) + (%s) * z^-1', num(2), num(1)) +sprintf('Hl: den = (%s) + (%s) * z^-1', den(2), den(1)) + +% First Order Low Pass Filter +Hh = (s/w0)/(1 + s/w0); + +% Get numerator and denominator +[N,D] = numden(Hh); + +% Extract coefficients (from z^0 to z^n) +num = coeffs(N, z); +den = coeffs(D, z); + +sprintf('Hh: num = (%s) + (%s) * z^-1', num(2), num(1)) +sprintf('Hh: den = (%s) + (%s) * z^-1', den(2), den(1)) +#+end_src + ** DONE [#A] Fix the outline CLOSED: [2025-04-03 Thu 12:01] @@ -809,6 +845,12 @@ Or html version: https://research.tdehaeze.xyz/stewart-simscape/docs/bibliograph When controlling a MIMO system (specifically parallel manipulator such as the Stewart platform?) +- [ ] *Should the quick review of Stewart platform control be here?* + In that case it should be possible to highlight three areas: + - use of multiple sensors + - decoupling strategy + - control optimization + Several considerations: - Section ref:sec:detail_control_sensor: How to most effectively use/combine multiple sensors - Section ref:sec:detail_control_decoupling: How to decouple a system @@ -1035,7 +1077,7 @@ For sensor fusion applications, both methods are sharing many relationships [[ci However, for Kalman filtering, assumptions must be made about the probabilistic character of the sensor noises [[cite:&robert12_introd_random_signal_applied_kalman]] whereas it is not the case with complementary filters. Furthermore, the advantages of complementary filters over Kalman filtering for sensor fusion are their general applicability, their low computational cost [[cite:&higgins75_compar_compl_kalman_filter]], and the fact that they are intuitive as their effects can be easily interpreted in the frequency domain. -A set of filters is said to be complementary if the sum of their trancfer functions is equal to one at all frequencies. +A set of filters is said to be complementary if the sum of their transfer functions is equal to one at all frequencies. In the early days of complementary filtering, analog circuits were employed to physically realize the filters [[cite:&anderson53_instr_approac_system_steer_comput]]. Analog complementary filters are still used today [[cite:&yong16_high_speed_vertic_posit_stage;&moore19_capac_instr_sensor_fusion_high_bandw_nanop]], but most of the time they are now implemented digitally as it allows for much more flexibility. @@ -1139,7 +1181,7 @@ This means that the super sensor provides an estimate $\hat{x}$ of $x$ which can #+RESULTS: [[file:figs/detail_control_sensor_fusion_overview.png]] -The complementary property of filters $H_1(s)$ and $H_2(s)$ implies that the sum of their trancfer functions is equal to one eqref:eq:detail_control_sensor_comp_filter. +The complementary property of filters $H_1(s)$ and $H_2(s)$ implies that the sum of their transfer functions is equal to one eqref:eq:detail_control_sensor_comp_filter. That is, unity magnitude and zero phase at all frequencies. \begin{equation}\label{eq:detail_control_sensor_comp_filter} @@ -1156,7 +1198,7 @@ Before filtering the sensor outputs $\tilde{x}_i$ by the complementary filters, This normalization consists of using an estimate $\hat{G}_i(s)$ of the sensor dynamics $G_i(s)$, and filtering the sensor output by the inverse of this estimate $\hat{G}_i^{-1}(s)$ as shown in Figure ref:fig:detail_control_sensor_model_calibrated. It is here supposed that the sensor inverse $\hat{G}_i^{-1}(s)$ is proper and stable. This way, the units of the estimates $\hat{x}_i$ are equal to the units of the physical quantity $x$. -The sensor dynamics estimate $\hat{G}_i(s)$ can be a simple gain or a more complex trancfer function. +The sensor dynamics estimate $\hat{G}_i(s)$ can be a simple gain or a more complex transfer function. #+begin_src latex :file detail_control_sensor_model.pdf \tikzset{block/.default={0.8cm}{0.8cm}} @@ -1207,7 +1249,7 @@ The sensor dynamics estimate $\hat{G}_i(s)$ can be a simple gain or a more compl #+caption: Sensor models with and without normalization. #+attr_latex: :options [htbp] #+begin_figure -#+attr_latex: :caption \subcaption{\label{fig:detail_control_sensor_model}Basic sensor model consisting of a noise input $n_i$ and a linear time invariant trancfer function $G_i(s)$} +#+attr_latex: :caption \subcaption{\label{fig:detail_control_sensor_model}Basic sensor model consisting of a noise input $n_i$ and a linear time invariant transfer function $G_i(s)$} #+attr_latex: :options {0.48\textwidth} #+begin_subfigure #+attr_latex: :scale 1 @@ -1325,7 +1367,7 @@ Hence, by properly shaping the norm of the complementary filters, it is possible In practical systems the sensor normalization is not perfect and condition eqref:eq:detail_control_sensor_perfect_dynamics is not verified. In order to study such imperfection, a multiplicative input uncertainty is added to the sensor dynamics (Figure ref:fig:detail_control_sensor_model_uncertainty). -The nominal model is the estimated model used for the normalization $\hat{G}_i(s)$, $\Delta_i(s)$ is any stable trancfer function saticfying $|\Delta_i(j\omega)| \le 1,\ \forall\omega$, and $w_i(s)$ is a weighting trancfer function representing the magnitude of the uncertainty. +The nominal model is the estimated model used for the normalization $\hat{G}_i(s)$, $\Delta_i(s)$ is any stable transfer function satisfying $|\Delta_i(j\omega)| \le 1,\ \forall\omega$, and $w_i(s)$ is a weighting transfer function representing the magnitude of the uncertainty. The weight $w_i(s)$ is chosen such that the real sensor dynamics $G_i(j\omega)$ is contained in the uncertain region represented by a circle in the complex plane, centered on $1$ and with a radius equal to $|w_i(j\omega)|$. As the nominal sensor dynamics is taken as the normalized filter, the normalized sensor can be further simplified as shown in Figure ref:fig:detail_control_sensor_model_uncertainty_simplified. @@ -1551,8 +1593,8 @@ Finally, the synthesis method is validated on an simple example. **** Synthesis Objective The synthesis objective is to shape the norm of two filters $H_1(s)$ and $H_2(s)$ while ensuring their complementary property eqref:eq:detail_control_sensor_comp_filter. -This is equivalent as to finding proper and stable trancfer functions $H_1(s)$ and $H_2(s)$ such that conditions eqref:eq:detail_control_sensor_hinf_cond_complementarity, eqref:eq:detail_control_sensor_hinf_cond_h1 and eqref:eq:detail_control_sensor_hinf_cond_h2 are saticfied. -$W_1(s)$ and $W_2(s)$ are two weighting trancfer functions that are carefully chosen to specify the maximum wanted norm of the complementary filters during the synthesis. +This is equivalent as to finding proper and stable transfer functions $H_1(s)$ and $H_2(s)$ such that conditions eqref:eq:detail_control_sensor_hinf_cond_complementarity, eqref:eq:detail_control_sensor_hinf_cond_h1 and eqref:eq:detail_control_sensor_hinf_cond_h2 are satisfied. +$W_1(s)$ and $W_2(s)$ are two weighting transfer functions that are carefully chosen to specify the maximum wanted norm of the complementary filters during the synthesis. \begin{subequations}\label{eq:detail_control_sensor_comp_filter_problem_form} \begin{align} @@ -1657,7 +1699,7 @@ Applying the standard $\mathcal{H}_\infty$ synthesis to the generalized plant $P \left\|\begin{matrix} \left(1 - H_2(s)\right) W_1(s) \\ H_2(s) W_2(s) \end{matrix}\right\|_\infty \le 1 \end{equation} -By then defining $H_1(s)$ to be the complementary of $H_2(s)$ eqref:eq:detail_control_sensor_definition_H1, the $\mathcal{H}_\infty$ synthesis objective becomes equivalent to eqref:eq:detail_control_sensor_hinf_problem which ensures that eqref:eq:detail_control_sensor_hinf_cond_h1 and eqref:eq:detail_control_sensor_hinf_cond_h2 are saticfied. +By then defining $H_1(s)$ to be the complementary of $H_2(s)$ eqref:eq:detail_control_sensor_definition_H1, the $\mathcal{H}_\infty$ synthesis objective becomes equivalent to eqref:eq:detail_control_sensor_hinf_problem which ensures that eqref:eq:detail_control_sensor_hinf_cond_h1 and eqref:eq:detail_control_sensor_hinf_cond_h2 are satisfied. \begin{equation}\label{eq:detail_control_sensor_definition_H1} H_1(s) \triangleq 1 - H_2(s) @@ -1677,7 +1719,7 @@ Hence, the optimization may be a little bit conservative with respect to the set Weighting functions are used during the synthesis to specify the maximum allowed complementary filters' norm. The proper design of these weighting functions is of primary importance for the success of the presented $\mathcal{H}_\infty$ synthesis of complementary filters. -First, only proper and stable trancfer functions should be used. +First, only proper and stable transfer functions should be used. Second, the order of the weighting functions should stay reasonably small in order to reduce the computational costs associated with the solving of the optimization problem and for the physical implementation of the filters (the synthesized filters' order being equal to the sum of the weighting functions' order). Third, one should not forget the fundamental limitations imposed by the complementary property eqref:eq:detail_control_sensor_comp_filter. This implies for instance that $|H_1(j\omega)|$ and $|H_2(j\omega)|$ cannot be made small at the same frequency. @@ -1831,7 +1873,7 @@ exportFig('figs/detail_control_sensor_hinf_filters_results.pdf', 'width', 'half' #+end_minipage The standard $\mathcal{H}_\infty$ synthesis is then applied to the generalized plant of Figure ref:fig:detail_control_sensor_h_infinity_robust_fusion_plant. -The filter $H_2(s)$ that minimizes the $\mathcal{H}_\infty$ norm between $w$ and $[z_1,\ z_2]^T$ is obtained. +The filter $H_2(s)$ that minimizes the $\mathcal{H}_\infty$ norm between $w$ and $[z_1,\ z_2]^{\intercal}$ is obtained. The $\mathcal{H}_\infty$ norm is here found to be close to one which indicates that the synthesis is succescful: the complementary filters norms are below the maximum specified upper bounds. This is confirmed by the bode plots of the obtained complementary filters in Figure ref:fig:detail_control_sensor_hinf_filters_results. This simple example illustrates the fact that the proposed methodology for complementary filters shaping is easy to use and effective. @@ -1944,7 +1986,7 @@ A generalization of the proposed synthesis method of complementary filters is pr #+end_subfigure #+end_figure -The synthesis objective is to compute a set of $n$ stable trancfer functions $[H_1(s),\ H_2(s),\ \dots,\ H_n(s)]$ such that conditions eqref:eq:detail_control_sensor_hinf_cond_compl_gen and eqref:eq:detail_control_sensor_hinf_cond_perf_gen are saticfied. +The synthesis objective is to compute a set of $n$ stable transfer functions $[H_1(s),\ H_2(s),\ \dots,\ H_n(s)]$ such that conditions eqref:eq:detail_control_sensor_hinf_cond_compl_gen and eqref:eq:detail_control_sensor_hinf_cond_perf_gen are satisfied. \begin{subequations}\label{eq:detail_control_sensor_hinf_problem_gen} \begin{align} @@ -1953,7 +1995,7 @@ The synthesis objective is to compute a set of $n$ stable trancfer functions $[H \end{align} \end{subequations} -$[W_1(s),\ W_2(s),\ \dots,\ W_n(s)]$ are weighting trancfer functions that are chosen to specify the maximum complementary filters' norm during the synthesis. +$[W_1(s),\ W_2(s),\ \dots,\ W_n(s)]$ are weighting transfer functions that are chosen to specify the maximum complementary filters' norm during the synthesis. Such synthesis objective is closely related to the one described in Section ref:ssec:detail_control_sensor_hinf_method, and indeed the proposed synthesis method is a generalization of the one previously presented. A set of $n$ complementary filters can be shaped by applying the standard $\mathcal{H}_\infty$ synthesis to the generalized plant $P_n(s)$ described by eqref:eq:detail_control_sensor_generalized_plant_n_filters. @@ -1977,7 +2019,7 @@ If the synthesis if succescful, a set of $n-1$ filters $[H_2(s),\ H_3(s),\ \dots \end{equation} $H_1(s)$ is then defined using eqref:eq:detail_control_sensor_h1_comp_h2_hn which is ensuring the complementary property for the set of $n$ filters eqref:eq:detail_control_sensor_hinf_cond_compl_gen. -Condition eqref:eq:detail_control_sensor_hinf_cond_perf_gen is saticfied thanks to eqref:eq:detail_control_sensor_hinf_syn_obj_gen. +Condition eqref:eq:detail_control_sensor_hinf_cond_perf_gen is satisfied thanks to eqref:eq:detail_control_sensor_hinf_syn_obj_gen. \begin{equation}\label{eq:detail_control_sensor_h1_comp_h2_hn} H_1(s) \triangleq 1 - \big[ H_2(s) + H_3(s) + \dots + H_n(s) \big] @@ -2097,7 +2139,7 @@ Consider the generalized plant $P_3(s)$ shown in Figure ref:fig:detail_control_s #+end_figure The standard $\mathcal{H}_\infty$ synthesis is performed on the generalized plant $P_3(s)$. -Two filters $H_2(s)$ and $H_3(s)$ are obtained such that the $\mathcal{H}_\infty$ norm of the closed-loop trancfer from $w$ to $[z_1,\ z_2,\ z_3]$ of the system in Figure ref:fig:detail_control_sensor_comp_filter_three_hinf_fb is less than one. +Two filters $H_2(s)$ and $H_3(s)$ are obtained such that the $\mathcal{H}_\infty$ norm of the closed-loop transfer from $w$ to $[z_1,\ z_2,\ z_3]$ of the system in Figure ref:fig:detail_control_sensor_comp_filter_three_hinf_fb is less than one. Filter $H_1(s)$ is defined using eqref:eq:detail_control_sensor_h1_compl_h2_h3 thus ensuring the complementary property of the obtained set of filters. \begin{equation}\label{eq:detail_control_sensor_h1_compl_h2_h3} @@ -2194,7 +2236,7 @@ Experimental closed-loop control results using the hexapod have shown that contr - [X] Review of [[file:~/Cloud/work-projects/ID31-NASS/matlab/stewart-simscape/org/bibliography.org::*Decoupling Strategies][Decoupling Strategies]] for stewart platforms - [ ] Add some citations about different methods -- [ ] Maybe trancform table into text +- [ ] Maybe transform table into text #+name: tab:detail_control_decoupling_review #+caption: Litterature review about decoupling strategy for Stewart platform control @@ -2318,7 +2360,7 @@ In order to map the spring, damping and actuator forces to XY forces and Z torqu Then, the equation of motion linking the actuator forces $\tau$ to the motion of the mass $\bm{\mathcal{X}}_{\{M\}}$ is obtained. \begin{equation}\label{eq:detail_control_decoupling_plant_cartesian} - \bm{M}_{\{M\}} \ddot{\bm{\mathcal{X}}}_{\{M\}}(t) + \bm{J}_{\{M\}}^t \bm{\mathcal{C}} \bm{J}_{\{M\}} \dot{\bm{\mathcal{X}}}_{\{M\}}(t) + \bm{J}_{\{M\}}^t \bm{\mathcal{K}} \bm{J}_{\{M\}} \bm{\mathcal{X}}_{\{M\}}(t) = \bm{J}_{\{M\}}^t \bm{\tau}(t) + \bm{M}_{\{M\}} \ddot{\bm{\mathcal{X}}}_{\{M\}}(t) + \bm{J}_{\{M\}}^{\intercal} \bm{\mathcal{C}} \bm{J}_{\{M\}} \dot{\bm{\mathcal{X}}}_{\{M\}}(t) + \bm{J}_{\{M\}}^{\intercal} \bm{\mathcal{K}} \bm{J}_{\{M\}} \bm{\mathcal{X}}_{\{M\}}(t) = \bm{J}_{\{M\}}^{\intercal} \bm{\tau}(t) \end{equation} Matrices representing the payload inertia as well as the actuator stiffness and damping are shown in @@ -2362,7 +2404,7 @@ Parameters used for the following analysis are summarized in table ref:tab:detai Let's first study the obtained dynamics in the frame of the struts. The equation of motion linking actuator forces $\bm{\mathcal{\tau}}$ to strut relative motion $\bm{\mathcal{L}}$ is obtained from eqref:eq:detail_control_decoupling_plant_cartesian by mapping the cartesian motion of the mass to the relative motion of the struts using the Jacobian matrix $\bm{J}_{\{M\}}$ eqref:eq:detail_control_decoupling_jacobian_CoM . -The trancfer function from $\bm{\mathcal{\tau}}$ to $\bm{\mathcal{L}}$ is shown in equation eqref:eq:detail_control_decoupling_plant_decentralized. +The transfer function from $\bm{\mathcal{\tau}}$ to $\bm{\mathcal{L}}$ is shown in equation eqref:eq:detail_control_decoupling_plant_decentralized. #+begin_src latex :file detail_control_decoupling_control_struts.pdf \begin{tikzpicture} @@ -2378,7 +2420,7 @@ The trancfer function from $\bm{\mathcal{\tau}}$ to $\bm{\mathcal{L}}$ is shown [[file:figs/detail_control_decoupling_control_struts.png]] \begin{equation}\label{eq:detail_control_decoupling_plant_decentralized} - \frac{\bm{\mathcal{L}}}{\bm{\mathcal{\tau}}}(s) = \bm{G}_{\mathcal{L}}(s) = \left( \bm{J}_{\{M\}}^{-t} \bm{M}_{\{M\}} \bm{J}_{\{M\}}^{-1} s^2 + \bm{\mathcal{C}} s + \bm{\mathcal{K}} \right)^{-1} + \frac{\bm{\mathcal{L}}}{\bm{\mathcal{\tau}}}(s) = \bm{G}_{\mathcal{L}}(s) = \left( \bm{J}_{\{M\}}^{-\intercal} \bm{M}_{\{M\}} \bm{J}_{\{M\}}^{-1} s^2 + \bm{\mathcal{C}} s + \bm{\mathcal{K}} \right)^{-1} \end{equation} At low frequency the plant converges to a diagonal constant matrix whose diagonal elements are linked to the actuator stiffnesses eqref:eq:detail_control_decoupling_plant_decentralized_low_freq. @@ -2484,7 +2526,7 @@ As already explained, the Jacobian matrix can be used to both convert strut velo \begin{subequations}\label{eq:detail_control_decoupling_jacobian} \begin{align} \dot{\bm{\mathcal{X}}}_{\{O\}} &= \bm{J}_{\{O\}} \dot{\bm{\mathcal{L}}}, \quad \dot{\bm{\mathcal{L}}} = \bm{J}_{\{O\}}^{-1} \dot{\bm{\mathcal{X}}}_{\{O\}} \\ - \bm{\mathcal{F}}_{\{O\}} &= \bm{J}_{\{O\}}^t \bm{\tau}, \quad \bm{\tau} = \bm{J}_{\{O\}}^{-t} \bm{\mathcal{F}}_{\{O\}} + \bm{\mathcal{F}}_{\{O\}} &= \bm{J}_{\{O\}}^{\intercal} \bm{\tau}, \quad \bm{\tau} = \bm{J}_{\{O\}}^{-\intercal} \bm{\mathcal{F}}_{\{O\}} \end{align} \end{subequations} @@ -2495,7 +2537,7 @@ The obtained plan (Figure ref:fig:detail_control_jacobian_decoupling_arch) has i #+begin_src latex :file detail_control_decoupling_control_jacobian.pdf \begin{tikzpicture} \node[block] (G) {$\bm{G}_{\{\mathcal{L}\}}$}; - \node[block, left=0.6 of G] (Jt) {$\bm{J}_{\{O\}}^{-T}$}; + \node[block, left=0.6 of G] (Jt) {$\bm{J}_{\{O\}}^{-\intercal}$}; \node[block, right=0.6 of G] (Ja) {$\bm{J}_{\{O\}}^{-1}$}; % Connections and labels @@ -2512,12 +2554,12 @@ The obtained plan (Figure ref:fig:detail_control_jacobian_decoupling_arch) has i #+end_src #+name: fig:detail_control_jacobian_decoupling_arch -#+caption: Block diagram of the trancfer function from $\bm{\mathcal{F}}_{\{O\}}$ to $\bm{\mathcal{X}}_{\{O\}}$ +#+caption: Block diagram of the transfer function from $\bm{\mathcal{F}}_{\{O\}}$ to $\bm{\mathcal{X}}_{\{O\}}$ #+RESULTS: [[file:figs/detail_control_decoupling_control_jacobian.png]] \begin{equation}\label{eq:detail_control_decoupling_plant_jacobian} - \frac{\bm{\mathcal{X}}_{\{O\}}}{\bm{\mathcal{F}}_{\{O\}}}(s) = \bm{G}_{\{O\}}(s) = \left( \bm{J}_{\{O\}}^t \bm{J}_{\{M\}}^{-T} \bm{M}_{\{M\}} \bm{J}_{\{M\}}^{-1} \bm{J}_{\{O\}} s^2 + \bm{J}_{\{O\}}^t \bm{\mathcal{C}} \bm{J}_{\{O\}} s + \bm{J}_{\{O\}}^t \bm{\mathcal{K}} \bm{J}_{\{O\}} \right)^{-1} + \frac{\bm{\mathcal{X}}_{\{O\}}}{\bm{\mathcal{F}}_{\{O\}}}(s) = \bm{G}_{\{O\}}(s) = \left( \bm{J}_{\{O\}}^{\intercal} \bm{J}_{\{M\}}^{-\intercal} \bm{M}_{\{M\}} \bm{J}_{\{M\}}^{-1} \bm{J}_{\{O\}} s^2 + \bm{J}_{\{O\}}^{\intercal} \bm{\mathcal{C}} \bm{J}_{\{O\}} s + \bm{J}_{\{O\}}^{\intercal} \bm{\mathcal{K}} \bm{J}_{\{O\}} \right)^{-1} \end{equation} The frame $\{O\}$ can be any chosen frame, but the decoupling properties depends on the chosen frame $\{O\}$. @@ -2544,7 +2586,7 @@ The Jacobian matrix and its inverse are expressed in eqref:eq:detail_control_dec #+begin_src latex :file detail_control_decoupling_control_jacobian_CoM.pdf \begin{tikzpicture} \node[block] (G) {$\bm{G}_{\{\mathcal{L}\}}$}; - \node[block, left=0.6 of G] (Jt) {$\bm{J}_{\{M\}}^{-T}$}; + \node[block, left=0.6 of G] (Jt) {$\bm{J}_{\{M\}}^{-\intercal}$}; \node[block, right=0.6 of G] (Ja) {$\bm{J}_{\{M\}}^{-1}$}; % Connections and labels @@ -2561,12 +2603,13 @@ The Jacobian matrix and its inverse are expressed in eqref:eq:detail_control_dec #+end_src #+RESULTS: +[[file:figs/detail_control_decoupling_control_jacobian_CoM.png]] # [[file:figs/detail_control_decoupling_control_jacobian_CoM.png]] Analytical formula of the plant is eqref:eq:detail_control_decoupling_plant_CoM. \begin{equation}\label{eq:detail_control_decoupling_plant_CoM} - \frac{\bm{\mathcal{X}}_{\{M\}}}{\bm{\mathcal{F}}_{\{M\}}}(s) = \bm{G}_{\{M\}}(s) = \left( \bm{M}_{\{M\}} s^2 + \bm{J}_{\{M\}}^t \bm{\mathcal{C}} \bm{J}_{\{M\}} s + \bm{J}_{\{M\}}^t \bm{\mathcal{K}} \bm{J}_{\{M\}} \right)^{-1} + \frac{\bm{\mathcal{X}}_{\{M\}}}{\bm{\mathcal{F}}_{\{M\}}}(s) = \bm{G}_{\{M\}}(s) = \left( \bm{M}_{\{M\}} s^2 + \bm{J}_{\{M\}}^{\intercal} \bm{\mathcal{C}} \bm{J}_{\{M\}} s + \bm{J}_{\{M\}}^{\intercal} \bm{\mathcal{K}} \bm{J}_{\{M\}} \right)^{-1} \end{equation} At high frequency, converges towards the inverse of the mass matrix, which is a diagonal matrix eqref:eq:detail_control_decoupling_plant_CoM_high_freq. @@ -2640,7 +2683,7 @@ exportFig('figs/detail_control_decoupling_jacobian_plant_CoM.pdf', 'width', 'hal #+begin_src latex :file detail_control_decoupling_control_jacobian_CoK.pdf \begin{tikzpicture} \node[block] (G) {$\bm{G}_{\{\mathcal{L}\}}$}; - \node[block, left=0.6 of G] (Jt) {$\bm{J}_{\{K\}}^{-T}$}; + \node[block, left=0.6 of G] (Jt) {$\bm{J}_{\{K\}}^{-\intercal}$}; \node[block, right=0.6 of G] (Ja) {$\bm{J}_{\{K\}}^{-1}$}; % Connections and labels @@ -2657,6 +2700,7 @@ exportFig('figs/detail_control_decoupling_jacobian_plant_CoM.pdf', 'width', 'hal #+end_src #+RESULTS: +[[file:figs/detail_control_decoupling_control_jacobian_CoK.png]] # [[file:figs/detail_control_decoupling_control_jacobian_CoK.png]] \begin{equation} @@ -2671,18 +2715,18 @@ exportFig('figs/detail_control_decoupling_jacobian_plant_CoM.pdf', 'width', 'hal \end{bmatrix} \end{equation} -Frame $\{K\}$ is chosen such that $\bm{J}_{\{K\}}^t \bm{\mathcal{K}} \bm{J}_{\{K\}}$ is diagonal. +Frame $\{K\}$ is chosen such that $\bm{J}_{\{K\}}^{\intercal} \bm{\mathcal{K}} \bm{J}_{\{K\}}$ is diagonal. Typically, it can me made based on physical reasoning as is the case here. \begin{equation}\label{eq:detail_control_decoupling_plant_CoK} - \frac{\bm{\mathcal{X}}_{\{K\}}}{\bm{\mathcal{F}}_{\{K\}}}(s) = \bm{G}_{\{K\}}(s) = \left( \bm{J}_{\{K\}}^t \bm{J}_{\{M\}}^{-T} \bm{M}_{\{M\}} \bm{J}_{\{M\}}^{-1} \bm{J}_{\{K\}} s^2 + \bm{J}_{\{K\}}^t \bm{\mathcal{C}} \bm{J}_{\{K\}} s + \bm{J}_{\{K\}}^t \bm{\mathcal{K}} \bm{J}_{\{K\}} \right)^{-1} + \frac{\bm{\mathcal{X}}_{\{K\}}}{\bm{\mathcal{F}}_{\{K\}}}(s) = \bm{G}_{\{K\}}(s) = \left( \bm{J}_{\{K\}}^{\intercal} \bm{J}_{\{M\}}^{-\intercal} \bm{M}_{\{M\}} \bm{J}_{\{M\}}^{-1} \bm{J}_{\{K\}} s^2 + \bm{J}_{\{K\}}^{\intercal} \bm{\mathcal{C}} \bm{J}_{\{K\}} s + \bm{J}_{\{K\}}^{\intercal} \bm{\mathcal{K}} \bm{J}_{\{K\}} \right)^{-1} \end{equation} Plant is well decoupled below the suspension mode with the lowest frequency. This is usually suited for systems which high stiffness. \begin{equation} - \bm{G}_{\{K\}}(j\omega) \xrightarrow[\omega \to 0]{} \bm{J}_{\{K\}}^{-1} \bm{\mathcal{K}}^{-1} \bm{J}_{\{K\}}^{-t} + \bm{G}_{\{K\}}(j\omega) \xrightarrow[\omega \to 0]{} \bm{J}_{\{K\}}^{-1} \bm{\mathcal{K}}^{-1} \bm{J}_{\{K\}}^{-\intercal} \end{equation} @@ -2763,7 +2807,7 @@ The physical interpretation of the above two equations is that any motion of the [[cite:&pu11_six_degree_of_freed_activ]] \begin{equation}\label{eq:detail_control_decoupling_equation_motion_CoM} - \bm{M}_{\{M\}} \ddot{\bm{\mathcal{X}}}_{\{M\}}(t) + \bm{C}_{\{M\}} \dot{\bm{\mathcal{X}}}_{\{M\}}(t) + \bm{K}_{\{M\}} \bm{\mathcal{X}}_{\{M\}}(t) = \bm{J}_{\{M\}}^t \bm{\tau}(t) + \bm{M}_{\{M\}} \ddot{\bm{\mathcal{X}}}_{\{M\}}(t) + \bm{C}_{\{M\}} \dot{\bm{\mathcal{X}}}_{\{M\}}(t) + \bm{K}_{\{M\}} \bm{\mathcal{X}}_{\{M\}}(t) = \bm{J}_{\{M\}}^{\intercal} \bm{\tau}(t) \end{equation} Let's make a change of variables: @@ -2774,10 +2818,10 @@ with: - $\bm{\mathcal{X}}_{m}$ the modal amplitudes - $\bm{\Phi}$ a matrix whose columns are the modes shapes of the system which can be computed from $\bm{M}_{\{M\}}$ and $\bm{K}_{\{M\}}$. -By pre-multiplying the equation of motion eqref:eq:detail_control_decoupling_equation_motion_CoM by $\bm{\Phi}^t$ and using the change of variable eqref:eq:detail_control_decoupling_modal_coordinates, a new set of equation of motion are obtained +By pre-multiplying the equation of motion eqref:eq:detail_control_decoupling_equation_motion_CoM by $\bm{\Phi}^{\intercal}$ and using the change of variable eqref:eq:detail_control_decoupling_modal_coordinates, a new set of equation of motion are obtained \begin{equation}\label{eq:detail_control_decoupling_equation_modal_coordinates} - \underbrace{\bm{\Phi}^t \bm{M} \bm{\Phi}}_{\bm{M}_m} \bm{\ddot{\mathcal{X}}}_m(t) + \underbrace{\bm{\Phi}^t \bm{C} \bm{\Phi}}_{\bm{C}_m} \bm{\dot{\mathcal{X}}}_m(t) + \underbrace{\bm{\Phi}^t \bm{K} \bm{\Phi}}_{\bm{K}_m} \bm{\mathcal{X}}_m(t) = \underbrace{\bm{\Phi}^t \bm{J}^t \bm{\tau}(t)}_{\bm{\tau}_m(t)} + \underbrace{\bm{\Phi}^{\intercal} \bm{M} \bm{\Phi}}_{\bm{M}_m} \bm{\ddot{\mathcal{X}}}_m(t) + \underbrace{\bm{\Phi}^{\intercal} \bm{C} \bm{\Phi}}_{\bm{C}_m} \bm{\dot{\mathcal{X}}}_m(t) + \underbrace{\bm{\Phi}^{\intercal} \bm{K} \bm{\Phi}}_{\bm{K}_m} \bm{\mathcal{X}}_m(t) = \underbrace{\bm{\Phi}^{\intercal} \bm{J}^{\intercal} \bm{\tau}(t)}_{\bm{\tau}_m(t)} \end{equation} - $\bm{\tau}_m$ is the modal input @@ -2793,8 +2837,8 @@ The dynamics from modal inputs $\bm{\tau}_m$ to modal amplitudes $\bm{\mathcal{X #+begin_src latex :file detail_control_decoupling_modal.pdf \begin{tikzpicture} \node[block] (G) {$\bm{G}_{\{\mathcal{L}\}}$}; - \node[block, left=0.6 of G] (Jt) {$\bm{J}_{\{M\}}^{-t}$}; - \node[block, left=1.2 of Jt] (Bm) {$\bm{\Phi}^{-t}$}; + \node[block, left=0.6 of G] (Jt) {$\bm{J}_{\{M\}}^{-\intercal}$}; + \node[block, left=1.2 of Jt] (Bm) {$\bm{\Phi}^{-\intercal}$}; \node[block, right=0.6 of G] (J) {$\bm{J}_{\{M\}}^{-1}$}; \node[block, right=1.2 of J] (Cm) {$\bm{\Phi}^{-1}$}; @@ -2878,7 +2922,7 @@ Eigenvectors are arranged for increasing eigenvalues (i.e. resonance frequencies \end{bmatrix} \end{equation} -- [ ] Formula for the plant trancfer function +- [ ] Formula for the plant transfer function #+begin_src matlab %% Modal decoupling @@ -2968,18 +3012,18 @@ Compute a real approximation of the system's response at that frequency. [[cite:&kouvaritakis79_theor_pract_charac_locus_desig_method]]: real matrix that preserves the most orthogonality in directions with the input complex matrix Then, a real matrix $\tilde{\bm{G}}(\omega_c)$ is obtained, and the SVD is performed on this real matrix. -Unitary $\bm{U}$ and $\bm{V}$ matrices are then obtained such that $\bm{V}^{-t} \tilde{\bm{G}}(\omega_c) \bm{U}^{-1}$ is diagonal. +Unitary $\bm{U}$ and $\bm{V}$ matrices are then obtained such that $\bm{V}^{-\intercal} \tilde{\bm{G}}(\omega_c) \bm{U}^{-1}$ is diagonal. Use the singular input and output matrices to decouple the system as shown in Figure ref:fig:detail_control_decoupling_svd \begin{equation} - G_{\text{SVD}}(s) = \bm{U}^{-1} \bm{G}_{\{\mathcal{L}\}}(s) \bm{V}^{-T} + G_{\text{SVD}}(s) = \bm{U}^{-1} \bm{G}_{\{\mathcal{L}\}}(s) \bm{V}^{-\intercal} \end{equation} #+begin_src latex :file detail_control_decoupling_svd.pdf \begin{tikzpicture} \node[block] (G) {$\bm{G}_{\{\mathcal{L}\}}$}; - \node[block, left=0.6 of G.west] (V) {$\bm{V}^{-t}$}; + \node[block, left=0.6 of G.west] (V) {$\bm{V}^{-\intercal}$}; \node[block, right=0.6 of G.east] (U) {$\bm{U}^{-1}$}; % Connections and labels @@ -3043,7 +3087,7 @@ The inputs and outputs are ordered from higher gain to lower gain at the chosen Once the $\bm{U}$ and $\bm{V}$ matrices are obtained, the decoupled plant can be computed using eqref:eq:detail_control_decoupling_plant_svd. \begin{equation}\label{eq:detail_control_decoupling_plant_svd} - \bm{G}_{\text{SVD}}(s) = \bm{U}^{-1} \bm{G}_{\{\mathcal{L}\}}(s) \bm{V}^{-t} + \bm{G}_{\text{SVD}}(s) = \bm{U}^{-1} \bm{G}_{\{\mathcal{L}\}}(s) \bm{V}^{-\intercal} \end{equation} The obtained plant shown in Figure ref:fig:detail_control_decoupling_svd_plant is very well decoupled. and not only around $\omega_c$. @@ -3230,7 +3274,7 @@ However, each method is quite different in terms of approach, and have different Decoupling is expected to be good near the frequency chosen for computing the decoupling matrices, but may depend on how good the real approximation of the plant is for that particular frequency. Whether the decoupling quality can be guaranteed away from the chosen frequency is unknown. - +- "Frame" of the controllers: important to be able to tuned the controllers linked to performance metrics # Maybe not necessary There are other aspects that were not treated here such as: @@ -3248,9 +3292,9 @@ There are other aspects that were not treated here such as: |-----------------------+----------------------------------------------------------------------------------------+-----------------------------------------------------------------------+------------------------------------------------------------------| | *Decoupling Matrices* | Decoupling using $\bm{J}_{\{O\}}$ obtained from geometry | Decoupling using $\bm{\Phi}$ obtained from modal decomposition | Decoupling using $\bm{U}$ and $\bm{V}$ obtained from SVD | |-----------------------+----------------------------------------------------------------------------------------+-----------------------------------------------------------------------+------------------------------------------------------------------| -| *Decoupled Plant* | $\bm{G}_{\{O\}}(s) = \bm{J}_{\{O\}}^{-1} \bm{G}_{\mathcal{L}}(s) \bm{J}_{\{O\}}^{-T}$ | $\bm{G}_m(s) = \bm{\Phi}^{-1} \bm{G}_{\mathcal{X}}(s) \bm{\Phi}^{-t}$ | $\bm{G}_{\text{SVD}}(s) = \bm{U}^{-1} \bm{G}(s) \bm{V}^{-T}$ | +| *Decoupled Plant* | $\bm{G}_{\{O\}}(s) = \bm{J}_{\{O\}}^{-1} \bm{G}_{\mathcal{L}}(s) \bm{J}_{\{O\}}^{-\intercal}$ | $\bm{G}_m(s) = \bm{\Phi}^{-1} \bm{G}_{\mathcal{X}}(s) \bm{\Phi}^{-\intercal}$ | $\bm{G}_{\text{SVD}}(s) = \bm{U}^{-1} \bm{G}(s) \bm{V}^{-\intercal}$ | |-----------------------+----------------------------------------------------------------------------------------+-----------------------------------------------------------------------+------------------------------------------------------------------| -| *Controller* | $\bm{K}_{\{O\}}(s) = \bm{J}_{\{O\}}^{-T} \bm{K}_{d}(s) \bm{J}_{\{O\}}^{-1}$ | $\bm{K}_m(s) = \bm{\Phi}^{-t} \bm{K}_{d}(s) \bm{\Phi}^{-1}$ | $\bm{K}_{\text{SVD}}(s) = \bm{V}^{-T} \bm{K}_{d}(s) \bm{U}^{-1}$ | +| *Controller* | $\bm{K}_{\{O\}}(s) = \bm{J}_{\{O\}}^{-\intercal} \bm{K}_{d}(s) \bm{J}_{\{O\}}^{-1}$ | $\bm{K}_m(s) = \bm{\Phi}^{-\intercal} \bm{K}_{d}(s) \bm{\Phi}^{-1}$ | $\bm{K}_{\text{SVD}}(s) = \bm{V}^{-\intercal} \bm{K}_{d}(s) \bm{U}^{-1}$ | |-----------------------+----------------------------------------------------------------------------------------+-----------------------------------------------------------------------+------------------------------------------------------------------| | *Interpretation* | Forces/Torques to Displacement/Rotation in chosen frame | Inputs to excite individual modes | Directions of max to min controllability/observability | | | | Output to sense individual modes | | @@ -3286,50 +3330,51 @@ Conclusion about NASS: ** Introduction :ignore: -Performance of a feedback control is dictated by closed-loop trancfer functions. -For instance sensitivity, transmissibility, etc... Gang of Four. +Once the system is properly decoupled using one of the approaches described in Section ref:sec:detail_control_decoupling, a diagonal controller can be tuned. +This consists in tuning several SISO controllers. +There are several ways to design a controller to obtain a given performance while ensuring good robustness properties. + +Performances of a feedback system (such as response time, disturbance rejection, ) depends on the obtained closed-loop transfer functions. +For instance sensitivity, transmissibility, etc... Gang of Four. +The specifications can usually be expressed in terms of the shape of these closed-loop transfer functions [[cite:&skogestad07_multiv_feedb_contr, chapt. 3]]. + +In some cases, "fixed" controller structures are used, with as PI and PID controllers. +In such case the controller coefficients are manually tuned to obtain acceptable performance and robustness. +In many cases, PID+LPF can already lead to performances close to optimal, depending on the plant. -There are several ways to design a controller to obtain a given performance. Decoupled Open-Loop Shaping: -- As shown in previous section, once the plant is decoupled: open loop shaping -- Explain procedure when applying open-loop shaping -- Lead, Lag, Notches, Check Stability, c2d, etc... -- But this is open-loop shaping, and it does not directly work on the closed loop trancfer functions +- Explain procedure when applying open-loop shaping [[cite:&schmidt20_desig_high_perfor_mechat_third_revis_edition, chapt. 4.4.7]] + [[cite:&steinbuch16_model_based]] + #+begin_quote + The key idea of loop-shaping is the modification of the controller such that the open- +loop is made according to specifications. The reason this works so well, is that the controller +enters linearly into the open-loop transfer l(j!) = g(j!)k(j!), so that it is fast and easy +to reason what is to be changed in the controller. However, in practice all specifications are +of course given in terms of the final system performance, i.e. as closed-loop specifications. +So we should convert the closed loop specs into specs on the open-loop. + #+end_quote +- The controller is usually manually tuned using a series of Integrators, Leads, Lags, Notches, low pass filters +- There are lots of tools to check stability, robustness margins and performances +- Open-Loop shaping is very popular as the open-loop gain depends linearly on the controller. + So the open-loop transfer function can easily be shaped by modifying the controller response. +- Different techniques for open loop shaping (choice of optimal open-loop gain shape) [[cite:&lurie02_system_archit_trades_using_bode]] +- But this is open-loop shaping, and it does not directly work on the closed loop transfer functions +- The huge advantage of this technique, is that one can tune the controllers based on the measured FRF of the system. + No plant model is required. +- This is what was done during the conceptual phase after the plan was decoupled in the frame of the struts. -Other strategy: Model Based Design: -- [[file:~/Cloud/work-projects/ID31-NASS/matlab/stewart-simscape/org/bibliography.org::*Multivariable Control][Multivariable Control]] -- Talk about Caio's thesis? -- Review of model based design (LQG, H-Infinity) applied to Stewart platform + +Model based control: +- Review of model based design (LQG, H-Infinity) applied to Stewart platform [[file:~/Cloud/work-projects/ID31-NASS/matlab/stewart-simscape/org/bibliography.org::*Multivariable Control][Multivariable Control]] + $\hinf$ loop-shaping [[cite:&skogestad07_multiv_feedb_contr]]. - Difficulty to specify robustness to change of payload mass - -In this section, an alternative is proposed in which complementary filters are used for closed-loop shaping. -It is presented for a SISO system, but can be generalized to MIMO if decoupling is sufficient. -It will be experimentally demonstrated with the NASS. - -*Paper's introduction*: - -*Model based control* - -*SISO control design methods* -- frequency domain techniques -- manual loop-shaping - key idea: modification of the controller such that the open-loop is made according to specifications [[cite:&oomen18_advan_motion_contr_precis_mechat]]. - This works well because the open loop trancfer function is linearly dependent of the controller. - Different techniques for open loop shaping [[cite:&lurie02_system_archit_trades_using_bode]] - -However, the specifications are given in terms of the final system performance, i.e. as closed-loop specifications. - -*Norm-based control* -$\hinf$ loop-shaping [[cite:&skogestad07_multiv_feedb_contr]]. Far from standard in industry as it requires lot of efforts. +- Requires high level of expertise. + Far from standard in industry. + Application to Stewart platforms is not demonstrated (or performance increased compared to decoupled control and manual loop shaping). -Problem of robustness to plant uncertainty: -- Trade off performance / robustness. Difficult to obtain high performance in presence of high uncertainty. -- Robust control $\mu\text{-synthesis}$. Takes a lot of effort to model the plant uncertainty. -- Sensor fusion: combines two sensors using complementary filters. The high frequency sensor is collocated with the actuator in order to ensure the stability of the system even in presence of uncertainty. [[cite:&collette15_sensor_fusion_method_high_perfor;&collette14_vibrat]] - -Complementary filters: [[cite:&hua05_low_ligo]]. - +In this section, an alternative controller synthesis scheme is proposed in which complementary filters are used for directly shaping the closed-loop transfer functions. In this paper, we propose a new controller synthesis method - based on the use of complementary high pass and low pass filters - inverse based control @@ -3354,12 +3399,16 @@ In this paper, we propose a new controller synthesis method #+begin_src matlab :noweb yes <> + +%% Initialize Frequency Vector +freqs = logspace(-1, 3, 1000); #+end_src ** Control Architecture <> **** Virtual Sensor Fusion -Let's consider the control architecture represented in Figure ref:fig:detail_control_cf_arch where $G^\prime$ is the physical plant to control, $G$ is a model of the plant, $k$ is a gain, $H_L$ and $H_H$ are complementary filters ($H_L + H_H = 1$ in the complex sense). + +Let's consider the control architecture represented in Figure ref:fig:detail_control_cf_arch where $G^\prime$ is the physical plant to control, $G$ is a model of the plant, $k$ is a gain, $H_L$ and $H_H$ are complementary filters ($H_L(s) + H_H(s) = 1$). The signals are the reference signal $r$, the output perturbation $d_y$, the measurement noise $n$ and the control input $u$. #+begin_src latex :file detail_control_cf_arch.pdf @@ -3371,14 +3420,14 @@ The signals are the reference signal $r$, the output perturbation $d_y$, the mea \begin{tikzpicture} \node[addb={+}{}{}{}{-}] (addfb) at (0, 0){}; \node[block, right=of addfb] (K){$k$}; - \node[block, right=1.2 of K] (G){$G^\prime$}; + \node[block, right=2.5 of K] (G){$G^\prime$}; \node[addb={+}{}{}{}{}, right=of G] (adddy){}; - \coordinate[] (KG) at ($0.5*(K.east)+0.5*(G.west)$); + \coordinate[] (KG) at ($(K.east)+(0.3, 0)$); \node[block, below=of KG] (Gm){$G$}; - \node[block, below=of Gm] (Hh){$H_H$}; - \node[addb={+}{}{}{}{}, below=of Hh] (addcf){}; - \node[block] (Hl) at (addcf-|G) {$H_L$}; - \node[addb={+}{}{}{}{}, right=1.2 of Hl] (addn) {}; + \node[block, below=0.4 of Gm] (Hh){$H_H$}; + \node[addb={+}{}{}{}{}, below=0.4 of Hh] (addcf){}; + \node[block, right= of addcf] (Hl) {$H_L$}; + \node[addb={+}{}{}{}{}, right=2.5 of Hl] (addn) {}; \draw[->] (addfb.east) -- (K.west) node[above left]{}; @@ -3392,9 +3441,13 @@ The signals are the reference signal $r$, the output perturbation $d_y$, the mea \draw[<-] (addn.east) -- ++(\cdist, 0) coordinate[](endpos) node[above left]{$n$}; \draw[->] (adddy.east) -- (G-|endpos) node[above left]{$y$}; \draw[->] (adddy-|addn) node[branch]{} -- (addn.north); - \draw[<-] (addfb.west) -- ++(-\cdist, 0) node[above right]{$r$}; + \draw[<-] (addfb.west) -- ++(-\cdist, 0) node[above right](r){$r$}; \draw[->] (addn.west) -- (Hl.east) node[above right]{$y_m$}; \draw[<-] (adddy.north) -- ++(0, \cdist) node[below right]{$d_y$}; + + \begin{scope}[on background layer] + \node[fit={(Hl.south east) (r.north west)}, inner sep=4pt, draw, fill=black!20!white, dashed, label={RT controller}] (Kfb) {}; + \end{scope} \end{tikzpicture} #+end_src @@ -3403,19 +3456,21 @@ The signals are the reference signal $r$, the output perturbation $d_y$, the mea #+RESULTS: [[file:figs/detail_control_cf_arch.png]] -The dynamics of the closed-loop system is described by the following equations -\begin{alignat}{5} -y &= \frac{1+kGH_H}{1+L} dy &&+ \frac{kG^{\prime}}{1+L} r &&- \frac{kG^{\prime}H_L}{1+L} n \\ -u &= -\frac{kH_L}{1+L} dy &&+ \frac{k}{1+L} r &&- \frac{kH_L}{1+L} n -\end{alignat} -with $L = k(G H_H + G^\prime H_L)$. +The dynamics of the closed-loop system is described by eqref:eq:detail_control_cf_sf_cl_tf with $L = k(G H_H + G^\prime H_L)$. -The idea of using such architecture comes from sensor fusion [[cite:&collette14_vibrat;&collette15_sensor_fusion_method_high_perfor]] where we use two sensors. +\begin{subequations}\label{eq:detail_control_cf_sf_cl_tf} + \begin{alignat}{5} + y &= \frac{1+kGH_H}{1+L} dy &&+ \frac{kG^{\prime}}{1+L} r &&- \frac{kG^{\prime}H_L}{1+L} n \\ + u &= -\frac{kH_L}{1+L} dy &&+ \frac{k}{1+L} r &&- \frac{kH_L}{1+L} n + \end{alignat} +\end{subequations} + +The idea of using such architecture comes from sensor fusion [[cite:&collette14_vibrat;&collette15_sensor_fusion_method_high_perfor]] where two sensors are used. One is measuring the quantity that is required to control, the other is collocated with the actuator in such a way that stability is guaranteed. The first one is low pass filtered in order to obtain good performance at low frequencies and the second one is high pass filtered to benefits from its good dynamical properties. Here, the second sensor is replaced by a model $G$ of the plant which is assumed to be stable and minimum phase. - +This lead to the idea of virtual sensor fusion presented in [[cite:&verma20_virtual_sensor_fusion_high_precis_contr]]. One may think that the control architecture shown in Figure ref:fig:detail_control_cf_arch is a multi-loop system, but because no non-linear saturation-type element is present in the inner-loop (containing $k$, $G$ and $H_H$ which are all numerically implemented), the structure is equivalent to the architecture shown in Figure ref:fig:detail_control_cf_arch_eq. @@ -3433,8 +3488,8 @@ One may think that the control architecture shown in Figure ref:fig:detail_contr \node[addb={+}{}{}{}{}, right=of G] (adddy){}; \node[block, below right=0.5 and -0.2 of K] (Gm){$G$}; \node[block, below left =0.5 and -0.2 of K] (Hh){$H_H$}; - \node[block, below=1.5 of G] (Hl) {$H_L$}; - \node[addb={+}{}{}{}{}, right=1 of Hl] (addn) {}; + \node[block, below=1.5 of K] (Hl) {$H_L$}; + \node[addb={+}{}{}{}{}, right=3.8 of Hl] (addn) {}; \draw[->] (addfb.east) -- (addK.west); \draw[->] (addK.east) -- (K.west); @@ -3446,13 +3501,17 @@ One may think that the control architecture shown in Figure ref:fig:detail_contr \draw[<-] (addn.east) -- ++(\cdist, 0) coordinate[](endpos) node[above left]{$n$}; \draw[->] (adddy.east) -- (G-|endpos) node[above left]{$y$}; \draw[->] (adddy-|addn) node[branch]{} -- (addn.north); - \draw[<-] (addfb.west) -- ++(-\cdist, 0) node[above right]{$r$}; + \draw[<-] (addfb.west) -- ++(-\cdist, 0) node[above right](r){$r$}; \draw[->] (addn.west) -- (Hl.east) node[above right]{$y_m$}; \draw[<-] (adddy.north) -- ++(0, \cdist) node[below right]{$d_y$}; \draw[->] (Hl.west) -| (addfb.south) node[below right]{}; \begin{scope}[on background layer] - \node[fit={($(addK.west|-Hh.south)+(-0.1, 0)$) (K.north-|cffb)}, inner sep=5pt, draw, fill=black!20!white, dashed, label={$K$}] (Kfb) {}; + \node[fit={(Hl.south -| cffb) (r.north west)}, inner sep=8pt, draw, fill=black!20!white, dashed] (Kfb) {}; + \end{scope} + + \begin{scope}[on background layer] + \node[fit={($(addK.west|-Hh.south)+(-0.1, 0)$) (K.north-|cffb)}, inner sep=4pt, fill=colorblue!20!white, dashed] (Kfb) {}; \end{scope} \end{tikzpicture} #+end_src @@ -3462,23 +3521,29 @@ One may think that the control architecture shown in Figure ref:fig:detail_contr #+RESULTS: [[file:figs/detail_control_cf_arch_eq.png]] -The dynamics of the system can be rewritten as follow -\begin{alignat}{5} -y &= \frac{1}{1+G^{\prime} K H_L} dy &&+ \frac{G^{\prime} K}{1+G^{\prime} K H_L} r &&- \frac{G^{\prime} K H_L}{1+G^{\prime} K H_L} n \\ -u &= \frac{-K H_L}{1+G^{\prime} K H_L} dy &&+ \frac{K}{1+G^{\prime} K H_L} r &&- \frac{K H_L}{1+G^{\prime} K H_L} n -\end{alignat} -with $K = \frac{k}{1 + H_H G k}$ +The dynamics of the system can be rewritten eqref:eq:detail_control_cf_sf_cl_tf_K with $K = \frac{k}{1 + H_H G k}$. + +\begin{subequations}\label{eq:detail_control_cf_sf_cl_tf_K} + \begin{alignat}{5} + y &= \frac{1}{1+G^{\prime} K H_L} dy &&+ \frac{G^{\prime} K}{1+G^{\prime} K H_L} r &&- \frac{G^{\prime} K H_L}{1+G^{\prime} K H_L} n \\ + u &= \frac{-K H_L}{1+G^{\prime} K H_L} dy &&+ \frac{K}{1+G^{\prime} K H_L} r &&- \frac{K H_L}{1+G^{\prime} K H_L} n + \end{alignat} +\end{subequations} **** Asymptotic behavior -We now want to study the asymptotic system obtained when using very high value of $k$ -\begin{equation} - \lim_{k\to\infty} K = \lim_{k\to\infty} \frac{k}{1+H_H G k} = \left( H_H G \right)^{-1} + +Let's take the extreme case of very high values for $k$. +In that case $K(s)$ converges to plant inverse multiply by the inverse of the high pass filter eqref:eq:detail_control_cf_high_k. + +\begin{equation}\label{eq:detail_control_cf_high_k} + \lim_{k\to\infty} K(s) = \lim_{k\to\infty} \frac{k}{1+H_H(s) G(s) k} = \left( H_H(s) G(s) \right)^{-1} \end{equation} + If the obtained $K$ is improper, a low pass filter can be added to have its causal realization. +Also, we want $K$ to be stable, so $G$ and $H_H$ must be minimum phase transfer functions. -Also, we want $K$ to be stable, so $G$ and $H_H$ must be minimum phase trancfer functions. - -For now on, we will consider the resulting control architecture as shown on Figure ref:fig:detail_control_cf_arch_class where the only "tuning parameters" are the complementary filters. +With this assumptions, the resulting control architecture is shown on Figure ref:fig:detail_control_cf_arch_class. +The only "tuning parameters" are the complementary filters $H_L$ and $H_H$. #+begin_src latex :file detail_control_cf_arch_class.pdf \tikzset{block/.default={0.8cm}{0.6cm}} @@ -3491,8 +3556,8 @@ For now on, we will consider the resulting control architecture as shown on Figu \node[block, right=of addfb] (K){$K$}; \node[block, right=of K] (G){$G^\prime$}; \node[addb={+}{}{}{}{}, right=of G] (adddy){}; - \node[addb={+}{}{}{}{}, below right=and 0.5 of adddy] (addn) {}; - \node[block] (Hh) at (G|-addn) {$H_L$}; + \node[addb={+}{}{}{}{}, below right=0.7 and 0.3 of adddy] (addn) {}; + \node[block] (Hl) at (K|-addn) {$H_L$}; \draw[->] (addfb.east) -- (K.west) node[above left]{}; \draw[->] (K.east) -- (G.west) node[above left]{$u$}; @@ -3500,10 +3565,14 @@ For now on, we will consider the resulting control architecture as shown on Figu \draw[<-] (addn.east) -- ++(\cdist, 0) coordinate[](endpos) node[above left]{$n$}; \draw[->] (G-|addn)node[branch]{} -- (addn.north); \draw[->] (adddy.east) -- (G-|endpos) node[above left]{$y$}; - \draw[<-] (addfb.west) -- ++(-\cdist, 0) node[above right]{$r$}; - \draw[->] (addn.west) -- (Hh.east); - \draw[->] (Hh.west) -| (addfb.south); + \draw[<-] (addfb.west) -- ++(-\cdist, 0) node[above right](r){$r$}; + \draw[->] (addn.west) -- (Hl.east); + \draw[->] (Hl.west) -| (addfb.south); \draw[<-] (adddy.north) -- ++(0, \cdist) node[below right]{$d_y$}; + + \begin{scope}[on background layer] + \node[fit={(Hl.south east) (r.north west)}, inner sep=4pt, draw, fill=black!20!white, dashed, label={RT controller}] (Kfb) {}; + \end{scope} \end{tikzpicture} #+end_src @@ -3512,87 +3581,75 @@ For now on, we will consider the resulting control architecture as shown on Figu #+RESULTS: [[file:figs/detail_control_cf_arch_class.png]] -The equations describing the dynamics of the closed-loop system are -\begin{align} - y &= \frac{ H_H dy + G^{\prime} G^{-1} r - G^{\prime} G^{-1} H_L n }{H_H + G^\prime G^{-1} H_L} \label{eq:detail_control_cf_cl_system_y}\\ - u &= \frac{ -G^{-1} H_L dy + G^{-1} r - G^{-1} H_L n }{H_H + G^\prime G^{-1} H_L} \label{eq:detail_control_cf_cl_system_u} -\end{align} +The equations describing the dynamics of the closed-loop system of Figure ref:fig:detail_control_cf_arch_class -At frequencies where the model is accurate: $G^{-1} G^{\prime} \approx 1$, $H_H + G^\prime G^{-1} H_L \approx H_H + H_L = 1$ and -\begin{align} -y &= H_H dy + r - H_L n \label{eq:detail_control_cf_cl_performance_y} \\ -u &= -G^{-1} H_L dy + G^{-1} r - G^{-1} H_L n \label{eq:detail_control_cf_cl_performance_u} -\end{align} +\begin{subequations} + \begin{align} + y &= \frac{ H_H dy + G^{\prime} G^{-1} r - G^{\prime} G^{-1} H_L n }{H_H + G^\prime G^{-1} H_L} \label{eq:detail_control_cf_cl_system_y}\\ + u &= \frac{ -G^{-1} H_L dy + G^{-1} r - G^{-1} H_L n }{H_H + G^\prime G^{-1} H_L} \label{eq:detail_control_cf_cl_system_u} + \end{align} +\end{subequations} -We obtain a sensitivity trancfer function equals to the high pass filter $S = \frac{y}{dy} = H_H$ and a transmissibility trancfer function equals to the low pass filter $T = \frac{y}{n} = H_L$. +At frequencies where the model is accurate: $G^{-1} G^{\prime} \approx 1$, $H_H + G^\prime G^{-1} H_L \approx H_H + H_L = 1$ and the closed loop transfer functions are described by eqref:eq:detail_control_cf_sf_cl_tf_K_inf. + +\begin{subequations}\label{eq:detail_control_cf_sf_cl_tf_K_inf} + \begin{alignat}{5} + y &= H_H dy &&+ r &&- H_L n \label{eq:detail_control_cf_cl_performance_y} \\ + u &= -G^{-1} H_L dy &&+ G^{-1} r &&- G^{-1} H_L n \label{eq:detail_control_cf_cl_performance_u} + \end{alignat} +\end{subequations} + +The obtained sensitivity transfer function equals to the high pass filter $S = \frac{y}{dy} = H_H$ and the transmissibility transfer function equals to the low pass filter $T = \frac{y}{n} = H_L$. Assuming that we have a good model of the plant, we have then that the closed-loop behavior of the system converges to the designed complementary filters. ** Translating the performance requirements into the shapes of the complementary filters <> **** Introduction :ignore: - The required performance specifications in a feedback system can usually be translated into requirements on the upper bounds of $\abs{S(j\w)}$ and $|T(j\omega)|$ [[cite:&bibel92_guidel_h]]. -The process of designing a controller $K(s)$ in order to obtain the desired shapes of $\abs{S(j\w)}$ and $\abs{T(j\w)}$ is called loop shaping. +The required performance specifications in a feedback system can usually be translated into requirements on the upper bounds of $|S(j\omega)|$ and $|T(j\omega)|$ [[cite:&bibel92_guidel_h]]. +The process of designing a controller $K(s)$ in order to obtain the desired shapes of $|S(j\omega)|$ and $|T(j\omega)|$ is called closed-loop shaping. -The equations eqref:eq:detail_control_cf_cl_system_y and eqref:eq:detail_control_cf_cl_system_u describing the dynamics of the studied feedback architecture are not written in terms of $K$ but in terms of the complementary filters $H_L$ and $H_H$. - -In this section, we then translate the typical specifications into the desired shapes of the complementary filters $H_L$ and $H_H$. +The equations eqref:eq:detail_control_cf_cl_system_y and eqref:eq:detail_control_cf_cl_system_u describing the dynamics of the studied feedback architecture are not written in terms of the controller $K(s)$ but in terms of the complementary filters $H_L(s)$ and $H_H(s)$. +The typical specifications are then translated into the desired shapes of the complementary filters. **** Nominal Stability (NS) The closed-loop system is stable if all its elements are stable ($K$, $G^\prime$ and $H_L$) and if the sensitivity function ($S = \frac{1}{1 + G^\prime K H_L}$) is stable. - -For the nominal system ($G^\prime = G$), we have $S = H_H$. +For the nominal system ($G^\prime = G$), the sensitivity transfer function is equal to the high pass filter: $S(s) = H_H(s)$. Nominal stability is then guaranteed if $H_L$, $H_H$ and $G$ are stable and if $G$ and $H_H$ are minimum phase (to have $K$ stable). - -Thus we must design stable and minimum phase complementary filters. +Therefore stable and minimum phase complementary filters need to be used. **** Nominal Performance (NP) -Typical performance specifications can usually be translated into upper bounds on $|S(j\omega)|$ and $|T(j\omega)|$. +Two performance weights $w_H$ and $w_L$ are here defined in such a way that performance specifications are satisfied is eqref:eq:detail_control_cf_weights is satisfied. -Two performance weights $w_H$ and $w_L$ are defined in such a way that performance specifications are saticfied if -\begin{equation} - |w_H(j\omega) S(j\omega)| \le 1,\ |w_L(j\omega) T(j\omega)| \le 1 \quad \forall\omega -\end{equation} +\begin{subequations}\label{eq:detail_control_cf_weights} + \begin{align} + |w_H(j\omega) S(j\omega)| &\le 1 \quad \forall\omega\\ + |w_L(j\omega) T(j\omega)| &\le 1 \quad \forall\omega + \end{align} +\end{subequations} -For the nominal system, we have $S = H_H$ and $T = H_L$, and then nominal performance is ensured by requiring +For the nominal system, we have $S = H_H$ and $T = H_L$, and then nominal performance is ensured by requiring eqref:eq:detail_control_cf_nominal_performance. -\begin{subnumcases}{\text{NP} \Leftrightarrow}\label{eq:detail_control_cf_nominal_performance} - |w_H(j\omega) H_H(j\omega)| \le 1 \quad \forall\omega \label{eq:detail_control_cf_nominal_perf_hh}\\ - |w_L(j\omega) H_L(j\omega)| \le 1 \quad \forall\omega \label{eq:detail_control_cf_nominal_perf_hl} -\end{subnumcases} +\begin{empheq}[box=\fbox,left=\text{NP} \Longleftrightarrow \empheqlbrace]{align} \label{eq:detail_control_cf_nominal_performance} + &|w_H(j\omega) H_H(j\omega)| \le 1 \quad \forall\omega \label{eq:detail_control_cf_nominal_perf_hh}\\ + &|w_L(j\omega) H_L(j\omega)| \le 1 \quad \forall\omega \label{eq:detail_control_cf_nominal_perf_hl} +\end{empheq} The translation of typical performance requirements on the shapes of the complementary filters is discussed below: - for disturbance rejections, make $|S| = |H_H|$ small - for noise attenuation, make $|T| = |H_L|$ small -- for control energy reduction, make $|KS| = |G^{-1}|$ small +- closed-loop bandwidth can be limited by requiring that $|T|$ is less than $\frac{1}{\sqrt{2}}$ above the maximum wanted bandwidth -We may have other requirements in terms of stability margins, maximum or minimum closed-loop bandwidth. +Therefore, by properly choosing the shape of the complementary filters, the nominal performance specifications can be addressed. -**** Closed-Loop Bandwidth -The closed-loop bandwidth $\w_B$ can be defined as the frequency where $\abs{S(j\w)}$ first crosses $\frac{1}{\sqrt{2}}$ from below. +Classical stability margins (gain and phase margins) can also be linked to the maximum amplitude of the sensitivity transfer function. +- [ ] Add reference -If one wants the closed-loop bandwidth to be at least $\w_B^*$ (e.g. to stabilize an unstable pole), one can required that $|S(j\omega)| \le \frac{1}{\sqrt{2}}$ below $\omega_B^*$ by designing $w_H$ such that $|w_H(j\omega)| \ge \sqrt{2}$ for $\omega \le \omega_B^*$. +Typically, having $|S|_{\infty} \le 2$ guarantees a gain margin of at least $2$ and a phase margin of at least $\SI{29}{\degree}$. -Similarly, if one wants the closed-loop bandwidth to be less than $\w_B^*$, one can approximately require that the magnitude of $T$ is less than $\frac{1}{\sqrt{2}}$ at frequencies above $\w_B^*$ by designing $w_L$ such that $|w_L(j\omega)| \ge \sqrt{2}$ for $\omega \ge \omega_B^*$. - -**** Classical stability margins -Gain margin (GM) and phase margin (PM) are usual specifications on controlled system. -Minimum GM and PM can be guaranteed by limiting the maximum magnitude of the sensibility function $M_S = \max_{\omega} |S(j\omega)|$: -\begin{equation} - \text{GM} \geq \frac{M_S}{M_S-1}; \quad \text{PM} \geq \frac{1}{M_S} -\end{equation} - -Thus, having $M_S \le 2$ guarantees a gain margin of at least $2$ and a phase margin of at least $\SI{29}{\degree}$. - -For the nominal system $M_S = \max_\omega |S| = \max_\omega |H_H|$, so one can design $w_H$ so that $|w_H(j\omega)| \ge 1/2$ in order to have -\begin{equation} - |H_H(j\omega)| \le 2 \quad \forall\omega -\end{equation} -and thus obtain acceptable stability margins. - -**** Response time to change of reference signal -For the nominal system, the model is accurate and the trancfer function from reference signal $r$ to output $y$ is $1$ eqref:eq:detail_control_cf_cl_performance_y and does not depends of the complementary filters. +**** TODO Response time to change of reference signal +For the nominal system, the model is accurate and the transfer function from reference signal $r$ to output $y$ is $1$ eqref:eq:detail_control_cf_cl_performance_y and does not depends of the complementary filters. However, one can add a pre-filter as shown in Figure ref:fig:detail_control_cf_arch_class_prefilter. @@ -3630,14 +3687,14 @@ However, one can add a pre-filter as shown in Figure ref:fig:detail_control_cf_a #+RESULTS: [[file:figs/detail_control_cf_arch_class_prefilter.png]] -The trancfer function from $y$ to $r$ becomes $\frac{y}{r} = K_r$ and $K_r$ can we chosen to obtain acceptable response to change of the reference signal. +The transfer function from $y$ to $r$ becomes $\frac{y}{r} = K_r$ and $K_r$ can we chosen to obtain acceptable response to change of the reference signal. Typically, $K_r$ is a low pass filter of the form \begin{equation} K_r(s) = \frac{1}{1 + \tau s} \end{equation} with $\tau$ corresponding to the desired response time. -**** Input usage +**** TODO Input usage Input usage due to disturbances $d_y$ and measurement noise $n$ is determined by $\big|\frac{u}{d_y}\big| = \big|\frac{u}{n}\big| = \big|G^{-1}H_L\big|$. Thus it can be limited by setting an upper bound on $|H_L|$. @@ -3647,10 +3704,18 @@ Input usage due to reference signal $r$ is determined by $\big|\frac{u}{r}\big| Proper choice of $|K_r|$ is then useful to limit input usage due to change of reference signal. **** Robust Stability (RS) -Robustness stability represents the ability of the control system to remain stable even though there are differences between the actual system $G^\prime$ and the model $G$ that was used to design the controller. + +Robustness stability represents the ability of the control system to remain stable even though there are differences between the actual system $G^\prime$ and the model $G$ that was used for the design of the controller. These differences can have various origins such as unmodelled dynamics or non-linearities. -To represent the differences between the model and the actual system, one can choose to use the general input multiplicative uncertainty as represented in Figure ref:fig:detail_control_cf_input_uncertainty. +To represent the differences between the model and the actual system, the input multiplicative uncertainty as represented in Figure ref:fig:detail_control_cf_input_uncertainty is used. + +Then, the set of possible plant is described by eqref:eq:detail_control_cf_multiplicative_uncertainty. +$w_I$ should be chosen such that all possible plants $G^\prime$ are contained in the set $\Pi_i$. + +\begin{equation}\label{eq:detail_control_cf_multiplicative_uncertainty} + \Pi_i: \quad G^\prime(s) = G(s)\big(1 + w_I(s)\Delta_I(s)\big); \quad |\Delta_I(j\omega)| \le 1 \ \forall\omega +\end{equation} #+begin_src latex :file detail_control_cf_input_uncertainty.pdf \tikzset{block/.default={0.8cm}{0.6cm}} @@ -3682,188 +3747,287 @@ To represent the differences between the model and the actual system, one can ch \end{tikzpicture} #+end_src -#+name: fig:detail_control_cf_input_uncertainty -#+caption: Input multiplicative uncertainty -#+RESULTS: +#+name: fig:detail_control_cf_input_uncertainty_nyquist +#+caption: Input multiplicative uncertainty to model the differences between the model and the physical plant (\subref{fig:detail_control_cf_input_uncertainty}). Effect of this uncertainty is displayed on the Nyquist plot (\subref{fig:detail_control_cf_nyquist_uncertainty}) +#+attr_latex: :options [htbp] +#+begin_figure +#+attr_latex: :caption \subcaption{\label{fig:detail_control_cf_input_uncertainty}Input multiplicative uncertainty} +#+attr_latex: :options {0.48\textwidth} +#+begin_subfigure +#+attr_latex: :scale 1 [[file:figs/detail_control_cf_input_uncertainty.png]] +#+end_subfigure +#+attr_latex: :caption \subcaption{\label{fig:detail_control_cf_nyquist_uncertainty}Nyquist plot - Effect of multiplicative uncertainty} +#+attr_latex: :options {0.48\textwidth} +#+begin_subfigure +#+attr_latex: :scale 1 +[[file:figs/detail_control_cf_nyquist_uncertainty.png]] +#+end_subfigure +#+end_figure -Then, the set of possible perturbed plant is described by - -\begin{equation}\label{eq:detail_control_cf_multiplicative_uncertainty} - \Pi_i: \quad G_p(s) = G(s)\big(1 + w_I(s)\Delta_I(s)\big); \quad \abs{\Delta_I(j\w)} \le 1 \ \forall\w -\end{equation} -and $w_I$ should be chosen such that all possible plants $G^\prime$ are contained in the set $\Pi_i$. - -Using input multiplicative uncertainty, robust stability is equivalent to have [[cite:&skogestad07_multiv_feedb_contr]]: -\begin{align*} - \text{RS} \Leftrightarrow & |w_I T| \le 1 \quad \forall G^\prime \in \Pi_I, \ \forall\omega \\ - \Leftrightarrow & \left| w_I \frac{G^\prime K H_L}{1 + G^\prime K H_L} \right| \le 1 \quad \forall G^\prime \in \Pi_I ,\ \forall\omega \\ - \Leftrightarrow & \left| w_I \frac{G^\prime G^{-1} {H_H}^{-1} H_L}{1 + G^\prime G^{-1} {H_H}^{-1} H_L} \right| \le 1 \quad \forall G^\prime \in \Pi_I ,\ \forall\omega \\ - \Leftrightarrow & \left| w_I \frac{(1 + w_I \Delta) {H_H}^{-1} H_L}{1 + (1 + w_I \Delta) {H_H}^{-1} H_L} \right| \le 1 \quad \forall \Delta, \ |\Delta| \le 1 ,\ \forall\omega \\ - \Leftrightarrow & \left| w_I \frac{(1 + w_I \Delta) H_L}{1 + w_I \Delta H_L} \right| \le 1 \quad \forall \Delta, \ |\Delta| \le 1 ,\ \forall\omega \\ - \Leftrightarrow & \left| H_L w_I \right| \frac{1 + |w_I|}{1 - |w_I H_L|} \le 1, \quad 1 - |w_I H_L| > 0 \quad \forall\omega \\ - \Leftrightarrow & \left| H_L w_I \right| (2 + |w_I|) \le 1, \quad 1 - |w_I H_L| > 0 \quad \forall\omega \\ - \Leftrightarrow & \left| H_L w_I \right| (2 + |w_I|) \le 1 \quad \forall\omega -\end{align*} +Considering input multiplicative uncertainty, the robust stability property can be derived graphically from the Nyquist plot (Figure ref:fig:detail_control_cf_nyquist_uncertainty), and eqref:eq:detail_control_cf_robust_stability_graphically is obtained, as proposed in [[cite:&skogestad07_multiv_feedb_contr, chapt. 7.5.1]]. -Robust stability is then guaranteed by having the low pass filter $H_L$ saticfying eqref:eq:detail_control_cf_robust_stability. - -\begin{equation}\label{eq:detail_control_cf_robust_stability} - \text{RS} \Leftrightarrow |H_L| \le \frac{1}{|w_I| (2 + |w_I|)}\quad \forall \omega +\begin{equation}\label{eq:detail_control_cf_robust_stability_graphically} + \text{RS} \Longleftrightarrow \left|w_I(j\omega) L(j\omega) \right| \le \left| 1 + L(j\omega) \right| \quad \forall\omega \end{equation} -To ensure robust stability condition eqref:eq:detail_control_cf_nominal_perf_hl can be used if $w_L$ is designed in such a way that $|w_L| \ge |w_I| (2 + |w_I|)$. +After some algebraic manipulations, robust stability is then guaranteed by having the low pass filter $H_L$ satisfying eqref:eq:detail_control_cf_condition_robust_stability. + +\begin{equation}\label{eq:detail_control_cf_condition_robust_stability} + \boxed{\text{RS} \Longleftrightarrow |w_I(j\omega) H_L(j\omega)| \le 1 \quad \forall \omega} +\end{equation} **** Robust Performance (RP) Robust performance is a property for a controlled system to have its performance guaranteed even though the dynamics of the plant is changing within specified bounds. -For robust performance, we then require to have the performance condition valid for all possible plants in the defined uncertainty set: -\begin{subnumcases}{\text{RP} \Leftrightarrow} - |w_H S| \le 1 \quad \forall G^\prime \in \Pi_I, \ \forall\omega \label{eq:detail_control_cf_robust_perf_S}\\ - |w_L T| \le 1 \quad \forall G^\prime \in \Pi_I, \ \forall\omega \label{eq:detail_control_cf_robust_perf_T} -\end{subnumcases} +For robust performance, we then require to have the performance condition valid for all possible plants in the defined uncertainty set eqref:eq:detail_control_cf_robust_perf_S. -Let's trancform condition eqref:eq:detail_control_cf_robust_perf_S into a condition on the complementary filters -\begin{align*} - & \left| w_H S \right| \le 1 \quad \forall G^\prime \in \Pi_I, \ \forall\omega \\ - \Leftrightarrow & \left| w_H \frac{1}{1 + G^\prime G^{-1} H_H^{-1} H_L} \right| \le 1 \quad \forall G^\prime \in \Pi_I, \ \forall\omega \\ - \Leftrightarrow & \left| \frac{w_H H_H}{1 + \Delta w_I H_L} \right| \le 1 \quad \forall \Delta, \ |\Delta| \le 1, \ \forall\omega \\ - \Leftrightarrow & \frac{|w_H H_H|}{1 - |w_I H_L|} \le 1, \ \forall\omega \\ - \Leftrightarrow & | w_H H_H | + | w_I H_L | \le 1, \ \forall\omega \\ -\end{align*} +\begin{equation}\label{eq:detail_control_cf_robust_perf_S} + \text{RP} \Longleftrightarrow |w_H(j\omega) S(j\omega)| \le 1 \quad \forall G^\prime \in \Pi_I, \ \forall\omega +\end{equation} -The same can be done with condition eqref:eq:detail_control_cf_robust_perf_T -\begin{align*} - & \left| w_L T \right| \le 1 \quad \forall G^\prime \in \Pi_I, \ \forall\omega \\ - \Leftrightarrow & \left| w_L \frac{G^\prime G^{-1} H_H^{-1} H_L}{1 + G^\prime G^{-1} H_H^{-1} H_L} \right| \le 1 \quad \forall G^\prime \in \Pi_I, \ \forall\omega \\ - \Leftrightarrow & \left| w_L H_L \frac{1 + w_I \Delta}{1 + w_I \Delta H_L} \right| \le 1 \quad \forall \Delta, \ |\Delta| \le 1, \ \forall\omega \\ - \Leftrightarrow & \left| w_L H_L \right| \frac{1 + |w_I|}{1 - |w_I H_L|} \le 1 \quad \forall\omega \\ - \Leftrightarrow & \left| H_L \right| \le \frac{1}{|w_L| (1 + |w_I|) + |w_I|} \quad \forall\omega \\ -\end{align*} +Let's transform condition eqref:eq:detail_control_cf_robust_perf_S into a condition on the complementary filters eqref:eq:detail_control_cf_robust_performance. -Robust performance is then guaranteed if eqref:eq:detail_control_cf_robust_perf_a and eqref:eq:detail_control_cf_robust_perf_b are satisfied. +\begin{equation}\label{eq:detail_control_cf_robust_performance} + \boxed{\text{RP} \Longleftrightarrow | w_H(j\omega) H_H(j\omega) | + | w_I(j\omega) H_L(j\omega) | \le 1, \ \forall\omega} +\end{equation} -\begin{subnumcases}\label{eq:detail_control_cf_robust_performance} -{\text{RP} \Leftrightarrow} - | w_H H_H | + | w_I H_L | \le 1, \ \forall\omega \label{eq:detail_control_cf_robust_perf_a}\\ - \left| H_L \right| \le \frac{1}{|w_L| (1 + |w_I|) + |w_I|} \quad \forall\omega \label{eq:detail_control_cf_robust_perf_b} -\end{subnumcases} +Obtained condition for robust performance combines both the NP and RS conditions. +If both NP and RS conditions are fulfilled, the robust performance will be fulfilled with a factor 2 [[cite:&skogestad07_multiv_feedb_contr, chapt. 7.6]]. +Therefore, for SISO systems, robust stability and nominal performance are usually sufficient. -One should be aware than when looking for a robust performance condition, only the worst case is evaluated and using the robust stability condition may lead to conservative control. - -** TODO [#C] Analytical formulas for complementary filters? +** Complementary filter design <> -** Numerical Example -<> -**** Procedure +As was explained in Section ref:sec:detail_control_sensor, complementary filters can easily be shaped with the standard $\mathcal{H}_{\infty}$ synthesis. +As requirements can usually be expressed as upper bounds on the complementary filters' magnitude, this method is very well suited. -In order to apply this control technique, we propose the following procedure: -1. Identify the plant to be controlled in order to obtain $G$ -2. Design the weighting function $w_I$ such that all possible plants $G^\prime$ are contained in the set $\Pi_i$ -3. Translate the performance requirements into upper bounds on the complementary filters (as explained in Sec. ref:ssec:detail_control_cf_trans_perf) -4. Design the weighting functions $w_H$ and $w_L$ and generate the complementary filters using $\hinf\text{-synthesis}$ (as was explained in Section ref:ssec:detail_control_sensor_hinf_method). - If the synthesis fails to give filters satisfying the upper bounds previously defined, either the requirements have to be reworked or a better model $G$ that will permits to have a smaller $w_I$ should be obtained. - If one does not want to use the $\mathcal{H}_\infty$ synthesis, one can use pre-made complementary filters given in Sec. ref:ssec:detail_control_cf_analytical_complementary_filters. -6. If $K = \left( G H_H \right)^{-1}$ is not proper, a low pass filter should be added -7. Design a pre-filter $K_r$ if requirements on input usage or response to reference change are not met -8. Control implementation: Filter the measurement with $H_L$, implement the controller $K$ and the pre-filter $K_r$ as shown on Figure ref:fig:detail_control_cf_arch_class_prefilter +However, analytical formulas for complementary filters may also be used. -**** Plant -Let's consider the problem of controlling an active vibration isolation system that consist of a mass $m$ to be isolated, a piezoelectric actuator and a geophone. +For some applications, first order complementary filters eqref:eq:detail_control_cf_1st_order are sufficient. -We represent this system by a mass-spring-damper system as shown Figure ref:fig:detail_control_cf_mech_sys_alone where $m$ typically represents the mass of the payload to be isolated, $k$ and $c$ represent respectively the stiffness and damping of the mount. -$w$ is the ground motion. -The values for the parameters of the models are -\[ m = \SI{20}{\kg}; \quad k = 10^4\si{\N/\m}; \quad c = 10^2\si{\N\per(\m\per\s)} \] +\begin{subequations}\label{eq:detail_control_cf_1st_order} + \begin{align} + H_L(s) &= \frac{1}{1 + s/\omega_0} \\ + H_H(s) &= \frac{s/\omega_0}{1 + s/\omega_0} + \end{align} +\end{subequations} -#+begin_src latex :file detail_control_cf_mech_sys_alone.pdf +They can be expressed analytically in the digital domain using the Bilinear transformation. +In such case, digital filters eqref:eq:detail_control_cf_1st_order_z are obtained. + +\begin{subequations}\label{eq:detail_control_cf_1st_order_z} + \begin{align} + H_L(z^{-1}) &= \frac{T_s \omega_0 + T_s \omega_0 z^{-1}}{T_s \omega_0 + 2 + (T_s \omega_0 - 2) z^{-1}} \\ + H_H(z^{-1}) &= \frac{2 - 2 z^{-1}}{T_s \omega_0 + 2 + (T_s \omega_0 - 2) z^{-1}} + \end{align} +\end{subequations} + +The main advantage of having analytical formulas for the complementary filters is that the parameter $\omega_0$ may be modified in real time. +This is illustrated in Figure ref:fig:detail_control_cf_arch_tunable_params. +Therefore, the performance and robustness of different control bandwidth can be tested very quickly. + +#+begin_src latex :file detail_control_cf_arch_tunable_params.pdf \tikzset{block/.default={0.8cm}{0.6cm}} \tikzset{addb/.append style={scale=0.7}} \tikzset{node distance=0.6} \def\cdist{0.7} \begin{tikzpicture} - % ==================== - % Parameters - % ==================== - \def\massw{2.2} % Width of the masses - \def\massh{0.8} % Height of the masses - \def\spaceh{1.2} % Height of the springs/dampers - \def\dispw{0.3} % Width of the dashed line for the displacement - \def\disph{0.5} % Height of the arrow for the displacements - \def\bracs{0.05} % Brace spacing vertically - \def\brach{-10pt} % Brace shift horizontaly - % ==================== + \node[addb={+}{}{}{}{-}] (addfb) at (0, 0){}; + \node[block, right=of addfb] (Hh){$H_H^{-1}$}; + \node[block, right=of Hh] (Ginv){$G^{-1}$}; + \node[block, right=of Ginv] (G){$G^\prime$}; + \node[addb={+}{}{}{}{}, right=of G] (adddy){}; + \node[addb={+}{}{}{}{}, below right=1.2 and 0.3 of adddy] (addn) {}; + \node[block] (Hl) at (Hh|-addn) {$H_L$}; + \node[color=colorred] (wb) at ($0.5*(Hh.south) + 0.5*(Hl.north)$) {$\bullet$}; + \draw[-, color=colorred] ($(wb) + (-0.6, 0)$)node[left]{$\omega_0$} -- (wb.center); + \draw[->, color=colorred] (wb.center) -- (Hh.south); + \draw[->, color=colorred] (wb.center) -- (Hl.north); - % ==================== - % Ground - % ==================== - \draw (-0.5*\massw, 0) -- (0.5*\massw, 0); - \draw[dashed] (0.5*\massw, 0) -- ++(\dispw, 0); - \draw[->] (0.5*\massw+0.5*\dispw, 0) -- ++(0, \disph) node[right]{$w$}; - % ==================== + \draw[->] (addfb.east) -- (Hh.west); + \draw[->] (Hh.east) -- (Ginv.west); + \draw[->] (Ginv.east) -- (G.west) node[above left]{$u$}; + \draw[->] (G.east) -- (adddy.west); + \draw[<-] (addn.east) -- ++(\cdist, 0) coordinate[](endpos) node[above left]{$n$}; + \draw[->] (G-|addn)node[branch]{} -- (addn.north); + \draw[->] (adddy.east) -- (G-|endpos) node[above left]{$y$}; + \draw[<-] (addfb.west) -- ++(-\cdist, 0) node[above right](r){$r$}; + \draw[->] (addn.west) -- (Hl.east); + \draw[->] (Hl.west) -| (addfb.south); + \draw[<-] (adddy.north) -- ++(0, \cdist) node[below right]{$d_y$}; - \begin{scope}[shift={(0, 0)}] - % Mass - \draw[fill=white] (-0.5*\massw, \spaceh) rectangle (0.5*\massw, \spaceh+\massh) node[pos=0.5]{$m$}; - - % Spring, Damper, and Actuator - \draw[spring] (-0.4*\massw, 0) -- (-0.4*\massw, \spaceh) node[midway, left=0.1]{$k$}; - \draw[damper] (0, 0) -- ( 0, \spaceh) node[midway, left=0.2]{$c$}; - \draw[actuator] ( 0.4*\massw, 0) -- ( 0.4*\massw, \spaceh) node[midway, left=0.1](F){$F$}; - - % Displacements - \draw[dashed] (0.5*\massw, \spaceh) -- ++(\dispw, 0); - \draw[->] (0.5*\massw+0.5*\dispw, \spaceh) -- ++(0, \disph) node[right]{$x$}; - - % Legend - % \draw[decorate, decoration={brace, amplitude=8pt}, xshift=\brach] % - % (-0.5*\massw, \bracs) -- (-0.5*\massw, \spaceh+\massh-\bracs) % - % node[midway,rotate=90,anchor=south,yshift=10pt]{}; + \begin{scope}[on background layer] + \node[fit={(Hl.south -| Ginv.east) (r.north west)}, inner sep=4pt, draw, fill=black!20!white, dashed, label={RT controller}] (Kfb) {}; \end{scope} \end{tikzpicture} #+end_src -#+name: fig:detail_control_cf_mech_sys_alone -#+caption: Model of the positioning system +#+name: fig:detail_control_cf_arch_tunable_params +#+caption: Implemented digital complementary filters with parameter $\omega_0$ that can be changed in real time #+RESULTS: -[[file:figs/detail_control_cf_mech_sys_alone.png]] +[[file:figs/detail_control_cf_arch_tunable_params.png]] -The model of the plant $G(s)$ from actuator force $F$ to displacement $x$ is then -\begin{equation} -G(s) = \frac{1}{m s^2 + c s + k} -\end{equation} +For many applications, slope of $+2$ is wanted at low frequency for the sensitivity transfer function (to follow ramp inputs for instance), and a slope of $-2$ for the complementary sensitivity transfer function. +In that case, complementary filters shown in equation eqref:eq:detail_control_cf_2nd_order are proposed. -Its bode plot is shown on Figure ref:fig:detail_control_cf_bode_plot_mech_sys. +\begin{subequations}\label{eq:detail_control_cf_2nd_order} + \begin{align} + H_L(s) &= \frac{(1+\alpha) (\frac{s}{\omega_0})+1}{\left((\frac{s}{\omega_0})+1\right) \left((\frac{s}{\omega_0})^2 + \alpha (\frac{s}{\omega_0}) + 1\right)}\\ + H_H(s) &= \frac{(\frac{s}{\omega_0})^2 \left((\frac{s}{\omega_0})+1+\alpha\right)}{\left((\frac{s}{\omega_0})+1\right) \left((\frac{s}{\omega_0})^2 + \alpha (\frac{s}{\omega_0}) + 1\right)} + \end{align} +\end{subequations} -#+begin_src matlab -m = 10; % mass [kg] -k = 1e4; % stiffness [N/m] -c = 1e2; % damping [N/(m/s)] +The effect of $\alpha$ and $\omega_0$ and the obtained shape of the complementary filters is shown in Figure ref:fig:detail_control_cf_analytical_effect. +Such filters can also be implemented in the digital domain with analytical formulas, such as $\alpha$ and $\omega_0$ can be changed in real time. -G = 1/(m*s^2 + c*s + k); +#+begin_src matlab :exports none :results none +%% Analytical Complementary Filters - Effect of alpha +freqs_study = logspace(-2, 2, 1000); +alphas = [0.1, 1, 10]; +w0 = 2*pi*1; +s = tf('s') -% The uncertainty weight -wI = generateWF('n', 2, 'w0', 2*pi*80, 'G0', 0.1, 'Ginf', 10, 'Gc', 1); +figure; +hold on; +for i = 1:length(alphas) + alpha = alphas(i); + Hh2 = (s/w0)^2*((s/w0)+1+alpha)/(((s/w0)+1)*((s/w0)^2 + alpha*(s/w0) + 1)); + Hl2 = ((1+alpha)*(s/w0)+1)/(((s/w0)+1)*((s/w0)^2 + alpha*(s/w0) + 1)); + plot(freqs_study, abs(squeeze(freqresp(Hh2, freqs_study, 'Hz'))), 'color', colors(i,:), 'DisplayName', sprintf('$\\alpha = %g$', alphas(i))); + plot(freqs_study, abs(squeeze(freqresp(Hl2, freqs_study, 'Hz'))), 'color', colors(i,:), 'HandleVisibility', 'off'); +end +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); +xlabel('Relative Frequency $\frac{\omega}{\omega_0}$'); ylabel('Magnitude'); +hold off; +ylim([1e-3, 20]); +leg = legend('location', 'northeast', 'FontSize', 8); +leg.ItemTokenSize(1) = 18; +#+end_src + +#+begin_src matlab :tangle no :exports results :results file replace +exportFig('figs/detail_control_cf_analytical_effect_alpha.pdf', 'width', 'half', 'height', 'normal'); #+end_src #+begin_src matlab :exports none :results none -%% description +%% Analytical Complementary Filters - Effect of w0 +freqs_study = logspace(-1, 3, 1000); +alpha = [1]; +w0s = [2*pi*1, 2*pi*10, 2*pi*100]; +s = tf('s') + +figure; +hold on; +for i = 1:length(w0s) + w0 =w0s(i); + Hh2 = (s/w0)^2*((s/w0)+1+alpha)/(((s/w0)+1)*((s/w0)^2 + alpha*(s/w0) + 1)); + Hl2 = ((1+alpha)*(s/w0)+1)/(((s/w0)+1)*((s/w0)^2 + alpha*(s/w0) + 1)); + plot(freqs_study, abs(squeeze(freqresp(Hh2, freqs_study, 'Hz'))), 'color', colors(i,:), 'DisplayName', sprintf('$\\omega_0 = %g$ Hz', w0/2/pi)); + plot(freqs_study, abs(squeeze(freqresp(Hl2, freqs_study, 'Hz'))), 'color', colors(i,:), 'HandleVisibility', 'off'); +end +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); +xlabel('Frequency [Hz]'); ylabel('Magnitude'); +hold off; +xlim([freqs_study(1), freqs_study(end)]); ylim([1e-3, 20]); +leg = legend('location', 'southeast', 'FontSize', 8); +leg.ItemTokenSize(1) = 18; +#+end_src + +#+begin_src matlab :tangle no :exports results :results file replace +exportFig('figs/detail_control_cf_analytical_effect_w0.pdf', 'width', 'half', 'height', 'normal'); +#+end_src + +#+name: fig:detail_control_cf_analytical_effect +#+caption: Shape of proposed analytical complementary filters. Effect of $\alpha$ (\subref{fig:detail_control_cf_analytical_effect_alpha}) and $\omega_0$ (\subref{fig:detail_control_cf_analytical_effect_w0}) are shown. +#+attr_latex: :options [htbp] +#+begin_figure +#+attr_latex: :caption \subcaption{\label{fig:detail_control_cf_analytical_effect_alpha}Effect of $\alpha$} +#+attr_latex: :options {0.48\textwidth} +#+begin_subfigure +#+attr_latex: :width 0.95\linewidth +[[file:figs/detail_control_cf_analytical_effect_alpha.png]] +#+end_subfigure +#+attr_latex: :caption \subcaption{\label{fig:detail_control_cf_analytical_effect_w0}Effect of $\omega_0$} +#+attr_latex: :options {0.48\textwidth} +#+begin_subfigure +#+attr_latex: :width 0.95\linewidth +[[file:figs/detail_control_cf_analytical_effect_w0.png]] +#+end_subfigure +#+end_figure + +** Numerical Example +<> +**** Procedure + +In order to apply this control technique, we propose the following procedure: +1. Identify the plant to be controlled in order to obtain the plant model $G$ +2. Design the weighting function $w_I$ such that all possible plants $G^\prime$ are contained in the set $\Pi_i$ +3. Translate the performance requirements into upper bounds on the complementary filters (as explained in Section ref:ssec:detail_control_cf_trans_perf) +4. Design the weighting functions $w_H$ and $w_L$ and generate the complementary filters using $\mathcal{H}_{\infty}\text{-synthesis}$ (as was explained in Section ref:ssec:detail_control_sensor_hinf_method). + If the synthesis fails to give filters satisfying the upper bounds previously defined, either the requirements have to be reworked or a better model $G$ that will permits to have a smaller $w_I$ should be obtained. + For simple cases, analytical formulas of complementary filters given in Section ref:ssec:detail_control_cf_analytical_complementary_filters can be used. +6. If $K(s) = \left( G(s) H_H(s) \right)^{-1}$ is not proper, low pass filters should be added high a high corner frequency + +**** Plant + +- To test this control architecture, a simple test model is used (Figure ref:fig:detail_control_cf_test_model). +- This model is quite similar to many positioning stages for Synchrotrons. + A payload (i.e. sample) with mass $m = 5$ is positioned on top of the stage. + The goal is to position the sample with respect to the x-ray. + It is supposed that the relative position $y$ between the payload an the x-ray is measured (typically the relative position between the focusing optics and the sample is performed). + There are some disturbance forces acting on the positioning stability, such as stage vibration $d_w$ and direct forces applied on the sample $d_F$ (for instance cable forces). + The positioning stage itself has a stiffness $k$, an internal damping $c$ and the force $F$ can be controlled. + +The model of the plant $G(s)$ from actuator force $F$ to displacement $y$ is then + +\begin{equation}\label{eq:detail_control_cf_test_plant_tf} + G(s) = \frac{1}{m s^2 + c s + k} +\end{equation} + +The values for the parameters of the models are $m = \SI{20}{\kg}$, $k = 1\si{\N/\mu\m}$ and $c = 10^2\si{\N\per(\m\per\s)}$. + +The plant dynamics has some uncertainty related to the limited support compliance, unmodeled flexible dynamics, dynamics of the payload, etc. +A multiplicative input uncertainty weight $w_I(s)$ is used to specify the amount of uncertainty as a function of frequency eqref:eq:detail_control_cf_test_plant_uncertainty. + +\begin{equation}\label{eq:detail_control_cf_test_plant_uncertainty} + w_I(s) = 10 \cdot \frac{(s+100)^2}{(s+1000)^2} +\end{equation} + +The nominal plant dynamics as well as the entire set of possible plants $\Pi_i$ are shown in Figure ref:fig:detail_control_cf_bode_plot_mech_sys. +#+begin_src matlab +%% Test model +freqs = logspace(0, 3, 1000); % Frequency Vector [Hz] + +m = 20; % mass [kg] +k = 1e6; % stiffness [N/m] +c = 1e2; % damping [N/(m/s)] + +% Plant dynamics +G = 1/(m*s^2 + c*s + k); + +% Uncertainty weight +wI = generateWF('n', 2, 'w0', 2*pi*50, 'G0', 0.1, 'Ginf', 10, 'Gc', 1); +#+end_src + +#+begin_src matlab :exports none :results none +%% Bode plot of the plant with dynamical uncertainty figure; tiledlayout(3, 1, 'TileSpacing', 'Compact', 'Padding', 'None'); % Magnitude ax1 = nexttile([2,1]); hold on; -plotMagUncertainty(wI, freqs, 'G', G, 'DisplayName', '$G$'); -plot(freqs, abs(squeeze(freqresp(G, freqs, 'Hz'))), 'k-'); +plot(freqs, abs(squeeze(freqresp(G, freqs, 'Hz'))), 'k-', 'DisplayName', 'G'); +plotMagUncertainty(wI, freqs, 'G', G, 'DisplayName', '$\Pi_i$'); set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); ylabel('Magnitude [m/N]'); set(gca, 'XTickLabel',[]); -ylim([1e-8, 1e-3]); +ylim([1e-8, 7e-5]); hold off; +leg = legend('location', 'northeast', 'FontSize', 8); +leg.ItemTokenSize(1) = 18; % Phase ax2 = nexttile; @@ -3872,7 +4036,7 @@ plotPhaseUncertainty(wI, freqs, 'G', G); plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(G, freqs, 'Hz')))), 'k-'); set(gca,'xscale','log'); yticks(-360:90:90); -ylim([-360 90]); +ylim([-270 45]); xlabel('Frequency [Hz]'); ylabel('Phase [deg]'); hold off; @@ -3881,142 +4045,114 @@ xlim([freqs(1), freqs(end)]); #+end_src #+begin_src matlab :tangle no :exports results :results file replace -exportFig('figs/detail_control_cf_bode_plot_mech_sys.pdf', 'width', 'wide', 'height', 600); +exportFig('figs/detail_control_cf_bode_plot_mech_sys.pdf', 'width', 'half', 'height', 450); #+end_src -#+name: fig:detail_control_cf_bode_plot_mech_sys -#+caption: Bode plot of the trancfer function $G(s)$ from $F$ to $x$ -#+RESULTS: +#+name: fig:detail_control_cf_test_model_plant +#+caption: Schematic of the test system (\subref{fig:detail_control_cf_test_model}). Bode plot of the transfer function $G(s)$ from $F$ to $y$ and the associated uncertainty set (\subref{fig:detail_control_cf_bode_plot_mech_sys}). +#+attr_latex: :options [htbp] +#+begin_figure +#+attr_latex: :caption \subcaption{\label{fig:detail_control_cf_test_model}Test model} +#+attr_latex: :options {0.3\textwidth} +#+begin_subfigure +#+attr_latex: :scale 1 +[[file:figs/detail_control_cf_test_model.png]] +#+end_subfigure +#+attr_latex: :caption \subcaption{\label{fig:detail_control_cf_bode_plot_mech_sys}Bode plot of $G(s)$ and associated uncertainty set} +#+attr_latex: :options {0.66\textwidth} +#+begin_subfigure +#+attr_latex: :scale 1 [[file:figs/detail_control_cf_bode_plot_mech_sys.png]] +#+end_subfigure +#+end_figure -**** Requirements -The control objective is to isolate the displacement $x$ of the mass from the ground motion $w$. +**** Requirements and choice of complementary filters -The disturbance rejection should be at least $10$ at $\SI{2}{\hertz}$ and with a slope of $-2$ below $\SI{2}{\hertz}$ until a rejection of $10^4$. +As explained in Section ref:ssec:detail_control_cf_trans_perf, nominal performance requirements can be expressed as upper bounds on the complementary filter shapes. +- Be able to follow ramp inputs (i.e. constant velocity scans) with no steady-state tracking error. + This requires to have a $+2$ slope at low frequency for $|S(j\omega)|$ +- Filter the measurement noise above 300Hz as the sensor noise is high (say a filtering factor of 100 is needed above that frequency). +- As much disturbance rejection as possible. -Closed-loop bandwidth should be less than $\SI{20}{\hertz}$ (because of time delay induced by limited sampling frequency?). +The second requirement is to have robust stability meaning that the plant should remain stable while considering the dynamical uncertainties modelled with $w_I$ +- The low-pass complementary filter magnitude $|H_L(j\omega)|$ should be bellow the inverse magnitude of the uncertainty weight magnitude $|w_I(j\omega)|$ eqref:eq:detail_control_cf_condition_robust_stability -Noise attenuation should be at least $10$ above $\SI{40}{\hertz}$ and $100$ above $\SI{500}{\hertz}$ - -Robustness to unmodelled dynamics. -We model the uncertainty on the dynamics of the plant by a multiplicative weight -\begin{equation} - w_I(s) = \frac{\tau s + r_0}{(\tau/r_\infty) s + 1} -\end{equation} -where $r_0=0.1$ is the relative uncertainty at steady-state, $1/\tau=\SI{100}{\hertz}$ is the frequency at which the relative uncertainty reaches $\SI{100}{\percent}$, and $r_\infty=10$ is the magnitude of the weight at high frequency. +Robust performance is ensured by simultaneous NP and RS. All the requirements on $H_L$ and $H_H$ are represented on Figure ref:fig:detail_control_cf_specs_S_T. -- [ ] TODO: Make Matlab code to plot the specifications +#+name: fig:detail_control_cf_specs_S_T_obtained_filters +#+caption: Performance requirement and complementary filters used (\subref{fig:detail_control_cf_specs_S_T}). Obtained controller from the complementary filters and the plant inverse is shown in (\subref{fig:detail_control_cf_bode_Kfb}). +#+attr_latex: :options [htbp] +#+begin_figure +#+attr_latex: :caption \subcaption{\label{fig:detail_control_cf_specs_S_T}Specifications and complementary filters} +#+attr_latex: :options {0.48\textwidth} +#+begin_subfigure +#+attr_latex: :width 0.95\linewidth +[[file:figs/detail_control_cf_specs_S_T.png]] +#+end_subfigure +#+attr_latex: :caption \subcaption{\label{fig:detail_control_cf_bode_Kfb}Bode plot of $K(s) \cdot H_L(s)$} +#+attr_latex: :options {0.48\textwidth} +#+begin_subfigure +#+attr_latex: :width 0.95\linewidth +[[file:figs/detail_control_cf_bode_Kfb.png]] +#+end_subfigure +#+end_figure + +While the $\mathcal{H}_\infty$ synthesis of complementary filters could be used, for this simple examples with simple requirements, analytical formulas of complementary filters were used. + +For this simple example, analytical formulas proposed to have +2 and -2 slopes eqref:eq:detail_control_cf_2nd_order were used. +$\alpha = 1$ and $\omega_0 = 2\pi \cdot 20$ were used. + +#+begin_src matlab +%% Analytical Complementary Filters +w0 = 2*pi*20; +alpha = 1; + +Hh = (s/w0)^2*((s/w0)+1+alpha)/(((s/w0)+1)*((s/w0)^2 + alpha*(s/w0) + 1)); +Hl = ((1+alpha)*(s/w0)+1)/(((s/w0)+1)*((s/w0)^2 + alpha*(s/w0) + 1)); +#+end_src #+begin_src matlab :exports none :results none %% Specifications figure; hold on; -plot([100, 1000], [0.1, 0.001], ':', 'color', colors(1,:), 'DisplayName', '$|T|$ - Upper bound'); -plot([0.1, 0.2, 2], [0.001, 0.001, 0.1], ':', 'color', colors(2,:), 'DisplayName', '$|S|$ - Upper bound'); -plot(freqs, 1./abs(squeeze(freqresp(wI, freqs, 'Hz'))), ':', 'color', colors(1,:), 'HandleVisibility', 'off'); +plot([1, 100], [0.01, 100], ':', 'color', colors(2,:)); +plot([300, 1000], [0.01, 0.01], ':', 'color', colors(1,:)); +plot(freqs, 1./abs(squeeze(freqresp(wI, freqs, 'Hz'))), ':', 'color', colors(1,:)); +plot(freqs, abs(squeeze(freqresp(Hl, freqs, 'Hz'))), '-', 'color', colors(1,:)); +plot(freqs, abs(squeeze(freqresp(Hh, freqs, 'Hz'))), '-', 'color', colors(2,:)); set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); xlabel('Frequency [Hz]'); ylabel('Magnitude'); hold off; xlim([freqs(1), freqs(end)]); ylim([1e-3, 10]); xticks([0.1, 1, 10, 100, 1000]); -legend('location', 'northeast', 'FontSize', 8); #+end_src #+begin_src matlab :tangle no :exports results :results file replace -exportFig('figs/detail_control_cf_specs_S_T.pdf', 'width', 'half', 'height', 'normal'); -#+end_src - -#+name: fig:detail_control_cf_specs_S_T_obtained_filters -#+caption: Caption with reference to sub figure (\subref{fig:detail_control_cf_specs_S_T}) (\subref{fig:detail_control_cf_hinf_filters_result_weights}) -#+attr_latex: :options [htbp] -#+begin_figure -#+attr_latex: :caption \subcaption{\label{fig:detail_control_cf_specs_S_T}Closed loop specifications} -#+attr_latex: :options {0.49\textwidth} -#+begin_subfigure -#+attr_latex: :width 0.95\linewidth -[[file:figs/detail_control_cf_specs_S_T.png]] -#+end_subfigure -#+attr_latex: :caption \subcaption{\label{fig:detail_control_cf_hinf_filters_result_weights}Obtained complementary filters} -#+attr_latex: :options {0.49\textwidth} -#+begin_subfigure -#+attr_latex: :width 0.95\linewidth -[[file:figs/detail_control_cf_hinf_filters_result_weights.png]] -#+end_subfigure -#+end_figure - -**** Design of the filters - -*Or maybe use analytical formulas as proposed here: [[file:~/Cloud/research/papers/dehaeze20_virtu_senso_fusio/matlab/index.org::*Complementary filters using analytical formula][Complementary filters using analytical formula]]* - -We then design $w_L$ and $w_H$ such that their magnitude are below the upper bounds shown on Figure ref:fig:detail_control_cf_hinf_filters_result_weights. -\begin{subequations} - \begin{align} - w_L &= \frac{(s+22.36)^2}{0.005(s+1000)^2}\\ - w_H &= \frac{1}{0.0005(s+0.4472)^2} - \end{align} -\end{subequations} - -#+begin_src matlab -omegab = 2*pi*9; -wH = (omegab)^2/(s + omegab*sqrt(1e-5))^2; -omegab = 2*pi*28; -wL = (s + omegab/(4.5)^(1/3))^3/(s*(1e-4)^(1/3) + omegab)^3; - -P = [0 wL; - wH -wH; - 1 0]; - -[Hl_hinf, ~, gamma, ~] = hinfsyn(P, 1, 1,'TOLGAM', 0.001, 'METHOD', 'ric', 'DISPLAY', 'on'); - -Hh_hinf = 1 - Hl_hinf; -#+end_src - -After the $\hinf\text{-synthesis}$, we obtain $H_L$ and $H_H$, and we plot their magnitude on phase on Figure ref:fig:detail_control_cf_hinf_filters_result_weights. - -\begin{subequations} - \begin{align} - H_L &= \frac{0.0063957 (s+1016) (s+985.4) (s+26.99)}{(s+57.99) (s^2 + 65.77s + 2981)}\\ - H_H &= \frac{0.9936 (s+111.1) (s^2 + 0.3988s + 0.08464)}{(s+57.99) (s^2 + 65.77s + 2981)} - \end{align} -\end{subequations} - -#+begin_src matlab :exports none :results none -%% Bode plot of the obtained complementary filters -figure; -hold on; -set(gca,'ColorOrderIndex',1) -plot(freqs, 1./abs(squeeze(freqresp(wL, freqs, 'Hz'))), '--', 'DisplayName', '$w_L$'); -set(gca,'ColorOrderIndex',2) -plot(freqs, 1./abs(squeeze(freqresp(wH, freqs, 'Hz'))), '--', 'DisplayName', '$w_H$'); - -set(gca,'ColorOrderIndex',1) -plot(freqs, abs(squeeze(freqresp(Hl_hinf, freqs, 'Hz'))), '-', 'DisplayName', '$H_L$ - $\mathcal{H}_\infty$'); -set(gca,'ColorOrderIndex',2) -plot(freqs, abs(squeeze(freqresp(Hh_hinf, freqs, 'Hz'))), '-', 'DisplayName', '$H_H$ - $\mathcal{H}_\infty$'); -hold off; -set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); -xlabel('Frequency [Hz]'); ylabel('Magnitude'); -ylim([1e-3, 10]); -xlim([freqs(1), freqs(end)]); -legend('location', 'southeast', 'FontSize', 8); -#+end_src - -#+begin_src matlab :tangle no :exports results :results file replace -exportFig('figs/detail_control_cf_hinf_filters_result_weights.pdf', 'width', 'half', 'height', 'normal'); +% exportFig('figs/detail_control_cf_specs_S_T.pdf', 'width', 'half', 'height', 'normal'); #+end_src **** Controller analysis -The controller is $K = \left( H_H G \right)^{-1}$. -A low pass filter is added to $K$ so that it is proper and implementable. -The obtained controller is shown on Figure ref:fig:detail_control_cf_bode_Kfb. +The controller to be implemented is $K(s) = \tilde{G}^{-1}(s) H_H^{-1}(s)$, with $\tilde{G}^{-1}(s)$ is the plant inverse which needs to be stable and proper. +Therefore, some low pass filters are added at high frequency eqref:eq:detail_control_cf_test_plant_inverse. + +\begin{equation}\label{eq:detail_control_cf_test_plant_inverse} + \tilde{G}^{-1}(s) = \frac{m s^2 + c s + k}{1 + \frac{s}{2\pi \cdot 1000} + \left( \frac{s}{2\pi \cdot 1000} \right)^2} +\end{equation} + +The obtained bode plot of the controller times the complementary high pass filter is shown in Figure ref:fig:detail_control_cf_bode_Kfb. +- two integrators are present at low frequency to be able to follow ramp inputs +- a notch is located at the plant resonance (inverse) +- a lead is added near the bandwidth around $\SI{20}{Hz}$ #+begin_src matlab -omega = 2*pi*500; -K = 1/(Hh_hinf*G) * 1/((1+s/omega)*(1+s/omega+(s/omega)^2)); +%% Obtained controller +omega = 2*pi*1000; + +K = 1/(Hh*G) * 1/((1+s/omega+(s/omega)^2)); K = zpk(minreal(K)); #+end_src @@ -4027,200 +4163,119 @@ tiledlayout(3, 1, 'TileSpacing', 'Compact', 'Padding', 'None'); % Magnitude ax1 = nexttile([2, 1]); -hold on; -plot(freqs, abs(squeeze(freqresp(K, freqs, 'Hz'))), 'k-'); +plot(freqs, abs(squeeze(freqresp(K*Hl, freqs, 'Hz'))), 'k-'); set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); ylabel('Magnitude'); set(gca, 'XTickLabel',[]); ylim([8e3, 1e8]) -hold off; % Phase ax2 = nexttile; -hold on; -plot(freqs, 180/pi*angle(squeeze(freqresp(K, freqs, 'Hz'))), 'k-'); +plot(freqs, 180/pi*angle(squeeze(freqresp(K*Hl, freqs, 'Hz'))), 'k-'); set(gca,'xscale','log'); -yticks(-180:90:180); -ylim([-180 180]); +yticks(-180:45:180); +ylim([-180 45]); xlabel('Frequency [Hz]'); ylabel('Phase [deg]'); -hold off; linkaxes([ax1,ax2],'x'); xlim([freqs(1), freqs(end)]); #+end_src #+begin_src matlab :tangle no :exports results :results file replace -exportFig('figs/detail_control_cf_bode_Kfb.pdf', 'width', 'half', 'height', 600); +exportFig('figs/detail_control_cf_bode_Kfb.pdf', 'width', 'half', 'height', 500); #+end_src -It is implemented as shown on Figure ref:fig:detail_control_cf_mech_sys_alone_ctrl. +**** Robustness and Performance analysis +The robust stability can be access on the Nyquist plot (Figure ref:fig:detail_control_cf_nyquist_robustness). +Even when considering all the possible plants in the uncertainty set, the nyquist plot stays away from the unstable point, indicating good robustness. -#+begin_src latex :file detail_control_cf_mech_sys_alone_ctrl.pdf -\tikzset{block/.default={0.8cm}{0.6cm}} -\tikzset{addb/.append style={scale=0.7}} -\tikzset{node distance=0.6} -\def\cdist{0.7} - -\begin{tikzpicture} - % ==================== - % Parameters - % ==================== - \def\massw{2.2} % Width of the masses - \def\massh{0.8} % Height of the masses - \def\spaceh{1.2} % Height of the springs/dampers - \def\dispw{0.3} % Width of the dashed line for the displacement - \def\disph{0.5} % Height of the arrow for the displacements - \def\bracs{0.05} % Brace spacing vertically - \def\brach{-10pt} % Brace shift horizontaly - % ==================== - - - % ==================== - % Ground - % ==================== - \draw (-0.5*\massw, 0) -- (0.5*\massw, 0); - \draw[dashed] (0.5*\massw, 0) -- ++(\dispw, 0); - \draw[->] (0.5*\massw+0.5*\dispw, 0) -- ++(0, \disph) node[below right]{$w$}; - % ==================== - - \begin{scope}[shift={(0, 0)}] - % Mass - \draw[fill=white] (-0.5*\massw, \spaceh) rectangle (0.5*\massw, \spaceh+\massh) node[pos=0.5]{$m$}; - - % Spring, Damper, and Actuator - \draw[spring] (-0.4*\massw, 0) -- (-0.4*\massw, \spaceh) node[midway, left=0.1]{$k$}; - \draw[damper] (0, 0) -- ( 0, \spaceh) node[midway, left=0.2]{$c$}; - \draw[actuator] ( 0.4*\massw, 0) -- ( 0.4*\massw, \spaceh) coordinate[midway, right=0.15](F); - - % Displacements - \draw[dashed] (0.5*\massw, \spaceh) -- ++(\dispw, 0); - \draw[->] (0.5*\massw+0.5*\dispw, \spaceh) -- ++(0, \disph) node[right](x){$x$}; - \end{scope} - - \node[block, right=1 of F] (Kfb) {$K$}; - \node[addb={+}{}{-}{}{}, right=2*\cdist of Kfb] (add) {}; - \node[addb] (addn) at (x-|Kfb) {}; - \node[block, right=of addn] (Hl) {$H_L$}; - - \draw[->] (x) -- (addn.west); - \draw[->] (addn.east) -- (Hl.west); - \draw[->] (Hl.east) -| (add.north); - \draw[->] (add.west) -- (Kfb.east); - \draw[->] (Kfb.west) -- (F) node[above right]{$F$}; - \draw[<-] (addn.north) -- ++(0,\cdist) node[below right]{$n$}; - \draw[<-] (add.east) -- ++(\cdist,0) node[above left]{$r$}; -\end{tikzpicture} -#+end_src - -#+name: fig:detail_control_cf_mech_sys_alone_ctrl -#+caption: Control of a positioning system -#+RESULTS: -[[file:figs/detail_control_cf_mech_sys_alone_ctrl.png]] - -#+begin_src matlab :exports none :results none -%% Bode plot of the loop gain K G H_L -figure; -tiledlayout(3, 1, 'TileSpacing', 'Compact', 'Padding', 'None'); - -% Magnitude -ax1 = nexttile([2, 1]); -hold on; -plot(freqs, abs(squeeze(freqresp(K*G*Hl_hinf, freqs, 'Hz'))), 'k-'); -set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); -set(gca, 'XTickLabel',[]); -ylabel('Loop Gain'); -hold off; -ylim([1e-3, 1e2]) - -% Phase -ax2 = nexttile; -hold on; -plot(freqs, 180/pi*unwrap(angle(squeeze(freqresp(K*G*Hl_hinf, freqs, 'Hz')))), 'k-'); -set(gca,'xscale','log'); -yticks(-270:90:0); -ylim([-270 0]); -xlabel('Frequency [Hz]'); ylabel('Phase [deg]'); -hold off; - -linkaxes([ax1,ax2],'x'); -xlim([freqs(1), freqs(end)]); -#+end_src - -#+begin_src matlab :tangle no :exports results :results file replace -exportFig('figs/detail_control_cf_bode_plot_loop_gain_robustness.pdf', 'width', 'half', 'height', 600); -#+end_src - -#+name: fig:detail_control_cf_bode_Kfb_loop_gain -#+caption: Caption with reference to sub figure (\subref{fig:detail_control_cf_bode_Kfb}) (\subref{fig:detail_control_cf_bode_plot_loop_gain_robustness}) -#+attr_latex: :options [htbp] -#+begin_figure -#+attr_latex: :caption \subcaption{\label{fig:detail_control_cf_bode_Kfb}Controller $K$} -#+attr_latex: :options {0.49\textwidth} -#+begin_subfigure -#+attr_latex: :width 0.95\linewidth -[[file:figs/detail_control_cf_bode_Kfb.png]] -#+end_subfigure -#+attr_latex: :caption \subcaption{\label{fig:detail_control_cf_bode_plot_loop_gain_robustness}Loop Gain} -#+attr_latex: :options {0.49\textwidth} -#+begin_subfigure -#+attr_latex: :width 0.95\linewidth -[[file:figs/detail_control_cf_bode_plot_loop_gain_robustness.png]] -#+end_subfigure -#+end_figure - -**** Robustness analysis -The robust stability can be access on the nyquist plot (Figure ref:fig:detail_control_cf_nyquist_robustness). +The performance is evaluated by looking at the closed-loop sensitivity and complementary sensitivity transfer functions (Figure ref:fig:detail_control_cf_robust_perf). #+begin_src matlab -Gds = usample(G*(1+wI*ultidyn('Delta', [1 1])), 20); +num_delta_points = 50; +theta = linspace(0, 2*pi, num_delta_points); +delta_points = exp(1j * theta); -S = 1/(K*G*Hl_hinf + 1); -T = K*G*Hl_hinf/(K*G*Hl_hinf + 1); +% Get frequency responses for all components +G_resp = squeeze(freqresp(G, freqs, 'Hz')); +K_resp = squeeze(freqresp(K, freqs, 'Hz')); +Hl_resp = squeeze(freqresp(Hl, freqs, 'Hz')); +wI_resp = squeeze(freqresp(wI, freqs, 'Hz')); -Ts = Gds*K*Hl_hinf/(Gds*K*Hl_hinf + 1); -Ss = 1/(Gds*K*Hl_hinf + 1); +% Calculate nominal responses +nom_L = G_resp .* K_resp .* Hl_resp; +nom_S = 1 ./ (1 + nom_L); +nom_T = nom_L ./ (1 + nom_L); + +% Store all the points in the complex plane that L can take +loop_region_points = zeros(length(freqs), num_delta_points); + +% Initialize arrays to store magnitude bounds +S_mag_min = ones(length(freqs), 1) * inf; +S_mag_max = zeros(length(freqs), 1); +T_mag_min = ones(length(freqs), 1) * inf; +T_mag_max = zeros(length(freqs), 1); + +% Calculate magnitude bounds for all delta values +for i = 1:num_delta_points + % Perturbed loop gain + loop_perturbed = nom_L .* (1 + wI_resp .* delta_points(i)); + loop_region_points(:,i) = loop_perturbed; + + % Perturbed sensitivity function + S_perturbed = 1 ./ (1 + loop_perturbed); + S_mag = abs(S_perturbed); + + % Update S magnitude bounds + S_mag_min = min(S_mag_min, S_mag); + S_mag_max = max(S_mag_max, S_mag); + + % Perturbed complementary sensitivity function + T_perturbed = loop_perturbed ./ (1 + loop_perturbed); + T_mag = abs(T_perturbed); + + % Update T magnitude bounds + T_mag_min = min(T_mag_min, T_mag); + T_mag_max = max(T_mag_max, T_mag); +end + +% At frequencies where |wI| > 1, T min is zero +T_mag_min(abs(wI_resp)>1) = 1e-10; #+end_src -#+begin_src matlab :exports none :results none -%% Nyquist plot of the uncertain system -freqs_nyquist = logspace(0, 4, 100); - +#+begin_src matlab +%% Nyquist plot to check Robust Stability figure; hold on; -for i=1:length(Gds) - plot(real(squeeze(freqresp(Gds(:, :, i)*K*Hl_hinf, freqs_nyquist, 'Hz'))), imag(squeeze(freqresp(Gds(:, :, i)*K*Hl_hinf, freqs_nyquist, 'Hz'))), 'color', [0, 0, 0, 0.1]); -end -plot(real(squeeze(freqresp(G*K*Hl_hinf, freqs_nyquist, 'Hz'))), imag(squeeze(freqresp(G*K*Hl_hinf, freqs_nyquist, 'Hz'))), 'k'); +plot(real(squeeze(freqresp(G*K*Hl, freqs, 'Hz'))), imag(squeeze(freqresp(G*K*Hl, freqs, 'Hz'))), 'k', 'DisplayName', '$L(j\omega)$ - Nominal'); +plot(alphaShape(real(loop_region_points(:)), imag(loop_region_points(:)), 0.1), 'FaceColor', [0, 0, 0], 'EdgeColor', 'none', 'FaceAlpha', 0.3, 'DisplayName', '$L(j\omega)$ - $\forall G \in \Pi_i$'); +plot(-1, 0, 'k+', 'MarkerSize', 5, 'HandleVisibility', 'off'); hold off; +grid on; axis equal -xlim([-1.4, 0.2]); ylim([-1.4, 0.2]); -xticks(-1.4:0.2:0.2); yticks(-1.4:0.2:0.2); +xlim([-1.4, 0.2]); ylim([-1.2, 0.4]); +xticks(-1.4:0.2:0.2); yticks(-1.2:0.2:0.4); xlabel('Real Part'); ylabel('Imaginary Part'); +leg = legend('location', 'southeast', 'FontSize', 8, 'NumColumns', 1); +leg.ItemTokenSize(1) = 18; #+end_src #+begin_src matlab :tangle no :exports results :results file replace exportFig('figs/detail_control_cf_nyquist_robustness', 'width', 'half', 'height', 'normal'); #+end_src -The robust performance is shown on Figure ref:fig:detail_control_cf_robust_perf. - #+begin_src matlab :exports none :results none %% Robust Performance figure; hold on; -for i=1:length(Gds) - plot(freqs, abs(squeeze(freqresp(Ts(:, :, i), freqs, 'Hz'))), 'color', [0, 0.4470, 0.7410, 0.1] , 'HandleVisibility', 'off'); - plot(freqs, abs(squeeze(freqresp(Ss(:, :, i), freqs, 'Hz'))), 'color', [0.8500, 0.3250, 0.0980, 0.1], 'HandleVisibility', 'off'); -end +plot(freqs, abs(nom_S), 'color', colors(2,:), 'DisplayName', '$|S|$ - Nom.'); +plot(freqs, abs(nom_T), 'color', colors(1,:), 'DisplayName', '$|T|$ - Nom.'); -set(gca,'ColorOrderIndex',1) -plot(freqs, abs(squeeze(freqresp(G*K*Hl_hinf/(1+G*K*Hl_hinf), freqs, 'Hz'))), 'DisplayName', '$|T|$'); -set(gca,'ColorOrderIndex',2) -plot(freqs, abs(squeeze(freqresp(1/(1+G*K*Hl_hinf), freqs, 'Hz'))), 'DisplayName', '$|S|$'); +patch([freqs, fliplr(freqs)], [S_mag_max', fliplr(S_mag_min')], colors(2,:), 'FaceAlpha', 0.2, 'EdgeColor', 'none', 'HandleVisibility', 'off'); +patch([freqs, fliplr(freqs)], [T_mag_max', fliplr(T_mag_min')], colors(1,:), 'FaceAlpha', 0.2, 'EdgeColor', 'none', 'HandleVisibility', 'off'); -set(gca,'ColorOrderIndex',1) -plot([100, 1000], [0.1, 0.001], ':', 'DisplayName', '$|T|$ - Spec.'); -set(gca,'ColorOrderIndex',2) -plot([0.1, 0.2, 2], [0.001, 0.001, 0.1], ':', 'DisplayName', '$|S|$ - Spec.'); +plot([1, 100], [0.01, 100], ':', 'color', colors(2,:), 'DisplayName', 'Specs.'); +plot([300, 1000], [0.01, 0.01], ':', 'color', colors(1,:), 'DisplayName', 'Specs.'); +plot(freqs, 1./abs(squeeze(freqresp(wI, freqs, 'Hz'))), ':', 'color', colors(1,:), 'HandleVisibility', 'off'); set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); hold off; @@ -4228,7 +4283,8 @@ xlabel('Frequency [Hz]'); ylabel('Magnitude'); xlim([freqs(1), freqs(end)]); ylim([1e-4, 5]); xticks([0.1, 1, 10, 100, 1000]); -legend('location', 'southeast', 'FontSize', 8, 'NumColumns', 2); +leg = legend('location', 'southwest', 'FontSize', 8, 'NumColumns', 3); +leg.ItemTokenSize(1) = 18; #+end_src #+begin_src matlab :tangle no :exports results :results file replace @@ -4236,7 +4292,7 @@ exportFig('figs/detail_control_cf_robust_perf.pdf', 'width', 'half', 'height', ' #+end_src #+name: fig:detail_control_cf_simulation_results -#+caption: Caption with reference to sub figure (\subref{fig:detail_control_cf_nyquist_robustness}) (\subref{fig:detail_control_cf_robust_perf}) +#+caption: Validation of Robust stability with the Nyquist plot (\subref{fig:detail_control_cf_nyquist_robustness}) and validation of the nominal and robust performance with the magnitude of the closed-loop transfer functions (\subref{fig:detail_control_cf_robust_perf}) #+attr_latex: :options [htbp] #+begin_figure #+attr_latex: :caption \subcaption{\label{fig:detail_control_cf_nyquist_robustness}Robust Stability} @@ -4245,7 +4301,7 @@ exportFig('figs/detail_control_cf_robust_perf.pdf', 'width', 'half', 'height', ' #+attr_latex: :scale 0.8 [[file:figs/detail_control_cf_nyquist_robustness.png]] #+end_subfigure -#+attr_latex: :caption \subcaption{\label{fig:detail_control_cf_robust_perf}Robust performance} +#+attr_latex: :caption \subcaption{\label{fig:detail_control_cf_robust_perf}Nominal and Robust performance} #+attr_latex: :options {0.49\textwidth} #+begin_subfigure #+attr_latex: :scale 0.8 @@ -4253,20 +4309,21 @@ exportFig('figs/detail_control_cf_robust_perf.pdf', 'width', 'half', 'height', ' #+end_subfigure #+end_figure -** TODO [#C] Experimental Validation? -<> - -[[file:~/Cloud/research/papers/dehaeze20_virtu_senso_fusio/matlab/index.org::*Experimental Validation][Experimental Validation]] - ** Conclusion :PROPERTIES: :UNNUMBERED: t :END: +- [ ] Say that the presented control architecture in this section + No ambition to overcome fundamental limitations of current architectures. + Very similar to Internal Model Control [[cite:&saxena12_advan_inter_model_contr_techn]] + Had no time to proceed to an extensive literature review to find similar control architecture and to compare them. + Whether the propose architecture has advantages compared to already excising architecture in the literature is not clear. +- [ ] The control architecture was presented for a SISO system, but can be applied to MIMO if decoupling is sufficient. + It will be experimentally demonstrated with the NASS. - [ ] Discuss how useful it is as the bandwidth can be changed in real time with analytical formulas of second order complementary filters. Maybe make a section about that. Maybe give analytical formulas of second order complementary filters in the digital domain? -- [ ] Say that it will be validated with the nano-hexapod - [ ] Disadvantages: - not optimal - computationally intensive? @@ -4373,100 +4430,105 @@ H1 = 1 - H2; ** =plotMagUncertainty= #+begin_src matlab :tangle matlab/src/plotMagUncertainty.m :comments none :mkdirp yes :eval no - function [p] = plotMagUncertainty(W, freqs, args) - % plotMagUncertainty - - % - % Syntax: [p] = plotMagUncertainty(W, freqs, args) - % - % Inputs: - % - W - Multiplicative Uncertainty Weight - % - freqs - Frequency Vector [Hz] - % - args - Optional Arguments: - % - G - % - color_i - % - opacity - % - % Outputs: - % - p - Plot Handle +function [p] = plotMagUncertainty(W, freqs, args) +% plotMagUncertainty - +% +% Syntax: [p] = plotMagUncertainty(W, freqs, args) +% +% Inputs: +% - W - Multiplicative Uncertainty Weight +% - freqs - Frequency Vector [Hz] +% - args - Optional Arguments: +% - G +% - color_i +% - opacity +% +% Outputs: +% - p - Plot Handle - arguments - W - freqs double {mustBeNumeric, mustBeNonnegative} - args.G = tf(1) - args.color_i (1,1) double {mustBeInteger, mustBeNonnegative} = 0 - args.opacity (1,1) double {mustBeNumeric, mustBeNonnegative} = 0.3 - args.DisplayName char = '' - end + arguments + W + freqs double {mustBeNumeric, mustBeNonnegative} + args.G = tf(1) + args.color_i (1,1) double {mustBeInteger, mustBeNonnegative} = 0 + args.opacity (1,1) double {mustBeNumeric, mustBeNonnegative} = 0.3 + args.DisplayName char = '' + end - % Get defaults colors - colors = get(groot, 'defaultAxesColorOrder'); + % Get defaults colors + colors = get(groot, 'defaultAxesColorOrder'); - p = patch([freqs flip(freqs)], ... - [abs(squeeze(freqresp(args.G, freqs, 'Hz'))).*(1 + abs(squeeze(freqresp(W, freqs, 'Hz')))); ... - flip(abs(squeeze(freqresp(args.G, freqs, 'Hz'))).*max(1 - abs(squeeze(freqresp(W, freqs, 'Hz'))), 1e-6))], 'w', ... - 'DisplayName', args.DisplayName); + p = patch([freqs flip(freqs)], ... + [abs(squeeze(freqresp(args.G, freqs, 'Hz'))).*(1 + abs(squeeze(freqresp(W, freqs, 'Hz')))); ... + flip(abs(squeeze(freqresp(args.G, freqs, 'Hz'))).*max(1 - abs(squeeze(freqresp(W, freqs, 'Hz'))), 1e-6))], 'w', ... + 'DisplayName', args.DisplayName); - if args.color_i == 0 - p.FaceColor = [0; 0; 0]; - else - p.FaceColor = colors(args.color_i, :); - end - p.EdgeColor = 'none'; - p.FaceAlpha = args.opacity; + if args.color_i == 0 + p.FaceColor = [0; 0; 0]; + else + p.FaceColor = colors(args.color_i, :); + end + p.EdgeColor = 'none'; + p.FaceAlpha = args.opacity; - end +end #+end_src ** =plotPhaseUncertainty= #+begin_src matlab :tangle matlab/src/plotPhaseUncertainty.m :comments none :mkdirp yes :eval no - function [p] = plotPhaseUncertainty(W, freqs, args) - % plotPhaseUncertainty - - % - % Syntax: [p] = plotPhaseUncertainty(W, freqs, args) - % - % Inputs: - % - W - Multiplicative Uncertainty Weight - % - freqs - Frequency Vector [Hz] - % - args - Optional Arguments: - % - G - % - color_i - % - opacity - % - % Outputs: - % - p - Plot Handle +function [p] = plotPhaseUncertainty(W, freqs, args) +% plotPhaseUncertainty - +% +% Syntax: [p] = plotPhaseUncertainty(W, freqs, args) +% +% Inputs: +% - W - Multiplicative Uncertainty Weight +% - freqs - Frequency Vector [Hz] +% - args - Optional Arguments: +% - G +% - color_i +% - opacity +% +% Outputs: +% - p - Plot Handle - arguments - W - freqs double {mustBeNumeric, mustBeNonnegative} - args.G = tf(1) - args.color_i (1,1) double {mustBeInteger, mustBeNonnegative} = 0 - args.opacity (1,1) double {mustBeNumeric, mustBePositive} = 0.3 - args.DisplayName char = '' - end + arguments + W + freqs double {mustBeNumeric, mustBeNonnegative} + args.G = tf(1) + args.unwrap logical {mustBeNumericOrLogical} = false + args.color_i (1,1) double {mustBeInteger, mustBeNonnegative} = 0 + args.opacity (1,1) double {mustBeNumeric, mustBePositive} = 0.3 + args.DisplayName char = '' + end - % Get defaults colors - colors = get(groot, 'defaultAxesColorOrder'); + % Get defaults colors + colors = get(groot, 'defaultAxesColorOrder'); - % Compute Phase Uncertainty - Dphi = 180/pi*asin(abs(squeeze(freqresp(W, freqs, 'Hz')))); - Dphi(abs(squeeze(freqresp(W, freqs, 'Hz'))) > 1) = 360; + % Compute Phase Uncertainty + Dphi = 180/pi*asin(abs(squeeze(freqresp(W, freqs, 'Hz')))); + Dphi(abs(squeeze(freqresp(W, freqs, 'Hz'))) > 1) = 360; - % Compute Plant Phase - G_ang = 180/pi*angle(squeeze(freqresp(args.G, freqs, 'Hz'))); + % Compute Plant Phase + if args.unwrap + G_ang = 180/pi*unwrap(angle(squeeze(freqresp(args.G, freqs, 'Hz')))); + else + G_ang = 180/pi*angle(squeeze(freqresp(args.G, freqs, 'Hz'))); + end - p = patch([freqs flip(freqs)], [G_ang+Dphi; flip(G_ang-Dphi)], 'w', ... - 'DisplayName', args.DisplayName); + p = patch([freqs flip(freqs)], [G_ang+Dphi; flip(G_ang-Dphi)], 'w', ... + 'DisplayName', args.DisplayName); - if args.color_i == 0 - p.FaceColor = [0; 0; 0]; - else - p.FaceColor = colors(args.color_i, :); - end - p.EdgeColor = 'none'; - p.FaceAlpha = args.opacity; + if args.color_i == 0 + p.FaceColor = [0; 0; 0]; + else + p.FaceColor = colors(args.color_i, :); + end + p.EdgeColor = 'none'; + p.FaceAlpha = args.opacity; - end +end #+end_src * Helping Functions :noexport: ** Initialize Path diff --git a/nass-control.pdf b/nass-control.pdf index fb0a646..84082a9 100644 Binary files a/nass-control.pdf and b/nass-control.pdf differ diff --git a/nass-control.tex b/nass-control.tex index 7258ec9..17b8f15 100644 --- a/nass-control.tex +++ b/nass-control.tex @@ -1,4 +1,4 @@ -% Created 2025-04-05 Sat 22:48 +% Created 2025-04-07 Mon 23:14 % Intended LaTeX compiler: pdflatex \documentclass[a4paper, 10pt, DIV=12, parskip=full, bibliography=totoc]{scrreprt} @@ -25,6 +25,16 @@ \clearpage When controlling a MIMO system (specifically parallel manipulator such as the Stewart platform?) +\begin{itemize} +\item[{$\square$}] \textbf{Should the quick review of Stewart platform control be here?} +In that case it should be possible to highlight three areas: +\begin{itemize} +\item use of multiple sensors +\item decoupling strategy +\item control optimization +\end{itemize} +\end{itemize} + Several considerations: \begin{itemize} \item Section \ref{sec:detail_control_sensor}: How to most effectively use/combine multiple sensors @@ -159,7 +169,7 @@ For sensor fusion applications, both methods are sharing many relationships \cit However, for Kalman filtering, assumptions must be made about the probabilistic character of the sensor noises \cite{robert12_introd_random_signal_applied_kalman} whereas it is not the case with complementary filters. Furthermore, the advantages of complementary filters over Kalman filtering for sensor fusion are their general applicability, their low computational cost \cite{higgins75_compar_compl_kalman_filter}, and the fact that they are intuitive as their effects can be easily interpreted in the frequency domain. -A set of filters is said to be complementary if the sum of their trancfer functions is equal to one at all frequencies. +A set of filters is said to be complementary if the sum of their transfer functions is equal to one at all frequencies. In the early days of complementary filtering, analog circuits were employed to physically realize the filters \cite{anderson53_instr_approac_system_steer_comput}. Analog complementary filters are still used today \cite{yong16_high_speed_vertic_posit_stage,moore19_capac_instr_sensor_fusion_high_bandw_nanop}, but most of the time they are now implemented digitally as it allows for much more flexibility. @@ -185,7 +195,7 @@ Based on that, this work introduces a new way to design complementary filters us Complementary filtering provides a framework for fusing signals from different sensors. As the effectiveness of the fusion depends on the proper design of the complementary filters, they are expected to fulfill certain requirements. These requirements are discussed in this section. -\paragraph{Sensor Fusion Architecture} +\subsubsection{Sensor Fusion Architecture} A general sensor fusion architecture using complementary filters is shown in Figure \ref{fig:detail_control_sensor_fusion_overview} where several sensors (here two) are measuring the same physical quantity \(x\). The two sensors output signals \(\hat{x}_1\) and \(\hat{x}_2\) are estimates of \(x\). @@ -200,13 +210,13 @@ This means that the super sensor provides an estimate \(\hat{x}\) of \(x\) which \caption{\label{fig:detail_control_sensor_fusion_overview}Schematic of a sensor fusion architecture using complementary filters.} \end{figure} -The complementary property of filters \(H_1(s)\) and \(H_2(s)\) implies that the sum of their trancfer functions is equal to one \eqref{eq:detail_control_sensor_comp_filter}. +The complementary property of filters \(H_1(s)\) and \(H_2(s)\) implies that the sum of their transfer functions is equal to one \eqref{eq:detail_control_sensor_comp_filter}. That is, unity magnitude and zero phase at all frequencies. \begin{equation}\label{eq:detail_control_sensor_comp_filter} H_1(s) + H_2(s) = 1 \end{equation} -\paragraph{Sensor Models and Sensor Normalization} +\subsubsection{Sensor Models and Sensor Normalization} In order to study such sensor fusion architecture, a model for the sensors is required. Such model is shown in Figure \ref{fig:detail_control_sensor_model} and consists of a linear time invariant (LTI) system \(G_i(s)\) representing the sensor dynamics and an input \(n_i\) representing the sensor noise. @@ -216,14 +226,14 @@ Before filtering the sensor outputs \(\tilde{x}_i\) by the complementary filters This normalization consists of using an estimate \(\hat{G}_i(s)\) of the sensor dynamics \(G_i(s)\), and filtering the sensor output by the inverse of this estimate \(\hat{G}_i^{-1}(s)\) as shown in Figure \ref{fig:detail_control_sensor_model_calibrated}. It is here supposed that the sensor inverse \(\hat{G}_i^{-1}(s)\) is proper and stable. This way, the units of the estimates \(\hat{x}_i\) are equal to the units of the physical quantity \(x\). -The sensor dynamics estimate \(\hat{G}_i(s)\) can be a simple gain or a more complex trancfer function. +The sensor dynamics estimate \(\hat{G}_i(s)\) can be a simple gain or a more complex transfer function. \begin{figure}[htbp] \begin{subfigure}{0.48\textwidth} \begin{center} \includegraphics[scale=1,scale=1]{figs/detail_control_sensor_model.png} \end{center} -\subcaption{\label{fig:detail_control_sensor_model}Basic sensor model consisting of a noise input $n_i$ and a linear time invariant trancfer function $G_i(s)$} +\subcaption{\label{fig:detail_control_sensor_model}Basic sensor model consisting of a noise input $n_i$ and a linear time invariant transfer function $G_i(s)$} \end{subfigure} \begin{subfigure}{0.48\textwidth} \begin{center} @@ -248,7 +258,7 @@ The super sensor output \(\hat{x}\) is therefore described by \eqref{eq:detail_c \includegraphics[scale=1]{figs/detail_control_sensor_fusion_super_sensor.png} \caption{\label{fig:detail_control_sensor_fusion_super_sensor}Sensor fusion architecture with two normalized sensors.} \end{figure} -\paragraph{Noise Sensor Filtering} +\subsubsection{Noise Sensor Filtering} First, suppose that all the sensors are perfectly normalized \eqref{eq:detail_control_sensor_perfect_dynamics}. The effect of a non-perfect normalization will be discussed afterwards. @@ -284,12 +294,12 @@ This is the simplest form of sensor fusion with complementary filters. However, the two sensors have usually high noise levels over distinct frequency regions. In such case, to lower the noise of the super sensor, the norm \(|H_1(j\omega)|\) has to be small when \(\Phi_{n_1}(\omega)\) is larger than \(\Phi_{n_2}(\omega)\) and the norm \(|H_2(j\omega)|\) has to be small when \(\Phi_{n_2}(\omega)\) is larger than \(\Phi_{n_1}(\omega)\). Hence, by properly shaping the norm of the complementary filters, it is possible to minimize the noise of the super sensor. -\paragraph{Sensor Fusion Robustness} +\subsubsection{Sensor Fusion Robustness} In practical systems the sensor normalization is not perfect and condition \eqref{eq:detail_control_sensor_perfect_dynamics} is not verified. In order to study such imperfection, a multiplicative input uncertainty is added to the sensor dynamics (Figure \ref{fig:detail_control_sensor_model_uncertainty}). -The nominal model is the estimated model used for the normalization \(\hat{G}_i(s)\), \(\Delta_i(s)\) is any stable trancfer function saticfying \(|\Delta_i(j\omega)| \le 1,\ \forall\omega\), and \(w_i(s)\) is a weighting trancfer function representing the magnitude of the uncertainty. +The nominal model is the estimated model used for the normalization \(\hat{G}_i(s)\), \(\Delta_i(s)\) is any stable transfer function satisfying \(|\Delta_i(j\omega)| \le 1,\ \forall\omega\), and \(w_i(s)\) is a weighting transfer function representing the magnitude of the uncertainty. The weight \(w_i(s)\) is chosen such that the real sensor dynamics \(G_i(j\omega)\) is contained in the uncertain region represented by a circle in the complex plane, centered on \(1\) and with a radius equal to \(|w_i(j\omega)|\). As the nominal sensor dynamics is taken as the normalized filter, the normalized sensor can be further simplified as shown in Figure \ref{fig:detail_control_sensor_model_uncertainty_simplified}. @@ -350,11 +360,11 @@ Therefore, a synthesis method of complementary filters that allows to shape thei In this section, such synthesis is proposed by writing the synthesis objective as a standard \(\mathcal{H}_\infty\) optimization problem. As weighting functions are used to represent the wanted complementary filters' shape during the synthesis, their proper design is discussed. Finally, the synthesis method is validated on an simple example. -\paragraph{Synthesis Objective} +\subsubsection{Synthesis Objective} The synthesis objective is to shape the norm of two filters \(H_1(s)\) and \(H_2(s)\) while ensuring their complementary property \eqref{eq:detail_control_sensor_comp_filter}. -This is equivalent as to finding proper and stable trancfer functions \(H_1(s)\) and \(H_2(s)\) such that conditions \eqref{eq:detail_control_sensor_hinf_cond_complementarity}, \eqref{eq:detail_control_sensor_hinf_cond_h1} and \eqref{eq:detail_control_sensor_hinf_cond_h2} are saticfied. -\(W_1(s)\) and \(W_2(s)\) are two weighting trancfer functions that are carefully chosen to specify the maximum wanted norm of the complementary filters during the synthesis. +This is equivalent as to finding proper and stable transfer functions \(H_1(s)\) and \(H_2(s)\) such that conditions \eqref{eq:detail_control_sensor_hinf_cond_complementarity}, \eqref{eq:detail_control_sensor_hinf_cond_h1} and \eqref{eq:detail_control_sensor_hinf_cond_h2} are satisfied. +\(W_1(s)\) and \(W_2(s)\) are two weighting transfer functions that are carefully chosen to specify the maximum wanted norm of the complementary filters during the synthesis. \begin{subequations}\label{eq:detail_control_sensor_comp_filter_problem_form} \begin{align} @@ -363,7 +373,7 @@ This is equivalent as to finding proper and stable trancfer functions \(H_1(s)\) & |H_2(j\omega)| \le \frac{1}{|W_2(j\omega)|} \quad \forall\omega \label{eq:detail_control_sensor_hinf_cond_h2} \end{align} \end{subequations} -\paragraph{Shaping of Complementary Filters using \(\mathcal{H}_\infty\) synthesis} +\subsubsection{Shaping of Complementary Filters using \(\mathcal{H}_\infty\) synthesis} The synthesis objective can be easily expressed as a standard \(\mathcal{H}_\infty\) optimization problem and therefore solved using convenient tools readily available. Consider the generalized plant \(P(s)\) shown in Figure \ref{fig:detail_control_sensor_h_infinity_robust_fusion_plant} and mathematically described by \eqref{eq:detail_control_sensor_generalized_plant}. @@ -394,7 +404,7 @@ Applying the standard \(\mathcal{H}_\infty\) synthesis to the generalized plant \left\|\begin{matrix} \left(1 - H_2(s)\right) W_1(s) \\ H_2(s) W_2(s) \end{matrix}\right\|_\infty \le 1 \end{equation} -By then defining \(H_1(s)\) to be the complementary of \(H_2(s)\) \eqref{eq:detail_control_sensor_definition_H1}, the \(\mathcal{H}_\infty\) synthesis objective becomes equivalent to \eqref{eq:detail_control_sensor_hinf_problem} which ensures that \eqref{eq:detail_control_sensor_hinf_cond_h1} and \eqref{eq:detail_control_sensor_hinf_cond_h2} are saticfied. +By then defining \(H_1(s)\) to be the complementary of \(H_2(s)\) \eqref{eq:detail_control_sensor_definition_H1}, the \(\mathcal{H}_\infty\) synthesis objective becomes equivalent to \eqref{eq:detail_control_sensor_hinf_problem} which ensures that \eqref{eq:detail_control_sensor_hinf_cond_h1} and \eqref{eq:detail_control_sensor_hinf_cond_h2} are satisfied. \begin{equation}\label{eq:detail_control_sensor_definition_H1} H_1(s) \triangleq 1 - H_2(s) @@ -408,12 +418,12 @@ Therefore, applying the \(\mathcal{H}_\infty\) synthesis to the standard plant \ Note that there is only an implication between the \(\mathcal{H}_\infty\) norm condition \eqref{eq:detail_control_sensor_hinf_problem} and the initial synthesis objectives \eqref{eq:detail_control_sensor_hinf_cond_h1} and \eqref{eq:detail_control_sensor_hinf_cond_h2} and not an equivalence. Hence, the optimization may be a little bit conservative with respect to the set of filters on which it is performed, see \cite[,Chap. 2.8.3]{skogestad07_multiv_feedb_contr}. -\paragraph{Weighting Functions Design} +\subsubsection{Weighting Functions Design} Weighting functions are used during the synthesis to specify the maximum allowed complementary filters' norm. The proper design of these weighting functions is of primary importance for the success of the presented \(\mathcal{H}_\infty\) synthesis of complementary filters. -First, only proper and stable trancfer functions should be used. +First, only proper and stable transfer functions should be used. Second, the order of the weighting functions should stay reasonably small in order to reduce the computational costs associated with the solving of the optimization problem and for the physical implementation of the filters (the synthesized filters' order being equal to the sum of the weighting functions' order). Third, one should not forget the fundamental limitations imposed by the complementary property \eqref{eq:detail_control_sensor_comp_filter}. This implies for instance that \(|H_1(j\omega)|\) and \(|H_2(j\omega)|\) cannot be made small at the same frequency. @@ -439,7 +449,7 @@ The typical magnitude of a weighting function generated using \eqref{eq:detail_c }\right)^n \end{equation} \end{minipage} -\paragraph{Validation of the proposed synthesis method} +\subsubsection{Validation of the proposed synthesis method} The proposed methodology for the design of complementary filters is now applied on a simple example. Let's suppose two complementary filters \(H_1(s)\) and \(H_2(s)\) have to be designed such that: @@ -481,7 +491,7 @@ Parameter & \(W_1(s)\) & \(W_2(s)\)\\ \end{minipage} The standard \(\mathcal{H}_\infty\) synthesis is then applied to the generalized plant of Figure \ref{fig:detail_control_sensor_h_infinity_robust_fusion_plant}. -The filter \(H_2(s)\) that minimizes the \(\mathcal{H}_\infty\) norm between \(w\) and \([z_1,\ z_2]^T\) is obtained. +The filter \(H_2(s)\) that minimizes the \(\mathcal{H}_\infty\) norm between \(w\) and \([z_1,\ z_2]^{\intercal}\) is obtained. The \(\mathcal{H}_\infty\) norm is here found to be close to one which indicates that the synthesis is succescful: the complementary filters norms are below the maximum specified upper bounds. This is confirmed by the bode plots of the obtained complementary filters in Figure \ref{fig:detail_control_sensor_hinf_filters_results}. This simple example illustrates the fact that the proposed methodology for complementary filters shaping is easy to use and effective. @@ -514,7 +524,7 @@ A generalization of the proposed synthesis method of complementary filters is pr \caption{\label{fig:detail_control_sensor_fusion_three}Possible sensor fusion architecture when more than two sensors are to be merged} \end{figure} -The synthesis objective is to compute a set of \(n\) stable trancfer functions \([H_1(s),\ H_2(s),\ \dots,\ H_n(s)]\) such that conditions \eqref{eq:detail_control_sensor_hinf_cond_compl_gen} and \eqref{eq:detail_control_sensor_hinf_cond_perf_gen} are saticfied. +The synthesis objective is to compute a set of \(n\) stable transfer functions \([H_1(s),\ H_2(s),\ \dots,\ H_n(s)]\) such that conditions \eqref{eq:detail_control_sensor_hinf_cond_compl_gen} and \eqref{eq:detail_control_sensor_hinf_cond_perf_gen} are satisfied. \begin{subequations}\label{eq:detail_control_sensor_hinf_problem_gen} \begin{align} @@ -523,7 +533,7 @@ The synthesis objective is to compute a set of \(n\) stable trancfer functions \ \end{align} \end{subequations} -\([W_1(s),\ W_2(s),\ \dots,\ W_n(s)]\) are weighting trancfer functions that are chosen to specify the maximum complementary filters' norm during the synthesis. +\([W_1(s),\ W_2(s),\ \dots,\ W_n(s)]\) are weighting transfer functions that are chosen to specify the maximum complementary filters' norm during the synthesis. Such synthesis objective is closely related to the one described in Section \ref{ssec:detail_control_sensor_hinf_method}, and indeed the proposed synthesis method is a generalization of the one previously presented. A set of \(n\) complementary filters can be shaped by applying the standard \(\mathcal{H}_\infty\) synthesis to the generalized plant \(P_n(s)\) described by \eqref{eq:detail_control_sensor_generalized_plant_n_filters}. @@ -547,7 +557,7 @@ If the synthesis if succescful, a set of \(n-1\) filters \([H_2(s),\ H_3(s),\ \d \end{equation} \(H_1(s)\) is then defined using \eqref{eq:detail_control_sensor_h1_comp_h2_hn} which is ensuring the complementary property for the set of \(n\) filters \eqref{eq:detail_control_sensor_hinf_cond_compl_gen}. -Condition \eqref{eq:detail_control_sensor_hinf_cond_perf_gen} is saticfied thanks to \eqref{eq:detail_control_sensor_hinf_syn_obj_gen}. +Condition \eqref{eq:detail_control_sensor_hinf_cond_perf_gen} is satisfied thanks to \eqref{eq:detail_control_sensor_hinf_syn_obj_gen}. \begin{equation}\label{eq:detail_control_sensor_h1_comp_h2_hn} H_1(s) \triangleq 1 - \big[ H_2(s) + H_3(s) + \dots + H_n(s) \big] @@ -580,7 +590,7 @@ Consider the generalized plant \(P_3(s)\) shown in Figure \ref{fig:detail_contro \end{figure} The standard \(\mathcal{H}_\infty\) synthesis is performed on the generalized plant \(P_3(s)\). -Two filters \(H_2(s)\) and \(H_3(s)\) are obtained such that the \(\mathcal{H}_\infty\) norm of the closed-loop trancfer from \(w\) to \([z_1,\ z_2,\ z_3]\) of the system in Figure \ref{fig:detail_control_sensor_comp_filter_three_hinf_fb} is less than one. +Two filters \(H_2(s)\) and \(H_3(s)\) are obtained such that the \(\mathcal{H}_\infty\) norm of the closed-loop transfer from \(w\) to \([z_1,\ z_2,\ z_3]\) of the system in Figure \ref{fig:detail_control_sensor_comp_filter_three_hinf_fb} is less than one. Filter \(H_1(s)\) is defined using \eqref{eq:detail_control_sensor_h1_compl_h2_h3} thus ensuring the complementary property of the obtained set of filters. \begin{equation}\label{eq:detail_control_sensor_h1_compl_h2_h3} @@ -623,7 +633,7 @@ Experimental closed-loop control results using the hexapod have shown that contr \begin{itemize} \item[{$\boxtimes$}] Review of \href{file:///home/thomas/Cloud/work-projects/ID31-NASS/matlab/stewart-simscape/org/bibliography.org}{Decoupling Strategies} for stewart platforms \item[{$\square$}] Add some citations about different methods -\item[{$\square$}] Maybe trancform table into text +\item[{$\square$}] Maybe transform table into text \end{itemize} \begin{table}[htbp] @@ -732,7 +742,7 @@ In order to map the spring, damping and actuator forces to XY forces and Z torqu Then, the equation of motion linking the actuator forces \(\tau\) to the motion of the mass \(\bm{\mathcal{X}}_{\{M\}}\) is obtained. \begin{equation}\label{eq:detail_control_decoupling_plant_cartesian} - \bm{M}_{\{M\}} \ddot{\bm{\mathcal{X}}}_{\{M\}}(t) + \bm{J}_{\{M\}}^t \bm{\mathcal{C}} \bm{J}_{\{M\}} \dot{\bm{\mathcal{X}}}_{\{M\}}(t) + \bm{J}_{\{M\}}^t \bm{\mathcal{K}} \bm{J}_{\{M\}} \bm{\mathcal{X}}_{\{M\}}(t) = \bm{J}_{\{M\}}^t \bm{\tau}(t) + \bm{M}_{\{M\}} \ddot{\bm{\mathcal{X}}}_{\{M\}}(t) + \bm{J}_{\{M\}}^{\intercal} \bm{\mathcal{C}} \bm{J}_{\{M\}} \dot{\bm{\mathcal{X}}}_{\{M\}}(t) + \bm{J}_{\{M\}}^{\intercal} \bm{\mathcal{K}} \bm{J}_{\{M\}} \bm{\mathcal{X}}_{\{M\}}(t) = \bm{J}_{\{M\}}^{\intercal} \bm{\tau}(t) \end{equation} Matrices representing the payload inertia as well as the actuator stiffness and damping are shown in @@ -780,7 +790,7 @@ Parameters used for the following analysis are summarized in table \ref{tab:deta Let's first study the obtained dynamics in the frame of the struts. The equation of motion linking actuator forces \(\bm{\mathcal{\tau}}\) to strut relative motion \(\bm{\mathcal{L}}\) is obtained from \eqref{eq:detail_control_decoupling_plant_cartesian} by mapping the cartesian motion of the mass to the relative motion of the struts using the Jacobian matrix \(\bm{J}_{\{M\}}\) \eqref{eq:detail_control_decoupling_jacobian_CoM} . -The trancfer function from \(\bm{\mathcal{\tau}}\) to \(\bm{\mathcal{L}}\) is shown in equation \eqref{eq:detail_control_decoupling_plant_decentralized}. +The transfer function from \(\bm{\mathcal{\tau}}\) to \(\bm{\mathcal{L}}\) is shown in equation \eqref{eq:detail_control_decoupling_plant_decentralized}. \begin{center} \includegraphics[scale=1]{figs/detail_control_decoupling_control_struts.png} @@ -788,7 +798,7 @@ The trancfer function from \(\bm{\mathcal{\tau}}\) to \(\bm{\mathcal{L}}\) is sh \end{center} \begin{equation}\label{eq:detail_control_decoupling_plant_decentralized} - \frac{\bm{\mathcal{L}}}{\bm{\mathcal{\tau}}}(s) = \bm{G}_{\mathcal{L}}(s) = \left( \bm{J}_{\{M\}}^{-t} \bm{M}_{\{M\}} \bm{J}_{\{M\}}^{-1} s^2 + \bm{\mathcal{C}} s + \bm{\mathcal{K}} \right)^{-1} + \frac{\bm{\mathcal{L}}}{\bm{\mathcal{\tau}}}(s) = \bm{G}_{\mathcal{L}}(s) = \left( \bm{J}_{\{M\}}^{-\intercal} \bm{M}_{\{M\}} \bm{J}_{\{M\}}^{-1} s^2 + \bm{\mathcal{C}} s + \bm{\mathcal{K}} \right)^{-1} \end{equation} At low frequency the plant converges to a diagonal constant matrix whose diagonal elements are linked to the actuator stiffnesses \eqref{eq:detail_control_decoupling_plant_decentralized_low_freq}. @@ -810,14 +820,14 @@ Depending on the symmetry in the system, some diagonal elements may be equal (su \end{figure} \section{Jacobian Decoupling} \label{ssec:detail_control_decoupling_jacobian} -\paragraph{Jacobian Matrix} +\subsubsection{Jacobian Matrix} As already explained, the Jacobian matrix can be used to both convert strut velocity \(\dot{\mathcal{L}}\) to payload velocity and angular velocity \(\dot{\bm{\mathcal{X}}}_{\{O\}}\) and Convert actuators forces \(\bm{\tau}\) to forces/torque applied on the payload \(\bm{\mathcal{F}}_{\{O\}}\) \eqref{eq:detail_control_decoupling_jacobian}. \begin{subequations}\label{eq:detail_control_decoupling_jacobian} \begin{align} \dot{\bm{\mathcal{X}}}_{\{O\}} &= \bm{J}_{\{O\}} \dot{\bm{\mathcal{L}}}, \quad \dot{\bm{\mathcal{L}}} = \bm{J}_{\{O\}}^{-1} \dot{\bm{\mathcal{X}}}_{\{O\}} \\ - \bm{\mathcal{F}}_{\{O\}} &= \bm{J}_{\{O\}}^t \bm{\tau}, \quad \bm{\tau} = \bm{J}_{\{O\}}^{-t} \bm{\mathcal{F}}_{\{O\}} + \bm{\mathcal{F}}_{\{O\}} &= \bm{J}_{\{O\}}^{\intercal} \bm{\tau}, \quad \bm{\tau} = \bm{J}_{\{O\}}^{-\intercal} \bm{\mathcal{F}}_{\{O\}} \end{align} \end{subequations} @@ -830,17 +840,17 @@ The obtained plan (Figure \ref{fig:detail_control_jacobian_decoupling_arch}) has \begin{figure}[htbp] \centering \includegraphics[scale=1]{figs/detail_control_decoupling_control_jacobian.png} -\caption{\label{fig:detail_control_jacobian_decoupling_arch}Block diagram of the trancfer function from \(\bm{\mathcal{F}}_{\{O\}}\) to \(\bm{\mathcal{X}}_{\{O\}}\)} +\caption{\label{fig:detail_control_jacobian_decoupling_arch}Block diagram of the transfer function from \(\bm{\mathcal{F}}_{\{O\}}\) to \(\bm{\mathcal{X}}_{\{O\}}\)} \end{figure} \begin{equation}\label{eq:detail_control_decoupling_plant_jacobian} - \frac{\bm{\mathcal{X}}_{\{O\}}}{\bm{\mathcal{F}}_{\{O\}}}(s) = \bm{G}_{\{O\}}(s) = \left( \bm{J}_{\{O\}}^t \bm{J}_{\{M\}}^{-T} \bm{M}_{\{M\}} \bm{J}_{\{M\}}^{-1} \bm{J}_{\{O\}} s^2 + \bm{J}_{\{O\}}^t \bm{\mathcal{C}} \bm{J}_{\{O\}} s + \bm{J}_{\{O\}}^t \bm{\mathcal{K}} \bm{J}_{\{O\}} \right)^{-1} + \frac{\bm{\mathcal{X}}_{\{O\}}}{\bm{\mathcal{F}}_{\{O\}}}(s) = \bm{G}_{\{O\}}(s) = \left( \bm{J}_{\{O\}}^{\intercal} \bm{J}_{\{M\}}^{-\intercal} \bm{M}_{\{M\}} \bm{J}_{\{M\}}^{-1} \bm{J}_{\{O\}} s^2 + \bm{J}_{\{O\}}^{\intercal} \bm{\mathcal{C}} \bm{J}_{\{O\}} s + \bm{J}_{\{O\}}^{\intercal} \bm{\mathcal{K}} \bm{J}_{\{O\}} \right)^{-1} \end{equation} The frame \(\{O\}\) can be any chosen frame, but the decoupling properties depends on the chosen frame \(\{O\}\). There are two natural choices: the center of mass \(\{M\}\) and the center of stiffness \(\{K\}\). Note that the Jacobian matrix is only based on the geometry of the system and does not depend on the physical properties such as mass and stiffness. -\paragraph{Center Of Mass} +\subsubsection{Center Of Mass} If the center of mass is chosen as the decoupling frame. The Jacobian matrix and its inverse are expressed in \eqref{eq:detail_control_decoupling_jacobian_CoM_inverse}. @@ -857,10 +867,14 @@ The Jacobian matrix and its inverse are expressed in \eqref{eq:detail_control_de \end{bmatrix} \end{equation} +\begin{center} +\includegraphics[scale=1]{figs/detail_control_decoupling_control_jacobian_CoM.png} +\label{} +\end{center} Analytical formula of the plant is \eqref{eq:detail_control_decoupling_plant_CoM}. \begin{equation}\label{eq:detail_control_decoupling_plant_CoM} - \frac{\bm{\mathcal{X}}_{\{M\}}}{\bm{\mathcal{F}}_{\{M\}}}(s) = \bm{G}_{\{M\}}(s) = \left( \bm{M}_{\{M\}} s^2 + \bm{J}_{\{M\}}^t \bm{\mathcal{C}} \bm{J}_{\{M\}} s + \bm{J}_{\{M\}}^t \bm{\mathcal{K}} \bm{J}_{\{M\}} \right)^{-1} + \frac{\bm{\mathcal{X}}_{\{M\}}}{\bm{\mathcal{F}}_{\{M\}}}(s) = \bm{G}_{\{M\}}(s) = \left( \bm{M}_{\{M\}} s^2 + \bm{J}_{\{M\}}^{\intercal} \bm{\mathcal{C}} \bm{J}_{\{M\}} s + \bm{J}_{\{M\}}^{\intercal} \bm{\mathcal{K}} \bm{J}_{\{M\}} \right)^{-1} \end{equation} At high frequency, converges towards the inverse of the mass matrix, which is a diagonal matrix \eqref{eq:detail_control_decoupling_plant_CoM_high_freq}. @@ -899,8 +913,12 @@ this is illustrated in Figure \ref{fig:detail_control_decoupling_model_test_CoM} \end{subfigure} \caption{\label{fig:detail_control_jacobian_decoupling_plant_CoM_results}Plant decoupled using the Jacobian matrix expresssed at the center of mass (\subref{fig:detail_control_decoupling_jacobian_plant_CoM}). The physical reason for low frequency coupling is illustrated in (\subref{fig:detail_control_decoupling_model_test_CoM}).} \end{figure} -\paragraph{Center Of Stiffness} +\subsubsection{Center Of Stiffness} +\begin{center} +\includegraphics[scale=1]{figs/detail_control_decoupling_control_jacobian_CoK.png} +\label{} +\end{center} \begin{equation} \bm{J}_{\{K\}} = \begin{bmatrix} 1 & 0 & 0 \\ @@ -913,18 +931,18 @@ this is illustrated in Figure \ref{fig:detail_control_decoupling_model_test_CoM} \end{bmatrix} \end{equation} -Frame \(\{K\}\) is chosen such that \(\bm{J}_{\{K\}}^t \bm{\mathcal{K}} \bm{J}_{\{K\}}\) is diagonal. +Frame \(\{K\}\) is chosen such that \(\bm{J}_{\{K\}}^{\intercal} \bm{\mathcal{K}} \bm{J}_{\{K\}}\) is diagonal. Typically, it can me made based on physical reasoning as is the case here. \begin{equation}\label{eq:detail_control_decoupling_plant_CoK} - \frac{\bm{\mathcal{X}}_{\{K\}}}{\bm{\mathcal{F}}_{\{K\}}}(s) = \bm{G}_{\{K\}}(s) = \left( \bm{J}_{\{K\}}^t \bm{J}_{\{M\}}^{-T} \bm{M}_{\{M\}} \bm{J}_{\{M\}}^{-1} \bm{J}_{\{K\}} s^2 + \bm{J}_{\{K\}}^t \bm{\mathcal{C}} \bm{J}_{\{K\}} s + \bm{J}_{\{K\}}^t \bm{\mathcal{K}} \bm{J}_{\{K\}} \right)^{-1} + \frac{\bm{\mathcal{X}}_{\{K\}}}{\bm{\mathcal{F}}_{\{K\}}}(s) = \bm{G}_{\{K\}}(s) = \left( \bm{J}_{\{K\}}^{\intercal} \bm{J}_{\{M\}}^{-\intercal} \bm{M}_{\{M\}} \bm{J}_{\{M\}}^{-1} \bm{J}_{\{K\}} s^2 + \bm{J}_{\{K\}}^{\intercal} \bm{\mathcal{C}} \bm{J}_{\{K\}} s + \bm{J}_{\{K\}}^{\intercal} \bm{\mathcal{K}} \bm{J}_{\{K\}} \right)^{-1} \end{equation} Plant is well decoupled below the suspension mode with the lowest frequency. This is usually suited for systems which high stiffness. \begin{equation} - \bm{G}_{\{K\}}(j\omega) \xrightarrow[\omega \to 0]{} \bm{J}_{\{K\}}^{-1} \bm{\mathcal{K}}^{-1} \bm{J}_{\{K\}}^{-t} + \bm{G}_{\{K\}}(j\omega) \xrightarrow[\omega \to 0]{} \bm{J}_{\{K\}}^{-1} \bm{\mathcal{K}}^{-1} \bm{J}_{\{K\}}^{-\intercal} \end{equation} @@ -967,7 +985,7 @@ IFF in modal space \cite{holterman05_activ_dampin_based_decoup_colloc_contr} ver \end{itemize} \begin{equation}\label{eq:detail_control_decoupling_equation_motion_CoM} - \bm{M}_{\{M\}} \ddot{\bm{\mathcal{X}}}_{\{M\}}(t) + \bm{C}_{\{M\}} \dot{\bm{\mathcal{X}}}_{\{M\}}(t) + \bm{K}_{\{M\}} \bm{\mathcal{X}}_{\{M\}}(t) = \bm{J}_{\{M\}}^t \bm{\tau}(t) + \bm{M}_{\{M\}} \ddot{\bm{\mathcal{X}}}_{\{M\}}(t) + \bm{C}_{\{M\}} \dot{\bm{\mathcal{X}}}_{\{M\}}(t) + \bm{K}_{\{M\}} \bm{\mathcal{X}}_{\{M\}}(t) = \bm{J}_{\{M\}}^{\intercal} \bm{\tau}(t) \end{equation} Let's make a change of variables: @@ -980,10 +998,10 @@ with: \item \(\bm{\Phi}\) a matrix whose columns are the modes shapes of the system which can be computed from \(\bm{M}_{\{M\}}\) and \(\bm{K}_{\{M\}}\). \end{itemize} -By pre-multiplying the equation of motion \eqref{eq:detail_control_decoupling_equation_motion_CoM} by \(\bm{\Phi}^t\) and using the change of variable \eqref{eq:detail_control_decoupling_modal_coordinates}, a new set of equation of motion are obtained +By pre-multiplying the equation of motion \eqref{eq:detail_control_decoupling_equation_motion_CoM} by \(\bm{\Phi}^{\intercal}\) and using the change of variable \eqref{eq:detail_control_decoupling_modal_coordinates}, a new set of equation of motion are obtained \begin{equation}\label{eq:detail_control_decoupling_equation_modal_coordinates} - \underbrace{\bm{\Phi}^t \bm{M} \bm{\Phi}}_{\bm{M}_m} \bm{\ddot{\mathcal{X}}}_m(t) + \underbrace{\bm{\Phi}^t \bm{C} \bm{\Phi}}_{\bm{C}_m} \bm{\dot{\mathcal{X}}}_m(t) + \underbrace{\bm{\Phi}^t \bm{K} \bm{\Phi}}_{\bm{K}_m} \bm{\mathcal{X}}_m(t) = \underbrace{\bm{\Phi}^t \bm{J}^t \bm{\tau}(t)}_{\bm{\tau}_m(t)} + \underbrace{\bm{\Phi}^{\intercal} \bm{M} \bm{\Phi}}_{\bm{M}_m} \bm{\ddot{\mathcal{X}}}_m(t) + \underbrace{\bm{\Phi}^{\intercal} \bm{C} \bm{\Phi}}_{\bm{C}_m} \bm{\dot{\mathcal{X}}}_m(t) + \underbrace{\bm{\Phi}^{\intercal} \bm{K} \bm{\Phi}}_{\bm{K}_m} \bm{\mathcal{X}}_m(t) = \underbrace{\bm{\Phi}^{\intercal} \bm{J}^{\intercal} \bm{\tau}(t)}_{\bm{\tau}_m(t)} \end{equation} \begin{itemize} @@ -1019,7 +1037,7 @@ I think so Are they orthogonal? \item[{$\square$}] Say that the obtained plant are second order systems \end{itemize} -\paragraph{Example} +\subsubsection{Example} From the mass matrix \(\bm{M}_{\{M\}}\) and stiffness matrix \(\bm{K}_{\{M\}}\) expressed at the center of mass, the eigenvectors of \(\bm{M}_{\{M\}}^{-1}\bm{K}_{\{M\}}\) are computed. @@ -1066,7 +1084,7 @@ Eigenvectors are arranged for increasing eigenvalues (i.e. resonance frequencies \end{equation} \begin{itemize} -\item[{$\square$}] Formula for the plant trancfer function +\item[{$\square$}] Formula for the plant transfer function \end{itemize} \begin{figure}[htbp] @@ -1086,7 +1104,7 @@ Eigenvectors are arranged for increasing eigenvalues (i.e. resonance frequencies \end{figure} \section{SVD Decoupling} \label{ssec:detail_control_decoupling_svd} -\paragraph{Singular Value Decomposition} +\subsubsection{Singular Value Decomposition} Singular Value Decomposition (SVD) \begin{itemize} @@ -1110,7 +1128,7 @@ The idea to use Singular Value Decomposition as a way to decouple a plant is not \item[{$\square$}] Quick review of SVD controllers \cite[, chapt. 3.5.4]{skogestad07_multiv_feedb_contr} \end{itemize} -\paragraph{Decoupling using the SVD} +\subsubsection{Decoupling using the SVD} \textbf{Procedure}: Identify the dynamics of the system from inputs to outputs (can be obtained experimentally) @@ -1124,12 +1142,12 @@ Compute a real approximation of the system's response at that frequency. \cite{kouvaritakis79_theor_pract_charac_locus_desig_method}: real matrix that preserves the most orthogonality in directions with the input complex matrix Then, a real matrix \(\tilde{\bm{G}}(\omega_c)\) is obtained, and the SVD is performed on this real matrix. -Unitary \(\bm{U}\) and \(\bm{V}\) matrices are then obtained such that \(\bm{V}^{-t} \tilde{\bm{G}}(\omega_c) \bm{U}^{-1}\) is diagonal. +Unitary \(\bm{U}\) and \(\bm{V}\) matrices are then obtained such that \(\bm{V}^{-\intercal} \tilde{\bm{G}}(\omega_c) \bm{U}^{-1}\) is diagonal. Use the singular input and output matrices to decouple the system as shown in Figure \ref{fig:detail_control_decoupling_svd} \begin{equation} - G_{\text{SVD}}(s) = \bm{U}^{-1} \bm{G}_{\{\mathcal{L}\}}(s) \bm{V}^{-T} + G_{\text{SVD}}(s) = \bm{U}^{-1} \bm{G}_{\{\mathcal{L}\}}(s) \bm{V}^{-\intercal} \end{equation} \begin{figure}[htbp] @@ -1152,7 +1170,7 @@ The inputs and outputs are ordered from higher gain to lower gain at the chosen \item[{$\square$}] Do we loose any physical meaning of the obtained inputs and outputs? \item[{$\square$}] Can we take advantage of the fact that U and V are unitary? \end{itemize} -\paragraph{Example} +\subsubsection{Example} \begin{equation} @@ -1182,7 +1200,7 @@ The inputs and outputs are ordered from higher gain to lower gain at the chosen Once the \(\bm{U}\) and \(\bm{V}\) matrices are obtained, the decoupled plant can be computed using \eqref{eq:detail_control_decoupling_plant_svd}. \begin{equation}\label{eq:detail_control_decoupling_plant_svd} - \bm{G}_{\text{SVD}}(s) = \bm{U}^{-1} \bm{G}_{\{\mathcal{L}\}}(s) \bm{V}^{-t} + \bm{G}_{\text{SVD}}(s) = \bm{U}^{-1} \bm{G}_{\{\mathcal{L}\}}(s) \bm{V}^{-\intercal} \end{equation} The obtained plant shown in Figure \ref{fig:detail_control_decoupling_svd_plant} is very well decoupled. and not only around \(\omega_c\). @@ -1273,10 +1291,10 @@ Diagonal elements are expected to be simple 2nd order low pass filters, which ar Decoupling is expected to be good near the frequency chosen for computing the decoupling matrices, but may depend on how good the real approximation of the plant is for that particular frequency. Whether the decoupling quality can be guaranteed away from the chosen frequency is unknown. \end{itemize} + +\item ``Frame'' of the controllers: important to be able to tuned the controllers linked to performance metrics \end{itemize} - - There are other aspects that were not treated here such as: \begin{itemize} \item how to integrate feedforward path and reference signals @@ -1296,9 +1314,9 @@ There are other aspects that were not treated here such as: \midrule \textbf{Decoupling Matrices} & Decoupling using \(\bm{J}_{\{O\}}\) obtained from geometry & Decoupling using \(\bm{\Phi}\) obtained from modal decomposition & Decoupling using \(\bm{U}\) and \(\bm{V}\) obtained from SVD\\ \midrule -\textbf{Decoupled Plant} & \(\bm{G}_{\{O\}}(s) = \bm{J}_{\{O\}}^{-1} \bm{G}_{\mathcal{L}}(s) \bm{J}_{\{O\}}^{-T}\) & \(\bm{G}_m(s) = \bm{\Phi}^{-1} \bm{G}_{\mathcal{X}}(s) \bm{\Phi}^{-t}\) & \(\bm{G}_{\text{SVD}}(s) = \bm{U}^{-1} \bm{G}(s) \bm{V}^{-T}\)\\ +\textbf{Decoupled Plant} & \(\bm{G}_{\{O\}}(s) = \bm{J}_{\{O\}}^{-1} \bm{G}_{\mathcal{L}}(s) \bm{J}_{\{O\}}^{-\intercal}\) & \(\bm{G}_m(s) = \bm{\Phi}^{-1} \bm{G}_{\mathcal{X}}(s) \bm{\Phi}^{-\intercal}\) & \(\bm{G}_{\text{SVD}}(s) = \bm{U}^{-1} \bm{G}(s) \bm{V}^{-\intercal}\)\\ \midrule -\textbf{Controller} & \(\bm{K}_{\{O\}}(s) = \bm{J}_{\{O\}}^{-T} \bm{K}_{d}(s) \bm{J}_{\{O\}}^{-1}\) & \(\bm{K}_m(s) = \bm{\Phi}^{-t} \bm{K}_{d}(s) \bm{\Phi}^{-1}\) & \(\bm{K}_{\text{SVD}}(s) = \bm{V}^{-T} \bm{K}_{d}(s) \bm{U}^{-1}\)\\ +\textbf{Controller} & \(\bm{K}_{\{O\}}(s) = \bm{J}_{\{O\}}^{-\intercal} \bm{K}_{d}(s) \bm{J}_{\{O\}}^{-1}\) & \(\bm{K}_m(s) = \bm{\Phi}^{-\intercal} \bm{K}_{d}(s) \bm{\Phi}^{-1}\) & \(\bm{K}_{\text{SVD}}(s) = \bm{V}^{-\intercal} \bm{K}_{d}(s) \bm{U}^{-1}\)\\ \midrule \textbf{Interpretation} & Forces/Torques to Displacement/Rotation in chosen frame & Inputs to excite individual modes & Directions of max to min controllability/observability\\ & & Output to sense individual modes & \\ @@ -1330,58 +1348,55 @@ For active damping however, it may be reasonable to work in the modal space as d \chapter{Closed-Loop Shaping using Complementary Filters} \label{sec:detail_control_cf} -Performance of a feedback control is dictated by closed-loop trancfer functions. -For instance sensitivity, transmissibility, etc\ldots{} Gang of Four. +Once the system is properly decoupled using one of the approaches described in Section \ref{sec:detail_control_decoupling}, a diagonal controller can be tuned. +This consists in tuning several SISO controllers. +There are several ways to design a controller to obtain a given performance while ensuring good robustness properties. + +Performances of a feedback system (such as response time, disturbance rejection, ) depends on the obtained closed-loop transfer functions. +For instance sensitivity, transmissibility, etc\ldots{} Gang of Four. +The specifications can usually be expressed in terms of the shape of these closed-loop transfer functions \cite[, chapt. 3]{skogestad07_multiv_feedb_contr}. + +In some cases, ``fixed'' controller structures are used, with as PI and PID controllers. +In such case the controller coefficients are manually tuned to obtain acceptable performance and robustness. +In many cases, PID+LPF can already lead to performances close to optimal, depending on the plant. -There are several ways to design a controller to obtain a given performance. Decoupled Open-Loop Shaping: \begin{itemize} -\item As shown in previous section, once the plant is decoupled: open loop shaping -\item Explain procedure when applying open-loop shaping -\item Lead, Lag, Notches, Check Stability, c2d, etc\ldots{} -\item But this is open-loop shaping, and it does not directly work on the closed loop trancfer functions +\item Explain procedure when applying open-loop shaping \cite[, chapt. 4.4.7]{schmidt20_desig_high_perfor_mechat_third_revis_edition} +\cite{steinbuch16_model_based} +\begin{quote} + The key idea of loop-shaping is the modification of the controller such that the open- +loop is made according to specifications. The reason this works so well, is that the controller +enters linearly into the open-loop transfer l(j!) = g(j!)k(j!), so that it is fast and easy +to reason what is to be changed in the controller. However, in practice all specifications are +of course given in terms of the final system performance, i.e. as closed-loop specifications. +So we should convert the closed loop specs into specs on the open-loop. +\end{quote} +\item The controller is usually manually tuned using a series of Integrators, Leads, Lags, Notches, low pass filters +\item There are lots of tools to check stability, robustness margins and performances +\item Open-Loop shaping is very popular as the open-loop gain depends linearly on the controller. +So the open-loop transfer function can easily be shaped by modifying the controller response. +\item Different techniques for open loop shaping (choice of optimal open-loop gain shape) \cite{lurie02_system_archit_trades_using_bode} +\item But this is open-loop shaping, and it does not directly work on the closed loop transfer functions +\item The huge advantage of this technique, is that one can tune the controllers based on the measured FRF of the system. +No plant model is required. +\item This is what was done during the conceptual phase after the plan was decoupled in the frame of the struts. \end{itemize} -Other strategy: Model Based Design: + +Model based control: \begin{itemize} -\item \href{file:///home/thomas/Cloud/work-projects/ID31-NASS/matlab/stewart-simscape/org/bibliography.org}{Multivariable Control} -\item Talk about Caio's thesis? -\item Review of model based design (LQG, H-Infinity) applied to Stewart platform +\item Review of model based design (LQG, H-Infinity) applied to Stewart platform \href{file:///home/thomas/Cloud/work-projects/ID31-NASS/matlab/stewart-simscape/org/bibliography.org}{Multivariable Control} +\(\hinf\) loop-shaping \cite{skogestad07_multiv_feedb_contr}. \item Difficulty to specify robustness to change of payload mass +\item Requires high level of expertise. +Far from standard in industry. +Application to Stewart platforms is not demonstrated (or performance increased compared to decoupled control and manual loop shaping). \end{itemize} -In this section, an alternative is proposed in which complementary filters are used for closed-loop shaping. -It is presented for a SISO system, but can be generalized to MIMO if decoupling is sufficient. -It will be experimentally demonstrated with the NASS. - -\textbf{Paper's introduction}: - -\textbf{Model based control} - -\textbf{SISO control design methods} -\begin{itemize} -\item frequency domain techniques -\item manual loop-shaping - key idea: modification of the controller such that the open-loop is made according to specifications \cite{oomen18_advan_motion_contr_precis_mechat}. -This works well because the open loop trancfer function is linearly dependent of the controller. -Different techniques for open loop shaping \cite{lurie02_system_archit_trades_using_bode} -\end{itemize} - -However, the specifications are given in terms of the final system performance, i.e. as closed-loop specifications. - -\textbf{Norm-based control} -\(\hinf\) loop-shaping \cite{skogestad07_multiv_feedb_contr}. Far from standard in industry as it requires lot of efforts. - - -Problem of robustness to plant uncertainty: -\begin{itemize} -\item Trade off performance / robustness. Difficult to obtain high performance in presence of high uncertainty. -\item Robust control \(\mu\text{-synthesis}\). Takes a lot of effort to model the plant uncertainty. -\item Sensor fusion: combines two sensors using complementary filters. The high frequency sensor is collocated with the actuator in order to ensure the stability of the system even in presence of uncertainty. \cite{collette15_sensor_fusion_method_high_perfor,collette14_vibrat} -\end{itemize} - -Complementary filters: \cite{hua05_low_ligo}. +In this section, an alternative controller synthesis scheme is proposed in which complementary filters are used for directly shaping the closed-loop transfer functions. In this paper, we propose a new controller synthesis method \begin{itemize} \item based on the use of complementary high pass and low pass filters @@ -1390,8 +1405,9 @@ In this paper, we propose a new controller synthesis method \end{itemize} \section{Control Architecture} \label{ssec:detail_control_cf_control_arch} -\paragraph{Virtual Sensor Fusion} -Let's consider the control architecture represented in Figure \ref{fig:detail_control_cf_arch} where \(G^\prime\) is the physical plant to control, \(G\) is a model of the plant, \(k\) is a gain, \(H_L\) and \(H_H\) are complementary filters (\(H_L + H_H = 1\) in the complex sense). +\subsubsection{Virtual Sensor Fusion} + +Let's consider the control architecture represented in Figure \ref{fig:detail_control_cf_arch} where \(G^\prime\) is the physical plant to control, \(G\) is a model of the plant, \(k\) is a gain, \(H_L\) and \(H_H\) are complementary filters (\(H_L(s) + H_H(s) = 1\)). The signals are the reference signal \(r\), the output perturbation \(d_y\), the measurement noise \(n\) and the control input \(u\). \begin{figure}[htbp] @@ -1400,19 +1416,21 @@ The signals are the reference signal \(r\), the output perturbation \(d_y\), the \caption{\label{fig:detail_control_cf_arch}Sensor Fusion Architecture} \end{figure} -The dynamics of the closed-loop system is described by the following equations -\begin{alignat}{5} -y &= \frac{1+kGH_H}{1+L} dy &&+ \frac{kG^{\prime}}{1+L} r &&- \frac{kG^{\prime}H_L}{1+L} n \\ -u &= -\frac{kH_L}{1+L} dy &&+ \frac{k}{1+L} r &&- \frac{kH_L}{1+L} n -\end{alignat} -with \(L = k(G H_H + G^\prime H_L)\). +The dynamics of the closed-loop system is described by \eqref{eq:detail_control_cf_sf_cl_tf} with \(L = k(G H_H + G^\prime H_L)\). -The idea of using such architecture comes from sensor fusion \cite{collette14_vibrat,collette15_sensor_fusion_method_high_perfor} where we use two sensors. +\begin{subequations}\label{eq:detail_control_cf_sf_cl_tf} + \begin{alignat}{5} + y &= \frac{1+kGH_H}{1+L} dy &&+ \frac{kG^{\prime}}{1+L} r &&- \frac{kG^{\prime}H_L}{1+L} n \\ + u &= -\frac{kH_L}{1+L} dy &&+ \frac{k}{1+L} r &&- \frac{kH_L}{1+L} n + \end{alignat} +\end{subequations} + +The idea of using such architecture comes from sensor fusion \cite{collette14_vibrat,collette15_sensor_fusion_method_high_perfor} where two sensors are used. One is measuring the quantity that is required to control, the other is collocated with the actuator in such a way that stability is guaranteed. The first one is low pass filtered in order to obtain good performance at low frequencies and the second one is high pass filtered to benefits from its good dynamical properties. Here, the second sensor is replaced by a model \(G\) of the plant which is assumed to be stable and minimum phase. - +This lead to the idea of virtual sensor fusion presented in \cite{verma20_virtual_sensor_fusion_high_precis_contr}. One may think that the control architecture shown in Figure \ref{fig:detail_control_cf_arch} is a multi-loop system, but because no non-linear saturation-type element is present in the inner-loop (containing \(k\), \(G\) and \(H_H\) which are all numerically implemented), the structure is equivalent to the architecture shown in Figure \ref{fig:detail_control_cf_arch_eq}. @@ -1422,22 +1440,28 @@ One may think that the control architecture shown in Figure \ref{fig:detail_cont \caption{\label{fig:detail_control_cf_arch_eq}Equivalent feedback architecture} \end{figure} -The dynamics of the system can be rewritten as follow -\begin{alignat}{5} -y &= \frac{1}{1+G^{\prime} K H_L} dy &&+ \frac{G^{\prime} K}{1+G^{\prime} K H_L} r &&- \frac{G^{\prime} K H_L}{1+G^{\prime} K H_L} n \\ -u &= \frac{-K H_L}{1+G^{\prime} K H_L} dy &&+ \frac{K}{1+G^{\prime} K H_L} r &&- \frac{K H_L}{1+G^{\prime} K H_L} n -\end{alignat} -with \(K = \frac{k}{1 + H_H G k}\) -\paragraph{Asymptotic behavior} -We now want to study the asymptotic system obtained when using very high value of \(k\) -\begin{equation} - \lim_{k\to\infty} K = \lim_{k\to\infty} \frac{k}{1+H_H G k} = \left( H_H G \right)^{-1} +The dynamics of the system can be rewritten \eqref{eq:detail_control_cf_sf_cl_tf_K} with \(K = \frac{k}{1 + H_H G k}\). + +\begin{subequations}\label{eq:detail_control_cf_sf_cl_tf_K} + \begin{alignat}{5} + y &= \frac{1}{1+G^{\prime} K H_L} dy &&+ \frac{G^{\prime} K}{1+G^{\prime} K H_L} r &&- \frac{G^{\prime} K H_L}{1+G^{\prime} K H_L} n \\ + u &= \frac{-K H_L}{1+G^{\prime} K H_L} dy &&+ \frac{K}{1+G^{\prime} K H_L} r &&- \frac{K H_L}{1+G^{\prime} K H_L} n + \end{alignat} +\end{subequations} +\subsubsection{Asymptotic behavior} + +Let's take the extreme case of very high values for \(k\). +In that case \(K(s)\) converges to plant inverse multiply by the inverse of the high pass filter \eqref{eq:detail_control_cf_high_k}. + +\begin{equation}\label{eq:detail_control_cf_high_k} + \lim_{k\to\infty} K(s) = \lim_{k\to\infty} \frac{k}{1+H_H(s) G(s) k} = \left( H_H(s) G(s) \right)^{-1} \end{equation} + If the obtained \(K\) is improper, a low pass filter can be added to have its causal realization. +Also, we want \(K\) to be stable, so \(G\) and \(H_H\) must be minimum phase transfer functions. -Also, we want \(K\) to be stable, so \(G\) and \(H_H\) must be minimum phase trancfer functions. - -For now on, we will consider the resulting control architecture as shown on Figure \ref{fig:detail_control_cf_arch_class} where the only ``tuning parameters'' are the complementary filters. +With this assumptions, the resulting control architecture is shown on Figure \ref{fig:detail_control_cf_arch_class}. +The only ``tuning parameters'' are the complementary filters \(H_L\) and \(H_H\). \begin{figure}[htbp] \centering @@ -1445,82 +1469,74 @@ For now on, we will consider the resulting control architecture as shown on Figu \caption{\label{fig:detail_control_cf_arch_class}Equivalent classical feedback control architecture} \end{figure} -The equations describing the dynamics of the closed-loop system are -\begin{align} - y &= \frac{ H_H dy + G^{\prime} G^{-1} r - G^{\prime} G^{-1} H_L n }{H_H + G^\prime G^{-1} H_L} \label{eq:detail_control_cf_cl_system_y}\\ - u &= \frac{ -G^{-1} H_L dy + G^{-1} r - G^{-1} H_L n }{H_H + G^\prime G^{-1} H_L} \label{eq:detail_control_cf_cl_system_u} -\end{align} +The equations describing the dynamics of the closed-loop system of Figure \ref{fig:detail_control_cf_arch_class} -At frequencies where the model is accurate: \(G^{-1} G^{\prime} \approx 1\), \(H_H + G^\prime G^{-1} H_L \approx H_H + H_L = 1\) and -\begin{align} -y &= H_H dy + r - H_L n \label{eq:detail_control_cf_cl_performance_y} \\ -u &= -G^{-1} H_L dy + G^{-1} r - G^{-1} H_L n \label{eq:detail_control_cf_cl_performance_u} -\end{align} +\begin{subequations} + \begin{align} + y &= \frac{ H_H dy + G^{\prime} G^{-1} r - G^{\prime} G^{-1} H_L n }{H_H + G^\prime G^{-1} H_L} \label{eq:detail_control_cf_cl_system_y}\\ + u &= \frac{ -G^{-1} H_L dy + G^{-1} r - G^{-1} H_L n }{H_H + G^\prime G^{-1} H_L} \label{eq:detail_control_cf_cl_system_u} + \end{align} +\end{subequations} -We obtain a sensitivity trancfer function equals to the high pass filter \(S = \frac{y}{dy} = H_H\) and a transmissibility trancfer function equals to the low pass filter \(T = \frac{y}{n} = H_L\). +At frequencies where the model is accurate: \(G^{-1} G^{\prime} \approx 1\), \(H_H + G^\prime G^{-1} H_L \approx H_H + H_L = 1\) and the closed loop transfer functions are described by \eqref{eq:detail_control_cf_sf_cl_tf_K_inf}. + +\begin{subequations}\label{eq:detail_control_cf_sf_cl_tf_K_inf} + \begin{alignat}{5} + y &= H_H dy &&+ r &&- H_L n \label{eq:detail_control_cf_cl_performance_y} \\ + u &= -G^{-1} H_L dy &&+ G^{-1} r &&- G^{-1} H_L n \label{eq:detail_control_cf_cl_performance_u} + \end{alignat} +\end{subequations} + +The obtained sensitivity transfer function equals to the high pass filter \(S = \frac{y}{dy} = H_H\) and the transmissibility transfer function equals to the low pass filter \(T = \frac{y}{n} = H_L\). Assuming that we have a good model of the plant, we have then that the closed-loop behavior of the system converges to the designed complementary filters. \section{Translating the performance requirements into the shapes of the complementary filters} \label{ssec:detail_control_cf_trans_perf} - The required performance specifications in a feedback system can usually be translated into requirements on the upper bounds of \(\abs{S(j\w)}\) and \(|T(j\omega)|\) \cite{bibel92_guidel_h}. -The process of designing a controller \(K(s)\) in order to obtain the desired shapes of \(\abs{S(j\w)}\) and \(\abs{T(j\w)}\) is called loop shaping. +The required performance specifications in a feedback system can usually be translated into requirements on the upper bounds of \(|S(j\omega)|\) and \(|T(j\omega)|\) \cite{bibel92_guidel_h}. +The process of designing a controller \(K(s)\) in order to obtain the desired shapes of \(|S(j\omega)|\) and \(|T(j\omega)|\) is called closed-loop shaping. -The equations \eqref{eq:detail_control_cf_cl_system_y} and \eqref{eq:detail_control_cf_cl_system_u} describing the dynamics of the studied feedback architecture are not written in terms of \(K\) but in terms of the complementary filters \(H_L\) and \(H_H\). - -In this section, we then translate the typical specifications into the desired shapes of the complementary filters \(H_L\) and \(H_H\). -\paragraph{Nominal Stability (NS)} +The equations \eqref{eq:detail_control_cf_cl_system_y} and \eqref{eq:detail_control_cf_cl_system_u} describing the dynamics of the studied feedback architecture are not written in terms of the controller \(K(s)\) but in terms of the complementary filters \(H_L(s)\) and \(H_H(s)\). +The typical specifications are then translated into the desired shapes of the complementary filters. +\subsubsection{Nominal Stability (NS)} The closed-loop system is stable if all its elements are stable (\(K\), \(G^\prime\) and \(H_L\)) and if the sensitivity function (\(S = \frac{1}{1 + G^\prime K H_L}\)) is stable. - -For the nominal system (\(G^\prime = G\)), we have \(S = H_H\). +For the nominal system (\(G^\prime = G\)), the sensitivity transfer function is equal to the high pass filter: \(S(s) = H_H(s)\). Nominal stability is then guaranteed if \(H_L\), \(H_H\) and \(G\) are stable and if \(G\) and \(H_H\) are minimum phase (to have \(K\) stable). +Therefore stable and minimum phase complementary filters need to be used. +\subsubsection{Nominal Performance (NP)} +Two performance weights \(w_H\) and \(w_L\) are here defined in such a way that performance specifications are satisfied is \eqref{eq:detail_control_cf_weights} is satisfied. -Thus we must design stable and minimum phase complementary filters. -\paragraph{Nominal Performance (NP)} -Typical performance specifications can usually be translated into upper bounds on \(|S(j\omega)|\) and \(|T(j\omega)|\). +\begin{subequations}\label{eq:detail_control_cf_weights} + \begin{align} + |w_H(j\omega) S(j\omega)| &\le 1 \quad \forall\omega\\ + |w_L(j\omega) T(j\omega)| &\le 1 \quad \forall\omega + \end{align} +\end{subequations} -Two performance weights \(w_H\) and \(w_L\) are defined in such a way that performance specifications are saticfied if -\begin{equation} - |w_H(j\omega) S(j\omega)| \le 1,\ |w_L(j\omega) T(j\omega)| \le 1 \quad \forall\omega -\end{equation} +For the nominal system, we have \(S = H_H\) and \(T = H_L\), and then nominal performance is ensured by requiring \eqref{eq:detail_control_cf_nominal_performance}. -For the nominal system, we have \(S = H_H\) and \(T = H_L\), and then nominal performance is ensured by requiring - -\begin{subnumcases}{\text{NP} \Leftrightarrow}\label{eq:detail_control_cf_nominal_performance} - |w_H(j\omega) H_H(j\omega)| \le 1 \quad \forall\omega \label{eq:detail_control_cf_nominal_perf_hh}\\ - |w_L(j\omega) H_L(j\omega)| \le 1 \quad \forall\omega \label{eq:detail_control_cf_nominal_perf_hl} -\end{subnumcases} +\begin{empheq}[box=\fbox,left=\text{NP} \Longleftrightarrow \empheqlbrace]{align} \label{eq:detail_control_cf_nominal_performance} + &|w_H(j\omega) H_H(j\omega)| \le 1 \quad \forall\omega \label{eq:detail_control_cf_nominal_perf_hh}\\ + &|w_L(j\omega) H_L(j\omega)| \le 1 \quad \forall\omega \label{eq:detail_control_cf_nominal_perf_hl} +\end{empheq} The translation of typical performance requirements on the shapes of the complementary filters is discussed below: \begin{itemize} \item for disturbance rejections, make \(|S| = |H_H|\) small \item for noise attenuation, make \(|T| = |H_L|\) small -\item for control energy reduction, make \(|KS| = |G^{-1}|\) small +\item closed-loop bandwidth can be limited by requiring that \(|T|\) is less than \(\frac{1}{\sqrt{2}}\) above the maximum wanted bandwidth \end{itemize} -We may have other requirements in terms of stability margins, maximum or minimum closed-loop bandwidth. -\paragraph{Closed-Loop Bandwidth} -The closed-loop bandwidth \(\w_B\) can be defined as the frequency where \(\abs{S(j\w)}\) first crosses \(\frac{1}{\sqrt{2}}\) from below. +Therefore, by properly choosing the shape of the complementary filters, the nominal performance specifications can be addressed. -If one wants the closed-loop bandwidth to be at least \(\w_B^*\) (e.g. to stabilize an unstable pole), one can required that \(|S(j\omega)| \le \frac{1}{\sqrt{2}}\) below \(\omega_B^*\) by designing \(w_H\) such that \(|w_H(j\omega)| \ge \sqrt{2}\) for \(\omega \le \omega_B^*\). +Classical stability margins (gain and phase margins) can also be linked to the maximum amplitude of the sensitivity transfer function. +\begin{itemize} +\item[{$\square$}] Add reference +\end{itemize} -Similarly, if one wants the closed-loop bandwidth to be less than \(\w_B^*\), one can approximately require that the magnitude of \(T\) is less than \(\frac{1}{\sqrt{2}}\) at frequencies above \(\w_B^*\) by designing \(w_L\) such that \(|w_L(j\omega)| \ge \sqrt{2}\) for \(\omega \ge \omega_B^*\). -\paragraph{Classical stability margins} -Gain margin (GM) and phase margin (PM) are usual specifications on controlled system. -Minimum GM and PM can be guaranteed by limiting the maximum magnitude of the sensibility function \(M_S = \max_{\omega} |S(j\omega)|\): -\begin{equation} - \text{GM} \geq \frac{M_S}{M_S-1}; \quad \text{PM} \geq \frac{1}{M_S} -\end{equation} - -Thus, having \(M_S \le 2\) guarantees a gain margin of at least \(2\) and a phase margin of at least \(\SI{29}{\degree}\). - -For the nominal system \(M_S = \max_\omega |S| = \max_\omega |H_H|\), so one can design \(w_H\) so that \(|w_H(j\omega)| \ge 1/2\) in order to have -\begin{equation} - |H_H(j\omega)| \le 2 \quad \forall\omega -\end{equation} -and thus obtain acceptable stability margins. -\paragraph{Response time to change of reference signal} -For the nominal system, the model is accurate and the trancfer function from reference signal \(r\) to output \(y\) is \(1\) \eqref{eq:detail_control_cf_cl_performance_y} and does not depends of the complementary filters. +Typically, having \(|S|_{\infty} \le 2\) guarantees a gain margin of at least \(2\) and a phase margin of at least \(\SI{29}{\degree}\). +\subsubsection{Response time to change of reference signal} +For the nominal system, the model is accurate and the transfer function from reference signal \(r\) to output \(y\) is \(1\) \eqref{eq:detail_control_cf_cl_performance_y} and does not depends of the complementary filters. However, one can add a pre-filter as shown in Figure \ref{fig:detail_control_cf_arch_class_prefilter}. @@ -1530,13 +1546,13 @@ However, one can add a pre-filter as shown in Figure \ref{fig:detail_control_cf_ \caption{\label{fig:detail_control_cf_arch_class_prefilter}Prefilter used to limit input usage} \end{figure} -The trancfer function from \(y\) to \(r\) becomes \(\frac{y}{r} = K_r\) and \(K_r\) can we chosen to obtain acceptable response to change of the reference signal. +The transfer function from \(y\) to \(r\) becomes \(\frac{y}{r} = K_r\) and \(K_r\) can we chosen to obtain acceptable response to change of the reference signal. Typically, \(K_r\) is a low pass filter of the form \begin{equation} K_r(s) = \frac{1}{1 + \tau s} \end{equation} with \(\tau\) corresponding to the desired response time. -\paragraph{Input usage} +\subsubsection{Input usage} Input usage due to disturbances \(d_y\) and measurement noise \(n\) is determined by \(\big|\frac{u}{d_y}\big| = \big|\frac{u}{n}\big| = \big|G^{-1}H_L\big|\). Thus it can be limited by setting an upper bound on \(|H_L|\). @@ -1544,215 +1560,247 @@ Thus it can be limited by setting an upper bound on \(|H_L|\). Input usage due to reference signal \(r\) is determined by \(\big|\frac{u}{r}\big| = \big|G^{-1} K_r\big|\) when using a pre-filter (Figure \ref{fig:detail_control_cf_arch_class_prefilter}) and \(\big|\frac{u}{r}\big| = \big|G^{-1}\big|\) otherwise. Proper choice of \(|K_r|\) is then useful to limit input usage due to change of reference signal. -\paragraph{Robust Stability (RS)} -Robustness stability represents the ability of the control system to remain stable even though there are differences between the actual system \(G^\prime\) and the model \(G\) that was used to design the controller. +\subsubsection{Robust Stability (RS)} + +Robustness stability represents the ability of the control system to remain stable even though there are differences between the actual system \(G^\prime\) and the model \(G\) that was used for the design of the controller. These differences can have various origins such as unmodelled dynamics or non-linearities. -To represent the differences between the model and the actual system, one can choose to use the general input multiplicative uncertainty as represented in Figure \ref{fig:detail_control_cf_input_uncertainty}. +To represent the differences between the model and the actual system, the input multiplicative uncertainty as represented in Figure \ref{fig:detail_control_cf_input_uncertainty} is used. + +Then, the set of possible plant is described by \eqref{eq:detail_control_cf_multiplicative_uncertainty}. +\(w_I\) should be chosen such that all possible plants \(G^\prime\) are contained in the set \(\Pi_i\). + +\begin{equation}\label{eq:detail_control_cf_multiplicative_uncertainty} + \Pi_i: \quad G^\prime(s) = G(s)\big(1 + w_I(s)\Delta_I(s)\big); \quad |\Delta_I(j\omega)| \le 1 \ \forall\omega +\end{equation} + +\begin{figure}[htbp] +\begin{subfigure}{0.48\textwidth} +\begin{center} +\includegraphics[scale=1,scale=1]{figs/detail_control_cf_input_uncertainty.png} +\end{center} +\subcaption{\label{fig:detail_control_cf_input_uncertainty}Input multiplicative uncertainty} +\end{subfigure} +\begin{subfigure}{0.48\textwidth} +\begin{center} +\includegraphics[scale=1,scale=1]{figs/detail_control_cf_nyquist_uncertainty.png} +\end{center} +\subcaption{\label{fig:detail_control_cf_nyquist_uncertainty}Nyquist plot - Effect of multiplicative uncertainty} +\end{subfigure} +\caption{\label{fig:detail_control_cf_input_uncertainty_nyquist}Input multiplicative uncertainty to model the differences between the model and the physical plant (\subref{fig:detail_control_cf_input_uncertainty}). Effect of this uncertainty is displayed on the Nyquist plot (\subref{fig:detail_control_cf_nyquist_uncertainty})} +\end{figure} + +Considering input multiplicative uncertainty, the robust stability property can be derived graphically from the Nyquist plot (Figure \ref{fig:detail_control_cf_nyquist_uncertainty}), and \eqref{eq:detail_control_cf_robust_stability_graphically} is obtained, as proposed in \cite[, chapt. 7.5.1]{skogestad07_multiv_feedb_contr}. + + +\begin{equation}\label{eq:detail_control_cf_robust_stability_graphically} + \text{RS} \Longleftrightarrow \left|w_I(j\omega) L(j\omega) \right| \le \left| 1 + L(j\omega) \right| \quad \forall\omega +\end{equation} + +After some algebraic manipulations, robust stability is then guaranteed by having the low pass filter \(H_L\) satisfying \eqref{eq:detail_control_cf_condition_robust_stability}. + +\begin{equation}\label{eq:detail_control_cf_condition_robust_stability} + \boxed{\text{RS} \Longleftrightarrow |w_I(j\omega) H_L(j\omega)| \le 1 \quad \forall \omega} +\end{equation} +\subsubsection{Robust Performance (RP)} +Robust performance is a property for a controlled system to have its performance guaranteed even though the dynamics of the plant is changing within specified bounds. + +For robust performance, we then require to have the performance condition valid for all possible plants in the defined uncertainty set \eqref{eq:detail_control_cf_robust_perf_S}. + +\begin{equation}\label{eq:detail_control_cf_robust_perf_S} + \text{RP} \Longleftrightarrow |w_H(j\omega) S(j\omega)| \le 1 \quad \forall G^\prime \in \Pi_I, \ \forall\omega +\end{equation} + +Let's transform condition \eqref{eq:detail_control_cf_robust_perf_S} into a condition on the complementary filters \eqref{eq:detail_control_cf_robust_performance}. + +\begin{equation}\label{eq:detail_control_cf_robust_performance} + \boxed{\text{RP} \Longleftrightarrow | w_H(j\omega) H_H(j\omega) | + | w_I(j\omega) H_L(j\omega) | \le 1, \ \forall\omega} +\end{equation} + +Obtained condition for robust performance combines both the NP and RS conditions. +If both NP and RS conditions are fulfilled, the robust performance will be fulfilled with a factor 2 \cite[, chapt. 7.6]{skogestad07_multiv_feedb_contr}. +Therefore, for SISO systems, robust stability and nominal performance are usually sufficient. +\section{Complementary filter design} +\label{ssec:detail_control_cf_analytical_complementary_filters} + +As was explained in Section \ref{sec:detail_control_sensor}, complementary filters can easily be shaped with the standard \(\mathcal{H}_{\infty}\) synthesis. +As requirements can usually be expressed as upper bounds on the complementary filters' magnitude, this method is very well suited. + +However, analytical formulas for complementary filters may also be used. + +For some applications, first order complementary filters \eqref{eq:detail_control_cf_1st_order} are sufficient. + +\begin{subequations}\label{eq:detail_control_cf_1st_order} + \begin{align} + H_L(s) &= \frac{1}{1 + s/\omega_0} \\ + H_H(s) &= \frac{s/\omega_0}{1 + s/\omega_0} + \end{align} +\end{subequations} + +They can be expressed analytically in the digital domain using the Bilinear transformation. +In such case, digital filters \eqref{eq:detail_control_cf_1st_order_z} are obtained. + +\begin{subequations}\label{eq:detail_control_cf_1st_order_z} + \begin{align} + H_L(z^{-1}) &= \frac{T_s \omega_0 + T_s \omega_0 z^{-1}}{T_s \omega_0 + 2 + (T_s \omega_0 - 2) z^{-1}} \\ + H_H(z^{-1}) &= \frac{2 - 2 z^{-1}}{T_s \omega_0 + 2 + (T_s \omega_0 - 2) z^{-1}} + \end{align} +\end{subequations} + +The main advantage of having analytical formulas for the complementary filters is that the parameter \(\omega_0\) may be modified in real time. +This is illustrated in Figure \ref{fig:detail_control_cf_arch_tunable_params}. +Therefore, the performance and robustness of different control bandwidth can be tested very quickly. \begin{figure}[htbp] \centering -\includegraphics[scale=1]{figs/detail_control_cf_input_uncertainty.png} -\caption{\label{fig:detail_control_cf_input_uncertainty}Input multiplicative uncertainty} +\includegraphics[scale=1]{figs/detail_control_cf_arch_tunable_params.png} +\caption{\label{fig:detail_control_cf_arch_tunable_params}Implemented digital complementary filters with parameter \(\omega_0\) that can be changed in real time} \end{figure} -Then, the set of possible perturbed plant is described by +For many applications, slope of \(+2\) is wanted at low frequency for the sensitivity transfer function (to follow ramp inputs for instance), and a slope of \(-2\) for the complementary sensitivity transfer function. +In that case, complementary filters shown in equation \eqref{eq:detail_control_cf_2nd_order} are proposed. -\begin{equation}\label{eq:detail_control_cf_multiplicative_uncertainty} - \Pi_i: \quad G_p(s) = G(s)\big(1 + w_I(s)\Delta_I(s)\big); \quad \abs{\Delta_I(j\w)} \le 1 \ \forall\w -\end{equation} -and \(w_I\) should be chosen such that all possible plants \(G^\prime\) are contained in the set \(\Pi_i\). +\begin{subequations}\label{eq:detail_control_cf_2nd_order} + \begin{align} + H_L(s) &= \frac{(1+\alpha) (\frac{s}{\omega_0})+1}{\left((\frac{s}{\omega_0})+1\right) \left((\frac{s}{\omega_0})^2 + \alpha (\frac{s}{\omega_0}) + 1\right)}\\ + H_H(s) &= \frac{(\frac{s}{\omega_0})^2 \left((\frac{s}{\omega_0})+1+\alpha\right)}{\left((\frac{s}{\omega_0})+1\right) \left((\frac{s}{\omega_0})^2 + \alpha (\frac{s}{\omega_0}) + 1\right)} + \end{align} +\end{subequations} -Using input multiplicative uncertainty, robust stability is equivalent to have \cite{skogestad07_multiv_feedb_contr}: -\begin{align*} - \text{RS} \Leftrightarrow & |w_I T| \le 1 \quad \forall G^\prime \in \Pi_I, \ \forall\omega \\ - \Leftrightarrow & \left| w_I \frac{G^\prime K H_L}{1 + G^\prime K H_L} \right| \le 1 \quad \forall G^\prime \in \Pi_I ,\ \forall\omega \\ - \Leftrightarrow & \left| w_I \frac{G^\prime G^{-1} {H_H}^{-1} H_L}{1 + G^\prime G^{-1} {H_H}^{-1} H_L} \right| \le 1 \quad \forall G^\prime \in \Pi_I ,\ \forall\omega \\ - \Leftrightarrow & \left| w_I \frac{(1 + w_I \Delta) {H_H}^{-1} H_L}{1 + (1 + w_I \Delta) {H_H}^{-1} H_L} \right| \le 1 \quad \forall \Delta, \ |\Delta| \le 1 ,\ \forall\omega \\ - \Leftrightarrow & \left| w_I \frac{(1 + w_I \Delta) H_L}{1 + w_I \Delta H_L} \right| \le 1 \quad \forall \Delta, \ |\Delta| \le 1 ,\ \forall\omega \\ - \Leftrightarrow & \left| H_L w_I \right| \frac{1 + |w_I|}{1 - |w_I H_L|} \le 1, \quad 1 - |w_I H_L| > 0 \quad \forall\omega \\ - \Leftrightarrow & \left| H_L w_I \right| (2 + |w_I|) \le 1, \quad 1 - |w_I H_L| > 0 \quad \forall\omega \\ - \Leftrightarrow & \left| H_L w_I \right| (2 + |w_I|) \le 1 \quad \forall\omega -\end{align*} +The effect of \(\alpha\) and \(\omega_0\) and the obtained shape of the complementary filters is shown in Figure \ref{fig:detail_control_cf_analytical_effect}. +Such filters can also be implemented in the digital domain with analytical formulas, such as \(\alpha\) and \(\omega_0\) can be changed in real time. - -Robust stability is then guaranteed by having the low pass filter \(H_L\) saticfying \eqref{eq:detail_control_cf_robust_stability}. - -\begin{equation}\label{eq:detail_control_cf_robust_stability} - \text{RS} \Leftrightarrow |H_L| \le \frac{1}{|w_I| (2 + |w_I|)}\quad \forall \omega -\end{equation} - -To ensure robust stability condition \eqref{eq:detail_control_cf_nominal_perf_hl} can be used if \(w_L\) is designed in such a way that \(|w_L| \ge |w_I| (2 + |w_I|)\). -\paragraph{Robust Performance (RP)} -Robust performance is a property for a controlled system to have its performance guaranteed even though the dynamics of the plant is changing within specified bounds. - -For robust performance, we then require to have the performance condition valid for all possible plants in the defined uncertainty set: -\begin{subnumcases}{\text{RP} \Leftrightarrow} - |w_H S| \le 1 \quad \forall G^\prime \in \Pi_I, \ \forall\omega \label{eq:detail_control_cf_robust_perf_S}\\ - |w_L T| \le 1 \quad \forall G^\prime \in \Pi_I, \ \forall\omega \label{eq:detail_control_cf_robust_perf_T} -\end{subnumcases} - -Let's trancform condition \eqref{eq:detail_control_cf_robust_perf_S} into a condition on the complementary filters -\begin{align*} - & \left| w_H S \right| \le 1 \quad \forall G^\prime \in \Pi_I, \ \forall\omega \\ - \Leftrightarrow & \left| w_H \frac{1}{1 + G^\prime G^{-1} H_H^{-1} H_L} \right| \le 1 \quad \forall G^\prime \in \Pi_I, \ \forall\omega \\ - \Leftrightarrow & \left| \frac{w_H H_H}{1 + \Delta w_I H_L} \right| \le 1 \quad \forall \Delta, \ |\Delta| \le 1, \ \forall\omega \\ - \Leftrightarrow & \frac{|w_H H_H|}{1 - |w_I H_L|} \le 1, \ \forall\omega \\ - \Leftrightarrow & | w_H H_H | + | w_I H_L | \le 1, \ \forall\omega \\ -\end{align*} - -The same can be done with condition \eqref{eq:detail_control_cf_robust_perf_T} -\begin{align*} - & \left| w_L T \right| \le 1 \quad \forall G^\prime \in \Pi_I, \ \forall\omega \\ - \Leftrightarrow & \left| w_L \frac{G^\prime G^{-1} H_H^{-1} H_L}{1 + G^\prime G^{-1} H_H^{-1} H_L} \right| \le 1 \quad \forall G^\prime \in \Pi_I, \ \forall\omega \\ - \Leftrightarrow & \left| w_L H_L \frac{1 + w_I \Delta}{1 + w_I \Delta H_L} \right| \le 1 \quad \forall \Delta, \ |\Delta| \le 1, \ \forall\omega \\ - \Leftrightarrow & \left| w_L H_L \right| \frac{1 + |w_I|}{1 - |w_I H_L|} \le 1 \quad \forall\omega \\ - \Leftrightarrow & \left| H_L \right| \le \frac{1}{|w_L| (1 + |w_I|) + |w_I|} \quad \forall\omega \\ -\end{align*} - -Robust performance is then guaranteed if \eqref{eq:detail_control_cf_robust_perf_a} and \eqref{eq:detail_control_cf_robust_perf_b} are satisfied. - -\begin{subnumcases}\label{eq:detail_control_cf_robust_performance} -{\text{RP} \Leftrightarrow} - | w_H H_H | + | w_I H_L | \le 1, \ \forall\omega \label{eq:detail_control_cf_robust_perf_a}\\ - \left| H_L \right| \le \frac{1}{|w_L| (1 + |w_I|) + |w_I|} \quad \forall\omega \label{eq:detail_control_cf_robust_perf_b} -\end{subnumcases} - -One should be aware than when looking for a robust performance condition, only the worst case is evaluated and using the robust stability condition may lead to conservative control. -\section{Analytical formulas for complementary filters?} -\label{ssec:detail_control_cf_analytical_complementary_filters} +\begin{figure}[htbp] +\begin{subfigure}{0.48\textwidth} +\begin{center} +\includegraphics[scale=1,width=0.95\linewidth]{figs/detail_control_cf_analytical_effect_alpha.png} +\end{center} +\subcaption{\label{fig:detail_control_cf_analytical_effect_alpha}Effect of $\alpha$} +\end{subfigure} +\begin{subfigure}{0.48\textwidth} +\begin{center} +\includegraphics[scale=1,width=0.95\linewidth]{figs/detail_control_cf_analytical_effect_w0.png} +\end{center} +\subcaption{\label{fig:detail_control_cf_analytical_effect_w0}Effect of $\omega_0$} +\end{subfigure} +\caption{\label{fig:detail_control_cf_analytical_effect}Shape of proposed analytical complementary filters. Effect of \(\alpha\) (\subref{fig:detail_control_cf_analytical_effect_alpha}) and \(\omega_0\) (\subref{fig:detail_control_cf_analytical_effect_w0}) are shown.} +\end{figure} \section{Numerical Example} \label{ssec:detail_control_cf_simulations} -\paragraph{Procedure} +\subsubsection{Procedure} In order to apply this control technique, we propose the following procedure: \begin{enumerate} -\item Identify the plant to be controlled in order to obtain \(G\) +\item Identify the plant to be controlled in order to obtain the plant model \(G\) \item Design the weighting function \(w_I\) such that all possible plants \(G^\prime\) are contained in the set \(\Pi_i\) -\item Translate the performance requirements into upper bounds on the complementary filters (as explained in Sec. \ref{ssec:detail_control_cf_trans_perf}) -\item Design the weighting functions \(w_H\) and \(w_L\) and generate the complementary filters using \(\hinf\text{-synthesis}\) (as was explained in Section \ref{ssec:detail_control_sensor_hinf_method}). +\item Translate the performance requirements into upper bounds on the complementary filters (as explained in Section \ref{ssec:detail_control_cf_trans_perf}) +\item Design the weighting functions \(w_H\) and \(w_L\) and generate the complementary filters using \(\mathcal{H}_{\infty}\text{-synthesis}\) (as was explained in Section \ref{ssec:detail_control_sensor_hinf_method}). If the synthesis fails to give filters satisfying the upper bounds previously defined, either the requirements have to be reworked or a better model \(G\) that will permits to have a smaller \(w_I\) should be obtained. -If one does not want to use the \(\mathcal{H}_\infty\) synthesis, one can use pre-made complementary filters given in Sec. \ref{ssec:detail_control_cf_analytical_complementary_filters}. -\item If \(K = \left( G H_H \right)^{-1}\) is not proper, a low pass filter should be added -\item Design a pre-filter \(K_r\) if requirements on input usage or response to reference change are not met -\item Control implementation: Filter the measurement with \(H_L\), implement the controller \(K\) and the pre-filter \(K_r\) as shown on Figure \ref{fig:detail_control_cf_arch_class_prefilter} +For simple cases, analytical formulas of complementary filters given in Section \ref{ssec:detail_control_cf_analytical_complementary_filters} can be used. +\item If \(K(s) = \left( G(s) H_H(s) \right)^{-1}\) is not proper, low pass filters should be added high a high corner frequency \end{enumerate} -\paragraph{Plant} -Let's consider the problem of controlling an active vibration isolation system that consist of a mass \(m\) to be isolated, a piezoelectric actuator and a geophone. +\subsubsection{Plant} -We represent this system by a mass-spring-damper system as shown Figure \ref{fig:detail_control_cf_mech_sys_alone} where \(m\) typically represents the mass of the payload to be isolated, \(k\) and \(c\) represent respectively the stiffness and damping of the mount. -\(w\) is the ground motion. -The values for the parameters of the models are -\[ m = \SI{20}{\kg}; \quad k = 10^4\si{\N/\m}; \quad c = 10^2\si{\N\per(\m\per\s)} \] +\begin{itemize} +\item To test this control architecture, a simple test model is used (Figure \ref{fig:detail_control_cf_test_model}). +\item This model is quite similar to many positioning stages for Synchrotrons. +A payload (i.e. sample) with mass \(m = 5\) is positioned on top of the stage. +The goal is to position the sample with respect to the x-ray. +It is supposed that the relative position \(y\) between the payload an the x-ray is measured (typically the relative position between the focusing optics and the sample is performed). +There are some disturbance forces acting on the positioning stability, such as stage vibration \(d_w\) and direct forces applied on the sample \(d_F\) (for instance cable forces). +The positioning stage itself has a stiffness \(k\), an internal damping \(c\) and the force \(F\) can be controlled. +\end{itemize} -\begin{figure}[htbp] -\centering -\includegraphics[scale=1]{figs/detail_control_cf_mech_sys_alone.png} -\caption{\label{fig:detail_control_cf_mech_sys_alone}Model of the positioning system} -\end{figure} +The model of the plant \(G(s)\) from actuator force \(F\) to displacement \(y\) is then -The model of the plant \(G(s)\) from actuator force \(F\) to displacement \(x\) is then -\begin{equation} -G(s) = \frac{1}{m s^2 + c s + k} +\begin{equation}\label{eq:detail_control_cf_test_plant_tf} + G(s) = \frac{1}{m s^2 + c s + k} \end{equation} -Its bode plot is shown on Figure \ref{fig:detail_control_cf_bode_plot_mech_sys}. +The values for the parameters of the models are \(m = \SI{20}{\kg}\), \(k = 1\si{\N/\mu\m}\) and \(c = 10^2\si{\N\per(\m\per\s)}\). -\begin{figure}[htbp] -\centering -\includegraphics[scale=1]{figs/detail_control_cf_bode_plot_mech_sys.png} -\caption{\label{fig:detail_control_cf_bode_plot_mech_sys}Bode plot of the trancfer function \(G(s)\) from \(F\) to \(x\)} -\end{figure} -\paragraph{Requirements} -The control objective is to isolate the displacement \(x\) of the mass from the ground motion \(w\). +The plant dynamics has some uncertainty related to the limited support compliance, unmodeled flexible dynamics, dynamics of the payload, etc. +A multiplicative input uncertainty weight \(w_I(s)\) is used to specify the amount of uncertainty as a function of frequency \eqref{eq:detail_control_cf_test_plant_uncertainty}. -The disturbance rejection should be at least \(10\) at \(\SI{2}{\hertz}\) and with a slope of \(-2\) below \(\SI{2}{\hertz}\) until a rejection of \(10^4\). - -Closed-loop bandwidth should be less than \(\SI{20}{\hertz}\) (because of time delay induced by limited sampling frequency?). - -Noise attenuation should be at least \(10\) above \(\SI{40}{\hertz}\) and \(100\) above \(\SI{500}{\hertz}\) - -Robustness to unmodelled dynamics. -We model the uncertainty on the dynamics of the plant by a multiplicative weight -\begin{equation} - w_I(s) = \frac{\tau s + r_0}{(\tau/r_\infty) s + 1} +\begin{equation}\label{eq:detail_control_cf_test_plant_uncertainty} + w_I(s) = 10 \cdot \frac{(s+100)^2}{(s+1000)^2} \end{equation} -where \(r_0=0.1\) is the relative uncertainty at steady-state, \(1/\tau=\SI{100}{\hertz}\) is the frequency at which the relative uncertainty reaches \(\SI{100}{\percent}\), and \(r_\infty=10\) is the magnitude of the weight at high frequency. + +The nominal plant dynamics as well as the entire set of possible plants \(\Pi_i\) are shown in Figure \ref{fig:detail_control_cf_bode_plot_mech_sys}. +\begin{figure}[htbp] +\begin{subfigure}{0.3\textwidth} +\begin{center} +\includegraphics[scale=1,scale=1]{figs/detail_control_cf_test_model.png} +\end{center} +\subcaption{\label{fig:detail_control_cf_test_model}Test model} +\end{subfigure} +\begin{subfigure}{0.66\textwidth} +\begin{center} +\includegraphics[scale=1,scale=1]{figs/detail_control_cf_bode_plot_mech_sys.png} +\end{center} +\subcaption{\label{fig:detail_control_cf_bode_plot_mech_sys}Bode plot of $G(s)$ and associated uncertainty set} +\end{subfigure} +\caption{\label{fig:detail_control_cf_test_model_plant}Schematic of the test system (\subref{fig:detail_control_cf_test_model}). Bode plot of the transfer function \(G(s)\) from \(F\) to \(y\) and the associated uncertainty set (\subref{fig:detail_control_cf_bode_plot_mech_sys}).} +\end{figure} +\subsubsection{Requirements and choice of complementary filters} + +As explained in Section \ref{ssec:detail_control_cf_trans_perf}, nominal performance requirements can be expressed as upper bounds on the complementary filter shapes. +\begin{itemize} +\item Be able to follow ramp inputs (i.e. constant velocity scans) with no steady-state tracking error. +This requires to have a \(+2\) slope at low frequency for \(|S(j\omega)|\) +\item Filter the measurement noise above 300Hz as the sensor noise is high (say a filtering factor of 100 is needed above that frequency). +\item As much disturbance rejection as possible. +\end{itemize} + +The second requirement is to have robust stability meaning that the plant should remain stable while considering the dynamical uncertainties modelled with \(w_I\) +\begin{itemize} +\item The low-pass complementary filter magnitude \(|H_L(j\omega)|\) should be bellow the inverse magnitude of the uncertainty weight magnitude \(|w_I(j\omega)|\) \eqref{eq:detail_control_cf_condition_robust_stability} +\end{itemize} + +Robust performance is ensured by simultaneous NP and RS. All the requirements on \(H_L\) and \(H_H\) are represented on Figure \ref{fig:detail_control_cf_specs_S_T}. -\begin{itemize} -\item[{$\square$}] TODO: Make Matlab code to plot the specifications -\end{itemize} - \begin{figure}[htbp] -\begin{subfigure}{0.49\textwidth} +\begin{subfigure}{0.48\textwidth} \begin{center} \includegraphics[scale=1,width=0.95\linewidth]{figs/detail_control_cf_specs_S_T.png} \end{center} -\subcaption{\label{fig:detail_control_cf_specs_S_T}Closed loop specifications} +\subcaption{\label{fig:detail_control_cf_specs_S_T}Specifications and complementary filters} \end{subfigure} -\begin{subfigure}{0.49\textwidth} -\begin{center} -\includegraphics[scale=1,width=0.95\linewidth]{figs/detail_control_cf_hinf_filters_result_weights.png} -\end{center} -\subcaption{\label{fig:detail_control_cf_hinf_filters_result_weights}Obtained complementary filters} -\end{subfigure} -\caption{\label{fig:detail_control_cf_specs_S_T_obtained_filters}Caption with reference to sub figure (\subref{fig:detail_control_cf_specs_S_T}) (\subref{fig:detail_control_cf_hinf_filters_result_weights})} -\end{figure} -\paragraph{Design of the filters} - -\textbf{Or maybe use analytical formulas as proposed here: \href{file:///home/thomas/Cloud/research/papers/dehaeze20\_virtu\_senso\_fusio/matlab/index.org}{Complementary filters using analytical formula}} - -We then design \(w_L\) and \(w_H\) such that their magnitude are below the upper bounds shown on Figure \ref{fig:detail_control_cf_hinf_filters_result_weights}. -\begin{subequations} - \begin{align} - w_L &= \frac{(s+22.36)^2}{0.005(s+1000)^2}\\ - w_H &= \frac{1}{0.0005(s+0.4472)^2} - \end{align} -\end{subequations} - -After the \(\hinf\text{-synthesis}\), we obtain \(H_L\) and \(H_H\), and we plot their magnitude on phase on Figure \ref{fig:detail_control_cf_hinf_filters_result_weights}. - -\begin{subequations} - \begin{align} - H_L &= \frac{0.0063957 (s+1016) (s+985.4) (s+26.99)}{(s+57.99) (s^2 + 65.77s + 2981)}\\ - H_H &= \frac{0.9936 (s+111.1) (s^2 + 0.3988s + 0.08464)}{(s+57.99) (s^2 + 65.77s + 2981)} - \end{align} -\end{subequations} -\paragraph{Controller analysis} -The controller is \(K = \left( H_H G \right)^{-1}\). -A low pass filter is added to \(K\) so that it is proper and implementable. - -The obtained controller is shown on Figure \ref{fig:detail_control_cf_bode_Kfb}. - -It is implemented as shown on Figure \ref{fig:detail_control_cf_mech_sys_alone_ctrl}. - -\begin{figure}[htbp] -\centering -\includegraphics[scale=1]{figs/detail_control_cf_mech_sys_alone_ctrl.png} -\caption{\label{fig:detail_control_cf_mech_sys_alone_ctrl}Control of a positioning system} -\end{figure} - -\begin{figure}[htbp] -\begin{subfigure}{0.49\textwidth} +\begin{subfigure}{0.48\textwidth} \begin{center} \includegraphics[scale=1,width=0.95\linewidth]{figs/detail_control_cf_bode_Kfb.png} \end{center} -\subcaption{\label{fig:detail_control_cf_bode_Kfb}Controller $K$} +\subcaption{\label{fig:detail_control_cf_bode_Kfb}Bode plot of $K(s) \cdot H_L(s)$} \end{subfigure} -\begin{subfigure}{0.49\textwidth} -\begin{center} -\includegraphics[scale=1,width=0.95\linewidth]{figs/detail_control_cf_bode_plot_loop_gain_robustness.png} -\end{center} -\subcaption{\label{fig:detail_control_cf_bode_plot_loop_gain_robustness}Loop Gain} -\end{subfigure} -\caption{\label{fig:detail_control_cf_bode_Kfb_loop_gain}Caption with reference to sub figure (\subref{fig:detail_control_cf_bode_Kfb}) (\subref{fig:detail_control_cf_bode_plot_loop_gain_robustness})} +\caption{\label{fig:detail_control_cf_specs_S_T_obtained_filters}Performance requirement and complementary filters used (\subref{fig:detail_control_cf_specs_S_T}). Obtained controller from the complementary filters and the plant inverse is shown in (\subref{fig:detail_control_cf_bode_Kfb}).} \end{figure} -\paragraph{Robustness analysis} -The robust stability can be access on the nyquist plot (Figure \ref{fig:detail_control_cf_nyquist_robustness}). -The robust performance is shown on Figure \ref{fig:detail_control_cf_robust_perf}. +While the \(\mathcal{H}_\infty\) synthesis of complementary filters could be used, for this simple examples with simple requirements, analytical formulas of complementary filters were used. + +For this simple example, analytical formulas proposed to have +2 and -2 slopes \eqref{eq:detail_control_cf_2nd_order} were used. +\(\alpha = 1\) and \(\omega_0 = 2\pi \cdot 20\) were used. +\subsubsection{Controller analysis} + +The controller to be implemented is \(K(s) = \tilde{G}^{-1}(s) H_H^{-1}(s)\), with \(\tilde{G}^{-1}(s)\) is the plant inverse which needs to be stable and proper. +Therefore, some low pass filters are added at high frequency \eqref{eq:detail_control_cf_test_plant_inverse}. + +\begin{equation}\label{eq:detail_control_cf_test_plant_inverse} + \tilde{G}^{-1}(s) = \frac{m s^2 + c s + k}{1 + \frac{s}{2\pi \cdot 1000} + \left( \frac{s}{2\pi \cdot 1000} \right)^2} +\end{equation} + +The obtained bode plot of the controller times the complementary high pass filter is shown in Figure \ref{fig:detail_control_cf_bode_Kfb}. +\begin{itemize} +\item two integrators are present at low frequency to be able to follow ramp inputs +\item a notch is located at the plant resonance (inverse) +\item a lead is added near the bandwidth around \(\SI{20}{Hz}\) +\end{itemize} +\subsubsection{Robustness and Performance analysis} +The robust stability can be access on the Nyquist plot (Figure \ref{fig:detail_control_cf_nyquist_robustness}). +Even when considering all the possible plants in the uncertainty set, the nyquist plot stays away from the unstable point, indicating good robustness. + +The performance is evaluated by looking at the closed-loop sensitivity and complementary sensitivity transfer functions (Figure \ref{fig:detail_control_cf_robust_perf}). \begin{figure}[htbp] \begin{subfigure}{0.49\textwidth} @@ -1765,20 +1813,22 @@ The robust performance is shown on Figure \ref{fig:detail_control_cf_robust_perf \begin{center} \includegraphics[scale=1,scale=0.8]{figs/detail_control_cf_robust_perf.png} \end{center} -\subcaption{\label{fig:detail_control_cf_robust_perf}Robust performance} +\subcaption{\label{fig:detail_control_cf_robust_perf}Nominal and Robust performance} \end{subfigure} -\caption{\label{fig:detail_control_cf_simulation_results}Caption with reference to sub figure (\subref{fig:detail_control_cf_nyquist_robustness}) (\subref{fig:detail_control_cf_robust_perf})} +\caption{\label{fig:detail_control_cf_simulation_results}Validation of Robust stability with the Nyquist plot (\subref{fig:detail_control_cf_nyquist_robustness}) and validation of the nominal and robust performance with the magnitude of the closed-loop transfer functions (\subref{fig:detail_control_cf_robust_perf})} \end{figure} -\section{Experimental Validation?} -\label{ssec:detail_control_cf_exp_validation} - -\href{file:///home/thomas/Cloud/research/papers/dehaeze20\_virtu\_senso\_fusio/matlab/index.org}{Experimental Validation} \section*{Conclusion} \begin{itemize} +\item[{$\square$}] Say that the presented control architecture in this section +No ambition to overcome fundamental limitations of current architectures. +Very similar to Internal Model Control \cite{saxena12_advan_inter_model_contr_techn} +Had no time to proceed to an extensive literature review to find similar control architecture and to compare them. +Whether the propose architecture has advantages compared to already excising architecture in the literature is not clear. +\item[{$\square$}] The control architecture was presented for a SISO system, but can be applied to MIMO if decoupling is sufficient. +It will be experimentally demonstrated with the NASS. \item[{$\square$}] Discuss how useful it is as the bandwidth can be changed in real time with analytical formulas of second order complementary filters. Maybe make a section about that. Maybe give analytical formulas of second order complementary filters in the digital domain? -\item[{$\square$}] Say that it will be validated with the nano-hexapod \item[{$\square$}] Disadvantages: \begin{itemize} \item not optimal diff --git a/preamble.tex b/preamble.tex index e3dfc4b..7d9fb17 100644 --- a/preamble.tex +++ b/preamble.tex @@ -14,6 +14,22 @@ \usepackage{amssymb} \usepackage{amsmath} +\usepackage{cases} +\usepackage{empheq} + +\usepackage[binary-units=true]{siunitx} + +\sisetup{% + detect-all = true, + detect-family = true, + detect-mode = true, + detect-shape = true, + detect-weight = true, + detect-inline-weight = math, +} + +\DeclareSIUnit\px{px} +\DeclareSIUnit\rms{rms} \makeindex \makeglossaries