From e5e6f1aa7ac4850775402e0dc67aabef66087a5b Mon Sep 17 00:00:00 2001 From: Thomas Dehaeze Date: Wed, 3 Jun 2020 22:43:54 +0200 Subject: [PATCH] Update many posts --- config.toml | 21 +- content/{paper => article}/_index.md | 0 .../alkhatib03_activ_struc_vibrat_contr.md | 14 +- .../{paper => article}/bibel92_guidel_h.md | 24 +- .../bryson93_contr_spacec_aircr.md | 6 +- .../butler11_posit_contr_lithog_equip.md | 20 + ...0_ident_decoup_contr_flexur_joint_hexap.md | 108 + .../claeyssen07_amplif_piezoel_actuat.md | 21 + ...ette11_review_activ_vibrat_isolat_strat.md | 6 +- .../{paper => article}/collette14_vibrat.md | 4 +- ...ette15_sensor_fusion_method_high_perfor.md | 4 +- .../dasgupta00_stewar_platf_manip.md | 4 +- .../devasia07_survey_contr_issues_nanop.md | 6 +- ...fleming10_nanop_system_with_force_feedb.md | 6 +- content/article/fleming12_estim.md | 22 + ...eming13_review_nanom_resol_posit_sensor.md | 17 +- .../furqan17_studies_stewar_platf_manip.md | 22 + ...tani04_nanom_cuttin_machin_using_stewar.md | 4 +- .../gao15_measur_techn_precis_posit.md | 20 + .../garg07_implem_chall_multiv_contr.md | 4 +- ...geng95_intel_contr_system_multip_degree.md | 4 +- content/article/hanieh03_activ_stewar.md | 20 + .../hauge04_sensor_contr_space_based_six.md | 16 +- .../holler12_instr_x_ray_nano_imagin.md | 6 +- ..._activ_dampin_based_decoup_colloc_contr.md | 20 + .../ito16_compar_class_high_precis_actuat.md | 8 +- .../jiao18_dynam_model_exper_analy_stewar.md | 20 + .../legnani12_new_isotr_decoup_paral_manip.md | 9 +- .../li01_simul_fault_vibrat_isolat_point.md | 72 +- .../li01_simul_vibrat_isolat_point_contr.md | 23 + .../lin06_distur_atten_precis_hexap_point.md | 21 + ...cinroy00_desig_contr_flexur_joint_hexap.md | 21 + ...inroy02_model_desig_flexur_joint_stewar.md | 228 + ...omen18_advan_motion_contr_precis_mechat.md | 24 + .../poel10_explor_activ_hard_mount_vibrat.md | 20 + ...eumont02_force_feedb_versus_accel_feedb.md | 12 +- .../preumont07_six_axis_singl_stage_activ.md | 16 +- .../saxena12_advan_inter_model_contr_techn.md | 6 +- .../sayed01_survey_spect_factor_method.md | 21 + content/article/schellekens98_desig_precis.md | 20 + ...hroeck01_compen_desig_linear_time_invar.md | 21 + .../sebastian12_nanop_with_multip_sensor.md | 20 + ...eille18_concep_activ_mount_space_applic.md | 96 + .../spanos95_soft_activ_vibrat_isolat.md | 14 +- ...7_inter_charac_rotat_stages_x_ray_nanot.md | 6 +- .../tang18_decen_vibrat_contr_voice_coil.md | 21 + ...fusion_activ_vibrat_isolat_precis_equip.md | 4 +- .../wang12_autom_marker_full_field_hard.md | 29 + ...wang16_inves_activ_vibrat_isolat_stewar.md | 10 +- .../yang19_dynam_model_decoup_contr_flexib.md | 22 +- .../yun20_inves_two_stage_vibrat_suppr.md | 21 + content/{paper => article}/zhang11_six_dof.md | 6 +- ...system_desig_activ_passiv_vibrat_isolat.md | 46 + content/bibliography/_index.md | 0 .../book/du19_multi_actuat_system_contr.md | 56 +- content/book/ewins00_modal.md | 186 +- content/book/hatch00_vibrat_matlab_ansys.md | 2139 +++++++ ..._vibrat_contr_activ_struc_fourt_edition.md | 84 +- ..._desig_high_perfor_mechat_revis_edition.md | 4 +- .../book/skogestad07_multiv_feedb_contr.md | 160 +- content/book/taghirad13_paral.md | 146 +- content/inproceedings/mcinroy99_dynam.md | 173 + .../butler11_posit_contr_lithog_equip.md | 20 - ...0_ident_decoup_contr_flexur_joint_hexap.md | 22 - content/paper/fleming12_estim.md | 22 - .../furqan17_studies_stewar_platf_manip.md | 22 - .../paper/gao15_measur_techn_precis_posit.md | 20 - content/paper/hanieh03_activ_stewar.md | 34 - ..._activ_dampin_based_decoup_colloc_contr.md | 20 - .../jiao18_dynam_model_exper_analy_stewar.md | 20 - .../li01_simul_vibrat_isolat_point_contr.md | 23 - ...omen18_advan_motion_contr_precis_mechat.md | 24 - .../poel10_explor_activ_hard_mount_vibrat.md | 42 - content/paper/schellekens98_desig_precis.md | 20 - .../sebastian12_nanop_with_multip_sensor.md | 20 - .../tang18_decen_vibrat_contr_voice_coil.md | 21 - .../wang12_autom_marker_full_field_hard.md | 29 - content/phdthesis/jabben07_mechat.md | 224 + .../monkhorst04_dynam_error_budget.md | 166 + content/posts/homepages.md | 18 + content/zettels/actuator_fusion.md | 34 + content/zettels/actuators.md | 37 +- content/zettels/complementary_filters.md | 2 + content/zettels/cubic_architecture.md | 18 +- content/zettels/dynamic_error_budgeting.md | 58 + content/zettels/electronics.md | 1 + content/zettels/finite_element_model.md | 31 + content/zettels/flexible_joints.md | 40 +- content/zettels/force_sensors.md | 6 + content/zettels/hac_hac.md | 24 +- content/zettels/inertial_sensors.md | 9 +- content/zettels/irr_and_fir_filters.md | 52 + content/zettels/matlab.md | 66 + content/zettels/multivariable_control.md | 4 +- .../nano_active_stabilization_system.md | 2 +- content/zettels/norms.md | 64 + content/zettels/position_sensors.md | 23 +- content/zettels/positioning_stations.md | 2 +- content/zettels/precision_engineering.md | 2 +- content/zettels/reference_books.md | 2 +- content/zettels/sensor_fusion.md | 5 +- content/zettels/signal_to_noise_ratio.md | 35 + content/zettels/stewart_platforms.md | 57 +- content/zettels/vibration_isolation.md | 7 +- content/zettels/virtual_sensor_fusion.md | 15 + public/404.html | 148 + public/android-chrome-192x192.png | Bin 0 -> 11033 bytes public/android-chrome-512x512.png | Bin 0 -> 31307 bytes public/apple-touch-icon.png | Bin 0 -> 31307 bytes .../albertos04_multiv_contr_system/index.html | 176 + .../index.html | 178 + .../du19_multi_actuat_system_contr/index.html | 601 ++ public/book/ewins00_modal/index.html | 3891 +++++++++++++ .../index.html | 177 + .../index.html | 176 + public/book/index.html | 218 + public/book/index.xml | 135 + .../index.html | 222 + .../index.html | 176 + .../index.html | 1300 +++++ .../index.html | 205 + .../skogestad07_multiv_feedb_contr/index.html | 4975 +++++++++++++++++ public/book/taghirad13_paral/index.html | 2277 ++++++++ public/browserconfig.xml | 9 + public/categories/cat1/index.html | 157 + public/categories/cat1/index.xml | 24 + public/categories/cat1/page/1/index.html | 1 + public/categories/cat2/index.html | 157 + public/categories/cat2/index.xml | 24 + public/categories/cat2/page/1/index.html | 1 + public/categories/index.html | 151 + public/categories/index.xml | 32 + public/favicon-16x16.png | Bin 0 -> 1806 bytes public/favicon-32x32.png | Bin 0 -> 1806 bytes public/favicon.ico | Bin 0 -> 328299 bytes .../fonts/chancery/apple-chancery-webfont.eot | Bin 0 -> 26058 bytes .../fonts/chancery/apple-chancery-webfont.svg | 228 + .../fonts/chancery/apple-chancery-webfont.ttf | Bin 0 -> 60780 bytes .../chancery/apple-chancery-webfont.woff | Bin 0 -> 30256 bytes .../chancery/apple-chancery-webfont.woff2 | Bin 0 -> 23532 bytes public/fonts/iconfont/iconfont.eot | Bin 0 -> 10420 bytes public/fonts/iconfont/iconfont.svg | 60 + public/fonts/iconfont/iconfont.ttf | Bin 0 -> 10256 bytes public/fonts/iconfont/iconfont.woff | Bin 0 -> 10336 bytes public/img/spinner.svg | 49 + public/index.html | 155 + public/index.json | 1 + public/index.xml | 867 +++ ...f8c1d99c3dd797297e7e8cbc59a41da450bb334.js | 283 + public/lib/highlight/highlight.pack.js | 2 + public/lib/jquery/jquery-3.2.1.min.js | 4 + public/lib/search/search.js | 108 + public/lib/slideout/slideout-1.0.1.min.js | 1 + public/lib/timeago/timeago-3.0.2.min.js | 1 + .../lib/timeago/timeago.locales-3.0.2.min.js | 1 + public/manifest.json | 18 + public/mstile-150x150.png | Bin 0 -> 31307 bytes public/ox-hugo/alkhatib03_1dof_control.png | Bin 0 -> 9645 bytes public/ox-hugo/alkhatib03_hinf_control.png | Bin 0 -> 26024 bytes public/ox-hugo/bibel92_control_diag.png | Bin 0 -> 15365 bytes public/ox-hugo/bibel92_general_plant.png | Bin 0 -> 7714 bytes public/ox-hugo/bibel92_hinf_weights.png | Bin 0 -> 42006 bytes public/ox-hugo/bibel92_unmodeled_dynamics.png | Bin 0 -> 11685 bytes public/ox-hugo/bibel92_weight_dynamics.png | Bin 0 -> 20466 bytes public/ox-hugo/bryson93_hac_lac.png | Bin 0 -> 127304 bytes .../collette11_comp_isolation_strategies.png | Bin 0 -> 96182 bytes .../devasia07_piezoelectric_tradeoff.png | Bin 0 -> 14700 bytes public/ox-hugo/du19_decoupled_control.png | Bin 0 -> 44020 bytes public/ox-hugo/du19_dual_stage_control.png | Bin 0 -> 74358 bytes public/ox-hugo/du19_dual_stage_loop_gain.png | Bin 0 -> 88684 bytes .../ox-hugo/du19_dual_stage_sensitivity.png | Bin 0 -> 197561 bytes public/ox-hugo/du19_h_inf_diagram.png | Bin 0 -> 25173 bytes public/ox-hugo/du19_open_loop_three_stage.png | Bin 0 -> 145211 bytes .../du19_parallel_control_structure.png | Bin 0 -> 43753 bytes public/ox-hugo/du19_pzt_actuator.png | Bin 0 -> 124243 bytes .../ox-hugo/du19_sensitivity_three_stage.png | Bin 0 -> 127058 bytes public/ox-hugo/du19_single_stage_control.png | Bin 0 -> 24775 bytes public/ox-hugo/du19_three_stage_control.png | Bin 0 -> 81506 bytes public/ox-hugo/du19_three_stage_decoupled.png | Bin 0 -> 97122 bytes .../du19_three_stage_decoupled_loop_gain.png | Bin 0 -> 136289 bytes public/ox-hugo/ewins00_H22_with_residual.png | Bin 0 -> 98435 bytes .../ox-hugo/ewins00_H22_without_residual.png | Bin 0 -> 123273 bytes public/ox-hugo/ewins00_PRF_measured_FRF.png | Bin 0 -> 200669 bytes public/ox-hugo/ewins00_PRF_measured_PRF.png | Bin 0 -> 217651 bytes public/ox-hugo/ewins00_PRF_measured_svd.png | Bin 0 -> 45676 bytes public/ox-hugo/ewins00_PRF_numerical_FRF.png | Bin 0 -> 173167 bytes public/ox-hugo/ewins00_PRF_numerical_PRF.png | Bin 0 -> 174413 bytes public/ox-hugo/ewins00_PRF_numerical_svd.png | Bin 0 -> 31779 bytes public/ox-hugo/ewins00_aliasing.png | Bin 0 -> 43836 bytes .../ox-hugo/ewins00_aliasing_distortion.png | Bin 0 -> 24084 bytes .../ewins00_aliasing_no_distortion.png | Bin 0 -> 14407 bytes public/ox-hugo/ewins00_argand_diagram_a.png | Bin 0 -> 23296 bytes public/ox-hugo/ewins00_argand_diagram_b.png | Bin 0 -> 26367 bytes public/ox-hugo/ewins00_argand_diagram_c.png | Bin 0 -> 46517 bytes .../ewins00_base_excitation_modal_setup.png | Bin 0 -> 55864 bytes public/ox-hugo/ewins00_beam_modes.png | Bin 0 -> 78881 bytes public/ox-hugo/ewins00_bode_accelerance.png | Bin 0 -> 157092 bytes public/ox-hugo/ewins00_bode_mobility.png | Bin 0 -> 156792 bytes public/ox-hugo/ewins00_bode_receptance.png | Bin 0 -> 164117 bytes public/ox-hugo/ewins00_burst_excitation.png | Bin 0 -> 92068 bytes public/ox-hugo/ewins00_calibration_setup.png | Bin 0 -> 109015 bytes public/ox-hugo/ewins00_chirp_excitation.png | Bin 0 -> 173371 bytes .../ewins00_circle_fit_natural_frequency.png | Bin 0 -> 34029 bytes .../ox-hugo/ewins00_coherence_resonance.png | Bin 0 -> 89092 bytes public/ox-hugo/ewins00_composite_raw.png | Bin 0 -> 202225 bytes public/ox-hugo/ewins00_composite_sum.png | Bin 0 -> 46370 bytes .../ewins00_conventional_modal_test_setup.png | Bin 0 -> 51870 bytes public/ox-hugo/ewins00_double_hits.png | Bin 0 -> 27976 bytes public/ox-hugo/ewins00_dry_friction.png | Bin 0 -> 21412 bytes public/ox-hugo/ewins00_frf_damped_system.png | Bin 0 -> 95868 bytes public/ox-hugo/ewins00_frf_feedback_model.png | Bin 0 -> 64681 bytes public/ox-hugo/ewins00_frf_mimo.png | Bin 0 -> 64885 bytes public/ox-hugo/ewins00_frf_siso_model.png | Bin 0 -> 28955 bytes .../ewins00_general_frf_measurement_setup.png | Bin 0 -> 51111 bytes public/ox-hugo/ewins00_hammer_impulse.png | Bin 0 -> 37586 bytes .../ox-hugo/ewins00_impulsive_excitation.png | Bin 0 -> 94665 bytes public/ox-hugo/ewins00_inverse_frf_mixed.png | Bin 0 -> 29244 bytes .../ox-hugo/ewins00_inverse_frf_viscous.png | Bin 0 -> 27179 bytes public/ox-hugo/ewins00_leakage_nok.png | Bin 0 -> 29840 bytes public/ox-hugo/ewins00_leakage_ok.png | Bin 0 -> 37329 bytes .../ox-hugo/ewins00_low_medium_high_modes.png | Bin 0 -> 124333 bytes public/ox-hugo/ewins00_mass_cancellation.png | Bin 0 -> 97312 bytes .../ox-hugo/ewins00_material_histeresis.png | Bin 0 -> 21682 bytes public/ox-hugo/ewins00_mifs.png | Bin 0 -> 76711 bytes .../ewins00_mobility_frf_mdof_point.png | Bin 0 -> 97994 bytes .../ewins00_mobility_frf_mdof_transfer.png | Bin 0 -> 91973 bytes .../ewins00_modal_analysis_schematic.png | Bin 0 -> 53497 bytes public/ox-hugo/ewins00_modal_circle.png | Bin 0 -> 42588 bytes public/ox-hugo/ewins00_modal_circle_bis.png | Bin 0 -> 54694 bytes .../ewins00_nyquist_nonpropdamp_point.png | Bin 0 -> 36227 bytes .../ewins00_nyquist_nonpropdamp_transfer.png | Bin 0 -> 34865 bytes public/ox-hugo/ewins00_nyquist_point.png | Bin 0 -> 35198 bytes .../ewins00_nyquist_receptance_structural.png | Bin 0 -> 24169 bytes .../ewins00_nyquist_receptance_viscous.png | Bin 0 -> 23386 bytes public/ox-hugo/ewins00_nyquist_transfer.png | Bin 0 -> 37651 bytes public/ox-hugo/ewins00_peak_amplitude.png | Bin 0 -> 49139 bytes .../ox-hugo/ewins00_piezo_accelerometer.png | Bin 0 -> 32429 bytes .../ewins00_piezo_force_transducer.png | Bin 0 -> 40207 bytes .../ox-hugo/ewins00_plot_receptance_imag.png | Bin 0 -> 31849 bytes .../ox-hugo/ewins00_plot_receptance_real.png | Bin 0 -> 33427 bytes .../ewins00_random_autocorrelation.png | Bin 0 -> 17205 bytes public/ox-hugo/ewins00_random_psd.png | Bin 0 -> 18035 bytes public/ox-hugo/ewins00_random_time.png | Bin 0 -> 25430 bytes public/ox-hugo/ewins00_real_complex_modes.png | Bin 0 -> 198529 bytes public/ox-hugo/ewins00_residual_with.png | Bin 0 -> 54930 bytes public/ox-hugo/ewins00_residual_without.png | Bin 0 -> 67955 bytes .../ox-hugo/ewins00_rotational_excitation.png | Bin 0 -> 36257 bytes .../ewins00_rotational_measurement.png | Bin 0 -> 28145 bytes public/ox-hugo/ewins00_sdof_model.png | Bin 0 -> 38390 bytes public/ox-hugo/ewins00_sdof_modulus_phase.png | Bin 0 -> 42684 bytes public/ox-hugo/ewins00_sdof_response.png | Bin 0 -> 72075 bytes public/ox-hugo/ewins00_shaker_mount_1.png | Bin 0 -> 26766 bytes public/ox-hugo/ewins00_shaker_mount_2.png | Bin 0 -> 26333 bytes public/ox-hugo/ewins00_shaker_mount_3.png | Bin 0 -> 39833 bytes public/ox-hugo/ewins00_shaker_rod.png | Bin 0 -> 185426 bytes public/ox-hugo/ewins00_static_display.png | Bin 0 -> 187890 bytes public/ox-hugo/ewins00_sweep_distortions.png | Bin 0 -> 64007 bytes .../ewins00_transducer_mounting_response.png | Bin 0 -> 130870 bytes .../ewins00_transducer_mounting_types.png | Bin 0 -> 60731 bytes .../ewins00_transmissibility_plots.png | Bin 0 -> 107219 bytes .../ewins00_vibration_analysis_procedure.png | Bin 0 -> 14621 bytes public/ox-hugo/ewins00_viscous_damper.png | Bin 0 -> 24821 bytes public/ox-hugo/ewins00_windowing_examples.png | Bin 0 -> 118432 bytes public/ox-hugo/ewins00_zoom_bandpass.png | Bin 0 -> 19075 bytes public/ox-hugo/ewins00_zoom_range.png | Bin 0 -> 24766 bytes public/ox-hugo/ewins00_zoom_result.png | Bin 0 -> 24791 bytes .../ox-hugo/fleming10_charge_ampl_piezo.png | Bin 0 -> 60063 bytes public/ox-hugo/fleming10_piezo_model.png | Bin 0 -> 4505 bytes public/ox-hugo/fleming13_drift_stability.png | Bin 0 -> 43211 bytes public/ox-hugo/fleming13_mapping_error.png | Bin 0 -> 42143 bytes .../fleming13_tradeoff_res_bandwidth.png | Bin 0 -> 31047 bytes public/ox-hugo/furutani04_ctrl_arch.png | Bin 0 -> 40794 bytes public/ox-hugo/geng95_control_structure.png | Bin 0 -> 67819 bytes .../ox-hugo/hac_lac_control_architecture.png | Bin 0 -> 10628 bytes .../hauge04_obtained_transmissibility.png | Bin 0 -> 63684 bytes public/ox-hugo/hauge04_stewart_platform.png | Bin 0 -> 281111 bytes public/ox-hugo/hauge04_strut_model.png | Bin 0 -> 35670 bytes public/ox-hugo/hauge05_struts.png | Bin 0 -> 192731 bytes public/ox-hugo/holler12_station.png | Bin 0 -> 216055 bytes ...sensors_characteristics_accelerometers.png | Bin 0 -> 117175 bytes ...rtial_sensors_characteristics_geophone.png | Bin 0 -> 110214 bytes .../ito16_low_high_stiffness_actuators.png | Bin 0 -> 83784 bytes public/ox-hugo/ito16_transmissibility.png | Bin 0 -> 52322 bytes .../ox-hugo/legnani12_generated_isotropy.png | Bin 0 -> 42802 bytes public/ox-hugo/legnani12_isotropy_gen.png | Bin 0 -> 25532 bytes public/ox-hugo/li01_closed_loop_pointing.png | Bin 0 -> 79673 bytes public/ox-hugo/li01_closed_loop_vibration.png | Bin 0 -> 67447 bytes public/ox-hugo/li01_decoupling_conf.png | Bin 0 -> 4256 bytes public/ox-hugo/li01_decoupling_conf_bis.png | Bin 0 -> 3726 bytes .../li01_effect_isolation_loop_closed.png | Bin 0 -> 66979 bytes public/ox-hugo/li01_feedforward_control.png | Bin 0 -> 19222 bytes public/ox-hugo/li01_parallel_control.png | Bin 0 -> 28289 bytes public/ox-hugo/li01_pointing_control.png | Bin 0 -> 36915 bytes .../li01_simultaneous_control_results.png | Bin 0 -> 72075 bytes public/ox-hugo/li01_stewart_platform.png | Bin 0 -> 224867 bytes public/ox-hugo/li01_test_bench.png | Bin 0 -> 228647 bytes .../ox-hugo/li01_vibration_control_plant.png | Bin 0 -> 84097 bytes .../li01_vibration_isolation_control.png | Bin 0 -> 30653 bytes ...01_vibration_isolation_control_results.png | Bin 0 -> 74714 bytes public/ox-hugo/oomen18_next_gen_loop_gain.png | Bin 0 -> 25731 bytes .../position_sensor_characteristics.png | Bin 0 -> 114449 bytes ...sensor_characteristics_relative_sensor.png | Bin 0 -> 81470 bytes ...sition_sensor_interferometer_precision.png | Bin 0 -> 474176 bytes .../ox-hugo/preumont02_force_acc_fb_heavy.png | Bin 0 -> 26786 bytes .../ox-hugo/preumont02_force_acc_fb_light.png | Bin 0 -> 26041 bytes public/ox-hugo/preumont07_flexible_joints.png | Bin 0 -> 49642 bytes .../preumont07_iff_effect_stiffness.png | Bin 0 -> 16270 bytes .../ox-hugo/preumont07_stewart_platform.png | Bin 0 -> 208739 bytes public/ox-hugo/preumont18_alternating_p_z.png | Bin 0 -> 22347 bytes public/ox-hugo/preumont18_bridge_circuit.png | Bin 0 -> 19748 bytes public/ox-hugo/preumont18_cas_plot.png | Bin 0 -> 12501 bytes .../preumont18_classical_feedback_small.png | Bin 0 -> 9538 bytes .../preumont18_collocated_control_frf.png | Bin 0 -> 24998 bytes public/ox-hugo/preumont18_collocated_zero.png | Bin 0 -> 13427 bytes public/ox-hugo/preumont18_design_steps.png | Bin 0 -> 50377 bytes ...eumont18_electro_mechanical_transducer.png | Bin 0 -> 27259 bytes .../preumont18_feedforward_adaptative.png | Bin 0 -> 7505 bytes public/ox-hugo/preumont18_general_plant.png | Bin 0 -> 10452 bytes public/ox-hugo/preumont18_geophone.png | Bin 0 -> 16850 bytes public/ox-hugo/preumont18_hac_lac_control.png | Bin 0 -> 17402 bytes public/ox-hugo/preumont18_neglected_modes.png | Bin 0 -> 37408 bytes .../preumont18_piezo_admittance_curve.png | Bin 0 -> 14452 bytes public/ox-hugo/preumont18_piezo_discrete.png | Bin 0 -> 9322 bytes public/ox-hugo/preumont18_piezo_stack.png | Bin 0 -> 4370 bytes .../preumont18_piezo_stack_admittance.png | Bin 0 -> 12188 bytes .../preumont18_proof_mass_actuator.png | Bin 0 -> 16468 bytes public/ox-hugo/preumont18_proof_mass_tf.png | Bin 0 -> 14600 bytes public/ox-hugo/preumont18_smart_materials.png | Bin 0 -> 93674 bytes .../preumont18_voice_coil_schematic.png | Bin 0 -> 28918 bytes .../schmidt14_high_low_freq_regions.png | Bin 0 -> 379320 bytes .../skogestad07_additive_uncertainty.png | Bin 0 -> 9393 bytes .../skogestad07_block_diagonal_scalings.png | Bin 0 -> 17783 bytes .../ox-hugo/skogestad07_cascade_control.png | Bin 0 -> 11085 bytes ...skogestad07_cascade_control_two_layers.png | Bin 0 -> 19788 bytes .../skogestad07_cascade_extra_input.png | Bin 0 -> 9069 bytes .../skogestad07_cascade_extra_meas.png | Bin 0 -> 8116 bytes ...kogestad07_classical_feedback_2dof_alt.png | Bin 0 -> 8126 bytes ...estad07_classical_feedback_2dof_simple.png | Bin 0 -> 2931 bytes .../skogestad07_classical_feedback_alt.png | Bin 0 -> 8322 bytes .../skogestad07_classical_feedback_bis.png | Bin 0 -> 7592 bytes .../skogestad07_classical_feedback_meas.png | Bin 0 -> 9242 bytes .../skogestad07_classical_feedback_sep.png | Bin 0 -> 9553 bytes .../skogestad07_classical_feedback_small.png | Bin 0 -> 6766 bytes ...ogestad07_classical_feedback_stability.png | Bin 0 -> 6926 bytes .../skogestad07_coprime_uncertainty.png | Bin 0 -> 14337 bytes .../skogestad07_coprime_uncertainty_bis.png | Bin 0 -> 15104 bytes .../skogestad07_coprime_uncertainty_hinf.png | Bin 0 -> 17773 bytes ...estad07_decentralized_diagonal_control.png | Bin 0 -> 13952 bytes .../skogestad07_design_trade_off_mimo_gk.png | Bin 0 -> 21412 bytes .../ox-hugo/skogestad07_dk_iter_d_scale.png | Bin 0 -> 23800 bytes public/ox-hugo/skogestad07_dk_iter_mu.png | Bin 0 -> 23254 bytes .../ox-hugo/skogestad07_general_control.png | Bin 0 -> 5211 bytes .../skogestad07_general_control_Mdelta.png | Bin 0 -> 3003 bytes ...skogestad07_general_control_Mdelta_bis.png | Bin 0 -> 3003 bytes .../skogestad07_general_control_Ndelta.png | Bin 0 -> 3765 bytes .../skogestad07_general_control_delta.png | Bin 0 -> 5373 bytes .../skogestad07_general_control_names.png | Bin 0 -> 12214 bytes .../skogestad07_general_control_names_bis.png | Bin 0 -> 12214 bytes .../skogestad07_general_plant_weights.png | Bin 0 -> 13714 bytes .../ox-hugo/skogestad07_hinf_signal_based.png | Bin 0 -> 18571 bytes ...gestad07_hinf_signal_based_uncertainty.png | Bin 0 -> 22585 bytes .../skogestad07_hinf_synthesis_2dof.png | Bin 0 -> 13735 bytes .../skogestad07_input_output_uncertainty.png | Bin 0 -> 12940 bytes .../ox-hugo/skogestad07_input_uncertainty.png | Bin 0 -> 9539 bytes .../skogestad07_input_uncertainty_hinf.png | Bin 0 -> 9414 bytes .../skogestad07_input_uncertainty_set.png | Bin 0 -> 9539 bytes ...estad07_input_uncertainty_set_feedback.png | Bin 0 -> 12166 bytes ..._input_uncertainty_set_feedback_weight.png | Bin 0 -> 15725 bytes ...ut_uncertainty_set_feedback_weight_bis.png | Bin 0 -> 14004 bytes .../skogestad07_inv_additive_uncertainty.png | Bin 0 -> 10080 bytes .../skogestad07_inv_input_uncertainty.png | Bin 0 -> 9909 bytes .../skogestad07_inv_output_uncertainty.png | Bin 0 -> 10406 bytes .../skogestad07_inverse_uncertainty_set.png | Bin 0 -> 13564 bytes .../skogestad07_lag_delay_uncertainty.png | Bin 0 -> 13062 bytes public/ox-hugo/skogestad07_lqg_integral.png | Bin 0 -> 12160 bytes .../ox-hugo/skogestad07_lqg_kalman_filter.png | Bin 0 -> 23234 bytes public/ox-hugo/skogestad07_lqg_separation.png | Bin 0 -> 9120 bytes .../skogestad07_margin_requirements.png | Bin 0 -> 58575 bytes ...tad07_mixed_sensitivity_dist_rejection.png | Bin 0 -> 20325 bytes ...estad07_mixed_sensitivity_ref_tracking.png | Bin 0 -> 17298 bytes .../skogestad07_mixed_sensitivity_s_t.png | Bin 0 -> 17383 bytes .../skogestad07_mu_plot_optimal_k3.png | Bin 0 -> 17293 bytes .../skogestad07_mu_plots_distillation.png | Bin 0 -> 15092 bytes .../skogestad07_neglected_first_order_lag.png | Bin 0 -> 14390 bytes .../skogestad07_neglected_time_delay.png | Bin 0 -> 23898 bytes ...gestad07_nyquist_performance_condition.png | Bin 0 -> 12635 bytes .../skogestad07_nyquist_uncertainty.png | Bin 0 -> 13642 bytes .../skogestad07_optimize_control_a.png | Bin 0 -> 4737 bytes .../skogestad07_optimize_control_b.png | Bin 0 -> 7804 bytes .../skogestad07_optimize_control_c.png | Bin 0 -> 6002 bytes .../skogestad07_output_uncertainty.png | Bin 0 -> 9867 bytes .../ox-hugo/skogestad07_partial_control.png | Bin 0 -> 13742 bytes public/ox-hugo/skogestad07_perturb_s_k3.png | Bin 0 -> 20492 bytes public/ox-hugo/skogestad07_shaped_plant.png | Bin 0 -> 8010 bytes ...ad07_shapping_practical_implementation.png | Bin 0 -> 10684 bytes .../ox-hugo/skogestad07_system_hierarchy.png | Bin 0 -> 36866 bytes ...skogestad07_uncertainty_disc_generated.png | Bin 0 -> 10668 bytes .../skogestad07_uncertainty_region.png | Bin 0 -> 12039 bytes ...skogestad07_uncertainty_state_a_matrix.png | Bin 0 -> 12550 bytes .../skogestad07_uncertainty_weight.png | Bin 0 -> 76901 bytes .../skogestad07_weight_anti_windup.png | Bin 0 -> 7469 bytes .../skogestad07_weight_first_order.png | Bin 0 -> 15854 bytes .../skogestad07_weights_distillation.png | Bin 0 -> 14481 bytes public/ox-hugo/spanos95_iff_plant.png | Bin 0 -> 54672 bytes public/ox-hugo/spanos95_results.png | Bin 0 -> 59650 bytes public/ox-hugo/spanos95_stewart_platform.png | Bin 0 -> 428430 bytes public/ox-hugo/stankevic17_station.png | Bin 0 -> 191062 bytes .../taghira13_cascade_force_inner_loop_F.png | Bin 0 -> 25264 bytes ...taghira13_cascade_force_inner_loop_tau.png | Bin 0 -> 26513 bytes ...ghira13_cascade_force_inner_loop_tau_q.png | Bin 0 -> 24032 bytes .../taghira13_cascade_force_outer_loop.png | Bin 0 -> 24763 bytes ...taghira13_cascade_force_outer_loop_tau.png | Bin 0 -> 26628 bytes ...ghira13_cascade_force_outer_loop_tau_q.png | Bin 0 -> 26993 bytes .../taghira13_direct_force_control.png | Bin 0 -> 35029 bytes .../ox-hugo/taghira13_impedance_control.png | Bin 0 -> 35170 bytes ..._adaptative_inverse_control_task_space.png | Bin 0 -> 29079 bytes ...taghirad13_angular_momentum_rigid_body.png | Bin 0 -> 43753 bytes public/ox-hugo/taghirad13_cascade_control.png | Bin 0 -> 27920 bytes ...taghirad13_consecutive_transformations.png | Bin 0 -> 21751 bytes ...3_decentralized_pd_control_joint_space.png | Bin 0 -> 23553 bytes ...13_decentralized_pd_control_task_space.png | Bin 0 -> 13569 bytes ...hirad13_feedforward_control_task_space.png | Bin 0 -> 21711 bytes ...d13_feedforward_pd_control_joint_space.png | Bin 0 -> 20044 bytes .../taghirad13_free_body_diagram_stewart.png | Bin 0 -> 75003 bytes public/ox-hugo/taghirad13_general_motion.png | Bin 0 -> 13845 bytes ...rad13_general_topology_motion_feedback.png | Bin 0 -> 18067 bytes ...3_general_topology_motion_feedback_bis.png | Bin 0 -> 28377 bytes ...eneral_topology_motion_feedback_quater.png | Bin 0 -> 24801 bytes ...3_general_topology_motion_feedback_ter.png | Bin 0 -> 22713 bytes .../taghirad13_impedance_control_rlc.png | Bin 0 -> 18654 bytes ...3_inverse_dynamics_control_joint_space.png | Bin 0 -> 20621 bytes ...13_inverse_dynamics_control_task_space.png | Bin 0 -> 19131 bytes .../taghirad13_mass_property_rigid_body.png | Bin 0 -> 47085 bytes public/ox-hugo/taghirad13_pitch-roll-yaw.png | Bin 0 -> 42520 bytes .../ox-hugo/taghirad13_rigid_body_motion.png | Bin 0 -> 27079 bytes ...d13_robust_inverse_dynamics_task_space.png | Bin 0 -> 20469 bytes public/ox-hugo/taghirad13_rotation_matrix.png | Bin 0 -> 19927 bytes .../taghirad13_screw_axis_representation.png | Bin 0 -> 27223 bytes public/ox-hugo/taghirad13_stewart36.png | Bin 0 -> 41322 bytes .../taghirad13_stewart_forward_dynamics.png | Bin 0 -> 22588 bytes .../taghirad13_stewart_inverse_dynamics.png | Bin 0 -> 86485 bytes .../ox-hugo/taghirad13_stewart_schematic.png | Bin 0 -> 34643 bytes .../taghirad13_stewart_static_forces.png | Bin 0 -> 16646 bytes public/ox-hugo/wang16_force_feedback.png | Bin 0 -> 35880 bytes public/ox-hugo/wang16_stewart_platform.png | Bin 0 -> 352644 bytes public/ox-hugo/yang19_control_arch.png | Bin 0 -> 12120 bytes public/ox-hugo/yang19_flexible_joints.png | Bin 0 -> 85949 bytes public/ox-hugo/yang19_results.png | Bin 0 -> 69773 bytes public/ox-hugo/yang19_stewart_platform.png | Bin 0 -> 90406 bytes public/ox-hugo/zhang11_platform.png | Bin 0 -> 246550 bytes .../index.html | 426 ++ public/paper/bibel92_guidel_h/index.html | 352 ++ .../bryson93_contr_spacec_aircr/index.html | 242 + .../index.html | 203 + .../index.html | 205 + .../index.html | 278 + public/paper/collette14_vibrat/index.html | 317 ++ .../index.html | 210 + .../dasgupta00_stewar_platf_manip/index.html | 251 + .../index.html | 220 + .../index.html | 309 + public/paper/fleming12_estim/index.html | 205 + .../index.html | 409 ++ .../index.html | 205 + .../index.html | 225 + .../index.html | 203 + .../index.html | 225 + .../index.html | 213 + public/paper/hanieh03_activ_stewar/index.html | 217 + .../index.html | 377 ++ .../index.html | 241 + .../index.html | 203 + public/paper/index.html | 398 ++ public/paper/index.xml | 439 ++ .../index.html | 284 + .../index.html | 203 + .../index.html | 221 + .../index.html | 462 ++ .../index.html | 207 + .../index.html | 213 + .../index.html | 225 + .../index.html | 241 + .../index.html | 248 + .../index.html | 265 + .../schellekens98_desig_precis/index.html | 203 + .../index.html | 203 + .../index.html | 259 + .../index.html | 224 + .../index.html | 204 + .../index.html | 228 + .../index.html | 211 + .../index.html | 248 + .../index.html | 340 ++ public/paper/zhang11_six_dof/index.html | 222 + public/robots.txt | 2 + ...47958dc936e1c95c28a76ac80319bca9708ed1.css | 1 + ...4454558b3f3cfcb28a151e820757f148c14a35.css | 1 + public/search/index.html | 176 + public/sitemap.xml | 550 ++ public/sitemap.xsl | 115 + public/tags/index.html | 152 + public/tags/index.xml | 32 + public/tags/tag1/index.html | 157 + public/tags/tag1/index.xml | 24 + public/tags/tag1/page/1/index.html | 1 + public/tags/tag2/index.html | 157 + public/tags/tag2/index.xml | 24 + public/tags/tag2/page/1/index.html | 1 + public/websites/control_bootcamp/index.html | 208 + .../index.html | 238 + public/websites/index.html | 168 + public/websites/index.xml | 38 + public/websites/page/1/index.html | 1 + public/zettels/active_damping/index.html | 201 + public/zettels/actuators/index.html | 324 ++ .../zettels/complementary_filters/index.html | 204 + public/zettels/cubic_architecture/index.html | 206 + public/zettels/electronics/index.html | 204 + public/zettels/flexible_joints/index.html | 210 + public/zettels/force_sensors/index.html | 219 + public/zettels/h_infinity_control/index.html | 212 + public/zettels/hac_hac/index.html | 217 + public/zettels/index.html | 284 + public/zettels/index.xml | 284 + public/zettels/inertial_sensors/index.html | 273 + public/zettels/metrology/index.html | 204 + public/zettels/motion_control/index.html | 204 + .../zettels/multivariable_control/index.html | 208 + .../index.html | 206 + public/zettels/position_sensors/index.html | 551 ++ .../zettels/positioning_stations/index.html | 206 + .../zettels/precision_engineering/index.html | 205 + public/zettels/reference_books/index.html | 209 + public/zettels/sensor_fusion/index.html | 208 + public/zettels/stewart_platforms/index.html | 223 + .../zettels/system_identification/index.html | 204 + public/zettels/test/index.html | 269 + public/zettels/vibration_isolation/index.html | 218 + ...s_48b060fe05b0a273d182ef83c0605941.content | 0 ...scss_48b060fe05b0a273d182ef83c0605941.json | 1 + ...s_48b060fe05b0a273d182ef83c0605941.content | 1 + ...scss_48b060fe05b0a273d182ef83c0605941.json | 1 + ...s_48b060fe05b0a273d182ef83c0605941.content | 1 + ...scss_48b060fe05b0a273d182ef83c0605941.json | 1 + static/ox-hugo/chen00_flexure_hexapod.png | Bin 0 -> 45673 bytes .../collette12_absolute_disp_sensors.png | Bin 0 -> 69901 bytes .../hatch00_cant_beam_gramian_balanced.png | Bin 0 -> 29389 bytes .../ox-hugo/hatch00_cant_beam_modes_freq.png | Bin 0 -> 57193 bytes .../hatch00_cant_beam_sorted_dc_gains.png | Bin 0 -> 54385 bytes .../hatch00_cant_beam_unsorted_dc_gains.png | Bin 0 -> 94693 bytes static/ox-hugo/hatch00_cantilever_beam.png | Bin 0 -> 17401 bytes .../ox-hugo/hatch00_disk_drive_mimo_ansys.png | Bin 0 -> 112380 bytes .../hatch00_disk_drive_mimo_schematic.png | Bin 0 -> 123954 bytes ...hatch00_disk_drive_nodes_reduced_model.png | Bin 0 -> 96345 bytes .../ox-hugo/hatch00_disk_drive_siso_model.png | Bin 0 -> 118750 bytes static/ox-hugo/hatch00_gramians.png | Bin 0 -> 92901 bytes .../hatch00_modal_analysis_flowchart.png | Bin 0 -> 155919 bytes static/ox-hugo/hatch00_modal_matrix.png | Bin 0 -> 14662 bytes .../ox-hugo/hatch00_model_reduction_chart.png | Bin 0 -> 116908 bytes static/ox-hugo/hatch00_n_dof_zeros.png | Bin 0 -> 104270 bytes .../hatch00_roadmap_modal_solution.png | Bin 0 -> 31717 bytes .../hatch00_schematic_modal_solution.png | Bin 0 -> 35677 bytes static/ox-hugo/hatch00_tdof_mode_1.png | Bin 0 -> 14058 bytes static/ox-hugo/hatch00_tdof_mode_2.png | Bin 0 -> 11839 bytes static/ox-hugo/hatch00_tdof_mode_3.png | Bin 0 -> 14560 bytes static/ox-hugo/hatch00_tdof_model.png | Bin 0 -> 8855 bytes .../ox-hugo/hatch00_undamped_tdof_model.png | Bin 0 -> 10177 bytes static/ox-hugo/hatch00_z11_tf.png | Bin 0 -> 88390 bytes static/ox-hugo/hatch00_z13_tf.png | Bin 0 -> 100162 bytes static/ox-hugo/jabben07_general_plant.png | Bin 0 -> 11265 bytes static/ox-hugo/jabben07_pareto_curve_H2.png | Bin 0 -> 15639 bytes .../ox-hugo/jabben07_weighting_functions.png | Bin 0 -> 8798 bytes static/ox-hugo/mcinroy02_leg_model.png | Bin 0 -> 20710 bytes .../ox-hugo/mcinroy02_model_strut_joint.png | Bin 0 -> 25963 bytes static/ox-hugo/mcinroy99_general_hexapod.png | Bin 0 -> 33252 bytes static/ox-hugo/mcinroy99_strut_model.png | Bin 0 -> 24453 bytes static/ox-hugo/monkhorst04_closed_loop_H2.png | Bin 0 -> 11504 bytes .../monkhorst04_general_weighted_plant.png | Bin 0 -> 8034 bytes .../ox-hugo/monkhorst04_weighting_filter.png | Bin 0 -> 6924 bytes static/ox-hugo/souleille18_model_piezo.png | Bin 0 -> 195738 bytes ...ille18_result_damping_transmissibility.png | Bin 0 -> 123618 bytes static/ox-hugo/souleille18_root_locus.png | Bin 0 -> 239687 bytes .../souleille18_setup_flexible_payload.png | Bin 0 -> 227596 bytes static/ox-hugo/souleille18_tf_iff_result.png | Bin 0 -> 216011 bytes static/ox-hugo/zuo04_piezo_plant.png | Bin 0 -> 50909 bytes static/ox-hugo/zuo04_piezo_spring_series.png | Bin 0 -> 141477 bytes static/ox-hugo/zuo04_voice_coil_plant.png | Bin 0 -> 45201 bytes .../zuo04_voice_coil_spring_parallel.png | Bin 0 -> 124658 bytes themes/clean-even | 2 +- 589 files changed, 41329 insertions(+), 897 deletions(-) rename content/{paper => article}/_index.md (100%) rename content/{paper => article}/alkhatib03_activ_struc_vibrat_contr.md (93%) rename content/{paper => article}/bibel92_guidel_h.md (89%) rename content/{paper => article}/bryson93_contr_spacec_aircr.md (83%) create mode 100644 content/article/butler11_posit_contr_lithog_equip.md create mode 100644 content/article/chen00_ident_decoup_contr_flexur_joint_hexap.md create mode 100644 content/article/claeyssen07_amplif_piezoel_actuat.md rename content/{paper => article}/collette11_review_activ_vibrat_isolat_strat.md (79%) rename content/{paper => article}/collette14_vibrat.md (89%) rename content/{paper => article}/collette15_sensor_fusion_method_high_perfor.md (64%) rename content/{paper => article}/dasgupta00_stewar_platf_manip.md (67%) rename content/{paper => article}/devasia07_survey_contr_issues_nanop.md (51%) rename content/{paper => article}/fleming10_nanop_system_with_force_feedb.md (87%) create mode 100644 content/article/fleming12_estim.md rename content/{paper => article}/fleming13_review_nanom_resol_posit_sensor.md (90%) create mode 100644 content/article/furqan17_studies_stewar_platf_manip.md rename content/{paper => article}/furutani04_nanom_cuttin_machin_using_stewar.md (60%) create mode 100644 content/article/gao15_measur_techn_precis_posit.md rename content/{paper => article}/garg07_implem_chall_multiv_contr.md (69%) rename content/{paper => article}/geng95_intel_contr_system_multip_degree.md (74%) create mode 100644 content/article/hanieh03_activ_stewar.md rename content/{paper => article}/hauge04_sensor_contr_space_based_six.md (88%) rename content/{paper => article}/holler12_instr_x_ray_nano_imagin.md (74%) create mode 100644 content/article/holterman05_activ_dampin_based_decoup_colloc_contr.md rename content/{paper => article}/ito16_compar_class_high_precis_actuat.md (79%) create mode 100644 content/article/jiao18_dynam_model_exper_analy_stewar.md rename content/{paper => article}/legnani12_new_isotr_decoup_paral_manip.md (57%) rename content/{paper => article}/li01_simul_fault_vibrat_isolat_point.md (81%) create mode 100644 content/article/li01_simul_vibrat_isolat_point_contr.md create mode 100644 content/article/lin06_distur_atten_precis_hexap_point.md create mode 100644 content/article/mcinroy00_desig_contr_flexur_joint_hexap.md create mode 100644 content/article/mcinroy02_model_desig_flexur_joint_stewar.md create mode 100644 content/article/oomen18_advan_motion_contr_precis_mechat.md create mode 100644 content/article/poel10_explor_activ_hard_mount_vibrat.md rename content/{paper => article}/preumont02_force_feedb_versus_accel_feedb.md (70%) rename content/{paper => article}/preumont07_six_axis_singl_stage_activ.md (62%) rename content/{paper => article}/saxena12_advan_inter_model_contr_techn.md (84%) create mode 100644 content/article/sayed01_survey_spect_factor_method.md create mode 100644 content/article/schellekens98_desig_precis.md create mode 100644 content/article/schroeck01_compen_desig_linear_time_invar.md create mode 100644 content/article/sebastian12_nanop_with_multip_sensor.md create mode 100644 content/article/souleille18_concep_activ_mount_space_applic.md rename content/{paper => article}/spanos95_soft_activ_vibrat_isolat.md (72%) rename content/{paper => article}/stankevic17_inter_charac_rotat_stages_x_ray_nanot.md (52%) create mode 100644 content/article/tang18_decen_vibrat_contr_voice_coil.md rename content/{paper => article}/tjepkema12_sensor_fusion_activ_vibrat_isolat_precis_equip.md (63%) create mode 100644 content/article/wang12_autom_marker_full_field_hard.md rename content/{paper => article}/wang16_inves_activ_vibrat_isolat_stewar.md (67%) rename content/{paper => article}/yang19_dynam_model_decoup_contr_flexib.md (85%) create mode 100644 content/article/yun20_inves_two_stage_vibrat_suppr.md rename content/{paper => article}/zhang11_six_dof.md (61%) create mode 100644 content/article/zuo04_elemen_system_desig_activ_passiv_vibrat_isolat.md create mode 100644 content/bibliography/_index.md create mode 100644 content/book/hatch00_vibrat_matlab_ansys.md create mode 100644 content/inproceedings/mcinroy99_dynam.md delete mode 100644 content/paper/butler11_posit_contr_lithog_equip.md delete mode 100644 content/paper/chen00_ident_decoup_contr_flexur_joint_hexap.md delete mode 100644 content/paper/fleming12_estim.md delete mode 100644 content/paper/furqan17_studies_stewar_platf_manip.md delete mode 100644 content/paper/gao15_measur_techn_precis_posit.md delete mode 100644 content/paper/hanieh03_activ_stewar.md delete mode 100644 content/paper/holterman05_activ_dampin_based_decoup_colloc_contr.md delete mode 100644 content/paper/jiao18_dynam_model_exper_analy_stewar.md delete mode 100644 content/paper/li01_simul_vibrat_isolat_point_contr.md delete mode 100644 content/paper/oomen18_advan_motion_contr_precis_mechat.md delete mode 100644 content/paper/poel10_explor_activ_hard_mount_vibrat.md delete mode 100644 content/paper/schellekens98_desig_precis.md delete mode 100644 content/paper/sebastian12_nanop_with_multip_sensor.md delete mode 100644 content/paper/tang18_decen_vibrat_contr_voice_coil.md delete mode 100644 content/paper/wang12_autom_marker_full_field_hard.md create mode 100644 content/phdthesis/jabben07_mechat.md create mode 100644 content/phdthesis/monkhorst04_dynam_error_budget.md create mode 100644 content/posts/homepages.md create mode 100644 content/zettels/actuator_fusion.md create mode 100644 content/zettels/dynamic_error_budgeting.md create mode 100644 content/zettels/finite_element_model.md create mode 100644 content/zettels/irr_and_fir_filters.md create mode 100644 content/zettels/matlab.md create mode 100644 content/zettels/norms.md create mode 100644 content/zettels/signal_to_noise_ratio.md create mode 100644 content/zettels/virtual_sensor_fusion.md create mode 100644 public/404.html create mode 100644 public/android-chrome-192x192.png create mode 100644 public/android-chrome-512x512.png create mode 100644 public/apple-touch-icon.png create mode 100644 public/book/albertos04_multiv_contr_system/index.html create mode 100644 public/book/du10_model_contr_vibrat_mechan_system/index.html create mode 100644 public/book/du19_multi_actuat_system_contr/index.html create mode 100644 public/book/ewins00_modal/index.html create mode 100644 public/book/fleming14_desig_model_contr_nanop_system/index.html create mode 100644 public/book/horowitz15_art_of_elect_third_edition/index.html create mode 100644 public/book/index.html create mode 100644 public/book/index.xml create mode 100644 public/book/leach14_fundam_princ_engin_nanom/index.html create mode 100644 public/book/leach18_basic_precis_engin_edition/index.html create mode 100644 public/book/preumont18_vibrat_contr_activ_struc_fourt_edition/index.html create mode 100644 public/book/schmidt14_desig_high_perfor_mechat_revis_edition/index.html create mode 100644 public/book/skogestad07_multiv_feedb_contr/index.html create mode 100644 public/book/taghirad13_paral/index.html create mode 100644 public/browserconfig.xml create mode 100644 public/categories/cat1/index.html create mode 100644 public/categories/cat1/index.xml create mode 100644 public/categories/cat1/page/1/index.html create mode 100644 public/categories/cat2/index.html create mode 100644 public/categories/cat2/index.xml create mode 100644 public/categories/cat2/page/1/index.html create mode 100644 public/categories/index.html create mode 100644 public/categories/index.xml create mode 100644 public/favicon-16x16.png create mode 100644 public/favicon-32x32.png create mode 100644 public/favicon.ico create mode 100644 public/fonts/chancery/apple-chancery-webfont.eot create mode 100644 public/fonts/chancery/apple-chancery-webfont.svg create mode 100644 public/fonts/chancery/apple-chancery-webfont.ttf create mode 100644 public/fonts/chancery/apple-chancery-webfont.woff create mode 100644 public/fonts/chancery/apple-chancery-webfont.woff2 create mode 100644 public/fonts/iconfont/iconfont.eot create mode 100644 public/fonts/iconfont/iconfont.svg create mode 100644 public/fonts/iconfont/iconfont.ttf create mode 100644 public/fonts/iconfont/iconfont.woff create mode 100644 public/img/spinner.svg create mode 100644 public/index.html create mode 100644 public/index.json create mode 100644 public/index.xml create mode 100644 public/js/main.4bada4f824623eea2eb7cfd5cf8c1d99c3dd797297e7e8cbc59a41da450bb334.js create mode 100644 public/lib/highlight/highlight.pack.js create mode 100644 public/lib/jquery/jquery-3.2.1.min.js create mode 100644 public/lib/search/search.js create mode 100644 public/lib/slideout/slideout-1.0.1.min.js create mode 100644 public/lib/timeago/timeago-3.0.2.min.js create mode 100644 public/lib/timeago/timeago.locales-3.0.2.min.js create mode 100644 public/manifest.json create mode 100644 public/mstile-150x150.png create mode 100644 public/ox-hugo/alkhatib03_1dof_control.png create mode 100644 public/ox-hugo/alkhatib03_hinf_control.png create mode 100644 public/ox-hugo/bibel92_control_diag.png create mode 100644 public/ox-hugo/bibel92_general_plant.png create mode 100644 public/ox-hugo/bibel92_hinf_weights.png create mode 100644 public/ox-hugo/bibel92_unmodeled_dynamics.png create mode 100644 public/ox-hugo/bibel92_weight_dynamics.png create mode 100644 public/ox-hugo/bryson93_hac_lac.png create mode 100644 public/ox-hugo/collette11_comp_isolation_strategies.png create mode 100644 public/ox-hugo/devasia07_piezoelectric_tradeoff.png create mode 100644 public/ox-hugo/du19_decoupled_control.png create mode 100644 public/ox-hugo/du19_dual_stage_control.png create mode 100644 public/ox-hugo/du19_dual_stage_loop_gain.png create mode 100644 public/ox-hugo/du19_dual_stage_sensitivity.png create mode 100644 public/ox-hugo/du19_h_inf_diagram.png create mode 100644 public/ox-hugo/du19_open_loop_three_stage.png create mode 100644 public/ox-hugo/du19_parallel_control_structure.png create mode 100644 public/ox-hugo/du19_pzt_actuator.png create mode 100644 public/ox-hugo/du19_sensitivity_three_stage.png create mode 100644 public/ox-hugo/du19_single_stage_control.png create mode 100644 public/ox-hugo/du19_three_stage_control.png create mode 100644 public/ox-hugo/du19_three_stage_decoupled.png create mode 100644 public/ox-hugo/du19_three_stage_decoupled_loop_gain.png create mode 100644 public/ox-hugo/ewins00_H22_with_residual.png create mode 100644 public/ox-hugo/ewins00_H22_without_residual.png create mode 100644 public/ox-hugo/ewins00_PRF_measured_FRF.png create mode 100644 public/ox-hugo/ewins00_PRF_measured_PRF.png create mode 100644 public/ox-hugo/ewins00_PRF_measured_svd.png create mode 100644 public/ox-hugo/ewins00_PRF_numerical_FRF.png create mode 100644 public/ox-hugo/ewins00_PRF_numerical_PRF.png create mode 100644 public/ox-hugo/ewins00_PRF_numerical_svd.png create mode 100644 public/ox-hugo/ewins00_aliasing.png create mode 100644 public/ox-hugo/ewins00_aliasing_distortion.png create mode 100644 public/ox-hugo/ewins00_aliasing_no_distortion.png create mode 100644 public/ox-hugo/ewins00_argand_diagram_a.png create mode 100644 public/ox-hugo/ewins00_argand_diagram_b.png create mode 100644 public/ox-hugo/ewins00_argand_diagram_c.png create mode 100644 public/ox-hugo/ewins00_base_excitation_modal_setup.png create mode 100644 public/ox-hugo/ewins00_beam_modes.png create mode 100644 public/ox-hugo/ewins00_bode_accelerance.png create mode 100644 public/ox-hugo/ewins00_bode_mobility.png create mode 100644 public/ox-hugo/ewins00_bode_receptance.png create mode 100644 public/ox-hugo/ewins00_burst_excitation.png create mode 100644 public/ox-hugo/ewins00_calibration_setup.png create mode 100644 public/ox-hugo/ewins00_chirp_excitation.png create mode 100644 public/ox-hugo/ewins00_circle_fit_natural_frequency.png create mode 100644 public/ox-hugo/ewins00_coherence_resonance.png create mode 100644 public/ox-hugo/ewins00_composite_raw.png create mode 100644 public/ox-hugo/ewins00_composite_sum.png create mode 100644 public/ox-hugo/ewins00_conventional_modal_test_setup.png create mode 100644 public/ox-hugo/ewins00_double_hits.png create mode 100644 public/ox-hugo/ewins00_dry_friction.png create mode 100644 public/ox-hugo/ewins00_frf_damped_system.png create mode 100644 public/ox-hugo/ewins00_frf_feedback_model.png create mode 100644 public/ox-hugo/ewins00_frf_mimo.png create mode 100644 public/ox-hugo/ewins00_frf_siso_model.png create mode 100644 public/ox-hugo/ewins00_general_frf_measurement_setup.png create mode 100644 public/ox-hugo/ewins00_hammer_impulse.png create mode 100644 public/ox-hugo/ewins00_impulsive_excitation.png create mode 100644 public/ox-hugo/ewins00_inverse_frf_mixed.png create mode 100644 public/ox-hugo/ewins00_inverse_frf_viscous.png create mode 100644 public/ox-hugo/ewins00_leakage_nok.png create mode 100644 public/ox-hugo/ewins00_leakage_ok.png create mode 100644 public/ox-hugo/ewins00_low_medium_high_modes.png create mode 100644 public/ox-hugo/ewins00_mass_cancellation.png create mode 100644 public/ox-hugo/ewins00_material_histeresis.png create mode 100644 public/ox-hugo/ewins00_mifs.png create mode 100644 public/ox-hugo/ewins00_mobility_frf_mdof_point.png create mode 100644 public/ox-hugo/ewins00_mobility_frf_mdof_transfer.png create mode 100644 public/ox-hugo/ewins00_modal_analysis_schematic.png create mode 100644 public/ox-hugo/ewins00_modal_circle.png create mode 100644 public/ox-hugo/ewins00_modal_circle_bis.png create mode 100644 public/ox-hugo/ewins00_nyquist_nonpropdamp_point.png create mode 100644 public/ox-hugo/ewins00_nyquist_nonpropdamp_transfer.png create mode 100644 public/ox-hugo/ewins00_nyquist_point.png create mode 100644 public/ox-hugo/ewins00_nyquist_receptance_structural.png create mode 100644 public/ox-hugo/ewins00_nyquist_receptance_viscous.png create mode 100644 public/ox-hugo/ewins00_nyquist_transfer.png create mode 100644 public/ox-hugo/ewins00_peak_amplitude.png create mode 100644 public/ox-hugo/ewins00_piezo_accelerometer.png create mode 100644 public/ox-hugo/ewins00_piezo_force_transducer.png create mode 100644 public/ox-hugo/ewins00_plot_receptance_imag.png create mode 100644 public/ox-hugo/ewins00_plot_receptance_real.png create mode 100644 public/ox-hugo/ewins00_random_autocorrelation.png create mode 100644 public/ox-hugo/ewins00_random_psd.png create mode 100644 public/ox-hugo/ewins00_random_time.png create mode 100644 public/ox-hugo/ewins00_real_complex_modes.png create mode 100644 public/ox-hugo/ewins00_residual_with.png create mode 100644 public/ox-hugo/ewins00_residual_without.png create mode 100644 public/ox-hugo/ewins00_rotational_excitation.png create mode 100644 public/ox-hugo/ewins00_rotational_measurement.png create mode 100644 public/ox-hugo/ewins00_sdof_model.png create mode 100644 public/ox-hugo/ewins00_sdof_modulus_phase.png create mode 100644 public/ox-hugo/ewins00_sdof_response.png create mode 100644 public/ox-hugo/ewins00_shaker_mount_1.png create mode 100644 public/ox-hugo/ewins00_shaker_mount_2.png create mode 100644 public/ox-hugo/ewins00_shaker_mount_3.png create mode 100644 public/ox-hugo/ewins00_shaker_rod.png create mode 100644 public/ox-hugo/ewins00_static_display.png create mode 100644 public/ox-hugo/ewins00_sweep_distortions.png create mode 100644 public/ox-hugo/ewins00_transducer_mounting_response.png create mode 100644 public/ox-hugo/ewins00_transducer_mounting_types.png create mode 100644 public/ox-hugo/ewins00_transmissibility_plots.png create mode 100644 public/ox-hugo/ewins00_vibration_analysis_procedure.png create mode 100644 public/ox-hugo/ewins00_viscous_damper.png create mode 100644 public/ox-hugo/ewins00_windowing_examples.png create mode 100644 public/ox-hugo/ewins00_zoom_bandpass.png create mode 100644 public/ox-hugo/ewins00_zoom_range.png create mode 100644 public/ox-hugo/ewins00_zoom_result.png create mode 100644 public/ox-hugo/fleming10_charge_ampl_piezo.png create mode 100644 public/ox-hugo/fleming10_piezo_model.png create mode 100644 public/ox-hugo/fleming13_drift_stability.png create mode 100644 public/ox-hugo/fleming13_mapping_error.png create mode 100644 public/ox-hugo/fleming13_tradeoff_res_bandwidth.png create mode 100644 public/ox-hugo/furutani04_ctrl_arch.png create mode 100644 public/ox-hugo/geng95_control_structure.png create mode 100644 public/ox-hugo/hac_lac_control_architecture.png create mode 100644 public/ox-hugo/hauge04_obtained_transmissibility.png create mode 100644 public/ox-hugo/hauge04_stewart_platform.png create mode 100644 public/ox-hugo/hauge04_strut_model.png create mode 100644 public/ox-hugo/hauge05_struts.png create mode 100644 public/ox-hugo/holler12_station.png create mode 100644 public/ox-hugo/inertial_sensors_characteristics_accelerometers.png create mode 100644 public/ox-hugo/inertial_sensors_characteristics_geophone.png create mode 100644 public/ox-hugo/ito16_low_high_stiffness_actuators.png create mode 100644 public/ox-hugo/ito16_transmissibility.png create mode 100644 public/ox-hugo/legnani12_generated_isotropy.png create mode 100644 public/ox-hugo/legnani12_isotropy_gen.png create mode 100644 public/ox-hugo/li01_closed_loop_pointing.png create mode 100644 public/ox-hugo/li01_closed_loop_vibration.png create mode 100644 public/ox-hugo/li01_decoupling_conf.png create mode 100644 public/ox-hugo/li01_decoupling_conf_bis.png create mode 100644 public/ox-hugo/li01_effect_isolation_loop_closed.png create mode 100644 public/ox-hugo/li01_feedforward_control.png create mode 100644 public/ox-hugo/li01_parallel_control.png create mode 100644 public/ox-hugo/li01_pointing_control.png create mode 100644 public/ox-hugo/li01_simultaneous_control_results.png create mode 100644 public/ox-hugo/li01_stewart_platform.png create mode 100644 public/ox-hugo/li01_test_bench.png create mode 100644 public/ox-hugo/li01_vibration_control_plant.png create mode 100644 public/ox-hugo/li01_vibration_isolation_control.png create mode 100644 public/ox-hugo/li01_vibration_isolation_control_results.png create mode 100644 public/ox-hugo/oomen18_next_gen_loop_gain.png create mode 100644 public/ox-hugo/position_sensor_characteristics.png create mode 100644 public/ox-hugo/position_sensor_characteristics_relative_sensor.png create mode 100644 public/ox-hugo/position_sensor_interferometer_precision.png create mode 100644 public/ox-hugo/preumont02_force_acc_fb_heavy.png create mode 100644 public/ox-hugo/preumont02_force_acc_fb_light.png create mode 100644 public/ox-hugo/preumont07_flexible_joints.png create mode 100644 public/ox-hugo/preumont07_iff_effect_stiffness.png create mode 100644 public/ox-hugo/preumont07_stewart_platform.png create mode 100644 public/ox-hugo/preumont18_alternating_p_z.png create mode 100644 public/ox-hugo/preumont18_bridge_circuit.png create mode 100644 public/ox-hugo/preumont18_cas_plot.png create mode 100644 public/ox-hugo/preumont18_classical_feedback_small.png create mode 100644 public/ox-hugo/preumont18_collocated_control_frf.png create mode 100644 public/ox-hugo/preumont18_collocated_zero.png create mode 100644 public/ox-hugo/preumont18_design_steps.png create mode 100644 public/ox-hugo/preumont18_electro_mechanical_transducer.png create mode 100644 public/ox-hugo/preumont18_feedforward_adaptative.png create mode 100644 public/ox-hugo/preumont18_general_plant.png create mode 100644 public/ox-hugo/preumont18_geophone.png create mode 100644 public/ox-hugo/preumont18_hac_lac_control.png create mode 100644 public/ox-hugo/preumont18_neglected_modes.png create mode 100644 public/ox-hugo/preumont18_piezo_admittance_curve.png create mode 100644 public/ox-hugo/preumont18_piezo_discrete.png create mode 100644 public/ox-hugo/preumont18_piezo_stack.png create mode 100644 public/ox-hugo/preumont18_piezo_stack_admittance.png create mode 100644 public/ox-hugo/preumont18_proof_mass_actuator.png create mode 100644 public/ox-hugo/preumont18_proof_mass_tf.png create mode 100644 public/ox-hugo/preumont18_smart_materials.png create mode 100644 public/ox-hugo/preumont18_voice_coil_schematic.png create mode 100644 public/ox-hugo/schmidt14_high_low_freq_regions.png create mode 100644 public/ox-hugo/skogestad07_additive_uncertainty.png create mode 100644 public/ox-hugo/skogestad07_block_diagonal_scalings.png create mode 100644 public/ox-hugo/skogestad07_cascade_control.png create mode 100644 public/ox-hugo/skogestad07_cascade_control_two_layers.png create mode 100644 public/ox-hugo/skogestad07_cascade_extra_input.png create mode 100644 public/ox-hugo/skogestad07_cascade_extra_meas.png create mode 100644 public/ox-hugo/skogestad07_classical_feedback_2dof_alt.png create mode 100644 public/ox-hugo/skogestad07_classical_feedback_2dof_simple.png create mode 100644 public/ox-hugo/skogestad07_classical_feedback_alt.png create mode 100644 public/ox-hugo/skogestad07_classical_feedback_bis.png create mode 100644 public/ox-hugo/skogestad07_classical_feedback_meas.png create mode 100644 public/ox-hugo/skogestad07_classical_feedback_sep.png create mode 100644 public/ox-hugo/skogestad07_classical_feedback_small.png create mode 100644 public/ox-hugo/skogestad07_classical_feedback_stability.png create mode 100644 public/ox-hugo/skogestad07_coprime_uncertainty.png create mode 100644 public/ox-hugo/skogestad07_coprime_uncertainty_bis.png create mode 100644 public/ox-hugo/skogestad07_coprime_uncertainty_hinf.png create mode 100644 public/ox-hugo/skogestad07_decentralized_diagonal_control.png create mode 100644 public/ox-hugo/skogestad07_design_trade_off_mimo_gk.png create mode 100644 public/ox-hugo/skogestad07_dk_iter_d_scale.png create mode 100644 public/ox-hugo/skogestad07_dk_iter_mu.png create mode 100644 public/ox-hugo/skogestad07_general_control.png create mode 100644 public/ox-hugo/skogestad07_general_control_Mdelta.png create mode 100644 public/ox-hugo/skogestad07_general_control_Mdelta_bis.png create mode 100644 public/ox-hugo/skogestad07_general_control_Ndelta.png create mode 100644 public/ox-hugo/skogestad07_general_control_delta.png create mode 100644 public/ox-hugo/skogestad07_general_control_names.png create mode 100644 public/ox-hugo/skogestad07_general_control_names_bis.png create mode 100644 public/ox-hugo/skogestad07_general_plant_weights.png create mode 100644 public/ox-hugo/skogestad07_hinf_signal_based.png create mode 100644 public/ox-hugo/skogestad07_hinf_signal_based_uncertainty.png create mode 100644 public/ox-hugo/skogestad07_hinf_synthesis_2dof.png create mode 100644 public/ox-hugo/skogestad07_input_output_uncertainty.png create mode 100644 public/ox-hugo/skogestad07_input_uncertainty.png create mode 100644 public/ox-hugo/skogestad07_input_uncertainty_hinf.png create mode 100644 public/ox-hugo/skogestad07_input_uncertainty_set.png create mode 100644 public/ox-hugo/skogestad07_input_uncertainty_set_feedback.png create mode 100644 public/ox-hugo/skogestad07_input_uncertainty_set_feedback_weight.png create mode 100644 public/ox-hugo/skogestad07_input_uncertainty_set_feedback_weight_bis.png create mode 100644 public/ox-hugo/skogestad07_inv_additive_uncertainty.png create mode 100644 public/ox-hugo/skogestad07_inv_input_uncertainty.png create mode 100644 public/ox-hugo/skogestad07_inv_output_uncertainty.png create mode 100644 public/ox-hugo/skogestad07_inverse_uncertainty_set.png create mode 100644 public/ox-hugo/skogestad07_lag_delay_uncertainty.png create mode 100644 public/ox-hugo/skogestad07_lqg_integral.png create mode 100644 public/ox-hugo/skogestad07_lqg_kalman_filter.png create mode 100644 public/ox-hugo/skogestad07_lqg_separation.png create mode 100644 public/ox-hugo/skogestad07_margin_requirements.png create mode 100644 public/ox-hugo/skogestad07_mixed_sensitivity_dist_rejection.png create mode 100644 public/ox-hugo/skogestad07_mixed_sensitivity_ref_tracking.png create mode 100644 public/ox-hugo/skogestad07_mixed_sensitivity_s_t.png create mode 100644 public/ox-hugo/skogestad07_mu_plot_optimal_k3.png create mode 100644 public/ox-hugo/skogestad07_mu_plots_distillation.png create mode 100644 public/ox-hugo/skogestad07_neglected_first_order_lag.png create mode 100644 public/ox-hugo/skogestad07_neglected_time_delay.png create mode 100644 public/ox-hugo/skogestad07_nyquist_performance_condition.png create mode 100644 public/ox-hugo/skogestad07_nyquist_uncertainty.png create mode 100644 public/ox-hugo/skogestad07_optimize_control_a.png create mode 100644 public/ox-hugo/skogestad07_optimize_control_b.png create mode 100644 public/ox-hugo/skogestad07_optimize_control_c.png create mode 100644 public/ox-hugo/skogestad07_output_uncertainty.png create mode 100644 public/ox-hugo/skogestad07_partial_control.png create mode 100644 public/ox-hugo/skogestad07_perturb_s_k3.png create mode 100644 public/ox-hugo/skogestad07_shaped_plant.png create mode 100644 public/ox-hugo/skogestad07_shapping_practical_implementation.png create mode 100644 public/ox-hugo/skogestad07_system_hierarchy.png create mode 100644 public/ox-hugo/skogestad07_uncertainty_disc_generated.png create mode 100644 public/ox-hugo/skogestad07_uncertainty_region.png create mode 100644 public/ox-hugo/skogestad07_uncertainty_state_a_matrix.png create mode 100644 public/ox-hugo/skogestad07_uncertainty_weight.png create mode 100644 public/ox-hugo/skogestad07_weight_anti_windup.png create mode 100644 public/ox-hugo/skogestad07_weight_first_order.png create mode 100644 public/ox-hugo/skogestad07_weights_distillation.png create mode 100644 public/ox-hugo/spanos95_iff_plant.png create mode 100644 public/ox-hugo/spanos95_results.png create mode 100644 public/ox-hugo/spanos95_stewart_platform.png create mode 100644 public/ox-hugo/stankevic17_station.png create mode 100644 public/ox-hugo/taghira13_cascade_force_inner_loop_F.png create mode 100644 public/ox-hugo/taghira13_cascade_force_inner_loop_tau.png create mode 100644 public/ox-hugo/taghira13_cascade_force_inner_loop_tau_q.png create mode 100644 public/ox-hugo/taghira13_cascade_force_outer_loop.png create mode 100644 public/ox-hugo/taghira13_cascade_force_outer_loop_tau.png create mode 100644 public/ox-hugo/taghira13_cascade_force_outer_loop_tau_q.png create mode 100644 public/ox-hugo/taghira13_direct_force_control.png create mode 100644 public/ox-hugo/taghira13_impedance_control.png create mode 100644 public/ox-hugo/taghirad13_adaptative_inverse_control_task_space.png create mode 100644 public/ox-hugo/taghirad13_angular_momentum_rigid_body.png create mode 100644 public/ox-hugo/taghirad13_cascade_control.png create mode 100644 public/ox-hugo/taghirad13_consecutive_transformations.png create mode 100644 public/ox-hugo/taghirad13_decentralized_pd_control_joint_space.png create mode 100644 public/ox-hugo/taghirad13_decentralized_pd_control_task_space.png create mode 100644 public/ox-hugo/taghirad13_feedforward_control_task_space.png create mode 100644 public/ox-hugo/taghirad13_feedforward_pd_control_joint_space.png create mode 100644 public/ox-hugo/taghirad13_free_body_diagram_stewart.png create mode 100644 public/ox-hugo/taghirad13_general_motion.png create mode 100644 public/ox-hugo/taghirad13_general_topology_motion_feedback.png create mode 100644 public/ox-hugo/taghirad13_general_topology_motion_feedback_bis.png create mode 100644 public/ox-hugo/taghirad13_general_topology_motion_feedback_quater.png create mode 100644 public/ox-hugo/taghirad13_general_topology_motion_feedback_ter.png create mode 100644 public/ox-hugo/taghirad13_impedance_control_rlc.png create mode 100644 public/ox-hugo/taghirad13_inverse_dynamics_control_joint_space.png create mode 100644 public/ox-hugo/taghirad13_inverse_dynamics_control_task_space.png create mode 100644 public/ox-hugo/taghirad13_mass_property_rigid_body.png create mode 100644 public/ox-hugo/taghirad13_pitch-roll-yaw.png create mode 100644 public/ox-hugo/taghirad13_rigid_body_motion.png create mode 100644 public/ox-hugo/taghirad13_robust_inverse_dynamics_task_space.png create mode 100644 public/ox-hugo/taghirad13_rotation_matrix.png create mode 100644 public/ox-hugo/taghirad13_screw_axis_representation.png create mode 100644 public/ox-hugo/taghirad13_stewart36.png create mode 100644 public/ox-hugo/taghirad13_stewart_forward_dynamics.png create mode 100644 public/ox-hugo/taghirad13_stewart_inverse_dynamics.png create mode 100644 public/ox-hugo/taghirad13_stewart_schematic.png create mode 100644 public/ox-hugo/taghirad13_stewart_static_forces.png create mode 100644 public/ox-hugo/wang16_force_feedback.png create mode 100644 public/ox-hugo/wang16_stewart_platform.png create mode 100644 public/ox-hugo/yang19_control_arch.png create mode 100644 public/ox-hugo/yang19_flexible_joints.png create mode 100644 public/ox-hugo/yang19_results.png create mode 100644 public/ox-hugo/yang19_stewart_platform.png create mode 100644 public/ox-hugo/zhang11_platform.png create mode 100644 public/paper/alkhatib03_activ_struc_vibrat_contr/index.html create mode 100644 public/paper/bibel92_guidel_h/index.html create mode 100644 public/paper/bryson93_contr_spacec_aircr/index.html create mode 100644 public/paper/butler11_posit_contr_lithog_equip/index.html create mode 100644 public/paper/chen00_ident_decoup_contr_flexur_joint_hexap/index.html create mode 100644 public/paper/collette11_review_activ_vibrat_isolat_strat/index.html create mode 100644 public/paper/collette14_vibrat/index.html create mode 100644 public/paper/collette15_sensor_fusion_method_high_perfor/index.html create mode 100644 public/paper/dasgupta00_stewar_platf_manip/index.html create mode 100644 public/paper/devasia07_survey_contr_issues_nanop/index.html create mode 100644 public/paper/fleming10_nanop_system_with_force_feedb/index.html create mode 100644 public/paper/fleming12_estim/index.html create mode 100644 public/paper/fleming13_review_nanom_resol_posit_sensor/index.html create mode 100644 public/paper/furqan17_studies_stewar_platf_manip/index.html create mode 100644 public/paper/furutani04_nanom_cuttin_machin_using_stewar/index.html create mode 100644 public/paper/gao15_measur_techn_precis_posit/index.html create mode 100644 public/paper/garg07_implem_chall_multiv_contr/index.html create mode 100644 public/paper/geng95_intel_contr_system_multip_degree/index.html create mode 100644 public/paper/hanieh03_activ_stewar/index.html create mode 100644 public/paper/hauge04_sensor_contr_space_based_six/index.html create mode 100644 public/paper/holler12_instr_x_ray_nano_imagin/index.html create mode 100644 public/paper/holterman05_activ_dampin_based_decoup_colloc_contr/index.html create mode 100644 public/paper/index.html create mode 100644 public/paper/index.xml create mode 100644 public/paper/ito16_compar_class_high_precis_actuat/index.html create mode 100644 public/paper/jiao18_dynam_model_exper_analy_stewar/index.html create mode 100644 public/paper/legnani12_new_isotr_decoup_paral_manip/index.html create mode 100644 public/paper/li01_simul_fault_vibrat_isolat_point/index.html create mode 100644 public/paper/li01_simul_vibrat_isolat_point_contr/index.html create mode 100644 public/paper/oomen18_advan_motion_contr_precis_mechat/index.html create mode 100644 public/paper/poel10_explor_activ_hard_mount_vibrat/index.html create mode 100644 public/paper/preumont02_force_feedb_versus_accel_feedb/index.html create mode 100644 public/paper/preumont07_six_axis_singl_stage_activ/index.html create mode 100644 public/paper/saxena12_advan_inter_model_contr_techn/index.html create mode 100644 public/paper/schellekens98_desig_precis/index.html create mode 100644 public/paper/sebastian12_nanop_with_multip_sensor/index.html create mode 100644 public/paper/spanos95_soft_activ_vibrat_isolat/index.html create mode 100644 public/paper/stankevic17_inter_charac_rotat_stages_x_ray_nanot/index.html create mode 100644 public/paper/tang18_decen_vibrat_contr_voice_coil/index.html create mode 100644 public/paper/tjepkema12_sensor_fusion_activ_vibrat_isolat_precis_equip/index.html create mode 100644 public/paper/wang12_autom_marker_full_field_hard/index.html create mode 100644 public/paper/wang16_inves_activ_vibrat_isolat_stewar/index.html create mode 100644 public/paper/yang19_dynam_model_decoup_contr_flexib/index.html create mode 100644 public/paper/zhang11_six_dof/index.html create mode 100644 public/robots.txt create mode 100644 public/sass/main.min.47a894bd6354cc46903f62433747958dc936e1c95c28a76ac80319bca9708ed1.css create mode 100644 public/sass/main.min.b66aec177f21b809a7d8b8a0de4454558b3f3cfcb28a151e820757f148c14a35.css create mode 100644 public/search/index.html create mode 100644 public/sitemap.xml create mode 100644 public/sitemap.xsl create mode 100644 public/tags/index.html create mode 100644 public/tags/index.xml create mode 100644 public/tags/tag1/index.html create mode 100644 public/tags/tag1/index.xml create mode 100644 public/tags/tag1/page/1/index.html create mode 100644 public/tags/tag2/index.html create mode 100644 public/tags/tag2/index.xml create mode 100644 public/tags/tag2/page/1/index.html create mode 100644 public/websites/control_bootcamp/index.html create mode 100644 public/websites/data_driven_dynamical_systems_with_machine_learning/index.html create mode 100644 public/websites/index.html create mode 100644 public/websites/index.xml create mode 100644 public/websites/page/1/index.html create mode 100644 public/zettels/active_damping/index.html create mode 100644 public/zettels/actuators/index.html create mode 100644 public/zettels/complementary_filters/index.html create mode 100644 public/zettels/cubic_architecture/index.html create mode 100644 public/zettels/electronics/index.html create mode 100644 public/zettels/flexible_joints/index.html create mode 100644 public/zettels/force_sensors/index.html create mode 100644 public/zettels/h_infinity_control/index.html create mode 100644 public/zettels/hac_hac/index.html create mode 100644 public/zettels/index.html create mode 100644 public/zettels/index.xml create mode 100644 public/zettels/inertial_sensors/index.html create mode 100644 public/zettels/metrology/index.html create mode 100644 public/zettels/motion_control/index.html create mode 100644 public/zettels/multivariable_control/index.html create mode 100644 public/zettels/nano_active_stabilization_system/index.html create mode 100644 public/zettels/position_sensors/index.html create mode 100644 public/zettels/positioning_stations/index.html create mode 100644 public/zettels/precision_engineering/index.html create mode 100644 public/zettels/reference_books/index.html create mode 100644 public/zettels/sensor_fusion/index.html create mode 100644 public/zettels/stewart_platforms/index.html create mode 100644 public/zettels/system_identification/index.html create mode 100644 public/zettels/test/index.html create mode 100644 public/zettels/vibration_isolation/index.html create mode 100644 resources/_gen/assets/scss/css/custom.scss_48b060fe05b0a273d182ef83c0605941.content create mode 100644 resources/_gen/assets/scss/css/custom.scss_48b060fe05b0a273d182ef83c0605941.json create mode 100644 resources/_gen/assets/scss/css/main.scss_48b060fe05b0a273d182ef83c0605941.content create mode 100644 resources/_gen/assets/scss/css/main.scss_48b060fe05b0a273d182ef83c0605941.json create mode 100644 resources/_gen/assets/scss/sass/main.scss_48b060fe05b0a273d182ef83c0605941.content create mode 100644 resources/_gen/assets/scss/sass/main.scss_48b060fe05b0a273d182ef83c0605941.json create mode 100644 static/ox-hugo/chen00_flexure_hexapod.png create mode 100644 static/ox-hugo/collette12_absolute_disp_sensors.png create mode 100644 static/ox-hugo/hatch00_cant_beam_gramian_balanced.png create mode 100644 static/ox-hugo/hatch00_cant_beam_modes_freq.png create mode 100644 static/ox-hugo/hatch00_cant_beam_sorted_dc_gains.png create mode 100644 static/ox-hugo/hatch00_cant_beam_unsorted_dc_gains.png create mode 100644 static/ox-hugo/hatch00_cantilever_beam.png create mode 100644 static/ox-hugo/hatch00_disk_drive_mimo_ansys.png create mode 100644 static/ox-hugo/hatch00_disk_drive_mimo_schematic.png create mode 100644 static/ox-hugo/hatch00_disk_drive_nodes_reduced_model.png create mode 100644 static/ox-hugo/hatch00_disk_drive_siso_model.png create mode 100644 static/ox-hugo/hatch00_gramians.png create mode 100644 static/ox-hugo/hatch00_modal_analysis_flowchart.png create mode 100644 static/ox-hugo/hatch00_modal_matrix.png create mode 100644 static/ox-hugo/hatch00_model_reduction_chart.png create mode 100644 static/ox-hugo/hatch00_n_dof_zeros.png create mode 100644 static/ox-hugo/hatch00_roadmap_modal_solution.png create mode 100644 static/ox-hugo/hatch00_schematic_modal_solution.png create mode 100644 static/ox-hugo/hatch00_tdof_mode_1.png create mode 100644 static/ox-hugo/hatch00_tdof_mode_2.png create mode 100644 static/ox-hugo/hatch00_tdof_mode_3.png create mode 100644 static/ox-hugo/hatch00_tdof_model.png create mode 100644 static/ox-hugo/hatch00_undamped_tdof_model.png create mode 100644 static/ox-hugo/hatch00_z11_tf.png create mode 100644 static/ox-hugo/hatch00_z13_tf.png create mode 100644 static/ox-hugo/jabben07_general_plant.png create mode 100644 static/ox-hugo/jabben07_pareto_curve_H2.png create mode 100644 static/ox-hugo/jabben07_weighting_functions.png create mode 100644 static/ox-hugo/mcinroy02_leg_model.png create mode 100644 static/ox-hugo/mcinroy02_model_strut_joint.png create mode 100644 static/ox-hugo/mcinroy99_general_hexapod.png create mode 100644 static/ox-hugo/mcinroy99_strut_model.png create mode 100644 static/ox-hugo/monkhorst04_closed_loop_H2.png create mode 100644 static/ox-hugo/monkhorst04_general_weighted_plant.png create mode 100644 static/ox-hugo/monkhorst04_weighting_filter.png create mode 100644 static/ox-hugo/souleille18_model_piezo.png create mode 100644 static/ox-hugo/souleille18_result_damping_transmissibility.png create mode 100644 static/ox-hugo/souleille18_root_locus.png create mode 100644 static/ox-hugo/souleille18_setup_flexible_payload.png create mode 100644 static/ox-hugo/souleille18_tf_iff_result.png create mode 100644 static/ox-hugo/zuo04_piezo_plant.png create mode 100644 static/ox-hugo/zuo04_piezo_spring_series.png create mode 100644 static/ox-hugo/zuo04_voice_coil_plant.png create mode 100644 static/ox-hugo/zuo04_voice_coil_spring_parallel.png diff --git a/config.toml b/config.toml index d01535a..6782ee0 100644 --- a/config.toml +++ b/config.toml @@ -31,11 +31,7 @@ name = "Home" weight = 10 identifier = "home" url = "/" -# [[menu.main]] -# name = "Blog" -# weight = 20 -# identifier = "posts" -# url = "/posts/" + [[menu.main]] name = "Zettels" weight = 30 @@ -43,21 +39,14 @@ identifier = "zettels" url = "/zettels/" [[menu.main]] -name = "Books" -weight = 40 -identifier = "book" -url = "/book/" - -[[menu.main]] -name = "Papers" +name = "Bibliography" weight = 50 -identifier = "paper" -url = "/paper/" - +identifier = "bibliography" +url = "/bibliography/" [[menu.main]] name = "Search" -weight = 60 +weight = 70 identifier = "search" url = "/search/" diff --git a/content/paper/_index.md b/content/article/_index.md similarity index 100% rename from content/paper/_index.md rename to content/article/_index.md diff --git a/content/paper/alkhatib03_activ_struc_vibrat_contr.md b/content/article/alkhatib03_activ_struc_vibrat_contr.md similarity index 93% rename from content/paper/alkhatib03_activ_struc_vibrat_contr.md rename to content/article/alkhatib03_activ_struc_vibrat_contr.md index 5d1740f..d98240e 100644 --- a/content/paper/alkhatib03_activ_struc_vibrat_contr.md +++ b/content/article/alkhatib03_activ_struc_vibrat_contr.md @@ -2,8 +2,6 @@ title = "Active structural vibration control: a review" author = ["Thomas Dehaeze"] draft = false -tags = ["tag1", "tag2"] -categories = ["cat1", "cat2"] +++ Tags @@ -11,7 +9,7 @@ Tags Reference -: (Rabih Alkhatib \& Golnaraghi, 2003) +: (Rabih Alkhatib \& Golnaraghi, 2003) Author(s) : Alkhatib, R., & Golnaraghi, M. F. @@ -125,12 +123,12 @@ Uncertainty can be divided into four types: - neglected nonlinearities The \\(\mathcal{H}\_\infty\\) controller is developed to address uncertainty by systematic means. -A general block diagram of the control system is shown figure [1](#org95c575a). +A general block diagram of the control system is shown figure [1](#orgb7a9ee5). A **frequency shaped filter** \\(W(s)\\) coupled to selected inputs and outputs of the plant is included. The outputs of this frequency shaped filter define the error ouputs used to evaluate the system performance and generate the **cost** that will be used in the design process. - + {{< figure src="/ox-hugo/alkhatib03_hinf_control.png" caption="Figure 1: Block diagram for robust control" >}} @@ -202,11 +200,11 @@ Two different methods ## Active Control Effects on the System {#active-control-effects-on-the-system} - + {{< figure src="/ox-hugo/alkhatib03_1dof_control.png" caption="Figure 2: 1 DoF control of a spring-mass-damping system" >}} -Consider the control system figure [2](#org7c357dd), the equation of motion of the system is: +Consider the control system figure [2](#org352d1a3), the equation of motion of the system is: \\[ m\ddot{x} + c\dot{x} + kx = f\_a + f \\] The controller force can be expressed as: \\(f\_a = -g\_a \ddot{x} + g\_v \dot{x} + g\_d x\\). The equation of motion becomes: @@ -227,4 +225,4 @@ The problem of optimizing the locations of the actuators can be more significant If the actuator is placed at the wrong location, the system will require a greater force control. In that case, the system is said to have a **low degree of controllability**. # Bibliography -Alkhatib, R., & Golnaraghi, M. F., *Active structural vibration control: a review*, The Shock and Vibration Digest, *35(5)*, 367–383 (2003). http://dx.doi.org/10.1177/05831024030355002 [↩](#279b5558de3a8131b329a9ba1a99e4f8) +Alkhatib, R., & Golnaraghi, M. F., *Active structural vibration control: a review*, The Shock and Vibration Digest, *35(5)*, 367–383 (2003). http://dx.doi.org/10.1177/05831024030355002 [↩](#279b5558de3a8131b329a9ba1a99e4f8) diff --git a/content/paper/bibel92_guidel_h.md b/content/article/bibel92_guidel_h.md similarity index 89% rename from content/paper/bibel92_guidel_h.md rename to content/article/bibel92_guidel_h.md index 1ed878d..760a667 100644 --- a/content/paper/bibel92_guidel_h.md +++ b/content/article/bibel92_guidel_h.md @@ -8,7 +8,7 @@ Tags : [H Infinity Control]({{< relref "h_infinity_control" >}}) Reference -: (Bibel \& Malyevac, 1992) +: (Bibel \& Malyevac, 1992) Author(s) : Bibel, J. E., & Malyevac, D. S. @@ -19,11 +19,11 @@ Year ## Properties of feedback control {#properties-of-feedback-control} - + {{< figure src="/ox-hugo/bibel92_control_diag.png" caption="Figure 1: Control System Diagram" >}} -From the figure [1](#org82bead2), we have: +From the figure [1](#org5999225), we have: \begin{align\*} y(s) &= T(s) r(s) + S(s) d(s) - T(s) n(s)\\\\\\ @@ -77,11 +77,11 @@ Usually, reference signals and disturbances occur at low frequencies, while nois - + {{< figure src="/ox-hugo/bibel92_general_plant.png" caption="Figure 2: \\(\mathcal{H}\_\infty\\) control framework" >}} -New design framework (figure [2](#org71ea720)): \\(P(s)\\) is the **generalized plant** transfer function matrix: +New design framework (figure [2](#org4e0009c)): \\(P(s)\\) is the **generalized plant** transfer function matrix: - \\(w\\): exogenous inputs - \\(z\\): regulated performance output @@ -108,9 +108,9 @@ The \\(H\_\infty\\) control problem is to find a controller that minimizes \\(\\ ## Weights for inputs/outputs signals {#weights-for-inputs-outputs-signals} -Since \\(S\\) and \\(T\\) cannot be minimized together at all frequency, **weights are introduced to shape the solutions**. Not only can \\(S\\) and \\(T\\) be weighted, but other regulated performance variables and inputs (figure [3](#org549c59f)). +Since \\(S\\) and \\(T\\) cannot be minimized together at all frequency, **weights are introduced to shape the solutions**. Not only can \\(S\\) and \\(T\\) be weighted, but other regulated performance variables and inputs (figure [3](#orgdd8fae0)). - + {{< figure src="/ox-hugo/bibel92_hinf_weights.png" caption="Figure 3: Input and Output weights in \\(\mathcal{H}\_\infty\\) framework" >}} @@ -154,15 +154,15 @@ When using both \\(W\_S\\) and \\(W\_T\\), it is important to make sure that the ## Unmodeled dynamics weighting function {#unmodeled-dynamics-weighting-function} -Another method of limiting the controller bandwidth and providing high frequency gain attenuation is to use a high pass weight on an **unmodeled dynamics uncertainty block** that may be added from the plant input to the plant output (figure [4](#org379d5b1)). +Another method of limiting the controller bandwidth and providing high frequency gain attenuation is to use a high pass weight on an **unmodeled dynamics uncertainty block** that may be added from the plant input to the plant output (figure [4](#org0d13a20)). - + {{< figure src="/ox-hugo/bibel92_unmodeled_dynamics.png" caption="Figure 4: Unmodeled dynamics model" >}} -The weight is chosen to cover the expected worst case magnitude of the unmodeled dynamics. A typical unmodeled dynamics weighting function is shown figure [5](#orgcc65489). +The weight is chosen to cover the expected worst case magnitude of the unmodeled dynamics. A typical unmodeled dynamics weighting function is shown figure [5](#org45b0983). - + {{< figure src="/ox-hugo/bibel92_weight_dynamics.png" caption="Figure 5: Example of unmodeled dynamics weight" >}} @@ -182,4 +182,4 @@ Typically actuator input weights are constant over frequency and set at the inve **The order of the weights should be kept reasonably low** to reduce the order of th resulting optimal compensator and avoid potential convergence problems in the DK interactions. # Bibliography -Bibel, J. E., & Malyevac, D. S., *Guidelines for the selection of weighting functions for h-infinity control* (1992). [↩](#5b41da575e27e6e86f1a1410a0170836) +Bibel, J. E., & Malyevac, D. S., *Guidelines for the selection of weighting functions for h-infinity control* (1992). [↩](#5b41da575e27e6e86f1a1410a0170836) diff --git a/content/paper/bryson93_contr_spacec_aircr.md b/content/article/bryson93_contr_spacec_aircr.md similarity index 83% rename from content/paper/bryson93_contr_spacec_aircr.md rename to content/article/bryson93_contr_spacec_aircr.md index f570c63..32e8233 100644 --- a/content/paper/bryson93_contr_spacec_aircr.md +++ b/content/article/bryson93_contr_spacec_aircr.md @@ -8,7 +8,7 @@ Tags : [HAC-HAC]({{< relref "hac_hac" >}}) Reference -: (Bryson, 1993) +: (Bryson, 1993) Author(s) : Bryson, A. E. @@ -41,11 +41,11 @@ Year > LAC uses a co-located rate sensor to add damping to all the vibratory modes (but not the rigid-body mode). > HAC uses a separated displacement sensor to stabilize the rigid body mode, which slightly decreases the damping of the vibratory modes but not enough to produce instability (called "spillover") - + {{< figure src="/ox-hugo/bryson93_hac_lac.png" caption="Figure 1: HAC-LAC control concept" >}} > LAC/HAC is usually insensitive to small deviation of the plant dynamics away from the design values, that is, it is **robust** to plant parameter changes. # Bibliography -Bryson, A. E., *Control of spacecraft and aircraft* (1993), : Princeton university press Princeton, New Jersey. [↩](#4970865a21830fff7b1daeec187bfa68) +Bryson, A. E., *Control of spacecraft and aircraft* (1993), : Princeton university press Princeton, New Jersey. [↩](#4970865a21830fff7b1daeec187bfa68) diff --git a/content/article/butler11_posit_contr_lithog_equip.md b/content/article/butler11_posit_contr_lithog_equip.md new file mode 100644 index 0000000..82efd44 --- /dev/null +++ b/content/article/butler11_posit_contr_lithog_equip.md @@ -0,0 +1,20 @@ ++++ +title = "Position control in lithographic equipment" +author = ["Thomas Dehaeze"] +draft = false ++++ + +Tags +: [Multivariable Control]({{< relref "multivariable_control" >}}), [Positioning Stations]({{< relref "positioning_stations" >}}) + +Reference +: (Hans Butler, 2011) + +Author(s) +: Butler, H. + +Year +: 2011 + +# Bibliography +Butler, H., *Position control in lithographic equipment*, IEEE Control Systems, *31(5)*, 28–47 (2011). http://dx.doi.org/10.1109/mcs.2011.941882 [↩](#6a014e3a2ee3e41d20bd0644654c56f0) diff --git a/content/article/chen00_ident_decoup_contr_flexur_joint_hexap.md b/content/article/chen00_ident_decoup_contr_flexur_joint_hexap.md new file mode 100644 index 0000000..3401932 --- /dev/null +++ b/content/article/chen00_ident_decoup_contr_flexur_joint_hexap.md @@ -0,0 +1,108 @@ ++++ +title = "Identification and decoupling control of flexure jointed hexapods" +author = ["Thomas Dehaeze"] +draft = false ++++ + +Tags +: [Stewart Platforms]({{< relref "stewart_platforms" >}}), [Flexible Joints]({{< relref "flexible_joints" >}}) + +Reference +: (Yixin Chen \& McInroy, 2000) + +Author(s) +: Chen, Y., & McInroy, J. + +Year +: 2000 + + +## Abstract {#abstract} + +> By exploiting properties of the joint space mass-inertia matrix of flexure jointed hexapods, a new **decoupling method** is proposed. +> The new decoupling method, through a **static** input-output mapping, transforms the highly coupled 6 inputs 6 outputs dynamics into 6 independent single-input single-output channels. +> Prior decoupling control algorithms imposed severe constraints on the allowable geometry, workspace and payload. +> This paper derives a new algorithm which removes these constraints, thus greatly expanding the applications. +> Based on the new decoupling algorithm, an **identification algorithm** is introduced to identify the **joint space mass-inertia matrix** using payload acceleration and base forces. +> This algorithm can be used for precision payload calibration, thus improving performance and removing the labor required to design the control for different payloads. +> The new decoupling algorithm is experimentally compared to earlier techniques. +> These experimental results indicate that the new approach is practical, and improves performance. + + +## Introduction {#introduction} + +Typical decoupling algorithm impose two constraints: + +- the payload mass/inertia matrix is diagonal +- the geometry of the platform and attachment of the payload must be carefully chosen + +This limits the applications significantly. + +The algorithm derived herein removes these constraints, thus greatly expanding the potential applications. + + +## Dynamic Model of Flexure Jointed Hexapods {#dynamic-model-of-flexure-jointed-hexapods} + +The derivation of the dynamic model is done in (McInroy, 1999) ([Notes]({{< relref "mcinroy99_dynam" >}})). + + + +{{< figure src="/ox-hugo/chen00_flexure_hexapod.png" caption="Figure 1: A flexured joint Hexapod. {P} is a cartesian coordiante frame located at (and rigidly connected to) the payload's center of mass. {B} is a frame attached to the (possibly moving) base, and {U} is a universal inertial frame of reference" >}} + +In the joint space, the dynamics of a flexure jointed hexapod are written as: + +\begin{equation} + \vec{f}\_b = \vec{f}\_m - \bm{K}(\vec{l} - \vec{l}\_r) - \bm{B} \dot{\vec{l}} +\end{equation} + +\begin{aligned} + & \left( {}^U\_P\bm{R} {}^P\bm{M}\_x {}^B\_P\bm{R}^T \bm{J}^{-1} \right) \ddot{\vec{l}} + \\\\\\ + & {}^U\_B\bm{R} \bm{J}^T \bm{B} \dot{\vec{l}} + {}^U\_B\bm{R}\bm{J}^T \bm{K}(\vec{l} - \vec{l}\_r) = \\\\\\ + & {}^U\_B\bm{R} \bm{J}^T \vec{f}\_m + \vec{\mathcal{F}}\_e + \vec{\mathcal{F}} + \vec{\mathcal{C}} - \\\\\\ + & \left( {}^U\_B\bm{R} \bm{J}^T \bm{M}\_s + {}^U\_P\bm{R} {}^P\bm{M}\_x {}^U\_P\bm{R}^T \bm{J}\_c \bm{J}\_B^{-1} \right) \ddot{\vec{q}}\_s +\end{aligned} + +where: + +- \\(\bm{J}\\) is the \\(6 \times 6\\) hexapod Jacobian relating payload Cartesian movements, expressed in {P}, to strut length changes in the joint space +- \\({}^B\_U\bm{R}\\) is the \\(6 \times 6\\) rotation matrix from the base frame {B} to the universal inertial frame of reference {U} (it consists of two identical \\(3 \times 3\\) rotation matrices forming a block diagonal \\(6 \times 6\\) matrix) +- \\(\bm{J}\_c\\) and \\(\bm{J}\_B\\) are \\(6 \times 6\\) Jacobian matrices capturing base motion +- \\({}^P\bm{M}\_x\\) is the \\(6 \times 6\\) mass-inertia matrix of the payload found with respect to the payload frame {P} +- \\(\bm{M}\_s\\) is a diagonal \\(6 \times 6\\) matrix containing the moving mass of each strut +- \\(\bm{B}\\) and \\(\bm{K}\\) are \\(6 \times 6\\) diagonal matrices containing the damping of stiffness, respectively, of each strut +- \\(\vec{l}\\) is the \\(6 \times 1\\) vector of strut lengths, and \\(\vec{l}\_r\\) is the constant vector of relaxed strut length +- \\(\vec{f}\_b\\) is the vector of forces exerted at the bottom of the strut +- \\(\vec{f}\_m\\) is the vector of strut motor forces +- \\(\ddot{\vec{q}}\_s\\) is a \\(6 \times 1\\) vector of base accelerations along each strut plus some Coriolis terms +- \\(\vec{\mathcal{F}}\_e\\) is a vector of payload exogenous generalized forces +- \\(\vec{\mathcal{C}}\\) is a vector containing all the Coriolis and centripetal terms except the Coriolis terms in \\(\ddot{\vec{q}}\_s\\) +- \\(\vec{\mathcal{G}}\\) is a vector containing all gravity terms + +\begin{aligned} + \bm{M}\_p & \ddot{\vec{p}}\_s + \bm{B} \dot{\vec{p}}\_s + \bm{K} \vec{p}\_s = \vec{f}\_m + \\\\\\ + & \bm{M}\_q \ddot{\vec{q}}\_s + \bm{B} \dot{\vec{q}}\_s + \bm{J}^{-T} {}^U\_B\bm{R}^T \vec{\mathcal{F}}\_e +\end{aligned} + +where + +- \\(\bm{M}\_p = \bm{J}^{-T} {}^B\_P\bm{R} {}^P\bm{M}\_x {}^B\_P\bm{R}^T \bm{J}^{-1} + \bm{M}\_s\\) +- \\(\bm{M}\_q = \bm{J}^{-T} {}^B\_P\bm{R} {}^P\bm{M}\_x {}^B\_P\bm{R}^T \bm{J}^{-1} - \bm{J}^{-T} {}^B\_P\bm{R} {}^P\bm{M}\_x {}^B\_P\bm{R}^T \bm{J}\_c \bm{J}\_B^{-1}\\) + +\\(\bm{M}\_p\\) and \\(\bm{M}\_q\\) are joint space mass-inertia matrices. + + +## Decoupling the Dynamics of Flexure Jointed Hexapods {#decoupling-the-dynamics-of-flexure-jointed-hexapods} + + +## Identification of Joint Space Mass-Inertia Matrix {#identification-of-joint-space-mass-inertia-matrix} + + +## Experimental Results {#experimental-results} + +# Bibliography +Chen, Y., & McInroy, J., *Identification and decoupling control of flexure jointed hexapods*, In , Proceedings 2000 ICRA. Millennium Conference. IEEE International Conference on Robotics and Automation. Symposia Proceedings (Cat. No.00CH37065) (pp. ) (2000). : . [↩](#ba05ff213f8e5963d91559d95becfbdb) + +McInroy, J., *Dynamic modeling of flexure jointed hexapods for control purposes*, In , Proceedings of the 1999 IEEE International Conference on Control Applications (Cat. No.99CH36328) (pp. ) (1999). : . [↩](#5da427f78c552aa92cd64c2a6df961f1) diff --git a/content/article/claeyssen07_amplif_piezoel_actuat.md b/content/article/claeyssen07_amplif_piezoel_actuat.md new file mode 100644 index 0000000..df3b4ef --- /dev/null +++ b/content/article/claeyssen07_amplif_piezoel_actuat.md @@ -0,0 +1,21 @@ ++++ +title = "Amplified piezoelectric actuators: static & dynamic applications" +author = ["Thomas Dehaeze"] +draft = false ++++ + +Tags +: + + +Reference +: (Frank Claeyssen {\it et al.}, 2007) + +Author(s) +: Claeyssen, F., Letty, R. L., Barillot, F., & Sosnicki, O. + +Year +: 2007 + +# Bibliography +Claeyssen, F., Letty, R. L., Barillot, F., & Sosnicki, O., *Amplified piezoelectric actuators: static \& dynamic applications*, Ferroelectrics, *351(1)*, 3–14 (2007). http://dx.doi.org/10.1080/00150190701351865 [↩](#5decd2b31c4a9842b80c58b56f96590a) diff --git a/content/paper/collette11_review_activ_vibrat_isolat_strat.md b/content/article/collette11_review_activ_vibrat_isolat_strat.md similarity index 79% rename from content/paper/collette11_review_activ_vibrat_isolat_strat.md rename to content/article/collette11_review_activ_vibrat_isolat_strat.md index 1a61d73..b6c6924 100644 --- a/content/paper/collette11_review_activ_vibrat_isolat_strat.md +++ b/content/article/collette11_review_activ_vibrat_isolat_strat.md @@ -8,7 +8,7 @@ Tags : [Vibration Isolation]({{< relref "vibration_isolation" >}}) Reference -: (Christophe Collette {\it et al.}, 2011) +: (Christophe Collette {\it et al.}, 2011) Author(s) : Collette, C., Janssens, S., & Artoos, K. @@ -71,9 +71,9 @@ The general expression of the force delivered by the actuator is \\(f = g\_a \dd ## Conclusions {#conclusions} - + {{< figure src="/ox-hugo/collette11_comp_isolation_strategies.png" caption="Figure 1: Comparison of Active Vibration Isolation Strategies" >}} # Bibliography -Collette, C., Janssens, S., & Artoos, K., *Review of active vibration isolation strategies*, Recent Patents on Mechanical Engineeringe, *4(3)*, 212–219 (2011). http://dx.doi.org/10.2174/2212797611104030212 [↩](#2d69d483f210ca387ca8061596ec27ea) +Collette, C., Janssens, S., & Artoos, K., *Review of active vibration isolation strategies*, Recent Patents on Mechanical Engineeringe, *4(3)*, 212–219 (2011). http://dx.doi.org/10.2174/2212797611104030212 [↩](#2d69d483f210ca387ca8061596ec27ea) diff --git a/content/paper/collette14_vibrat.md b/content/article/collette14_vibrat.md similarity index 89% rename from content/paper/collette14_vibrat.md rename to content/article/collette14_vibrat.md index a207053..b60f6b5 100644 --- a/content/paper/collette14_vibrat.md +++ b/content/article/collette14_vibrat.md @@ -8,7 +8,7 @@ Tags : [Vibration Isolation]({{< relref "vibration_isolation" >}}), [Sensor Fusion]({{< relref "sensor_fusion" >}}) Reference -: (Collette \& Matichard, 2014) Author(s) @@ -101,4 +101,4 @@ Three types of sensors have been considered for the high frequency part of the f - The fusion with a **force sensor** can be used to increase the loop gain with little effect on the compliance and passive isolation, provided that the blend is possible and that no active damping of flexible modes is required. # Bibliography -Collette, C., & Matichard, F., *Vibration control of flexible structures using fusion of inertial sensors and hyper-stable actuator-sensor pairs*, In , International Conference on Noise and Vibration Engineering (ISMA2014) (pp. ) (2014). : . [↩](#1223611da2f9b157af97503a4fec7631) +Collette, C., & Matichard, F., *Vibration control of flexible structures using fusion of inertial sensors and hyper-stable actuator-sensor pairs*, In , International Conference on Noise and Vibration Engineering (ISMA2014) (pp. ) (2014). : . [↩](#1223611da2f9b157af97503a4fec7631) diff --git a/content/paper/collette15_sensor_fusion_method_high_perfor.md b/content/article/collette15_sensor_fusion_method_high_perfor.md similarity index 64% rename from content/paper/collette15_sensor_fusion_method_high_perfor.md rename to content/article/collette15_sensor_fusion_method_high_perfor.md index d0a64ad..70bf2ff 100644 --- a/content/paper/collette15_sensor_fusion_method_high_perfor.md +++ b/content/article/collette15_sensor_fusion_method_high_perfor.md @@ -8,7 +8,7 @@ Tags : [Sensor Fusion]({{< relref "sensor_fusion" >}}), [Vibration Isolation]({{< relref "vibration_isolation" >}}) Reference -: (Collette \& Matichard, 2015) +: (Collette \& Matichard, 2015) Author(s) : Collette, C., & Matichard, F. @@ -25,4 +25,4 @@ The stability margins of the controller can be significantly increased with no o - there exists a bandwidth where we can superimpose the open loop transfer functions obtained with the two sensors. # Bibliography -Collette, C., & Matichard, F., *Sensor fusion methods for high performance active vibration isolation systems*, Journal of Sound and Vibration, *342(nil)*, 1–21 (2015). http://dx.doi.org/10.1016/j.jsv.2015.01.006 [↩](#7772841a8f05142ec30f0f6daae20932) +Collette, C., & Matichard, F., *Sensor fusion methods for high performance active vibration isolation systems*, Journal of Sound and Vibration, *342(nil)*, 1–21 (2015). http://dx.doi.org/10.1016/j.jsv.2015.01.006 [↩](#7772841a8f05142ec30f0f6daae20932) diff --git a/content/paper/dasgupta00_stewar_platf_manip.md b/content/article/dasgupta00_stewar_platf_manip.md similarity index 67% rename from content/paper/dasgupta00_stewar_platf_manip.md rename to content/article/dasgupta00_stewar_platf_manip.md index 214cb72..9efeb09 100644 --- a/content/paper/dasgupta00_stewar_platf_manip.md +++ b/content/article/dasgupta00_stewar_platf_manip.md @@ -8,7 +8,7 @@ Tags : [Stewart Platforms]({{< relref "stewart_platforms" >}}) Reference -: (Bhaskar Dasgupta \& Mruthyunjaya, 2000) +: (Bhaskar Dasgupta \& Mruthyunjaya, 2000) Author(s) : Dasgupta, B., & Mruthyunjaya, T. @@ -34,4 +34,4 @@ Year The generalized Stewart platforms consists of two rigid bodies (referred to as the base and the platoform) connected through six extensible legs, each with sherical joints at both ends. # Bibliography -Dasgupta, B., & Mruthyunjaya, T., *The stewart platform manipulator: a review*, Mechanism and Machine Theory, *35(1)*, 15–40 (2000). http://dx.doi.org/10.1016/s0094-114x(99)00006-3 [↩](#ad17e03f0fbbcc1a070557d7b5a0e1e1) +Dasgupta, B., & Mruthyunjaya, T., *The stewart platform manipulator: a review*, Mechanism and Machine Theory, *35(1)*, 15–40 (2000). http://dx.doi.org/10.1016/s0094-114x(99)00006-3 [↩](#ad17e03f0fbbcc1a070557d7b5a0e1e1) diff --git a/content/paper/devasia07_survey_contr_issues_nanop.md b/content/article/devasia07_survey_contr_issues_nanop.md similarity index 51% rename from content/paper/devasia07_survey_contr_issues_nanop.md rename to content/article/devasia07_survey_contr_issues_nanop.md index 11e3965..a80a58b 100644 --- a/content/paper/devasia07_survey_contr_issues_nanop.md +++ b/content/article/devasia07_survey_contr_issues_nanop.md @@ -9,7 +9,7 @@ Tags Reference -: (Devasia {\it et al.}, 2007) +: (Devasia {\it et al.}, 2007) Author(s) : Devasia, S., Eleftheriou, E., & Moheimani, S. R. @@ -22,9 +22,9 @@ Year - Interesting analysis about Bandwidth-Precision-Range tradeoffs - Control approaches for piezoelectric actuators: feedforward, Feedback, Iterative, Sensorless controls - + {{< figure src="/ox-hugo/devasia07_piezoelectric_tradeoff.png" caption="Figure 1: Tradeoffs between bandwidth, precision and range" >}} # Bibliography -Devasia, S., Eleftheriou, E., & Moheimani, S. R., *A survey of control issues in nanopositioning*, IEEE Transactions on Control Systems Technology, *15(5)*, 802–823 (2007). [↩](#8ce53b8a612ce8ae3eb616cd1ed05630) +Devasia, S., Eleftheriou, E., & Moheimani, S. R., *A survey of control issues in nanopositioning*, IEEE Transactions on Control Systems Technology, *15(5)*, 802–823 (2007). [↩](#8ce53b8a612ce8ae3eb616cd1ed05630) diff --git a/content/paper/fleming10_nanop_system_with_force_feedb.md b/content/article/fleming10_nanop_system_with_force_feedb.md similarity index 87% rename from content/paper/fleming10_nanop_system_with_force_feedb.md rename to content/article/fleming10_nanop_system_with_force_feedb.md index d1837eb..baada22 100644 --- a/content/paper/fleming10_nanop_system_with_force_feedb.md +++ b/content/article/fleming10_nanop_system_with_force_feedb.md @@ -8,7 +8,7 @@ Tags : [Sensor Fusion]({{< relref "sensor_fusion" >}}), [Force Sensors]({{< relref "force_sensors" >}}) Reference -: (Fleming, 2010) +: (Fleming, 2010) Author(s) : Fleming, A. @@ -30,7 +30,7 @@ Summary: ## Model of a multi-layer monolithic piezoelectric stack actuator {#model-of-a-multi-layer-monolithic-piezoelectric-stack-actuator} - + {{< figure src="/ox-hugo/fleming10_piezo_model.png" caption="Figure 1: Schematic of a multi-layer monolithic piezoelectric stack actuator model" >}} @@ -113,7 +113,7 @@ The current noise density of a general purpose LM833 FET-input op-amp is \\(0.5\ The capacitance of a piezoelectric stack is typically between \\(1 \mu F\\) and \\(100 \mu F\\). # Bibliography -Fleming, A., *Nanopositioning system with force feedback for high-performance tracking and vibration control*, IEEE/ASME Transactions on Mechatronics, *15(3)*, 433–447 (2010). http://dx.doi.org/10.1109/tmech.2009.2028422 [↩](#c823f68dd2a72b9667a61b3c046b4731) +Fleming, A., *Nanopositioning system with force feedback for high-performance tracking and vibration control*, IEEE/ASME Transactions on Mechatronics, *15(3)*, 433–447 (2010). http://dx.doi.org/10.1109/tmech.2009.2028422 [↩](#c823f68dd2a72b9667a61b3c046b4731) ## Backlinks {#backlinks} diff --git a/content/article/fleming12_estim.md b/content/article/fleming12_estim.md new file mode 100644 index 0000000..8a0fc4c --- /dev/null +++ b/content/article/fleming12_estim.md @@ -0,0 +1,22 @@ ++++ +title = "Estimating the resolution of nanopositioning systems from frequency domain data" +author = ["Thomas Dehaeze"] +draft = false ++++ + +Tags +: + + +Reference +: (Andrew Fleming, 2012) + +Author(s) +: Fleming, A. J. + +Year +: 2012 + +# Bibliography +Fleming, A. J., *Estimating the resolution of nanopositioning systems from frequency domain data*, In , 2012 IEEE International Conference on Robotics and Automation (pp. ) (2012). : . [↩](#a1cc9b70316a7dda2f652efd146caf84) diff --git a/content/paper/fleming13_review_nanom_resol_posit_sensor.md b/content/article/fleming13_review_nanom_resol_posit_sensor.md similarity index 90% rename from content/paper/fleming13_review_nanom_resol_posit_sensor.md rename to content/article/fleming13_review_nanom_resol_posit_sensor.md index d6a3a34..e65532b 100644 --- a/content/paper/fleming13_review_nanom_resol_posit_sensor.md +++ b/content/article/fleming13_review_nanom_resol_posit_sensor.md @@ -8,7 +8,7 @@ Tags : [Position Sensors]({{< relref "position_sensors" >}}) Reference -: (Andrew Fleming, 2013) +: (Andrew Fleming, 2013) Author(s) : Fleming, A. J. @@ -33,7 +33,7 @@ Usually quoted as a percentage of the fill-scale range (FSR): With \\(e\_m(v)\\) is the mapping error. - + {{< figure src="/ox-hugo/fleming13_mapping_error.png" caption="Figure 1: The actual position versus the output voltage of a position sensor. The calibration function \\(f\_{cal}(v)\\) is an approximation of the sensor mapping function \\(f\_a(v)\\) where \\(v\\) is the voltage resulting from a displacement \\(x\\). \\(e\_m(v)\\) is the residual error." >}} @@ -42,7 +42,7 @@ With \\(e\_m(v)\\) is the mapping error. If the shape of the mapping function actually varies with time, the maximum error due to drift must be evaluated by finding the worst-case mapping error. - + {{< figure src="/ox-hugo/fleming13_drift_stability.png" caption="Figure 2: The worst case range of a linear mapping function \\(f\_a(v)\\) for a given error in sensitivity and offset." >}} @@ -147,9 +147,9 @@ The empirical rule states that there is a \\(99.7\%\\) probability that a sample This if we define the resolution as \\(\delta = 6 \sigma\\), we will referred to as the \\(6\sigma\text{-resolution}\\). Another important parameter that must be specified when quoting resolution is the sensor bandwidth. -There is usually a trade-off between bandwidth and resolution (figure [3](#org954f29f)). +There is usually a trade-off between bandwidth and resolution (figure [3](#org92eeb72)). - + {{< figure src="/ox-hugo/fleming13_tradeoff_res_bandwidth.png" caption="Figure 3: The resolution versus banwidth of a position sensor." >}} @@ -182,4 +182,9 @@ A convenient method for reporting this ratio is in parts-per-million (ppm): | Encoder | Meters | | 6 nm | >100kHz | 5 ppm FSR | # Bibliography -Fleming, A. J., *A review of nanometer resolution position sensors: operation and performance*, Sensors and Actuators A: Physical, *190(nil)*, 106–126 (2013). http://dx.doi.org/10.1016/j.sna.2012.10.016 [↩](#3fb5b61524290e36d639a4fac65703d0) +Fleming, A. J., *A review of nanometer resolution position sensors: operation and performance*, Sensors and Actuators A: Physical, *190(nil)*, 106–126 (2013). http://dx.doi.org/10.1016/j.sna.2012.10.016 [↩](#3fb5b61524290e36d639a4fac65703d0) + + +## Backlinks {#backlinks} + +- [Position Sensors]({{< relref "position_sensors" >}}) diff --git a/content/article/furqan17_studies_stewar_platf_manip.md b/content/article/furqan17_studies_stewar_platf_manip.md new file mode 100644 index 0000000..1ef7293 --- /dev/null +++ b/content/article/furqan17_studies_stewar_platf_manip.md @@ -0,0 +1,22 @@ ++++ +title = "Studies on stewart platform manipulator: a review" +author = ["Thomas Dehaeze"] +draft = false ++++ + +Tags +: [Stewart Platforms]({{< relref "stewart_platforms" >}}) + +Reference +: (Mohd Furqan {\it et al.}, 2017) + +Author(s) +: Furqan, M., Suhaib, M., & Ahmad, N. + +Year +: 2017 + +Lots of references. + +# Bibliography +Furqan, M., Suhaib, M., & Ahmad, N., *Studies on stewart platform manipulator: a review*, Journal of Mechanical Science and Technology, *31(9)*, 4459–4470 (2017). http://dx.doi.org/10.1007/s12206-017-0846-1 [↩](#cc10fe9545c7c381cc2b610e8f91a071) diff --git a/content/paper/furutani04_nanom_cuttin_machin_using_stewar.md b/content/article/furutani04_nanom_cuttin_machin_using_stewar.md similarity index 60% rename from content/paper/furutani04_nanom_cuttin_machin_using_stewar.md rename to content/article/furutani04_nanom_cuttin_machin_using_stewar.md index d130182..1dc806e 100644 --- a/content/paper/furutani04_nanom_cuttin_machin_using_stewar.md +++ b/content/article/furutani04_nanom_cuttin_machin_using_stewar.md @@ -8,7 +8,7 @@ Tags : [Stewart Platforms]({{< relref "stewart_platforms" >}}), [Flexible Joints]({{< relref "flexible_joints" >}}) Reference -: (Katsushi Furutani {\it et al.}, 2004) +: (Katsushi Furutani {\it et al.}, 2004) Author(s) : Furutani, K., Suzuki, M., & Kudoh, R. @@ -35,4 +35,4 @@ To minimize the errors, a calibration is done between the required leg length an Then, it is fitted with 4th order polynomial and included in the control architecture. # Bibliography -Furutani, K., Suzuki, M., & Kudoh, R., *Nanometre-cutting machine using a stewart-platform parallel mechanism*, Measurement Science and Technology, *15(2)*, 467–474 (2004). http://dx.doi.org/10.1088/0957-0233/15/2/022 [↩](#bedab298599c84f60236313ebaad2714) +Furutani, K., Suzuki, M., & Kudoh, R., *Nanometre-cutting machine using a stewart-platform parallel mechanism*, Measurement Science and Technology, *15(2)*, 467–474 (2004). http://dx.doi.org/10.1088/0957-0233/15/2/022 [↩](#bedab298599c84f60236313ebaad2714) diff --git a/content/article/gao15_measur_techn_precis_posit.md b/content/article/gao15_measur_techn_precis_posit.md new file mode 100644 index 0000000..32388b2 --- /dev/null +++ b/content/article/gao15_measur_techn_precis_posit.md @@ -0,0 +1,20 @@ ++++ +title = "Measurement technologies for precision positioning" +author = ["Thomas Dehaeze"] +draft = false ++++ + +Tags +: [Position Sensors]({{< relref "position_sensors" >}}) + +Reference +: (Gao {\it et al.}, 2015) + +Author(s) +: Gao, W., Kim, S., Bosse, H., Haitjema, H., Chen, Y., Lu, X., Knapp, W., … + +Year +: 2015 + +# Bibliography +Gao, W., Kim, S., Bosse, H., Haitjema, H., Chen, Y., Lu, X., Knapp, W., …, *Measurement technologies for precision positioning*, CIRP Annals, *64(2)*, 773–796 (2015). http://dx.doi.org/10.1016/j.cirp.2015.05.009 [↩](#b820b918ced36901ea0ad4bf653202c6) diff --git a/content/paper/garg07_implem_chall_multiv_contr.md b/content/article/garg07_implem_chall_multiv_contr.md similarity index 69% rename from content/paper/garg07_implem_chall_multiv_contr.md rename to content/article/garg07_implem_chall_multiv_contr.md index aad78ce..0108676 100644 --- a/content/paper/garg07_implem_chall_multiv_contr.md +++ b/content/article/garg07_implem_chall_multiv_contr.md @@ -8,7 +8,7 @@ Tags : [Multivariable Control]({{< relref "multivariable_control" >}}) Reference -: (Sanjay Garg, 2007) Author(s) @@ -36,4 +36,4 @@ The control rate should be weighted appropriately in order to not saturate the s - importance of scaling the plant prior to synthesis and also replacing pure integrators with slow poles # Bibliography -Garg, S., *Implementation challenges for multivariable control: what you did not learn in school!*, In , AIAA Guidance, Navigation and Control Conference and Exhibit (pp. ) (2007). : . [↩](#07f63c751c1d9fcfe628178688f7ec24) +Garg, S., *Implementation challenges for multivariable control: what you did not learn in school!*, In , AIAA Guidance, Navigation and Control Conference and Exhibit (pp. ) (2007). : . [↩](#07f63c751c1d9fcfe628178688f7ec24) diff --git a/content/paper/geng95_intel_contr_system_multip_degree.md b/content/article/geng95_intel_contr_system_multip_degree.md similarity index 74% rename from content/paper/geng95_intel_contr_system_multip_degree.md rename to content/article/geng95_intel_contr_system_multip_degree.md index 188495f..5d7088e 100644 --- a/content/paper/geng95_intel_contr_system_multip_degree.md +++ b/content/article/geng95_intel_contr_system_multip_degree.md @@ -16,9 +16,9 @@ Author(s) Year : 1995 - + {{< figure src="/ox-hugo/geng95_control_structure.png" caption="Figure 1: Local force feedback and adaptive acceleration feedback for active isolation" >}} # Bibliography -Geng, Z. J., Pan, G. G., Haynes, L. S., Wada, B. K., & Garba, J. A., *An intelligent control system for multiple degree-of-freedom vibration isolation*, Journal of Intelligent Material Systems and Structures, *6(6)*, 787–800 (1995). http://dx.doi.org/10.1177/1045389x9500600607 [↩](#76af0f5c88615842fa91864c8618fb58) +Geng, Z. J., Pan, G. G., Haynes, L. S., Wada, B. K., & Garba, J. A., *An intelligent control system for multiple degree-of-freedom vibration isolation*, Journal of Intelligent Material Systems and Structures, *6(6)*, 787–800 (1995). http://dx.doi.org/10.1177/1045389x9500600607 [↩](#76af0f5c88615842fa91864c8618fb58) diff --git a/content/article/hanieh03_activ_stewar.md b/content/article/hanieh03_activ_stewar.md new file mode 100644 index 0000000..09edd42 --- /dev/null +++ b/content/article/hanieh03_activ_stewar.md @@ -0,0 +1,20 @@ ++++ +title = "Active isolation and damping of vibrations via stewart platform" +author = ["Thomas Dehaeze"] +draft = false ++++ + +Tags +: [Stewart Platforms]({{< relref "stewart_platforms" >}}), [Vibration Isolation]({{< relref "vibration_isolation" >}}), [Active Damping]({{< relref "active_damping" >}}) + +Reference +: (Hanieh, 2003) + +Author(s) +: Hanieh, A. A. + +Year +: 2003 + +# Bibliography +Hanieh, A. A., *Active isolation and damping of vibrations via stewart platform* (2003). Universit{\'e} Libre de Bruxelles, Brussels, Belgium. [↩](#10e535e895bdcd6b921bff33ef68cd81) diff --git a/content/paper/hauge04_sensor_contr_space_based_six.md b/content/article/hauge04_sensor_contr_space_based_six.md similarity index 88% rename from content/paper/hauge04_sensor_contr_space_based_six.md rename to content/article/hauge04_sensor_contr_space_based_six.md index 5fb26e1..94fb8b9 100644 --- a/content/paper/hauge04_sensor_contr_space_based_six.md +++ b/content/article/hauge04_sensor_contr_space_based_six.md @@ -8,7 +8,7 @@ Tags : [Stewart Platforms]({{< relref "stewart_platforms" >}}), [Vibration Isolation]({{< relref "vibration_isolation" >}}), [Cubic Architecture]({{< relref "cubic_architecture" >}}) Reference -: (Hauge \& Campbell, 2004) +: (Hauge \& Campbell, 2004) Author(s) : Hauge, G., & Campbell, M. @@ -24,20 +24,20 @@ Year - Vibration isolation using a Stewart platform - Experimental comparison of Force sensor and Inertial Sensor and associated control architecture for vibration isolation - + {{< figure src="/ox-hugo/hauge04_stewart_platform.png" caption="Figure 1: Hexapod for active vibration isolation" >}} -**Stewart platform** (Figure [1](#org666133a)): +**Stewart platform** (Figure [1](#org342e642)): - Low corner frequency - Large actuator stroke (\\(\pm5mm\\)) -- Sensors in each strut (Figure [2](#org4d96564)): +- Sensors in each strut (Figure [2](#orge1d3dcd)): - three-axis load cell - base and payload geophone in parallel with the struts - LVDT - + {{< figure src="/ox-hugo/hauge05_struts.png" caption="Figure 2: Strut" >}} @@ -64,7 +64,7 @@ With \\(|T(\omega)|\\) is the Frobenius norm of the transmissibility matrix and - single strut axis as the cubic Stewart platform can be decomposed into 6 single-axis systems - + {{< figure src="/ox-hugo/hauge04_strut_model.png" caption="Figure 3: Strut model" >}} @@ -136,9 +136,9 @@ And we find that for \\(u\\) and \\(y\\) to be an acceptable pair for high gain - The performance requirements are met - Good robustness - + {{< figure src="/ox-hugo/hauge04_obtained_transmissibility.png" caption="Figure 4: Experimental open loop (solid) and closed loop six-axis transmissibility using the geophone only controller (dotted), and combined geophone/load cell controller (dashed)" >}} # Bibliography -Hauge, G., & Campbell, M., *Sensors and control of a space-based six-axis vibration isolation system*, Journal of Sound and Vibration, *269(3-5)*, 913–931 (2004). http://dx.doi.org/10.1016/s0022-460x(03)00206-2 [↩](#f9698a1741fe7492aa9b7b42c7724670) +Hauge, G., & Campbell, M., *Sensors and control of a space-based six-axis vibration isolation system*, Journal of Sound and Vibration, *269(3-5)*, 913–931 (2004). http://dx.doi.org/10.1016/s0022-460x(03)00206-2 [↩](#f9698a1741fe7492aa9b7b42c7724670) diff --git a/content/paper/holler12_instr_x_ray_nano_imagin.md b/content/article/holler12_instr_x_ray_nano_imagin.md similarity index 74% rename from content/paper/holler12_instr_x_ray_nano_imagin.md rename to content/article/holler12_instr_x_ray_nano_imagin.md index 5449f8b..2727445 100644 --- a/content/paper/holler12_instr_x_ray_nano_imagin.md +++ b/content/article/holler12_instr_x_ray_nano_imagin.md @@ -8,7 +8,7 @@ Tags : [Nano Active Stabilization System]({{< relref "nano_active_stabilization_system" >}}), [Positioning Stations]({{< relref "positioning_stations" >}}) Reference -: (Holler {\it et al.}, 2012) +: (Holler {\it et al.}, 2012) Author(s) : Holler, M., Raabe, J., Diaz, A., Guizar-Sicairos, M., Quitmann, C., Menzel, A., & Bunk, O. @@ -19,7 +19,7 @@ Year Instrument similar to the NASS. Obtain position stability of 10nm (standard deviation). - + {{< figure src="/ox-hugo/holler12_station.png" caption="Figure 1: Schematic of the tomography setup" >}} @@ -39,4 +39,4 @@ Obtain position stability of 10nm (standard deviation). - **Feedback Loop**: Using the signals from the 2 interferometers, the loop is closed to compensate low frequency vibrations and thermal drifts. # Bibliography -Holler, M., Raabe, J., Diaz, A., Guizar-Sicairos, M., Quitmann, C., Menzel, A., & Bunk, O., *An instrument for 3d x-ray nano-imaging*, Review of Scientific Instruments, *83(7)*, 073703 (2012). http://dx.doi.org/10.1063/1.4737624 [↩](#66ab0e7602a1dedda963d7da60533b0d) +Holler, M., Raabe, J., Diaz, A., Guizar-Sicairos, M., Quitmann, C., Menzel, A., & Bunk, O., *An instrument for 3d x-ray nano-imaging*, Review of Scientific Instruments, *83(7)*, 073703 (2012). http://dx.doi.org/10.1063/1.4737624 [↩](#66ab0e7602a1dedda963d7da60533b0d) diff --git a/content/article/holterman05_activ_dampin_based_decoup_colloc_contr.md b/content/article/holterman05_activ_dampin_based_decoup_colloc_contr.md new file mode 100644 index 0000000..79b2eda --- /dev/null +++ b/content/article/holterman05_activ_dampin_based_decoup_colloc_contr.md @@ -0,0 +1,20 @@ ++++ +title = "Active damping based on decoupled collocated control" +author = ["Thomas Dehaeze"] +draft = false ++++ + +Tags +: [Active Damping]({{< relref "active_damping" >}}) + +Reference +: (Holterman \& deVries, 2005) + +Author(s) +: Holterman, J., & deVries, T. + +Year +: 2005 + +# Bibliography +Holterman, J., & deVries, T., *Active damping based on decoupled collocated control*, IEEE/ASME Transactions on Mechatronics, *10(2)*, 135–145 (2005). http://dx.doi.org/10.1109/tmech.2005.844702 [↩](#cc7836a555fe4dbae791e17008c29bfd) diff --git a/content/paper/ito16_compar_class_high_precis_actuat.md b/content/article/ito16_compar_class_high_precis_actuat.md similarity index 79% rename from content/paper/ito16_compar_class_high_precis_actuat.md rename to content/article/ito16_compar_class_high_precis_actuat.md index 81564dc..11fe02c 100644 --- a/content/paper/ito16_compar_class_high_precis_actuat.md +++ b/content/article/ito16_compar_class_high_precis_actuat.md @@ -8,7 +8,7 @@ Tags : [Vibration Isolation]({{< relref "vibration_isolation" >}}), [Actuators]({{< relref "actuators" >}}) Reference -: (Shingo Ito \& Georg Schitter, 2016) +: (Shingo Ito \& Georg Schitter, 2016) Author(s) : Ito, S., & Schitter, G. @@ -41,7 +41,7 @@ In this paper, the piezoelectric actuator/electronics adds a time delay which is - **Low Stiffness** actuator is defined as the ones where the transmissibility stays below 0dB at all frequency - **High Stiffness** actuator is defined as the ones where the transmissibility goes above 0dB at some frequency - + {{< figure src="/ox-hugo/ito16_low_high_stiffness_actuators.png" caption="Figure 1: Definition of low-stiffness and high-stiffness actuator" >}} @@ -54,7 +54,7 @@ In this paper, the piezoelectric actuator/electronics adds a time delay which is ## Controller Design {#controller-design} - + {{< figure src="/ox-hugo/ito16_transmissibility.png" caption="Figure 2: Obtained transmissibility" >}} @@ -67,7 +67,7 @@ In practice, this is difficult to achieve with piezoelectric actuators as their In contrast, the frequency band between the first and the other resonances of Lorentz actuators can be broad by design making them more suitable to construct a low-stiffness actuators. # Bibliography -Ito, S., & Schitter, G., *Comparison and classification of high-precision actuators based on stiffness influencing vibration isolation*, IEEE/ASME Transactions on Mechatronics, *21(2)*, 1169–1178 (2016). http://dx.doi.org/10.1109/tmech.2015.2478658 [↩](#aad53368e29e8a519e2f63857044fa46) +Ito, S., & Schitter, G., *Comparison and classification of high-precision actuators based on stiffness influencing vibration isolation*, IEEE/ASME Transactions on Mechatronics, *21(2)*, 1169–1178 (2016). http://dx.doi.org/10.1109/tmech.2015.2478658 [↩](#aad53368e29e8a519e2f63857044fa46) ## Backlinks {#backlinks} diff --git a/content/article/jiao18_dynam_model_exper_analy_stewar.md b/content/article/jiao18_dynam_model_exper_analy_stewar.md new file mode 100644 index 0000000..ee3e17c --- /dev/null +++ b/content/article/jiao18_dynam_model_exper_analy_stewar.md @@ -0,0 +1,20 @@ ++++ +title = "Dynamic modeling and experimental analyses of stewart platform with flexible hinges" +author = ["Thomas Dehaeze"] +draft = false ++++ + +Tags +: [Stewart Platforms]({{< relref "stewart_platforms" >}}), [Flexible Joints]({{< relref "flexible_joints" >}}) + +Reference +: (Jian Jiao {\it et al.}, 2018) + +Author(s) +: Jiao, J., Wu, Y., Yu, K., & Zhao, R. + +Year +: 2018 + +# Bibliography +Jiao, J., Wu, Y., Yu, K., & Zhao, R., *Dynamic modeling and experimental analyses of stewart platform with flexible hinges*, Journal of Vibration and Control, *25(1)*, 151–171 (2018). http://dx.doi.org/10.1177/1077546318772474 [↩](#ee917739f88877d6c2758c1c36565deb) diff --git a/content/paper/legnani12_new_isotr_decoup_paral_manip.md b/content/article/legnani12_new_isotr_decoup_paral_manip.md similarity index 57% rename from content/paper/legnani12_new_isotr_decoup_paral_manip.md rename to content/article/legnani12_new_isotr_decoup_paral_manip.md index f722f5b..0d46b2d 100644 --- a/content/paper/legnani12_new_isotr_decoup_paral_manip.md +++ b/content/article/legnani12_new_isotr_decoup_paral_manip.md @@ -2,13 +2,14 @@ title = "A new isotropic and decoupled 6-dof parallel manipulator" author = ["Thomas Dehaeze"] draft = false +GHissueID = 1 +++ Tags : [Stewart Platforms]({{< relref "stewart_platforms" >}}) Reference -: (Legnani {\it et al.}, 2012) +: (Legnani {\it et al.}, 2012) Author(s) : Legnani, G., Fassi, I., Giberti, H., Cinquemani, S., & Tosi, D. @@ -22,13 +23,13 @@ Year Example of generated isotropic manipulator (not decoupled). - + {{< figure src="/ox-hugo/legnani12_isotropy_gen.png" caption="Figure 1: Location of the leg axes using an isotropy generator" >}} - + {{< figure src="/ox-hugo/legnani12_generated_isotropy.png" caption="Figure 2: Isotropic configuration" >}} # Bibliography -Legnani, G., Fassi, I., Giberti, H., Cinquemani, S., & Tosi, D., *A new isotropic and decoupled 6-dof parallel manipulator*, Mechanism and Machine Theory, *58(nil)*, 64–81 (2012). http://dx.doi.org/10.1016/j.mechmachtheory.2012.07.008 [↩](#17295cbc2858c65ecc60d51b450233e3) +Legnani, G., Fassi, I., Giberti, H., Cinquemani, S., & Tosi, D., *A new isotropic and decoupled 6-dof parallel manipulator*, Mechanism and Machine Theory, *58(nil)*, 64–81 (2012). http://dx.doi.org/10.1016/j.mechmachtheory.2012.07.008 [↩](#17295cbc2858c65ecc60d51b450233e3) diff --git a/content/paper/li01_simul_fault_vibrat_isolat_point.md b/content/article/li01_simul_fault_vibrat_isolat_point.md similarity index 81% rename from content/paper/li01_simul_fault_vibrat_isolat_point.md rename to content/article/li01_simul_fault_vibrat_isolat_point.md index c847f09..ddba37a 100644 --- a/content/paper/li01_simul_fault_vibrat_isolat_point.md +++ b/content/article/li01_simul_fault_vibrat_isolat_point.md @@ -8,21 +8,7 @@ Tags : [Stewart Platforms]({{< relref "stewart_platforms" >}}), [Vibration Isolation]({{< relref "vibration_isolation" >}}), [Cubic Architecture]({{< relref "cubic_architecture" >}}), [Flexible Joints]({{< relref "flexible_joints" >}}), [Multivariable Control]({{< relref "multivariable_control" >}}) Reference -: @phdthesis{li01_simul_fault_vibrat_isolat_point, - author = {Li, Xiaochun}, - school = {University of Wyoming}, - title = {Simultaneous, Fault-tolerant Vibration Isolation and - Pointing Control of Flexure Jointed Hexapods}, - year = 2001, - tags = {parallel robot}, - } +: (Li, 2001) Author(s) : Li, X. @@ -38,7 +24,7 @@ Year - Cubic (mutually orthogonal) - Flexure Joints => eliminate friction and backlash but add complexity to the dynamics - + {{< figure src="/ox-hugo/li01_stewart_platform.png" caption="Figure 1: Flexure jointed Stewart platform used for analysis and control" >}} @@ -52,18 +38,18 @@ Year The origin of \\(\\{P\\}\\) is taken as the center of mass of the payload. **Decoupling**: -If we refine the (force) inputs and (displacement) outputs as shown in Figure [2](#org2d875d1) or in Figure [3](#org3e247bd), we obtain a decoupled plant provided that: +If we refine the (force) inputs and (displacement) outputs as shown in Figure [2](#org5d5e02c) or in Figure [3](#org0c14c06), we obtain a decoupled plant provided that: 1. the payload mass/inertia matrix must be diagonal (the CoM is coincident with the origin of frame \\(\\{P\\}\\)) 2. the geometry of the hexapod and the attachment of the payload to the hexapod must be carefully chosen > For instance, if the hexapod has a mutually orthogonal geometry (cubic configuration), the payload's center of mass must coincide with the center of the cube formed by the orthogonal struts. - + {{< figure src="/ox-hugo/li01_decoupling_conf.png" caption="Figure 2: Decoupling the dynamics of the Stewart Platform using the Jacobians" >}} - + {{< figure src="/ox-hugo/li01_decoupling_conf_bis.png" caption="Figure 3: Decoupling the dynamics of the Stewart Platform using the Jacobians" >}} @@ -89,15 +75,15 @@ The control bandwidth is divided as follows: ### Vibration Isolation {#vibration-isolation} -The system is decoupled into six independent SISO subsystems using the architecture shown in Figure [4](#org3c42849). +The system is decoupled into six independent SISO subsystems using the architecture shown in Figure [4](#orgf519833). - + {{< figure src="/ox-hugo/li01_vibration_isolation_control.png" caption="Figure 4: Figure caption" >}} -One of the subsystem plant transfer function is shown in Figure [4](#org3c42849) +One of the subsystem plant transfer function is shown in Figure [4](#orgf519833) - + {{< figure src="/ox-hugo/li01_vibration_control_plant.png" caption="Figure 5: Plant transfer function of one of the SISO subsystem for Vibration Control" >}} @@ -111,9 +97,9 @@ The unity control bandwidth of the isolation loop is designed to be from **5Hz t ### Pointing Control {#pointing-control} -A block diagram of the pointing control system is shown in Figure [6](#org3c3e6ad). +A block diagram of the pointing control system is shown in Figure [6](#org1c5bf82). - + {{< figure src="/ox-hugo/li01_pointing_control.png" caption="Figure 6: Figure caption" >}} @@ -122,9 +108,9 @@ The compensators are design with inverse-dynamics methods. The unity control bandwidth of the pointing loop is designed to be from **0Hz to 20Hz**. -A feedforward control is added as shown in Figure [7](#orgc8fa614). +A feedforward control is added as shown in Figure [7](#org700dd8b). - + {{< figure src="/ox-hugo/li01_feedforward_control.png" caption="Figure 7: Feedforward control" >}} @@ -136,17 +122,17 @@ The simultaneous vibration isolation and pointing control is approached in two w 1. design and implement the vibration isolation control first, identify the pointing plant when the isolation loops are closed, then implement the pointing compensators 2. the reverse design order -Figure [8](#org987b709) shows a parallel control structure where \\(G\_1(s)\\) is the dynamics from input force to output strut length. +Figure [8](#orga79e625) shows a parallel control structure where \\(G\_1(s)\\) is the dynamics from input force to output strut length. - + {{< figure src="/ox-hugo/li01_parallel_control.png" caption="Figure 8: A parallel scheme" >}} The transfer function matrix for the pointing loop after the vibration isolation is closed is still decoupled. The same happens when closing the pointing loop first and looking at the transfer function matrix of the vibration isolation. -The effect of the isolation loop on the pointing loop is large around the natural frequency of the plant as shown in Figure [9](#orgb070c43). +The effect of the isolation loop on the pointing loop is large around the natural frequency of the plant as shown in Figure [9](#orgbd95400). - + {{< figure src="/ox-hugo/li01_effect_isolation_loop_closed.png" caption="Figure 9: \\(\theta\_x/\theta\_{x\_d}\\) transfer function with the isolation loop closed (simulation)" >}} @@ -157,19 +143,19 @@ The effect of pointing control on the isolation plant has not much effect. The dynamic interaction effect: - only happens in the unity bandwidth of the loop transmission of the first closed loop. -- affect the closed loop transmission of the loop first closed (see Figures [10](#org0d64bc7) and [11](#orgb43f022)) +- affect the closed loop transmission of the loop first closed (see Figures [10](#org191e7e3) and [11](#org28140a0)) -As shown in Figure [10](#org0d64bc7), the peak resonance of the pointing loop increase after the isolation loop is closed. +As shown in Figure [10](#org191e7e3), the peak resonance of the pointing loop increase after the isolation loop is closed. The resonances happen at both crossovers of the isolation loop (15Hz and 50Hz) and they may show of loss of robustness. - + {{< figure src="/ox-hugo/li01_closed_loop_pointing.png" caption="Figure 10: Closed-loop transfer functions \\(\theta\_y/\theta\_{y\_d}\\) of the pointing loop before and after the vibration isolation loop is closed" >}} -The same happens when first closing the vibration isolation loop and after the pointing loop (Figure [11](#orgb43f022)). +The same happens when first closing the vibration isolation loop and after the pointing loop (Figure [11](#org28140a0)). The first peak resonance of the vibration isolation loop at 15Hz is increased when closing the pointing loop. - + {{< figure src="/ox-hugo/li01_closed_loop_vibration.png" caption="Figure 11: Closed-loop transfer functions of the vibration isolation loop before and after the pointing control loop is closed" >}} @@ -179,18 +165,18 @@ The first peak resonance of the vibration isolation loop at 15Hz is increased wh ### Experimental results {#experimental-results} -Two hexapods are stacked (Figure [12](#org12b1e53)): +Two hexapods are stacked (Figure [12](#orgb11b2c6)): - the bottom hexapod is used to generate disturbances matching candidate applications - the top hexapod provide simultaneous vibration isolation and pointing control - + {{< figure src="/ox-hugo/li01_test_bench.png" caption="Figure 12: Stacked Hexapods" >}} -Using the vibration isolation control alone, no attenuation is achieved below 1Hz as shown in figure [13](#org4b99c02). +Using the vibration isolation control alone, no attenuation is achieved below 1Hz as shown in figure [13](#orgdd443cd). - + {{< figure src="/ox-hugo/li01_vibration_isolation_control_results.png" caption="Figure 13: Vibration isolation control: open-loop (solid) vs. closed-loop (dashed)" >}} @@ -199,9 +185,9 @@ The simultaneous control is of dual use: - it provide simultaneous pointing and isolation control - it can also be used to expand the bandwidth of the isolation control to low frequencies because the pointing loops suppress pointing errors due to both base vibrations and tracking -The results of simultaneous control is shown in Figure [14](#orged11c63) where the bandwidth of the isolation control is expanded to very low frequency. +The results of simultaneous control is shown in Figure [14](#org64f7223) where the bandwidth of the isolation control is expanded to very low frequency. - + {{< figure src="/ox-hugo/li01_simultaneous_control_results.png" caption="Figure 14: Simultaneous control: open-loop (solid) vs. closed-loop (dashed)" >}} @@ -230,4 +216,4 @@ Proposed future research areas include: - **Geophones** to provide payload and base velocity information # Bibliography -Li, X., *Simultaneous, fault-tolerant vibration isolation and pointing control of flexure jointed hexapods* (Doctoral dissertation) (2001). University of Wyoming, . [↩](#f885df380638b868e509fbbf75912d1e) +Li, X., *Simultaneous, fault-tolerant vibration isolation and pointing control of flexure jointed hexapods* (2001). University of Wyoming. [↩](#f885df380638b868e509fbbf75912d1e) diff --git a/content/article/li01_simul_vibrat_isolat_point_contr.md b/content/article/li01_simul_vibrat_isolat_point_contr.md new file mode 100644 index 0000000..22383f8 --- /dev/null +++ b/content/article/li01_simul_vibrat_isolat_point_contr.md @@ -0,0 +1,23 @@ ++++ +title = "Simultaneous vibration isolation and pointing control of flexure jointed hexapods" +author = ["Thomas Dehaeze"] +draft = false ++++ + +Tags +: [Stewart Platforms]({{< relref "stewart_platforms" >}}), [Vibration Isolation]({{< relref "vibration_isolation" >}}) + +Reference +: (Xiaochun Li {\it et al.}, 2001) + +Author(s) +: Li, X., Hamann, J. C., & McInroy, J. E. + +Year +: 2001 + +- if the hexapod is designed such that the payload mass/inertia matrix (\\(M\_x\\)) and \\(J^T J\\) are diagonal, the dynamics from \\(u\\) to \\(y\\) are decoupled. + +# Bibliography +Li, X., Hamann, J. C., & McInroy, J. E., *Simultaneous vibration isolation and pointing control of flexure jointed hexapods*, In , Smart Structures and Materials 2001: Smart Structures and Integrated Systems (pp. ) (2001). : . [↩](#e3df2691f750617c3995644d056d553a) diff --git a/content/article/lin06_distur_atten_precis_hexap_point.md b/content/article/lin06_distur_atten_precis_hexap_point.md new file mode 100644 index 0000000..bbad560 --- /dev/null +++ b/content/article/lin06_distur_atten_precis_hexap_point.md @@ -0,0 +1,21 @@ ++++ +title = "Disturbance attenuation in precise hexapod pointing using positive force feedback" +author = ["Thomas Dehaeze"] +draft = false ++++ + +Tags +: + + +Reference +: (Haomin Lin \& John McInroy, 2006) + +Author(s) +: Lin, H., & McInroy, J. E. + +Year +: 2006 + +# Bibliography +Lin, H., & McInroy, J. E., *Disturbance attenuation in precise hexapod pointing using positive force feedback*, Control Engineering Practice, *14(11)*, 1377–1386 (2006). http://dx.doi.org/10.1016/j.conengprac.2005.10.002 [↩](#3ab8ef7353729de315618a708ece8379) diff --git a/content/article/mcinroy00_desig_contr_flexur_joint_hexap.md b/content/article/mcinroy00_desig_contr_flexur_joint_hexap.md new file mode 100644 index 0000000..351b313 --- /dev/null +++ b/content/article/mcinroy00_desig_contr_flexur_joint_hexap.md @@ -0,0 +1,21 @@ ++++ +title = "Design and control of flexure jointed hexapods" +author = ["Thomas Dehaeze"] +draft = false ++++ + +Tags +: + + +Reference +: (McInroy \& Hamann, 2000) + +Author(s) +: McInroy, J., & Hamann, J. + +Year +: 2000 + +# Bibliography +McInroy, J., & Hamann, J., *Design and control of flexure jointed hexapods*, IEEE Transactions on Robotics and Automation, *16(4)*, 372–381 (2000). http://dx.doi.org/10.1109/70.864229 [↩](#f6d310236552ee92579cf0673a2ca695) diff --git a/content/article/mcinroy02_model_desig_flexur_joint_stewar.md b/content/article/mcinroy02_model_desig_flexur_joint_stewar.md new file mode 100644 index 0000000..fcba146 --- /dev/null +++ b/content/article/mcinroy02_model_desig_flexur_joint_stewar.md @@ -0,0 +1,228 @@ ++++ +title = "Modeling and design of flexure jointed stewart platforms for control purposes" +author = ["Thomas Dehaeze"] +draft = false ++++ + +Tags +: + + +Reference +: (McInroy, 2002) + +Author(s) +: McInroy, J. + +Year +: 2002 + +This short paper is very similar to (McInroy, 1999). + +> This paper develops guidelines for designing the flexure joints to facilitate closed-loop control. + + +## Introduction {#introduction} + +> When pursuing micro-meter/micro-radian scale motion, two new phenomena become important: +> +> 1. joint friction and backlash can cause extremely nonlinear micro-dynamics +> 2. base and/or payload vibrations become significant contributor to the motion + + + +> If the spherical flexure is not properly matched to the particular application, it is shown that the complexity of the dynamics can greatly increase, thus limiting the control performance. + + +## Flexure Jointed Hexapod Dynamics {#flexure-jointed-hexapod-dynamics} + + + +{{< figure src="/ox-hugo/mcinroy02_leg_model.png" caption="Figure 1: The dynamics of the ith strut. A parallel spring, damper, and actautor drives the moving mass of the strut and a payload" >}} + +The strut can be modeled as consisting of a parallel arrangement of an actuator force, a spring and some damping driving a mass (Figure [1](#org1e5260a)). + +Thus, **the strut does not output force directly, but rather outputs a mechanically filtered force**. + +The model of the strut are shown in Figure [1](#org1e5260a) with: + +- \\(m\_{s\_i}\\) moving strut mass +- \\(k\_i\\) spring constant +- \\(b\_i\\) damping constant +- \\(f\_{m\_i}\\) force applied by the actuator +- \\(f\_{p\_i}\\) force exerted by the payload +- \\(p\_i\\) three dimensional position of the top +- \\(q\_i\\) three dimensional position of the bottom +- \\(l\_i\\) strut length +- \\(l\_{r\_i}\\) relaxed strut length + +In general, **the strut mass and spherical flexure stiffness will cause payload forces that are not perfectly aligned with the strut**. + +Applying Newton's second law and stacking the equations into a vector form gives: + +\begin{equation} + f\_p = f\_m - M\_s \ddot{l} - B \dot{l} - K(l - l\_r) - M\_s \ddot{q}\_u - M\_s g\_u + M\_s v\_2 \label{eq:strut\_dynamics\_vec} +\end{equation} + +where: + +- \\(\ddot{q}\_u = \left[ \hat{u}\_1^T \ddot{q}\_1 \ \dots \ \hat{u}\_6^T \ddot{q}\_6 \right]^T\\) notes the vector of base accelerations in the strut directions +- \\(g\_u\\) denotes the vector of gravity accelerations in the strut directions +- \\(Ms = \text{diag}([m\_1\ \dots \ m\_6])\\), \\(f\_p = [f\_{p\_1}\ \dots \ f\_{p\_6}]^T\\) +- \\(v\_2 = [ \dot{\hat{u}}\_1^T \dot{v}\_1 \ \dots \ \dot{\hat{u}}\_6^T \dot{v}\_6 ]^T\\) contains nonlinear Coriolis and centripetal accelerations + + +### Payload Dynamics {#payload-dynamics} + +The payload is modeled as a rigid body: + +\begin{equation} +\underbrace{\begin{bmatrix} +m I\_3 & 0\_{3\times 3} \\\\\\ +0\_{3\times 3} & {}^cI +\end{bmatrix}}\_{M\_x} \ddot{\mathcal{X}} + \underbrace{\begin{bmatrix} + 0\_{3 \times 1} \\ \omega \times {}^cI\omega +\end{bmatrix}}\_{c(\omega)} = \mathcal{F} \label{eq:payload\_dynamics} +\end{equation} + +where: + +- \\(\ddot{\mathcal{X}}\\) is the \\(6 \times 1\\) generalized acceleration of the payload's center of mass +- \\(\omega\\) is the \\(3 \times 1\\) payload's angular velocity vector +- \\(\mathcal{F}\\) is the \\(6 \times 1\\) generalized force exerted on the payload +- \\(M\_x\\) is the combined mass/inertia matrix of the payload, written in the payload frame {P} +- \\(c(\omega)\\) represents the shown vector of Coriolis and centripetal terms + +Note \\(\dot{\mathcal{X}} = [\dot{p}^T\ \omega^T]^T\\) denotes the time derivative of the payload's combined position and orientation (or pose) with respect to a universal frame of reference {U}. + +First, consider the **generalized force due to struts**. +Denoting this force as \\(\mathcal{F}\_s\\), it can be calculated form the strut forces as: + +\begin{equation} + \mathcal{F}\_s = {}^UJ^T f\_p = {}^U\_BR J^T f\_p +\end{equation} + +where \\(J\\) is the manipulator Jacobian and \\({}^U\_BR\\) is the rotation matrix from {B} to {U}. + +The total generalized force acting on the payload is the sum of the strut, exogenous, and gravity forces: + +\begin{equation} + \mathcal{F} = {}^UJ^T f\_p + \mathcal{F}\_e - \begin{bmatrix} mg \\ 0\_{3\times 1} \end{bmatrix} \label{eq:generalized\_force} +\end{equation} + +where: + +- \\(\mathcal{F}\_e\\) represents a vector of exogenous generalized forces applied at the center of mass +- \\(g\\) is the gravity vector + +By combining \eqref{eq:strut_dynamics_vec}, \eqref{eq:payload_dynamics} and \eqref{eq:generalized_force}, a single equation describing the dynamics of a flexure jointed hexapod can be found: + +\begin{aligned} + & {}^UJ^T [ f\_m - M\_s \ddot{l} - B \dot{l} - K(l - l\_r) - M\_s \ddot{q}\_u\\\\\\ + & - M\_s g\_u + M\_s v\_2] + \mathcal{F}\_e - \begin{bmatrix} mg \\ 0\_{3\times 1} \end{bmatrix} = M\_x \ddot{\mathcal{X}} + c(\omega) +\end{aligned} + +Joint (\\(l\\)) and Cartesian (\\(\mathcal{X}\\)) terms are still mixed. +In the next section, a connection between the two will be found to complete the formulation + + +## Direction of Payload Force {#direction-of-payload-force} + +Many prior hexapod dynamic formulations assume that the strut exerts force only along its direction of motion. + +The flexure joints Hexapods transmit forces (or torques) proportional to the deflection of the joints. +This section establishes design guidelines for the spherical flexure joint to guarantee that the dynamics remain tractable for control. + + + +{{< figure src="/ox-hugo/mcinroy02_model_strut_joint.png" caption="Figure 2: A simplified dynamic model of a strut and its joint" >}} + +Figure [2](#orgbd4aaf0) depicts a strut, along with the corresponding force diagram. +The force diagram is obtained using standard finite element assumptions (\\(\sin \theta \approx \theta\\)). +Damping terms are neglected. +\\(k\_r\\) denotes the rotational stiffness of the spherical joint. + +From Figure [2](#orgbd4aaf0) (b), Newton's second law yields: + +\begin{equation} + f\_p = \begin{bmatrix} + -f\_m + m\_s \Delta \ddot{x} + k\Delta x \\\\\\ + m\_s \Delta \ddot{y} + \frac{k\_r}{l^2} \Delta y \\\\\\ + m\_s \Delta \ddot{z} + \frac{k\_r}{l^2} \Delta z +\end{bmatrix} +\end{equation} + +Note that the payload force is **not** in general aligned with the strut. +The force is aligned perfectly with the strut only if \\(m\_s = 0\\) and \\(k\_r = 0\\) (i.e. the struts have negligible mass and the spherical joints have negligible rotational stiffness). + +To examine the passive behavior, let \\(f\_m = 0\\) and consider a sinusoidal motion: + +\begin{equation} + \begin{bmatrix} \Delta x \\ \Delta y \\ \Delta z \end{bmatrix} = + \begin{bmatrix} A\_x \cos \omega t \\ A\_y \cos \omega t \\ A\_z \cos \omega t \end{bmatrix} +\end{equation} + +This yields: + +\begin{equation} + f\_p = \begin{bmatrix} + \Big( -m\_s \omega^2 + k \Big) A\_x \cos \omega t \\\\\\ + \Big( -m\_s \omega^2 + \frac{k\_r}{l^2} \Big) A\_y \cos \omega t \\\\\\ + \Big( -m\_s \omega^2 + \frac{k\_r}{l^2} \Big) A\_z \cos \omega t + \end{bmatrix} +\end{equation} + +The direction of \\(f\_p\\) depends upon to motion specifications, leg inertia and control algorithm. + +The hypothesis that it is mostly along the strut direction can be tested by dividing the magnitude of the \\(x\\) component by the magnitude of the combined \\(y\\) and \\(z\\) components: + +\begin{equation} + x\_\text{gain} = \frac{|-m\_s \omega^2 + k|}{|-m\_s \omega^2 + \frac{k\_r}{l^2}|} \frac{|A\_x|}{\sqrt{A\_y^2 + A\_z^2}} +\end{equation} + +Note that large \\(x\_\text{gain}\\) indicates \\(x\\) direction dominance. + +\\(x\_\text{gain}\\) is divided into two parts. +The first part depends on the mechanical terms and the frequency of the movement: + +\begin{equation} + x\_{\text{gain}\_\omega} = \frac{|-m\_s \omega^2 + k|}{|-m\_s \omega^2 + \frac{k\_r}{l^2}|} +\end{equation} + +> In order to get dominance at low frequencies, the hexapod must be designed so that: +> +> \begin{equation} +> \frac{k\_r}{l^2} \ll k \label{eq:cond\_stiff} +> \end{equation} + +This puts a limit on the rotational stiffness of the flexure joint and shows that as the strut is made softer (by decreasing \\(k\\)), the spherical flexure joint must be made proportionately softer. + +By satisfying \eqref{eq:cond_stiff}, \\(f\_p\\) can be aligned with the strut for frequencies much below the spherical joint's resonance mode: +\\[ \omega \ll \sqrt{\frac{k\_r}{m\_s l^2}} \rightarrow x\_{\text{gain}\_\omega} \approx \frac{k}{k\_r/l^2} \gg 1 \\] +At frequencies much above the strut's resonance mode, \\(f\_p\\) is not dominated by its \\(x\\) component: +\\[ \omega \gg \sqrt{\frac{k}{m\_s}} \rightarrow x\_{\text{gain}\_\omega} \approx 1 \\] + +> To ensure that the control system acts only in the band of frequencies where dominance is retained, the control bandwidth can be selected so that: +> +> \begin{equation} +> \text{control bandwidth} \ll \sqrt{\frac{k\_r}{m\_s l^2}} \label{eq:cond\_bandwidth} +> \end{equation} + +The control bandwidth can be increase for hexapods that are designed so that \\(x\_{\text{gain}\_\omega} \gg 1\\) for \\(\omega \ll \sqrt{k/m\_s}\\). +This can be achieve, for instance, by adding damping. +In this case, it is reasonable to use: + +\begin{equation} + \text{control bandwidth} \ll \sqrt{\frac{k}{m\_s}} +\end{equation} + +> By designing the flexure jointed hexapod and its controller so that both \eqref{eq:cond_stiff} and \eqref{eq:cond_bandwidth} are met, the dynamics of the hexapod can be greatly reduced in complexity. + + +## Relationships between joint and cartesian space {#relationships-between-joint-and-cartesian-space} + +# Bibliography +McInroy, J., *Modeling and design of flexure jointed stewart platforms for control purposes*, IEEE/ASME Transactions on Mechatronics, *7(1)*, 95–99 (2002). http://dx.doi.org/10.1109/3516.990892 [↩](#8bfe2d2dce902a584fa016e86a899044) + +McInroy, J., *Dynamic modeling of flexure jointed hexapods for control purposes*, In , Proceedings of the 1999 IEEE International Conference on Control Applications (Cat. No.99CH36328) (pp. ) (1999). : . [↩](#5da427f78c552aa92cd64c2a6df961f1) diff --git a/content/article/oomen18_advan_motion_contr_precis_mechat.md b/content/article/oomen18_advan_motion_contr_precis_mechat.md new file mode 100644 index 0000000..c933d5d --- /dev/null +++ b/content/article/oomen18_advan_motion_contr_precis_mechat.md @@ -0,0 +1,24 @@ ++++ +title = "Advanced motion control for precision mechatronics: control, identification, and learning of complex systems" +author = ["Thomas Dehaeze"] +draft = false ++++ + +Tags +: [Motion Control]({{< relref "motion_control" >}}) + +Reference +: (Tom Oomen, 2018) + +Author(s) +: Oomen, T. + +Year +: 2018 + + + +{{< figure src="/ox-hugo/oomen18_next_gen_loop_gain.png" caption="Figure 1: Envisaged developments in motion systems. In traditional motion systems, the control bandwidth takes place in the rigid-body region. In the next generation systemes, flexible dynamics are foreseen to occur within the control bandwidth." >}} + +# Bibliography +Oomen, T., *Advanced motion control for precision mechatronics: control, identification, and learning of complex systems*, IEEJ Journal of Industry Applications, *7(2)*, 127–140 (2018). http://dx.doi.org/10.1541/ieejjia.7.127 [↩](#73fd325bd20a6ef8972145e535f38198) diff --git a/content/article/poel10_explor_activ_hard_mount_vibrat.md b/content/article/poel10_explor_activ_hard_mount_vibrat.md new file mode 100644 index 0000000..bbefa3b --- /dev/null +++ b/content/article/poel10_explor_activ_hard_mount_vibrat.md @@ -0,0 +1,20 @@ ++++ +title = "An exploration of active hard mount vibration isolation for precision equipment" +author = ["Thomas Dehaeze"] +draft = false ++++ + +Tags +: [Vibration Isolation]({{< relref "vibration_isolation" >}}) + +Reference +: (van der Poel, 2010) + +Author(s) +: van der Poel, G. W. + +Year +: 2010 + +# Bibliography +van der Poel, G. W., *An exploration of active hard mount vibration isolation for precision equipment* (2010). University of Twente. [↩](#bcab548922e0e1ad6a2c310f63879596) diff --git a/content/paper/preumont02_force_feedb_versus_accel_feedb.md b/content/article/preumont02_force_feedb_versus_accel_feedb.md similarity index 70% rename from content/paper/preumont02_force_feedb_versus_accel_feedb.md rename to content/article/preumont02_force_feedb_versus_accel_feedb.md index 6427946..73ca5bd 100644 --- a/content/paper/preumont02_force_feedb_versus_accel_feedb.md +++ b/content/article/preumont02_force_feedb_versus_accel_feedb.md @@ -8,7 +8,7 @@ Tags : [Vibration Isolation]({{< relref "vibration_isolation" >}}) Reference -: (Preumont {\it et al.}, 2002) +: (Preumont {\it et al.}, 2002) Author(s) : Preumont, A., A. Francois, Bossens, F., & Abu-Hanieh, A. @@ -26,14 +26,14 @@ The force applied to a **rigid body** is proportional to its acceleration, thus Thus force feedback and acceleration feedback are equivalent for solid bodies. When there is a flexible payload, the two sensing options are not longer equivalent. -- For light payload (Figure [1](#org7b4f6ee)), the acceleration feedback gives larger damping on the higher mode. -- For heavy payload (Figure [2](#org361b58f)), the acceleration feedback do not give alternating poles and zeros and thus for high control gains, the system becomes unstable +- For light payload (Figure [1](#org307b349)), the acceleration feedback gives larger damping on the higher mode. +- For heavy payload (Figure [2](#orgc0c4ad3)), the acceleration feedback do not give alternating poles and zeros and thus for high control gains, the system becomes unstable - + {{< figure src="/ox-hugo/preumont02_force_acc_fb_light.png" caption="Figure 1: Root locus for **light** flexible payload, (a) Force feedback, (b) acceleration feedback" >}} - + {{< figure src="/ox-hugo/preumont02_force_acc_fb_heavy.png" caption="Figure 2: Root locus for **heavy** flexible payload, (a) Force feedback, (b) acceleration feedback" >}} @@ -46,4 +46,4 @@ The same is true for the transfer function from the force actuator to the relati > According to physical interpretation of the zeros, they represent the resonances of the subsystem constrained by the sensor and the actuator. # Bibliography -Preumont, A., A. Fran\ccois, Bossens, F., & Abu-Hanieh, A., *Force feedback versus acceleration feedback in active vibration isolation*, Journal of Sound and Vibration, *257(4)*, 605–613 (2002). http://dx.doi.org/10.1006/jsvi.2002.5047 [↩](#525e1e237b885f81fae3c25a3036ba6f) +Preumont, A., A. Fran\ccois, Bossens, F., & Abu-Hanieh, A., *Force feedback versus acceleration feedback in active vibration isolation*, Journal of Sound and Vibration, *257(4)*, 605–613 (2002). http://dx.doi.org/10.1006/jsvi.2002.5047 [↩](#525e1e237b885f81fae3c25a3036ba6f) diff --git a/content/paper/preumont07_six_axis_singl_stage_activ.md b/content/article/preumont07_six_axis_singl_stage_activ.md similarity index 62% rename from content/paper/preumont07_six_axis_singl_stage_activ.md rename to content/article/preumont07_six_axis_singl_stage_activ.md index d0894e4..2562294 100644 --- a/content/paper/preumont07_six_axis_singl_stage_activ.md +++ b/content/article/preumont07_six_axis_singl_stage_activ.md @@ -8,7 +8,7 @@ Tags : [Vibration Isolation]({{< relref "vibration_isolation" >}}), [Stewart Platforms]({{< relref "stewart_platforms" >}}), [Flexible Joints]({{< relref "flexible_joints" >}}) Reference -: (Preumont {\it et al.}, 2007) +: (Preumont {\it et al.}, 2007) Author(s) : Preumont, A., Horodinca, M., Romanescu, I., Marneffe, B. d., Avraam, M., Deraemaeker, A., Bossens, F., … @@ -18,32 +18,32 @@ Year Summary: -- **Cubic** Stewart platform (Figure [3](#org32a4f7c)) +- **Cubic** Stewart platform (Figure [3](#org2d41889)) - Provides uniform control capability - Uniform stiffness in all directions - minimizes the cross-coupling among actuators and sensors of different legs -- Flexible joints (Figure [2](#orgf807976)) +- Flexible joints (Figure [2](#orgf58a4b4)) - Piezoelectric force sensors - Voice coil actuators - Decentralized feedback control approach for vibration isolation -- Effect of parasitic stiffness of the flexible joints on the IFF performance (Figure [1](#org744bdc9)) +- Effect of parasitic stiffness of the flexible joints on the IFF performance (Figure [1](#org6835865)) - The Stewart platform has 6 suspension modes at different frequencies. Thus the gain of the IFF controller cannot be optimal for all the modes. It is better if all the modes of the platform are near to each other. - Discusses the design of the legs in order to maximize the natural frequency of the local modes. - To estimate the isolation performance of the Stewart platform, a scalar indicator is defined as the Frobenius norm of the transmissibility matrix - + {{< figure src="/ox-hugo/preumont07_iff_effect_stiffness.png" caption="Figure 1: Root locus with IFF with no parasitic stiffness and with parasitic stiffness" >}} - + {{< figure src="/ox-hugo/preumont07_flexible_joints.png" caption="Figure 2: Flexible joints used for the Stewart platform" >}} - + {{< figure src="/ox-hugo/preumont07_stewart_platform.png" caption="Figure 3: Stewart platform" >}} # Bibliography -Preumont, A., Horodinca, M., Romanescu, I., Marneffe, B. d., Avraam, M., Deraemaeker, A., Bossens, F., …, *A six-axis single-stage active vibration isolator based on stewart platform*, Journal of Sound and Vibration, *300(3-5)*, 644–661 (2007). http://dx.doi.org/10.1016/j.jsv.2006.07.050 [↩](#8096d5b2df73551d836ef96b7ca7efa4) +Preumont, A., Horodinca, M., Romanescu, I., Marneffe, B. d., Avraam, M., Deraemaeker, A., Bossens, F., …, *A six-axis single-stage active vibration isolator based on stewart platform*, Journal of Sound and Vibration, *300(3-5)*, 644–661 (2007). http://dx.doi.org/10.1016/j.jsv.2006.07.050 [↩](#8096d5b2df73551d836ef96b7ca7efa4) diff --git a/content/paper/saxena12_advan_inter_model_contr_techn.md b/content/article/saxena12_advan_inter_model_contr_techn.md similarity index 84% rename from content/paper/saxena12_advan_inter_model_contr_techn.md rename to content/article/saxena12_advan_inter_model_contr_techn.md index c7e45ac..7aac079 100644 --- a/content/paper/saxena12_advan_inter_model_contr_techn.md +++ b/content/article/saxena12_advan_inter_model_contr_techn.md @@ -5,10 +5,10 @@ draft = false +++ Tags -: [Complementary Filters]({{< relref "complementary_filters" >}}) +: [Complementary Filters]({{< relref "complementary_filters" >}}), [Virtual Sensor Fusion]({{< relref "virtual_sensor_fusion" >}}) Reference -: (Sahaj Saxena \& YogeshV Hote, 2012) +: (Sahaj Saxena \& YogeshV Hote, 2012) Author(s) : Saxena, S., & Hote, Y. @@ -85,4 +85,4 @@ Issues: The interesting feature regarding IMC is that the design scheme is identical to the open-loop control design procedure and the implementation of IMC results in a feedback system, thereby copying the disturbances and parameter uncertainties, while open-loop control is not. # Bibliography -Saxena, S., & Hote, Y., *Advances in internal model control technique: a review and future prospects*, IETE Technical Review, *29(6)*, 461 (2012). http://dx.doi.org/10.4103/0256-4602.105001 [↩](#14f767d8ba71d58fa8a3ec876628d750) +Saxena, S., & Hote, Y., *Advances in internal model control technique: a review and future prospects*, IETE Technical Review, *29(6)*, 461 (2012). http://dx.doi.org/10.4103/0256-4602.105001 [↩](#14f767d8ba71d58fa8a3ec876628d750) diff --git a/content/article/sayed01_survey_spect_factor_method.md b/content/article/sayed01_survey_spect_factor_method.md new file mode 100644 index 0000000..56e670c --- /dev/null +++ b/content/article/sayed01_survey_spect_factor_method.md @@ -0,0 +1,21 @@ ++++ +title = "A survey of spectral factorization methods" +author = ["Thomas Dehaeze"] +draft = false ++++ + +Tags +: + + +Reference +: (Sayed \& Kailath, 2001) + +Author(s) +: Sayed, A. H., & Kailath, T. + +Year +: 2001 + +# Bibliography +Sayed, A. H., & Kailath, T., *A survey of spectral factorization methods*, Numerical Linear Algebra with Applications, *8(6-7)*, 467–496 (2001). http://dx.doi.org/10.1002/nla.250 [↩](#e71cc5e3ec879813f2344a6dce1ac11f) diff --git a/content/article/schellekens98_desig_precis.md b/content/article/schellekens98_desig_precis.md new file mode 100644 index 0000000..2edd715 --- /dev/null +++ b/content/article/schellekens98_desig_precis.md @@ -0,0 +1,20 @@ ++++ +title = "Design for precision: current status and trends" +author = ["Thomas Dehaeze"] +draft = false ++++ + +Tags +: [Precision Engineering]({{< relref "precision_engineering" >}}) + +Reference +: (Schellekens {\it et al.}, 1998) + +Author(s) +: Schellekens, P., Rosielle, N., Vermeulen, H., Vermeulen, M., Wetzels, S., & Pril, W. + +Year +: 1998 + +# Bibliography +Schellekens, P., Rosielle, N., Vermeulen, H., Vermeulen, M., Wetzels, S., & Pril, W., *Design for precision: current status and trends*, Cirp Annals, *(2)*, 557–586 (1998). http://dx.doi.org/10.1016/s0007-8506(07)63243-0 [↩](#89f7d8f4c31f79f83e3666017687f525) diff --git a/content/article/schroeck01_compen_desig_linear_time_invar.md b/content/article/schroeck01_compen_desig_linear_time_invar.md new file mode 100644 index 0000000..4cbea9f --- /dev/null +++ b/content/article/schroeck01_compen_desig_linear_time_invar.md @@ -0,0 +1,21 @@ ++++ +title = "On compensator design for linear time-invariant dual-input single-output systems" +author = ["Thomas Dehaeze"] +draft = false ++++ + +Tags +: + + +Reference +: (Schroeck {\it et al.}, 2001) + +Author(s) +: Schroeck, S., Messner, W., & McNab, R. + +Year +: 2001 + +# Bibliography +Schroeck, S., Messner, W., & McNab, R., *On compensator design for linear time-invariant dual-input single-output systems*, IEEE/ASME Transactions on Mechatronics, *6(1)*, 50–57 (2001). http://dx.doi.org/10.1109/3516.914391 [↩](#ee9f1b2ad5707e86bf7c26e8c325b324) diff --git a/content/article/sebastian12_nanop_with_multip_sensor.md b/content/article/sebastian12_nanop_with_multip_sensor.md new file mode 100644 index 0000000..ed03213 --- /dev/null +++ b/content/article/sebastian12_nanop_with_multip_sensor.md @@ -0,0 +1,20 @@ ++++ +title = "Nanopositioning with multiple sensors: a case study in data storage" +author = ["Thomas Dehaeze"] +draft = false ++++ + +Tags +: [Sensor Fusion]({{< relref "sensor_fusion" >}}) + +Reference +: (Abu Sebastian \& Angeliki Pantazi, 2012) + +Author(s) +: Sebastian, A., & Pantazi, A. + +Year +: 2012 + +# Bibliography +Sebastian, A., & Pantazi, A., *Nanopositioning with multiple sensors: a case study in data storage*, IEEE Transactions on Control Systems Technology, *20(2)*, 382–394 (2012). http://dx.doi.org/10.1109/tcst.2011.2177982 [↩](#eb5a15a8c900d93de0b9bab520e1b6da) diff --git a/content/article/souleille18_concep_activ_mount_space_applic.md b/content/article/souleille18_concep_activ_mount_space_applic.md new file mode 100644 index 0000000..7eccd5d --- /dev/null +++ b/content/article/souleille18_concep_activ_mount_space_applic.md @@ -0,0 +1,96 @@ ++++ +title = "A concept of active mount for space applications" +author = ["Thomas Dehaeze"] +draft = false ++++ + +Tags +: [Active Damping]({{< relref "active_damping" >}}) + +Reference +: (Souleille {\it et al.}, 2018) + +Author(s) +: Souleille, A., Lampert, T., Lafarga, V., Hellegouarch, S., Rondineau, A., Rodrigues, Gonccalo, & Collette, C. + +Year +: 2018 + +This article discusses the use of Integral Force Feedback with amplified piezoelectric stack actuators. + +> In the proposed configuration, it can also be noticed by the softening effect inherent to force control is limited by the metallic suspension. + + +## Single degree-of-freedom isolator {#single-degree-of-freedom-isolator} + +Figure [1](#orgec40a2d) shows a picture of the amplified piezoelectric stack. +The piezoelectric actuator is divided into two parts: one is used as an actuator, and the other one is used as a force sensor. + + + +{{< figure src="/ox-hugo/souleille18_model_piezo.png" caption="Figure 1: Picture of an APA100M from Cedrat Technologies. Simplified model of a one DoF payload mounted on such isolator" >}} + +
+ Table 1: + Parameters used for the model of the APA 100M +
+ +| | Value | Meaning | +|------------|-----------------------|----------------------------------------------------------------| +| \\(m\\) | \\(1\,[kg]\\) | Payload mass | +| \\(k\_e\\) | \\(4.8\,[N/\mu m]\\) | Stiffness used to adjust the pole of the isolator | +| \\(k\_1\\) | \\(0.96\,[N/\mu m]\\) | Stiffness of the metallic suspension when the stack is removed | +| \\(k\_a\\) | \\(65\,[N/\mu m]\\) | Stiffness of the actuator | +| \\(c\_1\\) | \\(10\,[N/(m/s)]\\) | Added viscous damping | + +The dynamic equation of the system is: + +\begin{equation} + m \ddot{x}\_1 = \left( k\_1 + \frac{k\_ek\_a}{k\_e + k\_a} \right) ( w - x\_1) + c\_1 (\dot{w} - \dot{x}\_1) + F + \left( \frac{k\_e}{k\_e + k\_a} \right)f +\end{equation} + +The expression of the force measured by the force sensor is: + +\begin{equation} + F\_s = \left( -\frac{k\_e k\_a}{k\_e + k\_a} \right) x\_1 + \left( \frac{k\_e k\_a}{k\_e + k\_a} \right) w + \left( \frac{k\_e}{k\_e + k\_a} \right) f +\end{equation} + +and the control force is given by: + +\begin{equation} + f = F\_s G(s) = F\_s \frac{g}{s} +\end{equation} + +The effect of the controller are shown in Figure [2](#org656442f): + +- the resonance peak is almost critically damped +- the passive isolation \\(\frac{x\_1}{w}\\) is not degraded at high frequencies +- the degradation of the compliance \\(\frac{x\_1}{F}\\) induced by feedback is limited at \\(\frac{1}{k\_1}\\) +- the fraction of the force transmitted to the payload that is measured by the force sensor is reduced at low frequencies + + + +{{< figure src="/ox-hugo/souleille18_tf_iff_result.png" caption="Figure 2: Matrix of transfer functions from input (w, f, F) to output (Fs, x1) in open loop (blue curves) and closed loop (dashed red curves)" >}} + + + +{{< figure src="/ox-hugo/souleille18_root_locus.png" caption="Figure 3: Single DoF system. Comparison between the theoretical (solid curve) and the experimental (crosses) root-locus" >}} + + +## Flexible payload mounted on three isolators {#flexible-payload-mounted-on-three-isolators} + +A heavy payload is mounted on a set of three isolators (Figure [4](#org59a9fbf)). +The payload consists of two masses, connected through flexible blades such that the flexible resonance of the payload in the vertical direction is around 65Hz. + + + +{{< figure src="/ox-hugo/souleille18_setup_flexible_payload.png" caption="Figure 4: Right: picture of the experimental setup. It consists of a flexible payload mounted on a set of three isolators. Left: simplified sketch of the setup, showing only the vertical direction" >}} + +As shown in Figure [5](#orgb30c1f0), both the suspension modes and the flexible modes of the payload can be critically damped. + + + +{{< figure src="/ox-hugo/souleille18_result_damping_transmissibility.png" caption="Figure 5: Transmissibility between the table top \\(w\\) and \\(m\_1\\)" >}} + +# Bibliography +Souleille, A., Lampert, T., Lafarga, V., Hellegouarch, S., Rondineau, A., Rodrigues, Gon\ccalo, & Collette, C., *A concept of active mount for space applications*, CEAS Space Journal, *10(2)*, 157–165 (2018). [↩](#d5c1263eebe6caa1e91b078b620d72f1) diff --git a/content/paper/spanos95_soft_activ_vibrat_isolat.md b/content/article/spanos95_soft_activ_vibrat_isolat.md similarity index 72% rename from content/paper/spanos95_soft_activ_vibrat_isolat.md rename to content/article/spanos95_soft_activ_vibrat_isolat.md index 9f531f9..603772e 100644 --- a/content/paper/spanos95_soft_activ_vibrat_isolat.md +++ b/content/article/spanos95_soft_activ_vibrat_isolat.md @@ -8,7 +8,7 @@ Tags : [Stewart Platforms]({{< relref "stewart_platforms" >}}), [Vibration Isolation]({{< relref "vibration_isolation" >}}) Reference -: (Spanos {\it et al.}, 1995) +: (Spanos {\it et al.}, 1995) Author(s) : Spanos, J., Rahman, Z., & Blackwood, G. @@ -16,14 +16,14 @@ Author(s) Year : 1995 -**Stewart Platform** (Figure [1](#org4317d08)): +**Stewart Platform** (Figure [1](#org2d8aec6)): - Voice Coil - Flexible joints (cross-blades) - Force Sensors - Cubic Configuration - + {{< figure src="/ox-hugo/spanos95_stewart_platform.png" caption="Figure 1: Stewart Platform" >}} @@ -41,7 +41,7 @@ After redesign of the struts: - low frequency zero at 2.6Hz but non-minimum phase (not explained). Small viscous damping material in the cross blade flexures made the zero minimum phase again. - + {{< figure src="/ox-hugo/spanos95_iff_plant.png" caption="Figure 2: Experimentally measured transfer function from voice coil drive voltage to collocated load cell output voltage" >}} @@ -52,11 +52,11 @@ The controller used consisted of: - first order lag filter to provide adequate phase margin at the low frequency crossover - a first order high pass filter to attenuate the excess gain resulting from the low frequency zero -The results in terms of transmissibility are shown in Figure [3](#orgf128817). +The results in terms of transmissibility are shown in Figure [3](#orgc669f80). - + {{< figure src="/ox-hugo/spanos95_results.png" caption="Figure 3: Experimentally measured Frobenius norm of the 6-axis transmissibility" >}} # Bibliography -Spanos, J., Rahman, Z., & Blackwood, G., *A soft 6-axis active vibration isolator*, In , Proceedings of 1995 American Control Conference - ACC'95 (pp. ) (1995). : . [↩](#a48f6708d087625a42ca2375407a2bc4) +Spanos, J., Rahman, Z., & Blackwood, G., *A soft 6-axis active vibration isolator*, In , Proceedings of 1995 American Control Conference - ACC'95 (pp. ) (1995). : . [↩](#a48f6708d087625a42ca2375407a2bc4) diff --git a/content/paper/stankevic17_inter_charac_rotat_stages_x_ray_nanot.md b/content/article/stankevic17_inter_charac_rotat_stages_x_ray_nanot.md similarity index 52% rename from content/paper/stankevic17_inter_charac_rotat_stages_x_ray_nanot.md rename to content/article/stankevic17_inter_charac_rotat_stages_x_ray_nanot.md index e419720..370f002 100644 --- a/content/paper/stankevic17_inter_charac_rotat_stages_x_ray_nanot.md +++ b/content/article/stankevic17_inter_charac_rotat_stages_x_ray_nanot.md @@ -8,7 +8,7 @@ Tags : [Nano Active Stabilization System]({{< relref "nano_active_stabilization_system" >}}), [Positioning Stations]({{< relref "positioning_stations" >}}) Reference -: (Tomas Stankevic {\it et al.}, 2017) +: (Tomas Stankevic {\it et al.}, 2017) Author(s) : Stankevic, T., Engblom, C., Langlois, F., Alves, F., Lestrade, A., Jobert, N., Cauchon, G., … @@ -19,7 +19,7 @@ Year - Similar Station than the NASS - Similar Metrology with fiber based interferometers and cylindrical reference mirror - + {{< figure src="/ox-hugo/stankevic17_station.png" caption="Figure 1: Positioning Station" >}} @@ -30,4 +30,4 @@ Year - Result: 40nm runout error # Bibliography -Stankevic, T., Engblom, C., Langlois, F., Alves, F., Lestrade, A., Jobert, N., Cauchon, G., …, *Interferometric characterization of rotation stages for x-ray nanotomography*, Review of Scientific Instruments, *88(5)*, 053703 (2017). http://dx.doi.org/10.1063/1.4983405 [↩](#abb1be5f48179255f7d8c45b1784bcf8) +Stankevic, T., Engblom, C., Langlois, F., Alves, F., Lestrade, A., Jobert, N., Cauchon, G., …, *Interferometric characterization of rotation stages for x-ray nanotomography*, Review of Scientific Instruments, *88(5)*, 053703 (2017). http://dx.doi.org/10.1063/1.4983405 [↩](#abb1be5f48179255f7d8c45b1784bcf8) diff --git a/content/article/tang18_decen_vibrat_contr_voice_coil.md b/content/article/tang18_decen_vibrat_contr_voice_coil.md new file mode 100644 index 0000000..49567ef --- /dev/null +++ b/content/article/tang18_decen_vibrat_contr_voice_coil.md @@ -0,0 +1,21 @@ ++++ +title = "Decentralized vibration control of a voice coil motor-based stewart parallel mechanism: simulation and experiments" +author = ["Thomas Dehaeze"] +draft = false ++++ + +Tags +: [Stewart Platforms]({{< relref "stewart_platforms" >}}) + +Reference +: (Jie Tang {\it et al.}, 2018) + +Author(s) +: Tang, J., Cao, D., & Yu, T. + +Year +: 2018 + +# Bibliography +Tang, J., Cao, D., & Yu, T., *Decentralized vibration control of a voice coil motor-based stewart parallel mechanism: simulation and experiments*, Proceedings of the Institution of Mechanical Engineers, Part C: Journal of Mechanical Engineering Science, *233(1)*, 132–145 (2018). http://dx.doi.org/10.1177/0954406218756941 [↩](#85f81ff678aabc195636437548e4234a) diff --git a/content/paper/tjepkema12_sensor_fusion_activ_vibrat_isolat_precis_equip.md b/content/article/tjepkema12_sensor_fusion_activ_vibrat_isolat_precis_equip.md similarity index 63% rename from content/paper/tjepkema12_sensor_fusion_activ_vibrat_isolat_precis_equip.md rename to content/article/tjepkema12_sensor_fusion_activ_vibrat_isolat_precis_equip.md index 54ed4ad..40d41a4 100644 --- a/content/paper/tjepkema12_sensor_fusion_activ_vibrat_isolat_precis_equip.md +++ b/content/article/tjepkema12_sensor_fusion_activ_vibrat_isolat_precis_equip.md @@ -8,7 +8,7 @@ Tags : [Sensor Fusion]({{< relref "sensor_fusion" >}}), [Vibration Isolation]({{< relref "vibration_isolation" >}}) Reference -: (Tjepkema {\it et al.}, 2012) +: (Tjepkema {\it et al.}, 2012) Author(s) : Tjepkema, D., Dijk, J. v., & Soemers, H. @@ -47,4 +47,4 @@ Heavier sensor => lower noise but it is harder to maintain collocation with the There is a compromise between sensor noise and the influence of the sensor size on the system's design and on the control bandwidth. # Bibliography -Tjepkema, D., Dijk, J. v., & Soemers, H., *Sensor fusion for active vibration isolation in precision equipment*, Journal of Sound and Vibration, *331(4)*, 735–749 (2012). http://dx.doi.org/10.1016/j.jsv.2011.09.022 [↩](#ef30bc07c91e9d46a42198757dc610de) +Tjepkema, D., Dijk, J. v., & Soemers, H., *Sensor fusion for active vibration isolation in precision equipment*, Journal of Sound and Vibration, *331(4)*, 735–749 (2012). http://dx.doi.org/10.1016/j.jsv.2011.09.022 [↩](#ef30bc07c91e9d46a42198757dc610de) diff --git a/content/article/wang12_autom_marker_full_field_hard.md b/content/article/wang12_autom_marker_full_field_hard.md new file mode 100644 index 0000000..6de4ed4 --- /dev/null +++ b/content/article/wang12_autom_marker_full_field_hard.md @@ -0,0 +1,29 @@ ++++ +title = "Automated markerless full field hard x-ray microscopic tomography at sub-50 nm 3-dimension spatial resolution" +author = ["Thomas Dehaeze"] +draft = false ++++ + +Tags +: [Nano Active Stabilization System]({{< relref "nano_active_stabilization_system" >}}) + +Reference +: (Jun Wang {\it et al.}, 2012) + +Author(s) +: Wang, J., Chen, Y. K., Yuan, Q., Tkachuk, A., Erdonmez, C., Hornberger, B., & Feser, M. + +Year +: 2012 + +**Introduction of Markers**: +That limits the type of samples that is studied + +There is a need for markerless nano-tomography +=> the key requirement is the precision and stability of the positioning stages. + +**Passive rotational run-out error system**: +It uses calibrated metrology disc and capacitive sensors + +# Bibliography +Wang, J., Chen, Y. K., Yuan, Q., Tkachuk, A., Erdonmez, C., Hornberger, B., & Feser, M., *Automated markerless full field hard x-ray microscopic tomography at sub-50 nm 3-dimension spatial resolution*, Applied Physics Letters, *100(14)*, 143107 (2012). http://dx.doi.org/10.1063/1.3701579 [↩](#1bccbe15e35ed02229afbc6528c5057e) diff --git a/content/paper/wang16_inves_activ_vibrat_isolat_stewar.md b/content/article/wang16_inves_activ_vibrat_isolat_stewar.md similarity index 67% rename from content/paper/wang16_inves_activ_vibrat_isolat_stewar.md rename to content/article/wang16_inves_activ_vibrat_isolat_stewar.md index 6bbeb70..7a117c3 100644 --- a/content/paper/wang16_inves_activ_vibrat_isolat_stewar.md +++ b/content/article/wang16_inves_activ_vibrat_isolat_stewar.md @@ -8,7 +8,7 @@ Tags : [Stewart Platforms]({{< relref "stewart_platforms" >}}), [Vibration Isolation]({{< relref "vibration_isolation" >}}), [Flexible Joints]({{< relref "flexible_joints" >}}) Reference -: (Wang {\it et al.}, 2016) +: (Wang {\it et al.}, 2016) Author(s) : Wang, C., Xie, X., Chen, Y., & Zhang, Z. @@ -25,7 +25,7 @@ Year The model is compared with a Finite Element model and is shown to give the same results. The proposed model is thus effective. - + {{< figure src="/ox-hugo/wang16_stewart_platform.png" caption="Figure 1: Stewart Platform" >}} @@ -35,11 +35,11 @@ Combines: - the FxLMS-based adaptive inverse control => suppress transmission of periodic vibrations - direct feedback of integrated forces => dampen vibration of inherent modes and thus reduce random vibrations -Force Feedback (Figure [2](#org4b1fbd9)). +Force Feedback (Figure [2](#org55d173d)). - the force sensor is mounted **between the base and the strut** - + {{< figure src="/ox-hugo/wang16_force_feedback.png" caption="Figure 2: Feedback of integrated forces in the platform" >}} @@ -54,4 +54,4 @@ Sorts of HAC-LAC control: - Effectiveness of control methods are shown # Bibliography -Wang, C., Xie, X., Chen, Y., & Zhang, Z., *Investigation on active vibration isolation of a stewart platform with piezoelectric actuators*, Journal of Sound and Vibration, *383()*, 1–19 (2016). http://dx.doi.org/10.1016/j.jsv.2016.07.021 [↩](#db95fac7cd46c14e2b4f38e8ca4158fe) +Wang, C., Xie, X., Chen, Y., & Zhang, Z., *Investigation on active vibration isolation of a stewart platform with piezoelectric actuators*, Journal of Sound and Vibration, *383()*, 1–19 (2016). http://dx.doi.org/10.1016/j.jsv.2016.07.021 [↩](#db95fac7cd46c14e2b4f38e8ca4158fe) diff --git a/content/paper/yang19_dynam_model_decoup_contr_flexib.md b/content/article/yang19_dynam_model_decoup_contr_flexib.md similarity index 85% rename from content/paper/yang19_dynam_model_decoup_contr_flexib.md rename to content/article/yang19_dynam_model_decoup_contr_flexib.md index 23a1942..a1c2f3d 100644 --- a/content/paper/yang19_dynam_model_decoup_contr_flexib.md +++ b/content/article/yang19_dynam_model_decoup_contr_flexib.md @@ -8,7 +8,7 @@ Tags : [Stewart Platforms]({{< relref "stewart_platforms" >}}), [Vibration Isolation]({{< relref "vibration_isolation" >}}), [Flexible Joints]({{< relref "flexible_joints" >}}), [Cubic Architecture]({{< relref "cubic_architecture" >}}) Reference -: (Yang {\it et al.}, 2019) +: (Yang {\it et al.}, 2019) Author(s) : Yang, X., Wu, H., Chen, B., Kang, S., & Cheng, S. @@ -25,23 +25,23 @@ Year The joint stiffness impose a limitation on the control performance using force sensors as it adds a zero at low frequency in the dynamics. Thus, this stiffness is taken into account in the dynamics and compensated for. -**Stewart platform** (Figure [1](#org936d8f9)): +**Stewart platform** (Figure [1](#org96fb07f)): - piezoelectric actuators -- flexible joints (Figure [2](#orgd8c916a)) +- flexible joints (Figure [2](#org62b30be)) - force sensors (used for vibration isolation) - displacement sensors (used to decouple the dynamics) - cubic (even though not said explicitly) - + {{< figure src="/ox-hugo/yang19_stewart_platform.png" caption="Figure 1: Stewart Platform" >}} - + {{< figure src="/ox-hugo/yang19_flexible_joints.png" caption="Figure 2: Flexible Joints" >}} -The stiffness of the flexible joints (Figure [2](#orgd8c916a)) are computed with an FEM model and shown in Table [1](#table--tab:yang19-stiffness-flexible-joints). +The stiffness of the flexible joints (Figure [2](#org62b30be)) are computed with an FEM model and shown in Table [1](#table--tab:yang19-stiffness-flexible-joints).
@@ -105,9 +105,9 @@ In order to apply this control strategy: - The jacobian has to be computed - No information about modal matrix is needed -The block diagram of the control strategy is represented in Figure [3](#orgeb7080e). +The block diagram of the control strategy is represented in Figure [3](#org6a06ad2). - + {{< figure src="/ox-hugo/yang19_control_arch.png" caption="Figure 3: Control Architecture used" >}} @@ -121,10 +121,10 @@ Substituting \\(H(s)\\) in the equation of motion gives that: **Experimental Validation**: An external Shaker is used to excite the base and accelerometers are located on the base and mobile platforms to measure their motion. -The results are shown in Figure [4](#org48c287d). +The results are shown in Figure [4](#orgb8bd696). In theory, the vibration performance can be improved, however in practice, increasing the gain causes saturation of the piezoelectric actuators and then the instability occurs. - + {{< figure src="/ox-hugo/yang19_results.png" caption="Figure 4: Frequency response of the acceleration ratio between the paylaod and excitation (Transmissibility)" >}} @@ -134,4 +134,4 @@ In theory, the vibration performance can be improved, however in practice, incre > The proportional and integral gains in the sub-controller are used to separately regulate the vibration isolation bandwidth and active damping simultaneously for the six vibration modes. # Bibliography -Yang, X., Wu, H., Chen, B., Kang, S., & Cheng, S., *Dynamic modeling and decoupled control of a flexible stewart platform for vibration isolation*, Journal of Sound and Vibration, *439()*, 398–412 (2019). http://dx.doi.org/10.1016/j.jsv.2018.10.007 [↩](#d39b6222c8dd2baf188d677733c2826c) +Yang, X., Wu, H., Chen, B., Kang, S., & Cheng, S., *Dynamic modeling and decoupled control of a flexible stewart platform for vibration isolation*, Journal of Sound and Vibration, *439()*, 398–412 (2019). http://dx.doi.org/10.1016/j.jsv.2018.10.007 [↩](#d39b6222c8dd2baf188d677733c2826c) diff --git a/content/article/yun20_inves_two_stage_vibrat_suppr.md b/content/article/yun20_inves_two_stage_vibrat_suppr.md new file mode 100644 index 0000000..c67e51d --- /dev/null +++ b/content/article/yun20_inves_two_stage_vibrat_suppr.md @@ -0,0 +1,21 @@ ++++ +title = "Investigation on two-stage vibration suppression and precision pointing for space optical payloads" +author = ["Thomas Dehaeze"] +draft = false ++++ + +Tags +: + + +Reference +: (Hai Yun {\it et al.}, 2020) + +Author(s) +: Yun, H., Liu, L., Li, Q., & Yang, H. + +Year +: 2020 + +# Bibliography +Yun, H., Liu, L., Li, Q., & Yang, H., *Investigation on two-stage vibration suppression and precision pointing for space optical payloads*, Aerospace Science and Technology, *96(nil)*, 105543 (2020). http://dx.doi.org/10.1016/j.ast.2019.105543 [↩](#44caf201a37b1b3af63de65257785085) diff --git a/content/paper/zhang11_six_dof.md b/content/article/zhang11_six_dof.md similarity index 61% rename from content/paper/zhang11_six_dof.md rename to content/article/zhang11_six_dof.md index 028597d..73c9e8b 100644 --- a/content/paper/zhang11_six_dof.md +++ b/content/article/zhang11_six_dof.md @@ -8,7 +8,7 @@ Tags : [Stewart Platforms]({{< relref "stewart_platforms" >}}), [Vibration Isolation]({{< relref "vibration_isolation" >}}) Reference -: (Zhen Zhang {\it et al.}, 2011) Author(s) @@ -26,9 +26,9 @@ Year - **Accelerometers** for active isolation - Adaptive FIR filters for active isolation control - + {{< figure src="/ox-hugo/zhang11_platform.png" caption="Figure 1: Prototype of the non-cubic stewart platform" >}} # Bibliography -Zhang, Z., Liu, J., Mao, J., Guo, Y., & Ma, Y., *Six dof active vibration control using stewart platform with non-cubic configuration*, In , 2011 6th IEEE Conference on Industrial Electronics and Applications (pp. ) (2011). : . [↩](#a457d4de462d2fe52a1bbb848182b554) +Zhang, Z., Liu, J., Mao, J., Guo, Y., & Ma, Y., *Six dof active vibration control using stewart platform with non-cubic configuration*, In , 2011 6th IEEE Conference on Industrial Electronics and Applications (pp. ) (2011). : . [↩](#a457d4de462d2fe52a1bbb848182b554) diff --git a/content/article/zuo04_elemen_system_desig_activ_passiv_vibrat_isolat.md b/content/article/zuo04_elemen_system_desig_activ_passiv_vibrat_isolat.md new file mode 100644 index 0000000..07685ed --- /dev/null +++ b/content/article/zuo04_elemen_system_desig_activ_passiv_vibrat_isolat.md @@ -0,0 +1,46 @@ ++++ +title = "Element and system design for active and passive vibration isolation" +author = ["Thomas Dehaeze"] +draft = false ++++ + +Tags +: [Vibration Isolation]({{< relref "vibration_isolation" >}}) + +Reference +: (Zuo, 2004) + +Author(s) +: Zuo, L. + +Year +: 2004 + +> Vibration isolation systems can have various system architectures. +> When we configure an active isolation system, we can use compliant actuators (such as voice coils) or stiff actuators (such as PZT stacks). +> We also need to consider how to **combine the active actuation with passive elements**: we can place the actuator in parallel or in series with the passive elements. +> Most of the isolation systems fall into the category of soft active mounts, in which a compliant actuator is placed in parallel with a spring. +> A second category is **hard active mounts**, in which the **payload mass is directly mounted to a stiff actuator**. +> Soft active mounts generally have advantages for better passive performance; hard active mounts are favored for payload disturbance rejection, but combination with passive stages is required due to the lack of isolation performance out of the control bandwidth. +> Beard, von Flotow and Schubert proposed another type of hard mount, wherein **a stiff PZT actuator is placed in series with a spring** stiffer than the top passive stage. +> They found that coupling from flexible modes is much smaller than in soft active mounts in the load (force) feedback. +> Note that reaction force actuators can also work with soft mounts or hard mounts. + + + +{{< figure src="/ox-hugo/zuo04_piezo_spring_series.png" caption="Figure 1: PZT actuator and spring in series" >}} + + + +{{< figure src="/ox-hugo/zuo04_voice_coil_spring_parallel.png" caption="Figure 2: Voice coil actuator and spring in parallel" >}} + + + +{{< figure src="/ox-hugo/zuo04_piezo_plant.png" caption="Figure 3: Transmission from PZT voltage to geophone output" >}} + + + +{{< figure src="/ox-hugo/zuo04_voice_coil_plant.png" caption="Figure 4: Transmission from voice coil voltage to geophone output" >}} + +# Bibliography +Zuo, L., *Element and system design for active and passive vibration isolation* (2004). Massachusetts Institute of Technology. [↩](#e9037e3bf20089c45ab77215406558ca) diff --git a/content/bibliography/_index.md b/content/bibliography/_index.md new file mode 100644 index 0000000..e69de29 diff --git a/content/book/du19_multi_actuat_system_contr.md b/content/book/du19_multi_actuat_system_contr.md index 4e6b151..3fe5c70 100644 --- a/content/book/du19_multi_actuat_system_contr.md +++ b/content/book/du19_multi_actuat_system_contr.md @@ -68,9 +68,9 @@ and the resonance \\(P\_{ri}(s)\\) can be represented as one of the following fo #### Secondary Actuators {#secondary-actuators} -We here consider two types of secondary actuators: the PZT milliactuator (figure [1](#org53c168b)) and the microactuator. +We here consider two types of secondary actuators: the PZT milliactuator (figure [1](#orgb678385)) and the microactuator. - + {{< figure src="/ox-hugo/du19_pzt_actuator.png" caption="Figure 1: A PZT-actuator suspension" >}} @@ -92,9 +92,9 @@ There characteristics are shown on table [1](#table--tab:microactuator). ### Single-Stage Actuation Systems {#single-stage-actuation-systems} -A typical closed-loop control system is shown on figure [2](#org5941a76), where \\(P\_v(s)\\) and \\(C(z)\\) represent the actuator system and its controller. +A typical closed-loop control system is shown on figure [2](#orgcf5d697), where \\(P\_v(s)\\) and \\(C(z)\\) represent the actuator system and its controller. - + {{< figure src="/ox-hugo/du19_single_stage_control.png" caption="Figure 2: Block diagram of a single-stage actuation system" >}} @@ -104,7 +104,7 @@ A typical closed-loop control system is shown on figure [2](#org5941a76), where Dual-stage actuation mechanism for the hard disk drives consists of a VCM actuator and a secondary actuator placed between the VCM and the sensor head. The VCM is used as the primary stage to provide long track seeking but with poor accuracy and slow response time, while the secondary stage actuator is used to provide higher positioning accuracy and faster response but with a stroke limit. - + {{< figure src="/ox-hugo/du19_dual_stage_control.png" caption="Figure 3: Block diagram of dual-stage actuation system" >}} @@ -130,7 +130,7 @@ In view of this, the controller design for dual-stage actuation systems adopts a ### Control Schemes {#control-schemes} -A popular control scheme for dual-stage actuation system is the **decoupled structure** as shown in figure [4](#org03d53e8). +A popular control scheme for dual-stage actuation system is the **decoupled structure** as shown in figure [4](#org7def875). - \\(C\_v(z)\\) and \\(C\_p(z)\\) are the controllers respectively, for the primary VCM actuator \\(P\_v(s)\\) and the secondary actuator \\(P\_p(s)\\). - \\(\hat{P}\_p(z)\\) is an approximation of \\(P\_p\\) to estimate \\(y\_p\\). @@ -138,7 +138,7 @@ A popular control scheme for dual-stage actuation system is the **decoupled stru - \\(n\\) is the measurement noise - \\(d\_u\\) stands for external vibration - + {{< figure src="/ox-hugo/du19_decoupled_control.png" caption="Figure 4: Decoupled control structure for the dual-stage actuation system" >}} @@ -160,14 +160,14 @@ The sensitivity functions of the VCM loop and the secondary actuator loop are And we obtain that the dual-stage sensitivity function \\(S(z)\\) is the product of \\(S\_v(z)\\) and \\(S\_p(z)\\). Thus, the dual-stage system control design can be decoupled into two independent controller designs. -Another type of control scheme is the **parallel structure** as shown in figure [5](#org37116a9). +Another type of control scheme is the **parallel structure** as shown in figure [5](#orgbb3c494). The open-loop transfer function from \\(pes\\) to \\(y\\) is \\[ G(z) = P\_p(z) C\_p(z) + P\_v(z) C\_v(z) \\] The overall sensitivity function of the closed-loop system from \\(r\\) to \\(pes\\) is \\[ S(z) = \frac{1}{1 + G(z)} = \frac{1}{1 + P\_p(z) C\_p(z) + P\_v(z) C\_v(z)} \\] - + {{< figure src="/ox-hugo/du19_parallel_control_structure.png" caption="Figure 5: Parallel control structure for the dual-stage actuator system" >}} @@ -177,7 +177,7 @@ Because of the limited displacement range of the secondary actuator, the control ### Controller Design Method in the Continuous-Time Domain {#controller-design-method-in-the-continuous-time-domain} \\(\mathcal{H}\_\infty\\) loop shaping method is used to design the controllers for the primary and secondary actuators. -The structure of the \\(\mathcal{H}\_\infty\\) loop shaping method is plotted in figure [6](#org299b914) where \\(W(s)\\) is a weighting function relevant to the designed control system performance such as the sensitivity function. +The structure of the \\(\mathcal{H}\_\infty\\) loop shaping method is plotted in figure [6](#orge3f8703) where \\(W(s)\\) is a weighting function relevant to the designed control system performance such as the sensitivity function. For a plant model \\(P(s)\\), a controller \\(C(s)\\) is to be designed such that the closed-loop system is stable and @@ -187,11 +187,11 @@ For a plant model \\(P(s)\\), a controller \\(C(s)\\) is to be designed such tha is satisfied, where \\(T\_{zw}\\) is the transfer function from \\(w\\) to \\(z\\): \\(T\_{zw} = S(s) W(s)\\). - + {{< figure src="/ox-hugo/du19_h_inf_diagram.png" caption="Figure 6: Block diagram for \\(\mathcal{H}\_\infty\\) loop shaping method to design the controller \\(C(s)\\) with the weighting function \\(W(s)\\)" >}} -Equation [1](#org361ec91) means that \\(S(s)\\) can be shaped similarly to the inverse of the chosen weighting function \\(W(s)\\). +Equation [1](#orgc402b0c) means that \\(S(s)\\) can be shaped similarly to the inverse of the chosen weighting function \\(W(s)\\). One form of \\(W(s)\\) is taken as \begin{equation} @@ -204,16 +204,16 @@ The controller can then be synthesis using the linear matrix inequality (LMI) ap The primary and secondary actuator control loops are designed separately for the dual-stage control systems. But when designing their respective controllers, certain performances are required for the two actuators, so that control efforts for the two actuators are distributed properly and the actuators don't conflict with each other's control authority. -As seen in figure [7](#org60ad057), the VCM primary actuator open loop has a higher gain at low frequencies, and the secondary actuator open loop has a higher gain in the high-frequency range. +As seen in figure [7](#org402df06), the VCM primary actuator open loop has a higher gain at low frequencies, and the secondary actuator open loop has a higher gain in the high-frequency range. - + {{< figure src="/ox-hugo/du19_dual_stage_loop_gain.png" caption="Figure 7: Frequency responses of \\(G\_v(s) = C\_v(s)P\_v(s)\\) (solid line) and \\(G\_p(s) = C\_p(s) P\_p(s)\\) (dotted line)" >}} -The sensitivity functions are shown in figure [8](#org1d6afb9), where the hump of \\(S\_v\\) is arranged within the bandwidth of \\(S\_p\\) and the hump of \\(S\_p\\) is lowered as much as possible. +The sensitivity functions are shown in figure [8](#orge904ce1), where the hump of \\(S\_v\\) is arranged within the bandwidth of \\(S\_p\\) and the hump of \\(S\_p\\) is lowered as much as possible. This needs to decrease the bandwidth of the primary actuator loop and increase the bandwidth of the secondary actuator loop. - + {{< figure src="/ox-hugo/du19_dual_stage_sensitivity.png" caption="Figure 8: Frequency response of \\(S\_v(s)\\) and \\(S\_p(s)\\)" >}} @@ -246,13 +246,13 @@ A VCM actuator is used as the first-stage actuator denoted by \\(P\_v(s)\\), a P ### Control Strategy and Controller Design {#control-strategy-and-controller-design} -Figure [9](#org0e50764) shows the control structure for the three-stage actuation system. +Figure [9](#org8c31dd5) shows the control structure for the three-stage actuation system. The control scheme is based on the decoupled master-slave dual-stage control and the third stage microactuator is added in parallel with the dual-stage control system. The parallel format is advantageous to the overall control bandwidth enhancement, especially for the microactuator having limited stroke which restricts the bandwidth of its own loop. The reason why the decoupled control structure is adopted here is that its overall sensitivity function is the product of those of the two individual loops, and the VCM and the PTZ controllers can be designed separately. - + {{< figure src="/ox-hugo/du19_three_stage_control.png" caption="Figure 9: Control system for the three-stage actuation system" >}} @@ -281,15 +281,15 @@ The PZT actuated milliactuator \\(P\_p(s)\\) works under a reasonably high bandw The third-stage actuator \\(P\_m(s)\\) is used to further push the bandwidth as high as possible. The control performances of both the VCM and the PZT actuators are limited by their dominant resonance modes. -The open-loop frequency responses of the three stages are shown on figure [10](#orgefe88f9). +The open-loop frequency responses of the three stages are shown on figure [10](#orgd95bc97). - + {{< figure src="/ox-hugo/du19_open_loop_three_stage.png" caption="Figure 10: Frequency response of the open-loop transfer function" >}} -The obtained sensitivity function is shown on figure [11](#orgd0c25f8). +The obtained sensitivity function is shown on figure [11](#org50990f8). - + {{< figure src="/ox-hugo/du19_sensitivity_three_stage.png" caption="Figure 11: Sensitivity function of the VCM single stage, the dual-stage and the three-stage loops" >}} @@ -304,7 +304,7 @@ Otherwise, saturation will occur in the control loop and the control system perf Therefore, the stroke specification of the actuators, especially milliactuator and microactuators, is very important for achievable control performance. Higher stroke actuators have stronger abilities to make sure that the control performances are not degraded in the presence of external vibrations. -For the three-stage control architecture as shown on figure [9](#org0e50764), the position error is +For the three-stage control architecture as shown on figure [9](#org8c31dd5), the position error is \\[ e = -S(P\_v d\_1 + d\_2 + d\_e) + S n \\] The control signals and positions of the actuators are given by @@ -320,11 +320,11 @@ Higher bandwidth/higher level of disturbance generally means high stroke needed. ### Different Configurations of the Control System {#different-configurations-of-the-control-system} -A decoupled control structure can be used for the three-stage actuation system (see figure [12](#org5bb499d)). +A decoupled control structure can be used for the three-stage actuation system (see figure [12](#org7ec3564)). The overall sensitivity function is \\[ S(z) = \approx S\_v(z) S\_p(z) S\_m(z) \\] -with \\(S\_v(z)\\) and \\(S\_p(z)\\) are defined in equation [1](#orga34ddfe) and +with \\(S\_v(z)\\) and \\(S\_p(z)\\) are defined in equation [1](#org6bf8240) and \\[ S\_m(z) = \frac{1}{1 + P\_m(z) C\_m(z)} \\] Denote the dual-stage open-loop transfer function as \\(G\_d\\) @@ -333,7 +333,7 @@ Denote the dual-stage open-loop transfer function as \\(G\_d\\) The open-loop transfer function of the overall system is \\[ G(z) = G\_d(z) + G\_m(z) + G\_d(z) G\_m(z) \\] - + {{< figure src="/ox-hugo/du19_three_stage_decoupled.png" caption="Figure 12: Decoupled control structure for the three-stage actuation system" >}} @@ -345,9 +345,9 @@ The control signals and the positions of the three actuators are u\_v &= C\_v(1 + \hat{P}\_p C\_p) (1 + \hat{P}\_m C\_m) e, \ y\_v = P\_v u\_v \end{align\*} -The decoupled configuration makes the low frequency gain much higher, and consequently there is much better rejection capability at low frequency compared to the parallel architecture (see figure [13](#org0a46272)). +The decoupled configuration makes the low frequency gain much higher, and consequently there is much better rejection capability at low frequency compared to the parallel architecture (see figure [13](#org56aeb13)). - + {{< figure src="/ox-hugo/du19_three_stage_decoupled_loop_gain.png" caption="Figure 13: Frequency responses of the open-loop transfer functions for the three-stages parallel and decoupled structure" >}} diff --git a/content/book/ewins00_modal.md b/content/book/ewins00_modal.md index fbcf3fd..9b4e136 100644 --- a/content/book/ewins00_modal.md +++ b/content/book/ewins00_modal.md @@ -141,7 +141,7 @@ The main measurement technique studied are those which will permit to make **dir The type of test best suited to FRF measurement is shown in figure [fig:modal_analysis_schematic](#fig:modal_analysis_schematic). - + {{< figure src="/ox-hugo/ewins00_modal_analysis_schematic.png" caption="Figure 1: Basic components of FRF measurement system" >}} @@ -199,7 +199,7 @@ This process itself falls into two stages: Most of the effort goes into this second stage, which is widely referred to as "modal parameter extraction", or simply as "modal analysis". We have seen that we can predict the form of the FRF plots for a multi degree-of-freedom system, and that these are directly related to the modal properties of that system. -The great majority of the modal analysis effort involves **curve-fitting** an expression such as equation [eq:frf_modal](#eq:frf_modal) to the measured FRF and thereby finding the appropriate modal parameters. +The great majority of the modal analysis effort involves **curve-fitting** an expression such as equation \eqref{eq:frf_modal} to the measured FRF and thereby finding the appropriate modal parameters. A completely general curve-fitting approach is possible but generally inefficient. Mathematically, we can take an equation of the form @@ -215,7 +215,7 @@ This assumption allows us to use the circular nature of a modulus/phase polar pl This process can be **repeated** for each resonance individually until the whole curve has been analyzed. At this stage, a theoretical regeneration of the FRF is possible using the set of coefficients extracted. - + {{< figure src="/ox-hugo/ewins00_sdof_modulus_phase.png" caption="Figure 2: Curve fit to resonant FRF data" >}} @@ -253,7 +253,7 @@ Theoretical foundations of modal testing are of paramount importance to its succ The three phases through a typical theoretical vibration analysis progresses are shown on figure [fig:vibration_analysis_procedure](#fig:vibration_analysis_procedure). Generally, we start with a description of the structure's physical characteristics (mass, stiffness and damping properties), this is referred to as the **Spatial model**. - + {{< figure src="/ox-hugo/ewins00_vibration_analysis_procedure.png" caption="Figure 3: Theoretical route to vibration analysis" >}} @@ -298,7 +298,7 @@ Three classes of system model will be described: The basic model for the SDOF system is shown in figure [fig:sdof_model](#fig:sdof_model) where \\(f(t)\\) and \\(x(t)\\) are general time-varying force and displacement response quantities. The spatial model consists of a **mass** \\(m\\), a **spring** \\(k\\) and (when damped) either a **viscous dashpot** \\(c\\) or **hysteretic damper** \\(d\\). - + {{< figure src="/ox-hugo/ewins00_sdof_model.png" caption="Figure 4: Single degree-of-freedom system" >}} @@ -374,7 +374,7 @@ which is a single mode of vibration with a complex natural frequency having two The physical significance of these two parts is illustrated in the typical free response plot shown in figure [fig:sdof_response](#fig:sdof_response) - + {{< figure src="/ox-hugo/ewins00_sdof_response.png" caption="Figure 5: Oscillatory and decay part" >}} @@ -418,7 +418,7 @@ The damping effect of such a component can conveniently be defined by the ratio | ![](/ox-hugo/ewins00_material_histeresis.png) | ![](/ox-hugo/ewins00_dry_friction.png) | ![](/ox-hugo/ewins00_viscous_damper.png) | |-----------------------------------------------|----------------------------------------|------------------------------------------| -| Material hysteresis | Dry friction | Viscous damper | +| Material hysteresis | Dry friction | Viscous damper | | height=2cm | height=2cm | height=2cm | Another common source of energy dissipation in practical structures, is the **friction** which exist in joints between components of the structure. @@ -458,11 +458,11 @@ where \\(\eta\\) is the **structural damping loss factor** and replaces the crit #### Alternative Forms of FRF {#alternative-forms-of-frf} -So far we have defined our receptance frequency response function \\(\alpha(\omega)\\) as the ratio between a harmonic displacement response and the harmonic force [eq:receptance](#eq:receptance). +So far we have defined our receptance frequency response function \\(\alpha(\omega)\\) as the ratio between a harmonic displacement response and the harmonic force \eqref{eq:receptance}. This ratio is complex: we can look at its **amplitude** ratio \\(|\alpha(\omega)|\\) and its **phase** angle \\(\theta\_\alpha(\omega)\\). -We could have selected the response velocity \\(v(t)\\) as the output quantity and defined an alternative frequency response function [eq:mobility](#eq:mobility). -Similarly we could use the acceleration parameter so we could define a third FRF parameter [eq:inertance](#eq:inertance). +We could have selected the response velocity \\(v(t)\\) as the output quantity and defined an alternative frequency response function \eqref{eq:mobility}. +Similarly we could use the acceleration parameter so we could define a third FRF parameter \eqref{eq:inertance}.
@@ -537,7 +537,7 @@ Bode plot are usually displayed using logarithmic scales as shown on figure [fig | ![](/ox-hugo/ewins00_bode_receptance.png) | ![](/ox-hugo/ewins00_bode_mobility.png) | ![](/ox-hugo/ewins00_bode_accelerance.png) | |-------------------------------------------|-----------------------------------------|--------------------------------------------| -| Receptance FRF | Mobility FRF | Accelerance FRF | +| Receptance FRF | Mobility FRF | Accelerance FRF | | width=\linewidth | width=\linewidth | width=\linewidth | Each plot can be divided into three regimes: @@ -560,13 +560,13 @@ This type of display is not widely used as we cannot use logarithmic axes (as we | ![](/ox-hugo/ewins00_plot_receptance_real.png) | ![](/ox-hugo/ewins00_plot_receptance_imag.png) | |------------------------------------------------|------------------------------------------------| -| Real part | Imaginary part | +| Real part | Imaginary part | | width=\linewidth | width=\linewidth | ##### Real part and Imaginary part of reciprocal FRF {#real-part-and-imaginary-part-of-reciprocal-frf} -It can be seen from the expression of the inverse receptance [eq:dynamic_stiffness](#eq:dynamic_stiffness) that the Real part depends entirely on the mass and stiffness properties while the Imaginary part is a only function of the damping. +It can be seen from the expression of the inverse receptance \eqref{eq:dynamic_stiffness} that the Real part depends entirely on the mass and stiffness properties while the Imaginary part is a only function of the damping. Figure [fig:inverse_frf_mixed](#fig:inverse_frf_mixed) shows an example of a plot of a system with a combination of both viscous and structural damping. The imaginary part is a straight line whose slope is given by the viscous damping rate \\(c\\) and whose intercept at \\(\omega = 0\\) is provided by the structural damping coefficient \\(d\\). @@ -578,7 +578,7 @@ Figure [fig:inverse_frf_mixed](#fig:inverse_frf_mixed) shows an example of a plo | ![](/ox-hugo/ewins00_inverse_frf_mixed.png) | ![](/ox-hugo/ewins00_inverse_frf_viscous.png) | |---------------------------------------------|-----------------------------------------------| -| Mixed | Viscous | +| Mixed | Viscous | | width=\linewidth | width=\linewidth | @@ -595,7 +595,7 @@ The missing information (in this case, the frequency) must be added by identifyi | ![](/ox-hugo/ewins00_nyquist_receptance_viscous.png) | ![](/ox-hugo/ewins00_nyquist_receptance_structural.png) | |------------------------------------------------------|---------------------------------------------------------| -| Viscous damping | Structural damping | +| Viscous damping | Structural damping | | width=\linewidth | width=\linewidth | The Nyquist plot has the particularity of distorting the plot so as to focus on the resonance area. @@ -607,7 +607,7 @@ This makes the Nyquist plot very effective for modal testing applications. #### Free Vibration Solution - The modal Properties {#free-vibration-solution-the-modal-properties} -For an undamped MDOF system, with \\(N\\) degrees of freedom, the governing equations of motion can be written in matrix form [eq:undamped_mdof](#eq:undamped_mdof). +For an undamped MDOF system, with \\(N\\) degrees of freedom, the governing equations of motion can be written in matrix form \eqref{eq:undamped_mdof}.
@@ -622,7 +622,7 @@ where \\([M]\\) and \\([K]\\) are \\(N\times N\\) mass and stiffness matrices, a We shall consider first the free vibration solution by taking \\(f(t) = 0\\). In this case, we assume that a solution exists of the form \\(\\{x(t)\\} = \\{X\\} e^{i \omega t}\\) where \\(\\{X\\}\\) is an \\(N \times 1\\) vector of time-independent amplitudes. -Substitution of this condition into [eq:undamped_mdof](#eq:undamped_mdof) leads to +Substitution of this condition into \eqref{eq:undamped_mdof} leads to \begin{equation} \left( [K] - \omega^2 [M] \right) \\{X\\} e^{i\omega t} = \\{0\\} @@ -632,7 +632,7 @@ for which the non trivial solutions are those which satisfy \\[ \det \left| [K] - \omega^2 [M] \right| = 0 \\] from which we can find \\(N\\) values of \\(\omega^2\\) corresponding to the undamped system's **natural frequencies**. -Substituting any of these back into [eq:free_eom_mdof](#eq:free_eom_mdof) yields a corresponding set of relative values for \\(\\{X\\}\\): \\(\\{\psi\\}\_r\\) the so-called **mode shape** corresponding to that natural frequency. +Substituting any of these back into \eqref{eq:free_eom_mdof} yields a corresponding set of relative values for \\(\\{X\\}\\): \\(\\{\psi\\}\_r\\) the so-called **mode shape** corresponding to that natural frequency.
@@ -774,7 +774,7 @@ An alternative means of deriving the FRF parameters is used which makes use of t \\[ [K] - \omega^2 [M] = [\alpha(\omega)]^{-1} \\] Pre-multiply both sides by \\([\Phi]^T\\) and post-multiply both sides by \\([\Phi]\\) to obtain \\[ [\Phi]^T ([K] - \omega^2 [M]) [\Phi] = [\Phi]^T [\alpha(\omega)]^{-1} [\Phi] \\] -which leads to [eq:receptance_modal](#eq:receptance_modal). +which leads to \eqref{eq:receptance_modal}.
@@ -783,7 +783,7 @@ which leads to [eq:receptance_modal](#eq:receptance_modal). [\alpha(\omega)] = [\Phi] \left[ \bar{\omega}\_r^2 - \omega^2 \right]^{-1} [\Phi]^T \label{eq:receptance\_modal} \end{equation} -Equation [eq:receptance_modal](#eq:receptance_modal) permits us to compute any individual FRF parameters \\(\alpha\_{jk}(\omega)\\) using the following formula +Equation \eqref{eq:receptance_modal} permits us to compute any individual FRF parameters \\(\alpha\_{jk}(\omega)\\) using the following formula \begin{subequations} \begin{align} @@ -800,7 +800,7 @@ where \\({}\_rA\_{jk}\\) is called the **modal constant**.
-It is clear from equation [eq:receptance_modal](#eq:receptance_modal) that the receptance matrix \\([\alpha(\omega)]\\) is **symmetric** and this will be recognized as the **principle of reciprocity**. +It is clear from equation \eqref{eq:receptance_modal} that the receptance matrix \\([\alpha(\omega)]\\) is **symmetric** and this will be recognized as the **principle of reciprocity**. This principle of reciprocity applies to many structural characteristics. @@ -938,7 +938,7 @@ From this full matrix equation, we have: Having derived an expression for the general term in the frequency response function matrix \\(\alpha\_{jk}(\omega)\\), it is appropriate to consider next the analysis of a situation where the system is **excited simultaneously at several points**. -The general behavior for this case is governed by equation [eq:force_response_eom](#eq:force_response_eom) with solution [eq:force_response_eom_solution](#eq:force_response_eom_solution). +The general behavior for this case is governed by equation \eqref{eq:force_response_eom} with solution \eqref{eq:force_response_eom_solution}. However, a more explicit form of the solution is \begin{equation} @@ -962,7 +962,7 @@ The properties of the normal modes of the undamped system are of interest becaus
-We are seeking an excitation vector \\(\\{F\\}\\) such that the **response** \\(\\{X\\}\\) **consists of a single modal component** so that all terms in [eq:ods](#eq:ods) but one is zero. +We are seeking an excitation vector \\(\\{F\\}\\) such that the **response** \\(\\{X\\}\\) **consists of a single modal component** so that all terms in \eqref{eq:ods} but one is zero. This can be attained if \\(\\{F\\}\\) is chosen such that \\[ \\{\phi\_r\\}^T \\{F\\}\_s = 0, \ r \neq s \\] @@ -1046,7 +1046,7 @@ where \\(\omega\_r\\) is the **natural frequency** and \\(\xi\_r\\) is the **cri When the modes \\(r\\) and \\(q\\) are a complex conjugate pair: \\[ s\_r = \omega\_r \left( -\xi\_r - i\sqrt{1 - \xi\_r^2} \right); \quad \\{\psi\\}\_q = \\{\psi\\}\_r^\* \\] -From equations [eq:viscous_damping_orthogonality](#eq:viscous_damping_orthogonality), we can obtain +From equations \eqref{eq:viscous_damping_orthogonality}, we can obtain \begin{subequations} \begin{align} @@ -1103,7 +1103,7 @@ Equally, in a real mode, all parts of the structure pass through their **zero de While the real mode has the appearance of a **standing wave**, the complex mode is better described as exhibiting **traveling waves** (illustrated on figure [fig:real_complex_modes](#fig:real_complex_modes)). - + {{< figure src="/ox-hugo/ewins00_real_complex_modes.png" caption="Figure 6: Real and complex mode shapes displays" >}} @@ -1118,7 +1118,7 @@ Note that the almost-real mode shape does not necessarily have vector elements w | ![](/ox-hugo/ewins00_argand_diagram_a.png) | ![](/ox-hugo/ewins00_argand_diagram_b.png) | ![](/ox-hugo/ewins00_argand_diagram_c.png) | |--------------------------------------------|--------------------------------------------|-----------------------------------------------| -| Almost-real mode | Complex Mode | Measure of complexity | +| Almost-real mode | Complex Mode | Measure of complexity | | width=\linewidth | width=\linewidth | width=\linewidth | @@ -1235,7 +1235,7 @@ On a logarithmic plot, this produces the antiresonance characteristic which refl | ![](/ox-hugo/ewins00_mobility_frf_mdof_point.png) | ![](/ox-hugo/ewins00_mobility_frf_mdof_transfer.png) | |---------------------------------------------------|------------------------------------------------------| -| Point FRF | Transfer FRF | +| Point FRF | Transfer FRF | | width=\linewidth | width=\linewidth | For the plot in figure [fig:mobility_frf_mdof_transfer](#fig:mobility_frf_mdof_transfer), between the two resonances, the two components have the same sign and they add up, no antiresonance is present. @@ -1260,7 +1260,7 @@ Most mobility plots have this general form as long as the modes are relatively w This condition is satisfied unless the separation between adjacent natural frequencies is of the same order as, or less than, the modal damping factors, in which case it becomes difficult to distinguish the individual modes. - + {{< figure src="/ox-hugo/ewins00_frf_damped_system.png" caption="Figure 7: Mobility plot of a damped system" >}} @@ -1281,7 +1281,7 @@ The plot for the transfer receptance \\(\alpha\_{21}\\) is presented in figure [ | ![](/ox-hugo/ewins00_nyquist_point.png) | ![](/ox-hugo/ewins00_nyquist_transfer.png) | |------------------------------------------|---------------------------------------------| -| Point receptance | Transfer receptance | +| Point receptance | Transfer receptance | | width=\linewidth | width=\linewidth | In the two figures [fig:nyquist_nonpropdamp_point](#fig:nyquist_nonpropdamp_point) and [fig:nyquist_nonpropdamp_transfer](#fig:nyquist_nonpropdamp_transfer), we show corresponding data for **non-proportional** damping. @@ -1296,7 +1296,7 @@ Now we find that the individual modal circles are no longer "upright" but are ** | ![](/ox-hugo/ewins00_nyquist_nonpropdamp_point.png) | ![](/ox-hugo/ewins00_nyquist_nonpropdamp_transfer.png) | |-----------------------------------------------------|--------------------------------------------------------| -| Point receptance | Transfer receptance | +| Point receptance | Transfer receptance | | width=\linewidth | width=\linewidth | @@ -1343,7 +1343,7 @@ One these two series are available, the FRF can be defined at the same set of fr ##### Analysis via Fourier transform {#analysis-via-fourier-transform} -For most transient cases, the input function \\(f(t)\\) will satisfy the **Dirichlet condition** and so its Fourier Transform \\(F(\omega)\\) can be computed from [eq:fourier_transform](#eq:fourier_transform). +For most transient cases, the input function \\(f(t)\\) will satisfy the **Dirichlet condition** and so its Fourier Transform \\(F(\omega)\\) can be computed from \eqref{eq:fourier_transform}. \begin{equation} F(\omega) = \frac{1}{2 \pi} \int\_{-\infty}^\infty f(t) e^{i\omega t} dt @@ -1450,7 +1450,7 @@ Examples of random signals, autocorrelation function and power spectral density | ![](/ox-hugo/ewins00_random_time.png) | ![](/ox-hugo/ewins00_random_autocorrelation.png) | ![](/ox-hugo/ewins00_random_psd.png) | |---------------------------------------|--------------------------------------------------|------------------------------------------------| -| Time history | Autocorrelation Function | Power Spectral Density | +| Time history | Autocorrelation Function | Power Spectral Density | | width=\linewidth | width=\linewidth | width=\linewidth | A similar concept can be applied to a pair of functions such as \\(f(t)\\) and \\(x(t)\\) to produce **cross correlation** and **cross spectral density** functions. @@ -1493,10 +1493,10 @@ However, the same equation can be transform to the frequency domain \tcmbox{ S\_{xx}(\omega) = \left| H(\omega) \right|^2 S\_{ff}(\omega) } \end{equation} -Although very convenient, equation [eq:psd_input_output](#eq:psd_input_output) does not provide a complete description of the random vibration conditions. +Although very convenient, equation \eqref{eq:psd_input_output} does not provide a complete description of the random vibration conditions. Further, it is clear that **is could not be used to determine the FRF** from measurement of excitation and response because it **contains only the modulus** of \\(H(\omega)\\), the phase information begin omitted from this formula. -A second equation is required and this may be obtain by a similar analysis, two alternative formulas can be obtained [eq:cross_relation_alternatives](#eq:cross_relation_alternatives). +A second equation is required and this may be obtain by a similar analysis, two alternative formulas can be obtained \eqref{eq:cross_relation_alternatives}.
@@ -1513,8 +1513,8 @@ A second equation is required and this may be obtain by a similar analysis, two ##### To derive FRF from random vibration signals {#to-derive-frf-from-random-vibration-signals} -The pair of equations [eq:cross_relation_alternatives](#eq:cross_relation_alternatives) provides the basic of determining a system's FRF properties from the measurements and analysis of a random vibration test. -Using either of them, we have a simple formula for determining the FRF from estimates of the relevant spectral densities [eq:frf_estimates_spectral_densities](#eq:frf_estimates_spectral_densities). +The pair of equations \eqref{eq:cross_relation_alternatives} provides the basic of determining a system's FRF properties from the measurements and analysis of a random vibration test. +Using either of them, we have a simple formula for determining the FRF from estimates of the relevant spectral densities \eqref{eq:frf_estimates_spectral_densities}.
@@ -1547,11 +1547,11 @@ Then in [fig:frf_feedback_model](#fig:frf_feedback_model) is given a more detail | ![](/ox-hugo/ewins00_frf_siso_model.png) | ![](/ox-hugo/ewins00_frf_feedback_model.png) | |------------------------------------------|--------------------------------------------------| -| Basic SISO model | SISO model with feedback | +| Basic SISO model | SISO model with feedback | | width=\linewidth | width=\linewidth | In this configuration, it can be seen that there are two feedback mechanisms which apply. -We then introduce an alternative formula which is available for the determination of the system FRF from measurements of the input and output quantities [eq:H3](#eq:H3). +We then introduce an alternative formula which is available for the determination of the system FRF from measurements of the input and output quantities \eqref{eq:H3}.
@@ -1580,7 +1580,7 @@ We obtain two alternative formulas: In practical application of both of these formulae, care must be taken to ensure the non-singularity of the spectral density matrix which is to be inverted, and it is in this respect that the former version may be found to be more reliable. - + {{< figure src="/ox-hugo/ewins00_frf_mimo.png" caption="Figure 8: System for FRF determination via MIMO model" >}} @@ -1694,7 +1694,7 @@ First, if we have a **modal incompleteness** (\\(m + {{< figure src="/ox-hugo/ewins00_general_frf_measurement_setup.png" caption="Figure 9: General layout of FRF measurement system" >}} @@ -1909,7 +1909,7 @@ This can modify the response of the system in those directions. In order to avoid that, a drive rod which is stiff in one direction and flexible in the other five directions is attached between the shaker and the structure as shown on figure [fig:shaker_rod](#fig:shaker_rod). Typical size for the rod are \\(5\\) to \\(\SI{10}{mm}\\) long and \\(\SI{1}{mm}\\) in diameter, if the rod is longer, it may introduce the effect of its own resonances. - + {{< figure src="/ox-hugo/ewins00_shaker_rod.png" caption="Figure 10: Exciter attachment and drive rod assembly" >}} @@ -1930,7 +1930,7 @@ Figure [fig:shaker_mount_3](#fig:shaker_mount_3) shows an unsatisfactory setup. | ![](/ox-hugo/ewins00_shaker_mount_1.png) | ![](/ox-hugo/ewins00_shaker_mount_2.png) | ![](/ox-hugo/ewins00_shaker_mount_3.png) | |---------------------------------------------|-------------------------------------------------|------------------------------------------| -| Ideal Configuration | Suspended Configuration | Unsatisfactory | +| Ideal Configuration | Suspended Configuration | Unsatisfactory | | width=\linewidth | width=\linewidth | width=\linewidth | @@ -1948,7 +1948,7 @@ The frequency range which is effectively excited is controlled by the stiffness When the hammer tip impacts the test structure, this will experience a force pulse as shown on figure [fig:hammer_impulse](#fig:hammer_impulse). A pulse of this type (half-sine shape) has a frequency content of the form illustrated on figure [fig:hammer_impulse](#fig:hammer_impulse). - + {{< figure src="/ox-hugo/ewins00_hammer_impulse.png" caption="Figure 11: Typical impact force pulse and spectrum" >}} @@ -1979,7 +1979,7 @@ By suitable design, such a material may be incorporated into a device which **in The force transducer is the simplest type of piezoelectric transducer. The transmitter force \\(F\\) is applied directly across the crystal, which thus generates a corresponding charge \\(q\\), proportional to \\(F\\) (figure [fig:piezo_force_transducer](#fig:piezo_force_transducer)). - + {{< figure src="/ox-hugo/ewins00_piezo_force_transducer.png" caption="Figure 12: Force transducer" >}} @@ -1992,7 +1992,7 @@ In an accelerometer, transduction is indirect and is achieved using a seismic ma In this configuration, the force exerted on the crystals is the inertia force of the seismic mass (\\(m\ddot{z}\\)). Thus, so long as the body and the seismic mass move together, the output of the transducer will be proportional to the acceleration of its body \\(x\\). - + {{< figure src="/ox-hugo/ewins00_piezo_accelerometer.png" caption="Figure 13: Compression-type of piezoelectric accelerometer" >}} @@ -2040,7 +2040,7 @@ Shown on figure [fig:transducer_mounting_response](#fig:transducer_mounting_resp | ![](/ox-hugo/ewins00_transducer_mounting_types.png) | ![](/ox-hugo/ewins00_transducer_mounting_response.png) | |-----------------------------------------------------|------------------------------------------------------------| -| Attachment methods | Frequency response characteristics | +| Attachment methods | Frequency response characteristics | | width=\linewidth | width=\linewidth | @@ -2127,7 +2127,7 @@ Aliasing originates from the discretisation of the originally continuous time hi With this discretisation process, the **existence of very high frequencies in the original signal may well be misinterpreted if the sampling rate is too slow**. These high frequencies will be **indistinguishable** from genuine low frequency components as shown on figure [fig:aliasing](#fig:aliasing). - + {{< figure src="/ox-hugo/ewins00_aliasing.png" caption="Figure 14: The phenomenon of aliasing. On top: Low-frequency signal, On the bottom: High frequency signal" >}} @@ -2144,7 +2144,7 @@ This is illustrated on figure [fig:effect_aliasing](#fig:effect_aliasing). | ![](/ox-hugo/ewins00_aliasing_no_distortion.png) | ![](/ox-hugo/ewins00_aliasing_distortion.png) | |--------------------------------------------------|-----------------------------------------------------| -| True spectrum of signal | Indicated spectrum from DFT | +| True spectrum of signal | Indicated spectrum from DFT | | width=\linewidth | width=\linewidth | The solution of the problem is to use an **anti-aliasing filter** which subjects the original time signal to a low-pass, sharp cut-off filter. @@ -2165,7 +2165,7 @@ Leakage is a problem which is a direct **consequence of the need to take only a | ![](/ox-hugo/ewins00_leakage_ok.png) | ![](/ox-hugo/ewins00_leakage_nok.png) | |--------------------------------------|----------------------------------------| -| Ideal signal | Awkward signal | +| Ideal signal | Awkward signal | | width=\linewidth | width=\linewidth | The problem is illustrated on figure [fig:leakage](#fig:leakage). @@ -2190,7 +2190,7 @@ Windowing involves the imposition of a prescribed profile on the time signal pri The profiles, or "windows" are generally depicted as a time function \\(w(t)\\) as shown in figure [fig:windowing_examples](#fig:windowing_examples). - + {{< figure src="/ox-hugo/ewins00_windowing_examples.png" caption="Figure 15: Different types of window. (a) Boxcar, (b) Hanning, (c) Cosine-taper, (d) Exponential" >}} @@ -2211,7 +2211,7 @@ Common filters are: low-pass, high-pass, band-limited, narrow-band, notch. #### Improving Resolution {#improving-resolution} - + ##### Increasing transform size {#increasing-transform-size} @@ -2247,10 +2247,10 @@ If we apply a band-pass filter to the signal, as shown on figure [fig:zoom_bandp | ![](/ox-hugo/ewins00_zoom_range.png) | ![](/ox-hugo/ewins00_zoom_bandpass.png) | |------------------------------------------------|------------------------------------------| -| Spectrum of the signal | Band-pass filter | +| Spectrum of the signal | Band-pass filter | | width=\linewidth | width=\linewidth | - + {{< figure src="/ox-hugo/ewins00_zoom_result.png" caption="Figure 16: Effective frequency translation for zoom" >}} @@ -2322,7 +2322,7 @@ This is the traditional method of FRF measurement and involves the use of a swee It is necessary to check that progress through the frequency range is sufficiently slow to check that steady-state response conditions are attained. If excessive sweep rate is used, then distortions of the FRF plot are introduced as shown on figure [fig:sweep_distortions](#fig:sweep_distortions). - + {{< figure src="/ox-hugo/ewins00_sweep_distortions.png" caption="Figure 17: FRF measurements by sine sweep test" >}} @@ -2440,7 +2440,7 @@ It is known that a low coherence can arise in a measurement where the frequency This is known as a **bias** error and leakage is often the most likely source of low coherence on lightly-damped structures as shown on figure [fig:coherence_resonance](#fig:coherence_resonance). - + {{< figure src="/ox-hugo/ewins00_coherence_resonance.png" caption="Figure 18: Coherence \\(\gamma^2\\) and FRF estimate \\(H\_1(\omega)\\) for a lightly damped structure" >}} @@ -2483,7 +2483,7 @@ For the chirp and impulse excitations, each individual sample is collected and p Burst excitation signals consist of short sections of an underlying continuous signal (which may be a sine wave, a sine sweep or a random signal), followed by a period of zero output, resulting in a response which shows a transient build-up followed by a decay (see figure [fig:burst_excitation](#fig:burst_excitation)). - + {{< figure src="/ox-hugo/ewins00_burst_excitation.png" caption="Figure 19: Example of burst excitation and response signals" >}} @@ -2502,7 +2502,7 @@ The chirp consist of a short duration signal which has the form shown in figure The frequency content of the chirp can be precisely chosen by the starting and finishing frequencies of the sweep. - + {{< figure src="/ox-hugo/ewins00_chirp_excitation.png" caption="Figure 20: Example of chirp excitation and response signals" >}} @@ -2513,7 +2513,7 @@ The hammer blow produces an input and response as shown in the figure [fig:impul This and the chirp excitation are very similar in the analysis point of view, the main difference is that the chirp offers the possibility of greater control of both amplitude and frequency content of the input and also permits the input of a greater amount of vibration energy. - + {{< figure src="/ox-hugo/ewins00_impulsive_excitation.png" caption="Figure 21: Example of impulsive excitation and response signals" >}} @@ -2523,7 +2523,7 @@ However, it should be recorded that in the region below the first cut-off freque On some structures, the movement of the structure in response to the hammer blow can be such that it returns and **rebounds** on the hammer tip before the user has had time to move that out of the way. In such cases, the spectrum of the excitation is seen to have "holes" in it at certain frequencies (figure [fig:double_hits](#fig:double_hits)). - + {{< figure src="/ox-hugo/ewins00_double_hits.png" caption="Figure 22: Double hits time domain and frequency content" >}} @@ -2598,7 +2598,7 @@ Suppose the response parameter is acceleration, then the FRF obtained is inertan Figure [fig:calibration_setup](#fig:calibration_setup) shows a typical calibration setup. - + {{< figure src="/ox-hugo/ewins00_calibration_setup.png" caption="Figure 23: Mass calibration procedure, measurement setup" >}} @@ -2613,7 +2613,7 @@ This is because near resonance, the actual applied force becomes very small and This same argument applies on a lesser scale as we examine the detail around the attachment to the structure, as shown in figure [fig:mass_cancellation](#fig:mass_cancellation). - + {{< figure src="/ox-hugo/ewins00_mass_cancellation.png" caption="Figure 24: Added mass to be cancelled (crossed area)" >}} @@ -2670,7 +2670,7 @@ There are two problems to be tackled: The first of these is less difficult and techniques usually use a pair a matched conventional accelerometers placed at a short distance apart on the structure to be measured as shown on figure [fig:rotational_measurement](#fig:rotational_measurement). - + {{< figure src="/ox-hugo/ewins00_rotational_measurement.png" caption="Figure 25: Measurement of rotational response" >}} @@ -2691,7 +2691,7 @@ First, a single applied excitation force \\(F\_1\\) corresponds to a simultaneou Then, the same excitation force is applied at the second position that gives a force \\(F\_0 = F\_2\\) and moment \\(M\_0 = F\_2 l\_2\\). By adding and subtracting the responses produced by these two separate excitations conditions, we can deduce the translational and rotational responses to the translational force and the rotational moment separately, thus enabling the measurement of all four types of FRF: \\(X/F\\), \\(\Theta/F\\), \\(X/M\\) and \\(\Theta/M\\). - + {{< figure src="/ox-hugo/ewins00_rotational_excitation.png" caption="Figure 26: Application of moment excitation" >}} @@ -2700,7 +2700,7 @@ Then, the full \\(6 \times 6\\) mobility matrix can be measured, however this pr Other methods for measuring rotational effects include specially developed rotational accelerometers and shakers. However, there is a major problem that is encountered when measuring rotational FRF: the translational components of the structure's movement tends to overshadow those due to the rotational motions. -For example, the magnitude of the difference in equation [eq:rotational_diff](#eq:rotational_diff) is often of the order of \\(\SI{1}{\%}\\) of the two individual values which is similar to the transverse sensitivity of the accelerometers: potential errors in rotations are thus enormous. +For example, the magnitude of the difference in equation \eqref{eq:rotational_diff} is often of the order of \\(\SI{1}{\%}\\) of the two individual values which is similar to the transverse sensitivity of the accelerometers: potential errors in rotations are thus enormous. ### Multi-point excitation methods {#multi-point-excitation-methods} @@ -2739,7 +2739,7 @@ The two vectors are related by the system's FRF properties as: \\{X\\}\_{n\times 1} = [H(\omega)]\_{n\times p} \\{F\\}\_{p\times 1} \end{equation} -However, it is not possible to derive the FRF matrix from the single equation [eq:mpss_equation](#eq:mpss_equation), because there will be insufficient data in the two vectors (one of length \\(p\\), the other of length \\(n\\)) to define completely the \\(n\times p\\) FRF matrix. +However, it is not possible to derive the FRF matrix from the single equation \eqref{eq:mpss_equation}, because there will be insufficient data in the two vectors (one of length \\(p\\), the other of length \\(n\\)) to define completely the \\(n\times p\\) FRF matrix. What is required is to make a series of \\(p^\prime\\) measurements of the same basic type using different excitation vectors \\(\\{F\\}\_i\\) that should be chosen such that the forcing matrix \\([F]\_{p\times p^\prime} = [\\{F\\}\_1, \dots, \\{F\\}\_p]\\) is non-singular. This can be assured if: @@ -3031,7 +3031,7 @@ The two groups are usually separated by a clear gap (depending of the noise pres | ![](/ox-hugo/ewins00_PRF_numerical_FRF.png) | ![](/ox-hugo/ewins00_PRF_numerical_svd.png) | ![](/ox-hugo/ewins00_PRF_numerical_PRF.png) | |---------------------------------------------|---------------------------------------------|---------------------------------------------| -| FRF | Singular Values | PRF | +| FRF | Singular Values | PRF | | width=\linewidth | width=\linewidth | width=\linewidth | @@ -3042,7 +3042,7 @@ The two groups are usually separated by a clear gap (depending of the noise pres | ![](/ox-hugo/ewins00_PRF_measured_FRF.png) | ![](/ox-hugo/ewins00_PRF_measured_svd.png) | ![](/ox-hugo/ewins00_PRF_measured_PRF.png) | |--------------------------------------------|--------------------------------------------|--------------------------------------------| -| FRF | Singular Values | PRF | +| FRF | Singular Values | PRF | | width=\linewidth | width=\linewidth | width=\linewidth | @@ -3084,7 +3084,7 @@ Associated with the CMIF values at each natural frequency \\(\omega\_r\\) are tw - the left singular vector \\(\\{U(\omega\_r)\\}\_1\\) which approximates the **mode shape** of that mode - the right singular vector \\(\\{V(\omega\_r)\\}\_1\\) which represents the approximate **force pattern necessary to generate a response on that mode only** - + {{< figure src="/ox-hugo/ewins00_mifs.png" caption="Figure 27: Complex Mode Indicator Function (CMIF)" >}} @@ -3179,7 +3179,7 @@ The peak-picking method is applied as follows (illustrated on figure [fig:peak_a It must be noted that the estimates of both damping and modal constant depend heavily on the accuracy of the maximum FRF level \\(|\hat{H}|\\) which is difficult to measure with great accuracy, especially for lightly damped systems. Only real modal constants and thus real modes can be deduced by this method. - + {{< figure src="/ox-hugo/ewins00_peak_amplitude.png" caption="Figure 28: Peak Amplitude method of modal analysis" >}} @@ -3214,7 +3214,7 @@ A plot of the quantity \\(\alpha(\omega)\\) is given in figure [fig:modal_circle | ![](/ox-hugo/ewins00_modal_circle.png) | ![](/ox-hugo/ewins00_modal_circle_bis.png) | |----------------------------------------|--------------------------------------------------------------------| -| Properties | \\(\omega\_b\\) and \\(\omega\_a\\) points | +| Properties | \\(\omega\_b\\) and \\(\omega\_a\\) points | | width=\linewidth | width=\linewidth | For any frequency \\(\omega\\), we have the following relationship: @@ -3226,13 +3226,13 @@ For any frequency \\(\omega\\), we have the following relationship: \end{align} \end{subequations} -From [eq:modal_circle_tan](#eq:modal_circle_tan), we obtain: +From \eqref{eq:modal_circle_tan}, we obtain: \begin{equation} \omega^2 = \omega\_r^2 \left(1 - \eta\_r \tan\left(\frac{\theta}{2}\right) \right) \end{equation} -If we differentiate [eq:modal_circle_omega](#eq:modal_circle_omega) with respect to \\(\theta\\), we obtain: +If we differentiate \eqref{eq:modal_circle_omega} with respect to \\(\theta\\), we obtain: \begin{equation} \frac{d\omega^2}{d\theta} = \frac{-\omega\_r^2 \eta\_r}{2} \frac{\left(1 - (\omega/\omega\_r)^2\right)^2}{\eta\_r^2} @@ -3317,10 +3317,10 @@ The sequence is: Then we obtain the **center** and **radius** of the circle and the **quality factor** is the mean square deviation of the chosen points from the circle. 3. **Locate natural frequency, obtain damping estimate**. The rate of sweep through the region is estimated numerically and the frequency at which it reaches the maximum is deduced. - At the same time, an estimate of the damping is derived using [eq:estimate_damping_sweep_rate](#eq:estimate_damping_sweep_rate). + At the same time, an estimate of the damping is derived using \eqref{eq:estimate_damping_sweep_rate}. A typical example is shown on figure [fig:circle_fit_natural_frequency](#fig:circle_fit_natural_frequency). 4. **Calculate multiple damping estimates, and scatter**. - A set of damping estimates using all possible combination of the selected data points are computed using [eq:estimate_damping](#eq:estimate_damping). + A set of damping estimates using all possible combination of the selected data points are computed using \eqref{eq:estimate_damping}. Then, we can choose the damping estimate to be the mean value. We also look at the distribution of the obtained damping estimates as is permits a useful diagnostic of the quality of the entire analysis: - Good measured data should lead to a smooth plot of these damping estimates, any roughness of the surface can be explained in terms of noise in the original data. @@ -3328,7 +3328,7 @@ The sequence is: 5. **Determine modal constant modulus and argument**. The magnitude and argument of the modal constant is determined from the diameter of the circle and from its orientation relative to the Real and Imaginary axis. - + {{< figure src="/ox-hugo/ewins00_circle_fit_natural_frequency.png" caption="Figure 29: Location of natural frequency for a Circle-fit modal analysis" >}} @@ -3427,7 +3427,7 @@ we now have sufficient information to extract estimates for the four parameters
  1. Plot graphs of \\(m\_R(\Omega)\\) vs \\(\Omega^2\\) and of \\(m\_I(\Omega)\\) vs \\(\Omega^2\\) using the results from step 1., each time using a different measurement points as the fixing frequency \\(\Omega\_j\\)
  2. Determine the slopes of the best fit straight lines through these two plots, \\(n\_R\\) and \\(n\_I\\), and their intercepts with the vertical axis \\(d\_R\\) and \\(d\_I\\)
  3. -
  4. Use these four quantities, and equation [eq:modal_parameters_formula](#eq:modal_parameters_formula), to determine the **four modal parameters** required for that mode
  5. +
  6. Use these four quantities, and equation \eqref{eq:modal_parameters_formula}, to determine the **four modal parameters** required for that mode
This procedure which places more weight to points slightly away from the resonance region is likely to be less sensitive to measurement difficulties of measuring the resonance region. @@ -3453,7 +3453,7 @@ However, by the inclusion of two simple extra terms (the "**residuals**"), the m | ![](/ox-hugo/ewins00_residual_without.png) | ![](/ox-hugo/ewins00_residual_with.png) | |--------------------------------------------|-----------------------------------------| -| without residual | with residuals | +| without residual | with residuals | | width=\linewidth | width=\linewidth | If we regenerate an FRF curve from the modal parameters we have extracted from the measured data, we shall use a formula of the type @@ -3484,7 +3484,7 @@ The three terms corresponds to: These three terms are illustrated on figure [fig:low_medium_high_modes](#fig:low_medium_high_modes). - + {{< figure src="/ox-hugo/ewins00_low_medium_high_modes.png" caption="Figure 30: Numerical simulation of contribution of low, medium and high frequency modes" >}} @@ -3493,7 +3493,7 @@ From the sketch, it may be seen that within the frequency range of interest: - the first term tends to approximate to a **mass-like behavior** - the third term approximates to a **stiffness effect** -Thus, we have a basis for the residual terms and shall rewrite equation [eq:sum_modes](#eq:sum_modes): +Thus, we have a basis for the residual terms and shall rewrite equation \eqref{eq:sum_modes}: \begin{equation} H\_{jk}(\omega) \simeq -\frac{1}{\omega^2 M\_{jk}^R} + \sum\_{r=m\_1}^{m\_2} \left( \frac{{}\_rA\_{jk}}{\omega\_r^2 - \omega^2 + i \eta\_r \omega\_r^2} \right) + \frac{1}{K\_{jk}^R} @@ -3554,7 +3554,7 @@ We can write the receptance in the frequency range of interest as: In the previous methods, the second term was assumed to be a constant in the curve-fit procedure for mode \\(r\\). However, if we have good **estimates** for the coefficients which constitutes the second term, for example by having already completed an SDOF analysis, we may remove the restriction on the analysis. -Indeed, suppose we take a set of measured data points around the resonance at \\(\omega\_r\\), and that we can compute the magnitude of the second term in [eq:second_term_refinement](#eq:second_term_refinement), we then subtract this from the measurement and we obtain adjusted data points that are conform to a true SDOF behavior and we can use the same technique as before to obtain **improved estimated** to the modal parameters of more \\(r\\). +Indeed, suppose we take a set of measured data points around the resonance at \\(\omega\_r\\), and that we can compute the magnitude of the second term in \eqref{eq:second_term_refinement}, we then subtract this from the measurement and we obtain adjusted data points that are conform to a true SDOF behavior and we can use the same technique as before to obtain **improved estimated** to the modal parameters of more \\(r\\). This procedure can be repeated iteratively for all the modes in the range of interest and it can significantly enhance the quality of found modal parameters for system with **strong coupling**. @@ -3614,7 +3614,7 @@ If we further increase the generality by attaching a **weighting factor** \\(w\_ is minimized. -This is achieved by differentiating [eq:error_weighted](#eq:error_weighted) with respect to each unknown in turn, thus generating a set of as many equations as there are unknown: +This is achieved by differentiating \eqref{eq:error_weighted} with respect to each unknown in turn, thus generating a set of as many equations as there are unknown: \begin{equation} \frac{d E}{d q} = 0; \quad q = {}\_1A\_{jk}, {}\_2A\_{jk}, \dots @@ -3663,7 +3663,7 @@ leading to the modified, but more convenient version actually used in the analys \end{equation} In these expressions, only \\(m\\) modes are included in the theoretical FRF formula: the true number of modes, \\(N\\), is actually one of the **unknowns** to be determined during the analysis. -Equation [eq:rpf_error](#eq:rpf_error) can be rewritten as follows: +Equation \eqref{eq:rpf_error} can be rewritten as follows: \begin{equation} \begin{aligned} @@ -3717,7 +3717,7 @@ where \\([X], [Y], [Z], \\{G\\}\\) and \\(\\{F\\}\\) are known measured quantiti \end{equation} Once the solution has been obtained for the coefficients \\(a\_k, \dots , b\_k, \dots\\) then the second stage of the modal analysis can be performed in which the required **modal parameters are derived**. -This is usually done by solving the two polynomial expressions which form the numerator and denominator of equations [eq:frf_clasic](#eq:frf_clasic) and [eq:frf_rational](#eq:frf_rational): +This is usually done by solving the two polynomial expressions which form the numerator and denominator of equations \eqref{eq:frf_clasic} and \eqref{eq:frf_rational}: - the denominator is used to obtain the natural frequencies \\(\omega\_r\\) and damping factors \\(\xi\_r\\) - the numerator is used to determine the complex modal constants \\(A\_r\\) @@ -3785,7 +3785,7 @@ As an example, a set of mobilities measured are shown individually in figure [fi | ![](/ox-hugo/ewins00_composite_raw.png) | ![](/ox-hugo/ewins00_composite_sum.png) | |-------------------------------------------|-----------------------------------------| -| Individual curves | Composite curve | +| Individual curves | Composite curve | | width=\linewidth | width=\linewidth | The global analysis methods have the disadvantages first, that the computation power required is high and second that there may be valid reasons why the various FRF curves exhibit slight differences in their characteristics and it may not always be appropriate to average them. @@ -3949,7 +3949,7 @@ First, we note that from a single FRF curve, \\(H\_{jk}(\omega)\\), it is possib Now, although this gives us the natural frequency and damping properties directly, it does not explicitly yield the mode shape: only a modal constant \\({}\_rA\_{jk}\\) which is formed from the mode shape data. In order to extract the individual elements \\(\phi\_{jr}\\) of the mode shape matrix \\([\Phi]\\), it is necessary to make a series of measurements of specific FRFs including, especially, the point FRF at the excitation position. -If we measure \\(H\_{kk}\\), then by using [eq:modal_model_from_frf](#eq:modal_model_from_frf), we also obtain the specific elements in the mode shape matrix corresponding to the excitation point: +If we measure \\(H\_{kk}\\), then by using \eqref{eq:modal_model_from_frf}, we also obtain the specific elements in the mode shape matrix corresponding to the excitation point: \begin{equation} H\_{kk}(\omega) \longrightarrow \omega\_r, \eta\_r, {}\_rA\_{jk} \longrightarrow \phi\_{kr}; \quad r=1, m @@ -4332,7 +4332,7 @@ Measured coordinates of the test structure are first linked as shown on figure [ Then, the grid of measured coordinate points is redrawn on the same plot but this time displaced by an amount proportional to the corresponding element in the mode shape vector as shown on figure [fig:static_display](#fig:static_display) (b). The elements in the vector are scaled according the normalization process used (usually mass-normalized), and their absolute magnitudes have no particular significance. - + {{< figure src="/ox-hugo/ewins00_static_display.png" caption="Figure 31: Static display of modes shapes. (a) basic grid (b) single-frame deflection pattern (c) multiple-frame deflection pattern (d) complex mode (e) Argand diagram - quasi-real mode (f) Argand diagram - complex mode" >}} @@ -4377,7 +4377,7 @@ If we consider the first six modes of the beam, whose mode shapes are sketched i All the higher modes will be indistinguishable from these first few. This is a well known problem of **spatial aliasing**. - + {{< figure src="/ox-hugo/ewins00_beam_modes.png" caption="Figure 32: Misinterpretation of mode shapes by spatial aliasing" >}} @@ -4415,7 +4415,7 @@ In this respect, the demands of the response model are more stringent that those #### Synthesis of FRF curves {#synthesis-of-frf-curves} -One of the implications of equation [eq:regenerate_full_frf_matrix](#eq:regenerate_full_frf_matrix) is that **it is possible to synthesize the FRF curves which were not measured**. +One of the implications of equation \eqref{eq:regenerate_full_frf_matrix} is that **it is possible to synthesize the FRF curves which were not measured**. This arises because if we measured three individual FRF such as \\(H\_{ik}(\omega)\\), \\(H\_{jk}(\omega)\\) and \\(K\_{kk}(\omega)\\), then modal analysis of these yields the modal parameters from which it is possible to generate the FRF \\(H\_{ij}(\omega)\\), \\(H\_{jj}(\omega)\\), etc. However, it must be noted that there is an important **limitation to this procedure** which is highlighted in the example below. @@ -4440,7 +4440,7 @@ The inclusion of these two additional terms (obtained here only after measuring | ![](/ox-hugo/ewins00_H22_without_residual.png) | ![](/ox-hugo/ewins00_H22_with_residual.png) | |--------------------------------------------------------|-----------------------------------------------------------| -| Using measured modal data only | After inclusion of residual terms | +| Using measured modal data only | After inclusion of residual terms | | width=\linewidth | width=\linewidth | The appropriate expression for a "correct" response model, derived via a set of modal properties is thus @@ -4495,7 +4495,7 @@ If the transmissibility is measured during a modal test which has a single excit In general, the transmissibility **depends significantly on the excitation point** (\\({}\_iT\_{jk}(\omega) \neq {}\_qT\_{jk}(\omega)\\) where \\(q\\) is a different DOF than \\(i\\)) and it is shown on figure [fig:transmissibility_plots](#fig:transmissibility_plots). This may explain why transmissibilities are not widely used in modal analysis. - + {{< figure src="/ox-hugo/ewins00_transmissibility_plots.png" caption="Figure 33: Transmissibility plots" >}} @@ -4516,7 +4516,7 @@ The fact that the excitation force is not measured is responsible for the lack o | ![](/ox-hugo/ewins00_conventional_modal_test_setup.png) | ![](/ox-hugo/ewins00_base_excitation_modal_setup.png) | |---------------------------------------------------------|-------------------------------------------------------| -| Conventional modal test setup | Base excitation setup | +| Conventional modal test setup | Base excitation setup | | height=4cm | height=4cm | @@ -4541,7 +4541,7 @@ from which is would appear that we can write \end{aligned} \end{equation} -However, equation [eq:m_k_from_modes](#eq:m_k_from_modes) is **only applicable when we have available the complete \\(N \times N\\) modal model**. +However, equation \eqref{eq:m_k_from_modes} is **only applicable when we have available the complete \\(N \times N\\) modal model**. It is much more usual to have an incomplete model in which the eigenvector matrix is rectangle and, as such, is non-invertible. One step which can be made using the incomplete data is the construction of "pseudo" flexibility and inverse-mass matrices. diff --git a/content/book/hatch00_vibrat_matlab_ansys.md b/content/book/hatch00_vibrat_matlab_ansys.md new file mode 100644 index 0000000..b78cefc --- /dev/null +++ b/content/book/hatch00_vibrat_matlab_ansys.md @@ -0,0 +1,2139 @@ ++++ +title = "Vibration Simulation using Matlab and ANSYS" +author = ["Thomas Dehaeze"] +draft = false ++++ + +Tags +: [Finite Element Model]({{< relref "finite_element_model" >}}) + +Reference +: (Hatch, 2000) + +Author(s) +: Hatch, M. R. + +Year +: 2000 + +Matlab Code form the book is available [here](https://in.mathworks.com/matlabcentral/fileexchange/2186-vibration-simulation-using-matlab-and-ansys). + + +## Introduction {#introduction} + + + +The main goal of this book is to show how to take results of large dynamic finite element models and build small Matlab state space dynamic mechanical models for use in control system models. + + +### Modal Analysis {#modal-analysis} + +The diagram in Figure [1](#org6569db5) shows the methodology for analyzing a lightly damped structure using normal modes. + +
+
+ +The steps are: + +1. deriving the undamped equations of motion in physical coordinates +2. solving the eigenvalue problem, yielding eigenvalues (natural frequencies) and eigenvectors (mode shapes). + These first 2 steps are usually performed using a Finite Element software +3. transform the model from physical coordinate system to modal or principal coordinate system using the eigenvector matrix. + In the modal coordinate system, the original undamped **coupled** equations of motion are transform to the same number of undamped **uncoupled** equations representing the motion of a particular mode of vibration of the system. +4. proportional damping is applied +5. the uncoupled equations are easily solved (as each equation corresponds to a sdof system). + The desired responses are then back-transformed into the physical coordinate system using the eigenvector matrix. + +
+ + + +{{< figure src="/ox-hugo/hatch00_modal_analysis_flowchart.png" caption="Figure 1: Modal analysis method flowchart" >}} + + +### Model Size Reduction {#model-size-reduction} + +Because finite element models usually have a very large number of states, an important step is the reduction of the number of states while still providing correct responses for the forcing function input and desired output points. + +
+
+ +Figure [2](#org2fb61c6) shows such process, the steps are: + +- start with the finite element model +- compute the eigenvalues and eigenvectors (as many as dof in the model) +- the goal is then the reduce the size of the model while still maintaining the desired input/output relationships. + This is done in two steps: + 1. reduce the number of dof of the model from the original set to a new set which includes only those dof where forces are applied and where responses are desired + 2. reduce the number of modes of vibration used for the solution. + For SISO system, the modes are ranked based on the relative importance to the overall response. + For MIMO system, controllability and observability gramians of the modes are estimated. + +
+ + + +{{< figure src="/ox-hugo/hatch00_model_reduction_chart.png" caption="Figure 2: Model size reduction flowchart" >}} + + +### Notations {#notations} + +Tables [3](#org3e528f9), [2](#table--tab:notations-eigen-vectors-values) and [3](#table--tab:notations-stiffness-mass) summarize the notations of this document. + + +
+ Table 1: + Notation for the modes and nodes +
+ +| | Notation | +|-----------------------------------|------------| +| Number of Nodes | \\(n\\) | +| Number of Considered node inputs | \\(n\_i\\) | +| Number of Considered node outputs | \\(n\_o\\) | +| Reduced number of nodes | \\(n\_r\\) | +| Number of Modes | \\(m\\) | +| Reduced number of modes | \\(m\_r\\) | + + +
+ Table 2: + Notation for the dofs, eigenvectors and eigenvalues +
+ +| | Notation | Size | +|-------------------------|--------------------|------------------| +| Physical dofs | \\(\bm{z}\\) | \\(n \times 1\\) | +| Principal dofs | \\(\bm{z}\_p\\) | \\(m \times 1\\) | +| Modal Matrix | \\(\bm{z}\_m\\) | \\(n \times m\\) | +| Normalized Modal Matrix | \\(\bm{z}\_n\\) | \\(n \times m\\) | +| i'th eigenvector | \\(\bm{z}\_{mi}\\) | \\(n \times 1\\) | +| i'th eigenvalue | \\(\omega\_i\\) | \\(1 \times 1\\) | + + +
+ Table 3: + Notation for the mass and stiffness matrices +
+ +| | Notation | Size | +|---------------------------------------------|---------------------------------------------------|------------------| +| Physical Mass, Stiffness, Damping Matrices | \\(\bm{m}\\), \\(\bm{c}\\), \\(\bm{k}\\) | \\(n \times n\\) | +| Normalized Mass and Stiffness Matrices | \\(\bm{m}\_n\\), \\(\bm{k}\_n\\) | \\(m \times m\\) | +| Principal Mass, Stiffness, Damping Matrices | \\(\bm{m}\_p\\), \\(\bm{c}\_p\\), \\(\bm{k}\_p\\) | \\(m \times m\\) | +| Physical Force Vector | \\(\bm{F}\\) | \\(n \times 1\\) | +| Principal Force Vector | \\(\bm{F}\_p\\) | \\(m \times 1\\) | + + +## Zeros in SISO Mechanical Systems {#zeros-in-siso-mechanical-systems} + + +The origin and influence of poles are clear: they represent the resonant frequencies of the system, and for each resonance frequency, a mode shape can be defined to describe the motion at that frequency. + +We here which to give an intuitive understanding for **when to expect zeros in SISO mechanical systems** and **how to predict the frequencies at which they will occur**. + +Figure [3](#org3e528f9) shows a series arrangement of masses and springs, with a total of \\(n\\) masses and \\(n+1\\) springs. +The degrees of freedom are numbered from left to right, \\(z\_1\\) through \\(z\_n\\). + + + +{{< figure src="/ox-hugo/hatch00_n_dof_zeros.png" caption="Figure 3: n dof system showing various SISO input/output configurations" >}} + +
+
+ +(Denny Miu, 1993) shows that the zeros of any particular transfer function are the poles of the constrained system to the left and/or right of the system defined by constraining the one or two dof's defining the transfer function. + +The resonances of the "overhanging appendages" of the constrained system create the zeros. + +
+ + +## State Space Analysis {#state-space-analysis} + + + + +## Modal Analysis {#modal-analysis} + + + +Lightly damped structures are typically analyzed with the "normal mode" method described in this section. + +
+
+ +The modal method allows one to replace the n-coupled differential equations with n-uncoupled equations, where each uncoupled equation represents the motion of the system for that mode of vibration. + +The overall response of the system is then reconstructed as a superposition of the responses of the different modes of the system. + +
+ +Heavily damped structures or structures which explicit damping elements, such as dashpots, result in complex modes and require state space solution techniques using the original coupled equations of motion. +Thus, the present methods only works for lightly damped structures. + +
+
+ +Summarizing the modal analysis method of analyzing linear mechanical systems and the benefits derived: + +1. **Solve the undamped eigenvalue problem**, which identifies the resonant frequencies and mode shapes (eigenvalues and eigenvectors), useful in themselves for understanding basic motions of the system +2. **Use the eigenvectors to uncoupled or diagonalize the original set of coupled equations**, allowing the solution of n-uncoupled sdof problems instead of solving a set of n-coupled equations +3. **Calculate the contribution of each mode to the overall response**. + This also allows one to reduce the size of the problem by eliminating modes that cannot be excited and/or modes that have not output at the desired dof. + Also, high frequency modes that have little contribution to the system at lower frequencies can be eliminated or approximately accounted for, further reducing the size of the system to be analyzed +4. **Write the system matrix** \\(\bm{A}\\), by inspection. + **Assemble the input and output matrices**, \\(\bm{B}\\) and \\(\bm{C}\\), using appropriate eigenvector terms. + Frequency domain and forced transient response problems can be solved at this point. + If complete eigenvectors are available, initial condition transient problems can also be solved. + For lightly damped systems, proportional damping can be added, while still allowing the equations to be uncoupled. + +
+ + +### Eigenvalue Problem {#eigenvalue-problem} + + +#### Equation of Motion {#equation-of-motion} + +Let's consider the model shown in Figure [4](#orgc897d6a) with \\(k\_1 = k\_2 = k\\), \\(m\_1 = m\_2 = m\_3 = m\\) and \\(c\_1 = c\_2 = 0\\). + + + +{{< figure src="/ox-hugo/hatch00_undamped_tdof_model.png" caption="Figure 4: Undamped tdof model" >}} + +The equations of motions are: + +\begin{equation} +\begin{bmatrix} + m & 0 & 0 \\\\\\ + 0 & m & 0 \\\\\\ + 0 & 0 & m +\end{bmatrix} \begin{bmatrix} + \ddot{z}\_1 \\\\\\ + \ddot{z}\_2 \\\\\\ + \ddot{z}\_3 +\end{bmatrix} + \begin{bmatrix} + k & -k & 0 \\\\\\ + -k & 2k & -k \\\\\\ + 0 & -k & k +\end{bmatrix} \begin{bmatrix} + z\_1 \\\\\\ + z\_2 \\\\\\ + z\_3 +\end{bmatrix} = \begin{bmatrix} + 0 \\\\\\ + 0 \\\\\\ + 0 +\end{bmatrix} \label{eq:tdof\_eom} +\end{equation} + + +#### Principal Mode Definition {#principal-mode-definition} + +Since the system is conservative (it has no damping), normal modes of vibration will exist. + +
+
+ +Having normal modes means that at certain frequencies all points in the system will vibrate at the same frequency and in phase, i.e., **all points in the system will reach their minimum and maximum displacements at the same point in time**. + +
+ +Having normal modes can be expressed as: + +\begin{equation} + \bm{z}\_i = \bm{z}\_{mi} \sin(\omega\_i t + \phi\_i) = \bm{z}\_{mi} \text{Im}(e^{j\omega\_i t + \phi\_i}) \label{eq:principal\_mode} +\end{equation} + +where: + +- \\(\bm{z}\_i\\): vector of displacement for all dof's at the i'th frequency +- \\(\bm{z}\_{mi}\\): i'th eigenvector +- \\(\omega\_i\\): i'th eigenvalue +- \\(\phi\_i\\): an arbitrary initial phase angle + + +#### Eigenvalues / Characteristic Equation {#eigenvalues-characteristic-equation} + +Re-injecting normal modes \eqref{eq:principal_mode} into the equation of motion \eqref{eq:tdof_eom} gives the eigenvalue problem: + +\begin{equation} + (\bm{k} - \omega\_i^2 \bm{m}) \bm{z}\_{mi} = 0 +\end{equation} + +Solving this set of equation gives the eigenvalues: + +\begin{equation} + \omega\_1 = 0, \quad \omega\_2 = \pm\sqrt{\frac{3k}{m}}, \quad \omega\_3 = \pm\sqrt{\frac{k}{m}} +\end{equation} + + +#### Eigenvectors {#eigenvectors} + +To obtain the eigenvectors of the systems (corresponding to the eigenvalues), any one of the dof, say \\(z\_1\\), is selected as a reference. +This means that **the eigenvectors are only known as ratios of displacements, not as absolute magnitudes**. +Then, all but one of the equations of motion is written with that value on the right-hand side: + +\begin{equation} + (\bm{k} - \omega\_i^2 \bm{m}) \bm{z}\_{mi} = 0 +\end{equation} + +One then find: + +\begin{equation} + \bm{z}\_1 = \begin{bmatrix} + 1 \\\\\\ + 1 \\\\\\ + 1 + \end{bmatrix}, \quad \bm{z}\_2 = \begin{bmatrix} + 1 \\\\\\ + 0 \\\\\\ + -1 + \end{bmatrix}, \quad \bm{z}\_3 = \begin{bmatrix} + 1 \\\\\\ + -2 \\\\\\ + 1 + \end{bmatrix} +\end{equation} + +Virtual interpretation of the eigenvectors are shown in Figures [5](#org40e1b2b), [6](#orgbe3ed46) and [7](#org766efd1). + + + +{{< figure src="/ox-hugo/hatch00_tdof_mode_1.png" caption="Figure 5: Rigid-Body Mode, 0rad/s" >}} + + + +{{< figure src="/ox-hugo/hatch00_tdof_mode_2.png" caption="Figure 6: Second Model, Middle Mass Stationary, 1rad/s" >}} + + + +{{< figure src="/ox-hugo/hatch00_tdof_mode_3.png" caption="Figure 7: Third Mode, 1.7rad/s" >}} + + +#### Modal Matrix {#modal-matrix} + +The modal matrix is an \\(n \times m\\) matrix with columns corresponding to the \\(m\\) system eigenvectors as shown in Eq. \eqref{eq:modal_matrix} + +\begin{equation} + \bm{z}\_m = \begin{bmatrix} + \bm{z}\_1 & \bm{z}\_2 & \bm{z}\_3 +\end{bmatrix} = \begin{bmatrix} + z\_{m11} & z\_{m12} & z\_{m13} \\\\\\ + z\_{m21} & z\_{m22} & z\_{m23} \\\\\\ + z\_{m31} & z\_{m32} & z\_{m33} +\end{bmatrix} \label{eq:modal\_matrix} +\end{equation} + + +### Uncoupling the Equations of Motion {#uncoupling-the-equations-of-motion} + +At this point, the system is well defined in terms of natural frequencies and modes of vibration. +If any further information such as transient or frequency response is desired, solving for it would be laborious because the system equations are still coupled. + +It is thus useful to **transform the n-coupled second order differential equations to n-uncoupled second order differential equations by transforming from the physical coordinate system to a principal coordinate system**. + +In linear algebra terms, the transformation from physical to principal coordinates is known as a **change of basis**. + +
+
+ +There are many options for change of basis, but we will show that **when eigenvectors are used for the transformation, the principal coordinate system has a physical meaning: each of the uncoupled sdof systems represents the motion of a specific mode of vibration**. + +
+ +The n-uncoupled equations in the principal coordinate system can then be solved for the responses in the principal coordinate system using the well known solutions for the single dof systems. +The n-responses in the principal coordinate system can then be **transformed back** to the physical coordinate system to provide the actual response in physical coordinate. + +This procedure is schematically shown in Figure [8](#org9c058ac). + + + +{{< figure src="/ox-hugo/hatch00_schematic_modal_solution.png" caption="Figure 8: Roadmap for Modal Solution" >}} + +The condition to guarantee diagonalization is the existence of n-linearly independent eigenvectors, which is always the case if either: + +- the mass and stiffness matrices are both symmetric +- there are m-different eigenvalues (no repeating eigenvalues) + +We start with the Homogeneous equation of motion: + +\begin{equation} + \bm{m} \bm{\ddot{z}} + \bm{k} \bm{z} = 0 +\end{equation} + +Consider normal modes: \\(\bm{z}\_i = \bm{z}\_{mi} \sin(\omega\_i t + \phi\_i)\\): + +\begin{equation} + \bm{k} \bm{z}\_{mi} = \omega\_i^2 \bm{m} \bm{z}\_{mi} +\end{equation} + +Since \\(\bm{m}\\) and \\(\bm{k}\\) are symmetrical (\\(\bm{m}^T = \bm{m}\\), \\(\bm{k}^T = \bm{k}\\)), we find: + +\begin{equation} + (\omega\_i^2 - \omega\_j^2) \bm{z}\_{mj}^T \bm{m} \bm{z}\_{mi} = 0 +\end{equation} + +When \\(i \neq j\\), the term \\((\omega\_i^2 - \omega\_j^2)\\) cannot be equal to zero, meaning that: + +\begin{equation} + \bm{z}\_{mj}^T \bm{m} \bm{z}\_{mi} = m\_{ij} = 0 +\end{equation} + +where \\(m\_{ij}\\) is an off-diagonal term in the mass matrix of the principal coordinate system. +The two eigenvectors \\(\bm{z}\_{mi}\\) and \\(\bm{z}\_{mj}\\) are said to be orthogonal with respect to \\(\bm{m}\\). + +For \\(i = j\\), \\((\omega\_i^2 - \omega\_j^2) = 0\\), and thus the product \\(\bm{z}\_{mj}^T \bm{m} \bm{z}\_{mi}\\) can be set equal to any arbitrary constant \\(m\_{ii}\\): + +\begin{equation} + \bm{z}\_{mi}^T \bm{m} \bm{z}\_{mi} = m\_{ii} +\end{equation} + +This is where various **normalization** techniques for eigenvectors come into play. +The stiffness matrix \\(\bm{k}\\), is normalize the same manner. + + +### Normalizing Eigenvectors {#normalizing-eigenvectors} + +Because eigenvectors are only known as **ratios** of displacements, not as absolute magnitudes, we can choose how to normalize them. + + +#### Normalizing with Respect to Unity {#normalizing-with-respect-to-unity} + +One method is to normalize with respect to unity, making the **largest** element in each eigenvector equal to unity by dividing each column by its largest value. + +\begin{equation} + \bm{z}\_m = \begin{bmatrix} + 1 & 1 & 1 \\\\\\ + 1 & 0 & -2 \\\\\\ + 1 & -1 & 1 +\end{bmatrix} \Longrightarrow \bm{z}\_n \begin{bmatrix} + 1 & 1 & -0.5 \\\\\\ + 1 & 0 & 1 \\\\\\ + 1 & -1 & -0.5 +\end{bmatrix} +\end{equation} + +where the \\(n\\) in \\(\bm{z}\_n\\) refers to a "**normalized**" modal matrix. + +Transforming the mass and stiffness matrices give: + +\begin{equation} + \bm{m}\_n = \bm{z}\_n^T \bm{m} \bm{z}\_n = \begin{bmatrix} + 3m & 0 & 0 \\\\\\ + 0 & 2m & 0 \\\\\\ + 0 & 0 & 1.5m +\end{bmatrix}; \quad \bm{k}\_n = \bm{z}\_n^T \bm{k} \bm{z}\_n = \begin{bmatrix} + 0 & 0 & 0 \\\\\\ + 0 & 2k & 0 \\\\\\ + 0 & 0 & 4.5k +\end{bmatrix} +\end{equation} + + +#### Normalizing with Respect to Mass {#normalizing-with-respect-to-mass} + +Another method is to normalize with respect to mass using: + +\begin{equation} + \bm{z}\_{ni}^T \bm{m} \bm{z}\_{ni} = 1 +\end{equation} + +making **each diagonal mass term equal to 1**. +This is the method used by default in ANSYS. + +Each normalized eigenvector is defined as follows: + +\begin{equation} + \bm{z}\_{ni} = \frac{\bm{z}\_{mi}}{\sqrt{\bm{z}\_{mi}^T \bm{m} \bm{z}\_{mi}}} = \frac{\bm{z}\_{mi}}{q\_i} +\end{equation} + +And the normalized mass and stiffness matrices are: + +\begin{equation} + \bm{m}\_n = \begin{bmatrix} + 1 & 0 & 0 \\\\\\ + 0 & 1 & 0 \\\\\\ + 0 & 0 & 1 +\end{bmatrix}; \quad \bm{k}\_n = \begin{bmatrix} + 0 & 0 & 0 \\\\\\ + 0 & 1 & 0 \\\\\\ + 0 & 0 & 3 +\end{bmatrix} \frac{k}{m} +\end{equation} + +Note that the diagonal terms of the stiffness matrix are the squares of the corresponding three eigenvalues. +The normalized stiffness matrix is known as the **spectral matrix**. + +Normalizing with respect to mass results in an identify principal mass matrix and squares of the eigenvalues on the diagonal in the principal stiffness matrix, this normalization technique is thus very useful for the following reason. + +
+
+ +Since we know the form of the principal matrices when normalizing with respect to mass, no multiplying of modal matrices is actually required: **the homogeneous principal equations of motion can be written by inspection knowing only the eigenvalues**. + +
+ + +### Transforming Initial Conditions and Forces {#transforming-initial-conditions-and-forces} + +Let's determine how to transform initial conditions and forces to the principal coordinate system. +Then, we can solve for transient and forced responses in the principal coordinate system using the uncoupled equations. + +We start with the equation of motion in the physical coordinates: + +\begin{equation} + \bm{m} \ddot{\bm{z}} + \bm{k} \bm{z} = \bm{F} +\end{equation} + +Pre-multiplying by \\(\bm{z}\_n^T\\) and inserting \\(I = \bm{z}\_n \bm{z}\_n^{-1}\\) gives: + +\begin{equation} + \bm{z}\_n^T \bm{m} \bm{z}\_n \bm{z}\_n^{-1} \ddot{\bm{z}} + \bm{z}\_n^T \bm{k} \bm{z}\_n \bm{z}\_n^{-1} \bm{z} = \bm{z}\_n^T \bm{F} +\end{equation} + +Which is re-written in the following form: + +
+
+ +\begin{equation} + \bm{m}\_p \ddot{\bm{z}}\_p + \bm{k}\_p \bm{z}\_p = \bm{F}\_p +\end{equation} + +where: + +- \\(\bm{m}\_p = \bm{z}\_n^T \bm{m} \bm{z}\_n\\) the diagonal principal mass matrix +- \\(\bm{k}\_p = \bm{z}\_n^T \bm{k} \bm{z}\_n\\) the diagonal principal stiffness matrix +- \\(\ddot{\bm{z}}\_p = \bm{z}\_n^{-1} \ddot{\bm{z}}\\) acceleration vector in principal coordinates +- \\(\bm{z}\_p = \bm{z}\_n^{-1} \bm{z}\\) displacement vector in principal coordinates +- \\(\bm{F}\_p = \bm{z}\_n^T \bm{F}\\) force vector in principal coordinates + +
+ +The vectors of initial displacements \\(\bm{z}\_{op}\\) and velocities \\(\dot{\bm{z}}\_{op}\\) in the principal coordinate system can be expressed as: + +\begin{align} + \bm{z}\_{op} &= \bm{z}\_n^{-1} \bm{z}\_0 \\\\\\ + \dot{\bm{z}}\_{op} &= \bm{z}\_n^{-1} \dot{\bm{z}}\_0 +\end{align} + +where \\(\bm{z}\_0\\) and \\(\dot{\bm{z}}\_0\\) are the vectors of initial displacements and velocities in the physical coordinate system. + + +### Back-Transforming from Principal to Physical Coordinates {#back-transforming-from-principal-to-physical-coordinates} + +We have now everything required to solve the equations in the principal coordinate system. + +
+
+ +The variables in physical coordinates are the positions and velocities of the masses. +The variables in principal coordinates are the displacements and velocities of each mode of vibration. + +
+ +The equations in the principal coordinate system can easily be solved, since the equations are uncoupled. +We now need to **back transform** the results in the principal coordinate system to the physical coordinate system to get the final answer. + +We showed previously that the relationship between physical and principal coordinates is: + +\begin{equation} + \bm{z}\_n^{-1} \bm{z} = \bm{z}\_p +\end{equation} + +where: + +- \\(\bm{z}\_n\\) is the matrix containing the eigenvectors (\\(n \times m\\)) +- \\(\bm{z}\\) is the vector of physical coordinates (\\(n \times 1\\)) +- \\(\bm{z}\_p\\) is the vector of the principal coordinates (\\(m \times 1\\)) + +And thus, the displacement vector in physical coordinates is obtained by pre-multiplying the vector of displacement in principal coordinates by the normalized modal matrix \\(\bm{z}\_n\\): + +\begin{equation} + \bm{z} = \bm{z}\_n \bm{z}\_p +\end{equation} + + +### Reducing the model size when only selection degrees of freedom are required {#reducing-the-model-size-when-only-selection-degrees-of-freedom-are-required} + +The reduction of the number of degrees of freedom is one of the key steps in order to reduce the size of models derived from large finite element simulations. + +This can be done as only portions of the eigenvector matrix are needed when only defined dof's have forces applied and other dof's are needed for output. + +Let's first examine the force transformation from physical to principal coordinates: + +\begin{equation} + \bm{F}\_p = \bm{z}\_n^T \bm{F} = \begin{bmatrix} + z\_{n11} & z\_{n12} & z\_{n13} \\\\\\ + z\_{n21} & z\_{n22} & z\_{n23} \\\\\\ + z\_{n31} & z\_{n32} & z\_{n33} +\end{bmatrix}^T \begin{bmatrix} + F\_1 \\\\\\ + F\_2 \\\\\\ + F\_3 +\end{bmatrix} +\end{equation} + +If force is only to be applied on mass 1 (\\(F\_2 = F\_3 = 0\\)), then only the first row of the modal matrix is required to transform the force in physical coordinates to the force in principal coordinates. + +Let's now examine the displacement transformation from principal to physical coordinates: + +\begin{equation} + \bm{z} = \bm{z}\_n \bm{z}\_p = \begin{bmatrix} + z\_{n11} & z\_{n12} & z\_{n13} \\\\\\ + z\_{n21} & z\_{n22} & z\_{n23} \\\\\\ + z\_{n31} & z\_{n32} & z\_{n33} +\end{bmatrix} \begin{bmatrix} + z\_{p1} \\\\\\ + z\_{p2} \\\\\\ + z\_{p3} +\end{bmatrix} +\end{equation} + +And thus, if we are only interested in the physical displacement of the mass 2 (\\(z\_2 = z\_{n21} z\_{p1} + z\_{n22} z\_{p2} + z\_{n23} z\_{p3}\\)), only the second row of the modal matrix is required to transform the three displacements \\(z\_{p1}\\), \\(z\_{p2}\\), \\(z\_{p3}\\) in principal coordinates to \\(z\_2\\). + +
+
+ +**Only the rows of the modal matrix that correspond to degrees of freedom to which forces are applied and/or for which displacements are desired are required to complete the model.** + +
+ + +### Damping in Systems with Principal Modes {#damping-in-systems-with-principal-modes} + +If a mechanical system is designed with a specific viscous damping element, for example a dashpot, then that element can be added to the system as a viscous damper. +The resulting system is linear, but probably does not exhibit normal modes. +This leads to the inability to diagonalize and uncouple the equations of motion. + +Damping in typical structures arises from hysteresis losses in the materials as they are strained, in some cases from viscous losses due to structure/fluid interaction but more importantly form relative motion at the interfaces and boundaries where different parts are attached or grounded. +Unless a specific damping element is used in a structural design, most structures have damping which varies from mode to mode and will be in the range of 0.05% to 2% of critical damping. + + +#### Conditions Necessary for Existence of Principal Modes in Damped System {#conditions-necessary-for-existence-of-principal-modes-in-damped-system} + +With a conservative (undamped) system, normal modes of vibration will exist. +In order to have normal modes in a damped system, the modes shapes must be the same as for the undamped case, and the various parts of the system must pass through their minimum and maximum positions at the same instant in time. + +A sufficient condition for the existence of damped normal modes is that the **damping matrix be a linear combination of the mass of stiffness matrices**: + +\begin{equation} + \bm{c} = a \bm{m} + b \bm{k} +\end{equation} + +The damped equations of motion are: + +\begin{equation} + \bm{m} \ddot{\bm{z}} + \bm{c} \dot{z} + \bm{k} \bm{z} = \bm{F} +\end{equation} + +And the damping matrix expressed in the principal coordinates is: + +\begin{equation} + \bm{c}\_p = \bm{z}\_n^T \bm{c} \bm{z}\_n = a \bm{z}\_n^T \bm{m} \bm{z}\_n + b \bm{z}\_n^T \bm{k} \bm{z}\_n = a \bm{I} + b \bm{k}\_p +\end{equation} + +We note: + +\begin{equation} + c\_{pi} = a + b \omega\_i^2 = 2 \xi\_i \omega\_i +\end{equation} + +where \\(\xi\_i\\) is the percentage of critical damping for the i'th mode: + +\begin{equation} + \xi\_i = \frac{c\_i}{2 \sqrt{k\_{pi} m\_{pi}}} = \frac{c\_i}{2 m\_{pi} \sqrt{\omega\_i^2}} = \frac{a + b \omega\_i^2}{2 \omega\_i} +\end{equation} + +And the equation in principal coordinates becomes: + +\begin{equation} + \ddot{z}\_{pi} + 2 \xi\_i \omega\_i \dot{z}\_{pi} + \omega\_i^2 z\_{pi} = F\_{pi} +\end{equation} + +This type of damping is known as **proportional damping**, where the damping for each mode is proportional to the critical damping for that mode. + + +#### Simple Proportional Damping {#simple-proportional-damping} + +Viscous damping in each mode is taken to be an arbitrary percentage \\(\xi\\) of the critical damping \\(c\_{cr}\\): + +\begin{equation} + c = \frac{\xi}{2 \sqrt{k m}} = \xi \cdot c\_{cr} +\end{equation} + + +#### Proportional to Stiffness Matrix: "Relative" Damping {#proportional-to-stiffness-matrix-relative-damping} + +Recognizing that the higher modes of vibration damp out quickly, "relative" damping yields damping in proportion to frequencies in normal modes: + +\begin{equation} + \xi\_i = \frac{a + b\omega\_i^2}{2 \omega\_i} +\end{equation} + +If a value of \\(\xi\_1\\) for the first mode, is assumed: + +\begin{equation} + b = \frac{2 \xi\_1}{\omega\_1} +\end{equation} + +The value of the damping for any other mode is: + +\begin{equation} + \xi\_i = \xi\_1 \frac{\omega\_i}{\omega\_1} +\end{equation} + + +#### Proportional to Mass Matrix: "Absolute" Damping {#proportional-to-mass-matrix-absolute-damping} + +Absolute damping is based on making \\(b = 0\\), in which case the percentage of critical damping is inversely proportional to the natural frequency of each mode. + + +## Modal Analysis: State Space Form {#modal-analysis-state-space-form} + + +## Frequency Response: Modal Form {#frequency-response-modal-form} + + + +The procedure to obtain the frequency response from a modal form is as follow: + +- use the eigenvalues and eigenvectors to define the equations of motion in principal coordinates and to transform forces to principal coordinates +- use Laplace transform to obtain the transfer functions in principal coordinates +- back-transform the transfer functions to physical coordinates where the individual mode contributions will be evident + +This will be applied to the model shown in Figure [9](#orgbbe5276). + + + +{{< figure src="/ox-hugo/hatch00_tdof_model.png" caption="Figure 9: tdof undamped model for modal analysis" >}} + + +### Review from Previous Results {#review-from-previous-results} + +Since the problem we are solving is frequency response, or finding the steady state motion of each mass as a function of frequency and of applied forces, initial conditions are not required. + +From previous analysis, we know the eigenvalues and eigenvectors normalized with respect to mass: + +\begin{equation} + \omega\_1 = 0, \quad \omega\_2 = \pm\sqrt{\frac{3k}{m}}, \quad \omega\_3 = \pm\sqrt{\frac{k}{m}} +\end{equation} + +\begin{equation} + \bm{z}\_n = \frac{1}{\sqrt{m}} \begin{bmatrix} + \frac{1}{\sqrt{3}} & \frac{1}{\sqrt{2}} & \frac{1}{\sqrt{6}} \\\\\\ + \frac{1}{\sqrt{3}} & 0 & \frac{-2}{\sqrt{6}} \\\\\\ + \frac{1}{\sqrt{3}} & \frac{-1}{\sqrt{2}} & \frac{1}{\sqrt{6}} +\end{bmatrix} +\end{equation} + +Knowing that in principal coordinates the mass matrix is the identify matrix and the stiffness matrix is a diagonal matrix with the squares of the respect eigenvalues as terms, we can write the matrices by **inspection**: + +\begin{equation} + \bm{m}\_n = \begin{bmatrix} + 1 & 0 & 0 \\\\\\ + 0 & 1 & 0 \\\\\\ + 0 & 0 & 1 +\end{bmatrix}, \quad + \bm{k}\_n = \begin{bmatrix} + 0 & 0 & 0 \\\\\\ + 0 & 1 & 0 \\\\\\ + 0 & 0 & 3 +\end{bmatrix} \frac{k}{m} +\end{equation} + +The force vector in principal coordinates is: + +\begin{equation} + \bm{F}\_p = \bm{z}\_n^T \bm{F} +\end{equation} + +The equations of motion in principal coordinates are then: + +\begin{equation} + \bm{m}\_n \ddot{\bm{z}}\_p + \bm{k}\_n \bm{z}\_p = \bm{z}\_n^T \bm{F} +\end{equation} + +which give: + +\begin{align} + \ddot{z}\_{p1} &= (F\_1 + F\_2 + F\_3) \frac{1}{\sqrt{3m}} \\\\\\ + \ddot{z}\_{p2} + \frac{k}{m} z\_{p2} &= (F\_1 - F\_3) \frac{1}{\sqrt{2m}} \\\\\\ + \ddot{z}\_{p3} + \frac{3k}{m} z\_{p3} &= (F\_1 - 2 F\_2 + F\_3) \frac{1}{\sqrt{6m}} +\end{align} + + +### Transfer Functions - Laplace Transforms in Principal Coordinates {#transfer-functions-laplace-transforms-in-principal-coordinates} + +Taking the Laplace transform of each equation gives: + +\begin{equation} + \begin{bmatrix} + \frac{z\_{p1}}{F\_{1}} \\\\\\ + \frac{z\_{p2}}{F\_{1}} \\\\\\ + \frac{z\_{p3}}{F\_{1}} + \end{bmatrix} = \begin{bmatrix} + \frac{1}{s^{2}\sqrt{3m}} \\\\\\ + \frac{1}{(s^{2} + \omega\_{2}^{2})\sqrt{2m}} \\\\\\ + \frac{1}{(s^{2} + \omega\_{3}^{2})\sqrt{6m}} + \end{bmatrix} = \begin{bmatrix} + z\_{p11} \\\\\\ + z\_{p21} \\\\\\ + z\_{p31} +\end{bmatrix} +\end{equation} + +\begin{equation} + \begin{bmatrix} + \frac{z\_{p1}}{F\_{2}} \\\\\\ + \frac{z\_{p2}}{F\_{2}} \\\\\\ + \frac{z\_{p3}}{F\_{2}} + \end{bmatrix} = \begin{bmatrix} + \frac{1}{s^{2}\sqrt{3m}} \\\\\\ + 0 \\\\\\ + \frac{-2}{(s^{2} + \omega\_{3}^{2})\sqrt{6m}} + \end{bmatrix} = \begin{bmatrix} + z\_{p12} \\\\\\ + z\_{p22} \\\\\\ + z\_{p32} +\end{bmatrix} +\end{equation} + +\begin{equation} + \begin{bmatrix} + \frac{z\_{p1}}{F\_{3}} \\\\\\ + \frac{z\_{p2}}{F\_{3}} \\\\\\ + \frac{z\_{p3}}{F\_{3}} + \end{bmatrix} = \begin{bmatrix} + \frac{1}{s^{2}\sqrt{3m}} \\\\\\ + \frac{-1}{(s^{2} + \omega\_{2}^{2})\sqrt{2m}} \\\\\\ + \frac{1}{(s^{2} + \omega\_{3}^{2})\sqrt{6m}} + \end{bmatrix} = \begin{bmatrix} + z\_{p13} \\\\\\ + z\_{p23} \\\\\\ + z\_{p33} +\end{bmatrix} +\end{equation} + + +### Back-Transforming Mode Contributions to Transfer Functions in Physical Coordinates {#back-transforming-mode-contributions-to-transfer-functions-in-physical-coordinates} + +The transfer functions in principal coordinates can be back-transformed to physical coordinates. +This allows one to see the contributions of each mode, where \\(z\_{ij}\\) is the physical displacement at dof i due to a force at dof j: + +\begin{equation} + \bm{z} = \bm{z}\_n \bm{z}\_p +\end{equation} + +with: + +- \\(\bm{z}\\) physical displacements (\\(n \times 1\\)) +- \\(\bm{z}\_n\\) matrix of normalized eigenvectors (\\(n \times m\\)) +- \\(\bm{z}\_p\\) principal displacements (\\(m \times 1\\)) + +And the transfer functions \\(\frac{z\_i}{F\_j}\\) can be computed. +For instance, the contributions to the transfer function \\(\frac{z\_1}{F\_1}\\) are: + +\begin{align} + \frac{z\_1}{F\_1} &= \underbrace{z\_{n11} z\_{p11}}\_{\text{1st mode}} + \underbrace{z\_{n12} z\_{p21}}\_{\text{2nd mode}} + \underbrace{z\_{n13} z\_{p31}}\_{\text{3rd mode}} \\\\\\ + & = \frac{\frac{1}{3m}}{s^2} + \frac{\frac{1}{2m}}{s^2 + \omega\_2^2} + \frac{\frac{1}{6m}}{s^2 + \omega\_3^2} +\end{align} + + +### Forcing Function Combinations to Excite Single Mode {#forcing-function-combinations-to-excite-single-mode} + +It is instructive to see what types of forcing function combinations will excite each of the three modes separately. +From the definition of normal modes, we known that if the system is started from initial displacement conditions that match one of the normal modes, the system will respond at that only mode. + +An analogous situation exists for combinations of forcing functions. + +The forces transform in the principal coordinates using: + +\begin{equation} + \bm{F}\_p = \bm{z}\_n^T \bm{F} +\end{equation} + +
+
+ +Thus, if \\(\bm{F}\\) is aligned with \\(\bm{z}\_{ni}\\) (the i'th normalized eigenvector), then \\(\bm{F}\_p\\) will be null except for its i'th term and only the i'th mode will be excited. + +
+ + +### How Modes Combine to Create Transfer Functions {#how-modes-combine-to-create-transfer-functions} + +Any transfer function derived from the modal analysis is an additive combination of sdof systems. + +
+
+ +Each single degree of freedom system has a gain determined by the appropriate eigenvector entries and a resonant frequency given by the appropriate eigenvalue. + +It can be shown that for a general system with \\(m\\) undamped modes: + +\begin{equation} + \frac{z\_j}{F\_k} = \sum\_{i = 1}^m \frac{z\_{nji} z\_{nki}}{s^2 + \omega\_i^2} \label{eq:general\_add\_tf} +\end{equation} + +If modes have some damping: + +\begin{equation} + \frac{z\_j}{F\_k} = \sum\_{i = 1}^m \frac{z\_{nji} z\_{nki}}{s^2 + 2 \xi\_i \omega\_i s + \omega\_i^2} \label{eq:general\_add\_tf\_damp} +\end{equation} + +Equations \eqref{eq:general_add_tf} and \eqref{eq:general_add_tf_damp} shows that in general every transfer function is made up of **additive combinations of single degree of freedom systems**, with each system having its DC gain determined by the appropriate eigenvector entry product divided by the square of the eigenvalue, \\(z\_{nji} z\_{nki}/\omega\_i^2\\), and with resonant frequency defined by the eigenvalue \\(\omega\_i\\). + +
+ +Figure [10](#org4f8e313) shows the separate contributions of each mode to the total response \\(z\_1/F\_1\\). + + + +{{< figure src="/ox-hugo/hatch00_z11_tf.png" caption="Figure 10: Mode contributions to the transfer function from \\(F\_1\\) to \\(z\_1\\)" >}} + +The zeros for SISO transfer functions are the roots of the numerator, however, from modal analysis we can see that the zeros arise when modes combine with appropriate phase such that the resulting motion is null. + + +## SISO State Space Matlab Model from ANSYS Model {#siso-state-space-matlab-model-from-ansys-model} + + + + +### Introduction {#introduction} + +In this section is developed a SISO state space Matlab model from an ANSYS cantilever beam model as shown in Figure [11](#orgf61b7cd). +A z direction force is applied at the midpoint of the beam and z displacement at the tip is the output. +The objective is to provide the smallest Matlab state space model that accurately represents the pertinent dynamics. + + + +{{< figure src="/ox-hugo/hatch00_cantilever_beam.png" caption="Figure 11: Cantilever beam with forcing function at midpoint" >}} + +The steps to define the smallest model are: + +1. define the eigenvector elements for all modes for only the input and output degrees of freedom +2. analyze the modal contributions of all the modes and sort them to define which ones have the greatest contribution + +One method for reducing the size of a modal model is to simple truncate the higher frequency modes. +However, if truncation is performed without understanding the contributions of each of the modes to the response, several problems could arise. +One problem is that deleting a high frequency mode with a significant DC gain could adversely affect the model. + + +### ANSYS Eigenvalue Extraction Methods {#ansys-eigenvalue-extraction-methods} + +ANSYS has a number of different eigenvalue extraction techniques, but for most problems only two methods are commonly used: + +- The first method, **Block Lanczos**, is the fastest and calculates all the eigenvalues or eigenvectors in a specific frequency range. + This method is usually preferred as most practical models require knowledge of the modes from DC through a specified higher frequency. +- The second method, Reduced, performs a **Guyan reduction** on the model to reduce its size, then calculates all the eigenvalues for the reduced model. + Obtaining eigenvector components for the reduced degrees of freedom requires an additional calculation step in ANSYS. + This method is still useful to obtain a "super-element". + +We can choose to use ANSYS to output only the eigenvectors for nodes of interest or we can output the complete modal matrix and choose the appropriate rows of data within Matlab. + + +### Matlab State Space Model from ANSYS Eigenvalue Run {#matlab-state-space-model-from-ansys-eigenvalue-run} + +In order to obtain a State Space model of reasonable order, we need to rank the relative importance of the contributions of each of the individual modes. +To do so, we can use a **ranking of DC gains**. + +Once the modes are ranked, the most important can be selected for use, and modes with small DC gains are eliminated from the model. +The DC gain contributions of the eliminated modes are not included in the overall DC gain, so there is error in the low frequency gain. +In order to eliminate this error, the Matlab function `modred` is introduced. +Using `modred` is analogous to using Guyan reduction to reduce some less important degrees of freedom. + +We will discuss in this section two methods of sorting, one which is applicable for models with the same value of damping for all modes \\(\xi\_i = \xi\\) ("uniform" damping), and another which is applicable for models with different damping values for each mode ("non-uniform" damping). + +The general equation for the overall transfer function of undamped and damped systems are: + +\begin{align} + \frac{z\_j}{F\_k} &= \sum\_{i = 1}^m \frac{z\_{nji} z\_{nki}}{s^2 + \omega\_i^2} \\\\\\ + \frac{z\_j}{F\_k} &= \sum\_{i = 1}^m \frac{z\_{nji} z\_{nki}}{s^2 + 2 \xi\_i \omega\_i s + \omega\_i^2} +\end{align} + +The **DC gain** of the i'th mode can be obtained by substituting \\(s = j\omega = 0\\): + +\begin{equation} + \text{DC gain}\_i = \frac{z\_{ji}}{F\_{ki}} = \frac{z\_{nji} z\_{nki}}{\omega\_i^2} +\end{equation} + +where \\(z\_{nji} z\_{nki}\\) is the product of the j'th (output) row and k'th (force applied) row terms of the i'th eigenvector. + +At resonance, the **peak gain** amplitude of each mode is given by substituting \\(s = j \omega\_i\\): + +\begin{equation} + \text{Peak gain}\_i = \frac{z\_{ji}}{F\_{ki}} = \frac{-j}{2 \xi\_i} \frac{z\_{nji} z\_{nki}}{\omega\_i^2} +\end{equation} + +And we see that the peak gain for a mode is the DC gain of the same mode divided by \\(2 \xi\_i\\). + +If the same value of \\(\xi\\) is used for all modes, then all the DC gain terms are divided by the same \\(2 \xi\\) terms and the relative amplitude of the DC gains and peak gains are the same, so there is no difference between sorting a uniform damping model using DC gain or peak gain. + +However, if the modes have different damping the relationship between the DC gain and peak gain for all the modes is not a constant value and peak gain must be used to rank modes for importance. + +The Matlab command `modred` can be used for reducing models while retaining the overall system DC gain. +The `matchdc` gain option for the function `modred` reduces defined states by setting the derivatives of the states to be eliminated to zero, then solving for the remaining states. +The method essentially sets up the eliminated states to be "infinitely fast" and is analogous to Guyan reduction in that the low frequency effects of the eliminated states are included in the remaining states. +In thus case, `modred` produces a new state space model with a non-null \\(D\\) matrix meaning that the reduced system will have a flat response at high frequency which may not be desirable. + +The `truncate` method does not account for the DC gains of the unused modes, which can result in error in the low frequency portion of the frequency response. +However, the `truncate` method has the advantage that it does not exhibit the unusual high frequency direct transmission matrix related behavior of the `matchdc` method. + +If sorting of DC gain values is performed prior to the `truncate` operation, the system DC gain error may be acceptable while maintaining better high frequency performance. + + +## Ground Acceleration Matlab Model From ANSYS Model {#ground-acceleration-matlab-model-from-ansys-model} + + + + +### Model Description {#model-description} + + +### Initial ANSYS Model Comparison {#initial-ansys-model-comparison} + + +### Matlab State Space Model from Eigenvalue Run {#matlab-state-space-model-from-eigenvalue-run} + + +## SISO Disk Drive Actuator Model {#siso-disk-drive-actuator-model} + + + +In this section we wish to extract a SISO state space model from a Finite Element model representing a Disk Drive Actuator (Figure [12](#orgc2d185d)). + + +### Actuator Description {#actuator-description} + + + +{{< figure src="/ox-hugo/hatch00_disk_drive_siso_model.png" caption="Figure 12: Drawing of Actuator/Suspension system" >}} + +The primary motion of the actuator is rotation about the pivot bearing, therefore the final model has the coordinate system transformed from a Cartesian x,y,z coordinate system to a Cylindrical \\(r\\), \\(\theta\\) and \\(z\\) system, with the two origins coincident (Figure [13](#orgd4d4d64)). + + + +{{< figure src="/ox-hugo/hatch00_disk_drive_nodes_reduced_model.png" caption="Figure 13: Nodes used for reduced Matlab model. Shown with partial finite element mesh at coil" >}} + +For reduced models, we only require eigenvector information for dof where forces are applied and where displacements are required. +Figure [13](#orgd4d4d64) shows the nodes used for the reduced Matlab model. +The four nodes 24061, 24066, 24082 and 24087 are located in the center of the coil in the z direction and are used for simulating the VCM force. +The arrows at the nodes indicate the direction of forces. + +Nodes 22 and 10022 are the nodes for the top and bottom heads and are used for measurement. + + +### Ansys Actuator/Suspension Model Results {#ansys-actuator-suspension-model-results} + +A recommended sequence for analyzing dynamic finite element models is: + +1. Plot resonant frequencies versus mode numbers to get a feel for the frequency range. + See if there are any significant jumps in frequency between modes which can indicate the system transitioning from one type of characteristic motion to another. +2. Plot frequency responses to define which modes couple into the response. +3. Plot and animate the mode shapes that contribute to the response, identifying modes that couple into motions in directions of interest and those that do not. + Visually get a sense of how the geometry of the structure affects the modes. +4. Run parameter studies to understand the sensitivity of critical modes to design variables: dimensions, tolerances, material properties, etc. + + +### Ansys Output Example Listing {#ansys-output-example-listing} + +A small section of the exported `.eig` file from ANSYS is shown bellow.. + +```text +LOAD STEP= 1 SUBSTEP= 1 + FREQ= 8.1532 LOAD CASE= 0 + +THE FOLLOWING DEGREE OF FREEDOM RESULTS ARE IN THE GLOBAL COORDINATE SYSTEM + + NODE UX UY UZ ROTX ROTY ROTZ + 1 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 + 2 0.0000 1.1981 0.0000 -0.99396E-015-0.14742E-014 0.23368E-001 + 3 0.31447E-014 0.13758 0.31164E-014 0.33825E-014-0.24915E-015 0.81730E-002 + 4 -0.51842E-014 0.54120 -0.36031E-014 0.13267E-014 0.30620E-014 0.15962E-001 + 5 0.0000 4.5604 0.0000 0.50842E-015 0.21315E-015 0.43289E-001 +``` + +Important information are: + +- `SUBSTEP`: mode number +- `FREQ`: eigenvalue in Hz +- The eigenvector for the mode in all dofs for all nodes + + +### Inputs and Outputs definition {#inputs-and-outputs-definition} + +A unity force is applied at the coil, and evenly distributed among the four nodes. +This model is still considered as a **Single Input** model because the same force is applied to all four coil nodes, requiring only a single column vector for the input matrix \\(\bm{B}\\). + +To compute the DC gain and peak gain in that case, we define a **composite** forcing function which consists of the force applied to each node times the eigenvector value for that node, \\(\bm{F}\_p^T \bm{x}\_n\\). +The dimensions of this operation are \\((1 \times n) \times (n \times m) = (1 \times m)\\), so we have a composite force vector for each mode. + + +### Building Full State Space Matrices {#building-full-state-space-matrices} + +From Ansys, we have the eigenvalues \\(\omega\_i\\) and eigenvectors \\(\bm{z}\\). + + +## Balanced Reduction {#balanced-reduction} + + + +In this chapter another method of reducing models, “balanced reduction”, will be introduced and compared with the DC and peak gain ranking methods. + +This method uses the concepts of controllability and observability, commonly referenced in the control community. + +One issue with balanced reduction is that we lose the ability to directly identify individual modes in the reduced system model. +After balanced reduction one needs to examine the system matrix to identify which modes are included, while the dc and peak gain ranking techniques retain the identities of the individual modes. + +Unlike SISO models, which can be easily ranked using simple DC and peak gain techniques, **MIMO models will require the balanced reduction method because it easily handles the problem of ranking multiple inputs and outputs**. + + +### Reviewing DC gain raking {#reviewing-dc-gain-raking} + +So far we have used DC or peak gains of the individual modes to rank the importance of including each mode in the reduced system. + +For any mode, if the degree of freedom associated with the applied force has a zero value, then the force applied at the degree of freedom cannot excite that mode, so the DC and peak gains will also be zero and the mode be eliminated. + +Similarly, if the degree of freedom associated with the output has a zero value, then no matter how much force is applied to that mode, there will be no output, and the mode can be eliminated. + +A mode which cannot be excited by the applied force is said to be **uncontrollable**, and a mode which has no output in the desired direction is said to be **unobservable**. + + +### Controllability, Observability {#controllability-observability} + +For a state space system described by: + +\begin{align\*} + \dot{\bm{x}} &= \bm{A} \bm{x} + \bm{B} u \\\\\\ + \bm{y} &= \bm{C} \bm{x} +\end{align\*} + +the following definitions of controllability hold: + +1. If there is an input \\(u\\) that can move the system from some arbitrary state \\(\bm{x}\_1\\) to another arbitrary state \\(\bm{x}\_2\\) in a finite time, then the system is controllable +2. A controllability matrix \\(\bm{\mathcal{C}}\\) can be formed as: + + \begin{equation} + \bm{\mathcal{C}} = \begin{bmatrix} + \bm{B} & \bm{A} \bm{B} & \bm{A}^{2} \bm{B} & \dots & \bm{A}^{n-1} \bm{B} + \end{bmatrix} + \end{equation} + + If \\(\bm{\mathcal{C}}\\) has full (row) rank, the system is controllable. +3. Another definition of controllability involves the controllability gramian, \\(\bm{W}\_c\\), the solution of the Lyapunov equation: + + \begin{equation} + \bm{A} \bm{W}\_{c} + \bm{W}\_{c} \bm{A}^{T} + \bm{B} \bm{B}^{T} = 0 + \end{equation} + + defined as: + + \begin{equation} + \bm{W}\_{c} = \int\_{0}^{\infty} e^{\bm{A}\tau} \bm{B} \bm{B}^{T} e^{{\bm{A}^{T} \tau} d \tau} + \end{equation} + + If the solution \\(\bm{W}\_c\\) is non-singular, then the system is controllable. + + Diagonal elements of the controllability gramian give information about the **relative controllability of the different modes** and can be used in a manner similar to our use of DC gains to rank the relative controllability of individual modes. + + Gramians exists only for system that have all their poles with negative real parts. + Thus, if a system has rigid body modes, it should first be partitioned into rigid body dynamics and oscillatory dynamics and then the controllability gramian can be computed on the oscillatory partition. + +A similar set of definitions can be made for observability: + +1. If the initial state \\(\bm{x}\_0\\) of a system can be inferred from knowledge of the input \\(u\\) and output \\(\bm{y}\\) over a finite period of time \\((0, t)\\), then the system is said to be observable. +2. A observability matrix \\(\bm{\mathcal{O}}\\) can be formed as: + + \begin{equation} + \bm{\mathcal{O}} = \begin{bmatrix} + \bm{C} \\ \bm{C} \bm{A} \\ \bm{C} \bm{A}^{2} \\ \vdots \\ \bm{C} \bm{A}^{n-1} + \end{bmatrix} + \end{equation} + + If \\(\bm{\mathcal{O}}\\) has full (column) rank, the system is observable. +3. Another definition of observability involves the observability gramian, \\(\bm{W}\_o\\), the solution of the Lyapunov equation: + + \begin{equation} + \bm{A}^T \bm{W}\_{o} + \bm{W}\_{o} \bm{A} + \bm{C}^T \bm{C} = 0 + \end{equation} + + defined as: + + \begin{equation} + \bm{W}\_{o} = \int\_{0}^{\infty} e^{\bm{A}^T \tau} \bm{C}^T \bm{C} e^{{\bm{A} \tau} d \tau} + \end{equation} + + If the solution \\(\bm{W}\_o\\) is non-singular, then the system is observable. + + Diagonal elements of the observability gramian give information about the **relative observability of the different modes** and can be used in a manner similar to our use of DC gains to rank the relative observability of individual modes. + + +### Ranking Using Controllability/Observability {#ranking-using-controllability-observability} + +We could use the controllability curve to rank the states for controllability and eliminate those states with low controllability. +Alternately, we could use the observability curve to rank the states for observability and then eliminate states with low observability. +The problem with this approach is that the joint controllability/observability is not taken in account. + +To take into account both the observability and the controllability, we use the **Balance Reduction**. + + +### Balanced Reduction {#balanced-reduction} + +The balanced reduction is used to create a system with **identical diagonal controllability and observability Gramians**. +Since the two gramians are equal, either the diagonal of the controllability gramian or the diagonal of the observability gramian can be used to rank states for elimination. + +The diagonal terms of the joint gramian are squares of the Hankel singular values of the system. +The Hankel matrix is the product of the controllability and observability gramians. + +Because the controllability and observability gramians are identical, there is no ambiguity in deciding whether the most controllable or the most observable states should be chosen. +The **states to be kept are the states with the largest diagonal terms**. + + +## MIMO Two Stage Actuator Model {#mimo-two-stage-actuator-model} + + + +In this section, a MIMO two-stage actuator model is derived from a finite element model (Figure [14](#org781c515)). + + +### Actuator Description {#actuator-description} + + + +{{< figure src="/ox-hugo/hatch00_disk_drive_mimo_schematic.png" caption="Figure 14: Drawing of actuator/suspension system" >}} + +A piezo-actuator is now bounded into one side of each of the arms. +The piezo actuator consists of a ceramic element that changes size when a voltage is applied. + +Then the fine positioning motion of the piezo is used in conjunction with VCM's coarse positioning motion, higher servo bandwidth is possible. + +
+
+ +Instead of applying voltage as the input into the piezo elements, we will assume that we have calculated an equivalent set of forces which can be applied at the ends of the element that will replicate the voltage force function. +In this model, we will be applying forces to multiple nodes at the ends of both piezo elements. + +
+ +Since the same forces are being applied to both piezo elements, they represent the second input to the MIMO system, the first input being the coil force. + + +### Ansys Model Description {#ansys-model-description} + +In Figure [15](#org6316e01) are shown the principal nodes used for the model. + + + +{{< figure src="/ox-hugo/hatch00_disk_drive_mimo_ansys.png" caption="Figure 15: Nodes used for reduced Matlab model, shown with partial mesh at coil and piezo element" >}} + + +### Matlab Model {#matlab-model} + +For a SISO system, we can rank the relative importance of modes using two methods, by using DC or peak gains and by using balancing. +However, **for a MIMO system, balancing is the only practical solution**. + +If we were using DC gains to rank the modes, we would have to compute DC gains for the four combinations possible of the two inputs and two inputs. + +We would then see that the DC gains of the modes are not ranked to same way for different sets of input/output. +Especially, the modes important for the VCM are not the same than for the piezo. +If one were to choose a single ranking for the model which would take into account both inputs and both outputs, it is difficult to see how to do it given the DC gain rankings. +Thus the necessity of balanced reduction for MIMO models. + + +#### Balancing Reduction {#balancing-reduction} + +Balancing the system involves calculating gramians, which are only defined for negative definite systems. +This requires separating the rigid body mode from the oscillatory modes and balancing the oscillatory modes. +The system matrices are partitioned and a model of only oscillatory modes is created and balanced. +Plotting the diagonal gramian terms reveals the relative important of the states. + +The complete system is rebuilt by augmenting the rigid body mode with the reduced oscillatory modes. + + +## Matlab Simple Example {#matlab-simple-example} + + +### Problem Description {#problem-description} + +We define the system parameters. + +```matlab +m = 1; +k = 1; +``` + +We write the mass and stiffness matrices: + +```matlab +M = diag([m, m, m]); +K = [k, -k, 0; + -k, 2*k, -k; + 0, -k, k]; +``` + +Compute the eigenvalues and eigenvectors: + +```matlab +[z, w] = eig(M\K); +``` + +| | rad/s | +|----|-------| +| w1 | 0.0 | +| w2 | 1.0 | +| w3 | 3.0 | + +Normalization of the eigenvectors: + +```matlab +zn = z./sqrt(diag(z' * M * z)); +``` + +| zn1 | zn2 | zn3 | +|------|------|------| +| -0.6 | -0.7 | 0.4 | +| -0.6 | 0.0 | -0.8 | +| -0.6 | 0.7 | 0.4 | + +Non-necessary step: + +```matlab +Mn = zn' * M * zn; +Kn = zn' * K * zn; +``` + +By inspection: + +```matlab +Mn = eye(3); +Kn = w; % Shouldn't this be equal to w.^2 ? +``` + +We add some simple proportional damping: + +```matlab +xi = 0.03; +Cn = xi/2*sqrt(k*m) * eye(3); +``` + +The equations in the principal coordinates are: +\\[ \bm{m}\_n \ddot{\bm{z}}\_p + \bm{c}\_n \dot{\bm{z}}\_p + \bm{k}\_n \bm{z}\_p = \bm{F}\_p = \bm{z}\_n^T \bm{F} \\] + +Let's note +\\[ \bm{G}\_p(s) = \frac{\bm{z}\_p}{\bm{F}} \\] + +```matlab +Gp = (tf(Mn)*s^2 + tf(Cn)*s + tf(Kn))\tf(eye(3))*zn'; +``` + +```matlab +bodeFig({Gp(1,1), Gp(2,2), Gp(3,3)}) +``` + +And we have the Laplace transform in the principal coordinates. + +And to convert the modal displacement to the physical displacement, we use: +\\[ \bm{z} = \bm{z}\_n \bm{z}\_p \\] +And we note: +\\[ \bm{G}(s) = \bm{z}\_n\ bm{G}\_p(s) = \frac{\bm{z}}{\bm{F}} \\] + +```matlab +G = zn * Gp; +``` + + + +{{< figure src="/ox-hugo/hatch00_z13_tf.png" caption="Figure 16: Mode contributions to the transfer function from \\(F\_1\\) to \\(z\_3\\)" >}} + + + +{{< figure src="/ox-hugo/hatch00_z11_tf.png" caption="Figure 17: Mode contributions to the transfer function from \\(F\_1\\) to \\(z\_1\\)" >}} + + +## Matlab with ANSYS {#matlab-with-ansys} + + +### Extract values {#extract-values} + +```matlab +filename = 'files/cantbeam30bl.eig'; + +dir = 3; % UY +[xn, f0] = readEigFile(filename, dir); + +n_nodes = size(xn, 1); +n_modes = size(xn, 2); +``` + + +### Define Physical Inputs and Outputs {#define-physical-inputs-and-outputs} + +First, define the node numbers corresponding to the inputs and outputs + +```matlab +i_input = 14; +i_output = 29; +``` + + +### Define Damping {#define-damping} + +We here use uniform damping. + +```matlab +xi = 0.01; +``` + + +### Alternative Definition of the matrix A {#alternative-definition-of-the-matrix-a} + +I could define 2x2 sub-matrices each corresponding to a particular mode and then combine them using `blkdiag` command. + + +### All Modes Included in the Model {#all-modes-included-in-the-model} + +System Matrix - A + +```matlab +Adiag = zeros(2*n_modes,1); +Adiag(2:2:end) = -2*xi.*(2*pi*f0); + +Adiagsup = zeros(2*n_modes-1,1); +Adiagsup(1:2:end) = 1; + +Adiaginf = zeros(2*n_modes-1,1); +Adiaginf(1:2:end) = -(2*pi*f0).^2; + +A = diag(Adiag) + diag(Adiagsup, 1) + diag(Adiaginf, -1); +``` + +System Matrix - B + +```matlab +B = zeros(2*n_modes, length(i_input)); + +for i = 1:length(i_input) + % Physical Coordinates + Fp = zeros(n_nodes, 1); + Fp(i_input(i)) = 1; + + B(2:2:end, i) = xn'*Fp; +end +``` + +System Matrix - C + +```matlab +C = zeros(length(i_output), 2*n_modes); +C(:, 1:2:end) = xn(i_output, :); +``` + +System Matrix - D + +```matlab +D = zeros(length(i_output), length(i_input)); +``` + +State Space Model + +```matlab +G_f = ss(A, B, C, D); +``` + + +### Simple mode truncation {#simple-mode-truncation} + +Let's plot the frequency of the modes (Figure [18](#orgd322a53)). + + + +{{< figure src="/ox-hugo/hatch00_cant_beam_modes_freq.png" caption="Figure 18: Frequency of the modes" >}} + + + +{{< figure src="/ox-hugo/hatch00_cant_beam_unsorted_dc_gains.png" caption="Figure 19: Unsorted DC Gains" >}} + +Let's keep only the first 10 modes. + +```matlab +m_max = 10; +xn_t = xn(:, 1:m_max); +f0_t = f0(1:m_max); +``` + +```matlab +Adiag = zeros(2*m_max,1); +Adiag(2:2:end) = -2*xi.*(2*pi*f0_t); + +Adiagsup = zeros(2*m_max-1,1); +Adiagsup(1:2:end) = 1; + +Adiaginf = zeros(2*m_max-1,1); +Adiaginf(1:2:end) = -(2*pi*f0_t).^2; + +A = diag(Adiag) + diag(Adiagsup, 1) + diag(Adiaginf, -1); +``` + +System Matrix - B + +```matlab +B = zeros(2*m_max, length(i_input)); + +for i = 1:length(i_input) + % Physical Coordinates + Fp = zeros(n_nodes, 1); + Fp(i_input(i)) = 1; + + B(2:2:end, i) = xn_t'*Fp; +end +``` + +System Matrix - C + +```matlab +C = zeros(length(i_output), 2*m_max); +C(:, 1:2:end) = xn_t(i_output, :); +``` + +System Matrix - D + +```matlab +D = zeros(length(i_output), length(i_input)); +``` + +State Space Model + +```matlab +G_t = ss(A, B, C, D); +``` + + +### Modes sorted by their DC gain {#modes-sorted-by-their-dc-gain} + +Let's sort the modes by their DC gains and plot their sorted DC gains. + +```matlab +dc_gain = abs(xn(i_input, :).*xn(i_output, :))./(2*pi*f0).^2; + +[dc_gain_sort, index_sort] = sort(dc_gain, 'descend'); +``` + + + +{{< figure src="/ox-hugo/hatch00_cant_beam_sorted_dc_gains.png" caption="Figure 20: Sorted DC Gains" >}} + +Let's keep only the first 10 **sorted** modes. + +```matlab +m_max = 10; + +xn_s = xn(:, index_sort(1:m_max)); +f0_s = f0(index_sort(1:m_max)); +``` + +```matlab +Adiag = zeros(2*m_max,1); +Adiag(2:2:end) = -2*xi.*(2*pi*f0_s); + +Adiagsup = zeros(2*m_max-1,1); +Adiagsup(1:2:end) = 1; + +Adiaginf = zeros(2*m_max-1,1); +Adiaginf(1:2:end) = -(2*pi*f0_s).^2; + +A = diag(Adiag) + diag(Adiagsup, 1) + diag(Adiaginf, -1); +``` + +System Matrix - B + +```matlab +B = zeros(2*m_max, length(i_input)); + +for i = 1:length(i_input) + % Physical Coordinates + Fp = zeros(n_nodes, 1); + Fp(i_input(i)) = 1; + + B(2:2:end, i) = xn_s'*Fp; +end +``` + +System Matrix - C + +```matlab +C = zeros(length(i_output), 2*m_max); +C(:, 1:2:end) = xn_s(i_output, :); +``` + +System Matrix - D + +```matlab +D = zeros(length(i_output), length(i_input)); +``` + +State Space Model + +```matlab +G_s = ss(A, B, C, D); +``` + + +### Comparison {#comparison} + +```matlab +freqs = logspace(0, 5, 1000); + +figure; +hold on; +plot(freqs, abs(squeeze(freqresp(G_f, freqs, 'Hz'))), 'DisplayName', 'Full'); +plot(freqs, abs(squeeze(freqresp(G_t, freqs, 'Hz'))), 'DisplayName', 'Trun'); +plot(freqs, abs(squeeze(freqresp(G_s, freqs, 'Hz'))), 'DisplayName', 'Sort'); +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); +ylabel('Amplitude'); xlabel('Frequency [Hz]'); +legend(); +``` + + +### Effect of the Individual Modes {#effect-of-the-individual-modes} + +```matlab +freqs = logspace(0, 4, 1000); + +figure; +hold on; +for mode_i = 1:6 + A = zeros(2); + A(2,2) = -2*xi.*(2*pi*f0(mode_i)); + A(1,2) = 1; + A(2,1) = -(2*pi*f0(mode_i)).^2; + + B = [0; xn(i_input, mode_i)']; + + C = [xn(i_output, mode_i), 0]; + + D = zeros(length(i_output), length(i_input)); + + plot(freqs, abs(squeeze(freqresp(ss(A,B,C,D), freqs, 'Hz'))), ... + 'DisplayName', sprintf('Mode %i', mode_i)); +end +plot(freqs, abs(squeeze(freqresp(G_f, freqs, 'Hz'))), 'k--', ... + 'DisplayName', 'Full'); +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); +ylabel('Amplitude'); xlabel('Frequency [Hz]'); +legend(); +``` + + +### Non-Uniform Damping {#non-uniform-damping} + + +#### Definition of the Damping {#definition-of-the-damping} + +If we want to use Rayleigh damping: + +```matlab +a = 1e-2; +b = 1e-6; +xi = (a + b * (2*pi*f0).^2)./(2*pi*f0); +``` + + +#### System Creation {#system-creation} + +System Matrix - A + +```matlab +Adiag = zeros(2*n_modes,1); +Adiag(2:2:end) = -2*xi.*(2*pi*f0); + +Adiagsup = zeros(2*n_modes-1,1); +Adiagsup(1:2:end) = 1; + +Adiaginf = zeros(2*n_modes-1,1); +Adiaginf(1:2:end) = -(2*pi*f0).^2; + +A = diag(Adiag) + diag(Adiagsup, 1) + diag(Adiaginf, -1); +``` + +System Matrix - B + +```matlab +B = zeros(2*n_modes, length(i_input)); + +for i = 1:length(i_input) + % Physical Coordinates + Fp = zeros(n_nodes, 1); + Fp(i_input(i)) = 1; + + B(2:2:end, i) = xn'*Fp; +end +``` + +System Matrix - C + +```matlab +C = zeros(length(i_output), 2*n_modes); +C(:, 1:2:end) = xn(i_output, :); +``` + +System Matrix - D + +```matlab +D = zeros(length(i_output), length(i_input)); +``` + +State Space Model + +```matlab +G_d = ss(A, B, C, D); +``` + + +#### Comparison with Uniform Damping {#comparison-with-uniform-damping} + +```matlab +freqs = logspace(0, 5, 1000); + +figure; +hold on; +plot(freqs, abs(squeeze(freqresp(G_f, freqs, 'Hz'))), 'DisplayName', 'Uniform Damping'); +plot(freqs, abs(squeeze(freqresp(G_d, freqs, 'Hz'))), 'DisplayName', 'Non-Uniform Damping'); +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); +ylabel('Amplitude'); xlabel('Frequency [Hz]'); +legend(); +``` + + +#### Modes sorted by their peak gain {#modes-sorted-by-their-peak-gain} + +Let's sort the modes by their peak gains and plot their sorted peak gains. + +```matlab +dc_gain = abs(xn(i_input, :).*xn(i_output, :))./(2*pi*f0).^2; +peak_gain = dc_gain./xi; + +[peak_gain_sort, index_sort] = sort(peak_gain, 'descend'); +``` + +Let's keep only the first 10 **sorted** modes. + +```matlab +m_max = 10; + +xn_s = xn(:, index_sort(1:m_max)); +f0_s = f0(index_sort(1:m_max)); +xi_x = xi(index_sort(1:m_max)); +``` + +```matlab +Adiag = zeros(2*m_max,1); +Adiag(2:2:end) = -2*xi_s.*(2*pi*f0_s); + +Adiagsup = zeros(2*m_max-1,1); +Adiagsup(1:2:end) = 1; + +Adiaginf = zeros(2*m_max-1,1); +Adiaginf(1:2:end) = -(2*pi*f0_s).^2; + +A = diag(Adiag) + diag(Adiagsup, 1) + diag(Adiaginf, -1); +``` + +System Matrix - B + +```matlab +B = zeros(2*m_max, length(i_input)); + +for i = 1:length(i_input) + % Physical Coordinates + Fp = zeros(n_nodes, 1); + Fp(i_input(i)) = 1; + + B(2:2:end, i) = xn_s'*Fp; +end +``` + +System Matrix - C + +```matlab +C = zeros(length(i_output), 2*m_max); +C(:, 1:2:end) = xn_s(i_output, :); +``` + +System Matrix - D + +```matlab +D = zeros(length(i_output), length(i_input)); +``` + +State Space Model + +```matlab +G_p = ss(A, B, C, D); +``` + +```matlab +freqs = logspace(0, 5, 1000); + +figure; +hold on; +plot(freqs, abs(squeeze(freqresp(G_f, freqs, 'Hz'))), 'DisplayName', 'Uniform Damping'); +plot(freqs, abs(squeeze(freqresp(G_d, freqs, 'Hz'))), 'DisplayName', 'Non-Uniform Damping'); +plot(freqs, abs(squeeze(freqresp(G_p, freqs, 'Hz'))), 'DisplayName', 'Peak sort'); +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log'); +ylabel('Amplitude'); xlabel('Frequency [Hz]'); +legend(); +``` + + +### MIMO System {#mimo-system} + + +#### Inputs and Outputs {#inputs-and-outputs} + +Let's choose two inputs and two outputs. + +```matlab +i_input = [14, 31]; +i_output = [14, 31]; +``` + + +#### System Matrices {#system-matrices} + +System Matrix - A + +```matlab +Adiag = zeros(2*n_modes,1); +Adiag(2:2:end) = -2*xi.*(2*pi*f0); + +Adiagsup = zeros(2*n_modes-1,1); +Adiagsup(1:2:end) = 1; + +Adiaginf = zeros(2*n_modes-1,1); +Adiaginf(1:2:end) = -(2*pi*f0).^2; + +A = diag(Adiag) + diag(Adiagsup, 1) + diag(Adiaginf, -1); +``` + +System Matrix - B + +```matlab +B = zeros(2*n_modes, length(i_input)); + +for i = 1:length(i_input) + % Physical Coordinates + Fp = zeros(n_nodes, 1); + Fp(i_input(i)) = 1; + + B(2:2:end, i) = xn'*Fp; +end +``` + +System Matrix - C + +```matlab +C = zeros(length(i_output), 2*n_modes); +C(:, 1:2:end) = xn(i_output, :); +``` + +System Matrix - D + +```matlab +D = zeros(length(i_output), length(i_input)); +``` + +State Space Model + +```matlab +G_m = ss(A, B, C, D); +``` + + +#### Balancing Reduction {#balancing-reduction} + +First, we have to make sure that the rigid body mode is not included in the system (here it is not). + +Then, we compute the controllability and observability gramians. + +```matlab +wc = gram(G_m, 'c'); +wo = gram(G_m, 'o'); +``` + +And we plot the diagonal terms + + + +{{< figure src="/ox-hugo/hatch00_gramians.png" caption="Figure 21: Observability and Controllability Gramians" >}} + +We use `balreal` to rank oscillatory states. + +> [SYSB,G] = BALREAL(SYS) computes a balanced state-space realization for +> the stable portion of the linear system SYS. For stable systems, SYSB +> is an equivalent realization for which the controllability and +> observability Gramians are equal and diagonal, their diagonal entries +> forming the vector G of Hankel singular values. Small entries in G +> indicate states that can be removed to simplify the model (use MODRED +> to reduce the model order). + +```matlab +[G_b, G, T, Ti] = balreal(G_m); +``` + + + +{{< figure src="/ox-hugo/hatch00_cant_beam_gramian_balanced.png" caption="Figure 22: Sorted values of the Gramian of the balanced realization" >}} + +Now we can choose the number of states to keep. + +```matlab +n_states_b = 20; +``` + +We now use `modred` to define reduced order oscillatory system using `mathdc` or `truncate` option. + +> MODRED Model simplification by state elimination. +> +> RSYS = MODRED(SYS,ELIM) simplifies the state-space model SYS by +> discarding the states specified in the vector ELIM. The full state +> vector X is partitioned as X = [X1;X2] where Xr=X1 is the reduced +> state vector and X2 is discarded. + +```matlab +G_br = modred(G_b, n_states_b+1:size(A,1), 'truncate'); +``` + +If needed, the rigid body mode should be added to the reduced system. + +And other option is to specify the minimum value of the gramians diagonal elements for the modes to keep. + +```matlab +G_min = 1e-4; +G_br = modred(G_b, G\d+),(?\d+)\]:(?[^\[]+)', 'names'); + +row = cellfun(@str2double, {parts.row}, 'UniformOutput', true); +col = cellfun(@str2double, {parts.col}, 'UniformOutput', true); +val = cellfun(@str2double, {parts.val}, 'UniformOutput', true); + +sz = [max(row), max(col)]; % size of output matrix +MatK = zeros(sz); % preallocate size +ix = sub2ind(sz, row, col); % get matrix positions +MatK(ix)= val; % assign data +``` + +```matlab +str = fileread('files/Mdense.txt'); +% Remove spaces +str = regexprep(str,'\s+',''); +% Regex to get the data +parts = regexp(str, '\[(?\d+),(?\d+)\]:(?[^\[]+)', 'names'); + +row = cellfun(@str2double, {parts.row}, 'UniformOutput', true); +col = cellfun(@str2double, {parts.col}, 'UniformOutput', true); +val = cellfun(@str2double, {parts.val}, 'UniformOutput', true); + +sz = [max(row), max(col)]; % size of output matrix +MatM = zeros(sz); % preallocate size +ix = sub2ind(sz, row, col); % get matrix positions +MatM(ix)= val; % assign data +``` + +Find inputs/outputs: + +```matlab +i_input = 14; +i_output = 29; + + +``` + +Correspondence with DOF: + +```matlab +a = readtable('files/Mass_HB.mapping', 'FileType', 'text'); +KM_i = strcmpi(a{:, 3},{'UZ'}); + +MatM = MatM(KM_i, KM_i); +MatK = MatK(KM_i, KM_i); +``` + + +### Read Position of Nodes {#read-position-of-nodes} + +```matlab +a = readmatrix('files/FEA-poutre-noeuds.txt'); +pos = a(:, 4:6); +node_i = a(:, 7); +``` + +```matlab +figure; +hold on; +plot3(pos(:,1),pos(:,3),pos(:,3), 'ko') +text(pos(:,1),pos(:,3),pos(:,3), num2cell(node_i)) +``` + + +### Reduced order model {#reduced-order-model} + +Define Physical Inputs and Outputs + +```matlab +i_input = 14; +i_output = 29; +``` + +Damping + +```matlab +xi = 0.01; +``` + +```matlab +dc_gain = abs(xn(i_input, :).*xn(i_output, :))./(2*pi*f0).^2; + +[dc_gain_sort, index_sort] = sort(dc_gain, 'descend'); +``` + +```matlab +m_max = 13; + +xn_s = xn(:, index_sort(1:m_max)); +f0_s = f0(index_sort(1:m_max)); +``` + +```matlab +Adiag = zeros(2*m_max,1); +Adiag(2:2:end) = -2*xi.*(2*pi*f0_s); + +Adiagsup = zeros(2*m_max-1,1); +Adiagsup(1:2:end) = 1; + +Adiaginf = zeros(2*m_max-1,1); +Adiaginf(1:2:end) = -(2*pi*f0_s).^2; + +A = diag(Adiag) + diag(Adiagsup, 1) + diag(Adiaginf, -1); +``` + +System Matrix - B + +```matlab +B = zeros(2*m_max, length(i_input)); + +for i = 1:length(i_input) + % Physical Coordinates + Fp = zeros(n_nodes, 1); + Fp(i_input(i)) = 1; + + B(2:2:end, i) = xn_s'*Fp; +end +``` + +System Matrix - C + +```matlab +C = zeros(length(i_output), 2*m_max); +C(:, 1:2:end) = xn_s(i_output, :); +``` + +System Matrix - D + +```matlab +D = zeros(length(i_output), length(i_input)); +``` + +State Space Model + +```matlab +G_s = ss(A, B, C, D); +``` + + +### Generate Mass and Stiffness matrices {#generate-mass-and-stiffness-matrices} + +Full Mass and Stiffness matrices in the principal coordinates: + +```matlab +Mp = eye(length(f0)); +Kp = xn'*diag((2*pi*f0).^2)/xn; +``` + +Reduced Mass and Stiffness matrices in the principal coordinates: + +```matlab +Mr = Mp() +Kr = xn'*diag((2*pi*f0).^2)/xn; +``` + +Reduced Mass and Stiffness matrices in the physical coordinates: + +```matlab + +``` + +```matlab +M = xn_s*eye(m_max)/xn_s; +K = xn_s*diag((2*pi*f0_s).^2)/xn_s; +``` + +```matlab +% M = xn*eye(length(f0))/xn; +% K = xn*diag((2*pi*f0).^2)/xn; + +M = eye(length(f0)); +K = xn*diag((2*pi*f0).^2)/xn; +``` + + +### Frames for Simscape {#frames-for-simscape} + +```matlab +pos_frames = pos([1, i_input, i_output], :); +``` + + +## Import super-element from Ansys {#import-super-element-from-ansys} + +# Bibliography +Hatch, M. R., *Vibration simulation using matlab and ansys* (2000), : CRC Press. [↩](#484c4fad309f6b0e866a7cacf4653d74) + +Miu, D. K., *Mechatronics: electromechanics and contromechanics* (1993), : Springer-Verlag New York. [↩](#2169677da08094824a29bd3231ea1264) + + +## Backlinks {#backlinks} + +- [Finite Element Model]({{< relref "finite_element_model" >}}) diff --git a/content/book/preumont18_vibrat_contr_activ_struc_fourt_edition.md b/content/book/preumont18_vibrat_contr_activ_struc_fourt_edition.md index 5b6f2c8..4d5a063 100644 --- a/content/book/preumont18_vibrat_contr_activ_struc_fourt_edition.md +++ b/content/book/preumont18_vibrat_contr_activ_struc_fourt_edition.md @@ -61,11 +61,11 @@ There are two radically different approached to disturbance rejection: feedback #### Feedback {#feedback} - + {{< figure src="/ox-hugo/preumont18_classical_feedback_small.png" caption="Figure 1: Principle of feedback control" >}} -The principle of feedback is represented on figure [fig:classical_feedback_small](#fig:classical_feedback_small). The output \\(y\\) of the system is compared to the reference signal \\(r\\), and the error signal \\(\epsilon = r-y\\) is passed into a compensator \\(K(s)\\) and applied to the system \\(G(s)\\), \\(d\\) is the disturbance. +The principle of feedback is represented on figure [1](#orgff2b033). The output \\(y\\) of the system is compared to the reference signal \\(r\\), and the error signal \\(\epsilon = r-y\\) is passed into a compensator \\(K(s)\\) and applied to the system \\(G(s)\\), \\(d\\) is the disturbance. The design problem consists of finding the appropriate compensator \\(K(s)\\) such that the closed-loop system is stable and behaves in the appropriate manner. In the control of lightly damped structures, feedback control is used for two distinct and complementary purposes: **active damping** and **model-based feedback**. @@ -87,12 +87,12 @@ The objective is to control a variable \\(y\\) to a desired value \\(r\\) in spi #### Feedforward {#feedforward} - + {{< figure src="/ox-hugo/preumont18_feedforward_adaptative.png" caption="Figure 2: Principle of feedforward control" >}} The method relies on the availability of a **reference signal correlated to the primary disturbance**. -The idea is to produce a second disturbance such that is cancels the effect of the primary disturbance at the location of the sensor error. Its principle is explained in figure [2](#orgf21f883). +The idea is to produce a second disturbance such that is cancels the effect of the primary disturbance at the location of the sensor error. Its principle is explained in figure [2](#orgc74bab2). The filter coefficients are adapted in such a way that the error signal at one or several critical points is minimized. @@ -123,11 +123,11 @@ The table [1](#table--tab:adv-dis-type-control) summarizes the main features of ### The Various Steps of the Design {#the-various-steps-of-the-design} - + {{< figure src="/ox-hugo/preumont18_design_steps.png" caption="Figure 3: The various steps of the design" >}} -The various steps of the design of a controlled structure are shown in figure [3](#orgca19f4b). +The various steps of the design of a controlled structure are shown in figure [3](#org4c2b243). The **starting point** is: @@ -154,14 +154,14 @@ If the dynamics of the sensors and actuators may significantly affect the behavi ### Plant Description, Error and Control Budget {#plant-description-error-and-control-budget} -From the block diagram of the control system (figure [fig:general_plant](#fig:general_plant)): +From the block diagram of the control system (figure [4](#org1c8100c)): \begin{align\*} y &= (I - G\_{yu}H)^{-1} G\_{yw} w\\\\\\ z &= T\_{zw} w = [G\_{zw} + G\_{zu}H(I - G\_{yu}H)^{-1} G\_{yw}] w \end{align\*} - + {{< figure src="/ox-hugo/preumont18_general_plant.png" caption="Figure 4: Block diagram of the control System" >}} @@ -186,12 +186,12 @@ Even more interesting for the design is the **Cumulative Mean Square** response It is a monotonously decreasing function of frequency and describes the contribution of all frequencies above \\(\omega\\) to the mean-square value of \\(z\\). \\(\sigma\_z(0)\\) is then the global RMS response. -A typical plot of \\(\sigma\_z(\omega)\\) is shown figure [fig:cas_plot](#fig:cas_plot). +A typical plot of \\(\sigma\_z(\omega)\\) is shown figure [5](#orgbde617f). It is useful to **identify the critical modes** in a design, at which the effort should be targeted. The diagram can also be used to **assess the control laws** and compare different actuator and sensor configuration. - + {{< figure src="/ox-hugo/preumont18_cas_plot.png" caption="Figure 5: Error budget distribution in OL and CL for increasing gains" >}} @@ -398,11 +398,11 @@ With: D\_i(\omega) = \frac{1}{1 - \omega^2/\omega\_i^2 + 2 j \xi\_i \omega/\omega\_i} \end{equation} - + {{< figure src="/ox-hugo/preumont18_neglected_modes.png" caption="Figure 6: Fourier spectrum of the excitation \\(F\\) and dynamic amplitification \\(D\_i\\) of mode \\(i\\) and \\(k\\) such that \\(\omega\_i < \omega\_b\\) and \\(\omega\_k \gg \omega\_b\\)" >}} -If the excitation has a limited bandwidth \\(\omega\_b\\), the contribution of the high frequency modes \\(\omega\_k \gg \omega\_b\\) can be evaluated by assuming \\(D\_k(\omega) \approx 1\\) (as shown on figure [fig:neglected_modes](#fig:neglected_modes)). +If the excitation has a limited bandwidth \\(\omega\_b\\), the contribution of the high frequency modes \\(\omega\_k \gg \omega\_b\\) can be evaluated by assuming \\(D\_k(\omega) \approx 1\\) (as shown on figure [6](#orgac9e4c8)). And \\(G(\omega)\\) can be rewritten on terms of the **low frequency modes only**: \\[ G(\omega) \approx \sum\_{i=1}^m \frac{\phi\_i \phi\_i^T}{\mu\_i \omega\_i^2} D\_i(\omega) + R \\] @@ -441,9 +441,9 @@ The open-loop FRF of a collocated system corresponds to a diagonal component of If we assumes that the collocated system is undamped and is attached to the DoF \\(k\\), the open-loop FRF is purely real: \\[ G\_{kk}(\omega) = \sum\_{i=1}^m \frac{\phi\_i^2(k)}{\mu\_i (\omega\_i^2 - \omega^2)} + R\_{kk} \\] -\\(G\_{kk}\\) is a monotonously increasing function of \\(\omega\\) (figure [fig:collocated_control_frf](#fig:collocated_control_frf)). +\\(G\_{kk}\\) is a monotonously increasing function of \\(\omega\\) (figure [7](#org6374ca8)). - + {{< figure src="/ox-hugo/preumont18_collocated_control_frf.png" caption="Figure 7: Open-Loop FRF of an undamped structure with collocated actuator/sensor pair" >}} @@ -457,9 +457,9 @@ For lightly damped structure, the poles and zeros are just moved a little bit in
-If the undamped structure is excited harmonically by the actuator at the frequency of the transmission zero \\(z\_i\\), the amplitude of the response of the collocated sensor vanishes. That means that the structure oscillates at the frequency \\(z\_i\\) according to the mode shape shown in dotted line figure [fig:collocated_zero](#fig:collocated_zero). +If the undamped structure is excited harmonically by the actuator at the frequency of the transmission zero \\(z\_i\\), the amplitude of the response of the collocated sensor vanishes. That means that the structure oscillates at the frequency \\(z\_i\\) according to the mode shape shown in dotted line figure [8](#org55d54ab). - + {{< figure src="/ox-hugo/preumont18_collocated_zero.png" caption="Figure 8: Structure with collocated actuator and sensor" >}} @@ -474,9 +474,9 @@ The open-loop poles are independant of the actuator and sensor configuration whi
-By looking at figure [fig:collocated_control_frf](#fig:collocated_control_frf), we see that neglecting the residual mode in the modelling amounts to translating the FRF diagram vertically. That produces a shift in the location of the transmission zeros to the right. +By looking at figure [7](#org6374ca8), we see that neglecting the residual mode in the modelling amounts to translating the FRF diagram vertically. That produces a shift in the location of the transmission zeros to the right. - + {{< figure src="/ox-hugo/preumont18_alternating_p_z.png" caption="Figure 9: Bode plot of a lighly damped structure with collocated actuator and sensor" >}} @@ -486,7 +486,7 @@ The open-loop transfer function of a lighly damped structure with a collocated a G(s) = G\_0 \frac{\Pi\_i(s^2/z\_i^2 + 2 \xi\_i s/z\_i + 1)}{\Pi\_j(s^2/\omega\_j^2 + 2 \xi\_j s /\omega\_j + 1)} \end{equation} -The corresponding Bode plot is represented in figure [9](#org245f75f). Every imaginary pole at \\(\pm j\omega\_i\\) introduces a \\(\SI{180}{\degree}\\) phase lag and every imaginary zero at \\(\pm jz\_i\\) introduces a phase lead of \\(\SI{180}{\degree}\\). +The corresponding Bode plot is represented in figure [9](#org8cc5426). Every imaginary pole at \\(\pm j\omega\_i\\) introduces a \\(\SI{180}{\degree}\\) phase lag and every imaginary zero at \\(\pm jz\_i\\) introduces a phase lead of \\(\SI{180}{\degree}\\). In this way, the phase diagram is always contained between \\(\SI{0}{\degree}\\) and \\(\SI{-180}{\degree}\\) as a consequence of the interlacing property. @@ -508,12 +508,12 @@ Two broad categories of actuators can be distinguish: A voice coil transducer is an energy transformer which converts electrical power into mechanical power and vice versa. -The system consists of (see figure [fig:voice_coil_schematic](#fig:voice_coil_schematic)): +The system consists of (see figure [10](#orga882e0c)): - A permanent magnet which produces a uniform flux density \\(B\\) normal to the gap - A coil which is free to move axially - + {{< figure src="/ox-hugo/preumont18_voice_coil_schematic.png" caption="Figure 10: Physical principle of a voice coil transducer" >}} @@ -551,9 +551,9 @@ Thus, at any time, there is an equilibrium between the electrical power absorbed #### Proof-Mass Actuator {#proof-mass-actuator} -A reaction mass \\(m\\) is conected to the support structure by a spring \\(k\\) , and damper \\(c\\) and a force actuator \\(f = T i\\) (figure [fig:proof_mass_actuator](#fig:proof_mass_actuator)). +A reaction mass \\(m\\) is conected to the support structure by a spring \\(k\\) , and damper \\(c\\) and a force actuator \\(f = T i\\) (figure [11](#orgd7b8271)). - + {{< figure src="/ox-hugo/preumont18_proof_mass_actuator.png" caption="Figure 11: Proof-mass actuator" >}} @@ -583,9 +583,9 @@ with:
-Above some critical frequency \\(\omega\_c \approx 2\omega\_p\\), **the proof-mass actuator can be regarded as an ideal force generator** (figure [fig:proof_mass_tf](#fig:proof_mass_tf)). +Above some critical frequency \\(\omega\_c \approx 2\omega\_p\\), **the proof-mass actuator can be regarded as an ideal force generator** (figure [12](#orgc8992eb)). - + {{< figure src="/ox-hugo/preumont18_proof_mass_tf.png" caption="Figure 12: Bode plot \\(F/i\\) of the proof-mass actuator" >}} @@ -610,7 +610,7 @@ By using the two equations, we obtain: Above the corner frequency, the gain of the geophone is equal to the transducer constant \\(T\\). - + {{< figure src="/ox-hugo/preumont18_geophone.png" caption="Figure 13: Model of a geophone based on a voice coil transducer" >}} @@ -619,9 +619,9 @@ Designing geophones with very low corner frequency is in general difficult. Acti ### General Electromechanical Transducer {#general-electromechanical-transducer} -The consitutive behavior of a wide class of electromechanical transducers can be modelled as in figure [fig:electro_mechanical_transducer](#fig:electro_mechanical_transducer). +The consitutive behavior of a wide class of electromechanical transducers can be modelled as in figure [14](#org12ba88f). - + {{< figure src="/ox-hugo/preumont18_electro_mechanical_transducer.png" caption="Figure 14: Electrical analog representation of an electromechanical transducer" >}} @@ -646,7 +646,7 @@ With: Equation \eqref{eq:gen_trans_e} shows that the voltage across the electrical terminals of any electromechanical transducer is the sum of a contribution proportional to the current applied and a contribution proportional to the velocity of the mechanical terminals. Thus, if \\(Z\_ei\\) can be measured and substracted from \\(e\\), a signal proportional to the velocity is obtained. -To do so, the bridge circuit as shown on figure [fig:bridge_circuit](#fig:bridge_circuit) can be used. +To do so, the bridge circuit as shown on figure [15](#orgdf63f4a) can be used. We can show that @@ -656,7 +656,7 @@ We can show that which is indeed a linear function of the velocity \\(v\\) at the mechanical terminals. - + {{< figure src="/ox-hugo/preumont18_bridge_circuit.png" caption="Figure 15: Bridge circuit for self-sensing actuation" >}} @@ -664,9 +664,9 @@ which is indeed a linear function of the velocity \\(v\\) at the mechanical term ### Smart Materials {#smart-materials} Smart materials have the ability to respond significantly to stimuli of different physical nature. -Figure [fig:smart_materials](#fig:smart_materials) lists various effects that are observed in materials in response to various inputs. +Figure [16](#orgc0d19b7) lists various effects that are observed in materials in response to various inputs. - + {{< figure src="/ox-hugo/preumont18_smart_materials.png" caption="Figure 16: Stimulus response relations indicating various effects in materials. The smart materials corresponds to the non-diagonal cells" >}} @@ -761,7 +761,7 @@ It measures the efficiency of the conversion of the mechanical energy into elect
-If one assumes that all the electrical and mechanical quantities are uniformly distributed in a linear transducer formed by a **stack** (see figure [fig:piezo_stack](#fig:piezo_stack)) of \\(n\\) disks of thickness \\(t\\) and cross section \\(A\\), the global constitutive equations of the transducer are obtained by integrating \eqref{eq:piezo_eq_matrix_bis} over the volume of the transducer: +If one assumes that all the electrical and mechanical quantities are uniformly distributed in a linear transducer formed by a **stack** (see figure [17](#orgc13be77)) of \\(n\\) disks of thickness \\(t\\) and cross section \\(A\\), the global constitutive equations of the transducer are obtained by integrating \eqref{eq:piezo_eq_matrix_bis} over the volume of the transducer: \begin{equation} \begin{bmatrix}Q\\\Delta\end{bmatrix} @@ -782,7 +782,7 @@ where - \\(C = \epsilon^T A n^2/l\\) is the capacitance of the transducer with no external load (\\(f = 0\\)) - \\(K\_a = A/s^El\\) is the stiffness with short-circuited electrodes (\\(V = 0\\)) - + {{< figure src="/ox-hugo/preumont18_piezo_stack.png" caption="Figure 17: Piezoelectric linear transducer" >}} @@ -802,7 +802,7 @@ Equation \eqref{eq:piezo_stack_eq} can be inverted to obtain #### Energy Stored in the Piezoelectric Transducer {#energy-stored-in-the-piezoelectric-transducer} -Let us write the total stored electromechanical energy of a discrete piezoelectric transducer as shown on figure [fig:piezo_discrete](#fig:piezo_discrete). +Let us write the total stored electromechanical energy of a discrete piezoelectric transducer as shown on figure [18](#org24eee83). The total power delivered to the transducer is the sum of electric power \\(V i\\) and the mechanical power \\(f \dot{\Delta}\\). The net work of the transducer is @@ -810,7 +810,7 @@ The total power delivered to the transducer is the sum of electric power \\(V i\ dW = V i dt + f \dot{\Delta} dt = V dQ + f d\Delta \end{equation} - + {{< figure src="/ox-hugo/preumont18_piezo_discrete.png" caption="Figure 18: Discrete Piezoelectric Transducer" >}} @@ -844,10 +844,10 @@ The ratio between the remaining stored energy and the initial stored energy is #### Admittance of the Piezoelectric Transducer {#admittance-of-the-piezoelectric-transducer} -Consider the system of figure [fig:piezo_stack_admittance](#fig:piezo_stack_admittance), where the piezoelectric transducer is assumed massless and is connected to a mass \\(M\\). +Consider the system of figure [19](#org76e4915), where the piezoelectric transducer is assumed massless and is connected to a mass \\(M\\). The force acting on the mass is negative of that acting on the transducer, \\(f = -M \ddot{x}\\). - + {{< figure src="/ox-hugo/preumont18_piezo_stack_admittance.png" caption="Figure 19: Elementary dynamical model of the piezoelectric transducer" >}} @@ -866,9 +866,9 @@ And one can see that \frac{z^2 - p^2}{z^2} = k^2 \end{equation} -Equation \eqref{eq:distance_p_z} constitutes a practical way to determine the electromechanical coupling factor from the poles and zeros of the admittance measurement (figure [fig:piezo_admittance_curve](#fig:piezo_admittance_curve)). +Equation \eqref{eq:distance_p_z} constitutes a practical way to determine the electromechanical coupling factor from the poles and zeros of the admittance measurement (figure [20](#orgba7797e)). - + {{< figure src="/ox-hugo/preumont18_piezo_admittance_curve.png" caption="Figure 20: Typical admittance FRF of the transducer" >}} @@ -1566,7 +1566,7 @@ Their design requires a model of the structure, and there is usually a trade-off When collocated actuator/sensor pairs can be used, stability can be achieved using positivity concepts, but in many situations, collocated pairs are not feasible for HAC. -The HAC/LAC approach consist of combining the two approached in a dual-loop control as shown in Figure [fig:hac_lac_control](#fig:hac_lac_control). +The HAC/LAC approach consist of combining the two approached in a dual-loop control as shown in Figure [21](#org278a785). The inner loop uses a set of collocated actuator/sensor pairs for decentralized active damping with guaranteed stability ; the outer loop consists of a non-collocated HAC based on a model of the actively damped structure. This approach has the following advantages: @@ -1574,7 +1574,7 @@ This approach has the following advantages: - The active damping makes it easier to gain-stabilize the modes outside the bandwidth of the output loop (improved gain margin) - The larger damping of the modes within the controller bandwidth makes them more robust to the parmetric uncertainty (improved phase margin) - + {{< figure src="/ox-hugo/preumont18_hac_lac_control.png" caption="Figure 21: Principle of the dual-loop HAC/LAC control" >}} diff --git a/content/book/schmidt14_desig_high_perfor_mechat_revis_edition.md b/content/book/schmidt14_desig_high_perfor_mechat_revis_edition.md index e912537..7bc4121 100644 --- a/content/book/schmidt14_desig_high_perfor_mechat_revis_edition.md +++ b/content/book/schmidt14_desig_high_perfor_mechat_revis_edition.md @@ -5,7 +5,7 @@ draft = false +++ Tags -: [Reference Books]({{< relref "reference_books" >}}) +: [Reference Books]({{< relref "reference_books" >}}), [Dynamic Error Budgeting]({{< relref "dynamic_error_budgeting" >}}) Reference : (Schmidt {\it et al.}, 2014) @@ -29,7 +29,7 @@ Section 2.2.2 Force and Motion > One should however be aware that another non-destructive source of non-linearity is found in a tried important field of mechanics, called _kinematics_. > The relation between angles and positions is often non-linear in such a mechanism, because of the changing angles, and controlling these often requires special precautions to overcome the inherent non-linearities by linearisation around actual position and adapting the optimal settings of the controller to each position. - + {{< figure src="/ox-hugo/schmidt14_high_low_freq_regions.png" caption="Figure 1: Stabiliby condition and robustness of a feedback controlled system. The desired shape of these curves guide the control design by optimising the lvels and sloppes of the amplitude Bode-plot at low and high frequencies for suppression of the disturbances and of the base Bode-plot in the cross-over frequency region. This is called **loop shaping design**" >}} diff --git a/content/book/skogestad07_multiv_feedb_contr.md b/content/book/skogestad07_multiv_feedb_contr.md index af656ca..8dbc740 100644 --- a/content/book/skogestad07_multiv_feedb_contr.md +++ b/content/book/skogestad07_multiv_feedb_contr.md @@ -63,7 +63,7 @@ Year ## Introduction {#introduction} - + ### The Process of Control System Design {#the-process-of-control-system-design} @@ -234,7 +234,7 @@ Notations used throughout this note are summarized in tables [table:notatio ## Classical Feedback Control {#classical-feedback-control} - + ### Frequency Response {#frequency-response} @@ -283,7 +283,7 @@ Thus, the input to the plant is \\(u = K(s) (r-y-n)\\). The objective of control is to manipulate \\(u\\) (design \\(K\\)) such that the control error \\(e\\) remains small in spite of disturbances \\(d\\). The control error is defined as \\(e = y-r\\). - + {{< figure src="/ox-hugo/skogestad07_classical_feedback_alt.png" caption="Figure 1: Configuration for one degree-of-freedom control" >}} @@ -595,7 +595,7 @@ We cannot achieve both of these simultaneously with a single feedback controller The solution is to use a **two degrees of freedom controller** where the reference signal \\(r\\) and output measurement \\(y\_m\\) are independently treated by the controller (Fig. [fig:classical_feedback_2dof_alt](#fig:classical_feedback_2dof_alt)), rather than operating on their difference \\(r - y\_m\\). - + {{< figure src="/ox-hugo/skogestad07_classical_feedback_2dof_alt.png" caption="Figure 2: 2 degrees-of-freedom control architecture" >}} @@ -604,7 +604,7 @@ The controller can be slit into two separate blocks (Fig. [fig:classical_fe - the **feedback controller** \\(K\_y\\) that is used to **reduce the effect of uncertainty** (disturbances and model errors) - the **prefilter** \\(K\_r\\) that **shapes the commands** \\(r\\) to improve tracking performance - + {{< figure src="/ox-hugo/skogestad07_classical_feedback_sep.png" caption="Figure 3: 2 degrees-of-freedom control architecture with two separate blocs" >}} @@ -673,7 +673,7 @@ With (see Fig. [fig:performance_weigth](#fig:performance_weigth)):
- + {{< figure src="/ox-hugo/skogestad07_weight_first_order.png" caption="Figure 4: Inverse of performance weight" >}} @@ -697,7 +697,7 @@ After selecting the form of \\(N\\) and the weights, the \\(\hinf\\) optimal con ## Introduction to Multivariable Control {#introduction-to-multivariable-control} - + ### Introduction {#introduction} @@ -740,7 +740,7 @@ For negative feedback system (Fig. [fig:classical_feedback_bis](#fig:classi - \\(S \triangleq (I + L)^{-1}\\) is the transfer function from \\(d\_1\\) to \\(y\\) - \\(T \triangleq L(I + L)^{-1}\\) is the transfer function from \\(r\\) to \\(y\\) - + {{< figure src="/ox-hugo/skogestad07_classical_feedback_bis.png" caption="Figure 5: Conventional negative feedback control system" >}} @@ -1055,7 +1055,7 @@ The **structured singular value** \\(\mu\\) is a tool for analyzing the effects The general control problem formulation is represented in Fig. [fig:general_control_names](#fig:general_control_names). - + {{< figure src="/ox-hugo/skogestad07_general_control_names.png" caption="Figure 6: General control configuration" >}} @@ -1085,7 +1085,7 @@ We consider: - The weighted or normalized exogenous inputs \\(w\\) (where \\(\tilde{w} = W\_w w\\) consists of the "physical" signals entering the system) - The weighted or normalized controlled outputs \\(z = W\_z \tilde{z}\\) (where \\(\tilde{z}\\) often consists of the control error \\(y-r\\) and the manipulated input \\(u\\)) - + {{< figure src="/ox-hugo/skogestad07_general_plant_weights.png" caption="Figure 7: General Weighted Plant" >}} @@ -1128,7 +1128,7 @@ where \\(F\_l(P, K)\\) denotes a **lower linear fractional transformation** (LFT The general control configuration may be extended to include model uncertainty as shown in Fig. [fig:general_config_model_uncertainty](#fig:general_config_model_uncertainty). - + {{< figure src="/ox-hugo/skogestad07_general_control_Mdelta.png" caption="Figure 8: General control configuration for the case with model uncertainty" >}} @@ -1156,7 +1156,7 @@ MIMO systems are often **more sensitive to uncertainty** than SISO systems. ## Elements of Linear System Theory {#elements-of-linear-system-theory} - + ### System Descriptions {#system-descriptions} @@ -1442,7 +1442,7 @@ RHP-zeros therefore imply high gain instability. ### Internal Stability of Feedback Systems {#internal-stability-of-feedback-systems} - + {{< figure src="/ox-hugo/skogestad07_classical_feedback_stability.png" caption="Figure 9: Block diagram used to check internal stability" >}} @@ -1589,7 +1589,7 @@ It may be shown that the Hankel norm is equal to \\(\left\\|G(s)\right\\|\_H = \ ## Limitations on Performance in SISO Systems {#limitations-on-performance-in-siso-systems} - + ### Input-Output Controllability {#input-output-controllability} @@ -1981,7 +1981,7 @@ Uncertainty in the crossover frequency region can result in poor performance and ### Summary: Controllability Analysis with Feedback Control {#summary-controllability-analysis-with-feedback-control} - + {{< figure src="/ox-hugo/skogestad07_classical_feedback_meas.png" caption="Figure 10: Feedback control system" >}} @@ -2010,7 +2010,7 @@ In summary: Sometimes, the disturbances are so large that we hit input saturation or the required bandwidth is not achievable. To avoid the latter problem, we must at least require that the effect of the disturbance is less than \\(1\\) at frequencies beyond the bandwidth: \\[ \abs{G\_d(j\w)} < 1 \quad \forall \w \geq \w\_c \\] - + {{< figure src="/ox-hugo/skogestad07_margin_requirements.png" caption="Figure 11: Illustration of controllability requirements" >}} @@ -2032,7 +2032,7 @@ The rules may be used to **determine whether or not a given plant is controllabl ## Limitations on Performance in MIMO Systems {#limitations-on-performance-in-mimo-systems} - + ### Introduction {#introduction} @@ -2343,7 +2343,7 @@ We here focus on input and output uncertainty. In multiplicative form, the input and output uncertainties are given by (see Fig. [fig:input_output_uncertainty](#fig:input_output_uncertainty)): \\[ G^\prime = (I + E\_O) G (I + E\_I) \\] - + {{< figure src="/ox-hugo/skogestad07_input_output_uncertainty.png" caption="Figure 12: Plant with multiplicative input and output uncertainty" >}} @@ -2479,7 +2479,7 @@ However, the situation is usually the opposite with model uncertainty because fo ## Uncertainty and Robustness for SISO Systems {#uncertainty-and-robustness-for-siso-systems} - + ### Introduction to Robustness {#introduction-to-robustness} @@ -2553,7 +2553,7 @@ which may be represented by the diagram in Fig. [fig:input_uncertainty_set]
- + {{< figure src="/ox-hugo/skogestad07_input_uncertainty_set.png" caption="Figure 13: Plant with multiplicative uncertainty" >}} @@ -2607,7 +2607,7 @@ To illustrate how parametric uncertainty translate into frequency domain uncerta In general, these uncertain regions have complicated shapes and complex mathematical descriptions - **Step 2**. We therefore approximate such complex regions as discs, resulting in a **complex additive uncertainty description** - + {{< figure src="/ox-hugo/skogestad07_uncertainty_region.png" caption="Figure 14: Uncertainty regions of the Nyquist plot at given frequencies" >}} @@ -2630,7 +2630,7 @@ At each frequency, all possible \\(\Delta(j\w)\\) "generates" a disc-shaped regi
- + {{< figure src="/ox-hugo/skogestad07_uncertainty_disc_generated.png" caption="Figure 15: Disc-shaped uncertainty regions generated by complex additive uncertainty" >}} @@ -2687,7 +2687,7 @@ To derive \\(w\_I(s)\\), we then try to find a simple weight so that \\(\abs{w\_
- + {{< figure src="/ox-hugo/skogestad07_uncertainty_weight.png" caption="Figure 16: Relative error for 27 combinations of \\(k,\ \tau\\) and \\(\theta\\). Solid and dashed lines: two weights \\(\abs{w\_I}\\)" >}} @@ -2726,7 +2726,7 @@ The magnitude of the relative uncertainty caused by neglecting the dynamics in \ Let \\(f(s) = e^{-\theta\_p s}\\), where \\(0 \le \theta\_p \le \theta\_{\text{max}}\\). We want to represent \\(G\_p(s) = G\_0(s)e^{-\theta\_p s}\\) by a delay-free plant \\(G\_0(s)\\) and multiplicative uncertainty. Let first consider the maximum delay, for which the relative error \\(\abs{1 - e^{-j \w \theta\_{\text{max}}}}\\) is shown as a function of frequency (Fig. [fig:neglected_time_delay](#fig:neglected_time_delay)). If we consider all \\(\theta \in [0, \theta\_{\text{max}}]\\) then: \\[ l\_I(\w) = \begin{cases} \abs{1 - e^{-j\w\theta\_{\text{max}}}} & \w < \pi/\theta\_{\text{max}} \\ 2 & \w \ge \pi/\theta\_{\text{max}} \end{cases} \\] - + {{< figure src="/ox-hugo/skogestad07_neglected_time_delay.png" caption="Figure 17: Neglected time delay" >}} @@ -2736,7 +2736,7 @@ Let \\(f(s) = e^{-\theta\_p s}\\), where \\(0 \le \theta\_p \le \theta\_{\text{m Let \\(f(s) = 1/(\tau\_p s + 1)\\), where \\(0 \le \tau\_p \le \tau\_{\text{max}}\\). In this case the resulting \\(l\_I(\w)\\) (Fig. [fig:neglected_first_order_lag](#fig:neglected_first_order_lag)) can be represented by a rational transfer function with \\(\abs{w\_I(j\w)} = l\_I(\w)\\) where \\[ w\_I(s) = \frac{\tau\_{\text{max}} s}{\tau\_{\text{max}} s + 1} \\] - + {{< figure src="/ox-hugo/skogestad07_neglected_first_order_lag.png" caption="Figure 18: Neglected first-order lag uncertainty" >}} @@ -2753,7 +2753,7 @@ However, as shown in Fig. [fig:lag_delay_uncertainty](#fig:lag_delay_uncert It is suggested to start with the simple weight and then if needed, to try the higher order weight. - + {{< figure src="/ox-hugo/skogestad07_lag_delay_uncertainty.png" caption="Figure 19: Multiplicative weight for gain and delay uncertainty" >}} @@ -2793,7 +2793,7 @@ We use the Nyquist stability condition to test for robust stability of the close &\Longleftrightarrow \quad L\_p \ \text{should not encircle -1}, \ \forall L\_p \end{align\*} - + {{< figure src="/ox-hugo/skogestad07_input_uncertainty_set_feedback.png" caption="Figure 20: Feedback system with multiplicative uncertainty" >}} @@ -2809,7 +2809,7 @@ Encirclements are avoided if none of the discs cover \\(-1\\), and we get: &\Leftrightarrow \quad \abs{w\_I T} < 1, \ \forall\w \\\\\\ \end{align\*} - + {{< figure src="/ox-hugo/skogestad07_nyquist_uncertainty.png" caption="Figure 21: Nyquist plot of \\(L\_p\\) for robust stability" >}} @@ -2847,7 +2847,7 @@ And we obtain the same condition as before. We will derive a corresponding RS-condition for feedback system with inverse multiplicative uncertainty (Fig. [fig:inverse_uncertainty_set](#fig:inverse_uncertainty_set)) in which \\[ G\_p = G(1 + w\_{iI}(s) \Delta\_{iI})^{-1} \\] - + {{< figure src="/ox-hugo/skogestad07_inverse_uncertainty_set.png" caption="Figure 22: Feedback system with inverse multiplicative uncertainty" >}} @@ -2899,7 +2899,7 @@ The condition for nominal performance when considering performance in terms of t Now \\(\abs{1 + L}\\) represents at each frequency the distance of \\(L(j\omega)\\) from the point \\(-1\\) in the Nyquist plot, so \\(L(j\omega)\\) must be at least a distance of \\(\abs{w\_P(j\omega)}\\) from \\(-1\\). This is illustrated graphically in Fig. [fig:nyquist_performance_condition](#fig:nyquist_performance_condition). - + {{< figure src="/ox-hugo/skogestad07_nyquist_performance_condition.png" caption="Figure 23: Nyquist plot illustration of the nominal performance condition \\(\abs{w\_P} < \abs{1 + L}\\)" >}} @@ -2924,7 +2924,7 @@ Let's consider the case of multiplicative uncertainty as shown on Fig. [fig The robust performance corresponds to requiring \\(\abs{\hat{y}/d}<1\ \forall \Delta\_I\\) and the set of possible loop transfer functions is \\[ L\_p = G\_p K = L (1 + w\_I \Delta\_I) = L + w\_I L \Delta\_I \\] - + {{< figure src="/ox-hugo/skogestad07_input_uncertainty_set_feedback_weight_bis.png" caption="Figure 24: Diagram for robust performance with multiplicative uncertainty" >}} @@ -3090,7 +3090,7 @@ with \\(\Phi(s) \triangleq (sI - A)^{-1}\\). This is illustrated in the block diagram of Fig. [fig:uncertainty_state_a_matrix](#fig:uncertainty_state_a_matrix), which is in the form of an inverse additive perturbation. - + {{< figure src="/ox-hugo/skogestad07_uncertainty_state_a_matrix.png" caption="Figure 25: Uncertainty in state space A-matrix" >}} @@ -3108,7 +3108,7 @@ We also derived a condition for robust performance with multiplicative uncertain ## Robust Stability and Performance Analysis {#robust-stability-and-performance-analysis} - + ### General Control Configuration with Uncertainty {#general-control-configuration-with-uncertainty} @@ -3119,13 +3119,13 @@ where each \\(\Delta\_i\\) represents a **specific source of uncertainty**, e.g. If we also pull out the controller \\(K\\), we get the generalized plant \\(P\\) as shown in Fig. [fig:general_control_delta](#fig:general_control_delta). This form is useful for controller synthesis. - + {{< figure src="/ox-hugo/skogestad07_general_control_delta.png" caption="Figure 26: General control configuration used for controller synthesis" >}} If the controller is given and we want to analyze the uncertain system, we use the \\(N\Delta\text{-structure}\\) in Fig. [fig:general_control_Ndelta](#fig:general_control_Ndelta). - + {{< figure src="/ox-hugo/skogestad07_general_control_Ndelta.png" caption="Figure 27: \\(N\Delta\text{-structure}\\) for robust performance analysis" >}} @@ -3145,7 +3145,7 @@ Similarly, the uncertain closed-loop transfer function from \\(w\\) to \\(z\\), To analyze robust stability of \\(F\\), we can rearrange the system into the \\(M\Delta\text{-structure}\\) shown in Fig. [fig:general_control_Mdelta_bis](#fig:general_control_Mdelta_bis) where \\(M = N\_{11}\\) is the transfer function from the output to the input of the perturbations. - + {{< figure src="/ox-hugo/skogestad07_general_control_Mdelta_bis.png" caption="Figure 28: \\(M\Delta\text{-structure}\\) for robust stability analysis" >}} @@ -3197,7 +3197,7 @@ Three common forms of **feedforward unstructured uncertainty** are shown Fig.&nb | ![](/ox-hugo/skogestad07_additive_uncertainty.png) | ![](/ox-hugo/skogestad07_input_uncertainty.png) | ![](/ox-hugo/skogestad07_output_uncertainty.png) | |----------------------------------------------------|----------------------------------------------------------|-----------------------------------------------------------| -| Additive uncertainty | Multiplicative input uncertainty | Multiplicative output uncertainty | +| Additive uncertainty | Multiplicative input uncertainty | Multiplicative output uncertainty | In Fig. [fig:feedback_uncertainty](#fig:feedback_uncertainty), three **feedback or inverse unstructured uncertainty** forms are shown: inverse additive uncertainty, inverse multiplicative input uncertainty and inverse multiplicative output uncertainty. @@ -3220,7 +3220,7 @@ In Fig. [fig:feedback_uncertainty](#fig:feedback_uncertainty), three **feed | ![](/ox-hugo/skogestad07_inv_additive_uncertainty.png) | ![](/ox-hugo/skogestad07_inv_input_uncertainty.png) | ![](/ox-hugo/skogestad07_inv_output_uncertainty.png) | |--------------------------------------------------------|------------------------------------------------------------------|-------------------------------------------------------------------| -| Inverse additive uncertainty | Inverse multiplicative input uncertainty | Inverse multiplicative output uncertainty | +| Inverse additive uncertainty | Inverse multiplicative input uncertainty | Inverse multiplicative output uncertainty | ##### Lumping uncertainty into a single perturbation {#lumping-uncertainty-into-a-single-perturbation} @@ -3290,7 +3290,7 @@ where \\(r\_0\\) is the relative uncertainty at steady-state, \\(1/\tau\\) is th Let's consider the feedback system with multiplicative input uncertainty \\(\Delta\_I\\) shown Fig. [fig:input_uncertainty_set_feedback_weight](#fig:input_uncertainty_set_feedback_weight). \\(W\_I\\) is a normalization weight for the uncertainty and \\(W\_P\\) is a performance weight. - + {{< figure src="/ox-hugo/skogestad07_input_uncertainty_set_feedback_weight.png" caption="Figure 29: System with multiplicative input uncertainty and performance measured at the output" >}} @@ -3450,7 +3450,7 @@ Where \\(G = M\_l^{-1} N\_l\\) is a left coprime factorization of the nominal pl This uncertainty description is surprisingly **general**, it allows both zeros and poles to cross into the right-half plane, and has proven to be very useful in applications. - + {{< figure src="/ox-hugo/skogestad07_coprime_uncertainty.png" caption="Figure 30: Coprime Uncertainty" >}} @@ -3482,7 +3482,7 @@ where \\(d\_i\\) is a scalar and \\(I\_i\\) is an identity matrix of the same di Now rescale the inputs and outputs of \\(M\\) and \\(\Delta\\) by inserting the matrices \\(D\\) and \\(D^{-1}\\) on both sides as shown in Fig. [fig:block_diagonal_scalings](#fig:block_diagonal_scalings). This clearly has no effect on stability. - + {{< figure src="/ox-hugo/skogestad07_block_diagonal_scalings.png" caption="Figure 31: Use of block-diagonal scalings, \\(\Delta D = D \Delta\\)" >}} @@ -3798,7 +3798,7 @@ with the decoupling controller we have: \\[ \bar{\sigma}(N\_{22}) = \bar{\sigma}(w\_P S) = \left|\frac{s/2 + 0.05}{s + 0.7}\right| \\] and we see from Fig. [fig:mu_plots_distillation](#fig:mu_plots_distillation) that the NP-condition is satisfied. - + {{< figure src="/ox-hugo/skogestad07_mu_plots_distillation.png" caption="Figure 32: \\(\mu\text{-plots}\\) for distillation process with decoupling controller" >}} @@ -3921,7 +3921,7 @@ The latter is an attempt to "flatten out" \\(\mu\\). For simplicity, we will consider again the case of multiplicative uncertainty and performance defined in terms of weighted sensitivity. The uncertainty weight \\(w\_I I\\) and performance weight \\(w\_P I\\) are shown graphically in Fig. [fig:weights_distillation](#fig:weights_distillation). - + {{< figure src="/ox-hugo/skogestad07_weights_distillation.png" caption="Figure 33: Uncertainty and performance weights" >}} @@ -3944,11 +3944,11 @@ The scaling matrix \\(D\\) for \\(DND^{-1}\\) then has the structure \\(D = \tex - Iteration No. 3. Step 1: The \\(\mathcal{H}\_\infty\\) norm is only slightly reduced. We thus decide the stop the iterations. - + {{< figure src="/ox-hugo/skogestad07_dk_iter_mu.png" caption="Figure 34: Change in \\(\mu\\) during DK-iteration" >}} - + {{< figure src="/ox-hugo/skogestad07_dk_iter_d_scale.png" caption="Figure 35: Change in D-scale \\(d\_1\\) during DK-iteration" >}} @@ -3956,13 +3956,13 @@ The final \\(\mu\text{-curves}\\) for NP, RS and RP with the controller \\(K\_3\ The objectives of RS and NP are easily satisfied. The peak value of \\(\mu\\) is just slightly over 1, so the performance specification \\(\bar{\sigma}(w\_P S\_p) < 1\\) is almost satisfied for all possible plants. - + {{< figure src="/ox-hugo/skogestad07_mu_plot_optimal_k3.png" caption="Figure 36: \\(mu\text{-plots}\\) with \\(\mu\\) \"optimal\" controller \\(K\_3\\)" >}} To confirm that, 6 perturbed plants are used to compute the perturbed sensitivity functions shown in Fig. [fig:perturb_s_k3](#fig:perturb_s_k3). - + {{< figure src="/ox-hugo/skogestad07_perturb_s_k3.png" caption="Figure 37: Perturbed sensitivity functions \\(\bar{\sigma}(S^\prime)\\) using \\(\mu\\) \"optimal\" controller \\(K\_3\\). Lower solid line: nominal plant. Upper solid line: worst-case plant" >}} @@ -4017,7 +4017,7 @@ If resulting control performance is not satisfactory, one may switch to the seco ## Controller Design {#controller-design} - + ### Trade-offs in MIMO Feedback Design {#trade-offs-in-mimo-feedback-design} @@ -4037,7 +4037,7 @@ We have the following important relationships: \end{align} \end{subequations} - + {{< figure src="/ox-hugo/skogestad07_classical_feedback_small.png" caption="Figure 38: One degree-of-freedom feedback configuration" >}} @@ -4079,7 +4079,7 @@ Thus, over specified frequency ranges, it is relatively easy to approximate the Typically, the open-loop requirements 1 and 3 are valid and important at low frequencies \\(0 \le \omega \le \omega\_l \le \omega\_B\\), while conditions 2, 4, 5 and 6 are conditions which are valid and important at high frequencies \\(\omega\_B \le \omega\_h \le \omega \le \infty\\), as illustrated in Fig. [fig:design_trade_off_mimo_gk](#fig:design_trade_off_mimo_gk). - + {{< figure src="/ox-hugo/skogestad07_design_trade_off_mimo_gk.png" caption="Figure 39: Design trade-offs for the multivariable loop transfer function \\(GK\\)" >}} @@ -4136,7 +4136,7 @@ The solution to the LQG problem is then found by replacing \\(x\\) by \\(\hat{x} We therefore see that the LQG problem and its solution can be separated into two distinct parts as illustrated in Fig. [fig:lqg_separation](#fig:lqg_separation): the optimal state feedback and the optimal state estimator (the Kalman filter). - + {{< figure src="/ox-hugo/skogestad07_lqg_separation.png" caption="Figure 40: The separation theorem" >}} @@ -4186,7 +4186,7 @@ Where \\(Y\\) is the unique positive-semi definite solution of the algebraic Ric - + {{< figure src="/ox-hugo/skogestad07_lqg_kalman_filter.png" caption="Figure 41: The LQG controller and noisy plant" >}} @@ -4207,7 +4207,7 @@ It has the same degree (number of poles) as the plant.
For the LQG-controller, as shown on Fig. [fig:lqg_kalman_filter](#fig:lqg_kalman_filter), it is not easy to see where to position the reference input \\(r\\) and how integral action may be included, if desired. Indeed, the standard LQG design procedure does not give a controller with integral action. One strategy is illustrated in Fig. [fig:lqg_integral](#fig:lqg_integral). Here, the control error \\(r-y\\) is integrated and the regulator \\(K\_r\\) is designed for the plant augmented with these integral states. - + {{< figure src="/ox-hugo/skogestad07_lqg_integral.png" caption="Figure 42: LQG controller with integral action and reference input" >}} @@ -4220,18 +4220,18 @@ Their main limitation is that they can only be applied to minimum phase plants. ### \\(\htwo\\) and \\(\hinf\\) Control {#htwo--and--hinf--control} - + #### General Control Problem Formulation {#general-control-problem-formulation} - + There are many ways in which feedback design problems can be cast as \\(\htwo\\) and \\(\hinf\\) optimization problems. It is very useful therefore to have a **standard problem formulation** into which any particular problem may be manipulated. Such a general formulation is afforded by the general configuration shown in Fig. [fig:general_control](#fig:general_control). - + {{< figure src="/ox-hugo/skogestad07_general_control.png" caption="Figure 43: General control configuration" >}} @@ -4482,7 +4482,7 @@ The elements of the generalized plant are \end{array} \end{equation\*} - + {{< figure src="/ox-hugo/skogestad07_mixed_sensitivity_dist_rejection.png" caption="Figure 44: \\(S/KS\\) mixed-sensitivity optimization in standard form (regulation)" >}} @@ -4491,7 +4491,7 @@ Here we consider a tracking problem. The exogenous input is a reference command \\(r\\), and the error signals are \\(z\_1 = -W\_1 e = W\_1 (r-y)\\) and \\(z\_2 = W\_2 u\\). As the regulation problem of Fig. [fig:mixed_sensitivity_dist_rejection](#fig:mixed_sensitivity_dist_rejection), we have that \\(z\_1 = W\_1 S w\\) and \\(z\_2 = W\_2 KS w\\). - + {{< figure src="/ox-hugo/skogestad07_mixed_sensitivity_ref_tracking.png" caption="Figure 45: \\(S/KS\\) mixed-sensitivity optimization in standard form (tracking)" >}} @@ -4515,7 +4515,7 @@ The elements of the generalized plant are \end{array} \end{equation\*} - + {{< figure src="/ox-hugo/skogestad07_mixed_sensitivity_s_t.png" caption="Figure 46: \\(S/T\\) mixed-sensitivity optimization in standard form" >}} @@ -4543,7 +4543,7 @@ The focus of attention has moved to the size of signals and away from the size a Weights are used to describe the expected or known frequency content of exogenous signals and the desired frequency content of error signals. Weights are also used if a perturbation is used to model uncertainty, as in Fig. [fig:input_uncertainty_hinf](#fig:input_uncertainty_hinf), where \\(G\\) represents the nominal model, \\(W\\) is a weighting function that captures the relative model fidelity over frequency, and \\(\Delta\\) represents unmodelled dynamics usually normalized such that \\(\hnorm{\Delta} < 1\\). - + {{< figure src="/ox-hugo/skogestad07_input_uncertainty_hinf.png" caption="Figure 47: Multiplicative dynamic uncertainty model" >}} @@ -4565,7 +4565,7 @@ The problem can be cast as a standard \\(\hinf\\) optimization in the general co w = \begin{bmatrix}d\\r\\n\end{bmatrix},\ z = \begin{bmatrix}z\_1\\z\_2\end{bmatrix}, \ v = \begin{bmatrix}r\_s\\y\_m\end{bmatrix},\ u = u \end{equation\*} - + {{< figure src="/ox-hugo/skogestad07_hinf_signal_based.png" caption="Figure 48: A signal-based \\(\hinf\\) control problem" >}} @@ -4576,7 +4576,7 @@ This problem is a non-standard \\(\hinf\\) optimization. It is a robust performance problem for which the \\(\mu\text{-synthesis}\\) procedure can be applied where we require the structured singular value: \\[ \mu(M(j\omega)) < 1, \quad \forall\omega \\] - + {{< figure src="/ox-hugo/skogestad07_hinf_signal_based_uncertainty.png" caption="Figure 49: A signal-based \\(\hinf\\) control problem with input multiplicative uncertainty" >}} @@ -4634,7 +4634,7 @@ For the perturbed feedback system of Fig. [fig:coprime_uncertainty_bis](#fi Notice that \\(\gamma\\) is the \\(\hinf\\) norm from \\(\phi\\) to \\(\begin{bmatrix}u\\y\end{bmatrix}\\) and \\((I-GK)^{-1}\\) is the sensitivity function for this positive feedback arrangement. - + {{< figure src="/ox-hugo/skogestad07_coprime_uncertainty_bis.png" caption="Figure 50: \\(\hinf\\) robust stabilization problem" >}} @@ -4681,7 +4681,7 @@ It is important to emphasize that since we can compute \\(\gamma\_\text{min}\\) #### A Systematic \\(\hinf\\) Loop-Shaping Design Procedure {#a-systematic--hinf--loop-shaping-design-procedure} - + Robust stabilization alone is not much used in practice because the designer is not able to specify any performance requirements. To do so, **pre and post compensators** are used to **shape the open-loop singular values** prior to robust stabilization of the "shaped" plant. @@ -4694,7 +4694,7 @@ If \\(W\_1\\) and \\(W\_2\\) are the pre and post compensators respectively, the as shown in Fig. [fig:shaped_plant](#fig:shaped_plant). - + {{< figure src="/ox-hugo/skogestad07_shaped_plant.png" caption="Figure 51: The shaped plant and controller" >}} @@ -4731,7 +4731,7 @@ Systematic procedure for \\(\hinf\\) loop-shaping design: This is because the references do not directly excite the dynamics of \\(K\_s\\), which can result in large amounts of overshoot. The constant prefilter ensure a steady-state gain of \\(1\\) between \\(r\\) and \\(y\\), assuming integral action in \\(W\_1\\) or \\(G\\) - + {{< figure src="/ox-hugo/skogestad07_shapping_practical_implementation.png" caption="Figure 52: A practical implementation of the loop-shaping controller" >}} @@ -4757,7 +4757,7 @@ But in cases where stringent time-domain specifications are set on the output re A general two degrees-of-freedom feedback control scheme is depicted in Fig. [fig:classical_feedback_2dof_simple](#fig:classical_feedback_2dof_simple). The commands and feedbacks enter the controller separately and are independently processed. - + {{< figure src="/ox-hugo/skogestad07_classical_feedback_2dof_simple.png" caption="Figure 53: General two degrees-of-freedom feedback control scheme" >}} @@ -4768,7 +4768,7 @@ The design problem is illustrated in Fig. [fig:coprime_uncertainty_hinf](#f The feedback part of the controller \\(K\_2\\) is designed to meet robust stability and disturbance rejection requirements. A prefilter is introduced to force the response of the closed-loop system to follow that of a specified model \\(T\_{\text{ref}}\\), often called the **reference model**. - + {{< figure src="/ox-hugo/skogestad07_coprime_uncertainty_hinf.png" caption="Figure 54: Two degrees-of-freedom \\(\mathcal{H}\_\infty\\) loop-shaping design problem" >}} @@ -4793,7 +4793,7 @@ The main steps required to synthesize a two degrees-of-freedom \\(\mathcal{H}\_\ The final two degrees-of-freedom \\(\mathcal{H}\_\infty\\) loop-shaping controller is illustrated in Fig. [fig:hinf_synthesis_2dof](#fig:hinf_synthesis_2dof). - + {{< figure src="/ox-hugo/skogestad07_hinf_synthesis_2dof.png" caption="Figure 55: Two degrees-of-freedom \\(\mathcal{H}\_\infty\\) loop-shaping controller" >}} @@ -4865,7 +4865,7 @@ where \\(u\_a\\) is the **actual plant input**, that is the measurement at the * The situation is illustrated in Fig. [fig:weight_anti_windup](#fig:weight_anti_windup), where the actuators are each modeled by a unit gain and a saturation. - + {{< figure src="/ox-hugo/skogestad07_weight_anti_windup.png" caption="Figure 56: Self-conditioned weight \\(W\_1\\)" >}} @@ -4913,14 +4913,14 @@ Moreover, one should be careful about combining controller synthesis and analysi ## Controller Structure Design {#controller-structure-design} - + ### Introduction {#introduction} In previous sections, we considered the general problem formulation in Fig. [fig:general_control_names_bis](#fig:general_control_names_bis) and stated that the controller design problem is to find a controller \\(K\\) which based on the information in \\(v\\), generates a control signal \\(u\\) which counteracts the influence of \\(w\\) on \\(z\\), thereby minimizing the closed loop norm from \\(w\\) to \\(z\\). - + {{< figure src="/ox-hugo/skogestad07_general_control_names_bis.png" caption="Figure 57: General Control Configuration" >}} @@ -4955,7 +4955,7 @@ The reference value \\(r\\) is usually set at some higher layer in the control h Additional layers are possible, as is illustrated in Fig. [fig:control_system_hierarchy](#fig:control_system_hierarchy) which shows a typical control hierarchy for a chemical plant. - + {{< figure src="/ox-hugo/skogestad07_system_hierarchy.png" caption="Figure 58: Typical control system hierarchy in a chemical plant" >}} @@ -4977,7 +4977,7 @@ However, this solution is normally not used for a number a reasons, included the | ![](/ox-hugo/skogestad07_optimize_control_a.png) | ![](/ox-hugo/skogestad07_optimize_control_b.png) | ![](/ox-hugo/skogestad07_optimize_control_c.png) | |--------------------------------------------------|--------------------------------------------------------------------------------|-------------------------------------------------------------| -| Open loop optimization | Closed-loop implementation with separate control layer | Integrated optimization and control | +| Open loop optimization | Closed-loop implementation with separate control layer | Integrated optimization and control | ### Selection of Controlled Outputs {#selection-of-controlled-outputs} @@ -5184,7 +5184,7 @@ A cascade control structure results when either of the following two situations | ![](/ox-hugo/skogestad07_cascade_extra_meas.png) | ![](/ox-hugo/skogestad07_cascade_extra_input.png) | |-------------------------------------------------------|---------------------------------------------------| -| Extra measurements \\(y\_2\\) | Extra inputs \\(u\_2\\) | +| Extra measurements \\(y\_2\\) | Extra inputs \\(u\_2\\) | #### Cascade Control: Extra Measurements {#cascade-control-extra-measurements} @@ -5233,7 +5233,7 @@ With reference to the special (but common) case of cascade control shown in Fig. - + {{< figure src="/ox-hugo/skogestad07_cascade_control.png" caption="Figure 59: Common case of cascade control where the primary output \\(y\_1\\) depends directly on the extra measurement \\(y\_2\\)" >}} @@ -5283,7 +5283,7 @@ We would probably tune the three controllers in the order \\(K\_2\\), \\(K\_3\\) - + {{< figure src="/ox-hugo/skogestad07_cascade_control_two_layers.png" caption="Figure 60: Control configuration with two layers of cascade control" >}} @@ -5398,7 +5398,7 @@ We get: \end{aligned} \end{equation} - + {{< figure src="/ox-hugo/skogestad07_partial_control.png" caption="Figure 61: Partial Control" >}} @@ -5518,7 +5518,7 @@ Then to minimize the control error for the primary output, \\(J = \\|y\_1 - r\_1 In this section, \\(G(s)\\) is a square plant which is to be controlled using a diagonal controller (Fig. [fig:decentralized_diagonal_control](#fig:decentralized_diagonal_control)). - + {{< figure src="/ox-hugo/skogestad07_decentralized_diagonal_control.png" caption="Figure 62: Decentralized diagonal control of a \\(2 \times 2\\) plant" >}} @@ -5905,7 +5905,7 @@ The conditions are also useful in an **input-output controllability analysis** f ## Model Reduction {#model-reduction} - + ### Introduction {#introduction} diff --git a/content/book/taghirad13_paral.md b/content/book/taghirad13_paral.md index abe62ff..662a02d 100644 --- a/content/book/taghirad13_paral.md +++ b/content/book/taghirad13_paral.md @@ -19,7 +19,7 @@ Year ## Introduction {#introduction} - + This book is intended to give some analysis and design tools for the increase number of engineers and researchers who are interested in the design and implementation of parallel robots. A systematic approach is presented to analyze the kinematics, dynamics and control of parallel robots. @@ -44,7 +44,7 @@ The control of parallel robots is elaborated in the last two chapters, in which ## Motion Representation {#motion-representation} - + ### Spatial Motion Representation {#spatial-motion-representation} @@ -59,7 +59,7 @@ Let us define: The absolute position of point \\(P\\) of the rigid body can be constructed from the relative position of that point with respect to the moving frame \\(\\{\bm{B}\\}\\), and the **position and orientation** of the moving frame \\(\\{\bm{B}\\}\\) with respect to the fixed frame \\(\\{\bm{A}\\}\\). - + {{< figure src="/ox-hugo/taghirad13_rigid_body_motion.png" caption="Figure 1: Representation of a rigid body spatial motion" >}} @@ -84,7 +84,7 @@ It can be **represented in several different ways**: the rotation matrix, the sc ##### Rotation Matrix {#rotation-matrix} We consider a rigid body that has been exposed to a pure rotation. -Its orientation has changed from a state represented by frame \\(\\{\bm{A}\\}\\) to its current orientation represented by frame \\(\\{\bm{B}\\}\\) (Figure [2](#org42e4742)). +Its orientation has changed from a state represented by frame \\(\\{\bm{A}\\}\\) to its current orientation represented by frame \\(\\{\bm{B}\\}\\) (Figure [2](#org1448d5b)). A \\(3 \times 3\\) rotation matrix \\({}^A\bm{R}\_B\\) is defined by @@ -106,7 +106,7 @@ in which \\({}^A\hat{\bm{x}}\_B, {}^A\hat{\bm{y}}\_B\\) and \\({}^A\hat{\bm{z}}\ The nine elements of the rotation matrix can be simply represented as the projections of the Cartesian unit vectors of frame \\(\\{\bm{B}\\}\\) on the unit vectors of frame \\(\\{\bm{A}\\}\\). - + {{< figure src="/ox-hugo/taghirad13_rotation_matrix.png" caption="Figure 2: Pure rotation of a rigid body" >}} @@ -132,7 +132,7 @@ The term screw axis for this axis of rotation has the benefit that a general mot The screw axis representation has the benefit of **using only four parameters** to describe a pure rotation. These parameters are the angle of rotation \\(\theta\\) and the axis of rotation which is a unit vector \\({}^A\hat{\bm{s}} = [s\_x, s\_y, s\_z]^T\\). - + {{< figure src="/ox-hugo/taghirad13_screw_axis_representation.png" caption="Figure 3: Pure rotation about a screw axis" >}} @@ -158,7 +158,7 @@ Three other types of Euler angles are consider with respect to a moving frame: t The pitch, roll and yaw angles are defined for a moving object in space as the rotations along the lateral, longitudinal and vertical axes attached to the moving object. - + {{< figure src="/ox-hugo/taghirad13_pitch-roll-yaw.png" caption="Figure 4: Definition of pitch, roll and yaw angles on an air plain" >}} @@ -260,7 +260,7 @@ If the pose of a rigid body \\(\\{{}^A\bm{R}\_B, {}^A\bm{P}\_{O\_B}\\}\\) is giv ### Homogeneous Transformations {#homogeneous-transformations} -To describe general transformations, we introduce the \\(4\times1\\) **homogeneous coordinates**, and Eq. [eq:chasles_therorem](#eq:chasles_therorem) is generalized to +To describe general transformations, we introduce the \\(4\times1\\) **homogeneous coordinates**, and Eq. \eqref{eq:chasles_therorem} is generalized to \begin{equation} \tcmbox{{}^A\bm{P} = {}^A\bm{T}\_B {}^B\bm{P}} @@ -363,7 +363,7 @@ There exist transformations to from screw displacement notation to the transform Let us consider the motion of a rigid body described at three locations (Figure [fig:consecutive_transformations](#fig:consecutive_transformations)). Frame \\(\\{\bm{A}\\}\\) represents the initial location, frame \\(\\{\bm{B}\\}\\) is an intermediate location, and frame \\(\\{\bm{C}\\}\\) represents the rigid body at its final location. - + {{< figure src="/ox-hugo/taghirad13_consecutive_transformations.png" caption="Figure 5: Motion of a rigid body represented at three locations by frame \\(\\{\bm{A}\\}\\), \\(\\{\bm{B}\\}\\) and \\(\\{\bm{C}\\}\\)" >}} @@ -426,7 +426,7 @@ Hence, the **inverse of the transformation matrix** can be obtain by ## Kinematics {#kinematics} - + ### Introduction {#introduction} @@ -533,7 +533,7 @@ The position of the point \\(O\_B\\) of the moving platform is described by the \end{bmatrix} \end{equation} - + {{< figure src="/ox-hugo/taghirad13_stewart_schematic.png" caption="Figure 6: Geometry of a Stewart-Gough platform" >}} @@ -586,7 +586,7 @@ The complexity of the problem depends widely on the manipulator architecture and ## Jacobian: Velocities and Static Forces {#jacobian-velocities-and-static-forces} - + ### Introduction {#introduction} @@ -625,7 +625,7 @@ The direction of \\(\bm{\Omega}\\) indicates the instantaneous axis of rotation -The angular velocity vector is related to the screw formalism by equation [eq:angular_velocity_vector](#eq:angular_velocity_vector). +The angular velocity vector is related to the screw formalism by equation \eqref{eq:angular_velocity_vector}. \begin{equation} \tcmbox{\bm{\Omega} \triangleq \dot{\theta} \hat{\bm{s}}} @@ -683,7 +683,7 @@ The matrix \\(\bm{\Omega}^\times\\) denotes a **skew-symmetric matrix** defined Now consider the general motion of a rigid body shown in Figure [fig:general_motion](#fig:general_motion), in which a moving frame \\(\\{\bm{B}\\}\\) is attached to the rigid body and **the problem is to find the absolute velocity** of point \\(P\\) with respect to a fixed frame \\(\\{\bm{A}\\}\\). - + {{< figure src="/ox-hugo/taghirad13_general_motion.png" caption="Figure 7: Instantaneous velocity of a point \\(P\\) with respect to a moving frame \\(\\{\bm{B}\\}\\)" >}} @@ -700,7 +700,7 @@ The time derivative of the rotation matrix \\({}^A\dot{\bm{R}}\_B\\) is: \tcmbox{{}^A\dot{\bm{R}}\_B = {}^A\bm{\Omega}^\times \ {}^A\bm{R}\_B} \end{equation} -And we finally obtain equation [eq:absolute_velocity_formula](#eq:absolute_velocity_formula). +And we finally obtain equation \eqref{eq:absolute_velocity_formula}.
@@ -760,7 +760,7 @@ The **general Jacobian matrix** is defined as: \dot{\bm{q}} = \bm{J} \dot{\bm{\mathcal{X}}} \end{equation} -From equation [eq:jacobians](#eq:jacobians), we have: +From equation \eqref{eq:jacobians}, we have: \begin{equation} \bm{J} = {\bm{J}\_q}^{-1} \bm{J}\_x @@ -847,7 +847,7 @@ Moreover, we have: - \\({}^A\dot{\bm{R}}\_B {}^B\bm{b}\_i = {}^A\bm{\omega} \times {}^A\bm{R}\_B {}^B\bm{b}\_i = {}^A\bm{\omega} \times {}^A\bm{b}\_i\\) in which \\({}^A\bm{\omega}\\) denotes the angular velocity of the moving platform expressed in the fixed frame \\(\\{\bm{A}\\}\\). - \\(l\_i {}^A\dot{\hat{\bm{s}}}\_i = l\_i \left( {}^A\bm{\omega}\_i \times \hat{\bm{s}}\_i \right)\\) in which \\({}^A\bm{\omega}\_i\\) is the angular velocity of limb \\(i\\) express in fixed frame \\(\\{\bm{A}\\}\\). -Then, the velocity loop closure [eq:loop_closure_limb_diff](#eq:loop_closure_limb_diff) simplifies to +Then, the velocity loop closure \eqref{eq:loop_closure_limb_diff} simplifies to \\[ {}^A\bm{v}\_p + {}^A\bm{\omega} \times {}^A\bm{b}\_i = \dot{l}\_i {}^A\hat{\bm{s}}\_i + l\_i ({}^A\bm{\omega}\_i \times \hat{\bm{s}}\_i) \\] By dot multiply both side of the equation by \\(\hat{\bm{s}}\_i\\): @@ -884,9 +884,9 @@ We then omit the superscript \\(A\\) and we can rearrange the 6 equations into a #### Singularity Analysis {#singularity-analysis} It is of primary importance to avoid singularities in a given workspace. -To study the singularity configurations of the Stewart-Gough platform, we consider the Jacobian matrix determined with the equation [eq:jacobian_formula_stewart](#eq:jacobian_formula_stewart).
+To study the singularity configurations of the Stewart-Gough platform, we consider the Jacobian matrix determined with the equation \eqref{eq:jacobian_formula_stewart}.
-From equation [eq:jacobians](#eq:jacobians), it is clear that for the Stewart-Gough platform, \\(\bm{J}\_q = \bm{I}\\) and \\(\bm{J}\_x = \bm{J}\\). +From equation \eqref{eq:jacobians}, it is clear that for the Stewart-Gough platform, \\(\bm{J}\_q = \bm{I}\\) and \\(\bm{J}\_x = \bm{J}\\). Hence the manipulator has **no inverse kinematic singularities** within the manipulator workspace, but **may possess forward kinematic singularity** when \\(\bm{J}\\) becomes rank deficient. This may occur when \\[ \det \bm{J} = 0 \\] @@ -942,7 +942,7 @@ We obtain that the **Jacobian matrix** constructs the **transformation needed to As shown in Figure [fig:stewart_static_forces](#fig:stewart_static_forces), the twist of moving platform is described by a 6D vector \\(\dot{\bm{\mathcal{X}}} = \left[ {}^A\bm{v}\_P \ {}^A\bm{\omega} \right]^T\\), in which \\({}^A\bm{v}\_P\\) is the velocity of point \\(O\_B\\), and \\({}^A\bm{\omega}\\) is the angular velocity of moving platform.
- + {{< figure src="/ox-hugo/taghirad13_stewart_static_forces.png" caption="Figure 8: Free-body diagram of forces and moments action on the moving platform and each limb of the Stewart-Gough platform" >}} @@ -1006,7 +1006,7 @@ The relation between the applied actuator force \\(\tau\_i\\) and the correspond in which \\(k\_i\\) denotes the **stiffness constant of the actuator**.
-Re-writing the equation [eq:stiffness_actuator](#eq:stiffness_actuator) for all limbs in a matrix form result in +Re-writing the equation \eqref{eq:stiffness_actuator} for all limbs in a matrix form result in \begin{equation} \tcmbox{\bm{\tau} = \mathcal{K} \cdot \Delta \bm{q}} @@ -1015,7 +1015,7 @@ Re-writing the equation [eq:stiffness_actuator](#eq:stiffness_actuator) for all in which \\(\bm{\tau}\\) is the vector of actuator forces, and \\(\Delta \bm{q}\\) corresponds to the actuator deflections. \\(\mathcal{K} = \text{diag}\left[ k\_1 \ k\_2 \dots k\_m \right]\\) is an \\(m \times m\\) diagonal matrix composed of the actuator stiffness constants.
-Writing the Jacobian relation given in equation [eq:jacobian_disp](#eq:jacobian_disp) for infinitesimal deflection read +Writing the Jacobian relation given in equation \eqref{eq:jacobian_disp} for infinitesimal deflection read \begin{equation} \Delta \bm{q} = \bm{J} \cdot \Delta \bm{\mathcal{X}} @@ -1023,19 +1023,19 @@ Writing the Jacobian relation given in equation [eq:jacobian_disp](#eq:jacobian_ in which \\(\Delta \bm{\mathcal{X}} = [\Delta x\ \Delta y\ \Delta z\ \Delta\theta x\ \Delta\theta y\ \Delta\theta z]\\) is the infinitesimal linear and angular deflection of the moving platform. -Furthermore, rewriting the Jacobian as the projection of actuator forces to the moving platform [eq:jacobian_forces](#eq:jacobian_forces) gives +Furthermore, rewriting the Jacobian as the projection of actuator forces to the moving platform \eqref{eq:jacobian_forces} gives \begin{equation} \bm{\mathcal{F}} = \bm{J}^T \bm{\tau} \end{equation} -Hence, by substituting [eq:stiffness_matrix_relation](#eq:stiffness_matrix_relation) and [eq:jacobian_disp_inf](#eq:jacobian_disp_inf) in [eq:jacobian_force_inf](#eq:jacobian_force_inf), we obtain: +Hence, by substituting \eqref{eq:stiffness_matrix_relation} and \eqref{eq:jacobian_disp_inf} in \eqref{eq:jacobian_force_inf}, we obtain: \begin{equation} \tcmbox{\bm{\mathcal{F}} = \underbrace{\bm{J}^T \mathcal{K} \bm{J}}\_{\bm{K}} \cdot \Delta \bm{\mathcal{X}}} \end{equation} -Equation [eq:stiffness_jacobian](#eq:stiffness_jacobian) implies that the moving platform output wrench is related to its deflection by the **stiffness matrix** \\(K\\). +Equation \eqref{eq:stiffness_jacobian} implies that the moving platform output wrench is related to its deflection by the **stiffness matrix** \\(K\\).
@@ -1099,7 +1099,7 @@ in which \\(\sigma\_{\text{min}}\\) and \\(\sigma\_{\text{max}}\\) are the small In this section, we restrict our analysis to a 3-6 structure (Figure [fig:stewart36](#fig:stewart36)) in which there exist six distinct attachment points \\(A\_i\\) on the fixed base and three moving attachment point \\(B\_i\\). - + {{< figure src="/ox-hugo/taghirad13_stewart36.png" caption="Figure 9: Schematic of a 3-6 Stewart-Gough platform" >}} @@ -1129,7 +1129,7 @@ The largest axis of the stiffness transformation hyper-ellipsoid is given by thi ## Dynamics {#dynamics} - + ### Introduction {#introduction} @@ -1213,7 +1213,7 @@ where \\(\\{\theta, \hat{\bm{s}}\\}\\) are the screw parameters representing the
-As shown by [eq:angular_acceleration](#eq:angular_acceleration), the angular acceleration of the rigid body is also along the screw axis \\(\hat{\bm{s}}\\) with a magnitude equal to \\(\ddot{\theta}\\). +As shown by \eqref{eq:angular_acceleration}, the angular acceleration of the rigid body is also along the screw axis \\(\hat{\bm{s}}\\) with a magnitude equal to \\(\ddot{\theta}\\). ##### Linear Acceleration of a Point {#linear-acceleration-of-a-point} @@ -1260,7 +1260,7 @@ For the case where \\(P\\) is a point embedded in the rigid body, \\({}^B\bm{v}\ In this section, the properties of mass, namely **center of mass**, **moments of inertia** and its characteristics and the required transformations are described. - + {{< figure src="/ox-hugo/taghirad13_mass_property_rigid_body.png" caption="Figure 10: Mass properties of a rigid body" >}} @@ -1310,7 +1310,7 @@ in which ##### Principal Axes {#principal-axes} -As seen in equation [eq:moment_inertia](#eq:moment_inertia), the inertia matrix elements are a function of mass distribution of the rigid body with respect to the frame \\(\\{\bm{A}\\}\\). +As seen in equation \eqref{eq:moment_inertia}, the inertia matrix elements are a function of mass distribution of the rigid body with respect to the frame \\(\\{\bm{A}\\}\\). Hence, it is possible to find **orientations of frame** \\(\\{\bm{A}\\}\\) in which the product of inertia terms vanish and inertia matrix becomes **diagonal**: \begin{equation} @@ -1374,7 +1374,7 @@ in which \\({}^A\bm{v}\_C\\) denotes the velocity of the center of mass with res This result implies that the **total linear momentum** of differential masses is equal to the linear momentum of a **point mass** \\(m\\) located at the **center of mass**. This highlights the important of the center of mass in dynamic formulation of rigid bodies. - + {{< figure src="/ox-hugo/taghirad13_angular_momentum_rigid_body.png" caption="Figure 11: The components of the angular momentum of a rigid body about \\(A\\)" >}} @@ -1398,10 +1398,10 @@ Therefore, angular momentum of the rigid body about point \\(A\\) is reduced to in which \\[ {}^C\bm{H} = \int\_V \bm{r} \times (\bm{\Omega} \times \bm{r}) \rho dV = {}^C\bm{I} \cdot \bm{\Omega} \\] -Equation [eq:angular_momentum](#eq:angular_momentum) reveals that angular momentum of a rigid body about a point \\(A\\) can be written as \\(\bm{p}\_c \times \bm{G}\_c\\), which is the contribution of linear momentum of the rigid body about point \\(A\\), and \\({}^C\bm{H}\\) which is the angular momentum of the rigid body about the center of mass. +Equation \eqref{eq:angular_momentum} reveals that angular momentum of a rigid body about a point \\(A\\) can be written as \\(\bm{p}\_c \times \bm{G}\_c\\), which is the contribution of linear momentum of the rigid body about point \\(A\\), and \\({}^C\bm{H}\\) which is the angular momentum of the rigid body about the center of mass. This also highlights the important of the center of mass in the dynamic analysis of rigid bodies. -If the center of mass is taken as the reference point, the relation describing angular momentum [eq:angular_momentum](#eq:angular_momentum) is very analogous to that of linear momentum [eq:linear_momentum](#eq:linear_momentum). +If the center of mass is taken as the reference point, the relation describing angular momentum \eqref{eq:angular_momentum} is very analogous to that of linear momentum \eqref{eq:linear_momentum}. ##### Kinetic Energy {#kinetic-energy} @@ -1519,7 +1519,7 @@ The position vector of these two center of masses can be determined by the follo \bm{p}\_{i\_2} &= \bm{a}\_{i} + ( l\_i - c\_{i\_2}) \hat{\bm{s}}\_{i} \end{align} - + {{< figure src="/ox-hugo/taghirad13_free_body_diagram_stewart.png" caption="Figure 12: Free-body diagram of the limbs and the moving platform of a general Stewart-Gough manipulator" >}} @@ -1615,7 +1615,7 @@ in which \\(\bm{\mathcal{X}} = [\bm{x}\_P, \bm{\theta}]^T\\) is the motion varia #### Closed-Form Dynamics {#closed-form-dynamics} -While dynamic formulation in the form of Equation [eq:dynamic_formulation_implicit](#eq:dynamic_formulation_implicit) can be used to simulate inverse dynamics of the Stewart-Gough platform, its implicit nature makes it unpleasant for the dynamic analysis and control. +While dynamic formulation in the form of Equation \eqref{eq:dynamic_formulation_implicit} can be used to simulate inverse dynamics of the Stewart-Gough platform, its implicit nature makes it unpleasant for the dynamic analysis and control. ##### Closed-Form Dynamics of the Limbs {#closed-form-dynamics-of-the-limbs} @@ -1673,7 +1673,7 @@ It is preferable to use the **screw coordinates** for representing the angular m \ddot{\bm{\mathcal{X}}} = \begin{bmatrix}\bm{a}\_p \\ \dot{\bm{\omega}}\end{bmatrix}} \end{equation} -Equations [eq:dyn_form_implicit_trans](#eq:dyn_form_implicit_trans) and [eq:dyn_form_implicit_rot](#eq:dyn_form_implicit_rot) can be simply converted into a closed form of Equation [eq:close_form_dynamics_platform](#eq:close_form_dynamics_platform) with the following terms: +Equations \eqref{eq:dyn_form_implicit_trans} and \eqref{eq:dyn_form_implicit_rot} can be simply converted into a closed form of Equation \eqref{eq:close_form_dynamics_platform} with the following terms: \begin{equation} \begin{aligned} @@ -1733,11 +1733,11 @@ in which As shown in Figure [fig:stewart_forward_dynamics](#fig:stewart_forward_dynamics), it is **assumed that actuator forces and external disturbance wrench applied to the manipulator are given and the resulting trajectory of the moving platform is to be determined**. - + {{< figure src="/ox-hugo/taghirad13_stewart_forward_dynamics.png" caption="Figure 13: Flowchart of forward dynamics implementation sequence" >}} -The closed-form dynamic formulation of the Stewart-Gough platform corresponds to the set of equations given in [eq:closed_form_dynamic_stewart_wanted](#eq:closed_form_dynamic_stewart_wanted), whose terms are given in [eq:close_form_dynamics_stewart_terms](#eq:close_form_dynamics_stewart_terms). +The closed-form dynamic formulation of the Stewart-Gough platform corresponds to the set of equations given in \eqref{eq:closed_form_dynamic_stewart_wanted}, whose terms are given in \eqref{eq:close_form_dynamics_stewart_terms}. ##### Inverse Dynamics Simulation {#inverse-dynamics-simulation} @@ -1752,11 +1752,11 @@ For such a trajectory, \\(\bm{\mathcal{X}}\_{d}(t)\\) and the time derivatives \ The next step is to solve the inverse kinematics of the manipulator and to find the limbs' linear and angular positions, velocity and acceleration as a function of the manipulator trajectory. The manipulator Jacobian matrix \\(\bm{J}\\) is also calculated in this step. -Next, the dynamic matrices given in the closed-form formulations of the limbs and the moving platform are calculated using equations [eq:closed_form_intermediate_parameters](#eq:closed_form_intermediate_parameters) and [eq:close_form_dynamics_stewart_terms](#eq:close_form_dynamics_stewart_terms), respectively.
+Next, the dynamic matrices given in the closed-form formulations of the limbs and the moving platform are calculated using equations \eqref{eq:closed_form_intermediate_parameters} and \eqref{eq:close_form_dynamics_stewart_terms}, respectively.
-To combine the corresponding matrices, an to generate the whole manipulator dynamics, it is necessary to find intermediate Jacobian matrices \\(\bm{J}\_i\\), given in [eq:jacobian_intermediate](#eq:jacobian_intermediate), and then compute compatible matrices for the limbs given in [eq:closed_form_stewart_manipulator](#eq:closed_form_stewart_manipulator). +To combine the corresponding matrices, an to generate the whole manipulator dynamics, it is necessary to find intermediate Jacobian matrices \\(\bm{J}\_i\\), given in \eqref{eq:jacobian_intermediate}, and then compute compatible matrices for the limbs given in \eqref{eq:closed_form_stewart_manipulator}. Now that all the terms required to **computed to actuator forces required to generate such a trajectory** is computed, let us define \\(\bm{\mathcal{F}}\\) as the resulting Cartesian wrench applied to the moving platform. -This wrench can be calculated from the summation of all inertial and external forces **excluding the actuator torques** \\(\bm{\tau}\\) in the closed-form dynamic formulation [eq:closed_form_dynamic_stewart_wanted](#eq:closed_form_dynamic_stewart_wanted). +This wrench can be calculated from the summation of all inertial and external forces **excluding the actuator torques** \\(\bm{\tau}\\) in the closed-form dynamic formulation \eqref{eq:closed_form_dynamic_stewart_wanted}. By this definition, \\(\bm{\mathcal{F}}\\) can be viewed as the projector of the actuator forces acting on the manipulator, mapped to the Cartesian space. Since there is no redundancy in actuation in the Stewart-Gough manipulator, the Jacobian matrix \\(\bm{J}\\), squared and actuator forces can be uniquely determined from this wrench, by \\(\bm{\tau} = \bm{J}^{-T} \bm{\mathcal{F}}\\), provided \\(\bm{J}\\) is non-singular. @@ -1766,7 +1766,7 @@ Therefore, actuator forces \\(\bm{\tau}\\) are computed in the simulation from \bm{\tau} = \bm{J}^{-T} \left( \bm{M}(\bm{\mathcal{X}})\ddot{\bm{\mathcal{X}}} + \bm{C}(\bm{\mathcal{X}}, \dot{\bm{\mathcal{X}}})\dot{\bm{\mathcal{X}}} + \bm{G}(\bm{\mathcal{X}}) - \bm{\mathcal{F}}\_d \right) \end{equation} - + {{< figure src="/ox-hugo/taghirad13_stewart_inverse_dynamics.png" caption="Figure 14: Flowchart of inverse dynamics implementation sequence" >}} @@ -1791,7 +1791,7 @@ Therefore, actuator forces \\(\bm{\tau}\\) are computed in the simulation from ## Motion Control {#motion-control} - + ### Introduction {#introduction} @@ -1812,7 +1812,7 @@ However, using advanced techniques in nonlinear and MIMO control permits to over ### Controller Topology {#controller-topology} - +
@@ -1861,7 +1861,7 @@ Figure [fig:general_topology_motion_feedback](#fig:general_topology_motion_feedb In such a structure, the measured position and orientation of the manipulator is compared to its desired value to generate the **motion error vector** \\(\bm{e}\_\mathcal{X}\\). The controller uses this error information to generate suitable commands for the actuators to minimize the tracking error.
- + {{< figure src="/ox-hugo/taghirad13_general_topology_motion_feedback.png" caption="Figure 15: The general topology of motion feedback control: motion variable \\(\bm{\mathcal{X}}\\) is measured" >}} @@ -1871,7 +1871,7 @@ The relation between the **differential motion variables** \\(\dot{\bm{q}}\\) an It is then possible to use the forward kinematic analysis to calculate \\(\bm{\mathcal{X}}\\) from the measured joint variables \\(\bm{q}\\), and one may use the control topology depicted in Figure [fig:general_topology_motion_feedback_bis](#fig:general_topology_motion_feedback_bis) to implement such a controller. - + {{< figure src="/ox-hugo/taghirad13_general_topology_motion_feedback_bis.png" caption="Figure 16: The general topology of motion feedback control: the active joint variable \\(\bm{q}\\) is measured" >}} @@ -1885,7 +1885,7 @@ To overcome the implementation problem of the control topology in Figure [fig:ge In this topology, depicted in Figure [fig:general_topology_motion_feedback_ter](#fig:general_topology_motion_feedback_ter), the desired motion trajectory of the robot \\(\bm{\mathcal{X}}\_d\\) is used in an **inverse kinematic analysis** to find the corresponding desired values for joint variable \\(\bm{q}\_d\\). Hence, the controller is designed based on the **joint space error** \\(\bm{e}\_q\\). - + {{< figure src="/ox-hugo/taghirad13_general_topology_motion_feedback_ter.png" caption="Figure 17: The general topology of motion feedback control: the active joint variable \\(\bm{q}\\) is measured, and the inverse kinematic analysis is used" >}} @@ -1899,7 +1899,7 @@ For the topology in Figure [fig:general_topology_motion_feedback_ter](#fig:gener To generate a **direct input to output relation in the task space**, consider the topology depicted in Figure [fig:general_topology_motion_feedback_quater](#fig:general_topology_motion_feedback_quater). A force distribution block is added which maps the generated wrench in the task space \\(\bm{\mathcal{F}}\\), to its corresponding actuator forces/torque \\(\bm{\tau}\\). - + {{< figure src="/ox-hugo/taghirad13_general_topology_motion_feedback_quater.png" caption="Figure 18: The general topology of motion feedback control in task space: the motion variable \\(\bm{\mathcal{X}}\\) is measured, and the controller output generates wrench in task space" >}} @@ -1909,7 +1909,7 @@ For a fully parallel manipulator such as the Stewart-Gough platform, this mappin ### Motion Control in Task Space {#motion-control-in-task-space} - + #### Decentralized PD Control {#decentralized-pd-control} @@ -1918,7 +1918,7 @@ In the control structure in Figure [fig:decentralized_pd_control_task_space](#fi The decentralized controller consists of **six disjoint linear controllers** acting on each error component \\(\bm{e}\_x = [e\_x,\ e\_y,\ e\_z,\ e\_{\theta\_x},\ e\_{\theta\_y},\ e\_{\theta\_z}]\\). The PD controller is denoted by \\(\bm{K}\_d s + \bm{K}\_p\\), in which \\(\bm{K}\_d\\) and \\(\bm{K}\_p\\) are \\(6 \times 6\\) **diagonal matrices** denoting the derivative and proportional controller gains for each error term. - + {{< figure src="/ox-hugo/taghirad13_decentralized_pd_control_task_space.png" caption="Figure 19: Decentralized PD controller implemented in task space" >}} @@ -1941,7 +1941,7 @@ A feedforward wrench denoted by \\(\bm{\mathcal{F}}\_{ff}\\) may be added to the This term is generated from the dynamic model of the manipulator in the task space, represented in a closed form by the following equation: \\[ \bm{\mathcal{F}}\_{ff} = \bm{\hat{M}}(\bm{\mathcal{X}}\_d)\ddot{\bm{\mathcal{X}}}\_d + \bm{\hat{C}}(\bm{\mathcal{X}}\_d, \dot{\bm{\mathcal{X}}}\_d)\dot{\bm{\mathcal{X}}}\_d + \bm{\hat{G}}(\bm{\mathcal{X}}\_d) \\] - + {{< figure src="/ox-hugo/taghirad13_feedforward_control_task_space.png" caption="Figure 20: Feed forward wrench added to the decentralized PD controller in task space" >}} @@ -2004,7 +2004,7 @@ Furthermore, mass matrix is added in the forward path in addition to the desired As for the feedforward control, the **dynamics and kinematic parameters of the robot are needed**, and in practice estimates of these matrices are used.
- + {{< figure src="/ox-hugo/taghirad13_inverse_dynamics_control_task_space.png" caption="Figure 21: General configuration of inverse dynamics control implemented in task space" >}} @@ -2056,9 +2056,9 @@ These are the reasons why, in practice, IDC control is extended to different for To develop the simplest possible implementable IDC, let us recall dynamic formulation complexities: -- the manipulator mass matrix \\(\bm{M}(\bm{\mathcal{X}})\\) is derived from kinetic energy of the manipulator (Eq. [eq:kinetic_energy](#eq:kinetic_energy)) -- the gravity vector \\(\bm{G}(\bm{\mathcal{X}})\\) is derived from potential energy (Eq. [eq:gravity_vectory](#eq:gravity_vectory)) -- the Coriolis and centrifugal matrix \\(\bm{C}(\bm{\mathcal{X}}, \dot{\bm{\mathcal{X}}})\\) is derived from Eq. [eq:gravity_vectory](#eq:gravity_vectory) +- the manipulator mass matrix \\(\bm{M}(\bm{\mathcal{X}})\\) is derived from kinetic energy of the manipulator (Eq. \eqref{eq:kinetic_energy}) +- the gravity vector \\(\bm{G}(\bm{\mathcal{X}})\\) is derived from potential energy (Eq. \eqref{eq:gravity_vectory}) +- the Coriolis and centrifugal matrix \\(\bm{C}(\bm{\mathcal{X}}, \dot{\bm{\mathcal{X}}})\\) is derived from Eq. \eqref{eq:gravity_vectory} The computation of the Coriolis and centrifugal matrix is more intensive than that of the mass matrix. Gravity vector is more easily computable. @@ -2066,7 +2066,7 @@ Gravity vector is more easily computable. However, it is shown that certain properties hold for mass matrix, gravity vector and Coriolis and centrifugal matrix, which might be directly used in the control techniques developed for parallel manipulators. One of the most important properties of dynamic matrices is the skew-symmetric property of the matrix \\(\dot{\bm{M}} - 2 \bm{C}\\) .
-Consider dynamic formulation of parallel robot given in Eq. [eq:closed_form_dynamic_formulation](#eq:closed_form_dynamic_formulation), in which the skew-symmetric property of dynamic matrices is satisfied. +Consider dynamic formulation of parallel robot given in Eq. \eqref{eq:closed_form_dynamic_formulation}, in which the skew-symmetric property of dynamic matrices is satisfied. The simplest form of IDC control effort \\(\bm{\mathcal{F}}\\) consists of: \\[ \bm{\mathcal{F}} = \bm{\mathcal{F}}\_{pd} + \bm{\mathcal{F}}\_{fl} \\] in which the first term \\(\bm{\mathcal{F}}\_{pd}\\) is generated by the simplified PD form on the motion error: @@ -2104,7 +2104,7 @@ A global understanding of the trade-offs involved in each method is needed to em Various sources of uncertainties such as unmodelled dynamics, unknown parameters, calibration error, unknown disturbance wrenches, and varying payloads may exist, and are not seen in dynamic model of the manipulator. -To consider these modeling uncertainty in the closed-loop performance of the manipulator, recall the general closed-form dynamic formulation of the manipulator given in Eq. [eq:closed_form_dynamic_formulation](#eq:closed_form_dynamic_formulation), and modify the inverse dynamics control input \\(\bm{\mathcal{F}}\\) as +To consider these modeling uncertainty in the closed-loop performance of the manipulator, recall the general closed-form dynamic formulation of the manipulator given in Eq. \eqref{eq:closed_form_dynamic_formulation}, and modify the inverse dynamics control input \\(\bm{\mathcal{F}}\\) as \begin{align\*} \bm{\mathcal{F}} &= \hat{\bm{M}}(\bm{\mathcal{X}}) \bm{a}\_r + \hat{\bm{C}}(\bm{\mathcal{X}}, \dot{\bm{\mathcal{X}}}) \dot{\bm{\mathcal{X}}} + \hat{\bm{G}}(\bm{\mathcal{X}})\\\\\\ @@ -2126,14 +2126,14 @@ in which \\[ \bm{\eta} = \bm{M}^{-1} \left( \tilde{\bm{M}} \bm{a}\_r + \tilde{\bm{C}} \dot{\bm{\mathcal{X}}} + \tilde{\bm{G}} \right) \\] is a measure of modeling uncertainty. - + {{< figure src="/ox-hugo/taghirad13_robust_inverse_dynamics_task_space.png" caption="Figure 22: General configuration of robust inverse dynamics control implemented in the task space" >}} #### Adaptive Inverse Dynamics Control {#adaptive-inverse-dynamics-control} - + {{< figure src="/ox-hugo/taghirad13_adaptative_inverse_control_task_space.png" caption="Figure 23: General configuration of adaptative inverse dynamics control implemented in task space" >}} @@ -2218,7 +2218,7 @@ In this control structure, depicted in Figure [fig:decentralized_pd_control_join The PD controller is denoted by \\(\bm{K}\_d s + \bm{K}\_p\\), where \\(\bm{K}\_d\\) and \\(\bm{K}\_p\\) are \\(n \times n\\) **diagonal** matrices denoting the derivative and proportional controller gains, respectively.
- + {{< figure src="/ox-hugo/taghirad13_decentralized_pd_control_joint_space.png" caption="Figure 24: Decentralized PD controller implemented in joint space" >}} @@ -2240,7 +2240,7 @@ To remedy these shortcomings, some modifications have been proposed to this stru The tracking performance of the simple PD controller implemented in the joint space is usually not sufficient at different configurations. To improve the tracking performance, a feedforward actuator force denoted by \\(\bm{\tau}\_{ff}\\) may be added to the structure of the controller as depicted in Figure [fig:feedforward_pd_control_joint_space](#fig:feedforward_pd_control_joint_space). - + {{< figure src="/ox-hugo/taghirad13_feedforward_pd_control_joint_space.png" caption="Figure 25: Feed forward actuator force added to the decentralized PD controller in joint space" >}} @@ -2288,7 +2288,7 @@ Furthermore, the mass matrix is acting in the **forward path**, in addition to t Note that to generate this term, the **dynamic formulation** of the robot, and its **kinematic and dynamic parameters are needed**. In practice, exact knowledge of dynamic matrices are not available, and there estimates are used.
- + {{< figure src="/ox-hugo/taghirad13_inverse_dynamics_control_joint_space.png" caption="Figure 26: General configuration of inverse dynamics control implemented in joint space" >}} @@ -2564,7 +2564,7 @@ Hence, it is recommended to design and implement controllers in the task space, ## Force Control {#force-control} - + ### Introduction {#introduction} @@ -2620,7 +2620,7 @@ The output control loop is called the **primary loop**, while the inner loop is
- + {{< figure src="/ox-hugo/taghirad13_cascade_control.png" caption="Figure 27: Block diagram of a closed-loop system with cascade control" >}} @@ -2654,7 +2654,7 @@ As seen in Figure [fig:taghira13_cascade_force_outer_loop](#fig:taghira13_cascad The output of motion controller is also designed in the task space, and to convert it to implementable actuator force \\(\bm{\tau}\\), the force distribution block is considered in this topology.
- + {{< figure src="/ox-hugo/taghira13_cascade_force_outer_loop.png" caption="Figure 28: Cascade topology of force feedback control: position in inner loop and force in outer loop. Moving platform wrench \\(\bm{\mathcal{F}}\\) and motion variable \\(\bm{\mathcal{X}}\\) are measured in the task space" >}} @@ -2662,7 +2662,7 @@ Other alternatives for force control topology may be suggested based on the vari If the force is measured in the joint space, the topology suggested in Figure [fig:taghira13_cascade_force_outer_loop_tau](#fig:taghira13_cascade_force_outer_loop_tau) can be used. In this topology, the measured actuator force vector \\(\bm{\tau}\\) is mapped into its corresponding wrench in the task space by the Jacobian transpose mapping \\(\bm{\mathcal{F}} = \bm{J}^T \bm{\tau}\\).
- + {{< figure src="/ox-hugo/taghira13_cascade_force_outer_loop_tau.png" caption="Figure 29: Cascade topology of force feedback control: position in inner loop and force in outer loop. Actuator forces \\(\bm{\tau}\\) and motion variable \\(\bm{\mathcal{X}}\\) are measured" >}} @@ -2673,7 +2673,7 @@ However, as the inner loop is constructed in the joint space, the desired motion Therefore, the structure and characteristics of the position controller in this topology is totally different from that given in the first two topologies.
- + {{< figure src="/ox-hugo/taghira13_cascade_force_outer_loop_tau_q.png" caption="Figure 30: Cascade topology of force feedback control: position in inner loop and force in outer loop. Actuator forces \\(\bm{\tau}\\) and joint motion variable \\(\bm{q}\\) are measured in the joint space" >}} @@ -2691,7 +2691,7 @@ By this means, when the manipulator is not in contact with a stiff environment, However, when there is interacting wrench \\(\bm{\mathcal{F}}\_e\\) applied to the moving platform, this structure controls the force-motion relation. This configuration may be seen as if the **outer loop generates a desired force trajectory for the inner loop**.
- + {{< figure src="/ox-hugo/taghira13_cascade_force_inner_loop_F.png" caption="Figure 31: Cascade topology of force feedback control: force in inner loop and position in outer loop. Moving platform wrench \\(\bm{\mathcal{F}}\\) and motion variable \\(\bm{\mathcal{X}}\\) are measured in the task space" >}} @@ -2699,7 +2699,7 @@ Other alternatives for control topology may be suggested based on the variations If the force is measured in the joint space, control topology shown in Figure [fig:taghira13_cascade_force_inner_loop_tau](#fig:taghira13_cascade_force_inner_loop_tau) can be used. In such case, the Jacobian transpose is used to map the actuator force to its corresponding wrench in the task space.
- + {{< figure src="/ox-hugo/taghira13_cascade_force_inner_loop_tau.png" caption="Figure 32: Cascade topology of force feedback control: force in inner loop and position in outer loop. Actuator forces \\(\bm{\tau}\\) and motion variable \\(\bm{\mathcal{X}}\\) are measured" >}} @@ -2708,7 +2708,7 @@ The inner loop is based on the measured actuator force vector in the joint space In this topology, the desired motion in the task space is mapped into the joint space using **inverse kinematic** solution, and **both the position and force feedback controllers are designed in the joint space**. Thus, independent controllers for each joint may be suitable for this topology. - + {{< figure src="/ox-hugo/taghira13_cascade_force_inner_loop_tau_q.png" caption="Figure 33: Cascade topology of force feedback control: force in inner loop and position in outer loop. Actuator forces \\(\bm{\tau}\\) and joint motion variable \\(\bm{q}\\) are measured in the joint space" >}} @@ -2727,7 +2727,7 @@ Thus, independent controllers for each joint may be suitable for this topology. ### Direct Force Control {#direct-force-control} - + {{< figure src="/ox-hugo/taghira13_direct_force_control.png" caption="Figure 34: Direct force control scheme, force feedback in the outer loop and motion feedback in the inner loop" >}} @@ -2818,7 +2818,7 @@ The impedance of the system may be found from the Laplace transform of the above
- + {{< figure src="/ox-hugo/taghirad13_impedance_control_rlc.png" caption="Figure 35: Analogy of electrical impedance in (a) an electrical RLC circuit to (b) a mechanical mass-spring-damper system" >}} @@ -2877,7 +2877,7 @@ Moreover, direct force-tracking objective is not assigned in this control scheme However, an auxiliary force trajectory \\(\bm{\mathcal{F}}\_a\\) is generated from the motion control law and is used as the reference for the force tracking. By this means, no prescribed force trajectory is tracked, while the **motion control scheme would advise a force trajectory for the robot to ensure the desired impedance regulation**.
- + {{< figure src="/ox-hugo/taghira13_impedance_control.png" caption="Figure 36: Impedance control scheme; motion feedback in the outer loop and force feedback in the inner loop" >}} diff --git a/content/inproceedings/mcinroy99_dynam.md b/content/inproceedings/mcinroy99_dynam.md new file mode 100644 index 0000000..d397ae5 --- /dev/null +++ b/content/inproceedings/mcinroy99_dynam.md @@ -0,0 +1,173 @@ ++++ +title = "Dynamic modeling of flexure jointed hexapods for control purposes" +author = ["Thomas Dehaeze"] +draft = false ++++ + +Tags +: [Stewart Platforms]({{< relref "stewart_platforms" >}}), [Flexible Joints]({{< relref "flexible_joints" >}}) + +Reference +: (McInroy, 1999) + +Author(s) +: McInroy, J. + +Year +: 1999 + +This conference paper has been further published in a journal as a short note (McInroy, 2002). + + +## Abstract {#abstract} + +> This paper presents a new dynamic model suitable for control of flexure jointed hexapods (FJH). +> +> Novel contributions include: +> +> 1. Base acceleration inputs are included +> 2. The dynamic model is experimentally verified +> 3. The model is developed so that it is suitable for control +> 4. A decoupled force control is derived + + +## Strut Dynamics {#strut-dynamics} + +The actuators for FJHs can be divided into two categories: + +1. soft (voice coil), which employs a spring flexure mount +2. hard (piezoceramic or magnetostrictive), which employs a compressive load spring. + + + +{{< figure src="/ox-hugo/mcinroy99_general_hexapod.png" caption="Figure 1: A general Stewart Platform" >}} + +Since both actuator types employ force production in parallel with a spring, they can both be modeled as shown in Figure [2](#orga202dc3). + +In order to provide low frequency passive vibration isolation, the hard actuators are sometimes placed in series with additional passive springs. + + + +{{< figure src="/ox-hugo/mcinroy99_strut_model.png" caption="Figure 2: The dynamics of the i'th strut. A parallel spring, damper and actuator drives the moving mass of the strut and a payload" >}} + + +
+ Table 1: + Definition of quantities on Figure 2 +
+ +| **Symbol** | **Meaning** | +|------------------------------|--------------------------------------------| +| \\(m\_i\\) | moving strut mass | +| \\(k\_i\\) | spring constant | +| \\(b\_i\\) | damping constant | +| \\(f\_m\\) | force the actuator applies | +| \\(f\_{p\_i}\\) | forced exerted by the payload | +| \\(p\_i\\) | three dimensional position of the top | +| \\(q\_i\\) | three dimensional position of the bottom | +| \\(l\_i\\) | strut length | +| \\(l\_{r\_i}\\) | relaxed strut length | +| \\(v\_i = p\_i - q\_i\\) | vector pointing from the bottom to the top | +| \\(\hat{u}\_i = v\_i/l\_i\\) | unit direction of the strut | + +It is here supposed that \\(f\_{p\_i}\\) is predominantly in the strut direction (explained in (McInroy, 2002)). +This is a good approximation unless the spherical joints and extremely stiff or massive, of high inertia struts are used. +This allows to reduce considerably the complexity of the model. + +From Figure [2](#orga202dc3) (b), forces along the strut direction are summed to yield (projected along the strut direction, hence the \\(\hat{u}\_i^T\\) term): + +\begin{equation} + m\_i \hat{u}\_i^T \ddot{p}\_i = f\_{m\_i} - f\_{p\_i} - m\_i \hat{u}\_i^Tg - k\_i(l\_i - l\_{r\_i}) - b\_i \dot{l}\_i +\end{equation} + +The acceleration \\(\hat{u}\_i^T \ddot{p}\_i\\) can be written as: +\\[ \hat{u}\_i^T \ddot{p}\_i = \ddot{l}\_i + \hat{u}\_i^T \ddot{q}\_i - \dot{\hat{u}}\_i^T \dot{v}\_i \\] + +- [ ] Not sure how the last term is obtained + +Separating strut and base accelerations, and putting all six strut equations in a single vector yields: + +\begin{equation} + f\_p = f\_m - M\_s \ddot{l} - B \dot{l} - K(l - l\_r) - M\_s \ddot{q}\_u - M\_s g\_u + M\_s v\_2 \label{eq:strut\_dynamics\_vec} +\end{equation} + +where: + +- \\(\ddot{q}\_u = \left[ \hat{u}\_1^T \ddot{q}\_1 \ \dots \ \hat{u}\_6^T \ddot{q}\_6 \right]^T\\) notes the vector of base accelerations in the strut directions +- \\(g\_u\\) denotes the vector of gravity accelerations in the strut directions +- \\(Ms = \diag([m\_1\ \dots \ m\_6])\\), \\(f\_p = [f\_{p\_1}\ \dots \ f\_{p\_6}]^T\\) +- \\(v\_2 = [ \dot{\hat{u}}\_1^T \dot{v}\_1 \ \dots \ \dot{\hat{u}}\_6^T \dot{v}\_6 ]^T\\) + + +## Payload Dynamics {#payload-dynamics} + +The payload is modeled as a rigid body: + +\begin{equation} +\underbrace{\begin{bmatrix} +m I\_3 & 0\_{3\times 3} \\\\\\ +0\_{3\times 3} & {}^cI +\end{bmatrix}}\_{M\_x} \ddot{\mathcal{X}} + \underbrace{\begin{bmatrix} + 0\_{3 \times 1} \\ \omega \times {}^cI\omega +\end{bmatrix}}\_{c(\omega)} = \mathcal{F} \label{eq:payload\_dynamics} +\end{equation} + +where: + +- \\(\ddot{\mathcal{X}}\\) is the \\(6 \times 1\\) generalized acceleration of the payload's center of mass +- \\(\omega\\) is the \\(3 \times 1\\) payload's angular velocity vector +- \\(\mathcal{F}\\) is the \\(6 \times 1\\) generalized force exerted on the payload +- \\(M\_x\\) is the combined mass/inertia matrix of the payload, written in the payload frame {P} +- \\(c(\omega)\\) represents the shown vector of Coriolis and centripetal terms + +Note \\(\dot{\mathcal{X}} = [\dot{p}^T\ \omega^T]^T\\) denotes the time derivative of the payload's combined position and orientation (or pose) with respect to a universal frame of reference {U}. + +First, consider the **generalized force due to struts**. +Denoting this force as \\(\mathcal{F}\_s\\), it can be calculated form the strut forces as: + +\begin{equation} + \mathcal{F}\_s = {}^UJ^T f\_p = {}^U\_BR J^T f\_p +\end{equation} + +where \\(J\\) is the manipulator Jacobian and \\({}^U\_BR\\) is the rotation matrix from {B} to {U}. + +The total generalized force acting on the payload is the sum of the strut, exogenous, and gravity forces: + +\begin{equation} + \mathcal{F} = {}^UJ^T f\_p + \mathcal{F}\_e - \begin{bmatrix} mg \\ 0\_{3\times 1} \end{bmatrix} \label{eq:generalized\_force} +\end{equation} + +where: + +- \\(\mathcal{F}\_e\\) represents a vector of exogenous generalized forces applied at the center of mass +- \\(g\\) is the gravity vector + +By combining \eqref{eq:strut_dynamics_vec}, \eqref{eq:payload_dynamics} and \eqref{eq:generalized_force}, a single equation describing the dynamics of a flexure jointed hexapod can be found: + +\begin{aligned} + & {}^UJ^T [ f\_m - M\_s \ddot{l} - B \dot{l} - K(l - l\_r) - M\_s \ddot{q}\_u\\\\\\ + & - M\_s g\_u + M\_s v\_2] + \mathcal{F}\_e - \begin{bmatrix} mg \\ 0\_{3\times 1} \end{bmatrix} = M\_x \ddot{\mathcal{X}} + c(\omega) +\end{aligned} + +Joint (\\(l\\)) and Cartesian (\\(\mathcal{X}\\)) terms are still mixed. +In the next section, a connection between the two will be found to complete the formulation + + +## Relationships between joint and cartesian space {#relationships-between-joint-and-cartesian-space} + + +## Joint Space Dynamics {#joint-space-dynamics} + + +## Control Example {#control-example} + +# Bibliography +McInroy, J., *Dynamic modeling of flexure jointed hexapods for control purposes*, In , Proceedings of the 1999 IEEE International Conference on Control Applications (Cat. No.99CH36328) (pp. ) (1999). : . [↩](#5da427f78c552aa92cd64c2a6df961f1) + +McInroy, J., *Modeling and design of flexure jointed stewart platforms for control purposes*, IEEE/ASME Transactions on Mechatronics, *7(1)*, 95–99 (2002). http://dx.doi.org/10.1109/3516.990892 [↩](#8bfe2d2dce902a584fa016e86a899044) + + +## Backlinks {#backlinks} + +- [Identification and decoupling control of flexure jointed hexapods]({{< relref "chen00_ident_decoup_contr_flexur_joint_hexap" >}}) diff --git a/content/paper/butler11_posit_contr_lithog_equip.md b/content/paper/butler11_posit_contr_lithog_equip.md deleted file mode 100644 index 7d3c6f8..0000000 --- a/content/paper/butler11_posit_contr_lithog_equip.md +++ /dev/null @@ -1,20 +0,0 @@ -+++ -title = "Position control in lithographic equipment" -author = ["Thomas Dehaeze"] -draft = false -+++ - -Tags -: [Multivariable Control]({{< relref "multivariable_control" >}}), [Positioning Stations]({{< relref "positioning_stations" >}}) - -Reference -: (Hans Butler, 2011) - -Author(s) -: Butler, H. - -Year -: 2011 - -# Bibliography -Butler, H., *Position control in lithographic equipment*, IEEE Control Systems, *31(5)*, 28–47 (2011). http://dx.doi.org/10.1109/mcs.2011.941882 [↩](#6a014e3a2ee3e41d20bd0644654c56f0) diff --git a/content/paper/chen00_ident_decoup_contr_flexur_joint_hexap.md b/content/paper/chen00_ident_decoup_contr_flexur_joint_hexap.md deleted file mode 100644 index ad7ed55..0000000 --- a/content/paper/chen00_ident_decoup_contr_flexur_joint_hexap.md +++ /dev/null @@ -1,22 +0,0 @@ -+++ -title = "Identification and decoupling control of flexure jointed hexapods" -author = ["Thomas Dehaeze"] -draft = false -+++ - -Tags -: [Stewart Platforms]({{< relref "stewart_platforms" >}}), [Flexible Joints]({{< relref "flexible_joints" >}}) - -Reference -: (Yixin Chen \& McInroy, 2000) - -Author(s) -: Chen, Y., & McInroy, J. - -Year -: 2000 - -# Bibliography -Chen, Y., & McInroy, J., *Identification and decoupling control of flexure jointed hexapods*, In , Proceedings 2000 ICRA. Millennium Conference. IEEE International Conference on Robotics and Automation. Symposia Proceedings (Cat. No.00CH37065) (pp. ) (2000). : . [↩](#ba05ff213f8e5963d91559d95becfbdb) diff --git a/content/paper/fleming12_estim.md b/content/paper/fleming12_estim.md deleted file mode 100644 index 3b3d2d1..0000000 --- a/content/paper/fleming12_estim.md +++ /dev/null @@ -1,22 +0,0 @@ -+++ -title = "Estimating the resolution of nanopositioning systems from frequency domain data" -author = ["Thomas Dehaeze"] -draft = false -+++ - -Tags -: - - -Reference -: (Andrew Fleming, 2012) - -Author(s) -: Fleming, A. J. - -Year -: 2012 - -# Bibliography -Fleming, A. J., *Estimating the resolution of nanopositioning systems from frequency domain data*, In , 2012 IEEE International Conference on Robotics and Automation (pp. ) (2012). : . [↩](#a1cc9b70316a7dda2f652efd146caf84) diff --git a/content/paper/furqan17_studies_stewar_platf_manip.md b/content/paper/furqan17_studies_stewar_platf_manip.md deleted file mode 100644 index 4475802..0000000 --- a/content/paper/furqan17_studies_stewar_platf_manip.md +++ /dev/null @@ -1,22 +0,0 @@ -+++ -title = "Studies on stewart platform manipulator: a review" -author = ["Thomas Dehaeze"] -draft = false -+++ - -Tags -: [Stewart Platforms]({{< relref "stewart_platforms" >}}) - -Reference -: (Mohd Furqan {\it et al.}, 2017) - -Author(s) -: Furqan, M., Suhaib, M., & Ahmad, N. - -Year -: 2017 - -Lots of references. - -# Bibliography -Furqan, M., Suhaib, M., & Ahmad, N., *Studies on stewart platform manipulator: a review*, Journal of Mechanical Science and Technology, *31(9)*, 4459–4470 (2017). http://dx.doi.org/10.1007/s12206-017-0846-1 [↩](#cc10fe9545c7c381cc2b610e8f91a071) diff --git a/content/paper/gao15_measur_techn_precis_posit.md b/content/paper/gao15_measur_techn_precis_posit.md deleted file mode 100644 index a843ae7..0000000 --- a/content/paper/gao15_measur_techn_precis_posit.md +++ /dev/null @@ -1,20 +0,0 @@ -+++ -title = "Measurement technologies for precision positioning" -author = ["Thomas Dehaeze"] -draft = false -+++ - -Tags -: [Position Sensors]({{< relref "position_sensors" >}}) - -Reference -: (Gao {\it et al.}, 2015) - -Author(s) -: Gao, W., Kim, S., Bosse, H., Haitjema, H., Chen, Y., Lu, X., Knapp, W., … - -Year -: 2015 - -# Bibliography -Gao, W., Kim, S., Bosse, H., Haitjema, H., Chen, Y., Lu, X., Knapp, W., …, *Measurement technologies for precision positioning*, CIRP Annals, *64(2)*, 773–796 (2015). http://dx.doi.org/10.1016/j.cirp.2015.05.009 [↩](#b820b918ced36901ea0ad4bf653202c6) diff --git a/content/paper/hanieh03_activ_stewar.md b/content/paper/hanieh03_activ_stewar.md deleted file mode 100644 index 208cb46..0000000 --- a/content/paper/hanieh03_activ_stewar.md +++ /dev/null @@ -1,34 +0,0 @@ -+++ -title = "Active isolation and damping of vibrations via stewart platform" -author = ["Thomas Dehaeze"] -draft = false -+++ - -Tags -: [Stewart Platforms]({{< relref "stewart_platforms" >}}), [Vibration Isolation]({{< relref "vibration_isolation" >}}), [Active Damping]({{< relref "active_damping" >}}) - -Reference -: @phdthesis{hanieh03_activ_stewar, - author = {Hanieh, Ahmed Abu}, - school = {Universit{\'e} Libre de Bruxelles, Brussels, Belgium}, - title = {Active isolation and damping of vibrations via Stewart - platform}, - year = 2003, - tags = {parallel robot}, - } - -Author(s) -: Hanieh, A. A. - -Year -: 2003 - -# Bibliography -Hanieh, A. A., *Active isolation and damping of vibrations via stewart platform* (Doctoral dissertation) (2003). Universit{\'e} Libre de Bruxelles, Brussels, Belgium, . [↩](#10e535e895bdcd6b921bff33ef68cd81) diff --git a/content/paper/holterman05_activ_dampin_based_decoup_colloc_contr.md b/content/paper/holterman05_activ_dampin_based_decoup_colloc_contr.md deleted file mode 100644 index d171a53..0000000 --- a/content/paper/holterman05_activ_dampin_based_decoup_colloc_contr.md +++ /dev/null @@ -1,20 +0,0 @@ -+++ -title = "Active damping based on decoupled collocated control" -author = ["Thomas Dehaeze"] -draft = false -+++ - -Tags -: [Active Damping]({{< relref "active_damping" >}}) - -Reference -: (Holterman \& deVries, 2005) - -Author(s) -: Holterman, J., & deVries, T. - -Year -: 2005 - -# Bibliography -Holterman, J., & deVries, T., *Active damping based on decoupled collocated control*, IEEE/ASME Transactions on Mechatronics, *10(2)*, 135–145 (2005). http://dx.doi.org/10.1109/tmech.2005.844702 [↩](#cc7836a555fe4dbae791e17008c29bfd) diff --git a/content/paper/jiao18_dynam_model_exper_analy_stewar.md b/content/paper/jiao18_dynam_model_exper_analy_stewar.md deleted file mode 100644 index 0c618fe..0000000 --- a/content/paper/jiao18_dynam_model_exper_analy_stewar.md +++ /dev/null @@ -1,20 +0,0 @@ -+++ -title = "Dynamic modeling and experimental analyses of stewart platform with flexible hinges" -author = ["Thomas Dehaeze"] -draft = false -+++ - -Tags -: [Stewart Platforms]({{< relref "stewart_platforms" >}}), [Flexible Joints]({{< relref "flexible_joints" >}}) - -Reference -: (Jian Jiao {\it et al.}, 2018) - -Author(s) -: Jiao, J., Wu, Y., Yu, K., & Zhao, R. - -Year -: 2018 - -# Bibliography -Jiao, J., Wu, Y., Yu, K., & Zhao, R., *Dynamic modeling and experimental analyses of stewart platform with flexible hinges*, Journal of Vibration and Control, *25(1)*, 151–171 (2018). http://dx.doi.org/10.1177/1077546318772474 [↩](#ee917739f88877d6c2758c1c36565deb) diff --git a/content/paper/li01_simul_vibrat_isolat_point_contr.md b/content/paper/li01_simul_vibrat_isolat_point_contr.md deleted file mode 100644 index dc73154..0000000 --- a/content/paper/li01_simul_vibrat_isolat_point_contr.md +++ /dev/null @@ -1,23 +0,0 @@ -+++ -title = "Simultaneous vibration isolation and pointing control of flexure jointed hexapods" -author = ["Thomas Dehaeze"] -draft = false -+++ - -Tags -: [Stewart Platforms]({{< relref "stewart_platforms" >}}), [Vibration Isolation]({{< relref "vibration_isolation" >}}) - -Reference -: (Xiaochun Li {\it et al.}, 2001) - -Author(s) -: Li, X., Hamann, J. C., & McInroy, J. E. - -Year -: 2001 - -- if the hexapod is designed such that the payload mass/inertia matrix (\\(M\_x\\)) and \\(J^T J\\) are diagonal, the dynamics from \\(u\\) to \\(y\\) are decoupled. - -# Bibliography -Li, X., Hamann, J. C., & McInroy, J. E., *Simultaneous vibration isolation and pointing control of flexure jointed hexapods*, In , Smart Structures and Materials 2001: Smart Structures and Integrated Systems (pp. ) (2001). : . [↩](#e3df2691f750617c3995644d056d553a) diff --git a/content/paper/oomen18_advan_motion_contr_precis_mechat.md b/content/paper/oomen18_advan_motion_contr_precis_mechat.md deleted file mode 100644 index a3930ef..0000000 --- a/content/paper/oomen18_advan_motion_contr_precis_mechat.md +++ /dev/null @@ -1,24 +0,0 @@ -+++ -title = "Advanced motion control for precision mechatronics: control, identification, and learning of complex systems" -author = ["Thomas Dehaeze"] -draft = false -+++ - -Tags -: [Motion Control]({{< relref "motion_control" >}}) - -Reference -: (Tom Oomen, 2018) - -Author(s) -: Oomen, T. - -Year -: 2018 - - - -{{< figure src="/ox-hugo/oomen18_next_gen_loop_gain.png" caption="Figure 1: Envisaged developments in motion systems. In traditional motion systems, the control bandwidth takes place in the rigid-body region. In the next generation systemes, flexible dynamics are foreseen to occur within the control bandwidth." >}} - -# Bibliography -Oomen, T., *Advanced motion control for precision mechatronics: control, identification, and learning of complex systems*, IEEJ Journal of Industry Applications, *7(2)*, 127–140 (2018). http://dx.doi.org/10.1541/ieejjia.7.127 [↩](#73fd325bd20a6ef8972145e535f38198) diff --git a/content/paper/poel10_explor_activ_hard_mount_vibrat.md b/content/paper/poel10_explor_activ_hard_mount_vibrat.md deleted file mode 100644 index d20a786..0000000 --- a/content/paper/poel10_explor_activ_hard_mount_vibrat.md +++ /dev/null @@ -1,42 +0,0 @@ -+++ -title = "An exploration of active hard mount vibration isolation for precision equipment" -author = ["Thomas Dehaeze"] -draft = false -+++ - -Tags -: [Vibration Isolation]({{< relref "vibration_isolation" >}}) - -Reference -: @phdthesis{poel10_explor_activ_hard_mount_vibrat, - author = {van der Poel, Gerrit Wijnand}, - doi = {10.3990/1.9789036530163}, - isbn = {978-90-365-3016-3}, - school = {University of Twente}, - title = {An Exploration of Active Hard Mount Vibration Isolation for - Precision Equipment}, - url = {https://doi.org/10.3990/1.9789036530163}, - year = 2010, - year = 2010, - tags = {parallel robot}, - } - -Author(s) -: van der Poel, G. W. - -Year -: 2010 - -# Bibliography -van der Poel, G. W., *An exploration of active hard mount vibration isolation for precision equipment* (Doctoral dissertation) (2010). University of Twente, . [↩](#bcab548922e0e1ad6a2c310f63879596) diff --git a/content/paper/schellekens98_desig_precis.md b/content/paper/schellekens98_desig_precis.md deleted file mode 100644 index 37091c9..0000000 --- a/content/paper/schellekens98_desig_precis.md +++ /dev/null @@ -1,20 +0,0 @@ -+++ -title = "Design for precision: current status and trends" -author = ["Thomas Dehaeze"] -draft = false -+++ - -Tags -: [Precision Engineering]({{< relref "precision_engineering" >}}) - -Reference -: (Schellekens {\it et al.}, 1998) - -Author(s) -: Schellekens, P., Rosielle, N., Vermeulen, H., Vermeulen, M., Wetzels, S., & Pril, W. - -Year -: 1998 - -# Bibliography -Schellekens, P., Rosielle, N., Vermeulen, H., Vermeulen, M., Wetzels, S., & Pril, W., *Design for precision: current status and trends*, Cirp Annals, *(2)*, 557–586 (1998). http://dx.doi.org/10.1016/s0007-8506(07)63243-0 [↩](#89f7d8f4c31f79f83e3666017687f525) diff --git a/content/paper/sebastian12_nanop_with_multip_sensor.md b/content/paper/sebastian12_nanop_with_multip_sensor.md deleted file mode 100644 index 42e2c6f..0000000 --- a/content/paper/sebastian12_nanop_with_multip_sensor.md +++ /dev/null @@ -1,20 +0,0 @@ -+++ -title = "Nanopositioning with multiple sensors: a case study in data storage" -author = ["Thomas Dehaeze"] -draft = false -+++ - -Tags -: [Sensor Fusion]({{< relref "sensor_fusion" >}}) - -Reference -: (Abu Sebastian \& Angeliki Pantazi, 2012) - -Author(s) -: Sebastian, A., & Pantazi, A. - -Year -: 2012 - -# Bibliography -Sebastian, A., & Pantazi, A., *Nanopositioning with multiple sensors: a case study in data storage*, IEEE Transactions on Control Systems Technology, *20(2)*, 382–394 (2012). http://dx.doi.org/10.1109/tcst.2011.2177982 [↩](#eb5a15a8c900d93de0b9bab520e1b6da) diff --git a/content/paper/tang18_decen_vibrat_contr_voice_coil.md b/content/paper/tang18_decen_vibrat_contr_voice_coil.md deleted file mode 100644 index 7086d0b..0000000 --- a/content/paper/tang18_decen_vibrat_contr_voice_coil.md +++ /dev/null @@ -1,21 +0,0 @@ -+++ -title = "Decentralized vibration control of a voice coil motor-based stewart parallel mechanism: simulation and experiments" -author = ["Thomas Dehaeze"] -draft = false -+++ - -Tags -: [Stewart Platforms]({{< relref "stewart_platforms" >}}) - -Reference -: (Jie Tang {\it et al.}, 2018) - -Author(s) -: Tang, J., Cao, D., & Yu, T. - -Year -: 2018 - -# Bibliography -Tang, J., Cao, D., & Yu, T., *Decentralized vibration control of a voice coil motor-based stewart parallel mechanism: simulation and experiments*, Proceedings of the Institution of Mechanical Engineers, Part C: Journal of Mechanical Engineering Science, *233(1)*, 132–145 (2018). http://dx.doi.org/10.1177/0954406218756941 [↩](#85f81ff678aabc195636437548e4234a) diff --git a/content/paper/wang12_autom_marker_full_field_hard.md b/content/paper/wang12_autom_marker_full_field_hard.md deleted file mode 100644 index bdf06bc..0000000 --- a/content/paper/wang12_autom_marker_full_field_hard.md +++ /dev/null @@ -1,29 +0,0 @@ -+++ -title = "Automated markerless full field hard x-ray microscopic tomography at sub-50 nm 3-dimension spatial resolution" -author = ["Thomas Dehaeze"] -draft = false -+++ - -Tags -: [Nano Active Stabilization System]({{< relref "nano_active_stabilization_system" >}}) - -Reference -: (Jun Wang {\it et al.}, 2012) - -Author(s) -: Wang, J., Chen, Y. K., Yuan, Q., Tkachuk, A., Erdonmez, C., Hornberger, B., & Feser, M. - -Year -: 2012 - -**Introduction of Markers**: -That limits the type of samples that is studied - -There is a need for markerless nano-tomography -=> the key requirement is the precision and stability of the positioning stages. - -**Passive rotational run-out error system**: -It uses calibrated metrology disc and capacitive sensors - -# Bibliography -Wang, J., Chen, Y. K., Yuan, Q., Tkachuk, A., Erdonmez, C., Hornberger, B., & Feser, M., *Automated markerless full field hard x-ray microscopic tomography at sub-50 nm 3-dimension spatial resolution*, Applied Physics Letters, *100(14)*, 143107 (2012). http://dx.doi.org/10.1063/1.3701579 [↩](#1bccbe15e35ed02229afbc6528c5057e) diff --git a/content/phdthesis/jabben07_mechat.md b/content/phdthesis/jabben07_mechat.md new file mode 100644 index 0000000..a020133 --- /dev/null +++ b/content/phdthesis/jabben07_mechat.md @@ -0,0 +1,224 @@ ++++ +title = "Mechatronic design of a magnetically suspended rotating platform" +author = ["Thomas Dehaeze"] +draft = false ++++ + +Tags +: [Dynamic Error Budgeting]({{< relref "dynamic_error_budgeting" >}}) + +Author +: Jabben, L. + +Year +: 2007 + +DOI +: + + +## Dynamic Error Budgeting {#dynamic-error-budgeting} + + +### Introduction {#introduction} + +A large class of mechatronic machines have specifications based on their _standstill_ performance. +The standstill performance is then limited by the (stochastic) disturbances action on the closed loop. + +The difficulty in calculation with stochastic signals and Bode plots, is that, instead of calculating with the complex response at one frequency, the **area** over a frequency range should be taken into account. + +The **error budgeting** is often used to estimate how much each component contributes to the total error + +Since many of the disturbances have a stochastic nature, they can be modelled with their **Power Spectral Densities**. + +The PSD of the performance measure in the closed loop system is the weigted sum of PSDs of the contributions of each disturbance to the performance channel. +This approach allows frequency dependent error budgeting, which is why it is referred to as **Dynamic Error Budgeting**. + + +### Common Mechatronics Disturbances {#common-mechatronics-disturbances} + + +#### Ground vibrations {#ground-vibrations} + + +#### Electronic Noise {#electronic-noise} + +**Thermal Noise** (or Johson noise). +This noise can be modeled as a voltage source in series with the system impedance. +The noise source has a PSD given by: +\\[ S\_T(f) = 4 k T \text{Re}(Z(f)) \ [V^2/Hz] \\] +with \\(k = 1.38 \cdot 10^{-23} \,[J/K]\\) the Boltzmann's constant, \\(T\\) the temperature [K] and \\(Z(f)\\) the frequency dependent impedance of the system. + +```text +A kilo Ohm resistor at 20 degree Celsius will show a thermal noise of $0.13 \mu V$ from zero up to one kHz. +``` + +**Shot Noise**. +Seen with junctions in a transistor. +It has a white spectral density: +\\[ S\_S = 2 q\_e i\_{dc} \ [A^2/Hz] \\] +with \\(q\_e\\) the electronic charge (\\(1.6 \cdot 10^{-19}\, [C]\\)), \\(i\_{dc}\\) the average current [A]. + +```text +An averable current of 1 A will introduce noise with a STD of $10 \cdot 10^{-9}\,[A]$ from zero up to one kHz. +``` + +**Excess Noise** (or \\(1/f\\) noise). +It results from fluctuating conductivity due to imperfect contact between two materials. +The PSD of excess noise increases when the frequency decreases: +\\[ S\_E = \frac{K\_f}{f^\alpha}\ [V^2/Hz] \\] +where \\(K\_f\\) is dependent on the average voltage drop over the resistor and the index \\(\alpha\\) is usually between 0.8 and 1.4, and often set to unity for approximate calculation. + +**Signal to Noise Ration** +Electronic equipment does most often not come with detailed electric schemes, in which case the PSD should be determined from measurements. +In the design phase however, one has to rely on information provided by specification sheets from the manufacturer. +The noise performance of components like sensors, amplifiers, converters, etc., is often specified in terms of a **Signal to Noise Ratio** (SNR). +**The SNR gives the ratio of the RMS value of a sine that covers the full range of the channel through which the signal is propagating over the RMS value of the electrical noise.** +Usually, the SNR is specified up to a certain cut-off frequency. +If no information on the colouring of the noise is available, then the corresponding **PSD can be assumed to be white up to the cut-off frequency** \\(f\_c\\): +\\[ S\_{snr} = \frac{x\_{fr}^2}{8 f\_c C\_{snr}^2} \\] +with \\(x\_{fr}\\) the full range of \\(x\\), and \\(C\_{snr}\\) the SNR. + + +#### AD and DA converters {#ad-and-da-converters} + +ADC and DAC add quantization noise to the signal. +The variance can be calculated to be: +\\[ \sigma^2 = \frac{q^2}{12} \\] +with \\(q\\) the quantization interval. + +The corresponding PSD is white up to the Nyquist frequency: +\\[ S\_Q = \frac{q^2}{12 f\_N} \\] +with \\(f\_N\\) the Nyquist frequency [Hz]. + +```text +Let's take the example of a 16 bit ADC which has an electronic noise with a SNR of 80dB. +Let's suppose the ADC is used to measure a position over a range of 1 mm. +- ADC quantization noise: it has 16 bots over the 1 mm range. + The standard diviation from the quantization is: + \[ \sigma_{ADq} = \frac{1 \cdot 10^6/2^16}{\sqrt{12}} = 4.4\,[nm] \] +- ADC electronic noise: the RMS value of a sine that covers to full range is $\frac{0.5}{\sqrt{2}} = 0.354\,[mm]$. + With a SNR of 80dB, the electronic noise from the ADC becomes: + \[ \sigma_{ADn} = 35\,[nm] \] + +Let's suppose the ADC is used to measure a sensor with an electronic noise having a standard deviation of $\sigma_{sn} = 17\,[nm]$. + +The PSD of this digitalized sensor noise is: +\[ \sigma_s = \sqrt{\sigma_{sn}^2 + \sigma_{ADq}^2 + \sigma_{ADn}^2} = 39\,[nm]\] +from which the PSD of the total sensor noise $S_s$ is calculated: +\[ S_s = \frac{\sigma_s^2}{f_N} = 1.55\,[nm^2/Hz] \] +with $f_N$ is the Nyquist frequency of 1kHz. +``` + + +#### Acoustic Noise {#acoustic-noise} + +This can be a big error source in high precision machines, especially when the surface is big compare to the mass. + +The disturbance force acting on a body, is the **difference of pressure between the front and the back times the surface**. +To have a pressure difference, the body must have a certain minimum dimension, depending on the wave length of the sound. +For a body of typical dimensions of 100mm, only frequencies above 800 Hz have a significant disturbance contribution. + +```text +Consider a cube with a rib size of 100 mm located in a room with a sound level of 80dB, distributed between one and ten kHz, then the force disturbance PSD equal $2.2 \cdot 10^{-2}\,[N^2/Hz]$ +``` + + +#### Brownian Noise {#brownian-noise} + +This is due to thermal effects and it notable where a small mass needs positioning. + + +#### Turbulence {#turbulence} + +Rotation of the spindle introduces and air flow in which turbulence is cause by sharp angles on the rotor and stator. + + +### Optimal Control {#optimal-control} + + +#### The use of Optimal Control in DEB {#the-use-of-optimal-control-in-deb} + +Three factors influence the performance: + +- the disturbances: often a given value +- the plant: can be costly to redesign +- the controller + +The DEB helps identifying which disturbance is the limiting factor, and it should be investigated if the controller can deal with this disturbance before re-designing the plant. + +The modelling of disturbance as stochastic variables, is by excellence suitable for the optimal stochastic control framework. +In Figure [1](#orgf051865), the generalized plant maps the disturbances to the performance channels. +By minimizing the \\(\mathcal{H}\_2\\) system norm of the generalized plant, the variance of the performance channels is minimized. + + + +{{< figure src="/ox-hugo/jabben07_general_plant.png" caption="Figure 1: Control system with the generalized plant \\(G\\). The performance channels are stacked in \\(z\\), while the controller input is denoted with \\(y\\)" >}} + + +#### Using Weighting Filters for Disturbance Modelling {#using-weighting-filters-for-disturbance-modelling} + +Since disturbances are generally not white, the system of Figure [1](#orgf051865) needs to be augmented with so called **disturbance weighting filters**. + +A disturbance weighting filter gives the disturbance PSD when white noise as input is applied. + +This is illustrated in Figure [2](#org35c7d66) where a vector of white noise time signals \\(\underbar{w}(t)\\) is filtered through a weighting filter to obtain the colored physical disturbances \\(w(t)\\) with the desired PSD \\(S\_w\\) . + +The generalized plant framework also allows to include **weighting filters for the performance channels**. +This is useful for three reasons: + +- the performance channels might have different dimensions, which require scaling in order to compare +- some performance channels may be of more importance than others +- by using dynamic weighting filters, one can emphasize the performance in a certain frequency range + + + +{{< figure src="/ox-hugo/jabben07_weighting_functions.png" caption="Figure 2: Control system with the generalized plant \\(G\\) and weighting functions" >}} + +The weighting filters should be stable transfer functions. + +**Obtaining the weighting filters**: + +If the PSD is given as a function \\(S\_x(j\omega)\\), the disturbance filter can be using **spectral factorization**: + +> Given a positive even function \\(S\_x(f)\\) of finite area, find a minimum-phase stable function \\(L(s)\\), such that \\(|L(j2\pi f)|^2 = S(s)\\) + +**Harmonic signals** can be approximately modeled by filtering white noise with a badly damped second order system, having a \\(+1\\) slope below the resonance frequency and a \\(-1\\) slope above the resonance frequency: +\\[ V\_h = \frac{s}{s^2 + 2 \xi \omega\_h + \omega\_h^2} \\] +with \\(\xi\\) the relative damping and \\(\omega\_h\\) the resonance frequency [rad/s]. +By making the \\(\mathcal{H}\_2\\) norm of \\(V\_h\\) equal to the RMS-value of the harmonic signal, the propagation of the disturbance to the performance channel can be well approximated. + + +#### Balancing Control Effort vs Performance {#balancing-control-effort-vs-performance} + +IF only the output \\(y\\) are considered in the performance channel \\(z\\), the resulting optimal controller might result in very large actuator signals. +So, to obtain feasible controllers, the performance channel is a combination of controller output \\(u\\) and system output \\(y\\). +By choosing suitable weighting filters for \\(y\\) and \\(u\\), the performance can be optimized while keeping the controller effort limited: +\\[ \\|z\\|\_{rms}^2 = \left\\| \begin{bmatrix} y \\ \alpha u \end{bmatrix} \right\\|\_{rms}^2 = \\|y\\|\_{rms}^2 + \alpha^2 \\|u\\|\_{rms}^2 \\] + +By calculation \\(\mathcal{H}\_2\\) optimal controllers for increasing \\(\alpha\\) and plotting the performance \\(\\|y\\|\\) vs the controller effort \\(\\|u\\|\\), the curve as depicted in Figure [3](#org742f80a) is obtained. + + + +{{< figure src="/ox-hugo/jabben07_pareto_curve_H2.png" caption="Figure 3: An illustration of a Pareto curve. Each point of the curve represents the performance obtained with an optimal controller. The curve is obtained by varying \\(\alpha\\) and calculating an \\(\mathcal{H}\_2\\) optimal controller for each \\(\alpha\\)." >}} + + +## Conclusion {#conclusion} + +> Using the DEB analysis during the design helped to formulate the specifications of the several subcomponents, such as: +> +> - The target bandwidth of the decentralized closed loops, which is very important for the mechanical design, as mechanical resonances can severely limit the bandwidth. +> This value was also used to specify the current loop bandwidth of the custom designed power amplifiers for the RTAs and other components such as sensors and filters. +> - The target value of the stiffness of the actuators was derived at 1000 N/m. +> It was shown that the stiffness of a motor with back-iron is too much for the separated frame concept. +> - The analysis pinpointed the most limiting component in the final design to be the Analogue-to-Digital Converter (ADC). + + + +> In the DEB-framework there are three distinct factors which determine the performance. +> These are the plant, the controller and the disturbances. +> Synthesizing optimal controllers, such as H2-control, in the design helps to eliminate the controller out of the equation. +> If the performance specifications are not met with an optimal controller, it is certain that a redesign of the system is required. +> To use the measured PSDs in an optimal control design, such as H2-control, the disturbances must be modelled using linear time invariant models with multiple white noise input. +> To derive such models, spectral factorization is used. +> It is recommended to investigate which methods for spectral factorization are currently available and numerically robust. diff --git a/content/phdthesis/monkhorst04_dynam_error_budget.md b/content/phdthesis/monkhorst04_dynam_error_budget.md new file mode 100644 index 0000000..45b0909 --- /dev/null +++ b/content/phdthesis/monkhorst04_dynam_error_budget.md @@ -0,0 +1,166 @@ ++++ +title = "Dynamic error budgeting, a design approach" +author = ["Thomas Dehaeze"] +draft = false ++++ + +Tags +: [Dynamic Error Budgeting]({{< relref "dynamic_error_budgeting" >}}) + +Reference +: @phdthesis{monkhorst04_dynam_error_budget, + author = {Wouter Monkhorst}, + school = {Delft University}, + title = {Dynamic Error Budgeting, a design approach}, + year = 2004, + } + +Author(s) +: Monkhorst, W. + +Year +: 2004 + + +## Introduction {#introduction} + +Challenge definition of this thesis: + +> Develop a tool which enables the designer to account for stochastic disturbances during the design of a mechatronics system. + +Develop tools should enable the designer to: + +- Predict the final performance level of a system which is subject to stochastic disturbances +- Gain insight in performance limiting factors of the system. + This insight should enable the designer to point out critical system components/properties and to improve the performance of the system +- Objectively compare the performance of different system designs + + +## Dynamic Error Budgeting {#dynamic-error-budgeting} + + +### Motivations {#motivations} + +Main motivations are: + +- Cutting costs in the design phase +- Speeding up the design process +- Enhancing design insight + + +### DEB design process {#deb-design-process} + +Step by step, the process is as follows: + +- design a concept system +- model the concept system, such that the closed loop transfer functions can be determined +- Identify all significant disturbances. + Model them with their _Power Spectral Density_ +- Define the performance outputs of the system and simulate the output error. + Using the theory of _propagation_, the contribution of each disturbance to the output error can be analyzed and the critical disturbance can be pointed out +- Make changes to the system that are expected to improve the performance level, and simulate the output error again. + Iterate until the error budget is meet. + + +### Assumptions {#assumptions} + +The assumptions when applying DEB are: + +- the system can be accurately described with a **linear time invariant model**. + This is usually the case as much effort is put in to make systems have a linear behavior and because feedback loops have a " linearizing" effect on the closed loop behavior. +- the disturbances action on the system must be **stationary** (their statistical properties are not allowed to change over time). +- the disturbances are **uncorrelated** with each other. + This is more difficult to satisfy for MIMO systems and the designer must make sure that the separate disturbances all originate from separate independent sources. +- the disturbance signals are modeled by their **Power Spectral Density**. + This implies that only stochastic disturbances are allowed. + Deterministic components like sinusoidal and DC signals are infinite peaks in their PSD and should not be used. + For the deterministic part, other techniques can be used to determine their influence to the error. +- the calculation method makes no assumption on the distribution of the distribution functions of the disturbances. + In practice, many disturbances will have a normal like distribution. + + +### \\(\mathcal{H}\_2\\) control, maximizing performance {#mathcal-h-2--control-maximizing-performance} + + +#### The \\(\mathcal{H}\_2\\) norm and variance of the output {#the--mathcal-h-2--norm-and-variance-of-the-output} + +The \\(\mathcal{H}\_2\\) norm is a norm defined on a system: +\\[ \\|H\\|\_2^2 = \int\_{-\infty}^\infty |H(j2\pi f)|^2 df \\] + +Stochastic interpretation of the \\(\mathcal{H}\_2\\) norm: the squared \\(\mathcal{H}\_2\\) norm can be interpreted as the output variance of a system with zero mean white noise input. + + +#### The \\(\mathcal{H}\_2\\) control problem {#the--mathcal-h-2--control-problem} + +Find a controller \\(C\_{\mathcal{H}\_2}\\) which minimizes the \\(\mathcal{H}\_2\\) norm of the closed loop system \\(H\\): +\\[ C\_{\mathcal{H}\_2} \in \arg \min\_C \\|H\\|\_2 \\] + + +#### Using weighting filters to model disturbances {#using-weighting-filters-to-model-disturbances} + +In order to synthesize an \\(\mathcal{H}\_2\\) controller that will minimize the output error, the total system including disturbances needs to be modeled as a system with zero mean white noise inputs. + +This is done by using weighting filter \\(V\_w\\), of which the output signal has a PSD \\(S\_w(f)\\) when the input is zero mean white noise (Figure [1](#org7f8d04e)). + + + +{{< figure src="/ox-hugo/monkhorst04_weighting_filter.png" caption="Figure 1: The use of a weighting filter \\(V\_w(f)\,[SI]\\) to give the weighted signal \\(\bar{w}(t)\\) a certain PSD \\(S\_w(f)\\)." >}} + +The white noise input \\(w(t)\\) is dimensionless, and when the weighting filter has units [SI], the resulting weighted signal \\(\bar{w}(t)\\) has units [SI]. +The PSD \\(S\_w(f)\\) of the weighted signal is: +\\[ |S\_w(f)| = V\_w(j 2 \pi f) V\_w^T(-j 2 \pi f) \\] + +Given \\(S\_w(f)\\), \\(V\_w(f)\\) can be obtained using a technique called _spectral factorization_. +However, this can be avoided if the modelling of the disturbances is directly done in terms of weighting filters. + +Output weighting filters can also be used to scale different outputs relative to each other (Figure [2](#org4f416df)). + + + +{{< figure src="/ox-hugo/monkhorst04_general_weighted_plant.png" caption="Figure 2: The open loop system \\(\bar{G}\\) in series with the diagonal input weightin filter \\(V\_w\\) and diagonal output scaling iflter \\(W\_z\\) defining the generalized plant \\(G\\)" >}} + + +#### Output scaling and the Pareto curve {#output-scaling-and-the-pareto-curve} + +In this research, the outputs of the closed loop system (Figure [3](#orgc347ae6)) are: + +- the performance (error) signal \\(e\\) +- the controller output \\(u\\) + +In this way, the designer can analyze how much control effort is used to achieve the performance level at the performance output. + + + +{{< figure src="/ox-hugo/monkhorst04_closed_loop_H2.png" caption="Figure 3: The closed loop system with weighting filters included. The system has \\(n\\) disturbance inputs and two outputs: the error \\(e\\) and the control signal \\(u\\). The \\(\mathcal{H}\_2\\) minimized the \\(\mathcal{H}\_2\\) norm of this system." >}} + +The resulting problem is a multi-objective control problem: while constraining the variance of the controller output \\(u\\), the variance of the performance channel should be minimized. +This problem can be solved by scaling the controller output \\(u\\) with a factor \\(\alpha\\) during the \\(\mathcal{H}\_2\\) synthesis. +When varying \\(\alpha\\), one can plot the amount of control effort at one axis and the achieve performance on the other axis. +The resulting points lie on the so-called **Pareto curve**. + + +## Conclusions {#conclusions} + +\\(\mathcal{H}\_2\\) control strategy is an extension of the DEB approach. +It offers the designer the opportunity to optimize over the degree of freedom given by the controller, enabling the designer to predict the maximum achievable performance level of a system concept. +Using this technique, the designer is able to objectively compare the performance potential of different system concepts. + +The accuracy of the predicted performance by DEB with respect to the measured results can be improved by using higher order models of the disturbances. +Increasing of order of the disturbance model might even allow modelling of harmonic disturbances by using inverse notches. +To achieve the highest degree of prediction accuracy, it is recommended to use to actual measured disturbance spectra in the simulations. + +When an \\(\mathcal{H}\_2\\) controller is synthesized for a particular system, it can give the control designer useful hints about how to control the system best for optimal performance. +Drawbacks however are, that no robustness guarantees can be given and that the order of the \\(\mathcal{H}\_2\\) controller will generally be too high for implementation. + +# Bibliography +Monkhorst, W., *Dynamic error budgeting, a design approach* (2004). Delft University. [↩](#651e626e040250ee71a0847aec41b60c) + + +## Backlinks {#backlinks} + +- [Dynamic Error Budgeting]({{< relref "dynamic_error_budgeting" >}}) diff --git a/content/posts/homepages.md b/content/posts/homepages.md new file mode 100644 index 0000000..18c3275 --- /dev/null +++ b/content/posts/homepages.md @@ -0,0 +1,18 @@ ++++ +author = ["Thomas Dehaeze"] +draft = false ++++ + +## Homepage for Papers {#main} + +Here is the list of papers I took note about. + + +## Homepage for Books {#main} + +Here is the list of books I took note about. + + +## Homepage for Zettels {#main} + +Here is the list of subjects I took note about. diff --git a/content/zettels/actuator_fusion.md b/content/zettels/actuator_fusion.md new file mode 100644 index 0000000..1854d28 --- /dev/null +++ b/content/zettels/actuator_fusion.md @@ -0,0 +1,34 @@ ++++ +title = "Actuator Fusion" +author = ["Thomas Dehaeze"] +draft = false ++++ + +Tags +: [Complementary Filters]({{< relref "complementary_filters" >}}) + +("Michiel Beijen {\it et al.}, 2019) + +@phdthesis{beijen18_distur, + author = {Beijen, MA}, + school = {Technische Universiteit Eindhoven}, + title = {Disturbance feedforward control for vibration isolation + systems: analysis, design, and implementation}, + year = 2018, +} (section 6.3.1) + +# Bibliography +Beijen, M. A., Heertjes, M. F., Butler, H., & Steinbuch, M., *Mixed feedback and feedforward control design for multi-axis vibration isolation systems*, Mechatronics, *61()*, 106–116 (2019). http://dx.doi.org/https://doi.org/10.1016/j.mechatronics.2019.06.005 [↩](#89b9470055c4d7f0f1957aa4400df9e8) + +Beijen, M., *Disturbance feedforward control for vibration isolation systems: analysis, design, and implementation* (Doctoral dissertation) (2018). Technische Universiteit Eindhoven, . [↩](#28a270550e13d2c8d045c9e0a9557945) + + +## Backlinks {#backlinks} + +- [Sensor Fusion]({{< relref "sensor_fusion" >}}) diff --git a/content/zettels/actuators.md b/content/zettels/actuators.md index 742b807..02f596e 100644 --- a/content/zettels/actuators.md +++ b/content/zettels/actuators.md @@ -12,7 +12,7 @@ Tags For vibration isolation: -- In (Shingo Ito \& Georg Schitter, 2016), the effect of the actuator stiffness on the attainable vibration isolation is studied ([Notes]({{< relref "ito16_compar_class_high_precis_actuat" >}})) +- In (Shingo Ito \& Georg Schitter, 2016), the effect of the actuator stiffness on the attainable vibration isolation is studied ([Notes]({{< relref "ito16_compar_class_high_precis_actuat" >}})) ## Piezoelectric {#piezoelectric} @@ -23,8 +23,29 @@ For vibration isolation: | PI | [link](https://www.physikinstrumente.com/en/) | | Piezo System | [link](https://www.piezosystem.com/products/piezo%5Factuators/stacktypeactuators/) | | Noliac | [link](http://www.noliac.com/) | +| Thorlabs | [link](https://www.thorlabs.com/newgrouppage9.cfm?objectgroup%5Fid=8700) | -A model of a multi-layer monolithic piezoelectric stack actuator is described in (Fleming, 2010) ([Notes]({{< relref "fleming10_nanop_system_with_force_feedb" >}})). +A model of a multi-layer monolithic piezoelectric stack actuator is described in (Fleming, 2010) ([Notes]({{< relref "fleming10_nanop_system_with_force_feedb" >}})). + + +### Piezoelectric Stack Actuators {#piezoelectric-stack-actuators} + +Typical strain is \\(0.1\%\\). + + +### Mechanically Amplified Piezoelectric actuators {#mechanically-amplified-piezoelectric-actuators} + +The Amplified Piezo Actuators principle is presented in (Frank Claeyssen {\it et al.}, 2007): + +> The displacement amplification effect is related in a first approximation to the ratio of the shell long axis length to the short axis height. +> The flatter is the actuator, the higher is the amplification. + +A model of an amplified piezoelectric actuator is described in (Lucinskis \& Mangeot, 2016). ## Voice Coil {#voice-coil} @@ -55,16 +76,20 @@ A model of a multi-layer monolithic piezoelectric stack actuator is described in ## Brush-less DC Motor {#brush-less-dc-motor} -- (Yedamale, 2003) +- (Yedamale, 2003) # Bibliography -Ito, S., & Schitter, G., *Comparison and classification of high-precision actuators based on stiffness influencing vibration isolation*, IEEE/ASME Transactions on Mechatronics, *21(2)*, 1169–1178 (2016). http://dx.doi.org/10.1109/tmech.2015.2478658 [↩](#aad53368e29e8a519e2f63857044fa46) +Ito, S., & Schitter, G., *Comparison and classification of high-precision actuators based on stiffness influencing vibration isolation*, IEEE/ASME Transactions on Mechatronics, *21(2)*, 1169–1178 (2016). http://dx.doi.org/10.1109/tmech.2015.2478658 [↩](#aad53368e29e8a519e2f63857044fa46) -Fleming, A., *Nanopositioning system with force feedback for high-performance tracking and vibration control*, IEEE/ASME Transactions on Mechatronics, *15(3)*, 433–447 (2010). http://dx.doi.org/10.1109/tmech.2009.2028422 [↩](#c823f68dd2a72b9667a61b3c046b4731) +Fleming, A., *Nanopositioning system with force feedback for high-performance tracking and vibration control*, IEEE/ASME Transactions on Mechatronics, *15(3)*, 433–447 (2010). http://dx.doi.org/10.1109/tmech.2009.2028422 [↩](#c823f68dd2a72b9667a61b3c046b4731) -Yedamale, P., *Brushless dc (bldc) motor fundamentals*, Microchip Technology Inc, *20()*, 3–15 (2003). [↩](#d2e68d39d09d7e8e71ff08a6ebd45400) +Claeyssen, F., Letty, R. L., Barillot, F., & Sosnicki, O., *Amplified piezoelectric actuators: static \& dynamic applications*, Ferroelectrics, *351(1)*, 3–14 (2007). http://dx.doi.org/10.1080/00150190701351865 [↩](#5decd2b31c4a9842b80c58b56f96590a) + +Lucinskis, R., & Mangeot, C. (2016). *Dynamic characterization of an amplified piezoelectric actuator*. Retrieved from [](). . [↩](#849750850d9986ed326e74bd3c448d03) + +Yedamale, P., *Brushless dc (bldc) motor fundamentals*, Microchip Technology Inc, *20()*, 3–15 (2003). [↩](#d2e68d39d09d7e8e71ff08a6ebd45400) ## Backlinks {#backlinks} diff --git a/content/zettels/complementary_filters.md b/content/zettels/complementary_filters.md index ceaf8e9..d081838 100644 --- a/content/zettels/complementary_filters.md +++ b/content/zettels/complementary_filters.md @@ -12,4 +12,6 @@ Tags ## Backlinks {#backlinks} +- [Actuator Fusion]({{< relref "actuator_fusion" >}}) +- [Sensor Fusion]({{< relref "sensor_fusion" >}}) - [Advances in internal model control technique: a review and future prospects]({{< relref "saxena12_advan_inter_model_contr_techn" >}}) diff --git a/content/zettels/cubic_architecture.md b/content/zettels/cubic_architecture.md index a8d62bc..3a67638 100644 --- a/content/zettels/cubic_architecture.md +++ b/content/zettels/cubic_architecture.md @@ -7,11 +7,25 @@ draft = false Tags : -<./biblio/references.bib> + +## Description of the Cubic Architecture {#description-of-the-cubic-architecture} + + +## Special Properties {#special-properties} + +Cubic Stewart Platforms can be decoupled provided that (from (Yixin Chen \& McInroy, 2000)) + +> 1. The payload mass-inertia matrix is diagonal +> 2. If a mutually orthogonal geometry has been selected, the payload's center of mass must coincide with the center of the cube formed by the orthogonal struts. + +# Bibliography +Chen, Y., & McInroy, J., *Identification and decoupling control of flexure jointed hexapods*, In , Proceedings 2000 ICRA. Millennium Conference. IEEE International Conference on Robotics and Automation. Symposia Proceedings (Cat. No.00CH37065) (pp. ) (2000). : . [↩](#ba05ff213f8e5963d91559d95becfbdb) ## Backlinks {#backlinks} - [Sensors and control of a space-based six-axis vibration isolation system]({{< relref "hauge04_sensor_contr_space_based_six" >}}) -- [Dynamic modeling and decoupled control of a flexible stewart platform for vibration isolation]({{< relref "yang19_dynam_model_decoup_contr_flexib" >}}) - [Simultaneous, fault-tolerant vibration isolation and pointing control of flexure jointed hexapods]({{< relref "li01_simul_fault_vibrat_isolat_point" >}}) +- [Dynamic modeling and decoupled control of a flexible stewart platform for vibration isolation]({{< relref "yang19_dynam_model_decoup_contr_flexib" >}}) diff --git a/content/zettels/dynamic_error_budgeting.md b/content/zettels/dynamic_error_budgeting.md new file mode 100644 index 0000000..a139329 --- /dev/null +++ b/content/zettels/dynamic_error_budgeting.md @@ -0,0 +1,58 @@ ++++ +title = "Dynamic Error Budgeting" +author = ["Thomas Dehaeze"] +draft = false ++++ + +Tags +: + +A good introduction to Dynamic Error Budgeting is given in @phdthesis{monkhorst04_dynam_error_budget, + author = {Wouter Monkhorst}, + school = {Delft University}, + title = {Dynamic Error Budgeting, a design approach}, + year = 2004, +}. + + +## Step by Step process {#step-by-step-process} + +Taken from @phdthesis{monkhorst04_dynam_error_budget, + author = {Wouter Monkhorst}, + school = {Delft University}, + title = {Dynamic Error Budgeting, a design approach}, + year = 2004, +}: ([Notes]({{< relref "monkhorst04_dynam_error_budget" >}})) + +> Step by step, the process is as follows: +> +> - design a concept system +> - model the concept system, such that the closed loop transfer functions can be determined +> - Identify all significant disturbances. +> Model them with their _Power Spectral Density_ +> - Define the performance outputs of the system and simulate the output error. +> Using the theory of _propagation_, the contribution of each disturbance to the output error can be analyzed and the critical disturbance can be pointed out +> - Make changes to the system that are expected to improve the performance level, and simulate the output error again. +> Iterate until the error budget is meet. + +# Bibliography +Monkhorst, W., *Dynamic error budgeting, a design approach* (Doctoral dissertation) (2004). Delft University, . [↩](#651e626e040250ee71a0847aec41b60c) + + +## Backlinks {#backlinks} + +- [The design of high performance mechatronics - 2nd revised edition]({{< relref "schmidt14_desig_high_perfor_mechat_revis_edition" >}}) +- [Signal to Noise Ratio]({{< relref "signal_to_noise_ratio" >}}) +- [Mechatronic design of a magnetically suspended rotating platform]({{< relref "jabben07_mechat" >}}) +- [Systems and Signals Norms]({{< relref "norms" >}}) +- [Dynamic error budgeting, a design approach]({{< relref "monkhorst04_dynam_error_budget" >}}) diff --git a/content/zettels/electronics.md b/content/zettels/electronics.md index e2b1958..88f405a 100644 --- a/content/zettels/electronics.md +++ b/content/zettels/electronics.md @@ -13,3 +13,4 @@ Tags ## Backlinks {#backlinks} - [The art of electronics - third edition]({{< relref "horowitz15_art_of_elect_third_edition" >}}) +- [Signal to Noise Ratio]({{< relref "signal_to_noise_ratio" >}}) diff --git a/content/zettels/finite_element_model.md b/content/zettels/finite_element_model.md new file mode 100644 index 0000000..7e0a12d --- /dev/null +++ b/content/zettels/finite_element_model.md @@ -0,0 +1,31 @@ ++++ +title = "Finite Element Model" +author = ["Thomas Dehaeze"] +draft = false ++++ + +Tags +: + + +## Matlab State Space Model from FEM on Ansys {#matlab-state-space-model-from-fem-on-ansys} + +Some resources: + +- (Hatch, 2000) ([Notes]({{< relref "hatch00_vibrat_matlab_ansys" >}})) +- (Khot \& Yelve, 2011) +- (Ko\vsarac {\it et al.}, 2015) + +The idea is to extract reduced state space model from Ansys into Matlab. + +# Bibliography +Hatch, M. R., *Vibration simulation using matlab and ansys* (2000), : CRC Press. [↩](#484c4fad309f6b0e866a7cacf4653d74) + +Khot, S., & Yelve, N. P., *Modeling and response analysis of dynamic systems by using ansys\copyright and matlab\copyright*, Journal of Vibration and Control, *17(6)*, 953–958 (2011). [↩](#961d4331bc9da7f553368ca6a06cb743) + +Ko\vsarac, A, Zeljkovi\'c, M, Mla\djenovi\'c, C, & \vZivkovi\'c, A, *Create siso state space model of main spindle from ansys model*, In , 12th International Scientific Conference, Novi Sad, Serbia (pp. 37–41) (2015). : . [↩](#326e544dd573b7069b69e0ec90fad499) + + +## Backlinks {#backlinks} + +- [Vibration simulation using matlab and ansys]({{< relref "hatch00_vibrat_matlab_ansys" >}}) diff --git a/content/zettels/flexible_joints.md b/content/zettels/flexible_joints.md index 44257bc..b572585 100644 --- a/content/zettels/flexible_joints.md +++ b/content/zettels/flexible_joints.md @@ -7,15 +7,49 @@ draft = false Tags : -<./biblio/references.bib> + +## Resources {#resources} + +Books: + +- (Lobontiu, 2002) +- (Henein, 2003) +- (Smith, 2005) +- (Soemers, 2011) +- (Cosandier, 2017) + + +## Flexure Joints for Stewart Platforms: {#flexure-joints-for-stewart-platforms} + +From (Yixin Chen \& McInroy, 2000): + +> To avoid the extremely non-linear micro-dynamics of joint friction and backlash, these hexapods employ flexure joints. +> A flexure joint bends material to achieve motion, rather than sliding of rolling across two surfaces. +> This does eliminate friction and backlash, but adds spring dynamics and limits the workspace. + +# Bibliography +Lobontiu, N., *Compliant mechanisms: design of flexure hinges* (2002), : CRC press. [↩](#7d07367ac4d34d56738dbfe0eb53371f) + +Henein, S., *Conception des guidages flexibles* (2003), Lausanne, Suisse: Presses polytechniques et universitaires romandes. [↩](#53d819004fa64ee1fe2e715469c5991f) + +Smith, S. T., *Foundations of ultra-precision mechanism design* (2005), : CRC Press. [↩](#ccc31a1054040cbdbbb28ba9e590af72) + +Soemers, H., *Design principles for precision mechanisms* (2011), : T-Pointprint. [↩](#13540f4d4ba6bb415fdc21c85dde63cc) + +Cosandier, F., *Flexure Mechanism Design* (2017), Boca Raton, FL Lausanne, Switzerland: Distributed by CRC Press, 2017EOFL Press. [↩](#880641d23cd52fb47b40104731883e32) + +Chen, Y., & McInroy, J., *Identification and decoupling control of flexure jointed hexapods*, In , Proceedings 2000 ICRA. Millennium Conference. IEEE International Conference on Robotics and Automation. Symposia Proceedings (Cat. No.00CH37065) (pp. ) (2000). : . [↩](#ba05ff213f8e5963d91559d95becfbdb) ## Backlinks {#backlinks} -- [A six-axis single-stage active vibration isolator based on stewart platform]({{< relref "preumont07_six_axis_singl_stage_activ" >}}) - [Nanometre-cutting machine using a stewart-platform parallel mechanism]({{< relref "furutani04_nanom_cuttin_machin_using_stewar" >}}) - [Dynamic modeling and experimental analyses of stewart platform with flexible hinges]({{< relref "jiao18_dynam_model_exper_analy_stewar" >}}) -- [Dynamic modeling and decoupled control of a flexible stewart platform for vibration isolation]({{< relref "yang19_dynam_model_decoup_contr_flexib" >}}) - [Simultaneous, fault-tolerant vibration isolation and pointing control of flexure jointed hexapods]({{< relref "li01_simul_fault_vibrat_isolat_point" >}}) +- [A six-axis single-stage active vibration isolator based on stewart platform]({{< relref "preumont07_six_axis_singl_stage_activ" >}}) - [Investigation on active vibration isolation of a stewart platform with piezoelectric actuators]({{< relref "wang16_inves_activ_vibrat_isolat_stewar" >}}) +- [Dynamic modeling and decoupled control of a flexible stewart platform for vibration isolation]({{< relref "yang19_dynam_model_decoup_contr_flexib" >}}) +- [Dynamic modeling of flexure jointed hexapods for control purposes]({{< relref "mcinroy99_dynam" >}}) - [Identification and decoupling control of flexure jointed hexapods]({{< relref "chen00_ident_decoup_contr_flexur_joint_hexap" >}}) diff --git a/content/zettels/force_sensors.md b/content/zettels/force_sensors.md index 48177a6..33f055d 100644 --- a/content/zettels/force_sensors.md +++ b/content/zettels/force_sensors.md @@ -21,3 +21,9 @@ An analysis the dynamics and noise of a piezoelectric force sensor is done in Fleming, A., *Nanopositioning system with force feedback for high-performance tracking and vibration control*, IEEE/ASME Transactions on Mechatronics, *15(3)*, 433–447 (2010). http://dx.doi.org/10.1109/tmech.2009.2028422 [↩](#c823f68dd2a72b9667a61b3c046b4731) + + +## Backlinks {#backlinks} + +- [Nanopositioning system with force feedback for high-performance tracking and vibration control]({{< relref "fleming10_nanop_system_with_force_feedb" >}}) +- [Position Sensors]({{< relref "position_sensors" >}}) diff --git a/content/zettels/hac_hac.md b/content/zettels/hac_hac.md index b095173..3e83a9e 100644 --- a/content/zettels/hac_hac.md +++ b/content/zettels/hac_hac.md @@ -9,17 +9,33 @@ Tags High-Authority Control/Low-Authority Control -From (Andre Preumont, 2018): +From (Andre Preumont, 2018): -> The HAC/LAC approach consist of combining the two approached in a dual-loop control as shown in Figure [1](#org2e37874). The inner loop uses a set of collocated actuator/sensor pairs for decentralized active damping with guaranteed stability ; the outer loop consists of a non-collocated HAC based on a model of the actively damped structure. This approach has the following advantages: +> The HAC/LAC approach consist of combining the two approached in a dual-loop control as shown in Figure [1](#org21fb08d). The inner loop uses a set of collocated actuator/sensor pairs for decentralized active damping with guaranteed stability ; the outer loop consists of a non-collocated HAC based on a model of the actively damped structure. This approach has the following advantages: > > - The active damping extends outside the bandwidth of the HAC and reduces the settling time of the modes which are outsite the bandwidth > - The active damping makes it easier to gain-stabilize the modes outside the bandwidth of the output loop (improved gain margin) > - The larger damping of the modes within the controller bandwidth makes them more robust to the parmetric uncertainty (improved phase margin) - + {{< figure src="/ox-hugo/hac_lac_control_architecture.png" caption="Figure 1: HAC-LAC Control Architecture" >}} +Nice papers: + +- (Williams \& Antsaklis, 1989) +- (Aubrun, 1980) + # Bibliography -Preumont, A., *Vibration control of active structures - fourth edition* (2018), : Springer International Publishing. [↩](#454500a3af67ef66a7a754d1f2e1bd4a) +Preumont, A., *Vibration control of active structures - fourth edition* (2018), : Springer International Publishing. [↩](#454500a3af67ef66a7a754d1f2e1bd4a) + +Williams, T., & Antsaklis, P., *Limitations of vibration suppression in flexible space structures*, In , Proceedings of the 28th IEEE Conference on Decision and Control (pp. ) (1989). : . [↩](#ef357e45dadd8cc8869beda6e463777b) + +Aubrun, J., *Theory of the control of structures by low-authority controllers*, Journal of Guidance and Control, *3(5)*, 444–451 (1980). http://dx.doi.org/10.2514/3.56019 [↩](#df6fde1eeef81966b2c7fb5421adbe8d) + + +## Backlinks {#backlinks} + +- [Control of spacecraft and aircraft]({{< relref "bryson93_contr_spacec_aircr" >}}) +- [Vibration Control of Active Structures - Fourth Edition]({{< relref "preumont18_vibrat_contr_activ_struc_fourt_edition" >}}) diff --git a/content/zettels/inertial_sensors.md b/content/zettels/inertial_sensors.md index aa403e7..0445d76 100644 --- a/content/zettels/inertial_sensors.md +++ b/content/zettels/inertial_sensors.md @@ -25,7 +25,7 @@ Wireless Accelerometers - - + {{< figure src="/ox-hugo/inertial_sensors_characteristics_accelerometers.png" caption="Figure 1: Characteristics of commercially available accelerometers (Collette {\it et al.}, 2011)" >}} @@ -37,7 +37,7 @@ Wireless Accelerometers | Sercel | [link](http://www.sercel.com/products/Pages/seismometers.aspx) | | Wilcoxon | [link](https://wilcoxon.com/) | - + {{< figure src="/ox-hugo/inertial_sensors_characteristics_geophone.png" caption="Figure 2: Characteristics of commercially available geophones (Collette {\it et al.}, 2011)" >}} @@ -45,3 +45,8 @@ Wireless Accelerometers Collette, C., Janssens, S., Fernandez-Carmona, P., Artoos, K., Guinchard, M., Hauviller, C., & Preumont, A., *Review: inertial sensors for low-frequency seismic vibration measurement*, Bulletin of the Seismological Society of America, *102(4)*, 1289–1300 (2012). http://dx.doi.org/10.1785/0120110223 [↩](#dd5109075933cf543c7eba0979c0ba50) Collette, C., Artoos, K., Guinchard, M., Janssens, S., Carmona Fernandez, P., & Hauviller, C., *Review of sensors for low frequency seismic vibration measurement* (2011). [↩](#642a18d86de4e062c6afb0f5f20501c4) + + +## Backlinks {#backlinks} + +- [Position Sensors]({{< relref "position_sensors" >}}) diff --git a/content/zettels/irr_and_fir_filters.md b/content/zettels/irr_and_fir_filters.md new file mode 100644 index 0000000..c158229 --- /dev/null +++ b/content/zettels/irr_and_fir_filters.md @@ -0,0 +1,52 @@ ++++ +title = "IRR and FIR Filters" +author = ["Thomas Dehaeze"] +draft = false ++++ + +Tags +: + +
+ Table 1: + Comparison of IRR and FIR Filters +
+ +| | **IIR** | **FIR** | +|-----------|--------------------------------------------|---------------------------------------| +| Phase | No particular phase | Linear phase possible | +| Stability | Can be unstable | Always stable (feedback not involved) | +| Analog | Derived from analog filter | Cannot simulate analog response | +| Linearity | Used for applications which are not linear | Linear-phase characteristic | +| num/den | Both numerator and denominator | Only has numerators | + +> Digital filters with finite-duration impulse response (all-zero, or FIR filters) have both advantages and disadvantages compared to infinite-duration impulse response (IIR) filters. +> +> FIR filters have the following primary advantages: +> +> - They can have exactly linear phase. +> - They are always stable. +> - The design methods are generally linear. +> - They can be realized efficiently in hardware. +> - The filter startup transients have finite duration. +> +> The primary disadvantage of FIR filters is that they often require a much higher filter order than IIR filters to achieve a given level of performance. Correspondingly, the delay of these filters is often much greater than for an equal performance IIR filter. + +From (Shaw \& Srinivasan, 1990) + +> The FIR are capable of realizing filters with linear phase shift characteristics and furthermore are less susceptible to signal input and filter coefficient quantization effects. +> However, their computational demands are excessively large because of the large number of multiplications and additions to be performed at each sampling interval. +> The effective time delay corresponding to the linear phase shift is large and would have a destabilizing effect in closed loop applications. +> IIR filters are computationally less demanding. The fact that their phase shift characteristics do not vary linearly with frequency is not a disadvantage in this application. +> IIR filters are however, more susceptible to signal input and coefficient quantization effects. + +From + +> FIR filters are fairly common in some areas of control theory. As they usually incur a lot of added phase/time-delay, they are not really usable in the feedback path of regular control systems, but they are useful when the added phase/time-delay is not affecting the system in an adverse way, or when the particular phase response and time-delay is desired. +> +> Examples: +> +> - Feed-forward control. FIR filters are useful for producing filters that approximate arbitrary frequency responses, hence they can be used to shape a reference signal. A typical example is to use an FIR filter with the inverse frequency response of the plant -- trying to counteract the dynamics of the plant in order to get a desired output. Phase/time-delay is not interfering with the stability or performance since the computation can be done offline. FIR filters can often produce higher performance than IIR filters, especially where there are non-minimum phase zeros. + +# Bibliography +Shaw, F., & Srinivasan, K., *Bandwidth enhancement of position measurements using measured acceleration*, Mechanical Systems and Signal Processing, *4(1)*, 23–38 (1990). http://dx.doi.org/10.1016/0888-3270(90)90038-m [↩](#d875134273304770f6a0334525ecfa27) diff --git a/content/zettels/matlab.md b/content/zettels/matlab.md new file mode 100644 index 0000000..a7beadd --- /dev/null +++ b/content/zettels/matlab.md @@ -0,0 +1,66 @@ ++++ +title = "Matlab" +author = ["Thomas Dehaeze"] +draft = false ++++ + +Tags +: + + +## Resources on Matlab {#resources-on-matlab} + +Books: + +- (Higham, 2017) +- (Attaway, 2018) +- (Stack OverFlow, 2018) +- (Johnson, 2010) +- (Hahn \& Valentine, 2016) + + +## Useful Commands {#useful-commands} + +| Command | Description | +|------------------------|-------------------------------------------------------------| +| `desktop` | Open the Matlab Desktop | +| `workspace` | Open the Workspace | +| `who` | List all variables in the workspace | +| `edit ` | Edit the file using Matlab Desktop (usefully for debugging) | +| `help ` | | +| `doc ` | | +| `checkcode ` | Check Matlab code files for possible problems | +| `preferences` | Open Matlab preferences | + + +## Tips {#tips} + +- Folder that starts with a `+` are automatically added to the path. + It is useful to add function inside such folder. + Then the function is accessible with `folder.function`. + + +## Snippets {#snippets} + + +### Do not show legend for one plot {#do-not-show-legend-for-one-plot} + +```matlab +figure; +hold on; +plot(x, y1, 'DisplayName, 'lengendname'); +plot(x, y2, 'HandleVisibility', 'off'); +hold off; +legend('Location', 'northeast'); +``` + +# Bibliography +Higham, D., *Matlab guide* (2017), Philadelphia: Society for Industrial and Applied Mathematics. [↩](#88712982e0649b89da706b6abbcbc6c2) + +Attaway, S., *Matlab : a practical introduction to programming and problem solving* (2018), Amsterdam: Butterworth-Heinemann. [↩](#15f4380b6ce8a647387d3ccea25711f1) + +OverFlow, S., *Matlab notes for professionals* (2018), : GoalKicker.com. [↩](#e770e23b0d222a65eb74f036227b13b2) + +Johnson, R. K., *The elements of matlab style* (2010), : Cambridge University Press. [↩](#87b279fa5b4ec9b1a73abed2d00b313f) + +Hahn, B., & Valentine, D. T., *Essential matlab for engineers and scientists* (2016), : Academic Press. [↩](#1b4159c36c5367ee0c92139fb403e7e1) diff --git a/content/zettels/multivariable_control.md b/content/zettels/multivariable_control.md index b1177e9..27e9659 100644 --- a/content/zettels/multivariable_control.md +++ b/content/zettels/multivariable_control.md @@ -5,15 +5,15 @@ draft = false +++ Tags -: +: [Norms]({{< relref "norms" >}}) <./biblio/references.bib> ## Backlinks {#backlinks} +- [Multivariable control systems: an engineering approach]({{< relref "albertos04_multiv_contr_system" >}}) - [Position control in lithographic equipment]({{< relref "butler11_posit_contr_lithog_equip" >}}) - [Implementation challenges for multivariable control: what you did not learn in school!]({{< relref "garg07_implem_chall_multiv_contr" >}}) - [Simultaneous, fault-tolerant vibration isolation and pointing control of flexure jointed hexapods]({{< relref "li01_simul_fault_vibrat_isolat_point" >}}) -- [Multivariable control systems: an engineering approach]({{< relref "albertos04_multiv_contr_system" >}}) - [Multivariable feedback control: analysis and design]({{< relref "skogestad07_multiv_feedb_contr" >}}) diff --git a/content/zettels/nano_active_stabilization_system.md b/content/zettels/nano_active_stabilization_system.md index 622ad02..f20fbf2 100644 --- a/content/zettels/nano_active_stabilization_system.md +++ b/content/zettels/nano_active_stabilization_system.md @@ -12,6 +12,6 @@ Tags ## Backlinks {#backlinks} +- [An instrument for 3d x-ray nano-imaging]({{< relref "holler12_instr_x_ray_nano_imagin" >}}) - [Interferometric characterization of rotation stages for x-ray nanotomography]({{< relref "stankevic17_inter_charac_rotat_stages_x_ray_nanot" >}}) - [Automated markerless full field hard x-ray microscopic tomography at sub-50 nm 3-dimension spatial resolution]({{< relref "wang12_autom_marker_full_field_hard" >}}) -- [An instrument for 3d x-ray nano-imaging]({{< relref "holler12_instr_x_ray_nano_imagin" >}}) diff --git a/content/zettels/norms.md b/content/zettels/norms.md new file mode 100644 index 0000000..f81d074 --- /dev/null +++ b/content/zettels/norms.md @@ -0,0 +1,64 @@ ++++ +title = "Systems and Signals Norms" +author = ["Thomas Dehaeze"] +draft = false ++++ + +Tags +: + +Resources: + +- (Skogestad \& Postlethwaite, 2007) +- (Hannu Toivonen, 2002) +- (Zhang, 2011) + + +## \\(\mathcal{H}\_\infty\\) Norm {#mathcal-h-infty--norm} + +SISO Systems => absolute value => bode plot +MIMO Systems => singular value +Signal + + +## \\(\mathcal{H}\_2\\) Norm {#mathcal-h-2--norm} + +RMS value + +The \\(\mathcal{H}\_2\\) is very useful when combined to [Dynamic Error Budgeting]({{< relref "dynamic_error_budgeting" >}}). + +As explained in @phdthesis{monkhorst04_dynam_error_budget, + author = {Wouter Monkhorst}, + school = {Delft University}, + title = {Dynamic Error Budgeting, a design approach}, + year = 2004, +}, the \\(\mathcal{H}\_2\\) norm has a stochastic interpretation: + +> The squared \\(\mathcal{H}\_2\\) norm can be interpreted as the output variance of a system with zero mean white noise input. + + +## Link between signal and system norms {#link-between-signal-and-system-norms} + +# Bibliography +Skogestad, S., & Postlethwaite, I., *Multivariable feedback control: analysis and design* (2007), : John Wiley. [↩](#ad6f62e369b7a8d31c21671886adec1f) + +Toivonen, H. T. (2002). *Robust Control Methods*. Retrieved from [](). . [↩](#90e96a2c8cdb40b7bdf895cf013c0946) + +Zhang, W., *Quantitative Process Control Theory* (2011), : CRC Press. [↩](#8db224194542fbd4c7f4fbe56fdd4e73) + +Monkhorst, W., *Dynamic error budgeting, a design approach* (Doctoral dissertation) (2004). Delft University, . [↩](#651e626e040250ee71a0847aec41b60c) + + +## Backlinks {#backlinks} + +- [Multivariable Control]({{< relref "multivariable_control" >}}) diff --git a/content/zettels/position_sensors.md b/content/zettels/position_sensors.md index 5442342..ae676b9 100644 --- a/content/zettels/position_sensors.md +++ b/content/zettels/position_sensors.md @@ -5,18 +5,24 @@ draft = false +++ Tags -: [Inertial Sensors]({{< relref "inertial_sensors" >}}) +: [Inertial Sensors]({{< relref "inertial_sensors" >}}), [Force Sensors]({{< relref "force_sensors" >}}), [Sensor Fusion]({{< relref "sensor_fusion" >}}) -## Reviews of position sensors {#reviews-of-position-sensors} +## Absolute Position Sensors {#absolute-position-sensors} -- (Collette {\it et al.}, 2012) +- Collette, C. et al., Comparison of new absolute displacement sensors (Collette {\it et al.}, 2012) -- Fleming, A. J., A review of nanometer resolution position sensors: operation and performance (Andrew Fleming, 2013) ([Notes]({{< relref "fleming13_review_nanom_resol_posit_sensor" >}})) + + + +{{< figure src="/ox-hugo/collette12_absolute_disp_sensors.png" caption="Figure 1: Dynamic range of several types of inertial sensors; Price versus resolution for several types of inertial sensors" >}} ## Relative Position Sensors {#relative-position-sensors} +- Fleming, A. J., A review of nanometer resolution position sensors: operation and performance (Andrew Fleming, 2013) ([Notes]({{< relref "fleming13_review_nanom_resol_posit_sensor" >}})) +
Table 1: @@ -111,9 +117,9 @@ Description: (Yoon-Soo Jang \& Seung-Woo Kim, 2017) - + -{{< figure src="/ox-hugo/position_sensor_interferometer_precision.png" caption="Figure 1: Expected precision of interferometer as a function of measured distance" >}} +{{< figure src="/ox-hugo/position_sensor_interferometer_precision.png" caption="Figure 2: Expected precision of interferometer as a function of measured distance" >}} ### Fiber Optic Displacement Sensor {#fiber-optic-displacement-sensor} @@ -123,6 +129,8 @@ Description: | Unipulse | [link](https://www.unipulse.com/product/atw200-2/) | # Bibliography +Collette, C., Janssens, S., Fernandez-Carmona, P., Artoos, K., Guinchard, M., Hauviller, C., & Preumont, A., *Review: inertial sensors for low-frequency seismic vibration measurement*, Bulletin of the Seismological Society of America, *102(4)*, 1289–1300 (2012). http://dx.doi.org/10.1785/0120110223 [↩](#dd5109075933cf543c7eba0979c0ba50) + Collette, C., Janssens, S., Mokrani, B., Fueyo-Roza, L., Artoos, K., Esposito, M., Fernandez-Carmona, P., …, *Comparison of new absolute displacement sensors*, In , International Conference on Noise and Vibration Engineering (ISMA) (pp. ) (2012). : . [↩](#0b0b67de6dddc4d28031ab2d3b28cd3d) Fleming, A. J., *A review of nanometer resolution position sensors: operation and performance*, Sensors and Actuators A: Physical, *190(nil)*, 106–126 (2013). http://dx.doi.org/10.1016/j.sna.2012.10.016 [↩](#3fb5b61524290e36d639a4fac65703d0) @@ -134,5 +142,6 @@ Description: ## Backlinks {#backlinks} -- [Measurement technologies for precision positioning]({{< relref "gao15_measur_techn_precis_posit" >}}) - [A review of nanometer resolution position sensors: operation and performance]({{< relref "fleming13_review_nanom_resol_posit_sensor" >}}) +- [Measurement technologies for precision positioning]({{< relref "gao15_measur_techn_precis_posit" >}}) +- [Inertial Sensors]({{< relref "inertial_sensors" >}}) diff --git a/content/zettels/positioning_stations.md b/content/zettels/positioning_stations.md index 06850b2..89ba300 100644 --- a/content/zettels/positioning_stations.md +++ b/content/zettels/positioning_stations.md @@ -12,6 +12,6 @@ Tags ## Backlinks {#backlinks} -- [Interferometric characterization of rotation stages for x-ray nanotomography]({{< relref "stankevic17_inter_charac_rotat_stages_x_ray_nanot" >}}) - [Position control in lithographic equipment]({{< relref "butler11_posit_contr_lithog_equip" >}}) - [An instrument for 3d x-ray nano-imaging]({{< relref "holler12_instr_x_ray_nano_imagin" >}}) +- [Interferometric characterization of rotation stages for x-ray nanotomography]({{< relref "stankevic17_inter_charac_rotat_stages_x_ray_nanot" >}}) diff --git a/content/zettels/precision_engineering.md b/content/zettels/precision_engineering.md index 5880820..959e77e 100644 --- a/content/zettels/precision_engineering.md +++ b/content/zettels/precision_engineering.md @@ -12,5 +12,5 @@ Tags ## Backlinks {#backlinks} -- [Design for precision: current status and trends]({{< relref "schellekens98_desig_precis" >}}) - [Basics of precision engineering - 1st edition]({{< relref "leach18_basic_precis_engin_edition" >}}) +- [Design for precision: current status and trends]({{< relref "schellekens98_desig_precis" >}}) diff --git a/content/zettels/reference_books.md b/content/zettels/reference_books.md index be14fc3..f2d57fd 100644 --- a/content/zettels/reference_books.md +++ b/content/zettels/reference_books.md @@ -15,6 +15,6 @@ Tags - [Modal testing: theory, practice and application]({{< relref "ewins00_modal" >}}) - [The art of electronics - third edition]({{< relref "horowitz15_art_of_elect_third_edition" >}}) - [Vibration Control of Active Structures - Fourth Edition]({{< relref "preumont18_vibrat_contr_activ_struc_fourt_edition" >}}) +- [Multivariable feedback control: analysis and design]({{< relref "skogestad07_multiv_feedb_contr" >}}) - [Parallel robots : mechanics and control]({{< relref "taghirad13_paral" >}}) - [The design of high performance mechatronics - 2nd revised edition]({{< relref "schmidt14_desig_high_perfor_mechat_revis_edition" >}}) -- [Multivariable feedback control: analysis and design]({{< relref "skogestad07_multiv_feedb_contr" >}}) diff --git a/content/zettels/sensor_fusion.md b/content/zettels/sensor_fusion.md index 25136d7..39dca11 100644 --- a/content/zettels/sensor_fusion.md +++ b/content/zettels/sensor_fusion.md @@ -5,15 +5,16 @@ draft = false +++ Tags -: +: [Actuator Fusion]({{< relref "actuator_fusion" >}}), [Complementary Filters]({{< relref "complementary_filters" >}}) <./biblio/references.bib> ## Backlinks {#backlinks} -- [Sensor fusion for active vibration isolation in precision equipment]({{< relref "tjepkema12_sensor_fusion_activ_vibrat_isolat_precis_equip" >}}) - [Vibration control of flexible structures using fusion of inertial sensors and hyper-stable actuator-sensor pairs]({{< relref "collette14_vibrat" >}}) - [Sensor fusion methods for high performance active vibration isolation systems]({{< relref "collette15_sensor_fusion_method_high_perfor" >}}) - [Nanopositioning system with force feedback for high-performance tracking and vibration control]({{< relref "fleming10_nanop_system_with_force_feedb" >}}) - [Nanopositioning with multiple sensors: a case study in data storage]({{< relref "sebastian12_nanop_with_multip_sensor" >}}) +- [Sensor fusion for active vibration isolation in precision equipment]({{< relref "tjepkema12_sensor_fusion_activ_vibrat_isolat_precis_equip" >}}) +- [Position Sensors]({{< relref "position_sensors" >}}) diff --git a/content/zettels/signal_to_noise_ratio.md b/content/zettels/signal_to_noise_ratio.md new file mode 100644 index 0000000..d042024 --- /dev/null +++ b/content/zettels/signal_to_noise_ratio.md @@ -0,0 +1,35 @@ ++++ +title = "Signal to Noise Ratio" +author = ["Thomas Dehaeze"] +draft = false ++++ + +Tags +: [Electronics]({{< relref "electronics" >}}), [Dynamic Error Budgeting]({{< relref "dynamic_error_budgeting" >}}) + +From @phdthesis{jabben07_mechat, + author = {Jabben, Leon}, + school = {Delft University}, + title = {Mechatronic design of a magnetically suspended rotating + platform}, + year = 2007, +} (Section 3.3.2): + +> Electronic equipment does most often not come with detailed electric schemes, in which case the PSD should be determined from measurements. +> In the design phase however, one has to rely on information provided by specification sheets from the manufacturer. +> The noise performance of components like sensors, amplifiers, converters, etc., is often specified in terms of a **Signal to Noise Ratio** (SNR). +> The SNR gives the ratio of the RMS value of a sine that covers the full range of the channel through which the signal is propagating over the RMS value of the electrical noise. +> +> Usually, the SNR is specified up to a certain cut-off frequency. +> If no information on the colouring of the noise is available, then the corresponding **PSD can be assumed to be white up to the cut-off frequency** \\(f\_c\\): +> \\[ S\_{snr} = \frac{x\_{fr}^2}{8 f\_c C\_{snr}^2} \\] +> with \\(x\_{fr}\\) the full range of \\(x\\), and \\(C\_{snr}\\) the SNR. + +# Bibliography +Jabben, L., *Mechatronic design of a magnetically suspended rotating platform* (Doctoral dissertation) (2007). Delft University, . [↩](#3b7899e183dba866e6a6419cf820467f) diff --git a/content/zettels/stewart_platforms.md b/content/zettels/stewart_platforms.md index 4061a45..b37bb0e 100644 --- a/content/zettels/stewart_platforms.md +++ b/content/zettels/stewart_platforms.md @@ -7,17 +7,51 @@ draft = false Tags : -<./biblio/references.bib> + +## Flexure Jointed Stewart Platforms {#flexure-jointed-stewart-platforms} + +Papers by J.E. McInroy: + +- (O'Brien {\it et al.}, 1998) +- (McInroy {\it et al.}, 1999) +- (McInroy, 1999) +- (McInroy \& Hamann, 2000) +- (Yixin Chen \& McInroy, 2000) +- (McInroy, 2002) +- (Xiaochun Li {\it et al.}, 2001) +- (Haomin Lin \& McInroy, 2003) +- (Jafari \& McInroy, 2003) +- (Chen \& McInroy, 2004) + +# Bibliography +O'Brien, J., McInroy, J., Bodtke, D., Bruch, M., & Hamann, J., *Lessons learned in nonlinear systems and flexible robots through experiments on a 6 legged platform*, In , Proceedings of the 1998 American Control Conference. ACC (IEEE Cat. No.98CH36207) (pp. ) (1998). : . [↩](#89a9631ad2f0fb051d6fb8a91dc96cb2) + +McInroy, J., O'Brien, J., & Neat, G., *Precise, fault-tolerant pointing using a stewart platform*, IEEE/ASME Transactions on Mechatronics, *4(1)*, 91–95 (1999). http://dx.doi.org/10.1109/3516.752089 [↩](#fecc3b6c835f5247abb57a170e2f5364) + +McInroy, J., *Dynamic modeling of flexure jointed hexapods for control purposes*, In , Proceedings of the 1999 IEEE International Conference on Control Applications (Cat. No.99CH36328) (pp. ) (1999). : . [↩](#5da427f78c552aa92cd64c2a6df961f1) + +McInroy, J., & Hamann, J., *Design and control of flexure jointed hexapods*, IEEE Transactions on Robotics and Automation, *16(4)*, 372–381 (2000). http://dx.doi.org/10.1109/70.864229 [↩](#f6d310236552ee92579cf0673a2ca695) + +Chen, Y., & McInroy, J., *Identification and decoupling control of flexure jointed hexapods*, In , Proceedings 2000 ICRA. Millennium Conference. IEEE International Conference on Robotics and Automation. Symposia Proceedings (Cat. No.00CH37065) (pp. ) (2000). : . [↩](#ba05ff213f8e5963d91559d95becfbdb) + +McInroy, J., *Modeling and design of flexure jointed stewart platforms for control purposes*, IEEE/ASME Transactions on Mechatronics, *7(1)*, 95–99 (2002). http://dx.doi.org/10.1109/3516.990892 [↩](#8bfe2d2dce902a584fa016e86a899044) + +Li, X., Hamann, J. C., & McInroy, J. E., *Simultaneous vibration isolation and pointing control of flexure jointed hexapods*, In , Smart Structures and Materials 2001: Smart Structures and Integrated Systems (pp. ) (2001). : . [↩](#e3df2691f750617c3995644d056d553a) + +Lin, H., & McInroy, J., *Adaptive sinusoidal disturbance cancellation for precise pointing of stewart platforms*, IEEE Transactions on Control Systems Technology, *11(2)*, 267–272 (2003). http://dx.doi.org/10.1109/tcst.2003.809248 [↩](#7c236658343683951ee18f3f771a68db) + +Jafari, F., & McInroy, J., *Orthogonal gough-stewart platforms for micromanipulation*, IEEE Transactions on Robotics and Automation, *19(4)*, 595–603 (2003). http://dx.doi.org/10.1109/tra.2003.814506 [↩](#5cc6cbf419f21bb039148a3c012723d0) + +Chen, Y., & McInroy, J., *Decoupled control of flexure-jointed hexapods using estimated joint-space mass-inertia matrix*, IEEE Transactions on Control Systems Technology, *12(3)*, 413–421 (2004). http://dx.doi.org/10.1109/tcst.2004.824339 [↩](#7683f004697e712d8aebd697ab7c7bf7) ## Backlinks {#backlinks} -- [Six dof active vibration control using stewart platform with non-cubic configuration]({{< relref "zhang11_six_dof" >}}) -- [Decentralized vibration control of a voice coil motor-based stewart parallel mechanism: simulation and experiments]({{< relref "tang18_decen_vibrat_contr_voice_coil" >}}) -- [Dynamic modeling and decoupled control of a flexible stewart platform for vibration isolation]({{< relref "yang19_dynam_model_decoup_contr_flexib" >}}) -- [Parallel robots : mechanics and control]({{< relref "taghirad13_paral" >}}) -- [Investigation on active vibration isolation of a stewart platform with piezoelectric actuators]({{< relref "wang16_inves_activ_vibrat_isolat_stewar" >}}) -- [Identification and decoupling control of flexure jointed hexapods]({{< relref "chen00_ident_decoup_contr_flexur_joint_hexap" >}}) - [The stewart platform manipulator: a review]({{< relref "dasgupta00_stewar_platf_manip" >}}) - [Modeling and control of vibration in mechanical systems]({{< relref "du10_model_contr_vibrat_mechan_system" >}}) - [Studies on stewart platform manipulator: a review]({{< relref "furqan17_studies_stewar_platf_manip" >}}) @@ -26,9 +60,16 @@ Tags - [Active isolation and damping of vibrations via stewart platform]({{< relref "hanieh03_activ_stewar" >}}) - [Sensors and control of a space-based six-axis vibration isolation system]({{< relref "hauge04_sensor_contr_space_based_six" >}}) - [Dynamic modeling and experimental analyses of stewart platform with flexible hinges]({{< relref "jiao18_dynam_model_exper_analy_stewar" >}}) -- [Simultaneous, fault-tolerant vibration isolation and pointing control of flexure jointed hexapods]({{< relref "li01_simul_fault_vibrat_isolat_point" >}}) - [A new isotropic and decoupled 6-dof parallel manipulator]({{< relref "legnani12_new_isotr_decoup_paral_manip" >}}) +- [Simultaneous, fault-tolerant vibration isolation and pointing control of flexure jointed hexapods]({{< relref "li01_simul_fault_vibrat_isolat_point" >}}) - [Simultaneous vibration isolation and pointing control of flexure jointed hexapods]({{< relref "li01_simul_vibrat_isolat_point_contr" >}}) - [A six-axis single-stage active vibration isolator based on stewart platform]({{< relref "preumont07_six_axis_singl_stage_activ" >}}) - [Vibration Control of Active Structures - Fourth Edition]({{< relref "preumont18_vibrat_contr_activ_struc_fourt_edition" >}}) - [A soft 6-axis active vibration isolator]({{< relref "spanos95_soft_activ_vibrat_isolat" >}}) +- [Parallel robots : mechanics and control]({{< relref "taghirad13_paral" >}}) +- [Decentralized vibration control of a voice coil motor-based stewart parallel mechanism: simulation and experiments]({{< relref "tang18_decen_vibrat_contr_voice_coil" >}}) +- [Investigation on active vibration isolation of a stewart platform with piezoelectric actuators]({{< relref "wang16_inves_activ_vibrat_isolat_stewar" >}}) +- [Dynamic modeling and decoupled control of a flexible stewart platform for vibration isolation]({{< relref "yang19_dynam_model_decoup_contr_flexib" >}}) +- [Six dof active vibration control using stewart platform with non-cubic configuration]({{< relref "zhang11_six_dof" >}}) +- [Dynamic modeling of flexure jointed hexapods for control purposes]({{< relref "mcinroy99_dynam" >}}) +- [Identification and decoupling control of flexure jointed hexapods]({{< relref "chen00_ident_decoup_contr_flexur_joint_hexap" >}}) diff --git a/content/zettels/vibration_isolation.md b/content/zettels/vibration_isolation.md index b231f3a..0b33e3b 100644 --- a/content/zettels/vibration_isolation.md +++ b/content/zettels/vibration_isolation.md @@ -12,9 +12,6 @@ Tags ## Backlinks {#backlinks} -- [Six dof active vibration control using stewart platform with non-cubic configuration]({{< relref "zhang11_six_dof" >}}) -- [Dynamic modeling and decoupled control of a flexible stewart platform for vibration isolation]({{< relref "yang19_dynam_model_decoup_contr_flexib" >}}) -- [Investigation on active vibration isolation of a stewart platform with piezoelectric actuators]({{< relref "wang16_inves_activ_vibrat_isolat_stewar" >}}) - [Review of active vibration isolation strategies]({{< relref "collette11_review_activ_vibrat_isolat_strat" >}}) - [Vibration control of flexible structures using fusion of inertial sensors and hyper-stable actuator-sensor pairs]({{< relref "collette14_vibrat" >}}) - [Sensor fusion methods for high performance active vibration isolation systems]({{< relref "collette15_sensor_fusion_method_high_perfor" >}}) @@ -31,3 +28,7 @@ Tags - [Vibration Control of Active Structures - Fourth Edition]({{< relref "preumont18_vibrat_contr_activ_struc_fourt_edition" >}}) - [A soft 6-axis active vibration isolator]({{< relref "spanos95_soft_activ_vibrat_isolat" >}}) - [Sensor fusion for active vibration isolation in precision equipment]({{< relref "tjepkema12_sensor_fusion_activ_vibrat_isolat_precis_equip" >}}) +- [Investigation on active vibration isolation of a stewart platform with piezoelectric actuators]({{< relref "wang16_inves_activ_vibrat_isolat_stewar" >}}) +- [Dynamic modeling and decoupled control of a flexible stewart platform for vibration isolation]({{< relref "yang19_dynam_model_decoup_contr_flexib" >}}) +- [Six dof active vibration control using stewart platform with non-cubic configuration]({{< relref "zhang11_six_dof" >}}) +- [Element and system design for active and passive vibration isolation]({{< relref "zuo04_elemen_system_desig_activ_passiv_vibrat_isolat" >}}) diff --git a/content/zettels/virtual_sensor_fusion.md b/content/zettels/virtual_sensor_fusion.md new file mode 100644 index 0000000..14a30f9 --- /dev/null +++ b/content/zettels/virtual_sensor_fusion.md @@ -0,0 +1,15 @@ ++++ +title = "Virtual Sensor Fusion" +author = ["Thomas Dehaeze"] +draft = false ++++ + +Tags +: + +<./biblio/references.bib> + + +## Backlinks {#backlinks} + +- [Advances in internal model control technique: a review and future prospects]({{< relref "saxena12_advan_inter_model_contr_techn" >}}) diff --git a/public/404.html b/public/404.html new file mode 100644 index 0000000..171d525 --- /dev/null +++ b/public/404.html @@ -0,0 +1,148 @@ + + + + + + 404 page not found - My digital brain + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+
+ +
+ + +
+
+
+
+

+

/* 404 page not found. */

+ +
+ +
+
+
+ +
+ + + + +
+ +
+ +
+
+ + + + + + + + + + + + + + + + + diff --git a/public/android-chrome-192x192.png b/public/android-chrome-192x192.png new file mode 100644 index 0000000000000000000000000000000000000000..cb1ca539bd146a61fab895896bb3440cb9c394b2 GIT binary patch literal 11033 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 literal 0 HcmV?d00001 diff --git a/public/android-chrome-512x512.png b/public/android-chrome-512x512.png new file mode 100644 index 0000000000000000000000000000000000000000..8f66b2a2f52972d0ed7dc3c938a5be878493ca6b GIT binary patch literal 31307 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 literal 0 HcmV?d00001 diff --git a/public/apple-touch-icon.png b/public/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..8f66b2a2f52972d0ed7dc3c938a5be878493ca6b GIT binary patch literal 31307 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 literal 0 HcmV?d00001 diff --git a/public/book/albertos04_multiv_contr_system/index.html b/public/book/albertos04_multiv_contr_system/index.html new file mode 100644 index 0000000..c399e14 --- /dev/null +++ b/public/book/albertos04_multiv_contr_system/index.html @@ -0,0 +1,176 @@ + + + + + + Multivariable control systems: an engineering approach - My digital brain + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+
+ +
+ + +
+
+
+
+
+
+
Tags
+
Multivariable Control
+
Reference
+
(Albertos & Antonio, 2004)
+
Author(s)
+
Albertos, P., & Antonio, S.
+
Year
+
2004
+
+

Bibliography

+

Albertos, P., & Antonio, S., Multivariable control systems: an engineering approach (2004), : Springer-Verlag.

+ +
+
+
+
+
+ +
+ + + + +
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + diff --git a/public/book/du10_model_contr_vibrat_mechan_system/index.html b/public/book/du10_model_contr_vibrat_mechan_system/index.html new file mode 100644 index 0000000..6485220 --- /dev/null +++ b/public/book/du10_model_contr_vibrat_mechan_system/index.html @@ -0,0 +1,178 @@ + + + + + + Modeling and control of vibration in mechanical systems - My digital brain + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+
+ +
+ + +
+
+
+ +
+
+
+ +
+ + + + +
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + diff --git a/public/book/du19_multi_actuat_system_contr/index.html b/public/book/du19_multi_actuat_system_contr/index.html new file mode 100644 index 0000000..d51a5d3 --- /dev/null +++ b/public/book/du19_multi_actuat_system_contr/index.html @@ -0,0 +1,601 @@ + + + + + + Multi-stage actuation systems and control - My digital brain + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+
+ +
+ + +
+
+
+
+
+

Tags +:

+
+
Reference
+
(Chunling Du & Chee Khiang Pang, 2019)
+
Author(s)
+
Du, C., & Pang, C. K.
+
Year
+
2019
+
+

Mechanical Actuation Systems

+

Introduction

+

When high bandwidth, high position accuracy and long stroke are required simultaneously: dual-stage systems composed of a coarse (or primary) actuator and a fine actuator working together are used.

+

Popular choices for coarse actuator are:

+
    +
  • DC motor
  • +
  • Voice coil motor (VCM)
  • +
  • Permanent magnet stepper motor
  • +
  • Permanent magnet linear synchronous motor
  • +
+

As fine actuators, most of the time piezoelectric actuator are used.

+

In order to overcome fine actuator stringent stroke limitation and increase control bandwidth, three-stage actuation systems are necessary in practical applications.

+

Actuators

+

Primary Actuator

+

Without loss of generality, the VCM actuator is used as the primary actuator. +When current passes through the coil, a force is produced which accelerates the actuator radially. +The produced force is a function of the current \(i_c\): +\[ f_m = k_t i_c \] +where \(k_t\) is a linearized nominal value called the torque constant.

+

The resonance of the actuator is mainly due to the flexibility of the pivot bearing, arm, suspension.

+

Then the bandwidth of the control loop is low and the resonances are not a limiting factor of the control design, the actuator model can be considered as follows: +\[ P_v(s) = \frac{k_{vcm}}{s^2} \]

+

When the bandwidth is high, the actuator resonances have to be considered in the control design since the flexible resonance modes will reduce the system stability and affect the control performance. Then the actuator model becomes +\[ P_v(s) = \frac{k_{vcm}}{s^2} P_r(s) \] +which includes the resonance model +\[ P_r(s) = \Pi_{i=1}^{N} P_{ri}(s) \] +and the resonance \(P_{ri}(s)\) can be represented as one of the following forms

+

\begin{align*} +P_{ri}(s) &= \frac{\omega_i^2}{s^2 + 2 \xi_i \omega_i s + \omega_i^2} \\\
+P_{ri}(s) &= \frac{b_{1i} \omega_i s + b_{0i} \omega_i^2}{s^2 + 2 \xi_i \omega_i s + \omega_i^2} \\\
+P_{ri}(s) &= \frac{b_{2i} s^2 + b_{1i} \omega_i s + b_{0i} \omega_i^2}{s^2 + 2 \xi_i \omega_i s + \omega_i^2} +\end{align*}

+

Secondary Actuators

+

We here consider two types of secondary actuators: the PZT milliactuator (figure 1) and the microactuator.

+

+
+ Figure 1: A PZT-actuator suspension
+

Figure 1: A PZT-actuator suspension

+
+
+ +

There are three popular types of micro-actuators: electrostatic moving-slider microactuator, PZT slider-driven microactuator and thermal microactuator. +There characteristics are shown on table 1.

+

+
+ Table 1: + Performance comparison of microactuators +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Elect.PZTThermal
TF\(\frac{K}{s^2 + 2\xi\omega s + \omega^2}\)\(\frac{K}{s^2 + 2\xi\omega s + \omega^2}\)\(\frac{K}{\tau s + 1}\)
\(\tau\)\(<\SI{0.1}{ms}\)\(<\SI{0.05}{ms}\)\(>\SI{0.1}{ms}\)
\(omega\)\(1-\SI{2}{kHz}\)\(20-\SI{25}{kHz}\)\(>\SI{15}{kHz}\)
+

Single-Stage Actuation Systems

+

A typical closed-loop control system is shown on figure 2, where \(P_v(s)\) and \(C(z)\) represent the actuator system and its controller.

+

+
+ Figure 2: Block diagram of a single-stage actuation system
+

Figure 2: Block diagram of a single-stage actuation system

+
+
+ +

Dual-Stage Actuation Systems

+

Dual-stage actuation mechanism for the hard disk drives consists of a VCM actuator and a secondary actuator placed between the VCM and the sensor head. +The VCM is used as the primary stage to provide long track seeking but with poor accuracy and slow response time, while the secondary stage actuator is used to provide higher positioning accuracy and faster response but with a stroke limit.

+

+
+ Figure 3: Block diagram of dual-stage actuation system
+

Figure 3: Block diagram of dual-stage actuation system

+
+
+ +

Three-Stage Actuation Systems

+

Due to the limited allowed stroke of the microactuator, the control bandwidth has to be restricted and that limits the dual-stage disturbance rejection capability.

+

A three-stage actuation system is therefore introduced to further increase the bandwidth.

+

Typically, a VCM actuator is used as the primary actuator, PZT milliactuator as the second stage actuator and a third actuator more collocated is used.

+

High-Precision Positioning Control of Dual-Stage Actuation Systems

+

Introduction

+

The sensitivity function of the closed-loop system has provided a straightforward view of its disturbance rejection capability. +It is demanded that the sensitivity function magnitude in the low-frequency range be sufficiently low, while its hump in high-frequency range stays low enough. +In view of this, the controller design for dual-stage actuation systems adopts a weighting function to shape the sensitivity function.

+

Control Schemes

+

A popular control scheme for dual-stage actuation system is the decoupled structure as shown in figure 4.

+
    +
  • \(C_v(z)\) and \(C_p(z)\) are the controllers respectively, for the primary VCM actuator \(P_v(s)\) and the secondary actuator \(P_p(s)\).
  • +
  • \(\hat{P}_p(z)\) is an approximation of \(P_p\) to estimate \(y_p\).
  • +
  • \(d_1\) and \(d_2\) denote internal disturbances
  • +
  • \(n\) is the measurement noise
  • +
  • \(d_u\) stands for external vibration
  • +
+

+
+ Figure 4: Decoupled control structure for the dual-stage actuation system
+

Figure 4: Decoupled control structure for the dual-stage actuation system

+
+
+ +

The open-loop transfer function from \(pes\) to \(y\) is +\[ G(z) = P_p(z) C_p(z) + P_v(z) C_v(z) + P_v(z) C_v(z) \hat{P}_p(z) C_p(z) \] +And the overall sensitivity function of the closed loop system from \(r\) to \(pes\) is +\[ S(z) = \frac{1}{1 + G(z)} \] +which is approximately +\[ S(z) = \frac{1}{[1 + P_p(z) C_p(z)] [1 + P_v(z)C_v(z)]} \] +since within a certain bandwidth +\[ \hat{P}_p(z) \approx P_p(z) \]

+

The sensitivity functions of the VCM loop and the secondary actuator loop are

+

\begin{equation} +S_v(z) = \frac{1}{1 + P_v(z) C_v(z)}, \quad S_p(z) = \frac{1}{1 + P_p(z) C_p(z)} +\end{equation}

+

And we obtain that the dual-stage sensitivity function \(S(z)\) is the product of \(S_v(z)\) and \(S_p(z)\). +Thus, the dual-stage system control design can be decoupled into two independent controller designs.

+

Another type of control scheme is the parallel structure as shown in figure 5. +The open-loop transfer function from \(pes\) to \(y\) is +\[ G(z) = P_p(z) C_p(z) + P_v(z) C_v(z) \]

+

The overall sensitivity function of the closed-loop system from \(r\) to \(pes\) is +\[ S(z) = \frac{1}{1 + G(z)} = \frac{1}{1 + P_p(z) C_p(z) + P_v(z) C_v(z)} \]

+

+
+ Figure 5: Parallel control structure for the dual-stage actuator system
+

Figure 5: Parallel control structure for the dual-stage actuator system

+
+
+ +

Because of the limited displacement range of the secondary actuator, the control efforts for the two actuators should be distributed properly when designing respective controllers to meet the required performance, make the actuators not conflict with each other, as well as prevent the saturation of the secondary actuator.

+

Controller Design Method in the Continuous-Time Domain

+

\(\mathcal{H}_\infty\) loop shaping method is used to design the controllers for the primary and secondary actuators. +The structure of the \(\mathcal{H}_\infty\) loop shaping method is plotted in figure 6 where \(W(s)\) is a weighting function relevant to the designed control system performance such as the sensitivity function.

+

For a plant model \(P(s)\), a controller \(C(s)\) is to be designed such that the closed-loop system is stable and

+

\begin{equation} +\|T_{zw}\|_\infty < 1 +\end{equation}

+

is satisfied, where \(T_{zw}\) is the transfer function from \(w\) to \(z\): \(T_{zw} = S(s) W(s)\).

+

+
+ Figure 6: Block diagram for \(\mathcal{H}_\infty\) loop shaping method to design the controller \(C(s)\) with the weighting function \(W(s)\)
+

Figure 6: Block diagram for \(\mathcal{H}_\infty\) loop shaping method to design the controller \(C(s)\) with the weighting function \(W(s)\)

+
+
+ +

Equation 1 means that \(S(s)\) can be shaped similarly to the inverse of the chosen weighting function \(W(s)\). +One form of \(W(s)\) is taken as

+

\begin{equation} +W(s) = \frac{\frac{1}{M}s^2 + 2\xi\omega\frac{1}{\sqrt{M}}s + \omega^2}{s^2 + 2\omega\sqrt{\epsilon}s + \omega^2\epsilon} +\end{equation}

+

where \(\omega\) is the desired bandwidth, \(\epsilon\) is used to determine the desired low frequency level of sensitivity magnitude and \(\xi\) is the damping ratio.

+

The controller can then be synthesis using the linear matrix inequality (LMI) approach.

+

The primary and secondary actuator control loops are designed separately for the dual-stage control systems. +But when designing their respective controllers, certain performances are required for the two actuators, so that control efforts for the two actuators are distributed properly and the actuators don’t conflict with each other’s control authority. +As seen in figure 7, the VCM primary actuator open loop has a higher gain at low frequencies, and the secondary actuator open loop has a higher gain in the high-frequency range.

+

+
+ Figure 7: Frequency responses of \(G_v(s) = C_v(s)P_v(s)\) (solid line) and \(G_p(s) = C_p(s) P_p(s)\) (dotted line)
+

Figure 7: Frequency responses of \(G_v(s) = C_v(s)P_v(s)\) (solid line) and \(G_p(s) = C_p(s) P_p(s)\) (dotted line)

+
+
+ +

The sensitivity functions are shown in figure 8, where the hump of \(S_v\) is arranged within the bandwidth of \(S_p\) and the hump of \(S_p\) is lowered as much as possible. +This needs to decrease the bandwidth of the primary actuator loop and increase the bandwidth of the secondary actuator loop.

+

+
+ Figure 8: Frequency response of \(S_v(s)\) and \(S_p(s)\)
+

Figure 8: Frequency response of \(S_v(s)\) and \(S_p(s)\)

+
+
+ +

A basic requirement of the dual-stage actuation control system is to make the individual primary and secondary loops stable. +It also required that the primary actuator path has a higher gain than the secondary actuator path at low frequency range and the secondary actuator path has a higher gain than the primary actuator path in high-frequency range. +These can be achieve by choosing appropriate weighting function for the controllers design.

+

Conclusion

+

The controller design has been discussed for high-precision positioning control of the dual-stage actuation systems. +The \(\mathcal{H}_\infty\) loop shaping method has been applied and the design method has been presented. +With the weighting functions, the desired sensitivity function can achieved. +Such a design method can produce robust controllers with more disturbance rejection in the low frequency range and less disturbance amplification in the high-frequency range.

+

Modeling and Control of a Three-Stage Actuation System

+

Introduction

+

In view of the additional bandwidth requirement which is limited by stroke constraint and saturation of secondary actuators, three-stage actuation systems are thereby proposed to meet the demand of a higher bandwidth. +In this section, a specific three-stage actuation system is presented and a controller strategy is proposed, which is based on a decoupled master-slave dual-stage control structure combined with a third stage actuation in parallel format.

+

Actuator and Vibration Modeling

+

A VCM actuator is used as the first-stage actuator denoted by \(P_v(s)\), a PZT milliactuator as the second-stage actuator denoted by \(P_p(s)\), and a thermal microactuator denoted by \(P_m(s)\).

+

Control Strategy and Controller Design

+

Figure 9 shows the control structure for the three-stage actuation system.

+

The control scheme is based on the decoupled master-slave dual-stage control and the third stage microactuator is added in parallel with the dual-stage control system. +The parallel format is advantageous to the overall control bandwidth enhancement, especially for the microactuator having limited stroke which restricts the bandwidth of its own loop. +The reason why the decoupled control structure is adopted here is that its overall sensitivity function is the product of those of the two individual loops, and the VCM and the PTZ controllers can be designed separately.

+

+
+ Figure 9: Control system for the three-stage actuation system
+

Figure 9: Control system for the three-stage actuation system

+
+
+ +

The open-loop transfer function of the three-stage actuation system is derived as

+

\begin{equation} +G(z) = G_v(z) + G_p(z) + G_v(z) G_p(z) + G_m(z) +\end{equation}

+

with

+

\begin{align*} +G_v(z) &= P_v(z) C_v(z) \\\
+G_p(z) &= P_p(z) C_p(z) \\\
+G_m(z) &= P_m(z) C_m(z) +\end{align*}

+

The overall sensitivity function is given by

+

\begin{equation} +S(z) = \frac{1}{1 + G(z)} +\end{equation}

+

The VCM actuator \(P_v(s)\) works in a low bandwidth below \(\SI{1}{kHz}\). +The PZT actuated milliactuator \(P_p(s)\) works under a reasonably high bandwidth up to \(\SI{3}{kHz}\). +The third-stage actuator \(P_m(s)\) is used to further push the bandwidth as high as possible.

+

The control performances of both the VCM and the PZT actuators are limited by their dominant resonance modes. +The open-loop frequency responses of the three stages are shown on figure 10.

+

+
+ Figure 10: Frequency response of the open-loop transfer function
+

Figure 10: Frequency response of the open-loop transfer function

+
+
+ +

The obtained sensitivity function is shown on figure 11.

+

+
+ Figure 11: Sensitivity function of the VCM single stage, the dual-stage and the three-stage loops
+

Figure 11: Sensitivity function of the VCM single stage, the dual-stage and the three-stage loops

+
+
+ +

Performance Evaluation

+

External vibration from the system working environment is much higher than the internal disturbance, especially for ultra-high precision positioning systems. +In the presence of external vibration, the actuators control effort is dominantly determined by the external vibration. +But because the actuator input is constrained, the external vibration level has to be limited. +Otherwise, saturation will occur in the control loop and the control system performance will be degraded.

+

Therefore, the stroke specification of the actuators, especially milliactuator and microactuators, is very important for achievable control performance. +Higher stroke actuators have stronger abilities to make sure that the control performances are not degraded in the presence of external vibrations.

+

For the three-stage control architecture as shown on figure 9, the position error is +\[ e = -S(P_v d_1 + d_2 + d_e) + S n \] +The control signals and positions of the actuators are given by

+

\begin{align*} +u_p &= C_p e,\ y_p = P_p C_p e \\\
+u_m &= C_m e,\ y_m = P_m C_m e \\\
+u_v &= C_v ( 1 + \hat{P}_pC_p ) e,\ y_v = P_v ( u_v + d_1 ) +\end{align*}

+

The controller design for the microactuators with input constraints must take into account both external vibration requirements and actuators’ stroke, based on which an appropriate bandwidth should be decided when designing the control system. +Higher bandwidth/higher level of disturbance generally means high stroke needed.

+

Different Configurations of the Control System

+

A decoupled control structure can be used for the three-stage actuation system (see figure 12).

+

The overall sensitivity function is +\[ S(z) = \approx S_v(z) S_p(z) S_m(z) \] +with \(S_v(z)\) and \(S_p(z)\) are defined in equation 1 and +\[ S_m(z) = \frac{1}{1 + P_m(z) C_m(z)} \]

+

Denote the dual-stage open-loop transfer function as \(G_d\) +\[ G_d(z) = G_v(z) + G_p(z) + G_v(z) G_p(z) \]

+

The open-loop transfer function of the overall system is +\[ G(z) = G_d(z) + G_m(z) + G_d(z) G_m(z) \]

+

+
+ Figure 12: Decoupled control structure for the three-stage actuation system
+

Figure 12: Decoupled control structure for the three-stage actuation system

+
+
+ +

The control signals and the positions of the three actuators are

+

\begin{align*} +u_p &= C_p(1 + \hat{P}_m C_m) e, \ y_p = P_p u_p \\\
+u_m &= C_m e, \ y_m = P_m M_m e \\\
+u_v &= C_v(1 + \hat{P}_p C_p) (1 + \hat{P}_m C_m) e, \ y_v = P_v u_v +\end{align*}

+

The decoupled configuration makes the low frequency gain much higher, and consequently there is much better rejection capability at low frequency compared to the parallel architecture (see figure 13).

+

+
+ Figure 13: Frequency responses of the open-loop transfer functions for the three-stages parallel and decoupled structure
+

Figure 13: Frequency responses of the open-loop transfer functions for the three-stages parallel and decoupled structure

+
+
+ +

Conclusion

+

The relationship among the external vibration, the microactuator stroke, and the achievable control bandwidth has been discussed for being considered in the controller design. +The discussion suggests that in addition to the traditional wisdom of just increasing the resonant frequency, adding more stroke to the microactuator will give more freedom to the loop shaping for the control system design.

+

Dual-Stage System Control Considering Secondary Actuator Stroke Limitation

+

Introduction

+

More Freedom Loop Shaping for Microactuator Controller Design

+

Dual-Stage System Control Design for 5 kHz Bandwidth

+

Evaluation with the Consideration of External Vibration and Microactuator Stroke

+

Conclusion

+

Saturation Control for Microactuators in Dual-Stage Actuation Systems

+

Introduction

+

Modeling and Feedback Control

+

Anti-Windup Compensation Design

+

Simulation and Experimental Results

+

Conclusion

+

Time Delay and Sampling Rate Effect on Control Performance of Dual-Stage Actuation Systems

+

Introduction

+

Modeling of Time Delay

+

Dual-Stage Actuation System Modeling with Time Delay for Controller Design

+

Controller Design with Time Delay for the Dual-Stage Actuation Systems

+

Time Delay Effect on Dual-Stage System Control Performance

+

Sampling Rate Effect on Dual-Stage System Control Performance

+

Conclusion

+

PZT Hysteresis Modeling and Compensation

+

Introduction

+

Modeling of Hysteresis

+

PI Model

+

GPI Model

+

Inverse GPI Model

+

Application of GPI Model to a PZT-Actuated Structure

+

Modeling of the Hysteresis in the PZT-Actuated Structure

+

Hysteresis Compensator Design

+

Experimental Verification

+

Conclusion

+

Seeking Control of Dual-Stage Actuation Systems with Trajectory Optimization

+

Introduction

+

Current Profile of VCM Primary Actuator

+

PTOS Method

+

A General Form of VCM Current Profiles

+

Control System Structure for the Dual-Stage Actuation System

+

Design of VCM Current Profile a[sub(v)] and Dual-Stage Reference Trajectory r[sub(d)]

+

Seeking within PZT Milliactuator Stroke

+

Seeking over PZT Milliactuator Stroke

+

Conclusion

+

High-Frequency Vibration Control Using PZT Active Damping

+

Introduction

+

Singular Perturbation Method-Based Controller Design

+

Singular Perturbation Control Topology

+

Identification of Fast Dynamics Using PZT as a Sensor

+

Design of Controllers

+
Fast Subsystem Estimator G[sub(v)][sup(*)]
+
Fast Controller C[sub(v)]
+
Slow Controller C[sub(v)]
+

Simulation and Experimental Results

+
Frequency Responses
+
Time Responses
+

H[sub(2)] Controller Design

+

Design of Csub(d) with H[sub(2)] Method and Notch Filters

+

Design of Mixed H[sub(2)]/H[sub(∞)] Controller Csub(d)

+

Application Results

+

System Modeling

+

H[sub(2)] Active Damping Control

+

Mixed H[sub(2)]/H[sub(∞)] Active Damping Control

+

Experimental Results

+

Conclusion

+

Self-Sensing Actuation of Dual-Stage Systems

+

Introduction

+

Estimation of PZT Secondary Actuator’s Displacement y[sub(p)][sup(*)]

+

Self-Sensing Actuation and Bridge Circuit

+

PZT Displacement Estimation Circuit H[sub(B)]

+

Design of Controllers

+

VCM Controller and Controller C[sub(D)]

+

PZT Controller

+

Performance Evaluation

+

Effectiveness of C[sub(D)]

+

Position Errors

+

Conclusion

+

Modeling and Control of a MEMS Micro X–Y Stage Media Platform

+

Introduction

+

MEMS Micro X–Y Stage

+

Design and Simulation of Micro X–Y Stage

+
Static
+
Dynamic
+

Modeling of Micro X–Y Stage

+

Fabrication of the MEMS Micro X–Y Stage

+

Capacitive Self-Sensing Actuation

+

Design of CSSA Bridge Circuit

+

Experimental Verification

+

Robust Decoupling Controller Design

+

Choice of Pre-Shaping Filters

+

Controller Synthesis

+

Frequency Responses

+

Time Responses

+

Robustness Analysis

+

Conclusion

+

Conclusions

+

Many secondary actuators have been developed in addition to primary actuators in the field of mechanical actuation systems. +The aim is to provide high performance such as high precision and fast response. +Several types of secondary actuators have been introduced such as PZT milliactuator, electrostatic microactuator, PZT microactuator, and thermal microactuator. +Comparison of these secondary actuators has been made, and these secondary actuators have made dual and multi-stage actuation mechanisms possible.

+

Three-stage actuation systems have been proposed for the demand of wider bandwidth, to overcome the limitation by stroke constraint and saturation of secondary actuators. +After the characteristics of the three-stage systems have been developed and the models have been identified, the control strategy and algorithm have been developed to deal with vibrations and meet different requirements. +Particularly, for the three-stage actuation systems, the presented control strategies make it easy to further push the bandwidth and meet the performance requirement. +The control of the thermal microactuator based dual-stage system has been discussed in detail, including linearization and controller design method.

+

The developed advanced algorithms applied in the multi-stage systems include \(\mathcal{H}_\infty\) loop shaping, anti-windup compensation, \(\mathcal{H}_2\) control method, +and mixed \(\mathcal{H}_2/\mathcal{H}_\infty\) control method. +Typical problems of the milli and micro-actuators as the secondary actuators have been considered and appropriate solutions have been presented such as saturation compensation, hysteresis modeling and compensation, stroke limitation, and PZT self-sensing scheme. +Time delay and sampling rate effect on the control performance have been analyzed to help select appropriate sampling rate and design suitable controllers.

+

Specific usage of PZT elements has been produced for system performance improvement. +Using PZT elements as a sensor to deal with high-frequency vibration beyond the bandwidth has been proposed and systematic controller design methods have been developed. +As a more advanced concept, PZT elements being used as actuator and sensor simultaneously has also been addressed in this book with detailed scheme and controller design methodology for effective utilization.

+

Bibliography

+

Du, C., & Pang, C. K., Multi-stage actuation systems and control (2019), Boca Raton, FL: CRC Press.

+ +
+
+
+
+
+ +
+ + + + +
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + diff --git a/public/book/ewins00_modal/index.html b/public/book/ewins00_modal/index.html new file mode 100644 index 0000000..f5d8ae2 --- /dev/null +++ b/public/book/ewins00_modal/index.html @@ -0,0 +1,3891 @@ + + + + + + Modal testing: theory, practice and application - My digital brain + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+
+ +
+ + +
+
+
+
+
+
+
Tags
+
System Identification, Reference Books
+
Reference
+
(Ewins, 2000)
+
Author(s)
+
Ewins, D.
+
Year
+
2000
+
+

Overview

+

Introduction to Modal Testing

+

The major objectives of modal testing are:

+
    +
  • Determining the nature and extent of vibration response levels in operation
  • +
  • Verifying theoretical models and predictions of the vibrations
  • +
  • Measurement of the essential materials properties under dynamic loading, such as damping capacity, friction and fatigue endurance
  • +
+

For many applications, vibrations is directly related to performance and it is important that the vibration levels are anticipated and brought under satisfactory control.

+

The two major vibration measurement objectives corresponds to two types of test:

+
    +
  1. Free vibration: responses are measured during operation of the machine
  2. +
  3. Forced vibrations: the structure is vibrated with a known excitation, often out of its normal service environment. This type of testing is generally made under more closely-controlled conditions than the first one, and yields to more accurate information
  4. +
+

Modal Testing means “the processes involved in testing components or structure with the objective of obtaining a mathematical description of their dynamic of vibration behavior”. +The form of “mathematical description” can vary from one application to the other: it can be an estimate of natural frequency and damping factor in one case and a full mass-spring-dashpot model for the next.

+

Applications of modal testing

+

We must remember that no single test or analysis procedure is best for all cases and so it is very important that a clear objective is defined before any industrial test is undertaken so that the optimum methods may be used.

+

The different objectives can be:

+
    +
  1. +

    Measurement of a structure’s vibration properties in order to compare these with a theoretical model (finite element model for instance). +This is usually used to validate a model. What is required for the test are:

    +
      +
    • accurate estimates of natural frequencies
    • +
    • descriptions of the mode shapes
    • +
    +

    At this stage, accurate mode shape data are not essential. It is generally not possible to “predict” the damping in each mode of vibration from a theoretical model.

    +
  2. +
  3. +

    Adjust or correct the theoretical model in order to bring its modal properties closer into line with the measured results. +A correlation technique can be used: the two sets of data are combined, quantitatively, in order to identify specifically the causes of the discrepancies between predicted and measured properties. This however, requires precise description of the mode shapes (the eigenvectors) from the modal analysis.

    +
  4. +
  5. +

    Sub-structuring process: use modal testing in order to produce a mathematical model of a component which may be incorporated into a structural assembly. +Here, as it is a fully quantitative model that is sought, accurate data are required for natural frequencies, modal damping factors and mode shapes. +Also, all modes must be included simultaneously as out-of-range modes will influence the structure’s behavior in a given frequency range of interest for the complete assembly. This application is altogether more demanding than the previous ones.

    +
  6. +
  7. +

    Predicting the effects of modifications to the original structure, as tested. +For this application and the sub-structuring process, one need information about rotational degrees-of-freedom, i.e. moments and rotational displacements. +These are generally ignore in experimental-based studies as they are much more difficult to measure.

    +
  8. +
  9. +

    Force Determination. There are a number of situations where knowledge of the dynamic forces causing vibration is required but where direct measurement of these forces is not practical. +For these cases, one solution is offered by a process whereby measurements of the response caused by the forces are combined with a mathematical description of the transfer functions of the structure in order to deduce the forces. +This process can be very sensitive to the accuracy of the model used, and it is often essential that the model itself be derived from measurements

    +
  10. +
+

Usually, the normal procedure for modal testing is:

+
    +
  1. Measure
  2. +
  3. Analyze the measured data
  4. +
  5. Derive a mathematical model of the structure
  6. +
+

However, there are some cases where this is not the optimum procedure. +The last step is usually taken in order to reduce a vast quantity of actual measurements to a small and efficient data set usually referred to as the “modal model”. +This reduction process has an additional benefit of eliminating small inconsistencies which will inevitably occur in measured data.

+

Philosophy of Modal Testing

+

One of the major requirements to apply modal testing is a thorough integration with an high level of understanding of three components:

+
    +
  1. Theoretical basis of vibration
  2. +
  3. Accurate measurement of vibration
  4. +
  5. Realistic and detailed data analysis
  6. +
+

For instance, there are many features of a frequency response function that can be assessed rapidly understanding some theoretical basis. +This could prevent the wasted effort of analyzing incorrect measurements.

+

Then, for the practical side, there are many choices of test methods: harmonic, random, transient excitation. +The experimenter should be aware of the limitations and implications of the various techniques used in the measurement phases.

+

Next, we consider the analysis stage where the measured data (Frequency Response Functions or FRF) are subjected to a range of curve-fitting procedures in an attempt to find the mathematical model which provides the closest description of the actually-observed behavior. +There are many approached, and one should be aware of the alternatives in order to choose the optimal one.

+

Often, an analysis may be conducted on each measured curve individually. +Then, there is a further step in the process: modeling. +This is the final stage where all the measured and processed data are combined to yield the most compact and efficient mathematical model of the test structure.

+

However, the averaging process is a valid and valuable technique only is provided that the data contain random vibrations. +Data with systematic trends, such as those causes by poor testing practices or non-linearities, should no be averaged in the same way.

+

Summary of Theory

+

It is very important that a clear distinction is made between free vibrations and forced vibration analysis.

+

For the SDOF system, a free vibration analysis yields its natural frequency and damping factor, where a forced response analysis (assuming a harmonic excitation), leads to the definition of the frequency response function. +These two types of results are referred to as modal properties and frequency response characteristics.

+

Next, we consider the more general class of systems which have more than one degree-of-freedom. +For these, it is customary that the spatial properties (the values of the mass, stiffness, and damper elements) be expressed as matrices. +Those used are the mass matrix \(M\), the stiffness matrix \(K\), the viscous damping matrix \(C\) and the structural or hysteretic damping matrix \(D\).

+

There are three phases in the vibration analysis of such systems:

+
    +
  1. +

    Setting up the governing equations of motion, which means determining the elements of the above matrices

    +
  2. +
  3. +

    Free vibration analysis using the equations of motion. +This analysis produces first a set of \(N\) natural frequencies and damping factors, and secondly a matching set of \(N\) “mode shape” vectors, each one of these being associated with a specific natural frequency and damping factor. +The complete free vibration solution is conveniently contained in two matrices \(h^2\) and \(\phi\), which are again referred to as “modal properties”, or sometimes, as the eigenvalue and eigenvector matrices. +One element from the diagonal eigenvalue matrix \(\lambda_r^2\) contains both the natural frequency and the damping factor for the \(r^{\text{th}}\) normal mode of vibration of the system while the corresponding column \(\phi_r\) describes the shape of that same mode of vibration

    +
  4. +
  5. +

    Forced response analysis, and in particular harmonic excitation. +By solving the equations of motion when harmonic forcing is applied, we are able to describe the complete solution by a single matrix, known as the frequency response matrix \(H(\omega)\). +Thus, element \(H_{jk}(\omega)\) represents the harmonic response, \(X_j\) in one of the DOF \(j\) caused by a single harmonic force \(F_k\) applied in the DOF \(k\). +The particular relevance of these specific response characteristics is the fact that they are the quantities which are the most likely to be able to measure in practice. +However, the same expressions can be drastically simplified if we use the modal properties instead of the spatial properties and it is possible to write an expressing for any FRF, \(H_{jk}(\omega)\), which has the general form

    +

    \begin{equation*} +H_{jk}(\omega) = \frac{X_j}{F_k} = \sum_{r=1}^{N}\frac{{}_rA_{jk}}{\lambda_r^2 - \omega^2} \label{eq:frf_modal} +\end{equation*}

    +

    where \(\lambda_r^2\) is the eigenvalue of the \(r^{\text{th}}\) mode, \({}_rA_{jk}\) (the modal constant) is constructed from \(\phi_{jk}\) which is the \(j^{\text{th}}\) element of the \(r^{\text{th}}\) eigenvector \(\phi_r\) and \(N\) is the number of degrees-of-freedom (or modes). +This expression forms the foundation of modal analysis: it shows a direct connection between the modal properties of a system and its response characteristics.

    +
  6. +
+

Thus, we find that by making a thorough study of the theory of structural vibration, we are able to “predict” what we might expect to find if we make FRF measurements on actual hardware. +Indeed, we shall see later how these predictions can be quite detailed, to the point where it is possible to comment on the likely quality of measured data.

+

Summary of measurement methods

+

The main measurement technique studied are those which will permit to make direct measurements of the various FRF properties of the test structure.

+

The type of test best suited to FRF measurement is shown in figure fig:modal_analysis_schematic.

+

+
+ Figure 1: Basic components of FRF measurement system
+

Figure 1: Basic components of FRF measurement system

+
+
+ +

Essentially, there are three aspect of the measurement process which demand particular attention in order to ensure the acquisition of the high-quality data which are required for the next stage (data analysis). These are:

+
    +
  1. The mechanical aspect of supporting and correctly exciting the structure
  2. +
  3. The correct transduction of the quantities to be measured (force input and motion response)
  4. +
  5. The signal processing which is appropriate to the type of test used
  6. +
+
Mechanical Aspect
+

We here encounter questions as how the testpiece should be suspended, or supported and how it should be excited. +Usually, one of three options is chosen for the support:

+
    +
  • Free or unrestrained: usually means suspended on very soft springs, this has the advantage that free boundaries are easy to simulate
  • +
  • Grounded: requires rigid clamping at certain points
  • +
  • In situ: the testpiece is connected to some structure representing a non-rigid attachment
  • +
+

The mechanics of the excitation are achieve either by connection a vibration generator or shaker, or by using some form of transient input, such as a hammer blow or sudden release from a deformed position. +Both approaches have advantages and disadvantages and it can be very important to choose the best one in each case.

+
Transducers
+

Transducers are very important elements in the system as it is essential that accurate measurements be made of both the input to the structure and of its response. +Nowadays, piezoelectric transducers are widely used to detect both force and acceleration and the major problems associated with them are to ensure that they interfere as little as possible with the test structure and that their performance is adequate for the ranges of frequency and amplitude of the test.

+
Signal Processing
+

The FRF parameters to be measured can be obtained directly by applying an harmonic excitation and then measuring the resulting harmonic response. +This type of test is often referred to as sinewave testing and it requires the attachment of a shaker to the structure. +The frequency range is covered by sweeping the frequency continuously or by step.

+

Alternative excitation procedures are now widely used. +Transient (including burst signals) periodic, pseudo-random or random excitation signals often replace the signal wave approach and are made practical by the existence of complex signal processing analyser which are capable of resolving the frequency content of both input and response signals using Fourier analysis.

+

In modal testing applications of vibrations measurements, accuracy of the measured data is of paramount importance. +This is so because this data are generally to be submitted to a range of analysis procedures, in order to extract the results. +Some of these analysis processes are themselves quite complex and can seldom be regarded as insensitive to the accuracy of the input data.

+

Summary of Modal Analysis Processes

+

The third skill required for modal testing is concerned with the analysis of the measured FRF data. +This is quite separate from the signals processing which may be necessary to convert raw measurements into frequency response.

+

It is a procedure whereby the measured mobilities are analyzed in such a way as to find a theoretical model which most closely resembles the behavior of the actual testpiece. +This process itself falls into two stages:

+
    +
  1. Identify the appropriate type of model
  2. +
  3. Determine the appropriate parameters of the chosen model
  4. +
+

Most of the effort goes into this second stage, which is widely referred to as “modal parameter extraction”, or simply as “modal analysis”.

+

We have seen that we can predict the form of the FRF plots for a multi degree-of-freedom system, and that these are directly related to the modal properties of that system. +The great majority of the modal analysis effort involves curve-fitting an expression such as equation eq:frf_modal to the measured FRF and thereby finding the appropriate modal parameters.

+

A completely general curve-fitting approach is possible but generally inefficient. +Mathematically, we can take an equation of the form +\[ H(\omega) = \sum_{r=1}^N \frac{A_r}{\lambda_r^2 - \omega^2} \] +and curve fit a set of measured values \(H_m(\omega_1), H_m(\omega_2), \dots\) to this expression so that we obtain estimates for the coefficients \(A_1, A_2, \dots, \lambda_1^2, \lambda_2^2, \dots\). +These coefficients are closely related to the modal properties of the system. +However, although such approaches are made, they are inefficient and neither exploit the particular properties of resonant systems nor take due account of the unequal quality of the various measured points in the data set, both of which can have a significant influence on the overall analysis process. +Thus there is no single modal analysis method, but rater a selection, each being the most appropriate in differing conditions.

+

One of the most widespread and useful approaches is known as the single-degree-of-freedom curve-fit, or often as the circle fit procedure. +This method uses the fact that at frequencies close to a natural frequency, the FRF can often be approximated to that of a single degree-of-freedom system plus a constant offset term (which approximately accounts for the existence of other modes). +This assumption allows us to use the circular nature of a modulus/phase polar plot of the frequency response function of a SDOF system (see figure fig:sdof_modulus_phase). +This process can be repeated for each resonance individually until the whole curve has been analyzed. +At this stage, a theoretical regeneration of the FRF is possible using the set of coefficients extracted.

+

+
+ Figure 2: Curve fit to resonant FRF data
+

Figure 2: Curve fit to resonant FRF data

+
+
+ +

These simple methods can be used for many of the cases encountered in practice but they become inadequate and inaccurate when the structure has mode which are close. +Under these conditions, it becomes necessary to use a more complex process which accepts the simultaneous influence of more than one mode. +These methods are referred to as MDOF curve-fits and are naturally more complicated and require more computation effort but, provided the data are accurate, they have the capability of producing more accurate estimates for the modal properties.

+

Some of more detailed considerations include: compensating for slightly non-linear behavior, simultaneously analyzing more than one FRF and curve-fitting to actual time histories.

+

Review of Test Procedures and Levels

+

The overall objective of the test is to determine a set of modal properties for a structure. +These consist of natural frequencies, damping factors and mode shapes. +The procedure consists of three steps:

+
    +
  1. Measure an appropriate set of mobilities, or FRF
  2. +
  3. Analyze these using appropriate curve-fitting procedures
  4. +
  5. Combine the results of the curve-fits to construct the required model
  6. +
+

Using our knowledge of the theoretical relationship between FRF functions and modal properties, it is possible to show that an “appropriate” set of FRFs to measure consists in most cases of just one row or one column in the FRF matrix \(H(\omega)\). +In practice this either means exciting the structure at one point and measuring responses at all points or measuring the response at one point while the excitation is applied separately at each point in turn. +This last option is most conveniently achieve using a hammer.

+

Even though the same overall procedure is always followed, there will be a different level of detail required for each different application.

+

Theoretical Basis

+

Introduction

+

Theoretical foundations of modal testing are of paramount importance to its successful implementation.

+

The three phases through a typical theoretical vibration analysis progresses are shown on figure fig:vibration_analysis_procedure. +Generally, we start with a description of the structure’s physical characteristics (mass, stiffness and damping properties), this is referred to as the Spatial model.

+

+
+ Figure 3: Theoretical route to vibration analysis
+

Figure 3: Theoretical route to vibration analysis

+
+
+ +

Then, it is customary to perform a theoretical modal analysis of the spatial model which leads to a description of the structure’s behavior as a set of vibration modes: the modal model.

+
+
+

This model is defined a set of natural frequencies with corresponding modal damping factors and vibration mode shapes. +This solution describes the various ways in which the structure is capable of vibrating naturally (without any external forces or excitations), and so these are called the natural or normal modes of the structure.

+
+

The third stage is generally that in which we have the greatest interest; namely, the analysis of exactly how the structure will respond under given excitation conditions. +It is convenient to present an analysis of the structure’s response to a “standard” excitation (from which the solution for any particular case can be constructed) and to describe this as the response model. +The standard excitation chosen is a unit-amplitude sinusoidal force applied to each point on the structure individually, and at every frequency within a specified range. +Thus our response model will consist of a set of frequency response functions.

+
+
+

As indicated in figure fig:vibration_analysis_procedure, it is also possible to do an analysis in the reverse directly: from a description of the response properties (FRFs), we can deduce modal properties and the spatial properties: this is the experimental route to vibration analysis.

+
+

Single Degree of Freedom System Theory

+

Although very few practical structures could realistically be modeled by a SDOF system, the properties of such a system are very important because those for a more complex MDOF system can always be represented as a linear superposition of a number of SDOF characteristics.

+
+
+

Three classes of system model will be described:

+
    +
  • Undamped
  • +
  • Viscously-damped
  • +
  • Hysteretically (or structurally) damped
  • +
+
+

The basic model for the SDOF system is shown in figure fig:sdof_model where \(f(t)\) and \(x(t)\) are general time-varying force and displacement response quantities. +The spatial model consists of a mass \(m\), a spring \(k\) and (when damped) either a viscous dashpot \(c\) or hysteretic damper \(d\).

+

+
+ Figure 4: Single degree-of-freedom system
+

Figure 4: Single degree-of-freedom system

+
+
+ +

Undamped Systems

+

The governing equation of motion is

+

\begin{equation} +m \ddot{x} + k = 0 +\end{equation}

+

The trial solution \(x(t) = X e^{i\omega t}\) leads to +\[ k - m \omega^2 = 0 \]

+

Hence the modal model consists of a single solution (mode of vibration) with a natural frequency +\[ \omega_0 = \sqrt{k/m} \]

+

Turning next to a frequency response analysis, we consider an excitation of the form +\[ f(t) = F e^{i\omega t} \] +and assume a solution of the form +\[ x(t) = X e^{i\omega t} \] +where \(F\) and \(X\) are complex. +Now the equation of motion is

+

\begin{equation} +(k - m \omega^2) X e^{i\omega t} = F e^{i\omega t} +\end{equation}

+

from which we extract the required response model in the form of a frequency response function.

+
+
+

\begin{equation} +\alpha(\omega) = \frac{X}{F} = \frac{1}{x - \omega^2 m} \label{eq:receptance} +\end{equation}

+
+

This particular form of FRF, where the response parameter is displacement (as opposed to velocity of acceleration) is called a receptance.

+

Viscous Damping

+

If we add a viscous dashpot \(c\), the equation of motion becomes

+

\begin{equation} +m \ddot{x} + c \dot{x} + k x = 0 +\end{equation}

+

and we must now use a more general trial solution +\[ x(t) = X e^{st} \] +where \(s\) is complex. +We obtain the condition +\[ ms^2 + cs + k = 0 \] +which leads to

+

\begin{align} +s_{1, 2} &= -\frac{c}{2 m} \pm \frac{\sqrt{c^2 - 4 k m}}{2 m} \\\
+&= - \bar{\omega}_0 \xi \pm i \bar{\omega}_0 \sqrt{1 - \xi^2} \nonumber +\end{align}

+

where +\[ \bar{\omega}_0^2 = \frac{k}{m};\quad \xi = \frac{c}{c_0} = \frac{c}{2 \sqrt{km}} \]

+

This implies a modal solution of the form +\[ x(t) = X e^{-\bar{\omega}_0 \xi t} e^{i (\bar{\omega}_0 \sqrt{1 - \xi^2})t} = X e^{-a t} e^{i \omega_0^\prime t} \] +which is a single mode of vibration with a complex natural frequency having two part:

+
    +
  • An imaginary or oscillatory part
  • +
  • A real or decay part
  • +
+

The physical significance of these two parts is illustrated in the typical free response plot shown in figure fig:sdof_response

+

+
+ Figure 5: Oscillatory and decay part
+

Figure 5: Oscillatory and decay part

+
+
+ +

Lastly, we consider the forced response when \(f(t) = F e^{i\omega t}\) and, as before, we assume \(x(t) = Xe^{i\omega t}\): +\[ \left( -\omega^2 m + i \omega c + k \right) X e^{i\omega t} = F e^{i \omega t} \] +gives a receptance FRF of the form

+
+
+

\begin{equation} +\alpha(\omega) = \frac{1}{(k - \omega^2 m) + i \omega c} +\end{equation}

+

which is now complex, containing both magnitude and phase information:

+

\begin{subequations} +\begin{align} +\frac{|X|}{|F|} &= \frac{1}{\sqrt{(k - \omega^2 m)^2 + (\omega c)^2}} \\\
+\angle{X} - \angle{F} &= \text{tg}^{-1} \left( \frac{\omega c}{k - \omega^2 m} \right) +\end{align} +\end{subequations}

+
+

Structural Damping

+

All structures exhibit a degree of damping due to the hysteresis properties of the material(s) from which they are made.

+

A typical example of this effect is shown in the force displacement plot in figure fig:material_histeresis in which the area contained by the loop represents the energy lost in one cycle of vibration between the extremities shown. +The maximum energy stored corresponds to the elastic energy of the structure at the point of maximum deflection. +The damping effect of such a component can conveniently be defined by the ratio of these two: +\[ \tcmbox{\text{damping capacity} = \frac{\text{energy lost per cycle}}{\text{maximum energy stored}}} \]

+

+
+ Table 1: + Force-deflection characteristics +
+ + + + + + + + + + + + + + + + + + + + +
Material hysteresis Dry friction Viscous damper
height=2cmheight=2cmheight=2cm
+

Another common source of energy dissipation in practical structures, is the friction which exist in joints between components of the structure. +It may be described very roughly by the simple dry friction model shown in figure fig:dry_friction.

+

The mathematical model of the viscous damper which we have used can be compared with these more physical effects by plotting the corresponding force-displacement diagram for it, and this is shown in figure fig:viscous_damper. +Because the relationship is linear between force and velocity, it is necessary to suppose harmonic motion, at frequency \(\omega\), in order to construct a force-displacement diagram. +The resulting diagram shows the nature of the approximation provided by the viscous damper model and the concept of the effective or equivalent viscous damping coefficient for any of the actual phenomena as being which provides the same energy loss per cycle as the real thing.

+
+
+

The problem which arises with the viscous damping model is that it has a frequency-dependence in the amount of energy loss per cycle whereas the dry friction mechanism is clearly unaffected by the frequency of loading and experiments suggests that the hysteresis effect is similarly independent of frequency. +Thus, we find a problem in obtaining a single equivalent viscous dashpot model which will be valid over a range of frequencies, such as will be necessary to represent the damping of a MDOF system over all, or at least several, of its modes of vibration.

+
+

An alternative theoretical damping model is provided by the hysteretic or structural damper which not only has the advantage that the energy lost per cycle is independent of the frequency, but also provides a much simpler analysis for MDOF systems. +However, it presents difficulties to a rigorous free vibration analysis and its application is generally focused on the forced response analysis. +In this case, we can write an equation of motion: +\[ (-\omega^2 m + k + i d) X e^{i\omega t} = F e^{i \omega t} \]

+
+
+

\begin{equation} +\alpha(\omega) = \frac{1/k}{1 - \left(\omega/\bar{\omega}_0\right)^2 + i \eta} +\end{equation}

+

where \(\eta\) is the structural damping loss factor and replaces the critical damping ratio used for the viscous damping model.

+
+

Presentation and Properties of FRF data for SDOF system

+

Alternative Forms of FRF

+

So far we have defined our receptance frequency response function \(\alpha(\omega)\) as the ratio between a harmonic displacement response and the harmonic force eq:receptance. +This ratio is complex: we can look at its amplitude ratio \(|\alpha(\omega)|\) and its phase angle \(\theta_\alpha(\omega)\).

+

We could have selected the response velocity \(v(t)\) as the output quantity and defined an alternative frequency response function eq:mobility. +Similarly we could use the acceleration parameter so we could define a third FRF parameter eq:inertance.

+
+
+

\begin{equation} +\text{mobility} = Y(\omega) = \frac{V}{F} = i \omega \alpha(\omega) \label{eq:mobility} +\end{equation}

+
+
+
+

\begin{equation} +\text{inertance} = A(\omega) = \frac{A}{F} = - \omega^2 \alpha(\omega) \label{eq:inertance} +\end{equation}

+
+

Table tab:frf_alternatives gives details of all six of the FRF parameters and of the names used for them.

+

Inverse response can also be defined. For instance, the dynamic stiffness is defined as the force over the displacement.

+
+
+

\begin{equation} +\frac{\text{force}}{\text{displacement}} = (k - \omega^2 m) + (i \omega c) \label{eq:dynamic_stiffness} +\end{equation}

+
+

It should be noted that that the use of displacement as the response is greatly encouraged as the other options can lead to confusion when used in MDOF system.

+

+
+ Table 2: + Definition of Frequency Response Functions +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Standard FRFInverse FRF: FIR
Disp.ReceptanceDynamic Stiffness
Admittance
Dynamic compliance
Dynamic flexibility
Vel.MobilityMechanical Impedance
Acc.AcceleranceApparent Mass
Inertance
+

Graphical Displays of FRF Data

+

FRF data are complex and thus there are three quantities (frequency and two parts of the complex function) to display. +Any simple plot can only show two of the three quantities and so there are different possibilities available for the presentation of such data:

+
    +
  1. Modulus of FRF vs Frequency and Phase of FRF vs Frequency: the Bode plot
  2. +
  3. Real Part of FRF vs Frequency and Imaginary Part of FRF vs Frequency
  4. +
  5. Real Part of reciprocal FRF vs Frequency and Imaginary part of reciprocal FRF vs Frequency
  6. +
  7. Real part of FRF vs Imaginary part of FRF: the Nyquist plot
  8. +
+
Bode Plot
+

Bode plot are usually displayed using logarithmic scales as shown on figure fig:bode_plots.

+

+
+ Table 3: + FRF plots for undamped SDOF system +
+ + + + + + + + + + + + + + + + + + + + +
Receptance FRF Mobility FRF Accelerance FRF
width=\linewidthwidth=\linewidthwidth=\linewidth
+

Each plot can be divided into three regimes:

+
    +
  • a low frequency straight line characteristic
  • +
  • a high frequency straight line characteristic
  • +
  • the resonant region with its abrupt magnitude and phase variations
  • +
+
Real part and Imaginary part of FRF
+

Real and imaginary part of a receptance FRF of a damped SDOF system is shown on figure fig:plot_receptance_real_imag. +This type of display is not widely used as we cannot use logarithmic axes (as we have to show positive and negative values).

+

+
+ Table 4: + Plot of real and imaginary part for the receptance of a damped SDOF +
+ + + + + + + + + + + + + + + + + +
Real part Imaginary part
width=\linewidthwidth=\linewidth
+
Real part and Imaginary part of reciprocal FRF
+

It can be seen from the expression of the inverse receptance eq:dynamic_stiffness that the Real part depends entirely on the mass and stiffness properties while the Imaginary part is a only function of the damping.

+

Figure fig:inverse_frf_mixed shows an example of a plot of a system with a combination of both viscous and structural damping. The imaginary part is a straight line whose slope is given by the viscous damping rate \(c\) and whose intercept at \(\omega = 0\) is provided by the structural damping coefficient \(d\).

+

+
+ Table 5: + Inverse FRF plot for the system +
+ + + + + + + + + + + + + + + + + +
Mixed Viscous
width=\linewidthwidth=\linewidth
+
Real part vs Imaginary part of FRF
+

Figure fig:nyquist_receptance shows Nyquist type FRF plots of a viscously damped SDOF system. +The missing information (in this case, the frequency) must be added by identifying the values of frequency corresponding to particular points on the curve.

+

+
+ Table 6: + Nyquist FRF plots of the mobility for a SDOF system +
+ + + + + + + + + + + + + + + + + +
Viscous damping Structural damping
width=\linewidthwidth=\linewidth
+

The Nyquist plot has the particularity of distorting the plot so as to focus on the resonance area. +This makes the Nyquist plot very effective for modal testing applications.

+

Undamped MDOF Systems

+

Free Vibration Solution - The modal Properties

+

For an undamped MDOF system, with \(N\) degrees of freedom, the governing equations of motion can be written in matrix form eq:undamped_mdof.

+
+
+

\begin{equation} +[M] \{\ddot{x}(t)\} + [K] \{x(t)\} = \{f(t)\} \label{eq:undamped_mdof} +\end{equation}

+

where \([M]\) and \([K]\) are \(N\times N\) mass and stiffness matrices, and \(\{x(t)\}\) and \(\{f(t)\}\) are \(N\times 1\) vectors of time-varying displacements and forces.

+
+

We shall consider first the free vibration solution by taking \(f(t) = 0\). +In this case, we assume that a solution exists of the form \(\{x(t)\} = \{X\} e^{i \omega t}\) where \(\{X\}\) is an \(N \times 1\) vector of time-independent amplitudes. +Substitution of this condition into eq:undamped_mdof leads to

+

\begin{equation} +\left( [K] - \omega^2 [M] \right) \{X\} e^{i\omega t} = \{0\} +\end{equation}

+

for which the non trivial solutions are those which satisfy +\[ \det \left| [K] - \omega^2 [M] \right| = 0 \] +from which we can find \(N\) values of \(\omega^2\) corresponding to the undamped system’s natural frequencies.

+

Substituting any of these back into eq:free_eom_mdof yields a corresponding set of relative values for \(\{X\}\): \(\{\psi\}_r\) the so-called mode shape corresponding to that natural frequency.

+
+
+

The complete solution can be expressed in two \(N \times N\) eigen matrices.

+

\[ \begin{bmatrix} +\omega_1^2 & & 0 \\\
+& \ddots & \\\
+0 & & \omega_n^2 +\end{bmatrix}; \quad \Psi = \begin{bmatrix} +& & \\\
+\{\psi_1\} & \dots & \{\psi_n\} \\\
+& & +\end{bmatrix} \]

+

where \(\bar{\omega}_r^2\) is the \(r^\text{th}\) eigenvalue squared and \(\{\psi\}_r\) is a description of the corresponding mode shape

+
+

Various numerical procedures are available which take the system matrices \([M]\) and \([K]\) (the Spatial Model), and convert them to the two eigen matrices \([\bar{\omega}_r^2]\) and \([\Psi]\) which constitute the Modal Model.

+

It is important to realize that whereas the eigenvalue matrix is unique, the eigenvector matrix is not. +Indeed, the natural frequencies are fixed quantities, and the mode shapes are subject to an indeterminate scaling factor.

+

Orthogonality Properties

+
+
+

The modal model possesses some very important properties known as the orthogonality properties:

+

\begin{subequations} +\begin{align} +[\Psi]^T[M][\Psi] &= [m_r]\\\
+[\Psi]^T[K][\Psi] &= [k_r] +\end{align} +\end{subequations}

+

from which \([\bar{\omega}_r^2] = [m_r]^{-1} [k_r]\) where \(m_r\) and \(k_r\) are often referred to as the modal mass and modal stiffness of mode \(r\).

+
+

Now, because the eigenvector matrix is subject to an arbitrary scaling factor, the values of \(m_r\) and \(k_r\) are not unique.

+

Among the many scaling or normalization processes, the mass-normalization has the most relevance.

+
+
+

The mass-mormalized eigenvectors are written as \([\Phi]\) and have the particular property that

+

\begin{subequations} +\begin{align} +[\Phi]^T[M][\Phi] &= [I]\\\
+[\Phi]^T[K][\Phi] &= [\bar{\omega}_r^2] +\end{align} +\end{subequations}

+
+

The relationship between the mass-normalized mode shape for mode \(r\) \(\{\Phi\}_r\) and its more general form \(\{\Psi\}_r\) is simply

+

\begin{equation} +\{\Phi\}_r = \frac{1}{\sqrt{m_r}} \{\Psi\}_r +\end{equation}

+ +

The modal mass is based on the mode shape vector for mode \(r\) and the system mass matrix. +As mentioned, there is no unique value for the modal mass as it is directly related to the scaling method which has been used to determine the mode shape eigenvector \(\{\Psi\}_r\). +However, the ratio between any modal stiffness and its associated modal mass is unique and is equal to the corresponding eigenvalue. +The modal mass is generally used to convert the original mode shape vector \(\{\Psi\}_r\) to the more useful mass-normalized mode shape vector \(\{\Phi\}_r\).

+
+
+

Using the mass-normalized mode shape vectors, we can see how to derive quantities which provide us with information about the effective mass (or stiffness) at any point on the structure (any DOF \(j\)). +The effective mass at DOF \(j\) for mode \(r\) is define as +\[ (m_{jj})_r = \frac{1}{(\phi_{jr})^2}, \text{ which as units of mass} \] +and the effective stiffness at DOF \(j\) for mode \(r\) +\[ (k_{jj})_r = \frac{\bar{\omega}_r^2}{(\phi_{jr}^2)} \]

+
+

It can be seen that since the mass-normalized eigenvectors are unique, these effective mass and stiffness properties are also unique and represent a useful description of the behavior of the structure point by point, and mode by mode.

+
+
+

The other quantities which are sometimes referred to as unique properties of each mode are the generalized mass and generalized stiffness. +The generalized mass (or stiffness) of the \(r^{\text{th}}\) mode is defined as the effective mass (or stiffness) at the DOF with the largest amplitude of response. +This quantity serves to provide a comparison of the relative strength of each mode of the structure.

+
+

Repeated Roots or Multiple Modes

+

There are situations where two (or more) different modes will have the same natural frequency. +This occurs frequently in structures which exhibit a degree of symmetry (especially axi-symmetry). +In these cases, there is no guarantee that the corresponding eigenvectors are orthogonal. +However, linear combinations of these vectors can always be found such that orthogonality is observed between the mode shapes. +It should be noted, that free vibration at that frequency is possible not only in each of the two vectors thus defined, but also in a deformation pattern which is given by any linear combination of these two vectors.

+

Force Response Solution - The FRF Characteristics

+

Let’s consider the case where the structure is excited sinusoidally by a set of forces all at the same frequency \(\omega\), but with individual amplitudes and phases: \(\{f(t)\} = \{F\} e^{i\omega t}\).

+

Assuming solutions of the form \(\{x(t)\} = \{X\} e^{i \omega t}\), equation of motion then becomes +\[ \left( [K] - \omega^2 [M] \right) \{X\}e^{i\omega t} = \{F\}e^{i\omega t} \] +That can be written in the following form: +\[ \{X\} = \left( [K] - \omega^2 [M] \right)^{-1} \{F\} \]

+
+
+

We define the \(N \times N\) receptance FRF matrix as +\[ [\alpha(\omega)] = \left( [K] - \omega^2 [M] \right)^{-1} \]

+

It constitutes the Response Model of the system.

+

The general element in the receptance FRF matrix \(\alpha_{jk}(\omega)\) is defined as follows +\[ \alpha_{jk}(\omega) = \frac{X_j}{F_k}, \quad F_m = 0, m = 1 \dots N \neq k \]

+
+

It is possible to determine values for the elements of \([\alpha(\omega)]\) at any frequency of interest by computing the inverse system matrix \([K] - \omega^2[M]\) at each frequency. +This has several disadvantages:

+
    +
  • it becomes costly for large-order systems
  • +
  • it is inefficient if only a few of the individual FRF are required
  • +
  • it provides no insight into the form of the various FRF properties
  • +
+

An alternative means of deriving the FRF parameters is used which makes use of the modal properties instead of the spatial properties. +\[ [K] - \omega^2 [M] = [\alpha(\omega)]^{-1} \] +Pre-multiply both sides by \([\Phi]^T\) and post-multiply both sides by \([\Phi]\) to obtain +\[ [\Phi]^T ([K] - \omega^2 [M]) [\Phi] = [\Phi]^T [\alpha(\omega)]^{-1} [\Phi] \] +which leads to eq:receptance_modal.

+
+
+

\begin{equation} +[\alpha(\omega)] = [\Phi] \left[ \bar{\omega}_r^2 - \omega^2 \right]^{-1} [\Phi]^T \label{eq:receptance_modal} +\end{equation}

+

Equation eq:receptance_modal permits us to compute any individual FRF parameters \(\alpha_{jk}(\omega)\) using the following formula

+

\begin{subequations} +\begin{align} +\alpha_{jk}(\omega) &= \sum_{r=1}^N \frac{\phi_{jr} \phi_{kr}}{\bar{\omega}_r^2 - \omega^2}\\\
+&= \sum_{r=1}^N \frac{\psi_{jr} \psi_{kr}}{m_r (\bar{\omega}_r^2 - \omega^2)}\\\
+&= \sum_{r=1}^N \frac{{}_rA_{jk}}{\bar{\omega}_r^2 - \omega^2} +\end{align} +\end{subequations}

+

where \({}_rA_{jk}\) is called the modal constant.

+
+
+
+

It is clear from equation eq:receptance_modal that the receptance matrix \([\alpha(\omega)]\) is symmetric and this will be recognized as the principle of reciprocity.

+

This principle of reciprocity applies to many structural characteristics.

+

Its implications in this situation are that

+

\begin{equation} +\alpha_{jk} = X_j/F_k = \alpha_{kj} = X_k/F_j \label{eq:principle_reciprocity} +\end{equation}

+
+

MDOF Systems with Proportional Damping

+

General Concept and Features of Proportional Damping

+

The modes of a structure with proportional damping are almost identical to those of the undamped version of the model. +Specifically, the mode shapes are identical and the natural frequencies are very similar.

+

The equations of motion for an MDOF system with viscous damping is

+

\begin{equation} +[M]\{\ddot{x}\} + [C]\{\dot{x}\} + [K]\{x\} = \{f\} +\end{equation}

+

Let’s first study the special case where the damping matrix is directly proportional to the stiffness matrix: +\[ [C] = \beta [K] \] +In this case, we have that +\[ [\Psi]^T [C] [\Psi] = \beta [k_r] = [c_r] \] +where the diagonal elements \(c_{jj}\) represent the modal damping of the various modes of the system. +The fact that this matrix is also diagonal means that the undamped system mode shapes are also those of the damped system, and this is a particular feature of this type of damping.

+

For the forced response analysis, we obtain +\[ [\alpha(\omega)] = [ K + i \omega C - \omega^2 M ]^{-1} \] +or

+

\begin{equation} +\alpha_{jk}(\omega) = \sum_{r=1}^N \frac{\psi_{jr}\psi_{kr}}{(k_r - \omega^2 m_r) + i \omega c_r} +\end{equation}

+

General Forms of Proportional Damping

+

If the damping matrix is proportional to the mass matrix, exactly the same type of result is obtained. +A usual definition of proportional damping is that the damping matrix \([C]\) should be of the form

+

\begin{equation} +\tcmbox{[C] = \beta [K] + \gamma [M]} +\end{equation}

+

In this case, the damped system will have eigenvalues and eigenvectors as follows

+

\begin{align*} +&\omega_r^\prime = \bar{\omega}_r \sqrt{1 - \xi_r^2} ; \quad \xi_r = \frac{\beta \bar{\omega}_r}{2} + \frac{\gamma}{2 \bar{\omega}_r}\\\
+&[\Psi_\text{damped}] = [\Psi_\text{undamped}] +\end{align*}

+

Distributions of damping of this type are sometimes, tough not always, found to be plausible from a practical standpoint. +The actual damping mechanisms are usually to be found in parallel with stiffness elements (for internal material of hysteresis damping) or with mass elements (for friction damping).

+

Identical treatment can be made of an MDOF system with proportional hysteretic damping. +If the general system equations of motion are expressed as +\[ [M]\{\ddot{x}\} + [K + iD]\{x\} = \{f\} \] +and the hysteretic damping matrix \([D]\) has the form

+

\begin{equation} +[D] = \beta [K] + \gamma [M] +\end{equation}

+

then, we find that the mode shapes for the damped system are again identical to those of the undamped system and that the eigenvalues take the complex form: +\[ \lambda_r^2 = \bar{\omega}_r^2 (1 + i \eta_r); \quad \bar{\omega}_r^2 = \frac{k_r}{m_r}; \quad \eta_r = \beta + \frac{\gamma}{\bar{\omega}_r^2} \] +and the general FRF is written as

+

\begin{equation} +\alpha_{jk}(\omega) = \sum_{r=1}^N \frac{\psi_{jr}\psi_{kr}}{(k_r - \omega^2 m_r) + i \eta_r k_r} +\end{equation}

+

MDOF Systems with Structural (Hysteretic) Damping

+

Free Vibration Solution - Complex Modal Properties

+

We start by writing the general equation of motion for an MDOF system with hysteretic damping and harmonic excitation: +\[ [M] \{\ddot{x}\} + [K]\{x\} +i[D]\{x\} = \{F\}e^{i\omega t} \]

+

We consider first the case where there is no excitation and assume a solution of the form +\[ \{x\} = \{X\} e^{i \lambda t} \] +where \(\lambda\) is complex.

+

We then obtain complex eigenvalues and eigenvectors.

+

We choose to write the \(r^\text{th}\) eigenvalue as +\[ \lambda_r^2 = \omega_r^2(1 + i \eta_r) \] +where \(\omega_r\) is the natural frequency and \(\eta_r\) is the damping loss factor for that mode. +The natural frequency \(\omega_r\) is not necessarily equal to the natural frequency of the undamped system \(\bar{\omega}_r\) although they are very close in practice.

+

The eigensolution can be seen to possess the same type of orthogonality properties as those demonstrated earlier for the undamped system: +\[ [\Psi]^T[M][\Psi] = [m_r] ; \quad [\Psi]^T[K + iD][\Psi] = [k_r] \]

+

The modal mass and stiffness parameters are now complex but still obey the relationship +\[ \lambda_r^2 = \frac{k_r}{m_r} \] +and we define the mass-normalized eigenvectors +\[ \{\phi\}_r = \frac{1}{\sqrt{m_r}} \{\psi\}_r \]

+

Forced Response Solution - FRF Characteristics

+

For the forced vibration analysis in the case of harmonic excitation and response, we obtain

+

\begin{equation} +\{X\} = \left( [K] + i[D] - \omega^2[M] \right)^{-1} \{F\} +\end{equation}

+

By multiplying both sides of the equation by the eigenvectors, we can write

+

\begin{equation} +[\alpha(\omega)] = [\Phi] [\lambda_r^2 - \omega^2]^{-1} [\Phi]^T +\end{equation}

+

From this full matrix equation, we have:

+

\begin{align*} +\alpha_{jk}(\omega) &= \sum_{r=1}^N \frac{\phi_{jr} \phi_{kr}}{\omega_r^2 - \omega^2 + i \eta_r \omega_r^2}\\\
+&= \sum_{r=1}^N \frac{\psi_{jr} \psi_{kr}}{m_r\left(\omega_r^2 - \omega^2 + i \eta_r \omega_r^2\right)}\\\
+&= \sum_{r=1}^N \frac{{}_rA_{jk}}{\omega_r^2 - \omega^2 + i \eta_r \omega_r^2}\\\
+\end{align*}

+

Excitation by a general Force Vector

+
Operating deflection shape (ODS)
+

Having derived an expression for the general term in the frequency response function matrix \(\alpha_{jk}(\omega)\), it is appropriate to consider next the analysis of a situation where the system is excited simultaneously at several points.

+

The general behavior for this case is governed by equation eq:force_response_eom with solution eq:force_response_eom_solution. +However, a more explicit form of the solution is

+

\begin{equation} +\{X\} = \sum_{r=1}^N \frac{\{\phi\}_r^T \{F\} \{\phi\}_r}{\omega_r^2 - \omega^2 + i \eta_r \omega_r^2} +\end{equation}

+

This equation permits the calculation of one or more individual responses to an excitation of several simultaneous harmonic forces (all of which must have the same frequency but may vary in magnitude and phase). +The resulting vector of responses is sometimes referred to as force vibration mode, or more commonly, as an Operating Deflection Shape (ODS).

+
Pure mode excitation 1 - Damped system normal modes
+

It is possible to choose the vector of individual forces such that the response of the structure is entirely controlled by a single normal mode of the structure.

+
+
+

The normal modes are the characteristic modes of the structure in its actual (damped) state. +While it is possible to talk of the modes “that the structure would have if the damping could be removed”, these are not the “normal” modes of the structures. +The properties of the normal modes of the undamped system are of interest because in most cases of test-analysis comparison, the analytical model will be undamped and so there is a desired to be able to extract the test structures “undamped” modes from the test data in order to do a direct comparison between prediction and measurement.

+
+

We are seeking an excitation vector \(\{F\}\) such that the response \(\{X\}\) consists of a single modal component so that all terms in eq:ods but one is zero. +This can be attained if \(\{F\}\) is chosen such that +\[ \{\phi_r\}^T \{F\}_s = 0, \ r \neq s \]

+
Pure mode excitation 2 - Associated undamped system normal modes
+

We here consider an excitation vector of mono-phased forces. +We basically impose that all forces have the same frequency and phase. +What is of interest in this case it to see that there exist conditions under which it is possible to obtain a similarly mono-phase response.

+

Let the force and response vectors be represented by

+

\begin{align*} +\{f\} &= \{\hat{F}\} e^{i\omega t} \\\
+\{x\} &= \{\hat{X}\} e^{i(\omega t - \theta)} +\end{align*}

+

where both \(\{\hat{F}\}\) and \(\{\hat{X}\}\) are vectors of real quantities. +Substituting these into the equation of motion leads to a complex equation which can be split into real and imaginary parts to give

+

\begin{align*} +\left( (-\omega^2 [M] + [K]) \cos \theta + [D] \sin \theta \right) \{\hat{X}\} &= \{\hat{F}\} \\\
+\left( (-\omega^2 [M] + [K]) \sin \theta - [D] \cos \theta \right) \{\hat{X}\} &= \{0\} +\end{align*}

+

We can show that if we consider that the phase lag between all the forces and all the responses is exactly \(\SI{90}{\degree}\), the equation reduces to +\[ (-\omega^2 [M] + [K])\{\hat{X}\} = 0 \] +which is clearly the equation to be solved to find the undamped system natural frequencies and the mode shapes.

+

Thus we have the important results that it is always possible to find a set of mono-phased forces which will cause a mono-phased set of responses and, moreover, if these two sets are separated by exactly \(\SI{90}{\degree}\), then the frequency at which the system is vibrating is identical to one of its undamped natural frequencies and the displacement shape is the corresponding undamped mode shape.

+

This most important result is the basic for many of the multi-shaker test procedures used to isolate the undamped modes of the structures for comparison with theoretical predictions. +The physics of the technique are quite simple: the force vector is chosen so that it exactly balances all the damping forces.

+
Postscript
+

It is often observed that the analysis for hysteretic damping is less than rigorous when applied to the free vibration situation, as we have done above. +However, it is an admissible model of damping for describing harmonic forced vibration and this is the objective of most of our studies. +Moreover, it is always possible to express each of the receptance expression either as a ratio of two polynomials or as a series of simple terms. +Each of the terms in the series may be identified with one of the modes we have defined in the earlier free vibration analysis for the system. +Thus, whether or not the solution is strictly valid for a free vibration analysis, we can usefully and confidently consider each of the uncoupled terms or modes as being a genuine characteristic of the system. +As will be seen in the next section, the analysis required for the general case of viscous damping, which is more rigorous, is considerably more complicated than that used here which is, in effect, a very simple extension of the undamped case.

+

MDOF systems with Viscous Damping

+

Free vibration solution - Complex modal properties

+

The general equation of motion for an MDOF system with viscous damping is

+

\begin{equation} +[M] \{\ddot{x}\} + [C]\{\dot{x}\} + [K]\{x\} = \{f\} +\end{equation}

+

We first consider the case with no excitation, and consider solutions of the form +\[ \{x\} = \{X\} e^{st} \]

+

Substituting this into the equation of motion gives +\[ \left( s^2 [M] + s[C] + [K] \right) \{X\} = \{0\} \]

+

There are now \(2N\) eigenvalues \(s_r\) (as opposed to \(N\) values of \(\lambda_r^2\) before) but these now occur in complex conjugate pairs. +The eigenvectors also occur as complex conjugates. +The eigensolution can thus be described as +\[ s_r, s_r^*, \quad \{\psi\}_r, \{\psi\}_r^*;\quad r = 1, N \]

+

Each eigenvalue \(s_r\) is expressed in the form +\[ s_r = \omega_r \left( -\xi_r + i\sqrt{1 - \xi_r^2} \right) \] +where \(\omega_r\) is the natural frequency and \(\xi_r\) is the critical damping ratio for that mode.

+

Orthogonality equations can also be derived:

+

\begin{subequations} +\begin{align} +(s_r + s_q) \{\psi\}_q^T [M] \{\psi\}_r + \{\psi\}_q^T [C] \{\psi\}_r &= 0 \\\
+s_r s_q \{\psi\}_q^T [M] \{\psi\}_r - \{\psi\}_q^T [K] \{\psi\}_r &= 0 +\end{align} +\end{subequations}

+

When the modes \(r\) and \(q\) are a complex conjugate pair: +\[ s_r = \omega_r \left( -\xi_r - i\sqrt{1 - \xi_r^2} \right); \quad \{\psi\}_q = \{\psi\}_r^* \]

+

From equations eq:viscous_damping_orthogonality, we can obtain

+

\begin{subequations} +\begin{align} +2 \omega_r \xi_r &= \frac{\{\psi\}_r^H [C] \{\psi\}_r}{\{\psi\}_r^H [M] \{\psi\}_r} = \frac{c_r}{m_r} \\\
+\omega_r^2 &= \frac{\{\psi\}_r^H [K] \{\psi\}_r}{\{\psi\}_r^H [M] \{\psi\}_r} = \frac{k_r}{m_r} +\end{align} +\end{subequations}

+

Forced response solution

+

Assuming a harmonic response \(\{x(t)\} = \{X\} e^{i\omega t}\), we can write the forced response solution directly as +\[ \{X\} = \big( [K] - \omega^2 [M] + i\omega [C] \big)^{-1} \{F\} \] +but this expression is not particularly convenient for numerical applications.

+

We then seek a similar series expansion that was found for the undamped, proportionally-damped and hysteretically damped systems.

+

The obtain result is +\[ \alpha_{jk}(\omega) = \sum_{r=1}^N \frac{({}_rR_{jk}) + i (\omega/\omega_r)({}_rS_{jk})}{\omega_r^2 - \omega^2 + 2 i \omega \omega_r \xi_r} \] +where the coefficients \(R\) and \(S\) are obtained from:

+

\begin{align*} +\{{}_rR_k\} &= 2 \left( \xi_r \text{Re}\{{}_rG_k\} - \text{Im}\{{}_rG_k\} \sqrt{1 - \xi_r^2} \right)\\\
+\{{}_rS_k\} &= 2 \text{Re}\{{}_rG_k\}\\\
+\{{}_rG_k\} &= (\theta_{kr}/a_r) \{\theta\}_r +\end{align*}

+

The main difference with the result obtained with the proportional damping is in the frequency dependence of the numerator in case of viscous damping.

+

Complex Modes

+

Real and Complex modes, stationary and traveling waves

+

We saw that we can obtain complex eigenvalues whose real part represents the decay and imaginary part the oscillatory component. +We can also obtain complex eigenvectors which means that the mode shapes are complex.

+
+
+

A complex mode is one in which each part of the structure has not only its own magnitude of vibration but also its own phase. +As a result, each part of a structure which is vibrating in a complex mode will reach its own maximum deflection at a different instant in the vibration cycle to that of its neighbors.

+
+
+
+

A real mode is one in which the phase angles are all identically \(\SI{0}{\degree}\) or \(\SI{180}{\degree}\) and which there has the property that all parts in the structure do reach their own maxima at the same time. +Equally, in a real mode, all parts of the structure pass through their zero deflection position at the same instant so that there are two moments in each vibration cycle when the structure is completely un-deformed.

+
+

While the real mode has the appearance of a standing wave, the complex mode is better described as exhibiting traveling waves (illustrated on figure fig:real_complex_modes).

+

+
+ Figure 6: Real and complex mode shapes displays
+

Figure 6: Real and complex mode shapes displays

+
+
+ +

Another method of displaying modal complexity is by plotting the elements of the eigenvector on an Argand diagram, such as the ones shown in figure fig:argand_diagram. +Note that the almost-real mode shape does not necessarily have vector elements with near \(\SI{0}{\degree}\) or near \(\SI{180}{\degree}\) phase, what matters are the relative phases between the different elements.

+

+
+ Table 7: + Complex mode shapes plotted on Argand diagrams +
+ + + + + + + + + + + + + + + + + + + + +
Almost-real mode Complex Mode Measure of complexity
width=\linewidthwidth=\linewidthwidth=\linewidth
+

Measurement of modal complexity

+

There exist few indicators of the modal complexity. +The first one, a simple and crude one, called MCF1 consists of summing all the phase differences between every combination of two eigenvector elements: +\[ \text{MCF1} = \sum_{j=1}^N \sum_{k=1 \neq j}^N (\theta_{rj} - \theta_{rk}) \]

+

The second measure is shown on figure fig:argand_diagram_c where a polygon is drawn around the extremities of the individual vectors. +The obtained area of this polygon is then compared with the area of the circle which is based on the length of the largest vector element. The resulting ratio is used as an indication of the complexity of the mode, and is defined as MCF2.

+

Origins of complex modes

+

Complex modes occur in practice for variety of physical reasons as well as poor measurement or analysis:

+
    +
  • The types of modes which are referred to as operating deflection shapes will frequently exhibit the relative phases differences between responses of adjacent parts of the structure which indicate a complex mode.
  • +
  • Complex normal modes can exist even in simple structures which contain rotating components that are prone to gyroscopic forces.
  • +
  • However, normal modes of non-rotating linear structures can be complex only if the damping is distributed in a non-proportional way. +This situation can arise quite readily in practice because while the internal (hysteresis) damping of most structural elements is distributed in a way which is essentially proportional to the stiffness distribution, the majority of the damping in real structures is generally found to be concentrated at the joints between components of a structural assembly and this does not usually result in a proportional distribution.
  • +
  • Another ingredient is found to be necessary to generate significant complexity in a structure’s mode and that is the requirement that two or mode of its modes are close. +Close modes are those whose natural frequencies are separated by an amount which is less than the prevailing damping in either or both modes.
  • +
+

Characteristics of MDOF FRF data

+

A note about natural frequencies

+

The basic definition derives from the undamped system’s eigenvalues which yield the frequencies at which free vibration of the system can take place. +These undamped system natural frequencies are given by the square roots of the eigenvalues and are identified by the symbol \(\bar{\omega}_r\). +This occurs in expressions for both free and forced vibration response: +\[ x(t) = \sum_{r=1}^N x_r e^{i\bar{\omega}_r t}; \quad \alpha(\omega) = \sum_{r=1}^N \frac{A_r}{\bar{\omega}_r^2 - \omega^2} \]

+

For damped systems, two alternative characteristics frequency are defined:

+
    +
  • \(\omega_r^\prime\) for free vibration
  • +
  • \(\omega_r\) for forced vibration
  • +
+

The former constitutes the oscillatory part of the free vibration characteristic which, being complex, contains an exponential decay term as well: +\[ x(t) = \sum_{r=1}^N x_r e^{-a_r t} e^{i \omega_r^\prime t} \] +where \(\omega_r^\prime\) may not be identical to \(\bar{\omega}_r\) depending on the type and distribution of the damping.

+

The second definition comes from the general form of the FRF expression: +\[ \alpha(\omega) = \sum_{r=1}^N \frac{C_r}{\omega_r^2 - \omega^2 + i D_r} \] +Here \(C_r\) may be complex whereas \(D_r\) is real. +\(\omega_r\) is in general different to both \(\bar{\omega}_r\) and \(\omega_r^\prime\).

+

Table tab:frf_natural_frequencies summarizes all the different cases.

+

+
+ Table 8: + FRF Formulae and Natural Frequencies +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
CaseCDFree \(\omega_r^\prime\)Forced \(\omega_r\)
Undamped\(\mathbb{R}\)0\(\bar{\omega}_r\)\(\bar{\omega}_r\)
Prop. Hyst.\(\mathbb{R}\)\(\mathbb{R}\)\(\bar{\omega}_r\)\(\bar{\omega}_r\)
Prop. Visc.\(\mathbb{R}\)\(\mathbb{R}\) (\(\omega\))\(\omega_r\sqrt{1-\xi_r^2}\)\(\bar{\omega}_r\)
Gen. Hyst.\(\mathbb{C}\)\(\mathbb{R}\)\(\omega_r\)\(\omega_r\)
Gen. Visc.\(\mathbb{C}\) (\(\omega\))\(\mathbb{R}\) (\(\omega\))\(\omega_r\sqrt{1-\xi_r^2}\)\(\omega_r\)
+

Mobility and Impedance FRF Parameters

+

As well as for SDOF systems, there are three main forms of FRF: using displacement (receptance), velocity (mobility) or acceleration (inertance) response. +There exist a further three formats for FRF data, these being the inverses of the standard receptance, mobility and inertance: the dynamic stiffness, mechanical impedance and apparent mass, respectively.

+

However, for MDOF systems it is usually not feasible to measure the inverse properties. +In general, we can determine the response of a structure to an excitation using the equation +\[ {\dot{X}} = [Y(\omega)] \{F\} \] +Equally, we can write the inverse equation using impedance instead of mobilities: +\[ \{F\} = [Z(\omega)] \{V\} \]

+

The problem arises because the general element in the mobility matrix \(Y_{ik}(\omega)\) is not simply related to its counterpart in the impedance matrix \(Z_{ik}(\omega)\) as was the case for SDOF systems (\(Y_{ik}(\omega) = Z_{jk}^{-1}(\omega)\)).

+

The reason for this is that +\[ Y_{kj}(\omega) = \left( \frac{V_k}{F_j} \right)_{F_l = 0}; \quad Z_{jk}(\omega) = \left( \frac{F_j}{V_k} \right)_{V_l = 0}; \ l \neq k \]

+

Thus, the measure of impedance property demands that all DOFs expect one are grounded which is almost impossible in practice. +The only types of FRF which we can expect to measure directly are the mobilities.

+

Display for Undamped System FRF data

+
Construction of FRF plots for 2DOF system
+

We can envisage the form which the total FRF curve will take as it is simply the summation of all the individual terms. +However, the exact shape of the curve also depends on the phase of each term. +Then the addition of various components is made to determine the complete receptance expression, the signs of the various terms are obviously of considerable importance.

+

Let’s consider an example with two modes. +We write \(\alpha_{11}\) the point FRF and \(\alpha_{21}\) the transfer FRF:

+

\begin{align*} +\alpha_{11}(\omega) &= \frac{0.5}{\omega_1^2 - \omega^2} + \frac{0.5}{\omega_2^2 - \omega^2} \\\
+\alpha_{21}(\omega) &= \frac{0.5}{\omega_1^2 - \omega^2} - \frac{0.5}{\omega_2^2 - \omega^2} +\end{align*}

+

It can be seen that the only difference between the point and transfer receptance is in the sign of the modal constant of the second mode.

+

Consider the first point mobility (figure fig:mobility_frf_mdof_point), between the two resonances, the two components have opposite signs so that they are substractive rather than additive, and indeed, at the point where they cross, their sum is zero. +On a logarithmic plot, this produces the antiresonance characteristic which reflects that of the resonance.

+

+
+ Table 9: + Mobility FRF plot for undamped 2DOF system +
+ + + + + + + + + + + + + + + + + +
Point FRF Transfer FRF
width=\linewidthwidth=\linewidth
+

For the plot in figure fig:mobility_frf_mdof_transfer, between the two resonances, the two components have the same sign and they add up, no antiresonance is present.

+
FRF modulus plots for MDOF systems
+

The same principle may be extended to any number of DOF. +The fundamental rule is that if two consecutive modes have the same sign for the modal constants, then there will be an antiresonance at some frequency between the natural frequency of the two modes. +If they have apposite signs, there will not be an antiresonance.

+

Display of FRF Data for Damped systems

+
Bode plots
+

The resonances and antiresonances are blunted by the inclusion of damping, and the phase angles are no longer exactly \(\SI{0}{\degree}\) or \(\SI{180}{\degree}\), but the general appearance of the plot is a natural extension of that for the system without damping. +Figure fig:frf_damped_system shows a plot for the same mobility as appears in figure fig:mobility_frf_mdof_point but here for a system with added damping.

+

Most mobility plots have this general form as long as the modes are relatively well-separated.

+

This condition is satisfied unless the separation between adjacent natural frequencies is of the same order as, or less than, the modal damping factors, in which case it becomes difficult to distinguish the individual modes.

+

+
+ Figure 7: Mobility plot of a damped system
+

Figure 7: Mobility plot of a damped system

+
+
+ +
Nyquist diagrams
+

Each of the frequency response of a MDOF system in the Nyquist plot is composed of a number of SDOF components.

+

Figure fig:nyquist_point shows the result of plotting the point receptance \(\alpha_{11}\) for the 2DOF system described above.

+

The plot for the transfer receptance \(\alpha_{21}\) is presented in figure fig:nyquist_transfer where it may be seen that the opposing signs of the modal constants of the two modes have caused one of the modal circle to be in the upper half of the complex plane.

+

+
+ Table 10: + Nyquist FRF plot for proportionally-damped system +
+ + + + + + + + + + + + + + + + + +
Point receptance Transfer receptance
width=\linewidthwidth=\linewidth
+

In the two figures fig:nyquist_nonpropdamp_point and fig:nyquist_nonpropdamp_transfer, we show corresponding data for non-proportional damping. +In this case, a relative phase has been introduced between the first and second elements of the eigenvectors: of \(\SI{30}{\degree}\) in mode 1 and of \(\SI{150}{\degree}\) in mode 2. +Now we find that the individual modal circles are no longer “upright” but are rotated by an amount dictated by the complexity of the modal constants.

+

+
+ Table 11: + Nyquist FRF plot for non-proportionally-damped system +
+ + + + + + + + + + + + + + + + + +
Point receptance Transfer receptance
width=\linewidthwidth=\linewidth
+

Non-Sinusoidal vibration and FRF properties

+

With receptance and other FRF data, we have a means of computing the response of a MDOF system to an excitation which consists of a set of harmonic forces of different amplitudes and phases but all of the same frequency. +In the general case we can simply write +\[ \{X\} e^{i\omega t} = [\alpha(\omega)] \{F\} e^{i\omega t} \]

+

Periodic vibration

+
Periodic signals as Fourier series
+

Let’s first consider the case of periodic vibration, in which the excitation (and thus the response) is not simply sinusoidal although it has a property of periodicity.

+

The easiest way of computing the responses in such a case is by mean of the Fourier Series.

+

The basic principle of Fourier analysis is that any periodic function can be represented by a series of sinudoids of suitable frequencies, amplitudes and phases based on the fundamental period \(T\):

+

\begin{equation} +\tcmbox{f_0(t) = \sum_{n=1}^\infty {}_0F_n e^{i\omega_n t}; \quad \omega_n = \frac{2 \pi n}{T}} +\end{equation}

+

Once a frequency decomposition of the forcing function has been obtained, we may use the corresponding FRF data, computed at the specific frequencies present in the forcing spectrum, in order to compute the corresponding frequency components of the responses of interest:

+

\begin{equation} +\tcmbox{x_j(t) = \sum_{n=1}^\infty \alpha_{j0}(\omega_n) {}_0F_ne^{i\omega_n t}; \quad \omega_n = \frac{2 \pi n}{T}} +\end{equation}

+
To derive FRF from periodic vibration signals
+

It is possible to determine a system’s FRF properties from excitation and response measurements when the vibration is periodic. +To do this, it is necessary to determine the Fourier Series components of both the input force signal and of the relevant output response signal. +Both these series will contain components at the same set of discrete frequencies; these being integer multiples of \(2\pi/T\).

+

One these two series are available, the FRF can be defined at the same set of frequency points by computing the ratio of the response component to the input component.

+

Transient vibration

+
Analysis via Fourier transform
+

For most transient cases, the input function \(f(t)\) will satisfy the Dirichlet condition and so its Fourier Transform \(F(\omega)\) can be computed from eq:fourier_transform.

+

\begin{equation} +F(\omega) = \frac{1}{2 \pi} \int_{-\infty}^\infty f(t) e^{i\omega t} dt +\end{equation}

+

Now, at any frequency \(\omega\), the corresponding Fourier Transform of the response \(X(\omega)\) can be determined from

+

\begin{equation} +\tcmbox{X(\omega) = H(\omega) F(\omega)} +\end{equation}

+

where \(H(\omega)\) represents the appropriate version of the FRF for the particular input and output parameters considered.

+

We may then derive an expression for the response itself \(x(t)\) from the Inverse Fourier Transform of \(X(\omega)\)

+

\begin{equation} +\tcmbox{x(t) = \int_{-\infty}^\infty \left(H(\omega) F(\omega)\right)e^{i\omega t}d\omega} +\end{equation}

+
Response via time domain
+

This alternative analysis is referred to as convolution and is based on the ability to compute the response of a system to a simple unit impulse.

+

Let consider a unit impulse excitation applied at \(t = t^\prime\) with infinite magnitude and that lasts for an infinitesimal period of time although the area underneath it is equal to unity. +The response of a system to such an excitation at \(t>t^\prime\) is defined as the system’s unit Impulse Response Function (IRF) and has a direct relationship to the Frequency Response Function.

+

The IRF is written has +\[ h(t - t^\prime) \]

+

If we now consider a more general transient excitation, we see that it is possible to represent this as the superposition of several impulses, each of magnitude \(f(t^\prime)dt^\prime\) and occurring at different instants in time. +The response of a system at time \(t\) to just one of these incremental impulses at time \(t^\prime\) is +\[ \delta x (t) = h(t - t^\prime) f(t^\prime) dt^\prime \] +and the total response of the system will be given by superimposing or integrating all the incremental responses as follows +\[ x(t) = \int_{-\infty}^\infty h(t-t^\prime) f(t^\prime) dt^\prime; \quad h(t-t^\prime) = 0, \ t \leq t^\prime \]

+

There is a very close relationship between \(H(\omega)\) and \(h(t - t^\prime)\). +Let’s use the Fourier Transform approach to compute the response of a system to a unit impulse. +Thus, let \(f(t) = \delta(0)\) and determine its Fourier Transform \(F(\omega)\): +\[ F(\omega) = \frac{1}{2 \pi} \int_{-\infty}^\infty \delta(0) e^{i\omega t} dt = \frac{1}{2\pi} \] +Then +\[ x(t) = \frac{1}{2\pi} \int_{-\infty}^{\infty} H(\omega) e^{i\omega t} d\omega \triangleq h(t) \]

+

Thus, we find that the Impulse and Frequency Response Functions constitute a Fourier Transform pair.

+
To derive FRF from transient vibration signals
+

In order to obtain the structure’s FRF properties using a transient vibration test, the calculation of the Fourier transforms of both the excitation and the response signals is required. +Then, the ratio of these two function can be computed

+

\begin{equation} +H(\omega) = \frac{X(\omega)}{F(\omega)} +\end{equation}

+

This can be done provided that the time period of the measurement both excitation and response signals are effectively zero at the start and the end of the sample.

+

Random vibration

+
Random signals in time and frequency domains
+

We here consider both excitation and response described by random processes. +Neither excitation nor response signals can be subjected to a valid Fourier Transform calculation as they violate the Dirichlet condition.

+

It is necessary to introduce the Correlation Function and the Spectral Densities.

+
+
+

The Autocorrelation Function \(R_{ff}(\tau)\) of a random vibration parameter \(f(t)\), is defined as the expected value of the product \(f(t) f(t + \tau)\) computed along the time axis. +This will always be a real and even function of time, and is written

+

\begin{equation} +R_{ff}(\tau) = E[f(t) f(t + \tau)] \label{eq:autocorrelation} +\end{equation}

+
+

This correlation function, unlike the original quantity \(f(t)\) does satisfy the requirements for Fourier transformation and thus we can obtain its Fourier Transform by the usual equation.

+

The resulting parameter we shall call a Spectral Density, in this case the Auto or Power Spectral Density (PSD) \(S_{ff}(\omega)\).

+
+
+

\begin{equation} +S_{ff}(\omega) = \frac{1}{2\pi} \int_{-\infty}^\infty R_{ff}(\tau) e^{-i \omega \tau} d\tau \label{eq:powerspectraldensity} +\end{equation}

+
+

The Spectral Density is a real and even function of frequency, and does in fact provides a description of the frequency composition of the original function \(f(t)\). +It has units of \(f^2/\omega\).

+

Examples of random signals, autocorrelation function and power spectral density are shown on figure fig:random_signals.

+

+
+ Table 12: + Random signals +
+ + + + + + + + + + + + + + + + + + + + +
Time history Autocorrelation Function Power Spectral Density
width=\linewidthwidth=\linewidthwidth=\linewidth
+

A similar concept can be applied to a pair of functions such as \(f(t)\) and \(x(t)\) to produce cross correlation and cross spectral density functions.

+
+
+

The cross correlation function \(R_{xf}(\tau)\) between functions \(f(t)\) and \(x(t)\) is defined as

+

\begin{equation} +R_{xf}(\tau) = E[x(t) f(t + \tau)] \label{eq:crosscorelation} +\end{equation}

+
+
+
+

The Cross Spectral Density (CSD) is defined as the Fourier Transform of the Cross Correlation function:

+

\begin{equation} +S_{xf}(\omega) = \frac{1}{2\pi} \int_{-\infty}^\infty R_{xf}(\tau) e^{-i \omega \tau} d\tau \label{eq:cross_spectral_density} +\end{equation}

+
+

Cross correlation functions are real, but not always even, functions of time, and cross spectral densities, unlike auto spectral densities, are generally complex functions of frequency with the particular conjugate property that +\[ S_{xf}(\omega) = S_{fx}^*(\omega) \]

+

The analysis to obtain the input/output relationships for systems undergoing random vibrations is based on the general excitation/response relationship in the time domain: +\[ x(t) = \int_{-\infty}^\infty h(t - t^\prime) f(t^\prime) dt^\prime \]

+

Using this property, it is possible to derive an expression for $x(t) and for \(x(t - \tau)\) and thus to calculate the response autocorrelation \(R_{xx}(\tau)\) +\[ R_{xx}(\tau) = E[x(t) x(t + \tau)] \]

+

This equation can be manipulated to describe the response autocorrelation in terms of the corresponding property of the excitation \(R_{ff}\), but the result is complicated. +However, the same equation can be transform to the frequency domain

+

\begin{equation} +\tcmbox{ S_{xx}(\omega) = \left| H(\omega) \right|^2 S_{ff}(\omega) } +\end{equation}

+

Although very convenient, equation eq:psd_input_output does not provide a complete description of the random vibration conditions. +Further, it is clear that is could not be used to determine the FRF from measurement of excitation and response because it contains only the modulus of \(H(\omega)\), the phase information begin omitted from this formula.

+

A second equation is required and this may be obtain by a similar analysis, two alternative formulas can be obtained eq:cross_relation_alternatives.

+
+
+

\begin{subequations} +\begin{align} +S_{fx}(\omega) &= H(\omega) S_{ff}(\omega) \\\
+S_{xx}(\omega) &= H(\omega) S_{xf}(\omega) +\end{align} +\end{subequations}

+
+
To derive FRF from random vibration signals
+

The pair of equations eq:cross_relation_alternatives provides the basic of determining a system’s FRF properties from the measurements and analysis of a random vibration test. +Using either of them, we have a simple formula for determining the FRF from estimates of the relevant spectral densities eq:frf_estimates_spectral_densities.

+
+
+

\begin{subequations} +\begin{align} +H(\omega) &= \frac{S_{fx}(\omega)}{S_{ff}(\omega)} = H_1(\omega)\label{eq:H1} \\\
+H(\omega) &= \frac{S_{xx}(\omega)}{S_{xf}(\omega)} = H_2(\omega)\label{eq:H2} +\end{align} +\end{subequations}

+
+

The existence of two equations presents an opportunity to check the quality of calculations made using measured data.

+
Instrumental variable model for FRF
+

There are difficulties to implement some of the above formulae in practice because of noise and other limitations concerned with the data acquisition and processing.

+

One technique involves three quantities, rather than two, in the definition of the output/input ratio. +The system considered can best be described with reference to figure fig:frf_determination which shows first in fig:frf_siso_model the traditional single-input single-output model upon which the previous formulae are based. +Then in fig:frf_feedback_model is given a more detailed and representative model of the system which is used in a modal test.

+

+
+ Table 13: + System for FRF determination +
+ + + + + + + + + + + + + + + + + +
Basic SISO model SISO model with feedback
width=\linewidthwidth=\linewidth
+

In this configuration, it can be seen that there are two feedback mechanisms which apply. +We then introduce an alternative formula which is available for the determination of the system FRF from measurements of the input and output quantities eq:H3.

+
+
+

\begin{equation} +H(\omega) = \frac{S_{x^\prime v}(\omega)}{S_{f^\prime v(\omega)}} = H_3(\omega) +\end{equation}

+

where \(v\) is a third signal in the system.

+
+
Derivation of FRF from MIMO data
+

A diagram for the general n-input case is shown in figure fig:frf_mimo.

+

We obtain two alternative formulas:

+

\begin{subequations} +\begin{align} +\left[ H_{xf}(\omega) \right]_{n \times n} &= \left[ S_{x^\prime v}(\omega) \right]_{n \times n} \left[ S_{f^\prime v}(\omega) \right]_{n \times n}^{-1} \\\
+\left[ H_{xf}(\omega) \right]_{n \times n} &= \left[ S_{f^\prime f^\prime}(\omega) \right]_{n \times n}^{-1} \left[ S_{x^\prime f^\prime}(\omega) \right]_{n \times n} +\end{align} +\end{subequations}

+

In practical application of both of these formulae, care must be taken to ensure the non-singularity of the spectral density matrix which is to be inverted, and it is in this respect that the former version may be found to be more reliable.

+

+
+ Figure 8: System for FRF determination via MIMO model
+

Figure 8: System for FRF determination via MIMO model

+
+
+ +

Complete and Incomplete models

+

Some definitions

+

Most of the preceding theory has been concerned with complete models; that is, the analysis has been presented for an \(N\) degree-of-freedom system with the implicit assumption that all the mass, stiffness and damping properties are known and that all the elements in the eigenmatrices and the FRF matrix are available. +While this is a valid approach for a theoretical study, it is less generally applicable for experimentally-based investigations where it is not usually possible to measure all the DOFs, or to examine all the modes possessed by a structure. +Because of this limitation, it is necessary to extend our analysis to examine the implications of having access to something less than a complete set of data, or model, and this leads us to the concept of a reduced or incomplete type of model.

+
+
+

There are different types of incomplete models:

+
    +
  1. There is the model which is reduced in size (from \(N\) to \(n\)) by simply deleting information about certain degrees-of-freedom. +This process leads to a reduced model which retains full accuracy for the DOFs which are retained, but which looses access to those which have been deleted. +The process can be applied only to the modal and response models and results in a modal model described by an \(N\times N\) eigenvalue matrix but by an eigenvector matrix which is only \(n\times N\). +The corresponding response model is an incomplete FRF matrix of size \(n \times n\), although all the elements of that reduced matrix are themselves fully accurate.
  2. +
  3. Another type of reduced model is one in which the number of modes is reduced as well (from \(N\) to \(m\)), so that the eigenvalue matrix is only \(m \times m\) in size. +A consequence of this is that the elements in the reduced \(n \times n\) FRF matrix in this case are only approximate.
  4. +
  5. Another type of model reduction can be achieved by condensation from \(N\) to \(n\) DOFs. +This is a process in which a number of DOFs are again eliminated from the complete description but an attempt is made to include the effects of the masses and stiffnesses which are thereby eliminated in the retained DOFs. +This is the condensation process which is applied in the Guyan and other reduction techniques used to contain the size of otherwise very large finite element models. +In such a condensed model, the spatial, modal and response models are all reduced to \(n \times n\) matrices, and it must be noted that the properties of each are approximate in every respect.
  6. +
+
+

Incomplete Response models

+

There are two ways in which a model can be incomplete: by the omission of some modes, and/or by the omission of some degrees-of-freedom.

+
Omission of some DOFs
+

Consider first the complete FRF matrix which is \(N \times N\): +\[ \left[ H(\omega) \right]_{N \times N} \] +and then suppose that we decide to limit our description of the system to include certain DOFs only. +Our reduced response model is now +\[ \left[ H^R(\omega) \right]_{n \times n} \]

+

Now it is clear that we have not altered the basic system, and it still has the same number of degrees-of-freedom even though we have foregone our ability to describe the system’s behavior at all of them. +In this case, the elements which remain in the reduced FRF matrix are identical to the corresponding elements in the full \(N \times N\) matrix.

+

At this point, it is appropriate to mention the consequences of this type of reduction on the impedance type of FRF data. +The impedance matrix which corresponds to the reduced model defined by \([H^R]\) will be denoted as \([Z^R]\) and it is clear that +\[ [Z^R(\omega)] = [H^R(\omega)]^{-1} \]

+

It is also clear that the elements in the reduced impedance matrix such as \(Z_{jk}^R\) are not the same quantities as the corresponding elements in the full impedance matrix, and indeed, a completely different impedance matrix applied to each specific reduction: +\[ H_{ij}^R(\omega) = H_{ij}(\omega); \quad Z_{ij}(\omega) \neq Z_{ij}(\omega) \]

+

We can also consider the implications of this form of reduction on the other types of model, namely the modal model and the spatial model. +For the modal model, elimination of the data pertaining to some of the DOFs results in a smaller eigenvector matrix, which then becomes rectangular of order \(n \times N\). +The corresponding eigenvalue matrix is still \(N \times N\) because we still have all \(N\) modes included.

+

For the spatial model, it is more difficult to effect a reduction of this type. +It is clearly not realistic simply to remove the rows and columns corresponding to eliminated DOFs from the mass and stiffness matrices as this would represent a drastic change to the system. +It is possible, however, to reduce these spatial matrices by a number of methods which have the effect of redistributing the mass and stiffness properties which relate to the redundant DOFs among those which are retained. +In this way, the total mass of the structure, and its correct-stiffness properties can be largely retained. +The Guyan reduction procedure is perhaps the best known of this type. +Such reduced spatial properties will be denoted as +\[ \left[M^R\right], \ \left[K^R\right] \]

+
Omission of some modes
+

Let’s consider the other form of reduction in which only \(m\) of the \(N\) modes of the system are included. +Frequently, this is a necessary approach in that many of the high-frequency modes will be of little interest and almost certainly very difficult to measure. +Consider first the FRF matrix and include initially all the DOFs but suppose that each element in the matrix is computed using only \(m\) of the \(N\) terms in the summation +\[ \tilde{H}_{jk}(\omega) = \sum_{r=1}^{m\leq N} \frac{{{}_rA_{jk}}}{\omega_r^2 - \omega^2 + i \eta_r \omega_r^2} \] +In full, we can write the FRF matrix as +\[ \left[\tilde{H}(\omega)\right]_{N\times N} = \left[\Phi\right]_{N \times m} \left[\lambda_r^2 - \omega^2\right]_{m \times m}^{-1} \left[\Phi\right]_{m \times N}^T \]

+
Combination of both reduction
+

Of course, both types of reduction can be combined, the resulting matrix obtained would be +\[ \left[ \hat{H}^R(\omega) \right]_{n \times n} \] +However, \([\hat{H}^R(\omega)]\) will in general be rank deficient, and thus is will not be possible to obtain the impedance matrix by numerical inversion. +In order to overcome this problem, it is often convenient to add a constant or residual term to each FRF: +\[ [H(\omega)] = [\hat{H}(\omega)] + [R] \]

+

Incomplete modal and spatial models

+

It has been shown that the orthogonality properties of the modal model provide a direct link between the modal and the spatial model: +\[ [\Phi]^T [M] [\Phi] = [I]; \quad [\Phi]^T [K] [\Phi] = [\omega_r^2] \] +Which can be inverted to yield

+

\begin{subequations} +\begin{align} +[M] &= [\Phi]^{-T}[\Phi]^{-1}\\\
+[K] &= [\Phi]^{-T}[\omega_r^2][\Phi]^{-1} +\end{align} +\end{subequations}

+

If the modal model is incomplete, then we can note the implications for the orthogonality properties.

+

First, if we have a modal incompleteness (\(m<N\) modes included), then we can write:

+

\begin{subequations} +\begin{align} +[\Phi]_{m\times N}^T [M] [\Phi]_{N\times m} &= [I]_{m\times m}\\\
+[\Phi]_{m\times N}^T [K] [\phi]_{N\times m} &= [\omega_r^2]_{m\times m} +\end{align} +\end{subequations}

+

However, if we have spatial incompleteness (only \(n<N\) DOFs included), then we cannot express any orthogonality properties at all because the eigenvector matrix is not commutable with the system mass and stiffness matrices.

+

In both reduced-model cases, it is not possible to use equation eq:spatial_model_from_modal to re-construct the system mass and stiffness matrices. +First of all because the eigen matrices are generally singular and even if it is not, the obtained mass and stiffness matrices produced have no physical significance and should not be used.

+

Sensitivity of models

+

Introduction

+
+
+

The sensitivity of a model describe the rates of change of some of the key properties, such as the natural frequencies and mode shapes, with small changes in some of the modal parameters, such as individual masses of stiffnesses.

+
+

The model sensitivities are required for various purposes:

+
    +
  • they help to locate errors in models
  • +
  • the are useful in guiding design optimization procedures
  • +
  • they are used in the course of curve-fitting for the purposes of testing the reliability of the modal analysis processes
  • +
+ +

The most commonly used sensitivities are those which describe the rates of change of the modal parameters with the individual mass and stiffness elements in the spatial model. +These quantities are defined as follows: +\[ \frac{\partial \omega_r}{\partial p} \text{ and } \frac{\partial \{\phi\}_r}{\partial p} \] +where \(p\) represents any variable of interest

+
SDOF system
+

It is useful to approach the general expressions for these parameters via a simple example based on an undamped SDOF system. +We can introduce the concept of sensitivity through the basic SDOF system comprising mass \(m\) and spring \(k\). +We can define the basic sensitivities of the system’s natural frequency \(\omega_0\): +\[ \frac{\partial \omega_0}{\partial m} \text{ and } \frac{\partial \omega_0}{\partial k} \]

+

We can show that: +\[ \frac{\partial \omega_0^2}{\partial m} = \frac{-\sqrt{k}}{m^2} ; \quad \frac{\partial \omega_0}{\partial k} = \frac{1}{2 \sqrt{km}} \]

+
MDOF systems - eigenvalue sensitivity
+

We can differentiate the following equation of motion of a MDOF system with respect to an arbitrary variable \(p\) that might be an individual mass \(m_i\) of stiffness \(k_j\). +\[ \left( [K] - \omega_r^2 [M] \right) \{\phi\}_r = \{0\} \]

+

We then obtain +\[ \frac{\partial \omega_r^2}{\partial p} = \{\phi\}_r^T \left( \frac{\partial [K]}{\partial p} - \omega_r^2 \frac{\partial [M]}{\partial p} \right) \{\phi\}_r \]

+
MDOF systems - eigenvector sensitivity
+

A similar analysis can be made for the eigenvector sensitivity terms.

+

FRF sensitivities

+

It may be seen it is also possible to derive FRF sensitivities.

+

If we consider first the simple SDOF system with a receptance FRF \(\alpha(\omega)\) +\[ \alpha(\omega) = \frac{1}{k + i \omega c - \omega^2 m} \] +We can differentiate this with respect to \(m\) and \(k\).

+

The same can be done with the more general case for \(MDOF\) system as follows: +\[ \frac{\partial [\alpha(\omega)]}{\partial p} = [\alpha(\omega)] \left( \frac{\partial [K]}{\partial p} + i \omega \frac{\partial [C]}{\partial p} - \omega^2\frac{\partial [M]}{\partial p} \right) [\alpha(\omega)] \]

+ +

There exists the possibility of deriving certain sensitivity parameters directly from FRF data such as can be measured in a modal test. +Essentially, it is possible to derive expressions for the eigenvalue sensitivities to selected individual mass and stiffness parameters by analyzing the point FRF properties at the selected DOFs.

+

FRF Measurement Techniques

+

Introduction and Test Planning

+

Introduction

+

There are two types of vibration measurement:

+
    +
  • those in which just the response level is measured
  • +
  • those in which both input and response output parameters are measured
  • +
+

Recalling the basic relationship: +\[ \tcmbox{ \text{response} = \text{properties} \times \text{input} } \]

+

We can see that only when two of the three terms in this equation have been measured, we can defined completely what is going on in the vibration of the test object. +If we measure only the response, then we are unable to say whether a particularly large response level is due to a strong excitation or to a resonance of the structure.

+

For the second type of vibration measurement, both the excitation and the response are measured simultaneously so that basic equation can be used to deduce the system properties.

+

Our interest will first be on the mobility measurements or FRF measurements where the excitation is applied at a single point. +In that case, FRF data are directly obtained by “dividing” the measured responses by the measured excitation force.

+

Responses obtained using several simultaneous excitations yield Operation Deflection Shapes (ODSs) from which it is necessary to extract the required FRF data by sometimes complicated analysis procedures. +These are referred to as MIMO tests.

+

Test Planning

+

It is clear that there will need to be an extensive test planning phase before full-scale measurements are made an decisions taken concerning the methods of excitation, signal processing and data analysis, as well as the proper selection of which data to measure, where to excite the structure and how to prepare and support it for those measurements.

+

Checking the quality of the measured data

+
Signal Quality
+

It is sometimes found that the dynamic range of the measured quantities is extreme, especially when the frequency range being covered is wide. +What often happens is that there is a very large component of signal in one frequency range that dictates the gain settings on amplifiers and analysers such that lower-level components are difficult to measure accurately.

+
Signal fidelity
+

This arise when the signals obtained do not truly represent the quantity which is to be measured. +For example, large motion perpendicular to the measurement axis can contaminate the measurement and gives misleading indications.

+

One should verify that the labeling and the connection of transducers are correct. +This can be check by looking at the pattern of resonances visible on the FRF curves:

+
    +
  • for excitation and response at the same DOF, resonances and anti-resonances must alternate
  • +
  • excitation and response points which are well separated on the test structure will tend to possess fewer anti-resonances
  • +
+
Measurement repeatability
+

One essential check for any modal test is the repeatability of the measurements. +Certain FRF should be re-measured from time to time, just to check that neither the structure nor the measurement system have experienced any significant changes.

+
Measurement reliability
+

We here seek to establish that the measured data are independent of the measuring system. +One should measure the same quantity (usually an FRF) with a slightly different setup, or procedure such as a different excitation signal. +These checks are very important to demonstrate the underlying validity of the measurement method being used.

+
Measured data consistency, including reciprocity
+

The various FRF data measured on a given structure should exhibit consistency, by which is meant that the underlying natural frequencies, damping factors and mode shapes visible in the FRF data must all derive from a common modal model.

+

The reciprocity expected to exist between FRFs such as \(H_{jk}\) and \(H_{kj}\) should be checked and found to be at an acceptable level.

+

Basic Measurement System

+

The experimental setup used for mobility measurement contains three major items:

+
    +
  1. An excitation mechanism. This contains a source for the excitation signal (sinusoidal, periodic, random, transient), a power amplifier and a exciter (usually a shaker or an hammer)
  2. +
  3. A transduction system. For the most part, piezoelectric transducer are used, although lasers and strain gauges are convenient because of their minimal interference with the test object. Conditioning amplifiers are used depending of the transducer used
  4. +
  5. An analyzer
  6. +
+

A typical layout for the measurement system is shown on figure fig:general_frf_measurement_setup.

+

+
+ Figure 9: General layout of FRF measurement system
+

Figure 9: General layout of FRF measurement system

+
+
+ +

Structure preparation

+
Free supports
+

By “free” is meant that the test object is not attached to ground at any of its coordinates and is, in effect, freely suspended in space. +In this condition, the structure will exhibit rigid body modes which are determined solely by its mass and inertia properties and in which there is no bending or flexing at all. +Six rigid body modes are then obtained with a natural frequency of \(\SI{0}{Hz}\). +Mass and inertial properties can then be measured with such a support.

+

However, in practice it is not feasible to provide a truly free support. +Approximate to the free condition can be achieved by supporting the testpiece on very soft springs such that the frequency of the rigid body mode are less than \(\SI{10}{%}\) of that of the lowest resonance frequency.

+
Grounded supports
+

The other type of support is referred to as “grounded” because it attempts to fix selected points on the structure to ground. +In practice, it is very difficult to attach the test structure to a base structure which is sufficiently rigid to provide the necessary grounding.

+

The safest procedure is to measure the mobility FRF of the base structure itself over the frequency range for the test and to establish that this is a much lower mobility than the corresponding levels for the test structure at the point of attachment. +If this condition is satisfied for all the coordinates to be grounded, then the base structure can reasonably be assumed to be grounded.

+
Loaded boundaries
+

A compromise procedure can be applied in which the test object is connected at certain coordinates to another simple component of known mobility, such as a specific mass. +The effects of the added component is then removed analytically.

+

Excitation of the structure

+

Devices for exciting the structure can be divided into two type:

+
    +
  • Contacting: these involves the connection of an exciter of some form which remains attached to the structure throughout the test.
  • +
  • Non-contacting: devices which are either out of contact throughout the vibration (such as provided by a voice coil) or which are only in contact for a short period (such as a hammer)
  • +
+

Exciters are often limited at very low frequencies by the stroke rather than by the force generated.

+

Electromagnetic Exciters

+

The most common type of exciter is the electromagnetic shaker in which a magnetic force is applied is applied on the structure without any physical contact.

+

The frequency and amplitude of the excitation are controlled independently of each other, which gives flexibility.

+

However, we need a direct measurement of the force applied to the structure (we cannot rely on the current going through the coil).

+

The shakers are usually stiff in the orthogonal directions to the excitation. +This can modify the response of the system in those directions. +In order to avoid that, a drive rod which is stiff in one direction and flexible in the other five directions is attached between the shaker and the structure as shown on figure fig:shaker_rod. +Typical size for the rod are \(5\) to \(\SI{10}{mm}\) long and \(\SI{1}{mm}\) in diameter, if the rod is longer, it may introduce the effect of its own resonances.

+

+
+ Figure 10: Exciter attachment and drive rod assembly
+

Figure 10: Exciter attachment and drive rod assembly

+
+
+ +

The support of shaker is also of primary importance.

+

The setup shown on figure fig:shaker_mount_1 presents the most satisfactory arrangement in which the shaker is fixed to ground while the test structure is supported by a soft spring.

+

Figure fig:shaker_mount_2 shows an alternative configuration in which the shaker itself is supported. +It may be necessary to add an additional inertia mass to the shaker in order to generate sufficient excitation forces at low frequencies.

+

Figure fig:shaker_mount_3 shows an unsatisfactory setup. Indeed, the response measured at \(A\) would not be due solely to force applied at \(B\), but would also be caused by the forces applied at \(C\).

+

+
+ Table 14: + Various mounting arrangement of exciter +
+ + + + + + + + + + + + + + + + + + + + +
Ideal Configuration Suspended Configuration Unsatisfactory
width=\linewidthwidth=\linewidthwidth=\linewidth
+

Hammer or Impactor Excitation

+

Although this type of test places greater demands on the analysis phase of the measurement process, it is a relatively simple means of exciting the structure.

+

A set of different tips and heads are used to extend the frequency and force level ranges for testing a variety of different structure. +A load cell (or force transducer) which detects the magnitude of the force felt by the impactor is included.

+

The magnitude of the impact is determined by the mass of the hammer head and its velocity when it hits the structure.

+

The frequency range which is effectively excited is controlled by the stiffness of the contacting surface and the mass of the impactor head: there is a resonance at a frequency given by \(\sqrt{\frac{\text{contact stiffness}}{\text{impactor mass}}}\) above which it is difficult to deliver energy into the test structure.

+

When the hammer tip impacts the test structure, this will experience a force pulse as shown on figure fig:hammer_impulse. +A pulse of this type (half-sine shape) has a frequency content of the form illustrated on figure fig:hammer_impulse.

+

+
+ Figure 11: Typical impact force pulse and spectrum
+

Figure 11: Typical impact force pulse and spectrum

+
+
+ +

The stiffer the materials, the shorter will be the duration of the pulse and the higher will be the frequency range covered by the impact. +Similarly, the lighter the impactor mass, the higher the effective frequency range.

+

Generally, as soft a tip as possible will be used in order to inject all the input energy into the frequency range of interest: using a stiffer tip than necessary will result in energy being input to vibrations outside the range of interest at the expense of those inside of that range.

+

One of the difficulties of applying excitation using a hammer is ensuring that each impact is essentially the same as the previous ones, not much in magnitude as in position and orientation relative to the normal of the surface.

+

Transducers and Amplifiers

+

The piezoelectric type of transducer is by far the most popular and widely used transducer in modal tests.

+

Three types of piezoelectric transducers are available for mobility measurements:

+
    +
  • Force gauges
  • +
  • Accelerometers
  • +
  • Impedance heads: simply a combination of force and acceleration sensitive elements in a single unit
  • +
+

The basic principle of operation makes use of the fact that an element of piezoelectric material generates an electric charge across its end faces when subjected to a mechanical stress. +By suitable design, such a material may be incorporated into a device which induces in it a stress proportional to the physical quantity to be measured.

+

Force Transducers

+

The force transducer is the simplest type of piezoelectric transducer. +The transmitter force \(F\) is applied directly across the crystal, which thus generates a corresponding charge \(q\), proportional to \(F\) (figure fig:piezo_force_transducer).

+

+
+ Figure 12: Force transducer
+

Figure 12: Force transducer

+
+
+ +

There exists an undesirable possibility of a cross sensitivity, i.e. an electrical output when there is zero force \(F\) but, say, a transverse or shear loading.

+

Accelerometers

+

In an accelerometer, transduction is indirect and is achieved using a seismic mass (figure fig:piezo_accelerometer). +In this configuration, the force exerted on the crystals is the inertia force of the seismic mass (\(m\ddot{z}\)). +Thus, so long as the body and the seismic mass move together, the output of the transducer will be proportional to the acceleration of its body \(x\).

+

+
+ Figure 13: Compression-type of piezoelectric accelerometer
+

Figure 13: Compression-type of piezoelectric accelerometer

+
+
+ +

Analysis of a simple dynamical model for this device shows that the ratio \(\ddot{x}/\ddot{z}\) is effectively unity over a wide range of frequency from zero upwards until the first resonant frequency of the transducer.

+

There is also a problem of cross or transverse sensitivity of accelerometers which can result from imperfections in the crystal geometry and from interaction through the casing.

+

Selection of accelerometers

+

Accelerometer sensitivities vary between \(1\) and \(\SI{10000}{pC/g}\). +In general, we require as high a sensitivity as possible, however, the heavier the transducer, the lower is the transducer’s resonant frequency and thus the maximum working frequency. +For accurate measurements, especially on complex structures which are liable to vibrate simultaneously in several directions, transducers with low transverse sensitivity (less than \(\SI{1}{%}\)) should be selected.

+

Conditioning Amplifiers

+

One of the advantages of the piezoelectric transducer is that it is an active device and does not require a power supply in order to function. +However, this means that it cannot measure truly static quantities and so there is a low frequency limit below which measurements are not practical. +This limit is usually determined not simply by the properties of the transducer itself, but also by those of the amplifiers used to boost the small electric charge that is generated by the crystals.

+

Two types of amplifier are available for this role that both have very high input impedance:

+
    +
  • Voltage amplifiers
  • +
  • Charge amplifiers
  • +
+

Voltage amplifiers tend to be simpler and to have a better signal/noise characteristic than charge amplifiers. +However, they cannot be used at such low frequencies as the charge amplifiers and the overall gain is affected by the length and properties of the transducer cable whereas that for a charge amplifier it is effectively independent of the cable.

+

Attachment of transducers

+

The correct installation of transducers, especially accelerometers is important.

+

There are various means of fixing the transducers to the surface of the test structure, some more convenient than others. +Some of these methods are illustrated in figure fig:transducer_mounting_types.

+

Shown on figure fig:transducer_mounting_response are typical high frequency limits for each type of attachment.

+

+
+ Table 15: + Accelerometer attachment characteristics +
+ + + + + + + + + + + + + + + + + +
Attachment methods Frequency response characteristics
width=\linewidthwidth=\linewidth
+

Location of transducers

+

Another problem which may require the removal of the transducer to another location is the possibility that it is positioned at or very close to a node of one or more of the structure’s modes. +In that case, it will be very difficult to make an effective measurement of that particular mode.

+

Most modal test require a point mobility measurement as one of the measured FRF. +This is hard to achieve as both force and response transducer should be at the same point on the structure. +Three possibilities exist:

+
    +
  1. Use an impedance head
  2. +
  3. Place the force and acceleration transducers in line but on opposite sides of the structure
  4. +
  5. Place the accelerometer alongside, as close as possible as the force gauge
  6. +
+

The third option is the most practical but is the one that presents the problem. +Particular care is required to ensure that the measurement is really representative of a point mobility: the accelerometer should be as close as possible as the force gauge.

+

Digital Signal Processing

+

Objective

+

The task of the spectrum analyser is to estimate the Fourier transform or Spectral densities of signals.

+

We here relate the two most relevant versions of the fundamental Fourier transformation between the time and frequency domains.

+

In its simplest form, this states that a function \(x(t)\), periodic in time \(T\), can be written as an infinite series:

+

\begin{equation} +x(t) = \frac{a_0}{2} + \sum_{n=1}^\infty \left( a_n \cos\frac{2 \pi n t}{T} + b_n \sin\frac{2 \pi n t}{T} \right) +\end{equation}

+

where \(a_i\) and \(b_i\) can be computed from knowledge of \(x(t)\) via the relationships:

+

\begin{subequations} +\begin{align} +a_n &= \frac{2}{T} \int_0^T x(t) \cos \left(\frac{2 \pi n t }{T} \right) \\\
+b_n &= \frac{2}{T} \int_0^T x(t) \sin \left(\frac{2 \pi n t }{T} \right) +\end{align} +\end{subequations}

+

In the situation where \(x(t)\) is discretised and of finite duration, so that it is defined only at a set of \(N\) particular values of time (\(t_k; k = 1, \dots, N\)), we can write a finite Fourier series for \(k = 1, \dots, N\):

+

\begin{align*} +x_k &= x(t_k) \\\
+&= \frac{a_0}{2} + \sum_{n=1}^{N/2} \left( a_n \cos\left(\frac{2 \pi n t_k}{T}\right) + b_n \sin\left(\frac{2 \pi n t_k}{T}\right) \right) +\end{align*}

+

The coefficients \(a_i\) and \(b_i\) are the Fourier or Spectral coefficients for the function \(x(t)\) and they are often displayed in modulus and phase form:

+

\begin{subequations} +\begin{align} +x_n &= \sqrt{a_n^2 + b_n^2} \\\
+\phi_n &= t g^{-1} \left( \frac{-b_n}{a_n} \right) +\end{align} +\end{subequations}

+

Basics of the DFT

+

In each case, the input signal is digitized and recorded as a set of \(N\) discrete values, evenly spaced in the period \(T\) during which the measurement is made.

+

There is a basic relationship between the sample length \(T\), the number of discrete values \(N\), the sampling rate \(\omega_s\) and the range and resolution of the frequency spectrum.

+

The range of the spectrum is \([0, \omega_\text{max}]\) (\(\omega_\text{max}\) is called the Nyquist frequency), and the resolution of lines in the spectrum is \(\Delta_\omega\):

+

\begin{subequations} +\begin{align} +\omega_{\text{max}} &= \frac{\omega_s}{2} = \frac{1}{2} \left( \frac{2\pi N}{T} \right) \\\
+\Delta_\omega &= \frac{\omega_s}{N} = \frac{2\pi}{T} +\end{align} +\end{subequations}

+

Various algorithms can be used to determine the spectral composition of the sampled signal, however, the most widely used is the Fast Fourier Transform. +That however requires \(N\) to be an integral power of \(2\).

+

Aliasing

+

Aliasing originates from the discretisation of the originally continuous time history. +With this discretisation process, the existence of very high frequencies in the original signal may well be misinterpreted if the sampling rate is too slow. +These high frequencies will be indistinguishable from genuine low frequency components as shown on figure fig:aliasing.

+

+
+ Figure 14: The phenomenon of aliasing. On top: Low-frequency signal, On the bottom: High frequency signal
+

Figure 14: The phenomenon of aliasing. On top: Low-frequency signal, On the bottom: High frequency signal

+
+
+ +

A signal of frequency \(\omega\) and one of frequency \(\omega_s-\omega\) are indistinguishable and this causes a distortion of the spectrum measured via the DFT.

+

As a result, the part of the signal which has frequency components above \(\omega_s/2\) will appear reflected or aliased in the range \([0, \omega_s/2]\). +This is illustrated on figure fig:effect_aliasing.

+

+
+ Table 16: + Alias distortion of spectrum by DFT +
+ + + + + + + + + + + + + + + + + +
True spectrum of signal Indicated spectrum from DFT
width=\linewidthwidth=\linewidth
+

The solution of the problem is to use an anti-aliasing filter which subjects the original time signal to a low-pass, sharp cut-off filter. +Because the filters used are inevitably less than perfect, and have a finite cut-off rate, it remains necessary to reject the spectral measurement in a frequency range approaching the Nyquist frequency \(\omega_s/2\). +Typically, the cut-off rate is set to \(0.5 \times \omega_s/2\) for simple filters and \(0.8 \times \omega_s/2\) for more advance filters. +As a results, frequencies near \(\omega_s/2\) may still be contaminated by the imperfected anti-aliasing.

+

Leakage

+

Leakage is a problem which is a direct consequence of the need to take only a finite length of time history coupled with the assumption of periodicity.

+

+
+ Table 17: + Sample length and leakage of spectrum +
+ + + + + + + + + + + + + + + + + +
Ideal signal Awkward signal
width=\linewidthwidth=\linewidth
+

The problem is illustrated on figure fig:leakage. +In the first case (figure fig:leakage_ok), the signal is perfectly periodic and the resulting spectrum is just a single line at the frequency of the sine wave. +In the second case (figure fig:leakage_nok), the periodicity assumption is not strictly valid as there is a discontinuity at each end of the sample. +As a result, the spectrum produced for this case does not indicate the single frequency which the original time signal possessed. +Energy has “leaked” into a number of the spectral lines close to the true frequency and the spectrum is spread over several lines.

+

Leakage is a serious problem in many applications, ways of avoiding its effects are:

+
    +
  • Changing the duration of the measurement sample length to match the periodicity of the signal. +This can only work if the signal is periodic and if the period can be determined
  • +
  • Increasing the duration of the measurement period \(T\) so that the separation between the spectral lines (the frequency resolution) is finer. +Although this will not totally remove the leakage effect
  • +
  • Adding zeroes to the end of the measured sample (“zero padding”), thereby partially achieving the preceding result but without requiring more data
  • +
  • Modifying the sampled signal obtained in such a way as to reduce the severity of the leakage effect. This effect is referred to as windowing
  • +
+

Windowing

+

Windowing involves the imposition of a prescribed profile on the time signal prior to performing the Fourier transform.

+

The profiles, or “windows” are generally depicted as a time function \(w(t)\) as shown in figure fig:windowing_examples.

+

+
+ Figure 15: Different types of window. (a) Boxcar, (b) Hanning, (c) Cosine-taper, (d) Exponential
+

Figure 15: Different types of window. (a) Boxcar, (b) Hanning, (c) Cosine-taper, (d) Exponential

+
+
+ +

The analyzed signal is then \(x^\prime(t) = x(t) w(t)\). +The result of using a window is seen in the third column of figure fig:windowing_examples.

+

The Hanning and Cosine Taper windows are typically used for continuous signals, such as are produced by steady periodic or random vibration, while the Exponential window is used for transient vibration applications where much of the important information is concentrated in the initial part of the time record.

+

In all cases, a re-scaling is required to compensated for the attenuation of the signals by the application of the window. +However, if both response and excitation signals are subjected to the same window, and the results are used only to compute an FRF ratio, then the re-scaling is not necessary.

+

Filtering

+

The process of filtering has a direct parallel with windowing. +Common filters are: low-pass, high-pass, band-limited, narrow-band, notch.

+

Improving Resolution

+

+
Increasing transform size
+

An immediate solution to this problem would be to use a larger transform. +However, this may not be possible in practice.

+
Zero padding
+

It may be possible to achieve the same resolution increase by adding a series of zeros to the short sample of the actual signal. +Care must be taken in such a procedure are it will smooth the resulting spectrum but no additional information is included. +This can be misleading in some cases. +For instance where two peaks are close and result in only one peak in the smooth data.

+
Zoom
+

The common solution to the need for finer frequency resolution is to zoom on the frequency range of interest and to concentrate all the spectral lines into a narrow band between \(\omega_\text{min}\) and \(\omega_\text{max}\).

+

There are various ways of achieving this result. +The easiest way is to use a frequency shifting process coupled with a controlled aliasing device.

+

Suppose the signal to be analyzed \(x(t)\) has a spectrum \(X(\omega)\) has shown on figure fig:zoom_range, and that we are interested in a detailed analysis between \(\omega_1\) and \(\omega_2\).

+

If we apply a band-pass filter to the signal, as shown on figure fig:zoom_bandpass, and perform a DFT between \(0\) and \((\omega_2 - \omega_1)\), then because of the aliasing phenomenon described earlier, the frequency components between \(\omega_1\) and \(\omega_2\) will appear between \(0\) and \((\omega_2 - \omega_1)\) with the advantage of a finer resolution (see figure fig:zoom_result).

+

+
+ Table 18: + Controlled aliasing for frequency zoom +
+ + + + + + + + + + + + + + + + + +
Spectrum of the signal Band-pass filter
width=\linewidthwidth=\linewidth
+

+
+ Figure 16: Effective frequency translation for zoom
+

Figure 16: Effective frequency translation for zoom

+
+
+ +

When using zoom the measure FRF in a narrow frequency range, it is important to ensure that there is as little vibration energy as possible outside the frequency range of interest.

+

Averaging

+

When analyzing random vibrations signals, it is not sufficient to compute Fourier transforms (strictly, they do not exist for a random process) and we must instead obtain estimates for the spectral densities and correlation functions which are used to characterize this type of signal.

+

Although these properties are computed from the Fourier transforms, there are additional considerations concerning their accuracy and statistical reliability which must be given due attention.

+

Generally, it is necessary to perform an averaging process, involving several individual time records, or samples, before a result is obtained which can be used with confidence. +The two major considerations which determine the number of average required are:

+
    +
  • the statistical reliability
  • +
  • the removal of spurious random noise from the signals
  • +
+

An indication of the requirements from a statistical standpoint may be provided by the “statistical degrees of freedom” \(\kappa\) which is provided by

+

\begin{equation} +\kappa = 2 B T_t +\end{equation}

+

where \(B\) is the frequency bandwidth and \(T_t\) is the total time encompassing all data. +\(T_t = mT\) for \(m\) samples each of \(T\) duration.

+

As a guide, this quantity \(\kappa\) should be a minimum of \(10\) and should approach \(100\) for reasonably reliable estimates.

+

An other way to average is to apply the DFT on overlapping data. +This is called overlap averaging. +It is clear that \(100\) averages performed in this way cannot have the same statistical properties as would \(100\) completely independent samples. +Nevertheless, the procedure is more effective than if all the data points are only used once. +This manifests by producing smoother spectra.

+

Use of different excitation signals

+

There are three different classes of signals used for the excitation signals:

+
    +
  • Periodic: stepped sine, slow sine sweep, periodic, pseudo random, periodic random
  • +
  • Transient: burst sine, burst random, chirp, impulse
  • +
  • Random: true random, white noise, narrow-band random
  • +
+

All of these are in widespread use, each having its own particular merits and drawbacks.

+

Stepped-Sine testing

+

Stepped-sine testing comes from the classical method of measuring the FRF where a discrete sinusoidal with a fixed amplitude and frequency is used.

+

In order to encompass a frequency range of interest, the command signal frequency is stepped from one discrete value to another in such a way as to provide the necessary density of points in the FRF plot. +In this technique, it is necessary to ensure that steady-state conditions have been attained before the measurements are made and this means delaying the start of the measurement process for a short while after a new frequency has been selected as there will be a transient response. +The extent of the unwanted transient response will depend on:

+
    +
  • the proximity of the excitation frequency to the natural frequency of the structure
  • +
  • the abruptness of the changeover from the previous command signal to the new one
  • +
  • the lightness of the damping of the nearby structural modes
  • +
+

In practice, this is only in the vicinity of a lightly damped resonance that the necessary delay becomes significant and extra attention is needed.

+

One of the advantages is the facility of taking measurements where it is required. +For instance, the typical FRF curve has large region of relatively slow changes of level with frequency (away from resonances and anti-resonances) and in these regions it is sufficient to take measurements at relatively widely spaced frequency points.

+

Slow Sine Sweep testing

+

This is the traditional method of FRF measurement and involves the use of a sweep oscillator to provide a sinusoidal command signal with a frequency that varies slowly in the range of interest. +It is necessary to check that progress through the frequency range is sufficiently slow to check that steady-state response conditions are attained. +If excessive sweep rate is used, then distortions of the FRF plot are introduced as shown on figure fig:sweep_distortions.

+

+
+ Figure 17: FRF measurements by sine sweep test
+

Figure 17: FRF measurements by sine sweep test

+
+
+ +

One way of checking the suitability of a sweep rate is to make the measurement twice, once sweeping up and the second time sweeping down through the frequency range. +If both curves obtained are the same, the sweep rate is not excessive.

+

Periodic Excitation

+

This is very similar to a sine wave test methods, however the input signal contains not one but many frequencies of interest.

+

The method of computing the FRF is quite simple: the discrete Fourier transform is computed for both the force and response signals and the ratio of these transforms gives the FRF.

+

Two types of periodic signals are used:

+
    +
  • Deterministic: all the components are mixed with ordered amplitude and phase relationships (e.g. a square wave)
  • +
  • Pseudo-random: generation of a random mixture of amplitudes and phases for the various frequency components
  • +
+

The sequence is generated for a duration which equals the period of one sample in the analysis process, and is output repeatedly for several successive cycles. +A particular advantage of this type of excitation is its exact periodicity in the analyser bandwidth, resulting in zero leakage errors and therefore requiring no windows to be applied before its spectral analysis.

+

One should not that when there is no need to use a window of any form, as it is the case for periodic signals, then it is very important not to use one.

+

Random Excitation

+
FRF estimates using random excitation
+

True random excitation are generally applied to the structure using a shaker.

+

For a such a random excitation, a different approach is required in order to determine the FRF.

+

The principle upon which the FRF is determined using random excitation relies on the following equations

+

\begin{subequations} +\begin{align} +S_{xx}(\omega) &= |H(\omega)|^2 S_{ff}(\omega)\\\
+S_{fx}(\omega) &= H(\omega) S_{ff}(\omega)\\\
+S_{xx}(\omega) &= H(\omega) S_{xf}(\omega) +\end{align} +\end{subequations}

+

where

+
    +
  • \(S_{xx}(\omega)\) and \(S_{ff}(\omega)\) are the autospectra of the response and excitation signals
  • +
  • \(S_{xf}(\omega)\) is the cross spectrum between these two signals
  • +
  • \(H(\omega)\) is the FRF linking the quantities \(x\) and \(f\)
  • +
+

Such parameters can never be measured exactly with only a finite length of data. +However, we have the possibility of providing a cross check on the results by using the fact that the FRF can be estimated using two sets of data:

+

\begin{subequations} +\begin{align} +H_1(\omega) &= \frac{S_{fx}(\omega)}{S_{ff}(\omega)} \\\
+H_2(\omega) &= \frac{S_{xx}(\omega)}{S_{xf}(\omega)} +\end{align} +\end{subequations}

+

We now introduce a quantity \(\gamma^2\) which is called the coherence and which is defined as +\[ \gamma^2 = \frac{H_1(\omega)}{H_2(\omega)}; \quad 0 \le \gamma^2 \le 1 \]

+

Clearly, if all is well with the measurement, the coherence should be unity and we shall be looking for this condition in our test to reassure us that the measurements have been well made. +Small values of the coherence means that the FRF estimate obtained is unreliable and one should determine its cause.

+
Noisy Data
+

There are several situations in which an imperfect measurement might be made, and a low coherence recorded. +There may well be noise on one or other of the two signals which could degrade the measured spectra:

+
    +
  • Near resonance: this is likely to influence the force signal so that \(S_{ff}(\omega)\) becomes vulnerable and \(H_1(\omega)\) will suffer the most, \(H_2(\omega)\) might be a better indicator in that case
  • +
  • Near anti-resonance: it is the response signal which will suffer, making \(S_{xx}(\omega)\) liable to errors and this is the opposite for \(H_1(\omega)\) and \(H_2(\omega)\)
  • +
+

This is shown by the following equations:

+

\begin{subequations} +\begin{align} +H_1(\omega) &= \frac{S_{fx}(\omega)}{S_{ff}(\omega) + S_{nn}(\omega)} \\\
+H_2(\omega) &= \frac{S_{xx}(\omega) + S_{mm}(\omega)}{S_{xf}(\omega)} +\end{align} +\end{subequations}

+

where \(S_{mm}(\omega)\) and \(S_{nn}(\omega)\) are the autospectra of the noise on the output and input, \(m(t)\) and \(n(t)\) respectively.

+

One suggestion which has been made is to define the FRF as the geometric mean of the two standard estimates:

+

\begin{equation} +H_v(\omega) = \sqrt{H_1(\omega) H_2(\omega)} +\end{equation}

+

Low coherence can arise when more than one excitation is applied to the structure. +Another possibility is that the structure is not completely linear. +Here again, the measured response cannot be completely attributed to the measured excitation.

+
Noise-free FRF estimates
+

A third estimator for the FRF can be defined in cases of random excitation, which is called the instrumental variable estimate, or \(H_3(\omega)\).

+

This formula for the FRF is only possible if more than the usual two channels are being measured simultaneously. +The formula is of interest because it does provide an estimate for the FRF which is unbiased by noise on either the force or the response transducer signals. +The formula is:

+

\begin{equation} +H_3(\omega) = \frac{S_{xv}(\omega)}{S_{fv}(\omega)} +\end{equation}

+

where \(v(t)\) is a third signal in the system, such as the voltage supplied to the exciter, and it exploits the fact that noise on either input (force) or output (response) channels does not contaminate cross-spectral density estimates in the way that auto spectra are affected.

+
Leakage
+

It is known that a low coherence can arise in a measurement where the frequency resolution of the analyzer is not fine enough to describe adequately the very rapidly changing functions such as are encountered near resonance and anti-resonance on lightly-damped structures.

+

This is known as a bias error and leakage is often the most likely source of low coherence on lightly-damped structures as shown on figure fig:coherence_resonance.

+

+
+ Figure 18: Coherence \(\gamma^2\) and FRF estimate \(H_1(\omega)\) for a lightly damped structure
+

Figure 18: Coherence \(\gamma^2\) and FRF estimate \(H_1(\omega)\) for a lightly damped structure

+
+
+ +

It can be shown that near resonance, \(H_2(\omega)\) is a much more accurate representation of the true FRF than \(H_1(\omega)\). +When this situation is encountered, the best solution is usually to make a zoom measurement as explained previously.

+
Postscript
+

It is sometimes though that a poor coherence can be eliminated by taking many averages, but this is only possible if the reason for the low coherence is random noise which can be averaged out over a period of time. +If the reason if more systematic than that, the averaging will not help.

+

Lastly, mention should be made here of a type of excitation referred to as “periodic random” which is, in fact, a combination of pseudo-random and “true” random. +In this process, a pseudo-random (or periodic) excitation is generated and after a few cycles, a measurement of the input and the now steady-state response is made. +Then, a different pseudo-random sequence is generated, the procedure repeated and the result treated as the second sample in what will develop to be an ensemble of random samples. +The advantage over the simple random excitation is that due to the essential periodic nature of each of the pseudo-random samples, there are no leakage or bias errors in any of the measurements. +However, the cost is an increase in the measurement time as one has to wait for the steady response condition.

+

Transient excitation

+

There are three types of excitation to be included in this section because they all share the same principle for their signals processing. +They are:

+
    +
  1. Burst excitation: a short section of signal
  2. +
  3. Rapid sine sweep (chirp) excitation
  4. +
  5. Impact excitation from a hammer blow
  6. +
+

The first and second of these generally require an attached shaker, but the last one can be implemented with a hammer.

+

The principle which all these signals share is that the excitation and the consequent response are completely contained within the single sample of measurement which is made. +In practice, it is common to repeat the transient even more than once and to average the results to get the final result. +How they differ is in the exact form of the transient excitation signal and in the nature of the repeated application.

+

In the burst type of signal, we have an excitation which is applied and analyzed as if it were a continuous signal, taking the successive samples for averaging one immediately after the other. +For the chirp and impulse excitations, each individual sample is collected and processed before making the next one, and averaged.

+
Burst excitation signals
+

Burst excitation signals consist of short sections of an underlying continuous signal (which may be a sine wave, a sine sweep or a random signal), followed by a period of zero output, resulting in a response which shows a transient build-up followed by a decay (see figure fig:burst_excitation).

+

+
+ Figure 19: Example of burst excitation and response signals
+

Figure 19: Example of burst excitation and response signals

+
+
+ +

The duration of the burst is under the control of the operator and it is selected so as to provide the ideal signal processing conditions, which are essentially that the response signal has just died away by the end of the measurement period. +If this condition has not been attained (burst too long), then leakage error will result. +If it has been reached well before the end of the period (burst too short), then the signal quality will be poor.

+

The final measurement will be the result of averaging several samples. +In the case of the burst sine excitation, each sample would be expected to be identical so that the averaging serves only to remove noise on the signals. +In the case of burst random, however, each individual burst will be different to the other and so in this case there is an element of averaging randomly varying behavior, a feature which is believed in some cases to enhance the measurement in the presence of weak non-linearities in the test structure.

+
Chirp excitation
+

The chirp consist of a short duration signal which has the form shown in figure fig:chirp_excitation.

+

The frequency content of the chirp can be precisely chosen by the starting and finishing frequencies of the sweep.

+

+
+ Figure 20: Example of chirp excitation and response signals
+

Figure 20: Example of chirp excitation and response signals

+
+
+ +
Impulsive excitation
+

The hammer blow produces an input and response as shown in the figure fig:impulsive_excitation.

+

This and the chirp excitation are very similar in the analysis point of view, the main difference is that the chirp offers the possibility of greater control of both amplitude and frequency content of the input and also permits the input of a greater amount of vibration energy.

+

+
+ Figure 21: Example of impulsive excitation and response signals
+

Figure 21: Example of impulsive excitation and response signals

+
+
+ +

The frequency content of the hammer blow is dictated by the materials involved and is rather more difficult to control. +However, it should be recorded that in the region below the first cut-off frequency induced by the elasticity of the hammer tip structure contact, the spectrum of the force signal tends to be very flat.

+

On some structures, the movement of the structure in response to the hammer blow can be such that it returns and rebounds on the hammer tip before the user has had time to move that out of the way. +In such cases, the spectrum of the excitation is seen to have “holes” in it at certain frequencies (figure fig:double_hits).

+

+
+ Figure 22: Double hits time domain and frequency content
+

Figure 22: Double hits time domain and frequency content

+
+
+ +

In order to perform the required Fourier analysis of all these cases of transient signals, an assumption is made that the data obtained from a single event can be regarded as representing one period of a quasi-periodic process. +This means that if exactly the same input was applied \(T\) seconds after the first one, then exactly the same response would be observed.

+

This can be difficult to obtain especially for lightly damped structures as the signal will take long time to die away. +In that case, one solution is to lengthen the period \(T\), but often this is not easily changeable. +A window applied to the raw data provides a more practical solution. +It is recommended to apply an exponential window to both signals. +By choosing an appropriate exponential decay rate, the modified signal can be made to have effectively died away by the end of the prescribed measurement period, thereby satisfying the signal processing needs.

+

However, one should be cautious when using such windowing as complex modes can be extracted from data treated this way.

+

An alternative to this problem is to use the zoom facility. +One of the consequences of using a zoom is that the frequency band is reduced by a proportionate amount. +However, by making a number (equal to the zoom factor) of separate measurements, each one for a different zoom band, it is possible to construct and FRF over the entire frequency range of interest with both the advantage of it being a window-free measurement and having a much finer frequency resolution.

+

One the pseudo-periodicity is established, a discrete Fourier series description can be obtained of both the input and response signals. +The FRF can be computed from +\[ H(\omega_k) = \frac{X(\omega_k)}{F(\omega_k)} \]

+

Alternately, the force signals can be treated in the same way as for random excitation, and the formulae for \(H_1(\omega)\) and \(H_2(\omega)\) are used. +However, care must be exercise when interpreting the results since the coherence function has different significance here.

+

One of the parameters indicated by the coherence is the statistical reliability of an estimate based on a number of averages of a random process. +In the case of an FRF estimate obtained by treating the signals from a succession of nominally identical impacts as a random process, we must note that, strictly, each such sample is a deterministic, and not probabilistic, calculation and should contain no statistical uncertainty.

+

Thus, the main source for low coherence in this instance can only be leakage errors, non-linearity or high noise levels, not the same situation as for random excitation.

+

Another feature usually employed in transient testing is that of making a whole series of repeat measurements under nominally identical conditions and then averaging FRF estimates. +The idea behind this is that any one measurement is likely to be contaminated by noise, especially in the frequency regions away from resonance where the response levels are likely to be quite low. +While this averaging technique does indeed enhance the resulting plots, it may well be that several tens of samples need to be acquired before a smooth FRF plot is obtained and this will diminish somewhat any advantage of speed which is a potential attraction to the method.

+

Calibration

+

For all measurement processes, it is necessary to calibrate the equipment which is used. +In the case of FRF measurements, there are two levels of calibration which should be made:

+
    +
  • The first of these is a periodic absolute calibration of individual transducers (of force and response) to check that their sensitivities are sensibly the same as those specified by the manufacturer. +Any marked deviation could indicate internal damage
  • +
  • The second type of calibration is one which can and should be carried out during each test, preferably twice, once at the outset and again at the end. +This type of calibration is one which provides the overall sensitivity of the complete instrumentation system without examining the performance of the individual elements.
  • +
+

The first type of calibration is quite difficult to make accurately as it requires independent measurement of the quantity of interest. +The use of another transducer of the same type is not satisfactory as it is not strictly an independent measure. +Optical devices can be used for the calibration of displacement sensors.

+

One of the reasons why the absolute type of calibration has not been further developed for this particular application is the availability of a different type of calibration which is particularly attractive and convenient. +The parameters measured in a modal analysis are usually ratios between response and force levels, and so what is required is the ability to calibrate the whole measurement system. +The voltage measured are related to the physical quantities (force and acceleration) by the sensitivities of the respective transducers:

+

\begin{subequations} +\begin{align} +v_f &= E_f f \\\
+v_{\ddot{x}} &= E_{\ddot{x}} \ddot{x} +\end{align} +\end{subequations}

+

As mentioned, the difficulty is to determine the individual values for \(E_f\) and \(E_{\ddot{x}}\). +In practice, we only ever use the measured voltages as a ratio to obtain the FRF +\[ \frac{\ddot{x}}{f} = \frac{v_{\ddot{x}}}{v_f} \frac{E_f}{E_{\ddot{x}}} = E \frac{v_{\ddot{x}}}{v_f} \] +and so what is required is the ratio of the two sensitivities:

+

\begin{equation} +E = \frac{E_f}{E_{\ddot{x}}} +\end{equation}

+

The overall sensitivity can be more readily obtained by a calibration process because we can easily make an independent measurement of the quantity now being measured: the ratio of response to force. +Suppose the response parameter is acceleration, then the FRF obtained is inertance which has the units of \(1/\text{mass}\), a quantity which can readily be independently measured by other means.

+

Figure fig:calibration_setup shows a typical calibration setup.

+

+
+ Figure 23: Mass calibration procedure, measurement setup
+

Figure 23: Mass calibration procedure, measurement setup

+
+
+ +

A calibration procedure of this type has the distinct advantage that it is very easy to perform and can be carried out with all the measurement equipment. +Thus, frequent checks on the overall calibration factors are strongly recommended, ideally as the beginning and end of each test.

+

Mass Cancellation

+

It is very important the ensure that the force is measured directly at the point at which it is applied to the structure, rather than deducing its magnitude from the current flowing in the shaker coil or other similar indirect processes. +This is because near resonance, the actual applied force becomes very small and is thus very prone to inaccuracy.

+

This same argument applies on a lesser scale as we examine the detail around the attachment to the structure, as shown in figure fig:mass_cancellation.

+

+
+ Figure 24: Added mass to be cancelled (crossed area)
+

Figure 24: Added mass to be cancelled (crossed area)

+
+
+ +

Here, we see part of the structure, an accelerometer and a force transducer. +The dashed line shows the plane at which the force is actually measured. +Now, assuming that the extra material (shown by the cross hatching) behaves as a rigid mass \(m^*\), we can state that the force actually applied to the structure \(f_t\) is different from that measured by the transducer \(f_m\) by an amount dependent on the acceleration level at the drive point \(\ddot{m}\) according to

+

\begin{equation} +f_t = f_m - m^* \ddot{x} +\end{equation}

+

Physically, what is happening is that some of the measured force is being “used” to move the additional mass so that the force actually applied to the structure is the measured force minus the inertia force of the extra mass.

+

Now, the frequency response quantity we actually require is \(A_t(\omega)\) although we have measurements of \(\ddot{X}\) and \(F_m\) only, yielding to \(A_m(\omega)\). +If we express it in its real and imaginary parts, we obtain:

+

\begin{align*} +\text{Re}(F_t) &= \text{Re}(F_m) - m^* \text{Re}(\ddot{X}) \\\
+\text{Im}(F_t) &= \text{Im}(F_m) - m^* \text{Im}(\ddot{X}) +\end{align*}

+

And

+

\begin{align*} +\text{Re}(1/A_t) &= \text{Re}(1/A_m) - m^* \\\
+\text{Im}(1/A_t) &= \text{Im}(1/A_m) +\end{align*}

+

Mass cancellation is important when the mass to be cancelled (\(m^*\)) is of the same order as the apparent mass of the modes of the structure under test, and this latter is a quantity which varies from point to point on the structure. +If we are near an anti-node of a particular mode, then the apparent mass (and stiffness) will tend to be relatively small and here mass cancellation may be important.

+

One important feature of mass cancellation is that it can only be applied to point measurements (where the excitation and response are both considered at the same point). +This arises because the procedure described above corrects the measured force for the influence of the additional mass at the drive point.

+

It should be noted that the transducer’s inertia is also effective not only in the direction of the excitation but also laterally and in rotation even though they cannot easily be compensated for.

+

Rotational FRF measurement

+

Significance of rotational FRF data

+

\(\SI{50}{%}\) of all DOFs are rotations (as opposed to translations) and \(\SI{75}{%}\) of all frequency response functions involve rotation DOFs. +However, it is relatively rate the find reference to methods for measurements of rotational DOFs. +This situation arises from a considerable difficulty which is encountered when trying to measure either rotational responses or excitations and also when trying to apply rotational excitation.

+

Measurement of Rotational FRFs using two or more transducers

+

There are two problems to be tackled:

+
    +
  1. measurement of rotational responses
  2. +
  3. generation of measurement of rotation excitation
  4. +
+

The first of these is less difficult and techniques usually use a pair a matched conventional accelerometers placed at a short distance apart on the structure to be measured as shown on figure fig:rotational_measurement.

+

+
+ Figure 25: Measurement of rotational response
+

Figure 25: Measurement of rotational response

+
+
+ +

The principle of operation is that by measuring both accelerometer signals, the responses \(x_0\) and \(\theta_0\) can be deduced by taking the mean and difference of \(x_A\) and \(x_B\):

+

\begin{subequations} +\begin{align} +x_0 &= 0.5(x_A + x_B) \\\
+\theta_0 &= (x_A - x_B)/l \label{eq:rotational_diff} +\end{align} +\end{subequations}

+

This approach permits us to measure half of the possible FRFs: all those which are of the \(X/F\) and \(\Theta/F\) type. +The others can only be measured directly by applying a moment excitation.

+

Figure fig:rotational_excitation shows a device to simulate a moment excitation. +First, a single applied excitation force \(F_1\) corresponds to a simultaneous force \(F_0 = F_1\) and a moment \(M_0 = -F_1 l_1\). +Then, the same excitation force is applied at the second position that gives a force \(F_0 = F_2\) and moment \(M_0 = F_2 l_2\). +By adding and subtracting the responses produced by these two separate excitations conditions, we can deduce the translational and rotational responses to the translational force and the rotational moment separately, thus enabling the measurement of all four types of FRF: \(X/F\), \(\Theta/F\), \(X/M\) and \(\Theta/M\).

+

+
+ Figure 26: Application of moment excitation
+

Figure 26: Application of moment excitation

+
+
+ +

Then, the full \(6 \times 6\) mobility matrix can be measured, however this procedure is quite demanding.

+

Other methods for measuring rotational effects include specially developed rotational accelerometers and shakers.

+

However, there is a major problem that is encountered when measuring rotational FRF: the translational components of the structure’s movement tends to overshadow those due to the rotational motions. +For example, the magnitude of the difference in equation eq:rotational_diff is often of the order of \(\SI{1}{%}\) of the two individual values which is similar to the transverse sensitivity of the accelerometers: potential errors in rotations are thus enormous.

+

Multi-point excitation methods

+

Multi-point excitation in general

+

Multi-excitation methods for modal testing, called MIMO test methods, have been developed for FRF data which possesses a high degree of consistency. +There are other benefits:

+
    +
  • the excitation of large structure with multiple points does more closely simulates their vibration environment in service than the single point excitation test
  • +
  • the facility of detecting and identifying double or repeated modes
  • +
  • the need to complete some tests in a very minimum of on-structure time
  • +
+

Although the majority of modal tests are still performed using single-point excitation procedure, multi-point excitation is today well developed and is largely used for aerospace structures.

+

The practical implementation of the different methods currently used are briefly discussed.

+

Appropriation or Normal mode testing

+

We here seek establish vibration in a pure mode of vibration by careful selection of the locations and magnitudes of a set of sinusoidal excitation forces.

+

This works for undamped system’s natural frequencies, and in that case the force and response vectors are exactly in quadrature: +\[ i\{X\} = [H_\text{Re}(\omega) + i H_\text{Im}(\omega)] \{F\} \]

+

It follows that this equation is valid only if \(\det |H_{\text{Re}}(\omega)| = 0\) and this condition provides the basis of a method to locate the undamped system natural frequencies from measured FRF data.

+

Multi-phase stepped-sine (MPSS) testing

+

We here excite a MDOF system at a single sinusoidal frequency \(a\) by a set of \(p\) excitation forces \(\{F\}e^{i\omega t}\) such that there is a set of steady-state responses \(\{X\}e^{i\omega t}\). +The two vectors are related by the system’s FRF properties as:

+

\begin{equation} +\{X\}_{n\times 1} = [H(\omega)]_{n\times p} \{F\}_{p\times 1} +\end{equation}

+

However, it is not possible to derive the FRF matrix from the single equation eq:mpss_equation, because there will be insufficient data in the two vectors (one of length \(p\), the other of length \(n\)) to define completely the \(n\times p\) FRF matrix.

+

What is required is to make a series of \(p^\prime\) measurements of the same basic type using different excitation vectors \(\{F\}_i\) that should be chosen such that the forcing matrix \([F]_{p\times p^\prime} = [\{F\}_1, \dots, \{F\}_p]\) is non-singular. +This can be assured if:

+
    +
  • there are at least as many vectors as there are forces: \(p^\prime > p\)
  • +
  • the individual force vectors are linearly independent of each other
  • +
+

A second matrix is also constructed containing the response vectors \([X]_{n\times p^\prime} = [\{X\}_1, \dots, \{X\}_{p^\prime}]\). +Now, these two collections of measured data can be used to determine the required FRF matrix:

+

\begin{equation} +[H(\omega)]_{n\times p} = [X]_{n\times p^\prime} [F]_{p^\prime \times p}^+ +\end{equation}

+

where \(+\) denotes the generalized inverse of the forcing matrix.

+

Multi-point random (MPR) testing

+
Concept
+

In this method, advantage is taken of the incoherence of several uncorrelated random excitations which are applied simultaneously at several points. +Then, the need to repeat the test several times, as was necessary for the MPSS method, is avoided.

+

The purpose of this methods is to obtain the FRF data in an optimal way and to reduce the probability of introducing systematic errors to the FRF measurements.

+

Let’s consider the simplest form of a multi excitation as that of a system excited by two simultaneous forces \(f_1(t)\) and \(f_2(t)\) where the response \(x_i(t)\) is of particular interest. +We can derive expressions for the required FRF parameters functions of the auto and cross spectral densities between of three parameters of interest:

+

\begin{subequations} +\begin{align} +H_{i1}(\omega) &= \frac{S_{1i}S_{22} - S_{2i}S_{12}}{S_{11}S_{22} - S_{12}S_{21}}\\\
+H_{i1}(\omega) &= \frac{S_{2i}S_{11} - S_{1i}S_{21}}{S_{11}S_{22} - S_{12}S_{21}} +\end{align} +\end{subequations}

+

These expressions can be used provided that \(S_{11}S_{22}\neq |S_{12}|^2\) which is equivalent of that the two excitation forces must not be fully correlated.

+
General formulation
+

In practice, the method is applied using different numbers of exciters, and several response points simultaneously. +We have that

+

\begin{equation} +[H_{xf}(\omega)]_{n\times p} = [S_{xf}(\omega)]_{n\times p} [S_{ff}(\omega)]_{p\times p}^{-1} +\end{equation}

+

where it can be seen that the matrix of spectral densities for the forces \([S_{ff}(\omega)]_{p\times p}\) must be non singular. +Thus, care must be taken in practice to ensure this condition, noting that it is the applied forces and not the signal sources which must meet the requirement.

+

In practice, this is difficult to obtain as even if the input signals to the exciters’ amplifiers are uncorrelated, the forces applied to the structure will certainly not be. This is particularly true near the resonances as the dynamic response is dominated by the one mode which is independent of the actual force pattern.

+
Coherence in MPR measurements
+

In a similar way in which we defined coherence for the SISO system, we can make use of the same concepts for a MIMO system. +During a MIMO test, we basically measure three matrices: +\[ [S_{ff}(\omega)]; \ [S_{xx}(\omega)]; \ [S_{fx}(\omega)] \] +Then, we can derive an estimate for the FRF matrix: +\[ H_1(\omega)^T = [S_{ff}(\omega)]^{-1} [S_{fx}(\omega)] \] +and then compute an estimate for the autospectrum of the response from:

+

\begin{align*} +[\tilde{S}_{xx}(\omega)] &= [H_1^*(\omega)] [S_{fx}(\omega)] \\\
+&= [S_{xf}(\omega)] [S_{ff}(\omega)]^{-1} [S_{fx}(\omega)] +\end{align*}

+

Now, by comparing the estimated response spectrum \([\tilde{S}_{xx}(\omega)]\) with the actual measurement \([S_{xx}(\omega)]\), we obtain a formula for the multiple coherence between the two parameters \(\{f(t)\}\) and \(\{x(t)\}\):

+

\begin{equation*} +\tcmbox{[\gamma^2(\omega)] = [S_{xx}(\omega)]^{-1} [S_{xf}(\omega)] [S_{ff}(\omega)]^{-1} [S_{fx}(\omega)]} +\end{equation*}

+

Multiple-reference impact tests

+

This class of hammer excitation is referred to as Multi-reference Impact Tests (MRIT). +Typically, three response references are measured (often, the \(x\), \(y\) and \(z\) components at the response measurement location) every time a hammer blow is applied to the structure.

+

FRF data collected by performing a test in this way will be the equivalent of exciting the structure at three points simultaneously while measuring the response at each of the \(n\) points of interest. +Thus, in the same sense that a multiple-input test is a multi-reference measurement (measuring several columns of the FRF matrix), so too is the MRIT since it provides a multi-reference measurement including several rows of the same FRF matrix.

+ +

Introduction

+

Introduction to the concept of modal analysis

+

This section describes some of the many procedures that are used for Modal Analysis and attempts to explain their various advantages and limitations. +These methods generally consists of curve-fitting a theoretical expression for an individual FRF to the actual measured data.

+
+
+
    +
  1. part of single FRF curve
  2. +
  3. complete curve encompassing several resonances
  4. +
  5. a set of many FRF plots all on the same structure
  6. +
+
+

In every case, the task is basically to find the coefficients in a theoretical expression for the FRF which then most closely matches the measured data.

+

This phase of the modal test procedure is often referred to as modal parameter extraction or modal analysis.

+

Types of modal analysis

+

A majority of current curve-fitting methods operate on the response characteristics in the frequency domain, but there are other procedures which perform a curve-fit in the time domain. These latter methods are based on the fact that the Impulse Response Function is another characteristic function of the system.

+

Modal analysis methods can be classified into a series of different groups.

+
+
+

It depends on the domain in which the analysis is performed:

+
    +
  • frequency domain of FRFs
  • +
  • Time domain of IRFs
  • +
+
+
+
+

Next, it is appropriate to consider the frequency range over which each individual analysis will be performed. +Either a single mode is to be extracted at a time, or several:

+
    +
  • SDOF methods
  • +
  • MDOF methods
  • +
+
+
+
+

A further classification relates to the number of FRFs which are to be included in a single analysis:

+
    +
  • SISO: the FRF are measured individually
  • +
  • SIMO: a set of FRF are measured simultaneously at several response points but under the same single-point excitation. +This describes the FRFs in a column or row of the FRF matrix
  • +
  • MIMO: the responses at several points are measured simultaneously while the structure is excited at several points, also simultaneously
  • +
+
+

Difficulties due to damping

+

Many of the problems encounter in practice are related to the difficulties associated with the reliable modeling of damping effects. +In practice, we are obliged to make certain assumptions about what model is to be used for the damping effects. +Sometimes, significant errors can be obtained in the modal parameter estimates (and not only in the damping parameters), as a result of a conflict between the assumed damping behavior and that which actually occurs in reality.

+

Another difficulty is that of real modes and complex modes. +In practice, all modes of practical structures are expected to be complex, although in the majority of cases, such complexity will be very small, and often quite negligible.

+

Difficulties of model order

+

One problem is determining how many modes are there in the measured FRF.

+

This question is one of the most difficult to resolve in many practical situations where a combination of finite resolution and noise in the measured data combined to make the issue very unclear.

+

Many modern modal analysis curve-fitters are capable of fitting any FRF of almost any order, however, it might fit fictitious modes introduced in the analysis process. +Correct differentiation between genuine and fictitious modes remains a critical task in many modal tests.

+

Preliminary checks of FRF data

+

Visual Checks

+

Before starting the modal analysis of any measured FRF data, it is always important to do a few simple checks in order to ensure that no obvious error is present in the data. +Most of the checks are made using a log log plot of the modulus of the measured FRF.

+
Low-frequency asymptotes
+

If the structure is grounded, then we should clearly see a stiffness-like characteristic, appearing as asymptotic to a stiffness line at the lowest frequencies (below the first resonance) and the magnitude of this should correspond to that of the static stiffness of the structure at the point in question.

+

If the structure has been tested in a free condition, then we should expect to see a mass-line asymptote where its magnitude may be deduced from purely rigid-body considerations.

+

Deviations from this expected behavior may be caused by the frequency range of measurement not extending low enough to see the asymptotic trend, or they may indicate that the required support conditions have not in fact been achieved.

+
High-frequency asymptotes
+

In the upper end of the frequency range, is it sometimes found (especially on point mobility measurements), that the curve becomes asymptotic to a mass line or, more usually to a stiffness line. +Such situation can result in considerable difficulties for the modal analysis process and reflects a situation where the excitation is being applied at a point of very high mass of flexibility. +Then, modal parameters are difficult to extracts as they are overwhelmed by the dominant local effects.

+
Incidence of anti-resonances
+

For a point FRF, there must be antiresonance after each resonances, while for transfer FRFs between two points well-separated on the structure, we should expect more minima than antiresonances.

+

A second check to be made is that the resonance peaks and the antiresonances exhibit the same sharpness on a log-log plot:

+
    +
  • Frequency resolution limitation will cause blunt resonances
  • +
  • Inadequate vibration levels results in poor definition of the antiresonance regions
  • +
+
Overall shape of FRF skeleton
+

The relative position of the resonance, antiresonances and ambient levels of the FRF curve can give information on the validity of the data. +This will be further explained.

+
Nyquist plot inspection
+

When plotting the FRF data in a Nyquist format, we expect that each resonance traces out at least part of a circular arc, the extent of which depends largely on the interaction between adjacent modes. +For a system with well-separated modes, it is to be expected that each resonance will generate the major part of a circle, but when modal interference increases, only small segments will be identifiable. +However, within these bounds, the Nyquist plot should ideally exhibit a smooth curve, and failure to do so may be an indication of a poor measurement technique.

+

Assessment of multiple-FRF data set using SVD

+

When several FRFs are acquired (either from SIMO or MIMO data), the Singular Value Decomposition has proved to be a very useful tool to check the quality, reliability and order of the data.

+

The set of FRF which are to be assessed is stored in a series of vectors \(\{H_{jk}(\omega)\}\) each of which contains the values for one FRF at all measured frequencies \(\omega = \omega_1, \dots, \omega_L\). +These vectors are assembled into a matrix +\[ [A]_{L\times np} = [\{H_{11}(\omega)\}_{L\times 1} \{H_{21}(\omega)\}_{L\times 1} \dots \{H_{np}(\omega)\}_{L\times 1} ] \] +where \(n\) and \(p\) represent the number of measured DOFs and the number of excitation points. +\(L\) represents the number of frequencies at which the FRF data are defined.

+
+
+

\begin{equation} +[A]_{L\times np} = [U]_{L\times L} [\Sigma]_{L\times np} [V]_{np\times np}^T +\end{equation}

+
+
+
+
    +
  • The singular values \(\sigma_1, \dots, \sigma_w\) describes the amplitude information
  • +
  • Number of non-zero singular values represents the order of the system (i.e. the number of independent modes of vibration which effectively contribute to the measured FRFs)
  • +
  • The columns of \([U]\) represent the frequency distribution of these amplitudes
  • +
  • The columns of \([V]\) represent their spatial distribution
  • +
+
+
+
+

From the SVD, we can compute a new matrix \([P]_{L\times np}\) which is referred to as the Principal Response Function (PRF) matrix. +Each column of the PRF contains a response function corresponding to one of the original FRFs:

+

\begin{equation} +[U]_{L\times L} [\Sigma]_{L\times np} = [P]_{L\times np} +\end{equation}

+

Then, each PRF is, simply, a particular combination of the original FRFs, and thus each FRF contains all the essential information included in those FRFs (eigenvalues for instance).

+
+

On example of this form of pre-processing is shown on figure fig:PRF_numerical for a numerically-simulation test data, and another in figure fig:PRF_measured for the case of real measured test data.

+

The second plot fig:PRF_numerical_svd helps to determine the true order of the system because the number of non-zero singular values is equal to this parameter. +The third plot fig:PRF_numerical_PRF shows the genuine modes distinct from the computational modes.

+
+
+

It can be seen that the PRFs tend to tall into two groups:

+
    +
  • The most prominent are a set of response function, each of which has a small number of dominant peaks. +It represents the physical modes of the system.
  • +
  • The lower group shows less distinct and clear-cut behavior. +It represents the noise or computational modes present in the data.
  • +
+

The two groups are usually separated by a clear gap (depending of the noise present in the data):

+
    +
  • If such gap is present, then is will be possible to extract the properties of the \(m\) modes which are active in the measured responses over the frequency range covered.
  • +
  • If not, then it may be impossible to perform a successful modal parameter extraction.
  • +
+
+

+
+ Table 19: + FRF and PRF characteristics for numerical model +
+ + + + + + + + + + + + + + + + + + + + +
FRF Singular Values PRF
width=\linewidthwidth=\linewidthwidth=\linewidth
+

+
+ Table 20: + FRF and PRF characteristics for measured model +
+ + + + + + + + + + + + + + + + + + + + +
FRF Singular Values PRF
width=\linewidthwidth=\linewidthwidth=\linewidth
+

Mode Indicator Functions (MIFs)

+
General
+

The Mode Indicator Functions are usually used on \(n\times p\) FRF matrix where \(n\) is a relatively large number of measurement DOFs and \(p\) is the number of excitation DOFs, typically 3 or 4.

+

In these methods, the frequency dependent FRF matrix is subjected to an eigenvalue or singular value decomposition analysis which thus yields a small number (3 or 4) of eigen or singular values, these also being frequency dependent.

+

These methods are used to determine the number of modes present in a given frequency range, to identify repeated natural frequencies and to pre process the FRF data prior to modal analysis.

+
Complex mode indicator function (CMIF)
+

The Complex Mode Indicator Function is defined simply by the SVD of the FRF (sub) matrix.

+
+
+

This decomposition, is defined as

+

\begin{align*} +[H(\omega)]_{n\times p} &= [U(\omega)]_{n\times n} [\Sigma(\omega)]_{n\times p} [V(\omega)]_{p\times p}^H\\\
+[CMIF(\omega)]_{p\times p} &= [\Sigma(\omega)]_{p\times n}^T [\Sigma(\omega)]_{n\times p} +\end{align*}

+
+

The actual mode indicator values are provided by the squares of the singular values and are usually plotted as a function of frequency in logarithmic form as shown in figure fig:mifs:

+
    +
  • Natural frequencies are indicated by large values of the first CMIF (the highest of the singular values)
  • +
  • double or multiple modes by simultaneously large values of two or more CMIF.
  • +
+

Associated with the CMIF values at each natural frequency \(\omega_r\) are two vectors:

+
    +
  • the left singular vector \(\{U(\omega_r)\}_1\) which approximates the mode shape of that mode
  • +
  • the right singular vector \(\{V(\omega_r)\}_1\) which represents the approximate force pattern necessary to generate a response on that mode only
  • +
+

+
+ Figure 27: Complex Mode Indicator Function (CMIF)
+

Figure 27: Complex Mode Indicator Function (CMIF)

+
+
+ +
+
+

In addition to identifying all the significant natural frequencies, the CMIF can also be used to generate a set of enhanced FRFs from the formula:

+

\begin{equation} +[EFRF(\omega)]_{n\times p} = [H(\omega)]_{n\times p} [V(\omega)]_{p\times p} +\end{equation}

+

There is one non-trivial EFRF for each mode, the result of which is an almost SDOF characteristic response function which is then readily amenable to modal analysis by the simplest of methods.

+

As in the previous case, these modified FRFs are simply linear combinations of the original measured data and, as such, contain no more and no less information than in their original form.

+

However, such an approach lends itself to a very reliable extraction of the global properties (eigenvalues) for the measured FRF data set which can then be re-visited in a second stage to determine the local properties (mode shapes) for all the measured DOFs.

+
+
Other MIFs
+

There are multiple variants on the mode indicator function concepts. Some use the eigenvalue decomposition instead of the singular value decomposition. +Two are worth mentioning: the Multivariable Mode Indicator Function (MMIF) and the Real Mode Indicator Function (RMIF).

+

SDOF Modal Analysis Methods

+

Review of SDOF modal analysis methods

+

The “SDOF” approach does not imply that the system being modeled is reduced to a single degree of freedom, that that just one resonance is considered at a time.

+

There are limitations to such simple approach, the principal one being that very close modes cannot easily be separated.

+

There are several implementations of the basic concept of SDOF analysis, ranging from the simple peak-picking method, through the classic circle-fit approach to more automatic algorithms such as the inverse FRF “he-fit” method and the general least-squares methods.

+

As the name implies, the method exploits the fact that in the vicinity of a resonance, the behavior of the system is dominated by a single mode (the magnitude is dominated by one of the terms in the series).

+

The general expression of the receptance FRF

+

\begin{equation} +\alpha_{jk}(\omega) = \sum_{s=1}^N \frac{{}_sA_{jk}}{\omega_s^2 - \omega^2 + i \eta_s \omega_s^2} +\end{equation}

+

can be rewritten as:

+

\begin{equation} +\alpha_{jk}(\omega) = \frac{{}_rA_{jk}}{\omega_r^2 - \omega^2 + i \eta_r \omega_r^2} + \sum_{\substack{s=1\s \neq r}}^N \frac{{}_sA_{jk}}{\omega_s^2 - \omega^2 + i \eta_s \omega_s^2} +\end{equation}

+
+
+

Now, the SDOF assumption is that for a small range of frequency in the vicinity of the natural frequency of mode \(r\), \(\alpha_{jk}(\omega)\) can be approximated as

+

\begin{equation} +\alpha_{jk}(\omega)_{\omega\approx\omega_r} = \frac{{}_rA_{jk}}{\omega_r^2 - \omega^2 + i \eta_r \omega_r^2} + {}_rB_{jk} +\end{equation}

+
+

This does not mean that the other modes are unimportant or negligible (their influence can be considerable), but rather that their combined effect can be represented as a constant term around this resonance.

+

SDOF Modal Analysis I - Peak-Amplitude method

+

In this method, it is assumed that close to one local mode, any effects due to the other modes can be ignored. +This is a method which works adequately for structures whose FRF exhibit well separated modes. +This method is useful in obtaining initial estimates to the parameters.

+

The peak-picking method is applied as follows (illustrated on figure fig:peak_amplitude):

+
    +
  1. +

    First, individual resonance peaks are detected on the FRF plot and the maximum responses frequency \(\omega_r\) is taken as the natural frequency of that mode

    +
  2. +
  3. +

    Second, the local maximum value of the FRF \(|\hat{H}|\) is noted and the frequency bandwidth of the function for a response level of \(|\hat{H}|/\sqrt{2}\) is determined. +The two points thus identified as \(\omega_b\) and \(\omega_a\) are the “half power points”

    +
  4. +
  5. +

    The damping of the mode in question can now be estimated from of the following formulae:

    +

    \begin{subequations} +\begin{align} +\eta_r &= \frac{\omega_a^2 - \omega_b^2}{2 \omega_r^2} \approx \frac{\Delta\omega}{\omega_r} \\\
    +2\xi_r &= \eta_r +\end{align} +\end{subequations}

    +
  6. +
  7. +

    We now obtain an estimate for the modal constant of the mode being analyzed by assuming that the total response in this resonant region is attributed to a single term in the general FRF series:

    +

    \begin{equation} +|\hat{H}| = \frac{A_r}{\omega_r^2 \eta_r} \Leftrightarrow A_r = |\hat{H}| \omega_r^2 \eta_r +\end{equation}

    +
  8. +
+

It must be noted that the estimates of both damping and modal constant depend heavily on the accuracy of the maximum FRF level \(|\hat{H}|\) which is difficult to measure with great accuracy, especially for lightly damped systems. +Only real modal constants and thus real modes can be deduced by this method.

+

+
+ Figure 28: Peak Amplitude method of modal analysis
+

Figure 28: Peak Amplitude method of modal analysis

+
+
+ +

Alternatives of this method can be applied using the real part of the receptance FRF instead of the modulus plot.

+

SDOF Modal Analysis II - Circle Fit Method

+
Properties of the modal circle
+

MDOF systems produce Nyquist plots of FRF data which include sections of near circular arcs corresponding to the regions near the natural frequencies. +This characteristic provides the basic of the “SDOF circle-fit method".

+

We here use structural damping and we use the receptance form of FRF data as this will produces an exact circle in a Nyquist plot. +However, if it is required to use a model incorporating viscous damping, then the mobility version of the FRF data should be used.

+

In the case of a system assumed to have structural damping, the basic function with which we are dealing is

+

\begin{equation} +\alpha(\omega) = \frac{1}{\omega_r^2\left( 1 - \left(\omega/\omega_r\right)^2 + i\eta_r \right)} +\end{equation}

+

since the only effect of including the modal constant \({}_rA_{jk}\) is to scale the size of the circle by \(|{}_rA_{jk}|\) and to rotate it by \(\angle {}_rA_{jk}\). +A plot of the quantity \(\alpha(\omega)\) is given in figure fig:modal_circle.

+

+
+ Table 21: + Modal Circle +
+ + + + + + + + + + + + + + + + + +
Properties \(\omega_b\) and \(\omega_a\) points
width=\linewidthwidth=\linewidth
+

For any frequency \(\omega\), we have the following relationship:

+

\begin{subequations} +\begin{align} +\tan \gamma &= \frac{\eta_r}{1 - (\omega/\omega_r)^2}\\\
+\tan(\SI{90}{\degree}-\gamma) &= \tan\left(\frac{\theta}{2}\right) = \frac{1 - (\omega/\omega_r)^2}{\eta_r} \label{eq:modal_circle_tan} +\end{align} +\end{subequations}

+

From eq:modal_circle_tan, we obtain:

+

\begin{equation} +\omega^2 = \omega_r^2 \left(1 - \eta_r \tan\left(\frac{\theta}{2}\right) \right) +\end{equation}

+

If we differentiate eq:modal_circle_omega with respect to \(\theta\), we obtain:

+

\begin{equation} +\frac{d\omega^2}{d\theta} = \frac{-\omega_r^2 \eta_r}{2} \frac{\left(1 - (\omega/\omega_r)^2\right)^2}{\eta_r^2} +\end{equation}

+

The reciprocal of this quantity is a measure of the rate at which the locus sweeps around the circular arc. +It may be seen to reach a maximum value when \(\omega=\omega_r\):

+

\begin{equation} +\tcmbox{\frac{d}{d\omega} \left(\frac{d\omega^2}{d\theta}\right) = 0 \text{ when } \omega_r^2 - \omega^2 = 0} +\end{equation}

+

It may also be seen that an estimate of the damping is provided by the sweep rate:

+

\begin{equation} +\tcmbox{\left(\frac{d\theta}{d\omega^2}\right)_{\omega=\omega_r} = -\frac{2}{\omega_r^2 \eta_r}} +\end{equation}

+

Suppose now we have two specific points on the circle, one corresponding to a frequency \(\omega_b\) below the natural frequency and the other one \(\omega_a\) above the natural frequency. +Referring to figure fig:modal_circle_bis, we can write:

+

\begin{subequations} +\begin{align} +\tan\left(\frac{\theta_b}{2}\right) &= \frac{1 - (\omega_b/\omega_r)^2}{\eta_r}\\\
+\tan\left(\frac{\theta_a}{2}\right) &= \frac{(\omega_a/\omega_r)^2 - 1}{\eta_r} +\end{align} +\end{subequations}

+

From these two equations, we can obtain an expression for the damping of the mode:

+

\begin{equation} +\tcmbox{\eta_r = \frac{\omega_a^2 - \omega_b^2}{\omega_r^2 \left(\tan(\theta_a/2) + \tan(\theta_b/2)\right)}} +\end{equation}

+

which is an exact expression and applies for all levels of damping.

+

If we take two points for which \(\theta_a = \theta_b = \SI{90}{\degree}\), we obtain:

+

\begin{subequations} +\begin{align} +\eta_r &= \frac{\omega_2^2 - \omega_1^2}{2 \omega_r^2}\\\
+\eta_r &= \frac{\omega_2 - \omega_1}{\omega_r} \text{ for light damping} +\end{align} +\end{subequations}

+

When scaled by a modal constant \({}_rA_{jk}\) added in the numerator, the diameter of the circle will be +\[ {}_rD_{jk} = \frac{\left|{}_rA_{jk}\right|}{\omega_r^2 \eta_r} \] +and the whole circle will be rotated so that the principal diameter (the one passing through the natural frequency point) is oriented at an angle \(\arg({}_rA_{jk})\) to the negative Imaginary axis.

+

For SDOF system with viscous damping, rather than structural damping, the mobility is +\[ Y(\omega) = \frac{i\omega}{(k - \omega^2 m) + i \omega c} \]

+

And we have

+

\begin{equation} +\tan\left(\frac{\theta}{2}\right) = \frac{1 - (\omega/\omega_r)^2}{2 \xi \omega/\omega_r} +\end{equation}

+

From points at \(\omega_a\) and \(\omega_b\), we obtain

+

\begin{subequations} +\begin{align} +\xi &= \frac{\omega_a^2 - \omega_b^2}{2 \omega_r \left( \omega_a \tan(\theta_a/2) + \omega_b \tan(\theta_b/2) \right)}\\\
+&= \frac{\omega_a - \omega_b}{\omega_r \left( \tan(\theta_a/2) + \tan(\theta_b/2) \right)} \text{ for light damping} +\end{align} +\end{subequations}

+

Finally, selecting two points for which \(\theta_a = \theta_b = \SI{90}{\degree}\):

+

\begin{equation} +\xi = \frac{\omega_2 - \omega_1}{2 \omega_r} +\end{equation}

+
Circle-fit analysis procedure
+

The sequence is:

+
    +
  1. Select points to be used.
  2. +
  3. Fit circle, calculate quality of fit. +It is generally done by a least-square algorithm. +Then we obtain the center and radius of the circle and the quality factor is the mean square deviation of the chosen points from the circle.
  4. +
  5. Locate natural frequency, obtain damping estimate. +The rate of sweep through the region is estimated numerically and the frequency at which it reaches the maximum is deduced. +At the same time, an estimate of the damping is derived using eq:estimate_damping_sweep_rate. +A typical example is shown on figure fig:circle_fit_natural_frequency.
  6. +
  7. Calculate multiple damping estimates, and scatter. +A set of damping estimates using all possible combination of the selected data points are computed using eq:estimate_damping. +Then, we can choose the damping estimate to be the mean value. +We also look at the distribution of the obtained damping estimates as is permits a useful diagnostic of the quality of the entire analysis: +
      +
    • Good measured data should lead to a smooth plot of these damping estimates, any roughness of the surface can be explained in terms of noise in the original data.
    • +
    • However, any systematic distortion of the plot is almost certainly caused by some form of error in the data, in the analysis or in the assumed behavior of the system.
    • +
    +
  8. +
  9. Determine modal constant modulus and argument. +The magnitude and argument of the modal constant is determined from the diameter of the circle and from its orientation relative to the Real and Imaginary axis.
  10. +
+

+
+ Figure 29: Location of natural frequency for a Circle-fit modal analysis
+

Figure 29: Location of natural frequency for a Circle-fit modal analysis

+
+
+ +

Then, the theoretically regenerated FRF can be plotted against the original measured data for comparison. +In order to determines the contribution of other modes on the resonance of mode \(r\), the distance from the top of the principal diameter to the origin has to be measured and is equal to \({}_rB_{jk}\).

+

SDOF Modal Analysis III - Inverse or Line-fit method

+
Properties of inverse FRF plots
+

The original version of this method uses the fact that a function which generates a circle when plotted in the complex plane will, when plotted as a reciprocal, trace out a straight line. +Thus, if we were to plot the reciprocal of receptance of a SDOF system with structural damping, we would find that in the Argand diagram it produces a straight line:

+

\begin{subequations} +\begin{align} +\alpha(\omega) &= \frac{(k - \omega^2 m) - i d}{(k - \omega^2 m)^2 + d^2}\\\
+\frac{1}{\alpha(\omega)} &= (k - \omega^2 m) + i d +\end{align} +\end{subequations}

+

First, a least squares best-fit straight line is constructed through the data points and an estimate for the damping parameters is immediately available from the intercept of the line with the Imaginary axis. +Furthermore, an indication of the reliability of that estimate may be gained from the nature of the deviations of the data points from the line itself. +We can here determine whether the damping is structural (imaginary part constant with frequency) or viscous (imaginary part linear with frequency).

+

Then, a second least squares operation is performed, this time on the deviation between the real part of the measured data points and that of the theoretical model. +Resulting from this, we obtain estimates for the mass and stiffness parameters.

+

It should be noted that this approach is best suited to systems with real modes and to relatively well-separated modes.

+
General inverse analysis method
+

It has been shown that if a purely SDOF system FRF is plotted in this way, then both plots demonstrate straight lines, and separately reveal useful information about the mass, stiffness and damping properties of the measured system.

+

The inverse FRF of a MDOF system is not as convenient as SDOF system as:

+

\begin{align*} +H_{jk}^{-1} (\omega) &= \frac{1}{\sum (k - \omega^2 m) + i \omega c}\\\
+&\neq \sum \frac{1}{(k - \omega^2 m) + i \omega c} +\end{align*}

+

Thus, in order to determine the modal parameters of a MDOF system using inverse method, some modifications to the basic formulation must be found.

+

We start with the basic formula for SDOF analysis: +\[ \alpha_{jk}(\omega)_{\omega\simeq\omega_r} \simeq \frac{{}_rA_{jk}}{\omega_r^2 - \omega^2 + i \eta_r \omega_r^2} + {}_rB_{jk} \] +We can note that the presence of the \({}_rB_{jk}\) term is problematic for the inverse plot.

+

The trick is to define a new FRF term \(\alpha^\prime_{ik}(\omega)\) which is the difference between the actual FRF and the value of the FRF at one fixed frequency \(\Omega\) in the range of interest called “fixing frequency": +\[ \alpha^\prime_{jk}(\omega) = \alpha_{jk}(\omega) - \alpha_{jk}(\Omega) \] +from which the inverse FRF parameter that we shall use for the modal analysis \(\Delta(\omega)\), can be defined as:

+

\begin{align*} +\Delta(\omega) &= (\omega^2 - \Omega^2)/\alpha^\prime_{jk}(\omega)\\\
+&= \text{Re}(\Delta) + i \text{Im}(\Delta) +\end{align*}

+

It can be seen that +\[ \text{Re}(\Delta) = m_R \omega^2 + c_R; \quad \text{Im}(\Delta) = m_I \omega^2 + c_I \] +and that

+

\begin{align*} +m_R &= a_R(\Omega^2 - \omega_r^2) - b_r (\omega_r^2 \eta_r) \\\
+m_I &= -b_R(\Omega^2 - \omega_r^2) - a_r (\omega_r^2 \eta_r) \\\
+{}_rA_{jk} &= a_R + i b_r +\end{align*}

+

The first step of our analysis procedure can be made, as follows:

+
    +
  1. Using the FRF data measured in the vicinity of the resonance \(\omega_r\), choose the fixing frequency \(\Omega_j\) and then calculate \(\Delta(\omega)\)
  2. +
  3. Plot these values on \(\text{Re vs } \omega^2\) and \(\text{Im vs }\omega^2\) plots and compute the best fit straight line in order to determine \(m_R(\Omega_j)\) and \(m_I(\Omega_j)\)
  4. +
+

Now it can be shown that both these straight line slopes \(m_R\) and \(m_I\) are simple functions of \(\Omega\), and we can write: +\[ m_R = n_R \Omega^2 + d_R \text{ and } m_I = n_I \Omega^2 + d_I \] +where

+

\begin{equation} +\begin{aligned} +n_R &= a_r; \quad n_I = -b_r \\\
+d_R &= -b_r(\omega_r^2 \eta_r) - a_r \omega_r^2; \quad d_I = b_r \omega_r^2 - a_r\omega_r^2\eta_r +\end{aligned} +\end{equation}

+

Now let \(p = n_I/n_R \text{ and } q = d_I/d_R\), and noting that

+

\begin{equation} +\begin{aligned} +\eta_r &= \frac{q - p}{1 + pq}; \quad \omega_r^2 = \frac{d_R}{(p\eta_r - 1)n_R} \\\
+a_r &= \frac{\omega_r^2(p\eta_r - 1)}{(1 + p^2)d_R}; \quad b_r = -a_r p +\end{aligned} +\end{equation}

+

we now have sufficient information to extract estimates for the four parameters for the resonance which has been analyzed: \(\omega_r, \eta_r, \text{ and } {}_rA_{jk} = a_r + i b_r\).

+
    +
  1. Plot graphs of \\(m\_R(\Omega)\\) vs \\(\Omega^2\\) and of \\(m\_I(\Omega)\\) vs \\(\Omega^2\\) using the results from step 1., each time using a different measurement points as the fixing frequency \\(\Omega\_j\\)
  2. +
  3. Determine the slopes of the best fit straight lines through these two plots, \\(n\_R\\) and \\(n\_I\\), and their intercepts with the vertical axis \\(d\_R\\) and \\(d\_I\\)
  4. +
  5. Use these four quantities, and equation [eq:modal_parameters_formula](#eq:modal_parameters_formula), to determine the **four modal parameters** required for that mode
  6. +
+

This procedure which places more weight to points slightly away from the resonance region is likely to be less sensitive to measurement difficulties of measuring the resonance region.

+

Residuals

+
Concept of residual terms
+

We need to introduce the concept of residual terms, necessary in the modal analysis process to take account of those modes which we do not analyze directly but which nevertheless exist and have an influence on the FRF data we use.

+

The first occasion on which the residual problem is encountered is generally at the end of the analysis of a single FRF curve, such as by the repeated application of an SDOF curve-fit to each of the resonances in turn until all modes visible on the plot have been identified. +At this point, it is often desired to construct a theoretical curve (called “regenerated"), based on the modal parameters extracted from the measured data, and to overlay this on the original measured data to assess the success of the curve-fit process. +Then the regenerated curve is compared with the original measurements, the result is often disappointing, as illustrated in figure fig:residual_without. +However, by the inclusion of two simple extra terms (the “residuals"), the modified regenerated curve is seen to correlate very well with the original experimental data as shown on figure fig:residual_with.

+

+
+ Table 22: + Effects of residual terms on FRF regeneration +
+ + + + + + + + + + + + + + + + + +
without residual with residuals
width=\linewidthwidth=\linewidth
+

If we regenerate an FRF curve from the modal parameters we have extracted from the measured data, we shall use a formula of the type

+

\begin{equation} +H_{jk}(\omega) = \sum_{r = m_1}^{m_2} \frac{{}_rA_{jk}}{\omega_r^2 - \omega^2 + i \eta_r \omega_r^2} +\end{equation}

+

in which \(m_1\) and \(m_2\) reflects that we do not always start at the first mode (\(r = 1\)) and continue to the highest mode (\(r = N\)).

+

However, the equation which most closely represents the measured data is:

+

\begin{equation} +H_{jk}(\omega) = \sum_{r = 1}^{N} \frac{{}_rA_{jk}}{\omega_r^2 - \omega^2 + i \eta_r \omega_r^2} +\end{equation}

+

which may be rewritten as

+

\begin{equation} +H_{jk}(\omega) = \left( \sum_{r=1}^{m_1-1} + \sum_{r=m_1}^{m_2} + \sum_{r = m_2+1}^{N} \right) \frac{{}_rA_{jk}}{\omega_r^2 - \omega^2 + i \eta_r \omega_r^2} +\end{equation}

+

The three terms corresponds to:

+
    +
  1. the low frequency modes not identified
  2. +
  3. the high frequency modes not identified
  4. +
  5. the modes actually identified
  6. +
+

These three terms are illustrated on figure fig:low_medium_high_modes.

+

+
+ Figure 30: Numerical simulation of contribution of low, medium and high frequency modes
+

Figure 30: Numerical simulation of contribution of low, medium and high frequency modes

+
+
+ +

From the sketch, it may be seen that within the frequency range of interest:

+
    +
  • the first term tends to approximate to a mass-like behavior
  • +
  • the third term approximates to a stiffness effect
  • +
+

Thus, we have a basis for the residual terms and shall rewrite equation eq:sum_modes:

+

\begin{equation} +H_{jk}(\omega) \simeq -\frac{1}{\omega^2 M_{jk}^R} + \sum_{r=m_1}^{m_2} \left( \frac{{}_rA_{jk}}{\omega_r^2 - \omega^2 + i \eta_r \omega_r^2} \right) + \frac{1}{K_{jk}^R} +\end{equation}

+

where the quantities \(M_{jk}^R\) and \(K_{jk}^R\) are the residual mass and stiffness for that particular FRF and chosen frequency range.

+
Calculation of residual mass and stiffness terms
+

First, we compute a few values of the regenerated FRF curve at the lower frequencies covered by the tests, using only the identified modal parameters. +Then, by comparing these values with those from actual measurements, we estimate a mass residual constant which, when added to the regenerated curve, brings this closely into line with the measured data.

+

Then, the process is repeated at the top end of the frequency range, this time seeking a residual stiffness. +Often, the process is more effective if there is an antiresonance near either end of the frequency range which this is then used as the point of adjustment.

+

The procedure outlined here may need to be repeated iteratively in case the addition of the stiffness residual term then upsets the effectiveness of the mass term.

+

It should be noted that often there is a physical significance to the residual terms. +If the test structure is freely-supported and its rigid body modes are well below the minimum frequency of measurement, then the mass residual term will be a direct reflection of the rigid body mass and inertia properties of the structure. +The high frequency residual can represent the local flexibility at the drive point.

+
Residual and pseudo modes
+

Sometimes it is convenient to treat the residual terms as if they were modes. +Instead of representing each residual effect by a constant, each can be represented by a pseudo mode. +For the low frequency residual effects, this pseudo mode has a natural frequency below the lowest frequency on the measured FRF, and for the high frequency residual effects, that pseudo mode has a natural frequency which is above the highest frequency of the measured FRF. +These pseudo modes can be conveniently included in the list of modes which have been extracted by modal analysis of that FRF.

+

Using pseudo modes instead of simple residual mass and stiffness terms is a more accurate way of representing the out-of-range modes. +There is one warning, however, and that is to point out that these pseudo modes are not genuine modes and that they cannot be used to deduce the corresponding contributions of these same modes for any other FRF curve.

+

Refinement of SDOF modal analysis methods

+

In the modal analysis methods discussed above, an assumption is made that near the resonance under analysis, the effect of all the other modes could be represented by a constant. +When there are neighboring modes close to the one being analyzed, this assumption may not be valid.

+
+
+

“Close” is begin loosely defined as a situation where the separation between the natural frequencies of two adjacent modes is less than the typical damping level, both measured as percentage.

+
+

However, we can usually remove that restriction and thereby make a more precise analysis of the data.

+

We can write the receptance in the frequency range of interest as:

+

\begin{equation} +\begin{aligned} +H_{jk}(\omega) &= \sum_{s=m_1}^{m_2} \left( \frac{{}_sA_{jk}}{\omega_s^2 - \omega^2 + i \eta_s \omega_s^2} \right) + \frac{1}{K_{jk}^R}-\frac{1}{\omega^2 M_{jk}^R} \\\
+&= \left( \frac{{}_rA_{jk}}{\omega_r^2 - \omega^2 + i\eta_r \omega_r^2} \right) \\\
+&+ \left(\sum_{\substack{s=m_1\s \neq r}}^{m_2} \frac{{}_sA_{jk}}{\omega_s^2 - \omega^2 + i\eta_s \omega_s^2} + \frac{1}{K_{jk}^R} - \frac{1}{\omega^2 M_{jk}^R} \right) +\end{aligned} +\end{equation}

+

In the previous methods, the second term was assumed to be a constant in the curve-fit procedure for mode \(r\). +However, if we have good estimates for the coefficients which constitutes the second term, for example by having already completed an SDOF analysis, we may remove the restriction on the analysis. +Indeed, suppose we take a set of measured data points around the resonance at \(\omega_r\), and that we can compute the magnitude of the second term in eq:second_term_refinement, we then subtract this from the measurement and we obtain adjusted data points that are conform to a true SDOF behavior and we can use the same technique as before to obtain improved estimated to the modal parameters of more \(r\).

+

This procedure can be repeated iteratively for all the modes in the range of interest and it can significantly enhance the quality of found modal parameters for system with strong coupling.

+

MDOF Modal analysis in the frequency domain (SISO)

+

General Approach

+

There are a number of situations in which the SDOF approach to modal analysis is inadequate and for these there exist several alternative methods which may generally be classified as MDOF modal analysis methods. +These situations are generally those with closely coupled modes where the single mode approximation is inappropriate and those with extremely light damping for which measurements at resonance are inaccurate.

+
+
+

Three approach to curve-fit the entire FRF in one step are considered here:

+
    +
  1. a general approach to multi-mode curve-fitting
  2. +
  3. a method based on the rational fraction FRF formulation
  4. +
  5. a method particularly suited to very lightly-damped structures
  6. +
+
+

Method I - General Curve Fit approach - Non-linear Least Squares (NLLS)

+

We shall denote the individual FRF measured data as: +\[ H_{jk}^m(\Omega_l) = H_l^m \] +while the corresponding “theoretical” values are:

+

\begin{equation} +\begin{aligned} +H_l &=H_{jk}(\Omega_l) \\\
+&= \sum_{s=m_1}^{m_2}\frac{{}_sA_{jk}}{\omega_s^2 - \Omega_l^2 + i \eta_s \omega_s^2} + \frac{1}{K_{jk}^R} - \frac{1}{\Omega_l^2 M_{jk}^R} +\end{aligned} +\end{equation}

+

where the coefficients \({}_1A_{jk}, {}_2A_{jk}, \dots, \omega_1, \omega_2, \dots, \eta_1, \eta_2, \dots, K_{jk}^R \text{ and }M_{jk}^R\) are all to be determined.

+

We can define an individual error as:

+

\begin{equation} +\epsilon_l = H_l^m - H_l +\end{equation}

+

and express this as a scalar quantity:

+

\begin{equation} +E_l = \left| \epsilon_l^2 \right| +\end{equation}

+

If we further increase the generality by attaching a weighting factor \(w_l\) to each frequency point of interest, then the curve fit process has to determine the values of the unknown coefficients such that the total error:

+

\begin{equation} +E = \sum_{l = 1}^p w_l E_l +\end{equation}

+

is minimized.

+

This is achieved by differentiating eq:error_weighted with respect to each unknown in turn, thus generating a set of as many equations as there are unknown:

+

\begin{equation} +\frac{d E}{d q} = 0; \quad q = {}_1A_{jk}, {}_2A_{jk}, \dots +\end{equation}

+

Unfortunately, this set of equations are not linear in many of the coefficients and thus cannot be solved directly. +It is from this point that the differing algorithms choose their individual procedures: making various simplifications, assumptions or linearizing the expressions.

+

Method II - Rational Fraction Polynomial Method (RFP)

+

The method which has emerged as one the standard frequency domain modal analysis methods is that known as the Rational Fraction Polynomial (RFP) method. +This method is a special version of the general curve fitting approach but is based on a different formulation for the theoretical expression used for the FRF.

+
+
+

\begin{subequations} +\begin{align} +H(\omega) &= \sum_{r=1}^N \frac{A_r}{\omega_r^2 - \omega^2 + 2 i \omega \omega_r \xi_r} \label{eq:frf_clasic} \\\
+&= \frac{b_0 + b_1(i\omega) + \dots + b_{2N-1}(i\omega)^{2N-1}}{a_0 + a_1(i\omega) + \dots + a_{2N}(i\omega)^{2N}} \label{eq:frf_rational} +\end{align} +\end{subequations}

+

In this formulation, we have adopted the viscous damping model.

+
+

The unknown coefficients \(a_0, \dots, a_{2N}, b_0, \dots, b_{2N-1}\) are not the modal properties but are related to them and are computed in a further stage of processing.

+

The particular advantage of this approach is the possibility of formulating the curve fitting problem as a linear set of equations, thereby making the solution amenable to a direct matrix solution.

+

We shall denote each of our measured FRF data point by \(\hat{H}_k\), where \(\hat{H}_k = \hat{H}(\omega_k)\), and define the error between that measured value and the corresponding value derived from the curve-fit expression as

+

\begin{equation} +e_k = \frac{b_0 + b_1(i\omega_k) + \dots + b_{2m-1}(i\omega_k)^{2m-1}}{a_0 + a_1(i\omega_k) + \dots + a_{2m}(i\omega_k)^{2m}} - \hat{H}_k +\end{equation}

+

leading to the modified, but more convenient version actually used in the analysis

+

\begin{equation} +\begin{aligned} +e_k^\prime &= \left( b_0 + b_1(i\omega_k) + \dots + b_{2m-1}(i\omega_k)^{2m-1} \right)\\\
+&- \hat{H}_k\left( a_0 + a_1(i\omega_k) + \dots + a_{2m}(i\omega_k)^{2m} \right) +\end{aligned} +\end{equation}

+

In these expressions, only \(m\) modes are included in the theoretical FRF formula: the true number of modes, \(N\), is actually one of the unknowns to be determined during the analysis. +Equation eq:rpf_error can be rewritten as follows:

+

\begin{equation} +\begin{aligned} +e_k^\prime &= \begin{Bmatrix} 1 & i \omega_k & \dots & (i\omega_k)^{2m-1} \end{Bmatrix} +\begin{Bmatrix} b_0 \ \vdots \ b_{2m-1} \end{Bmatrix}\\\
+&- \hat{H}_k \begin{Bmatrix} 1 & i\omega_k & \dots & (i\omega_k)^{2m-1} \end{Bmatrix} +\begin{Bmatrix} a_0 \ \vdots \ a_{2m-1} \end{Bmatrix}\\\
+&- \hat{H}_k (i\omega_k)^{2m} a_{2m} +\end{aligned} +\end{equation}

+

and the \(L\) linear equations corresponding to \(L\) individual frequency points can be combined in matrix form:

+

\begin{equation} +\begin{aligned} +\{E^\prime\}_{L \times 1} &= [P]_{L\times 2m} \{b\}_{2m\times 1}\\\
+&- [T]_{L\times(2m+1)} \{a\}_{(2m+1)\times 1}\\\
+&- \{W\}_{L\times 1} +\end{aligned} +\end{equation}

+

Solution for the unknown coefficients \(a_j, \dots, b_k, \dots\) is achieved by minimizing the error function

+

\begin{equation} +J = \{E^*\}^T\{E\} +\end{equation}

+

and this leads to

+

\begin{equation} +\begin{bmatrix} +[Y] & [X] \\\
+[X]^T & [Z] +\end{bmatrix}_{L \times (4m+1)} +\begin{Bmatrix} +\{b\} \ \{a\} +\end{Bmatrix}_{(4m+1) \times 1} += \begin{Bmatrix} +\{B\} \ \{F\} +\end{Bmatrix}_{L \times 1} +\end{equation}

+

where \([X], [Y], [Z], \{G\}\) and \(\{F\}\) are known measured quantities:

+

\begin{equation} +\begin{aligned} +[Y] &= \text{Re}\left( [P^*]^T[P] \right);\quad [X] = \text{Re}\left( [P^*]^T[T] \right); \\\
+[Z] &= \text{Re}\left( [T^*]^T[T] \right); \\\
+\{G\} &= \text{Re}\left( [P^*]\{W\} \right);\quad \{F\} = \text{Re}\left( [T^*]\{W\} \right); +\end{aligned} +\end{equation}

+

Once the solution has been obtained for the coefficients \(a_k, \dots , b_k, \dots\) then the second stage of the modal analysis can be performed in which the required modal parameters are derived. +This is usually done by solving the two polynomial expressions which form the numerator and denominator of equations eq:frf_clasic and eq:frf_rational:

+
    +
  • the denominator is used to obtain the natural frequencies \(\omega_r\) and damping factors \(\xi_r\)
  • +
  • the numerator is used to determine the complex modal constants \(A_r\)
  • +
+

In order to determine the order, the analysis is repeated using different assumed values for the order \(m\) and are compared. +For each analysis, there will be properties found for as many modes as prescribed by the chosen model order. +Some of these will be genuine modes while others will be fictitious modes. +Various strategies may be adopted to separate the fictitious and real modes:

+
    +
  • measuring the difference between the original FRF curve and that regenerated using the modal properties derived
  • +
  • measuring the consistency of the various modal parameters for different model order choices and eliminating those which vary widely from run to run
  • +
+

In all these checks, interest is concentrated on the repeatability of the various modal properties: modes which reappear for all choices of data and model condition are believed to be genuine, while those which vary from run to run are more likely to have computational features due to the curve-fitting requirements as their origins, rather than physical ones.

+

Method III - Lightly Damped Structures

+

It is found that some structures do not provide FRF data which respond very well to the above modal analysis procedures mainly because of the difficulties encountered in acquiring good measurements near resonance.

+

For such structures, it is often the case that interest is confined to an undamped model of the test structure since the damping in a complete structural assembly is provided mostly from the joints and not from the components themselves. +Thus, there is scope for an alternative method of modal analysis which is capable of providing the required modal properties, in this case natural frequencies and real modal constants, using data measured away from the resonance regions.

+

The requirements for the analysis are as follows:

+
    +
  1. measure the FRF over the frequency range of interest
  2. +
  3. locate the resonances and note the corresponding natural frequencies
  4. +
  5. select individual FRF measurement data points from as many frequencies as there are modes, plus two, confining the selection to points away from resonance
  6. +
  7. using the data thus gathered, compute the modal constants
  8. +
  9. construct a regenerated curve and compare this with the full set of measured data points
  10. +
+

Global modal analysis methods in the frequency domain

+

General Approach

+

More recent curve fitting procedures are capable of performing a multi curve fit instead of just working with individual FRF curves. +They fit several FRF curves simultaneously, taking due account of the fact that the properties of all the individual curves are related by being from the same structure: +all FRF plots on a given testpiece should indicate the same values for natural frequencies and damping factor of each mode.

+

Such methods have the advantage of producing a unique and consistent model as direct output.

+
+
+

A way in which a set of measured FRF curves may be used collectively, rather than singly, is by the construction of a single Composite Response Function:

+

\begin{equation} +\sum_j\sum_k H_{jk}(\omega) = \sum_j\sum_k\sum_{r=1}^N (\dots) = HH(\omega) +\end{equation}

+

with +\[ H_{jk} = \sum_{r=1}^n \frac{{}_rA_{jk}}{\omega_r^2 - \omega^2 + i \eta_r \omega_r^2} \]

+
+

The composite function \(HH(\omega)\) can provide a useful means of determining a single (average) value for the natural frequency and damping factor for each mode where the individual functions would each indicate slightly different values. +As an example, a set of mobilities measured are shown individually in figure fig:composite_raw and their summation shown as a single composite curve in figure fig:composite_sum.

+

+
+ Table 23: + Set of measured FRF +
+ + + + + + + + + + + + + + + + + +
Individual curves Composite curve
width=\linewidthwidth=\linewidth
+

The global analysis methods have the disadvantages first, that the computation power required is high and second that there may be valid reasons why the various FRF curves exhibit slight differences in their characteristics and it may not always be appropriate to average them.

+

Global Rational Fraction Polynomial Method (GRFP)

+

The basic Rational Fraction Polynomial (RFP) method that was described in the context of single FRF curve can be generalized to multi-FRF data. +Indeed, all the FRFs from the same structure will have identical numerator polynomials. +The number of unknown coefficients in a problem where there are \(n\) measured FRFs and \(m\) modes of vibration is of the order \((n+1)(2m + 1)\).

+

Global SVD method

+

A set of FRFs with a signal reference (such as are contained within a column from the complete FRF matrix) can be referred to the underlying modal model of the structure (assumed to have viscous damping) by the equation:

+

\begin{align*} +\{H(\omega)\}_k &= \begin{Bmatrix} H_{1k}(\omega) \ \vdots \ H_{nk}(\omega) \ \end{Bmatrix}_{n\times 1} \\\
+&= [\Phi]_{n\times N} \{g_k(\omega)\}_{N\times 1} + \{R_k(\omega)\}_{n\times 1} +\end{align*}

+

where \(\{R_k(\omega)\}\) is a vector containing the relevant residual terms and \(\{g_k(\omega)\}\) is defined as: +\[ \{g_k(\omega)\}_{N\times 1} = [i \omega - s_r]_{N\times N}^{-1} \{\phi_k\}_{N\times 1} \]

+

Also +\[ \{\dot{H}(\omega)\}_k = [\Phi] [s_r] \{g_k(\omega)\} + \{\dot{R}_k(\omega)\} \]

+

Next, we can write the following expressions

+

\begin{equation} +\begin{aligned} +\{\Delta H(\omega_i)\}_k &= \{H(\omega_i)\}_k - \{H(\omega_{i+c})\}_k \\\
+&\approx [\Phi] \{\Delta g_k(\omega_i)\}_{N\times 1} \\\
+\{\Delta \dot{H}(\omega_i)\}_k &\approx [\Phi] [s_r] \{\Delta g_k(\omega_i)\}_{N\times 1} +\end{aligned} +\end{equation}

+

If we now consider data at several different frequencies \(i = 1, 2, \dots, L\), we can write

+

\begin{equation} +\begin{aligned} +[\Delta H_k]_{n\times L} &= [\Phi] [\Delta g_k]_{N\times L} \\\
+[\Delta \dot{H}_k]_{n\times L} &= [\Phi] [s_r] [\Delta g_k]_{N\times L} +\end{aligned} +\end{equation}

+

We can construct an eigenvalue problem: +\[ \left( [\Delta \dot{H}_k]^T - s_r [\Delta H_k]^T \right) \{z\}_r = \{0\} \] +where +\[ [z] = [\Phi]^{+T} \]

+

If we solve \([z] = [\Phi]^{+T}\) using the SVD, we can determine the rank of the FRF matrices and thus the correct number of modes \(m\) to be identified, leading to the appropriate eigenvalues \(s_r;\ r=1, \dots, m\).

+

Then, in order to determine the mode shapes, the modal constants can be recovered from:

+

\begin{equation} +\begin{aligned} +\begin{Bmatrix} H_{jk}(\omega_1) \ \vdots \ H_{jk}(\omega_L) \ \end{Bmatrix}_{L\times 1} = &\begin{bmatrix} +(i\omega_1 - s_1)^{-1} & (i\omega_1 - s_2)^{-1} & \dots \\\
+(i\omega_2 - s_1)^{-1} & (i\omega_2 - s_2)^{-1} & \dots \\\
+\vdots & \dots & \dots \\\
+\vdots & \dots & (i\omega_L - s_m)^{-1} \\\
+\end{bmatrix}\\\
+&\begin{Bmatrix} +{}_1A_{jk}\ \vdots \ {}_mA_{jk} +\end{Bmatrix}_{m\times 1} +\end{aligned} +\end{equation}

+

Using this approach, it is possible to extract a consistent set of modal parameters for the model whose FRFs have been supplied.

+

Concluding comments

+

In the task of extracting modal model parameters from measured test data, the analyst must rely on the skill of others who have coded the various analysis algorithms since these are generally complex. +Because of this, the analyst must develop the various skills which enable him to select the most appropriate analysis procedure for each case and to make the best interpretation of the output of these analysis methods.

+

In this chapter, we have first highlighted the need for accuracy and reliability in the measured data that is the source of a modal analysis. +If these data are not of high quality, the resulting modal model cannot be expected to be any better. +Thus, attention must be paid at the initial phases to ascertain and to assure the necessary quality of the raw data. +Question as to the correct order for the model and the most appropriate model for damping are often foremost among these early interpretations.

+

A hierarchy of different types of modal analysis procedure have been cataloged, from the simple SDOF one-mode-at-a-time for a single response function, through MDOF methods which reveal several modes at a time, to global analysis methods where several modes are extracted simultaneously from several FRFs.

+

Derivation of Mathematical Models

+

Introduction

+

We consider now the derivation of a mathematical model to describe the dynamic behavior of the test structure. +Various types of model exists and are suitable in different cases. +The most important aspect of the modeling process is to decide exactly which type of model we should seek before setting out on the acquisition and processing of experimental data.

+

Three main categories of model are identified:

+
    +
  • Spatial model: mass, stiffness and damping
  • +
  • Modal model: natural frequencies, mode shapes
  • +
  • Response model: frequency response functions
  • +
+

There exist complete models of each type and the more realistic incomplete models we are obliged to consider in practical cases.

+

The three types of model are usually derived as \(\text{Spatial}\Rightarrow\text{Modal}\Rightarrow\text{Response}\) for theoretical analysis, and conversely, as \(\text{Response}\Rightarrow\text{Modal}\Rightarrow\text{Spatial}\) for an experimental study. +We may now view them in a different order, according to the facility with which each may be derived from the test data: Modal, Response and then Spatial. +This reflects the quantity of the completeness of data required in each case.

+
+
+

A modal model can be constructed using just one single mode, and including only a handful of degrees of freedom, even though the structure has many modes and many DOFs. +Such a model can be built up by adding data from more modes, but it is not a requirement that all the modes should be included nor even that all the modes in the frequency range of interest be taken into account. +Thus such a model may be derived with relatively few, or equally, with many data.

+
+
+
+

The response type of model in the form of a FRF matrix, such as the mobility matrix, also needs only to include information concerning a limited number of point of interest: not all the DOFs need be considered. +However, in this case, it is generally required that the model be valid over a specified frequency range, and here it is necessary that all the modes in that range be included. +Also, some account should be taken of the modes whose natural frequencies lie outside of the range of interest to allow for the residual effects. +Thus, the response type of model demands more data to be collected from the tests.

+
+
+
+

A representative spatial model can only be obtained if we have measured most of the modes of the structure and if we have made measurements at a great many of the DOFs it possesses. +This is generally a very demanding requirement to meet, and as result, the derivation of a spatial model from test data is very difficult to achieve.

+
+

This chapter is organized with the following structure:

+
    +
  1. We shall describe what data must be measured in order to construct a suitable model and what checks can be made to access the reliability of the model.
  2. +
  3. We shall discuss a number of techniques for “refining” the model which is obtained from the test so that it matches a number of features of the analytical model. +For instance, it is common to extract complex mode shapes from the test data on real structures but the analytical models are usually undamped so that their modes are real.
  4. +
  5. We may wish to expand our experimental model, or, alternatively, reduce the theoretical ones so that the two models which are to be compared are at least of the same order.
  6. +
  7. We shall explore some of the properties of the models which can be derived by the means described here.
  8. +
+ +

Requirements to construct modal model

+

A modal model of a structure consists of two matrices:

+
    +
  • one containing the natural frequencies and damping factors: the eigenvalues
  • +
  • one which describes the shapes of the corresponding modes: the eigenvectors
  • +
+

Thus, we can construct such a model with just a single mode, and a more complete model is assembled simply by adding together a set of these single-mode descriptions.

+

The basic method of deriving a modal model is as follows. +First, we note that from a single FRF curve, \(H_{jk}(\omega)\), it is possible to extract certain modal properties for the \(r^\text{th}\) mode by modal analysis:

+

\begin{equation} +H_{jk}(\omega) \longrightarrow \omega_r, \eta_r, {}_rA_{jk}; \quad r=1, m +\end{equation}

+

Now, although this gives us the natural frequency and damping properties directly, it does not explicitly yield the mode shape: only a modal constant \({}_rA_{jk}\) which is formed from the mode shape data. +In order to extract the individual elements \(\phi_{jr}\) of the mode shape matrix \([\Phi]\), it is necessary to make a series of measurements of specific FRFs including, especially, the point FRF at the excitation position. +If we measure \(H_{kk}\), then by using eq:modal_model_from_frf, we also obtain the specific elements in the mode shape matrix corresponding to the excitation point:

+

\begin{equation} +H_{kk}(\omega) \longrightarrow \omega_r, \eta_r, {}_rA_{jk} \longrightarrow \phi_{kr}; \quad r=1, m +\end{equation}

+

If we then measure an associated transfer FRF using the same excitation position, such as \(H_{jk}\), we are able to deduce the mode shape element corresponding to the new response point \(\phi_{jr}\) using the fact that the relevant modal constants may be combined with those from the point measurement:

+

\begin{equation} +\tcmbox{\phi_{jr} = \frac{{}_rA_{jk}}{\phi_{kr}}} +\end{equation}

+

Hence, we find that in order to derive a modal model referred to a particular set of \(n\) coordinates, we need to measure and analysis a set of \(n\) FRF curves, all sharing the same excitation point and thus constituting one point FRF and \((n-1)\) transfer FRFs. +In terms of the complete FRF matrix, this corresponds to measure the individual FRF of one entire column. +It is also possible to measure one row of the FRF matrix. This corresponds of a set of \(n\) FRF curves sharing the same measurement point and varied excitation point.

+

Often, several additional elements from the FRF matrix would be measured to provide a check, or to replace poor data, and sometimes measurement of a complete second column or row might be advised in order to ensure that one or more modes have not been missed by an unfortunate choice of exciter location. +Indeed, if the exciter is placed at a nodal point of one of the modes, then there would be no indications at all of the existence of that mode because every modal constant would be zero for that mode. +It may then require more than one measurement to confirm that we are not exciting the structure at a nodal point.

+

Once all the selected FRF curves have been measured and individually analyzed, we obtain a set of modal properties containing more data than needed:

+
    +
  • we may have determined many separate estimates for the natural frequencies and damping factors as these parameters are extracted from each FRF curve
  • +
  • in the even we have measured more than one row or one column for the FRF matrix, we also obtain separate estimates for the mode shapes
  • +
+

The simplest procedure is to average all the individual estimates that results in means values \(\tilde{\omega}_r\) and \(\tilde{\eta}_r\). +In practice, not all the estimates should carry equal weight because some would probably be derived from much more satisfactory curve fits than others. +A refined procedure would be to calculate a weighted mean of all the estimate using the quality factor obtained from the curve-fit procedure.

+

If we choose to accept a revised value for \(\omega_r\) and \(\eta_r\) of a particular mode, then the value for the modal constant should also be revised:

+

\begin{equation} +{}_r\tilde{A}_{jk} = {}_rA_{jk}\frac{\tilde{\omega}_r^2 \tilde{\eta}_r}{\omega_r^2 \eta_r} +\end{equation}

+

The final reduced model obtained consist of the two matrices which constitute a modal model, namely: +\[ \left[ \omega_r^2(1 + i\eta_r) \right]_{m\times m};\quad \left[ \Phi \right]_{n\times m} \]

+

Double modes or repeated roots

+

When a structure has two modes that are very close in frequency, it may be impossible to derive a true model for the structure. +All we can define in these circumstances is a single equivalent mode which is, in fact, a combination of the two actual modes that are difficult to identify individually.

+

However, single equivalent modes can lead to erroneous models and it is very important that we can detect the presence of double modes and that we can identify all the modes which are present.

+

The only way repeated modes can be detected and identified in a modal test is by using data from more than on reference. +This means that we must measure FRF data from more than a single row or column (as many rows/columns as there are repeated roots).

+

Constructing models of NSA structures

+

Structures which are classified as Non-Self-Adjoint (NSA) have non-symmetric mass, stiffness or damping matrices. +This often occurs in structures with rotating components. +As a result, we cannot take advantage of the symmetry of the system matrices and just measuring a single row or column of the FRF matrix.

+

In the case of NSA structures, we are required to measure and analyze the elements in both a row and a column of the FRF matrix. +A mathematical explanation is that this class of system have two types of eigenvectors (left-hand and right-hand) and thus there are twice as many eigenvectors elements to identify.

+

Quality checks for modal models

+

It is important to check the reliability of the obtain results. +There are two such checks that can be recommended for this phase of the process.

+

First, it is possible to regenerate FRFs from the modal model. +These FRFs can be compared with measured data that as been used for the modal analysis. +Furthermore, it is also possible to synthesize FRFs that have not yet been measured (and thus not used for the model), and then to measure the corresponding FRF on the structure and to compare. +This test provides a powerful demonstration of the validity of the modal model.

+

A second, more demanding but also more convincing, demonstration of the validity of the modal model is to use the model to predict how the dynamic properties of the test structure will change if it is subjected to a small structural modification, such as can be occasioned by adding a small mass at a selected point. +Then such modification can be made and the real structure, measurements done and compare with the modified model.

+

Refinement of modal models

+

Need for model refinement

+

Several differences exist between most test-derived models and analytical models that make their comparison difficult.

+

The first difference are on the mode shapes:

+
    +
  • test-derived: generally complex
  • +
  • analytical: usually real if we use an undamped model
  • +
+

Objective comparison between complex mode shapes and real mode shapes is then not possible and some refinement of one of the two sets are required.

+

A second incompatibility lies in the difference in the order of the models:

+
    +
  • test-derived: relatively small order given by the number of measured DOFs \(n\)
  • +
  • analytical: generally an order of magnitude greater than \(n\)
  • +
+

There is then a desire to refine one or other model to bring them both to the same size for meaningful comparison.

+

However, all the refinements involve approximations which means that a compromise has been made in order to achieve the greater degree of compatibility which is desired.

+

Complex-to-real conversion

+

As we usually don’t know the nature, extend and distribution of damping present in the system, the analytical model is chosen to be undamped. +We wish here to be able to determine what would be the mode shapes of the tested structure if, by some means, we could remove the damping but leave everything else the same. +Then we should be able to compare the modes.

+
Simple method
+

This simple method is to convert the mode shape vectors from complex to real by taking the modulus of each element and by assigning a phase to each of \(\SI{0}{\degree}\) or \(\SI{180}{\degree}\).

+

Any phase angle of a complex mode shape element which is between \(\SI{-90}{\degree}\) and \(\SI{90}{\degree}\) is set to \(\SI{0}{\degree}\), while those between \(\SI{90}{\degree}\) and \(\SI{270}{\degree}\) are set to \(\SI{180}{\degree}\). +This procedure can become difficult to apply in borderline cases when the phase is poorly defined.

+
Multi point excitation - Asher’s method
+

In this method, the test-derived model based on complex modes is used to synthesize the response that would be produced by the application of several simultaneous harmonic forces in order to establish what those forces would need to be in order to produce a mono-modal response vector.

+

If the optimum set of excitation forces for a given mode can be found, then they represent the forces that are actually being generated by the damping in the system at resonance of that mode. +We can then deduce the dynamic properties of the structure with these effects removed.

+

The sequence of steps required to determine this solution is as follows:

+
    +
  1. Compute \([\alpha(\omega)]\) from the complex modal model
  2. +
  3. Determine the undamped system natural frequencies \(\omega_r\) by solving the equation \(\det|\text{Re}[\alpha(\omega)]|=0\)
  4. +
  5. Calculate the mono-phase vector for each mode of interest using \(\text{Re}[\alpha(\omega)]\{\hat{F}\} = \{0\}\)
  6. +
  7. Calculate the undamped system mode shapes \(\{\psi_u\}\) using the just-derived force vector: \(\{\psi_u\} = \text{Im}[\alpha(\omega)]\{\hat{F}\}\)
  8. +
+
Matrix transformation
+

We here seek a numerical solution to the expression linking the known damped modes and the unknown undamped modes. +The steps are:

+
    +
  1. Assume that \(\text{Re}[T_1]\) is unity and calculate \(\text{Im}[T_1]\) from +\[ \text{Im}[T_1] = -[\text{Re}[\phi_d]]^T [\text{Re}[\phi_d]]^{-1} [\text{Re}[\phi_d]]^T \text{Im}[\phi_d] \]
  2. +
  3. calculate \([M_1]\) and \([K_1]\) from +\[ [M_1] = [T_1]^T[T_1]; \quad [K_1] = [T_1]^T[\lambda^2][T_1] \]
  4. +
  5. Solve the eigen-problem formed by \([M_1]\) and \([K_1]\) leading to +\[ [\omega_r^2]; \quad [T_2] \]
  6. +
  7. Calculate the real modes using +\[ [\phi_u] = [\phi_d][T_1][T_2] \]
  8. +
+

Expansion of models

+
+
+

An important model refinement is called expansion and consist of the addition to the actually measured modal data of estimates for selected DOFs which were not measured for one reason or another.

+
+

Prior to conducting each modal test, decisions have to be made as to which of the many DOFs that exist on the structure will be measured. +These decisions are made for various practical reasons:

+
    +
  • Limited test time
  • +
  • Inaccessibility of some DOFs
  • +
  • Anticipated low importance of motion in certain DOFs
  • +
+

Three approaches to the expansion of measured modes will be mentioned here:

+
    +
  1. Geometric interpolation using spline functions
  2. +
  3. Expansion using the analytical model’s spatial properties
  4. +
  5. Expansion using the analytical model’s modal properties
  6. +
+
+
+

In all three approached, we are in effect seeking a transformation matrix \([T]\) that allows us to construct a long eigenvector \(\{\phi\}_{N\times 1}\) from knowledge of a short (incomplete) one \(\{\phi\}_{n\times 1}\): +\[ \{\phi\}_{N\times 1} = [T]_{N\times n} \{\phi\}_{n\times 1} \]

+
+
Interpolation
+

Simple interpolation has a limited range of application and can only be used on structures which have large regions of relatively homogeneous structure: those with joints of abrupt changes are must less likely to respond to this form of expansion.

+

The method is simply geometric interpolation between the measured points themselves, such as by fitting a polynomial function through the measured points.

+
Expansion using theoretical spatial model - Kidder’s method
+

This interpolation uses a theoretical model’s mass and stiffness matrices in a form of an inverse Guyan reduction procedure.

+

If we partition the eigenvector of interest, \(\{\phi_A\}_r\), into:

+
    +
  • the DOFs to be included: \(\{{}_A\phi_1\}_r\)
  • +
  • the DOFs which are not available from the measurements: \(\{{}_A\phi_2\}_r\)
  • +
+

then we may write:

+

\begin{equation*} +\left( \begin{bmatrix} +{}_AK_{11} & {}_AK_{12}\\\
+{}_AK_{21} & {}_AK_{22} +\end{bmatrix} - \omega_r^2 \begin{bmatrix} +{}_AM_{11} & {}_AM_{12}\\\
+{}_AM_{21} & {}_AM_{22} +\end{bmatrix} \right) \begin{Bmatrix}{}_A\phi_1\{}_A\phi_2\end{Bmatrix} = \{0\} +\end{equation*}

+

We can use this relationship between the measured and unmeasured DOFs as the basic for an expansion of the incomplete measured mode shapes: +\[ \{{}_A\phi_2\}_r = [T_{21}]\{{}_A\phi_1\}_r \] +with +\[ [T_{12}] = - \left( [{}_AK_{22}] - \omega_r^2[{}_AM_{22}] \right)^{-1} \left( [{}_AK_{21}] - \omega_r^2[{}_AM_{21}] \right) \]

+

The relation between the incomplete measured vector to the complete expanded vector is then

+

\begin{equation} +\tcmbox{ \{\tilde{\phi}_X\}_r = \begin{Bmatrix} +{}_X\phi_1 \ {}_X\tilde{\phi}_2 +\end{Bmatrix} = \begin{bmatrix} +[I] \ [T_{21}] +\end{bmatrix} \{{}_X\phi_1\}_r } +\end{equation}

+
Expansion using analytical model mode shapes
+

This method uses the analytical model for the interpolation, but is based on the mode shapes derived from the analytical modal spatial matrices, rather than on these matrices themselves.

+

We may write the following expression which relates the experimental model mode shapes to those of the analytical model:

+

\begin{equation*} +\begin{Bmatrix} +{}_X\phi_1 \ {}_X\phi_2 +\end{Bmatrix} = \begin{bmatrix} +[{}_A\Phi_{11}] & [{}_A\Phi_{12}] \\\
+[{}_A\Phi_{21}] & [{}_A\Phi_{22}] +\end{bmatrix} \begin{Bmatrix} +\gamma_1 \ \gamma_2 +\end{Bmatrix}_r +\end{equation*}

+

The basic of this method is to assume that the measured mode shape submatrix can be represented exactly by the simple relationship (which assumes that \(\{\gamma_2\}_r\) can be taken to be zero):

+

\begin{equation} +\{{}_X\phi_1\}_r = [{}_A\Phi_{11}] \{\gamma_1\}_r +\end{equation}

+

so that an estimate can be provided for the unmeasured part of the eigenvector from

+

\begin{equation} +\begin{aligned} +\{{}_X\tilde{\phi}_2\} &= [T_{21}] \{{}_X\phi_1\}_r \\\
+&= [{}_A\Phi_{21}][{}_A\Phi_{11}]^{-1} \{{}_X\phi_1\}_r +\end{aligned} +\end{equation}

+

Thus, we can write the full transformation as:

+

\begin{equation*} +\tcmbox{ \{\tilde{\phi}_X\}_r = \begin{Bmatrix} +{}_X\phi_1 \ {}_X\tilde{\phi}_2 +\end{Bmatrix} = \begin{bmatrix} +[{}_A\Phi_{11}] \ [{}_A\Phi_{21}] +\end{bmatrix} [{}_A\Phi_{11}]^{-1} \{{}_X\phi_1\}_r } +\end{equation*}

+

This formula can be generalized to a single expression which covers several measured modes:

+

\begin{equation*} +\tcmbox{[\tilde{\Phi}_X]_{N\times m_X} = \underbrace{[\Phi_A]_{N\times m_A} [{}_A\Phi_{11}]_{m_A \times n}^+}_{[T]_{N\times n}} [{}_A\Phi_1]_{n\times m_X}} +\end{equation*}

+

where \(m_X\) and \(m_A\) are the number of experimental and analytical modes used, respectively.

+

Other formulations for \([T]\) are possible, they involve various combinations of the available experimental mode shape data and those from the analytical model:

+

\begin{equation} +\begin{aligned} +[T_{(1)}] &= [\Phi_A][{}_A\Phi_1]^+ & \text{A model - based} \\\
+[T_{(2)}] &= [\Phi_A][{}_X\Phi_1]^+ & \text{X model - based} \\\
+[T_{(3)}] &= \begin{bmatrix}{}_X\Phi_1\{}_A\Phi_2\end{bmatrix}[{}_A\Phi_1]^+ & \text{Mixed/A - based} \\\
+[T_{(4)}] &= \begin{bmatrix}{}_X\Phi_1\{}_A\Phi_2\end{bmatrix}[{}_X\Phi_1]^+ & \text{Mixed/X - based} +\end{aligned} +\end{equation}

+

It must be pointed out that all the above formula are approximate because of the initial assumption that the higher modes are not required to be included in the process (that \(\{\gamma_2\}\) is zero).

+

Reduction of models

+

The model reduction, which is the inverse of the expansion process, is used when it is decided to obtain compatibility between two otherwise disparate models by reducing the size of the larger of the two models (almost always, the analytical model).

+

Model reduction has less importance nowadays as computing power is widely available and because such reduction introduces approximations.

+

There are basically two different types of model reduction, both of which are applied to the spatial model (as opposed to the modal model as is the case in model expansion), and both achieve the same end result of yielding a smaller order model, with system matrices which are \(n\times n\) instead of \(N\times N\):

+
    +
  1. a condensed model which seeks to represent the entire structure completely at a smaller number of DOFs. This type of model introduces approximation.
  2. +
  3. a reduced model which has removed information related to the DOFs that are eliminated from the model, and which is thus an incomplete model. However, for the retained DOFs, no information is lost.
  4. +
+

Let’s summarize the basic feature of model reduction by condensation. +The basic equation of motion for the original model can be expressed as: +\[ [M] \ddot{x} + [K]\{x\} = \{f\} \] +and this can be partitioned into the kept DOFs \(\{x_1\}\) and the eliminated DOFs \(\{x_2\}\) (which by definition cannot have any excitation forces applied to them):

+

\begin{equation*} +\begin{bmatrix} +M_{11} & M_{12} \\\
+M_{21} & M_{22} +\end{bmatrix} \begin{Bmatrix} +\ddot{x}_1 \ \ddot{x}_2 +\end{Bmatrix} + \begin{bmatrix} +K_{11} & K_{12} \\\
+K_{21} & K_{22} +\end{bmatrix} \begin{Bmatrix} +x_1 \ x_2 +\end{Bmatrix} = \begin{Bmatrix} +f_1 \ 0 +\end{Bmatrix} +\end{equation*}

+

A relationship between the kept and eliminated DOFs can be written in the form:

+

\begin{equation} +\begin{Bmatrix} +x_1 \ x_2 +\end{Bmatrix}_{N\times 1} = \begin{bmatrix} +[I] \ [T] +\end{bmatrix}_{N\times n} \{x_1\}_{n\times 1} +\end{equation}

+

where the transformation matrix \([T]\) can be defined by

+

\begin{equation*} +[T] = (1 - \beta)\left(-[K_{22}]^{-1}[K_{21}]\right) + \beta\left(-[M_{22}]^{-1}[M_{21}]\right) +\end{equation*}

+

in which \(\beta\) is a reduction coefficient whose limiting values are \(\beta = 0\) for static reduction and \(\beta = 1\) for dynamic reduction.

+

The reduced mass and stiffness matrices which are produced by this process are:

+

\begin{align*} +\left[M^R\right]_{n\times n} &= \begin{bmatrix}[I] & [T]^T\end{bmatrix}_{n\times N} \begin{bmatrix} +M_{22} & M_{21} \ M_{12} & M_{22} +\end{bmatrix}_{N\times N} \begin{bmatrix} +[I] \ [T] +\end{bmatrix}_{N\times n}\\\
+\left[K^R\right]_{n\times n} &= \begin{bmatrix}[I] & [T]^T\end{bmatrix}_{n\times N} \begin{bmatrix} +K_{22} & K_{21} \ K_{12} & K_{22} +\end{bmatrix}_{N\times N} \begin{bmatrix} +[I] \ [T] +\end{bmatrix}_{N\times n} +\end{align*}

+

The two limiting cases of static and dynamic reduction are of particular interest. +In each case, one of the two system matrices is unchanged and the other one is:

+

\begin{align*} +\beta = 1:\ &[M^{R\text{static}}] = [M_{12}] \left(-[M_{22}]^{-1}[M_{21}]\right)^{-1} + [M_{11}]\\\
+&[K^{R\text{static}}] = [K]\\\
+\beta = 0:\ &[M^{R\text{dynamic}}] = [M]\\\
+&[K^{R\text{dynamic}}] = [K_{12}] \left(-[K_{22}]^{-1}[K_{21}]\right)^{-1} + [K_{11}] +\end{align*}

+

These reduction procedure can provide useful approximate models of the structure if an optimum choice of which DOFs to retain and which can be eliminated is made. +However, a reduced theoretical model of this type does not correspond to a similarly low-order model which is obtained from experiments since that is formed simply by ignoring the eliminated DOFs. +The measured data for the included DOFs are the same no matter how many DOFs are eliminated. +Thus, there are inherent difficulties involved in using this mixture of condensed (but complete) theoretical models and reduced (but incomplete) experimental models.

+

Display of modal models

+

One of the attraction of the modal model is possibility of obtaining a graphic display of its form by plotting the mode shapes.

+

There are basically two choices for the graphical display of a modal model:

+
    +
  • a static plot
  • +
  • a dynamic (animated) display
  • +
+

Static Displays

+
Deflected shapes
+

A static display is often adequate for depicting relatively simple mode shapes. +Measured coordinates of the test structure are first linked as shown on figure fig:static_display (a). +Then, the grid of measured coordinate points is redrawn on the same plot but this time displaced by an amount proportional to the corresponding element in the mode shape vector as shown on figure fig:static_display (b). +The elements in the vector are scaled according the normalization process used (usually mass-normalized), and their absolute magnitudes have no particular significance.

+

+
+ Figure 31: Static display of modes shapes. (a) basic grid (b) single-frame deflection pattern (c) multiple-frame deflection pattern (d) complex mode (e) Argand diagram - quasi-real mode (f) Argand diagram - complex mode
+

Figure 31: Static display of modes shapes. (a) basic grid (b) single-frame deflection pattern (c) multiple-frame deflection pattern (d) complex mode (e) Argand diagram - quasi-real mode (f) Argand diagram - complex mode

+
+
+ +

It is customary to select the largest eigenvector element and to scale the whole vector by an amount that makes that displacement on the plot a viable amount.

+
Multiple frames
+

If a series of deflection patterns that has been computed for a different instant of time are superimposed, we obtain a result as shown on figure fig:static_display (c). +Some indication of the motion of the structure can be obtained, and the points of zero motion (nodes) can be clearly identified.

+

It is also possible, in this format, to give some indication of the essence of complex modes, as shown in figure fig:static_display (d). +Complex modes do not, in general, exhibit fixed nodal points.

+
Argand diagram plots
+

Another form of representation which is useful for complex modes is the representation of the individual complex elements of the eigenvectors on a polar plot, as shown in the examples of figure fig:static_display (e) and (f). +Although there is no attempt to show the physical deformation of the actual structure in this format, the complexity of the mode shape is graphically displayed.

+

Dynamic Display

+

The coordinates for the basic picture are computed and stored for multiple fractions of a cycle. +Then, 10 to 20 frames are stored and displayed with an update rate which is suitable to give a clear picture of the distortion of the structure during vibration.

+

The dynamic character of animation is the only really effective way to view modal complexity and is very useful to display complex modes.

+

Interpretation of mode shape displays

+

There are a number of features associated with mode shape displays that warrant a mention in the context of ensuring that the correct interpretation is made from viewing these displays.

+

The first concerns the consequences of viewing an incomplete model. +In that case, there are no mode shape data from some of the points which comprise the grid which outlines the structure, and the indicated result is zero motion of those DOFs and this can be very misleading. +For instance, if we measure the displacement of grid points in only one direction, \(x\) for instance, then the shape display will show significant x-direction motion of those points with no motion in the other transverse directions. +We then tend to interpret this as a motion which is purely in the x-direction which may be clearly not true.

+

The second problem arises when the grid of measurement points that is chosen to display the mode shapes is too coarse in relation to the complexity of the deformation patterns that are to be displayed. +This can be illustrated using a very simple example: suppose that our test structure is a straight beam, and that we decide to use just three response measurements points. +If we consider the first six modes of the beam, whose mode shapes are sketched in figure fig:beam_modes, then we see that with this few measurement points, modes 1 and 5 look the same as do modes 2, 4 and 6. +All the higher modes will be indistinguishable from these first few. +This is a well known problem of spatial aliasing.

+

+
+ Figure 32: Misinterpretation of mode shapes by spatial aliasing
+

Figure 32: Misinterpretation of mode shapes by spatial aliasing

+
+
+ +

Response models

+
+
+

There are two main requirements demanded for a response model:

+
    +
  • the capability of regeneration “theoretical” curves for the FRFs actually measured and analyzed
  • +
  • synthesizing the other response functions which were not measured
  • +
+
+

In general, the form of response model with which we are concerned is an FRF matrix whose order is dictated by the number of coordinates \(n\) included in the test. +Also, as explained, it is normal in practice to measured and to analyze just a subset of the FRF matrix but rather to measure the full FRF matrix. +Usually one column or one row with a few additional elements are measured. +Thus, if we are to construct an acceptable response model, it will be necessary to synthesize those elements which have not been directly measured. +However, in principle, this need present no major problem as it is possible to compute the full FRF matrix from a modal model using:

+

\begin{equation} +\tcmbox{[H]_{n\times n} = [\Phi]_{n\times m} [\lambda_r^2 - \omega^2]_{m\times m}^{-1} [\Phi]_{m\times n}^T} +\end{equation}

+

Regenerated FRF curves

+

It is usual practice to regenerate an FRF curve using the results from the modal analysis as a mean of checking the success of that analysis.

+

It should be noted that in order to construct an acceptable response model, it is essential that all the modes in the frequency range of interest be included, and that suitable residual terms are added to take account of out-of-range modes. +In this respect, the demands of the response model are more stringent that those of the modal model.

+

Synthesis of FRF curves

+

One of the implications of equation eq:regenerate_full_frf_matrix is that it is possible to synthesize the FRF curves which were not measured. +This arises because if we measured three individual FRF such as \(H_{ik}(\omega)\), \(H_{jk}(\omega)\) and \(K_{kk}(\omega)\), then modal analysis of these yields the modal parameters from which it is possible to generate the FRF \(H_{ij}(\omega)\), \(H_{jj}(\omega)\), etc.

+

However, it must be noted that there is an important limitation to this procedure which is highlighted in the example below.

+
+
+

As an example, suppose that FRF data \(H_{11}\) and \(H_{21}\) are measured and analyzed in order to synthesize the FRF \(H_{22}\) initially unmeasured. +The predict curve is compared with the measurements on figure fig:H22_without_residual. +Clearly, the agreement is poor and would tend to indicate that the measurement/analysis process had not been successful. +However, the synthesized curve contained only those terms relating to the modes which had actually been studied from \(H_{11}\) and \(H_{21}\) and this set of modes did not include all the modes of the structure. +Thus, \(H_{22}\) omitted the influence of out-of-range modes. +The inclusion of these two additional terms (obtained here only after measuring and analyzing \(H_{22}\) itself) resulted in the greatly improved predicted vs measured comparison shown in figure fig:H22_with_residual.

+
+

+
+ Table 24: + Synthesized FRF plot +
+ + + + + + + + + + + + + + + + + +
Using measured modal data only After inclusion of residual terms
width=\linewidthwidth=\linewidth
+

The appropriate expression for a “correct” response model, derived via a set of modal properties is thus

+

\begin{equation} +[H] = [\Phi] [\lambda_r^2 - \omega^2]^{-1} [\Phi]^T + [\text{Res}] +\end{equation}

+

In order to obtain all the data necessary to form such a model, we must first derive the modal model on which it is based and then find some means of determining the elements in the residual matrix \([\text{Res}]\). +This latter task may be done in several ways:

+
    +
  • It may be most accurately achieved by measuring all (or at least over half) of the elements in the FRF matrix, but this would increase a lot the quantity of data to be measured.
  • +
  • Extend the frequency range of the modal test beyond that over which the model is eventually required. +In this way, much of the content of the residual terms is included in separate modes and their actual magnitudes can be reduced to relatively unimportant dimensions.
  • +
  • Try to access which of the many FRF elements are liable to need large residual terms and to make sure that these are included in the list of those which are measured and analyzed. +We noted earlier that it is the point mobilities which are expected to have the highest-valued residuals and the remote transfers which will have the smallest. +Thus, the significant terms in the \([\text{Res}]\) matrix will generally be grouped close to the leading diagonal, and this suggests making measurements of most of the point mobility parameters.
  • +
+

Direct measurement

+

It should be noted that it is quite possible to develop a response model by measuring and analyzing all the elements in one half of the FRF matrix (this being symmetric) and by storing the results of this process without constructing a modal model. +This procedure clearly solves the residual problem discussed above, but it will introduce inconsistencies into to model which renders it unsatisfactory.

+

Transmissibilities

+

One vibration parameter which has not been mentioned so far is that of transmissibility. +This is a quantity which is quite widely used in vibration engineering practice to indicate the relative vibration levels between two points.

+

In general, transmissibility is considered to be a frequency dependent response function \(T_{jk}(\omega)\) which defines the ratio between the response levels at two DOFs \(j\) and \(k\). +Simply defined, we can write:

+

\begin{equation} +T_{jk} (\omega) = \frac{X_j e^{i\omega t}}{X_k e^{i\omega t}} +\end{equation}

+

but, in fact, we need also to specify the excitation conditions that give rise to the two responses in question and these are missing from the above definition which is thus not rigorous. +It does not give us enough information to be able to reproduce the conditions which have been used to measured \(T_{jk}(\omega)\).

+
+
+

If the transmissibility is measured during a modal test which has a single excitation, say at DOF \(i\), then we can define the transmissibility thus obtained more precisely:

+

\begin{equation} +{}_iT_{jk}(\omega) = \frac{H_{ji}(\omega)}{H_{ki}(\omega)} +\end{equation}

+
+

In general, the transmissibility depends significantly on the excitation point (\({}_iT_{jk}(\omega) \neq {}_qT_{jk}(\omega)\) where \(q\) is a different DOF than \(i\)) and it is shown on figure fig:transmissibility_plots. +This may explain why transmissibilities are not widely used in modal analysis.

+

+
+ Figure 33: Transmissibility plots
+

Figure 33: Transmissibility plots

+
+
+ +

Base excitation

+

The one application area where transmissibilities can be used as part of modal testing is in the case of base excitation. +Base excitation is a type of test where the input is measured as a response at the drive point \(x_0(t)\), instead of as a force \(f_1(t)\), as illustrated in figure fig:base_excitation_configuration.

+

We can show that it is possible to determine, from measurements of \(x_i\) and \(x_0\), modal properties of natural frequency, damping factor and unscaled mode shape for each of the modes that are visible in the frequency range of measurement. +The fact that the excitation force is not measured is responsible for the lack of formal scaling of the mode shapes.

+

+
+ Table 25: + Base excitation configuration +
+ + + + + + + + + + + + + + + + + +
Conventional modal test setup Base excitation setup
height=4cmheight=4cm
+

Spatial models

+

It would appear from the basic orthogonality properties of the modal model that there exists a simple means of constructing a spatial model from the modal model, thus this is not so. +We have that:

+

\begin{equation} +\begin{aligned} +[\Phi]^T[M][\Phi] &= [I]\\\
+[\Phi]^T[K][\Phi] &= [\lambda_r^2] +\end{aligned} +\end{equation}

+

from which is would appear that we can write

+

\begin{equation} +\begin{aligned} +[M] &= [\Phi]^{-T} [I] [\Phi]^{-1}\\\
+[K] &= [\Phi]^{-T} [\lambda_r^2] [\Phi]^{-1} +\end{aligned} +\end{equation}

+

However, equation eq:m_k_from_modes is only applicable when we have available the complete \(N \times N\) modal model.

+

It is much more usual to have an incomplete model in which the eigenvector matrix is rectangle and, as such, is non-invertible. +One step which can be made using the incomplete data is the construction of “pseudo” flexibility and inverse-mass matrices. +This is accomplished using the above equation in the form:

+

\begin{equation} +\begin{aligned} +[K]_{n\times n}^{-1} &= [\Phi]_{n\times m} [\lambda_r^2]_{m\times m}^{-1} [\Phi]_{m\times n}^T\\\
+[M]_{n\times n}^{-1} &= [\Phi]_{n\times m} [\Phi]_{m\times n}^T +\end{aligned} +\end{equation}

+

Because the rank of each pseudo matrix is less than its order, it cannot be inverted and so we are unable to construct stiffness or mass matrix from this approach.

+

Bibliography

+

Ewins, D., Modal testing: theory, practice and application (2000), Baldock, Hertfordshire, England Philadelphia, PA: Wiley-Blackwell.

+ +
+
+
+
+
+ +
+ + + + +
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + diff --git a/public/book/fleming14_desig_model_contr_nanop_system/index.html b/public/book/fleming14_desig_model_contr_nanop_system/index.html new file mode 100644 index 0000000..5fad1ab --- /dev/null +++ b/public/book/fleming14_desig_model_contr_nanop_system/index.html @@ -0,0 +1,177 @@ + + + + + + Design, modeling and control of nanopositioning systems - My digital brain + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+
+ +
+ + +
+
+
+
+
+

Tags +:

+
+
Reference
+
(Andrew Fleming & Kam Leang, 2014)
+
Author(s)
+
Fleming, A. J., & Leang, K. K.
+
Year
+
2014
+
+

Bibliography

+

Fleming, A. J., & Leang, K. K., Design, modeling and control of nanopositioning systems (2014), : Springer International Publishing.

+ +
+
+
+
+
+ +
+ + + + +
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + diff --git a/public/book/horowitz15_art_of_elect_third_edition/index.html b/public/book/horowitz15_art_of_elect_third_edition/index.html new file mode 100644 index 0000000..e89e635 --- /dev/null +++ b/public/book/horowitz15_art_of_elect_third_edition/index.html @@ -0,0 +1,176 @@ + + + + + + The art of electronics - third edition - My digital brain + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+
+ +
+ + +
+
+
+
+
+
+
Tags
+
Reference Books, Electronics
+
Reference
+
(Horowitz, 2015)
+
Author(s)
+
Horowitz, P.
+
Year
+
2015
+
+

Bibliography

+

Horowitz, P., The art of electronics - third edition (2015), New York, NY, USA: Cambridge University Press.

+ +
+
+
+
+
+ +
+ + + + +
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + diff --git a/public/book/index.html b/public/book/index.html new file mode 100644 index 0000000..128807d --- /dev/null +++ b/public/book/index.html @@ -0,0 +1,218 @@ + + + + + + Archive - My digital brain + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+
+ + + + + + + + + + + + + + + + + + + diff --git a/public/book/index.xml b/public/book/index.xml new file mode 100644 index 0000000..dfb3b44 --- /dev/null +++ b/public/book/index.xml @@ -0,0 +1,135 @@ + + + + Books on My digital brain + /book/ + Recent content in Books on My digital brain + Hugo -- gohugo.io + en + + + + + + Basics of precision engineering - 1st edition + /book/leach18_basic_precis_engin_edition/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /book/leach18_basic_precis_engin_edition/ + Tags Precision Engineering Reference (Richard Leach &amp; Stuart Smith, 2018) Author(s) Leach, R., &amp; Smith, S. T. Year 2018 Bibliography Leach, R., &amp; Smith, S. T., Basics of precision engineering - 1st edition (2018), : CRC Press. ↩ + + + + Design, modeling and control of nanopositioning systems + /book/fleming14_desig_model_contr_nanop_system/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /book/fleming14_desig_model_contr_nanop_system/ + Tags : + Reference (Andrew Fleming &amp; Kam Leang, 2014) Author(s) Fleming, A. J., &amp; Leang, K. K. Year 2014 Bibliography Fleming, A. J., &amp; Leang, K. K., Design, modeling and control of nanopositioning systems (2014), : Springer International Publishing. ↩ + + + + Fundamental principles of engineering nanometrology + /book/leach14_fundam_princ_engin_nanom/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /book/leach14_fundam_princ_engin_nanom/ + Tags Metrology Reference (Richard Leach, 2014) Author(s) Leach, R. Year 2014 Measurement of angles Unit: + radian for plane angle steradian for solid angle \(1 rad \approx 55.3deg\) +Instrument principles: + subdivision: index tacle, angular gratings, polygons, &hellip; ratio of two lengths: angular interferometers, sin cars, small angle generators, &hellip; autocollimators with a flat mirror Sources of error in displacement interferometry Two error sources: + error sources that are proportional to the displacement being measured \(L\): cumulative errors error sources that are independent of the displacement being measured: non-cumulative errors Thermal expansion of the metrology frame Deadpath length Deadpath length, \(d\), is defined as the difference in distance in air between the reference and measurement reflectors and the beam splitter when the interferometer measurement is initiated. + + + + Modal testing: theory, practice and application + /book/ewins00_modal/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /book/ewins00_modal/ + Tags System Identification, Reference Books Reference (Ewins, 2000) Author(s) Ewins, D. Year 2000 Overview Introduction to Modal Testing The major objectives of modal testing are: + Determining the nature and extent of vibration response levels in operation Verifying theoretical models and predictions of the vibrations Measurement of the essential materials properties under dynamic loading, such as damping capacity, friction and fatigue endurance For many applications, vibrations is directly related to performance and it is important that the vibration levels are anticipated and brought under satisfactory control. + + + + Modeling and control of vibration in mechanical systems + /book/du10_model_contr_vibrat_mechan_system/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /book/du10_model_contr_vibrat_mechan_system/ + Tags Stewart Platforms, Vibration Isolation Reference (Chunling Du &amp; Lihua Xie, 2010) Author(s) Du, C., &amp; Xie, L. Year 2010 Read Chapter 1 and 3. +Bibliography Du, C., &amp; Xie, L., Modeling and control of vibration in mechanical systems (2010), : CRC Press. ↩ + + + + Multi-stage actuation systems and control + /book/du19_multi_actuat_system_contr/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /book/du19_multi_actuat_system_contr/ + Tags : + Reference (Chunling Du &amp; Chee Khiang Pang, 2019) Author(s) Du, C., &amp; Pang, C. K. Year 2019 Mechanical Actuation Systems Introduction When high bandwidth, high position accuracy and long stroke are required simultaneously: dual-stage systems composed of a coarse (or primary) actuator and a fine actuator working together are used. +Popular choices for coarse actuator are: + DC motor Voice coil motor (VCM) Permanent magnet stepper motor Permanent magnet linear synchronous motor As fine actuators, most of the time piezoelectric actuator are used. + + + + Multivariable control systems: an engineering approach + /book/albertos04_multiv_contr_system/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /book/albertos04_multiv_contr_system/ + Tags Multivariable Control Reference (Albertos &amp; Antonio, 2004) Author(s) Albertos, P., &amp; Antonio, S. Year 2004 Bibliography Albertos, P., &amp; Antonio, S., Multivariable control systems: an engineering approach (2004), : Springer-Verlag. ↩ + + + + Multivariable feedback control: analysis and design + /book/skogestad07_multiv_feedb_contr/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /book/skogestad07_multiv_feedb_contr/ + Tags Reference Books, Multivariable Control Reference (Skogestad &amp; Postlethwaite, 2007) Author(s) Skogestad, S., &amp; Postlethwaite, I. Year 2007 \( % H Infini \newcommand{\hinf}{\mathcal{H}_\infty} % H 2 \newcommand{\htwo}{\mathcal{H}_2} % Omega \newcommand{\w}{\omega} % H-Infinity Norm \newcommand{\hnorm}[1]{\left\|#1\right\|_{\infty}} % H-2 Norm \newcommand{\normtwo}[1]{\left\|#1\right\|_{2}} % Norm \newcommand{\norm}[1]{\left\|#1\right\|} % Absolute value \newcommand{\abs}[1]{\left\lvert#1\right\lvert} % Maximum for all omega \newcommand{\maxw}{\text{max}_{\omega}} % Maximum singular value \newcommand{\maxsv}{\overline{\sigma}} % Minimum singular value \newcommand{\minsv}{\underline{\sigma}} % Under bar \newcommand{\ubar}[1]{\text{\b{$#1$}}} % Diag keyword \newcommand{\diag}[1]{\text{diag}\{{#1}\}} % Vector \newcommand{\colvec}[1]{\begin{bmatrix}#1\end{bmatrix}} \) \( \newcommand{\tcmbox}[1]{\boxed{#1}} % Simulate SIunitx \newcommand{\SI}[2]{#1\,#2} \newcommand{\ang}[1]{#1^{\circ}} \newcommand{\degree}{^{\circ}} \newcommand{\radian}{\text{rad}} \newcommand{\percent}{\%} \newcommand{\decibel}{\text{dB}} \newcommand{\per}{/} % Bug with subequations \newcommand{\eatLabel}[2]{} \newenvironment{subequations}{\eatLabel}{} \) Introduction + + + + Parallel robots : mechanics and control + /book/taghirad13_paral/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /book/taghirad13_paral/ + Tags Stewart Platforms, Reference Books Reference (Taghirad, 2013) Author(s) Taghirad, H. Year 2013 Introduction +This book is intended to give some analysis and design tools for the increase number of engineers and researchers who are interested in the design and implementation of parallel robots. A systematic approach is presented to analyze the kinematics, dynamics and control of parallel robots. To define the motion characteristics of such robots, it is necessary to represent 3D motion of the robot moving platform with respect to a fixed coordinate. + + + + The art of electronics - third edition + /book/horowitz15_art_of_elect_third_edition/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /book/horowitz15_art_of_elect_third_edition/ + Tags Reference Books, Electronics Reference (Horowitz, 2015) Author(s) Horowitz, P. Year 2015 Bibliography Horowitz, P., The art of electronics - third edition (2015), New York, NY, USA: Cambridge University Press. ↩ + + + + The design of high performance mechatronics - 2nd revised edition + /book/schmidt14_desig_high_perfor_mechat_revis_edition/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /book/schmidt14_desig_high_perfor_mechat_revis_edition/ + Tags Reference Books Reference (Schmidt {\it et al.}, 2014) Author(s) Schmidt, R. M., Schitter, G., &amp; Rankers, A. Year 2014 Section 2.2 Mechanics + The core of a mechatronic system is its mechanical construction and in spite of many decade of excellent designs, optimizing the mechanical structure in strength, mass and endurance, the mechanical behavior will always remain the limiting factor of the performance of any mechatronic system. + + + + Vibration Control of Active Structures - Fourth Edition + /book/preumont18_vibrat_contr_activ_struc_fourt_edition/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /book/preumont18_vibrat_contr_activ_struc_fourt_edition/ + Tags Vibration Isolation, Reference Books, Stewart Platforms, HAC-HAC Reference (Andre Preumont, 2018) Author(s) Preumont, A. Year 2018 Introduction Active Versus Passive Active structure may be cheaper or lighter than passive structures of comparable performances; or they may offer performances that no passive structure could offer. +Active is not always better, and a control systems cannot compensate for a bad design. Active solution should be considered only after all other passive means have been exhausted. + + + + \ No newline at end of file diff --git a/public/book/leach14_fundam_princ_engin_nanom/index.html b/public/book/leach14_fundam_princ_engin_nanom/index.html new file mode 100644 index 0000000..5a37a92 --- /dev/null +++ b/public/book/leach14_fundam_princ_engin_nanom/index.html @@ -0,0 +1,222 @@ + + + + + + Fundamental principles of engineering nanometrology - My digital brain + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+
+ +
+ + +
+
+
+
+
+
+
Tags
+
Metrology
+
Reference
+
(Richard Leach, 2014)
+
Author(s)
+
Leach, R.
+
Year
+
2014
+
+

Measurement of angles

+

Unit:

+
    +
  • radian for plane angle
  • +
  • steradian for solid angle
  • +
+

\(1 rad \approx 55.3deg\)

+

Instrument principles:

+
    +
  • subdivision: index tacle, angular gratings, polygons, …
  • +
  • ratio of two lengths: angular interferometers, sin cars, small angle generators, …
  • +
  • autocollimators with a flat mirror
  • +
+

Sources of error in displacement interferometry

+

Two error sources:

+
    +
  • error sources that are proportional to the displacement being measured \(L\): cumulative errors
  • +
  • error sources that are independent of the displacement being measured: non-cumulative errors
  • +
+

Thermal expansion of the metrology frame

+

Deadpath length

+

Deadpath length, \(d\), is defined as the difference in distance in air between the reference and measurement reflectors and the beam splitter when the interferometer measurement is initiated. +Deadpath error occurs when there is a non-zero deadpath and environmental conditions change during a measurement.

+

Cosine error

+

\(\Delta l = l(1-\cos(\theta))\)

+

For small angles: \(\Delta l = \frac{l \theta^2}{2}\)

+

The cosine error is then a second-order effect, contrary to the Abbe error which is a first order effect. +The second order nature means that cosine error quickly diminish as the alignment is improved.

+

Latest advances in displacement interferometry

+

Commercial interferometers +=> fused silica optics housed in Invar mounts +=> all the optical components are mounted to one central optic to reduce the susceptibility to thermal variations

+

One advantage that homodyme systems have over heterodyne systems is their ability to readily have the source fibre delivered to the interferometer.

+

Spatially separated interferometers

+

It uses heterodyne interferometer and one quadrant photodiode. +By knowing the beam size and detector geometry, the measurement target’s angle change can be determined by differencing matched pairs of measured phase from the quadrant photodiode while the displacement is determined from the average phase over the four quadrants.

+

Angular interferometers

+

Determination of an angle by the ratio of two lengths. +The angular optics is used to create two parallel beam paths between the angular interferometer and the angular reflector.

+

The beam that illuminates the angular optics contains two frequencies, \(f1\) and \(f2\). A polarising beam splitter in the angular interferometer splits the frequencies that travel along separate paths.

+

The measurement of angles is then relative.

+

This type of angular interferometer is used to measure small angles (less than \(10deg\)).

+

Bibliography

+

Leach, R., Fundamental principles of engineering nanometrology (2014), : Elsevier.

+ +
+
+
+
+
+ +
+ + + + +
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + diff --git a/public/book/leach18_basic_precis_engin_edition/index.html b/public/book/leach18_basic_precis_engin_edition/index.html new file mode 100644 index 0000000..161e8ac --- /dev/null +++ b/public/book/leach18_basic_precis_engin_edition/index.html @@ -0,0 +1,176 @@ + + + + + + Basics of precision engineering - 1st edition - My digital brain + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+
+ +
+ + +
+
+
+ +
+
+
+ +
+ + + + +
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + diff --git a/public/book/preumont18_vibrat_contr_activ_struc_fourt_edition/index.html b/public/book/preumont18_vibrat_contr_activ_struc_fourt_edition/index.html new file mode 100644 index 0000000..14173bf --- /dev/null +++ b/public/book/preumont18_vibrat_contr_activ_struc_fourt_edition/index.html @@ -0,0 +1,1300 @@ + + + + + + Vibration Control of Active Structures - Fourth Edition - My digital brain + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+
+ +
+ + +
+
+
+
+
+
+
Tags
+
Vibration Isolation, Reference Books, Stewart Platforms, HAC-HAC
+
Reference
+
(Andre Preumont, 2018)
+
Author(s)
+
Preumont, A.
+
Year
+
2018
+
+

Introduction

+

Active Versus Passive

+

Active structure may be cheaper or lighter than passive structures of comparable performances; or they may offer performances that no passive structure could offer.

+

Active is not always better, and a control systems cannot compensate for a bad design. Active solution should be considered only after all other passive means have been exhausted.

+

Feedback control can compensate for external disturbances only in a limited frequency range (the bandwidth), the disturbances are actually amplified by the control system outside this frequency band.

+

Vibration Suppression

+

Vibration reduction can be achieved in many different ways:

+
    +
  • stiffening: consists of shifting the resonance frequency of the structure beyond the frequency band of excitation
  • +
  • damping: consists of reducing the resonance peaks by dissipating the vibration energy
  • +
  • isolation: consists of preventing the propagation of disturbances to sensitive parts of the system
  • +
+

The design of an active control system involves many issues such as how to configurate the sensors and actuators, how to secure stability and robustness. The power requirements will often determine the size of the actuators and the cost of the project.

+

Smart Materials and Structures

+

An active structure consists of a structure provided with a set of actuators and sensors coupled by a controller. If the bandwidth of the controller includes some vibration modes of the structure, its dynamic response must be considered.

+

If the set of actuators and sensors are located at discrete points of the structure, they can be treated separately. However, for smart structures, the actuators and sensors are often distributed and have a high degree of integration inside the structure, which makes a separate modelling impossible.

+

Some smart materials are:

+
    +
  • Shape Memory Alloys (SMA): recoverable strain of \(\SI{5}{\percent}\) induced by temperature. They can be used at low frequency and for low precision applications
  • +
  • Piezoelectric materials: recoverable strain of \(\SI{0.1}{\percent}\) under electric field. They can be used as actuators as well as sensors. Two main classes: ceramics and polymers. Piezopolymers are used mostly as sensors as they require high voltage. The best-known piezoceramic is the Lead-Zirconate-Titanate (PZT).
  • +
  • Magnetostrictive materials: recoverable strain of \(\SI{0.15}{\percent}\) under magnetic field
  • +
  • Magneto-Rheological fluids (MR): consists of viscous fluids containing micronsized particules of magnetic material. When the fluid is subjected to a magnetic field, the particules create colunmar structures requiring a minimum shear stress to initiate the flow.
  • +
+

Control Strategies

+

There are two radically different approached to disturbance rejection: feedback and feedforward.

+

Feedback

+

+
+ Figure 1: Principle of feedback control
+

Figure 1: Principle of feedback control

+
+
+ +

The principle of feedback is represented on figure fig:classical_feedback_small. The output \(y\) of the system is compared to the reference signal \(r\), and the error signal \(\epsilon = r-y\) is passed into a compensator \(K(s)\) and applied to the system \(G(s)\), \(d\) is the disturbance. +The design problem consists of finding the appropriate compensator \(K(s)\) such that the closed-loop system is stable and behaves in the appropriate manner.

+

In the control of lightly damped structures, feedback control is used for two distinct and complementary purposes: active damping and model-based feedback.

+

Active Damping:

+
    +
  • The objective of active damping is to reduce the effect of resonant peaks on the response of the structure.
  • +
  • From \(\frac{y}{d} = \frac{1}{1 + GK}\), this requires \(GK \gg 1\) near the resonances
  • +
  • It can be generally be achieved without a model of the structure, with guaranteed stability, provided that the actuator and sensor are collocated and have perfect dynamics.
  • +
+

Model based feedback: +The objective is to control a variable \(y\) to a desired value \(r\) in spite of the external disturbances \(d\).

+
    +
  • From \(\frac{y}{r} = \frac{GK}{1 + GK}\) we see that this requires large values of \(GK\) in the frequency range where \(y\approx r\) (bandwidth)
  • +
  • The bandwidth \(\omega_c\) is limited by the accuracy of the model
  • +
  • The disturbance rejection within the bandwidth of the control system is always compensated by an amplification of the disturbances outside the bandwidth
  • +
  • When implemented digitally, the sampling frequency \(\omega_s\) must always be two orders of magnitude larger than \(\omega_c\) to preseve reasonably the behavior of the continuous system
  • +
+

Feedforward

+

+
+ Figure 2: Principle of feedforward control
+

Figure 2: Principle of feedforward control

+
+
+ +

The method relies on the availability of a reference signal correlated to the primary disturbance. +The idea is to produce a second disturbance such that is cancels the effect of the primary disturbance at the location of the sensor error. Its principle is explained in figure 2.

+

The filter coefficients are adapted in such a way that the error signal at one or several critical points is minimized.

+

There is no guarantee that the global response is reduced at other locations. This method is therefor considered as a local one. +Because it is less sensitive to phase lag than feedback, it can be used at higher frequencies (\(\omega_c \approx \omega_s/10\)).

+

The table 1 summarizes the main features of the two approaches.

+

+
+ Table 1: + Advantages and Disadvantages of some types of control +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdvantagesDisadvantages
Active Damping- Simple to implement- Effective only near resonance
- Does not required accurate model
- Guaranteed stability (collocated)
Model Based- Global method- Requires accurate model
- Attenuate all disturbance within bandwidth- Limited bandwidth
- Spillover
- Amplification of disturbances outside bandwidth
Feedforward Adaptive filtering- No model is necessary- Error signal required
- Robust to change in plant transfer function- Local method: may amplify vibration elsewhere
- More effective for narrowband disturbance- Large amount of real-time computation
+

The Various Steps of the Design

+

+
+ Figure 3: The various steps of the design
+

Figure 3: The various steps of the design

+
+
+ +

The various steps of the design of a controlled structure are shown in figure 3.

+

The starting point is:

+
    +
  • Mechanical system
  • +
  • Performance objectives
  • +
  • Specification of the disturbances
  • +
+

Then the open loop performances can be evaluated:

+
    +
  • The need for active control can be assessed
  • +
  • The needed bandwidth can be roughly specified
  • +
+

The next step consist of selecting the proper type and location of sensors and actuators:

+
    +
  • The controllability and Observability are important concepts
  • +
+

A model of the structure is developped:

+
    +
  • FEM or identification
  • +
  • Model reduction to limit the DoF
  • +
+

If the dynamics of the sensors and actuators may significantly affect the behavior of the system, they must be included in the model before the controller design.

+

Plant Description, Error and Control Budget

+

From the block diagram of the control system (figure fig:general_plant):

+

\begin{align*} +y &= (I - G_{yu}H)^{-1} G_{yw} w\\\
+z &= T_{zw} w = [G_{zw} + G_{zu}H(I - G_{yu}H)^{-1} G_{yw}] w +\end{align*}

+

+
+ Figure 4: Block diagram of the control System
+

Figure 4: Block diagram of the control System

+
+
+ +

The frequency content of the disturbance \(w\) is usually described by its power spectral density \(\Phi_w (\omega)\) which describes the frequency distribution of the meas-square value.

+
+
+

\[\sigma_w = \sqrt{\int_0^\infty \Phi_w(\omega) d\omega}\]

+
+

Even more interesting for the design is the Cumulative Mean Square response defined by the integral of the PSD in the frequency range \([\omega, \infty[\).

+
+
+

\[\sigma_z^2(\omega) = \int_\omega^\infty \Phi_z(\nu) d\nu = \int_\omega^\infty |T_{zw}|^2 \Phi_w(\nu) d\nu \]

+
+

It is a monotonously decreasing function of frequency and describes the contribution of all frequencies above \(\omega\) to the mean-square value of \(z\). +\(\sigma_z(0)\) is then the global RMS response.

+

A typical plot of \(\sigma_z(\omega)\) is shown figure fig:cas_plot. +It is useful to identify the critical modes in a design, at which the effort should be targeted.

+

The diagram can also be used to assess the control laws and compare different actuator and sensor configuration.

+

+
+ Figure 5: Error budget distribution in OL and CL for increasing gains
+

Figure 5: Error budget distribution in OL and CL for increasing gains

+
+
+ +

Pseudo-inverse

+

Under-actuated System

+

Consider the linear system of equation: +\[w = J v\] +With:

+
    +
  • \(w\) a vector with \(m\) components (measurements)
  • +
  • \(v\) a vector with \(n\) components (inputs)
  • +
  • We assume \(m>n\) (under-actuated)
  • +
+

We seek the pseudo-inverse of \(J\) such that \(v = J^+ w\)

+

The columns of \(J\) are the influence function of the actuators. +If the columns of \(J\) are independant, the Jacobian is full rang (\(r=n\)) and the Moore-Penrose pseudo inverse is: +\[J^+ = (J^T J)^{-1} J^T\]

+

Over-actuated System

+

If there are more actuator than sensor (\(m<n\)), we obtain: +\[J^+ = J^T(J J^T)^{-1}\]

+

Note that the Singular Value Decomposition offers a practical way to compute the pseudo-inverse, both for \(m>n\) and \(n>m\).

+

Singular Value Decomposition

+

The Singular Value Decomposition (SVD) is a generalization of the eigenvalue decomposition of a rectangular matrix: +\[ J = U \Sigma V^T = \sum_{i=1}^r \sigma_i u_i v_i^T \] +With:

+
    +
  • \(U\) and \(V\) orthogonal matrices. The columns \(u_i\) and \(v_i\) of \(U\) and \(V\) are the eigenvectors of the square matrices \(JJ^T\) and \(J^TJ\) respectively
  • +
  • \(\Sigma\) a rectangular diagonal matrix of dimension \(m \times n\) containing the square root of the common non-zero eigenvalues of \(JJ^T\) and \(J^TJ\)
  • +
  • \(r\) is the number of non-zero singular values of \(J\)
  • +
+

The pseudo-inverse of \(J\) is: +\[ J^+ = V\Sigma^+U^T = \sum_{i=1}^r \frac{1}{\sigma_i} v_i u_i^T \]

+

The conditioning of the Jacobian is measured by the condition number: +\[ c(J) = \frac{\sigma_{max}}{\sigma_{min}} \]

+

When \(c(J)\) becomes large, the most straightforward way to handle the ill-conditioning is to truncate the smallest singular value out of the sum. +This will have usually little impact of the fitting error while reducing considerably the actuator inputs \(v\).

+

Some Concepts in Structural Dynamics

+

Equation of Motion of a Discrete System

+

The general form of the equation of motion governing the dynamic equilibrium between the external, elastic, inertia and damping forces acting on a discrete, flexible structure with a finite number \(n\) of degrees of freedom is

+
+
+

\begin{equation} +M \ddot{x} + C \dot{x} + K x = f +\end{equation}

+

With:

+
    +
  • \(x\) is the vector of generalized displacements (translations and rotations)
  • +
  • \(f\) is the vector of generalized forces (point forces and torques)
  • +
  • \(M\), \(C\) and \(K\) are respectively the mass, damping and stiffness matrices; they are symmetric and semi-positive definite
  • +
+
+

The damping matrix \(C\) represents the various dissipation mechanisms in the structure, which are usually poorly known. One of the popular hypotheses is the Rayleigh damping.

+
+
+

\begin{equation} +C = \alpha M + \beta K +\end{equation}

+
+

\(\alpha\) and \(\beta\) are selected to fit the structure under consideration.

+

Vibration Modes

+

Consider the free response of an undamped system of order \(n\): +\[ M\ddot{x} + K x = 0 \]

+

If one tries a solution of the form \(x = \phi_i e^{j\omega_i t}\), \(\phi_i\) and \(\omega_i\) must statisfy the eigenvalue problem +\[ (K - \omega_i^2 M)\phi_i = 0 \] +with:

+
    +
  • \(\omega_i\): the natural frequency
  • +
  • \(\phi_i\): the corresponding mode shape
  • +
+

The number of mode shapes is equal to the number of degrees of freedom \(n\).

+

The mode shapes are orthogonal with respect to the stiffness and mass matrices:

+

\begin{align} +\phi_i^T M \phi_j &= \mu_i \delta_{ij} \\\
+\phi_i^T K \phi_j &= \mu_i \omega_i^2 \delta_{ij} +\end{align}

+

With \(\mu_i\) the modal mass (also called the generalized mass) of mode \(i\).

+ +

Structure Without Rigid Body Modes

+

Let perform a change of variable from physical coordinates \(x\) to modal coordinates \(z\).

+
+
+

\begin{equation} +x = \Phi z +\end{equation}

+

With:

+
    +
  • \(\Phi = [\phi_1, \phi_2, …, \phi_n]\) the matrix of the mode shapes
  • +
  • \(z\) the vector of modal amplitudes
  • +
+
+

The dynamic equation of the system becomes: +\[ M \Phi \ddot{z} + C \Phi \dot{z} + K \Phi z = f \]

+

If we left multiply the equation by \(\Phi^T\) and we use the orthogonalily relationships: +\[ diag(\mu_i) \ddot{z} + \Phi^T C \Phi + diag(\mu_i \omega_i^2) z = \Phi^T f \]

+

If \(\Phi^T C \Phi\) is diagonal, the damping is said classical or normal. In this case: +\[ \Phi^T C \Phi = diag(2 \xi_i \mu_i \omega_i) \]

+

One can verify that the Rayleigh damping \eqref{eq:rayleigh_damping} complies with this condition with modal damping ratios \(\xi_i = \frac{1}{2} ( \frac{\alpha}{\omega_i} + \beta\omega_i )\).

+

And we obtain decoupled modal equations \eqref{eq:modal_eom}.

+
+
+

\begin{equation} +\ddot{z} + 2 \xi \Omega \dot{z} + \Omega^2 z = z^{-1} \Phi^T f +\end{equation}

+

with:

+
    +
  • \(\xi = diag(\xi_i)\)
  • +
  • \(\Omega = diag(\omega_i)\)
  • +
  • \(\mu = diag(\mu_i)\)
  • +
+
+

Typical values of the modal damping ratio are summarized on table tab:damping_ratio.

+

+
+ Table 2: + Typical Damping ratio +
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Damping RatioApplication
\(\xi \simeq 0.001 - 0.005\)Space structures
\(\xi \simeq 0.01 - 0.02\)Mechanical engineering
\(\xi \simeq 0.05\)Civil engineering
\(\xi \simeq 0.2\)When ground is involved
+

The assumption of classical damping is often justified for light damping, but it is questionable when the damping is large.

+

If one accepts the assumption of classical damping, the only difference between equation \eqref{eq:general_eom} and \eqref{eq:modal_eom} lies in the change of coordinates. +However, in physical coordinates, the number of degrees of freedom is usually very large. +If a structure is excited in by a band limited excitation, its response is dominated by the modes whose natural frequencies are inside the bandwidth of the excitation and the equation \eqref{eq:modal_eom} can often be restricted to theses modes. +Therefore, the number of degrees of freedom contribution effectively to the response is reduced drastically in modal coordinates.

+

Dynamic Flexibility Matrix

+

If we consider the steady-state response of equation \eqref{eq:general_eom} to harmonic excitation \(f=F e^{j\omega t}\), the response is also harmonic \(x = Xe^{j\omega t}\). The amplitude of \(F\) and \(X\) is related by: +\[ X = G(\omega) F \]

+

Where \(G(\omega)\) is called the Dynamic flexibility Matrix: +\[ G(\omega) = (-\omega^2 M + j\omega C + K)^{-1} F \]

+

From the modal expansion of the dynamic flexibility matrix can be obtained by coordinate transformation \(x = \phi z\) and we obtain:

+

\begin{equation} +G(\omega) = \sum_{i=1}^n \frac{\phi_i \phi_i^T}{\mu_i \omega_i^2} D_i(\omega) +\end{equation}

+

With:

+
    +
  • \(D_i(\omega)\) is the dynamic amplification factor of mode \(i\) given by
  • +
+

\begin{equation} +D_i(\omega) = \frac{1}{1 - \omega^2/\omega_i^2 + 2 j \xi_i \omega/\omega_i} +\end{equation}

+

+
+ Figure 6: Fourier spectrum of the excitation \(F\) and dynamic amplitification \(D_i\) of mode \(i\) and \(k\) such that \(\omega_i &lt; \omega_b\) and \(\omega_k \gg \omega_b\)
+

Figure 6: Fourier spectrum of the excitation \(F\) and dynamic amplitification \(D_i\) of mode \(i\) and \(k\) such that \(\omega_i < \omega_b\) and \(\omega_k \gg \omega_b\)

+
+
+ +

If the excitation has a limited bandwidth \(\omega_b\), the contribution of the high frequency modes \(\omega_k \gg \omega_b\) can be evaluated by assuming \(D_k(\omega) \approx 1\) (as shown on figure fig:neglected_modes).

+

And \(G(\omega)\) can be rewritten on terms of the low frequency modes only: +\[ G(\omega) \approx \sum_{i=1}^m \frac{\phi_i \phi_i^T}{\mu_i \omega_i^2} D_i(\omega) + R \]

+

The quasi-static correction of the high frequency modes \(R\) is called the residual mode. This introduces a feedthrough component in the transfer matrix.

+

Structure with Rigid Body Modes

+

Collocated Control System

+
+
+

A collocated control system is a control system where:

+
    +
  • the actuator and the sensor are attached to the same degree of freedom
  • +
  • they are dual: the product of the actuator signal and the sensor signal represents the energy exchange between the structure and the control system
  • +
+
+

+
+ Table 3: + Examples of dual actuators and sensors +
+ + + + + + + + + + + + + + + + + +
ActuatorSensor
ForceTranslation
TorqueRotation
+

The open-loop FRF of a collocated system corresponds to a diagonal component of the dynamic flexibility matrix.

+

If we assumes that the collocated system is undamped and is attached to the DoF \(k\), the open-loop FRF is purely real: +\[ G_{kk}(\omega) = \sum_{i=1}^m \frac{\phi_i^2(k)}{\mu_i (\omega_i^2 - \omega^2)} + R_{kk} \]

+

\(G_{kk}\) is a monotonously increasing function of \(\omega\) (figure fig:collocated_control_frf).

+

+
+ Figure 7: Open-Loop FRF of an undamped structure with collocated actuator/sensor pair
+

Figure 7: Open-Loop FRF of an undamped structure with collocated actuator/sensor pair

+
+
+ +

The amplitude of the FRF goes from \(-\infty\) at the resonance frequencies \(\omega_i\) to \(+\infty\) at the next resonance frequency \(\omega_{i+1}\). Therefore, in every interval, there is a frequency \(z_i\) such that \(\omega_i < z_i < \omega_{i+1}\) where the amplitude of the FRF vanishes. The frequencies \(z_i\) are called anti-resonances.

+
+
+

Undamped collocated control systems have alternating poles and zeros on the imaginary axis. +For lightly damped structure, the poles and zeros are just moved a little bit in the left-half plane, but they are still interlacing.

+
+

If the undamped structure is excited harmonically by the actuator at the frequency of the transmission zero \(z_i\), the amplitude of the response of the collocated sensor vanishes. That means that the structure oscillates at the frequency \(z_i\) according to the mode shape shown in dotted line figure fig:collocated_zero.

+

+
+ Figure 8: Structure with collocated actuator and sensor
+

Figure 8: Structure with collocated actuator and sensor

+
+
+ +
+
+

The frequency of the transmission zero \(z_i\) and the mode shape associated are the natural frequency and the mode shape of the system obtained by constraining the d.o.f. on which the control systems acts.

+

The open-loop zeros are asymptotic values of the closed-loop poles when the feedback gain goes to infinity.

+

The open-loop poles are independant of the actuator and sensor configuration while the open-loop zeros do depend on it.

+
+

By looking at figure fig:collocated_control_frf, we see that neglecting the residual mode in the modelling amounts to translating the FRF diagram vertically. That produces a shift in the location of the transmission zeros to the right.

+

+
+ Figure 9: Bode plot of a lighly damped structure with collocated actuator and sensor
+

Figure 9: Bode plot of a lighly damped structure with collocated actuator and sensor

+
+
+ +

The open-loop transfer function of a lighly damped structure with a collocated actuator/sensor pair can be written:

+

\begin{equation} +G(s) = G_0 \frac{\Pi_i(s^2/z_i^2 + 2 \xi_i s/z_i + 1)}{\Pi_j(s^2/\omega_j^2 + 2 \xi_j s /\omega_j + 1)} +\end{equation}

+

The corresponding Bode plot is represented in figure 9. Every imaginary pole at \(\pm j\omega_i\) introduces a \(\SI{180}{\degree}\) phase lag and every imaginary zero at \(\pm jz_i\) introduces a phase lead of \(\SI{180}{\degree}\). +In this way, the phase diagram is always contained between \(\SI{0}{\degree}\) and \(\SI{-180}{\degree}\) as a consequence of the interlacing property.

+

Electromagnetic and Piezoelectric Transducers

+

Introduction

+

Transducers are critical in active structures technology. +In many applications, the actuators are the most critical part of the system; however, the sensors become very important in precision engineering where submicron amplitudes must be detected.

+

Two broad categories of actuators can be distinguish:

+
    +
  • grounded actuator: react on a fixed support. They include torque motors, force motors (shakers), tendons
  • +
  • structure borne actuator: includes jets, reaction wheels, proof-mass actuators, piezo strips, …
  • +
+

Voice Coil Transducer

+

A voice coil transducer is an energy transformer which converts electrical power into mechanical power and vice versa.

+

The system consists of (see figure fig:voice_coil_schematic):

+
    +
  • A permanent magnet which produces a uniform flux density \(B\) normal to the gap
  • +
  • A coil which is free to move axially
  • +
+

+
+ Figure 10: Physical principle of a voice coil transducer
+

Figure 10: Physical principle of a voice coil transducer

+
+
+ +

We note:

+
    +
  • \(v\) the velocity of the coil
  • +
  • \(f\) the external force acting to maintain the coil in equilibrium againt the electromagnetic forces
  • +
  • \(e\) the voltage difference across the coil
  • +
  • \(i\) the current into the coil
  • +
+
+
+

Faraday’s law:

+

\begin{equation} +e = 2\pi n r B v = T v +\end{equation}

+

With \(T = 2\pi n r B\) is the transducer constant.

+

Lorentz force law:

+

\begin{equation} +f = -i 2\pi n r B = - T i +\end{equation}

+
+

The total power delivered to the moving coil transducer is equal to the sum of the electric power and the mechanical power: +\[ ei + fv = 0 \]

+

Thus, at any time, there is an equilibrium between the electrical power absorbed by the device and the mechanical power delivered.

+

Proof-Mass Actuator

+

A reaction mass \(m\) is conected to the support structure by a spring \(k\) , and damper \(c\) and a force actuator \(f = T i\) (figure fig:proof_mass_actuator).

+

+
+ Figure 11: Proof-mass actuator
+

Figure 11: Proof-mass actuator

+
+
+ +

If we apply the second law of Newton on the mass: +\[ m\ddot{x} + c\dot{x} + kx = f = Ti \]

+

In the Laplace domain: +\[ x = \frac{Ti}{ms^2 + cs + k} \]

+

The total force applied on the support is: +\[ F = -f + cs + k = -m s^2 x = \frac{-ms^2Ti}{ms^2 + cs + k} \]

+

The transfer function between the total force and the current \(i\) applied to the coil is :

+
+
+

\begin{equation} +\frac{F}{i} = \frac{-s^2 T}{s^2 + 2\xi_p \omega_p s + \omega_p^2} +\end{equation}

+

with:

+
    +
  • \(T\) is the transducer constant
  • +
  • \(\omega_p = \frac{k}{m}\) is the natural frequency of the spring-mass system
  • +
  • \(\xi_p\) is the damping ratio
  • +
+
+

Above some critical frequency \(\omega_c \approx 2\omega_p\), the proof-mass actuator can be regarded as an ideal force generator (figure fig:proof_mass_tf).

+

+
+ Figure 12: Bode plot \(F/i\) of the proof-mass actuator
+

Figure 12: Bode plot \(F/i\) of the proof-mass actuator

+
+
+ +

Geophone

+

The geophone is a transducer which behaves like an absolute velocity sensor above some cutoff frequency. +The voltage \(e\) of the coil is used as the sensor output.

+

If \(x_0\) is the displacement of the support and if the voice coil is open (\(i=0\)), the governing equations are:

+

\begin{align*} +m\ddot{x} + c(\dot{x}-\dot{x_0}) + k(x-x_0) &= 0\\\
+T(\dot{x}-\dot{x_0}) &= e +\end{align*}

+

By using the two equations, we obtain:

+

\begin{equation} +\frac{e}{\dot{x_0}} = \frac{-s^2 T}{s^2 + 2\xi_p\omega_p s + \omega_p^2} +\end{equation}

+

Above the corner frequency, the gain of the geophone is equal to the transducer constant \(T\).

+

+
+ Figure 13: Model of a geophone based on a voice coil transducer
+

Figure 13: Model of a geophone based on a voice coil transducer

+
+
+ +

Designing geophones with very low corner frequency is in general difficult. Active geophones where the frequency is lowered electronically may constitute a good alternative option.

+

General Electromechanical Transducer

+

The consitutive behavior of a wide class of electromechanical transducers can be modelled as in figure fig:electro_mechanical_transducer.

+

+
+ Figure 14: Electrical analog representation of an electromechanical transducer
+

Figure 14: Electrical analog representation of an electromechanical transducer

+
+
+ +

In Laplace form the constitutive equations read:

+

\begin{align} +e & = Z_e i + T_{em} v \label{eq:gen_trans_e} \\\
+f & = T_{em} i + Z_m v \label{eq:gen_trans_f} +\end{align}

+

With:

+
    +
  • \(e\) is the Laplace transform of the input voltage across the electrical terminals
  • +
  • \(i\) is the input current
  • +
  • \(f\) is the force applied to the mechanical terminals
  • +
  • \(v\) is the velocity of the mechanical part
  • +
  • \(Z_e\) is the blocked electrical impedance (for \(v=0\))
  • +
  • \(T_{em}\) is the transduction coefficient representing the electromotive force (in \(\si{\volt\second\per\meter}\))
  • +
  • \(T_{me}\) is the transduction coefficient representing the force acting on the mechanical terminals to balance the electromagnetic force induced per unit current input (in \(\si{\newton\per\ampere}\))
  • +
  • \(Z_m\) is the mechanical impedance measured when \(i=0\)
  • +
+

Equation \eqref{eq:gen_trans_e} shows that the voltage across the electrical terminals of any electromechanical transducer is the sum of a contribution proportional to the current applied and a contribution proportional to the velocity of the mechanical terminals. +Thus, if \(Z_ei\) can be measured and substracted from \(e\), a signal proportional to the velocity is obtained.

+

To do so, the bridge circuit as shown on figure fig:bridge_circuit can be used.

+

We can show that

+

\begin{equation} +V_4 - V_2 = \frac{-Z_b T_{em}}{Z_e + Z_b} v +\end{equation}

+

which is indeed a linear function of the velocity \(v\) at the mechanical terminals.

+

+
+ Figure 15: Bridge circuit for self-sensing actuation
+

Figure 15: Bridge circuit for self-sensing actuation

+
+
+ +

Smart Materials

+

Smart materials have the ability to respond significantly to stimuli of different physical nature. +Figure fig:smart_materials lists various effects that are observed in materials in response to various inputs.

+

+
+ Figure 16: Stimulus response relations indicating various effects in materials. The smart materials corresponds to the non-diagonal cells
+

Figure 16: Stimulus response relations indicating various effects in materials. The smart materials corresponds to the non-diagonal cells

+
+
+ +

Piezoelectric Transducer

+

Piezoelectric materials exhibits two effects described below.

+
+
+

Ability to generate an electrical charge in proportion to an external applied force.

+
+
+
+

An electric filed parallel to the direction of polarization induces an expansion of the material.

+
+

The most popular piezoelectric materials are Lead-Zirconate-Titanate (PZT) which is a ceramic, and Polyvinylidene fluoride (PVDF) which is a polymer.

+

We here consider a transducer made of one-dimensional piezoelectric material.

+
+
+

\begin{subequations} +\begin{align} +D & = \epsilon^T E + d_{33} T\\\
+S & = d_{33} E + s^E T +\end{align} +\end{subequations}

+

With:

+
    +
  • \(D\) is the electric displacement \([C/m^2]\)
  • +
  • \(E\) is the electric field \([V/m]\)
  • +
  • \(T\) is the stress \([N/m^2]\)
  • +
  • \(S\) is the strain
  • +
  • \(\epsilon^T\) is the dielectric constant under constant stress
  • +
  • \(s^E\) is the compliance when the eletric field is constant (inverse of Young modulus)
  • +
  • \(d_{33}\) is the piezoelectric constant \([m/V]\) or \([C/N]\) in the poling direction of the material (convention)
  • +
+
+

Constitutive Relations of a Discrete Transducer

+

The set of equations \eqref{eq:piezo_eq} can be written in a matrix form:

+

\begin{equation} +\begin{bmatrix}D\S\end{bmatrix}

+

\begin{bmatrix} +\epsilon^T & d_{33}\\\
+d_{33} & s^E +\end{bmatrix} +\begin{bmatrix}E\T\end{bmatrix} +\end{equation}

+

Where \((E, T)\) are the independent variables and \((D, S)\) are the dependent variable.

+

If \((E, S)\) are taken as independant variables:

+

\begin{equation} +\begin{bmatrix}D\T\end{bmatrix}

+

\begin{bmatrix} +\epsilon^T(1-k^2) & e_{33}\\\
+-e_{33} & c^E +\end{bmatrix} +\begin{bmatrix}E\S\end{bmatrix} +\end{equation}

+

With:

+
    +
  • \(c^E = \frac{1}{s^E}\) is the Young modulus under short circuited electrodes (\(E = 0\)) in \([N/m^2]\)
  • +
  • \(e_{33} = \frac{d_{33}}{s^E}\) is the constant relating the electric displacement to the strain for short-circuited electrodes \([C/m^2]\)
  • +
+
+
+

\begin{equation} +k^2 = \frac{{d_{33}}^2}{s^E \epsilon^T} = \frac{{e_{33}}^2}{c^E \epsilon^T} +\end{equation}

+

\(k\) is called the electromechanical coupling factor of the material. +It measures the efficiency of the conversion of the mechanical energy into electrical energy, and vice versa.

+
+

If one assumes that all the electrical and mechanical quantities are uniformly distributed in a linear transducer formed by a stack (see figure fig:piezo_stack) of \(n\) disks of thickness \(t\) and cross section \(A\), the global constitutive equations of the transducer are obtained by integrating \eqref{eq:piezo_eq_matrix_bis} over the volume of the transducer:

+

\begin{equation} +\begin{bmatrix}Q\\Delta\end{bmatrix}

+

\begin{bmatrix} +C & nd_{33}\\\
+nd_{33} & 1/K_a +\end{bmatrix} +\begin{bmatrix}V\f\end{bmatrix} +\end{equation}

+

where

+
    +
  • \(Q = n A D\) is the total electric charge on the electrodes of the transducer
  • +
  • \(\Delta = S l\) is the total extension (\(l = nt\) is the length of the transducer)
  • +
  • \(f = AT\) is the total force
  • +
  • \(V\) is the voltage applied between the electrodes of the transducer
  • +
  • \(C = \epsilon^T A n^2/l\) is the capacitance of the transducer with no external load (\(f = 0\))
  • +
  • \(K_a = A/s^El\) is the stiffness with short-circuited electrodes (\(V = 0\))
  • +
+

+
+ Figure 17: Piezoelectric linear transducer
+

Figure 17: Piezoelectric linear transducer

+
+
+ +

Equation \eqref{eq:piezo_stack_eq} can be inverted to obtain

+

\begin{equation} +\begin{bmatrix}V\f\end{bmatrix}

+

\frac{K_a}{C(1-k^2)} +\begin{bmatrix} +1/K_a & -nd_{33}\\\
+-nd_{33} & C +\end{bmatrix} +\begin{bmatrix}Q\\Delta\end{bmatrix} +\end{equation}

+

Energy Stored in the Piezoelectric Transducer

+

Let us write the total stored electromechanical energy of a discrete piezoelectric transducer as shown on figure fig:piezo_discrete.

+

The total power delivered to the transducer is the sum of electric power \(V i\) and the mechanical power \(f \dot{\Delta}\). The net work of the transducer is

+

\begin{equation} +dW = V i dt + f \dot{\Delta} dt = V dQ + f d\Delta +\end{equation}

+

+
+ Figure 18: Discrete Piezoelectric Transducer
+

Figure 18: Discrete Piezoelectric Transducer

+
+
+ +

By integrating equation \eqref{eq:piezo_work} and using the constitutive equations \eqref{eq:piezo_stack_eq_inv}, we obtain the analytical expression of the stored electromechanical energy for the discrete transducer:

+

\begin{equation} +W_e(\Delta, Q) = \frac{Q^2}{2 C (1 - k^2)} - \frac{n d_{33} K_a}{C(1-k^2)} Q\Delta + \frac{K_a}{1-k^2}\frac{\Delta^2}{2} +\end{equation}

+
    +
  • The first term is the electrical energy stored in the capacitance \(C(1-k^2)\) (corresponding to fixed geometry \(\Delta = 0\))
  • +
  • The second term is the piezoelectric energy
  • +
  • The third term is the elastic strain energy stored in a spring stiffness \(K_a/(1-k^2)\) (corresponding to open electrodes \(Q=0\))
  • +
+

The constitutive equations can be recovered by differentiate the stored energy: +\[ f = \frac{\partial W_e}{\partial \Delta}, \quad V = \frac{\partial W_e}{\partial Q} \]

+

Interpretation of \(k^2\)

+

Consider a piezoelectric transducer subjected to the following mechanical cycle: first, it is loaded with a force \(F\) with short-circuited electrodes; the resulting extension is \(\Delta_1 = F/K_a\) where \(K_a = A/(s^El)\) is the stiffness with short-circuited electrodes. +The energy stored in the system is: +\[ W_1 = \int_0^{\Delta_1} f dx = \int_0^{\Delta_1} K_a x dx = \frac{F^2}{2 K_a} \]

+

At this point, the electrodes are open and the transducer is unloaded according to a path of slope \(K_a/(1-k^2)\), the resulting extension is \(\Delta_2 = \frac{F(1-k^2)}{K_a}\). +The energy recovered is +\[ W_1 = \int_0^{\Delta_2} f dx = \frac{F \Delta_2}{2} = \frac{F^2(1-k^2)}{2 K_a} \]

+

The ratio between the remaining stored energy and the initial stored energy is +\[ \frac{W_1 - W_2}{W_1} = k^2 \]

+

Admittance of the Piezoelectric Transducer

+

Consider the system of figure fig:piezo_stack_admittance, where the piezoelectric transducer is assumed massless and is connected to a mass \(M\). +The force acting on the mass is negative of that acting on the transducer, \(f = -M \ddot{x}\).

+

+
+ Figure 19: Elementary dynamical model of the piezoelectric transducer
+

Figure 19: Elementary dynamical model of the piezoelectric transducer

+
+
+ +

From the constitutive equations, one finds

+

\begin{equation} +\frac{I}{V} = s C (1-k^2) \frac{s^2 + z^2}{s^2 + p^2} +\end{equation}

+

where the poles and zeros are respectively +\[ p^2 = \frac{K_a}{M},\quad z^2 = \frac{K_a/(1-k^2)}{M} \]

+

And one can see that

+

\begin{equation} +\frac{z^2 - p^2}{z^2} = k^2 +\end{equation}

+

Equation \eqref{eq:distance_p_z} constitutes a practical way to determine the electromechanical coupling factor from the poles and zeros of the admittance measurement (figure fig:piezo_admittance_curve).

+

+
+ Figure 20: Typical admittance FRF of the transducer
+

Figure 20: Typical admittance FRF of the transducer

+
+
+ +

Piezoelectric Beam, Plate and Truss

+

Piezoelectric Material

+

Constitutive Relations

+

Coenergy Density Function

+

Hamilton’s Principle

+

Piezoelectric Beam Actuator

+

Hamilton’s Principle

+

Piezoelectric Loads

+

Laminar Sensor

+

Current and Charge Amplifiers

+

Distributed Sensor Output

+

Charge Amplifier Dynamics

+

Spatial Modal Filters

+ + +

Active Beam with Collocated Actuator/Sensor

+

Frequency Response Function

+

Pole-Zero Pattern

+ +

Admittance of a Beam with a Piezoelectric Patch

+

Piezoelectric Laminate

+

Two-Dimensional Constitutive Equations

+

Kirchhoff Theory

+

Stiffness Matrix of a Multilayer Elastic Laminate

+

Multilayer Laminate with a Piezoelectric Layer

+

Equivalent Piezoelectric Loads

+

Sensor Output

+

Beam Model Versus Plate Model

+

Additional Remarks

+

Active Truss

+

Open-Loop Transfer Function

+

Admittance Function

+

Finite Element Formulation

+

Problems

+

References

+

Passive Damping with Piezoelectric Transducers

+

Introduction

+

Resistive Shunting

+

Inductive Shunting

+

Equal Peak Design

+

Robustness of the Equal Peak Design

+

Switched Shunt

+

Equivalent Damping Ratio

+

Collocated Versus Non-collocated Control

+

Pole-Zero Flipping

+
+
+

The Root Locus shows, in a graphical form, the evolution of the poles of the closed-loop system as a function of the scalar gain \(g\) applied to the compensator. +The Root Locus is the locus of the solution \(s\) of the closed loop characteristic equation \(1 + gG(s)H(s) = 0\) when \(g\) goes from zero to infinity.

+
+

If the open-loop transfer function is written +\[ G(s)H(s) = k \frac{\Pi_{i=1}^{m} (s - z_i)}{\Pi_{i=1}^{n} (s - p_i)} \] +The locus goes from the poles \(p_i\) (for \(g=0\)) to the zeros \(z_i\) (as \(g \rightarrow \infty\)).

+

The Two-Mass Problem

+

Collocated Control

+

Non-collocated Control

+

Notch Filter

+

Effect of Pole-Zero Flipping on the Bode Plots

+

Nearly Collocated Control System

+

Non-collocated Control Systems

+

The Role of Damping

+

Active Damping with Collocated System

+

Introduction

+

The role of active damping is to increase the negative real parts of system poles wile maintaining the natural frequencies essentially unchanged.

+

Active damping requires relatively little control effort; this is why it is also called Low Authority Control (LAC). +Other control strategies which fully relocate the closed loop poles are called High Autority Control (HAC).

+

Lead Control

+

\[H(s) = g \frac{s+z}{z+p} \quad p \gg z \]

+

It produces a phase lead in the frequency band between \(z\) and \(p\), bringing active damping to all the modes belonging to \(z < \omega_i < p\).

+

The closed-loop poles start at the open-llop poles for \(g=0\) and go to the open-loop zeros for \(g\rightarrow\infty\).

+

The controller does not have any roll-off, but the roll-off of the structure is enough to guarantee gain stability at high frequency.

+

Direct Velocity Feedback (DVF)

+

This is a particular case of the Lead controller as \(z\rightarrow 0\) and \(p\rightarrow\infty\).

+

Structure: +\[M \ddot{x} + K x = b u\]

+

Output is a velocity sensor: +\[y = b^T \dot{x}\]

+

Control: +\[u = -g y\]

+

Positive Position Feedback (PPF)

+

Sometimes the plant does not have a roll-off of \(-40dB/\text{decade}\), then we can use a second-order PPF: +\[H(s) = \frac{-g}{s^2 + 2 \xi_f \omega_f s + {\omega_f}^2}\]

+

Integral Force Feedback (IFF)

+

Duality Between the Lead and the IFF Controllers

+

Root Locus of a Single Mode

+

Open-Loop Poles and Zeros

+

Actuator and Sensor Dynamics

+

Decentralized Control with Collocated Pairs

+

Cross talk

+

Force Actuator and Displacement Sensor

+

Displacement Actuator and Force Sensor

+

Proof of Equation (7.18)–(7.32)

+

Vibration Isolation

+

Introduction

+

Relaxation Isolator

+

Electromagnetic Realization

+

Active Isolation

+

Sky-Hook Damper

+

Integral Force Feedback

+

Flexible Body

+

Free-Free Beam with Isolator

+

Payload Isolation in Spacecraft

+

Interaction Isolator/Attitude Control

+

Gough–Stewart Platform

+

Six-Axis Isolator

+

Relaxation Isolator

+

Integral Force Feedback

+

Spherical Joints, Modal Spread

+

Active Versus Passive

+

Car Suspension

+

State Space Approach

+

Introduction

+

State Space Description

+

Single Degree of Freedom Oscillator

+

Flexible Structure

+

Inverted Pendulum

+

System Transfer Function

+

Poles and Zeros

+

Pole Placement by State Feedback

+

Example: Oscillator

+

Linear Quadratic Regulator

+

Symmetric Root Locus

+

Inverted Pendulum

+

Observer Design

+

Kalman Filter

+

Inverted Pendulum

+

Reduced-Order Observer

+

Oscillator

+

Inverted Pendulum

+

Separation Principle

+

Transfer Function of the Compensator

+

The Two-Mass Problem

+

Analysis and Synthesis in the Frequency Domain

+

Gain and Phase Margins

+

Nyquist Criterion

+

Cauchy’s Principle

+

Nyquist Stability Criterion

+

Nichols Chart

+

Feedback Specification for SISO Systems

+

Sensitivity

+

Tracking Error

+

Performance Specification

+

Unstructured Uncertainty

+

Robust Performance and Robust Stability

+

Bode Gain–Phase Relationships

+

The Bode Ideal Cutoff

+

Non-minimum Phase Systems

+

Usual Compensators

+

System Type

+

Lead Compensator

+

PI Compensator

+

Lag Compensator

+

PID Compensator

+

Multivariable Systems

+

Performance Specification

+

Small Gain Theorem

+

Stability Robustness Tests

+

Residual Dynamics

+

Optimal Control

+

Introduction

+

Quadratic Integral

+

Deterministic LQR

+

Stochastic Response to a White Noise

+

Remark

+

Stochastic LQR

+

Asymptotic Behavior of the Closed Loop

+

Prescribed Degree of Stability

+

Gain and Phase Margins of the LQR

+

Full State Observer

+

Covariance of the Reconstruction Error

+

Kalman Filter (KF)

+

Linear Quadratic Gaussian (LQG)

+

Duality

+

Spillover

+

Spillover Reduction

+

Loop Transfer Recovery (LTR)

+

Integral Control with State Feedback

+

Frequency Shaping

+

Weakness of LQG:

+
    +
  • use frequency independant cost function
  • +
  • use noise statistics with uniform distribution
  • +
+

To overcome the weakness => frequency shaping either by:

+
    +
  • considering a frequency dependant cost function
  • +
  • using colored noise statistics
  • +
+

Frequency-Shaped Cost Functionals

+

Noise Model

+

Controllability and Observability

+

Introduction

+

Definitions

+

Controllability and Observability Matrices

+

Examples

+

Cart with Two Inverted Pendulums

+

Double Inverted Pendulum

+

Two d.o.f. Oscillator

+

State Transformation

+

Control Canonical Form

+

Left and Right Eigenvectors

+

Diagonal Form

+

PBH Test

+

Residues

+

Example

+

Sensitivity

+

Controllability and Observability Gramians

+

Internally Balanced Coordinates

+

Model Reduction

+

Transfer Equivalent Realization

+

Internally Balanced Realization

+

Example

+

Stability

+

Introduction

+

Phase Portrait

+

Linear Systems

+

Routh–Hurwitz Criterion

+

Lyapunov’s Direct Method

+

Introductory Example

+

Stability Theorem

+

Asymptotic Stability Theorem

+

Lasalle’s Theorem

+

Geometric Interpretation

+

Instability Theorem

+

Lyapunov Functions for Linear Systems

+

Lyapunov’s Indirect Method

+

An Application to Controller Design

+

Energy Absorbing Controls

+

Applications

+

Digital Implementation

+

Sampling, Aliasing, and Prefiltering

+

Zero-Order Hold, Computational Delay

+

Quantization

+

Discretization of a Continuous Controller

+

Active Damping of a Truss Structure

+

Actuator Placement

+

Implementation, Experimental Results

+

Active Damping Generic Interface

+

Active Damping

+

Experiment

+

Pointing and Position Control

+

Active Damping of a Plate

+

Control Design

+

Active Damping of a Stiff Beam

+

System Design

+

The HAC/LAC Strategy

+

In active structures for precision engineering applications, the control system is used to reduce the effect of transient and steady-state disturbances on the controlled variables. +Active damping is very effective in reducing the settling time of transient disturbances and the effect of steady state disturbances near the resonance frequencies of the system; however, away from the resonances, the active damping is completely ineffective and leaves the closed-loop response essentially unchanged. +Such low-gain controllers are often called Low Authority Controllers (LAC), because they modify the poles of the system only slightly.

+

To attenuate wide-band disturbances, the controller needs larger gains, in order to cause more substantial modifications to the poles of the open-loop system; this is the reason why they are often called High Authority Controllers (HAC). +Their design requires a model of the structure, and there is usually a trade-off between the conflicting requirements of performance-bandwidth and stability in the face of parametric uncertainty and unmodelled dynamics.

+

When collocated actuator/sensor pairs can be used, stability can be achieved using positivity concepts, but in many situations, collocated pairs are not feasible for HAC.

+

The HAC/LAC approach consist of combining the two approached in a dual-loop control as shown in Figure fig:hac_lac_control. +The inner loop uses a set of collocated actuator/sensor pairs for decentralized active damping with guaranteed stability ; the outer loop consists of a non-collocated HAC based on a model of the actively damped structure. +This approach has the following advantages:

+
    +
  • The active damping extends outside the bandwidth of the HAC and reduces the settling time of the modes which are outsite the bandwidth
  • +
  • The active damping makes it easier to gain-stabilize the modes outside the bandwidth of the output loop (improved gain margin)
  • +
  • The larger damping of the modes within the controller bandwidth makes them more robust to the parmetric uncertainty (improved phase margin)
  • +
+

+
+ Figure 21: Principle of the dual-loop HAC/LAC control
+

Figure 21: Principle of the dual-loop HAC/LAC control

+
+
+ +

Wide-Band Position Control

+

Compensator Design

+

Results

+

Vibroacoustics: Volume Displacement Sensors

+

QWSIS Sensor

+

Discrete Array Sensor

+

Spatial Aliasing

+

Distributed Sensor

+

Tendon Control of Cable Structures

+

Introduction

+

Tendon Control of Strings and Cables

+

Active Damping Strategy

+

Basic Experiment

+

Linear Theory of Decentralized Active Damping

+

Guyed Truss Experiment

+

Microprecision Interferometer Testbed

+

Free-Floating Truss Experiment

+

Application to Cable-Stayed Bridges

+

Laboratory Experiment

+

Control of Parametric Resonance

+

Large Scale Experiment

+

Application to Suspension Bridges

+

Footbridge

+

Laboratory Experiment

+

Active Control of Large Telescopes: Adaptive Optics

+

Introduction

+

Wavefront Sensor

+

Zernike Modes

+

Fried Length, Seeing

+

Kolmogorov Turbulence Model

+

Strehl Ratio

+

Power Spectral Density of the Zernike Modes

+

Deformable Mirror for Adaptive Optics

+

Stoney Formula

+

Stroke Versus Natural Frequency

+

Feedback Control of an AO Mirror

+

Quasi-static Control

+

Control of the Mirror Based on the Jacobian

+

Control of Zernike Modes

+

Dynamic Response of the AO Mirror

+

Dynamic Model of the Mirror

+

Control-Structure Interaction

+

Passive Damping

+

Active Damping

+

Miscellaneous

+

Segmented AO Mirror

+

Initial Curvature of the AO Mirror

+

Active Control of Large Telescopes: Active Optics

+

Introduction

+

Monolithic Primary Mirror

+

Segmented Primary Mirror

+

SVD Controller

+

Loop Shaping of the SVD Controller

+

Dynamics of a Segmented Mirror

+

Control-Structure Interaction

+

SISO System

+

MIMO System

+

Spillover Alleviation

+

Scaling Rules

+

Static Deflection Under Gravity

+

First Resonance Frequency

+

Control Bandwidth

+

Adaptive Thin Shell Space Reflectors

+

Introduction

+

Adaptive Plates Versus Adaptive Shells

+

Adaptive Spherical Shell

+

Quasi-static Control: Hierarchical Approach

+

Petal Configuration

+

MATS Demonstrator

+

Manufacturing of the Demonstrator

+

Semi-active Control

+

Introduction

+

Magneto-Rheological Fluids

+

MR Devices

+

Semi-active Suspension

+

Semi-active Devices

+

Narrow-Band Disturbance

+

Quarter-Car Semi-active Suspension

+

Problems

+

Bibliography

+

Preumont, A., Vibration control of active structures - fourth edition (2018), : Springer International Publishing.

+ +
+
+
+
+
+ +
+ + + + +
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + diff --git a/public/book/schmidt14_desig_high_perfor_mechat_revis_edition/index.html b/public/book/schmidt14_desig_high_perfor_mechat_revis_edition/index.html new file mode 100644 index 0000000..aec5daf --- /dev/null +++ b/public/book/schmidt14_desig_high_perfor_mechat_revis_edition/index.html @@ -0,0 +1,205 @@ + + + + + + The design of high performance mechatronics - 2nd revised edition - My digital brain + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+
+ +
+ + +
+
+
+
+
+
+
Tags
+
Reference Books
+
Reference
+
(Schmidt {\it et al.}, 2014)
+
Author(s)
+
Schmidt, R. M., Schitter, G., & Rankers, A.
+
Year
+
2014
+
+

Section 2.2 Mechanics

+
+

The core of a mechatronic system is its mechanical construction and in spite of many decade of excellent designs, optimizing the mechanical structure in strength, mass and endurance, the mechanical behavior will always remain the limiting factor of the performance of any mechatronic system.

+
+

Section 2.2.2 Force and Motion

+
+

Statics deals with the stress levels that are present in the mechanical system when (quasi-)static forces are exerted on it. +It analyses the linear and non-linear strain effects that are caused by elastic and plastic deformation under these stress levels.

+

Dynamics deals with the behaviour of the mechanical system under changing forces, while often the effects are linearised and limited to strain levels well below any irreversible plastic deformation. +One should however be aware that another non-destructive source of non-linearity is found in a tried important field of mechanics, called kinematics. +The relation between angles and positions is often non-linear in such a mechanism, because of the changing angles, and controlling these often requires special precautions to overcome the inherent non-linearities by linearisation around actual position and adapting the optimal settings of the controller to each position.

+
+

+
+ Figure 1: Stabiliby condition and robustness of a feedback controlled system. The desired shape of these curves guide the control design by optimising the lvels and sloppes of the amplitude Bode-plot at low and high frequencies for suppression of the disturbances and of the base Bode-plot in the cross-over frequency region. This is called loop shaping design
+

Figure 1: Stabiliby condition and robustness of a feedback controlled system. The desired shape of these curves guide the control design by optimising the lvels and sloppes of the amplitude Bode-plot at low and high frequencies for suppression of the disturbances and of the base Bode-plot in the cross-over frequency region. This is called loop shaping design

+
+
+ +

Section 4.3.3

+
+

On might say that a high value of the unity-gain crossover frequency and corresponding high-frequency bandwidth limit is rather an unwanted side-effect of the required high loop-gain at lower frequencies, than a target for the design of a control system as such.

+
+

Section 9.3: Mass Dilemma

+
+

A reduced mass requires improved system dynamics that enable a higher control bandwidth to compensate for the increase sensitivity for external vibrations.

+
+

Bibliography

+

Schmidt, R. M., Schitter, G., & Rankers, A., The design of high performance mechatronics - 2nd revised edition (2014), : Ios Press.

+ +
+
+
+
+
+ +
+ + + + +
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + diff --git a/public/book/skogestad07_multiv_feedb_contr/index.html b/public/book/skogestad07_multiv_feedb_contr/index.html new file mode 100644 index 0000000..c2b0907 --- /dev/null +++ b/public/book/skogestad07_multiv_feedb_contr/index.html @@ -0,0 +1,4975 @@ + + + + + + Multivariable feedback control: analysis and design - My digital brain + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+
+ +
+ + +
+
+
+
+
+
+
Tags
+
Reference Books, Multivariable Control
+
Reference
+
(Skogestad & Postlethwaite, 2007)
+
Author(s)
+
Skogestad, S., & Postlethwaite, I.
+
Year
+
2007
+
+
\( +% H Infini +\newcommand{\hinf}{\mathcal{H}_\infty} +% H 2 +\newcommand{\htwo}{\mathcal{H}_2} +% Omega +\newcommand{\w}{\omega} +% H-Infinity Norm +\newcommand{\hnorm}[1]{\left\|#1\right\|_{\infty}} +% H-2 Norm +\newcommand{\normtwo}[1]{\left\|#1\right\|_{2}} +% Norm +\newcommand{\norm}[1]{\left\|#1\right\|} +% Absolute value +\newcommand{\abs}[1]{\left\lvert#1\right\lvert} +% Maximum for all omega +\newcommand{\maxw}{\text{max}_{\omega}} +% Maximum singular value +\newcommand{\maxsv}{\overline{\sigma}} +% Minimum singular value +\newcommand{\minsv}{\underline{\sigma}} +% Under bar +\newcommand{\ubar}[1]{\text{\b{$#1$}}} +% Diag keyword +\newcommand{\diag}[1]{\text{diag}\{{#1}\}} +% Vector +\newcommand{\colvec}[1]{\begin{bmatrix}#1\end{bmatrix}} +\)
+
\( +\newcommand{\tcmbox}[1]{\boxed{#1}} +% Simulate SIunitx +\newcommand{\SI}[2]{#1\,#2} +\newcommand{\ang}[1]{#1^{\circ}} +\newcommand{\degree}{^{\circ}} +\newcommand{\radian}{\text{rad}} +\newcommand{\percent}{\%} +\newcommand{\decibel}{\text{dB}} +\newcommand{\per}{/} +% Bug with subequations +\newcommand{\eatLabel}[2]{} +\newenvironment{subequations}{\eatLabel}{} +\)
+

Introduction

+

+

The Process of Control System Design

+

The process of designing a control system is a step by step design procedure as follows:

+
    +
  1. Study the system (plant) to be controlled and obtain initial information about the control objectives
  2. +
  3. model the system and simplify the model, if necessary
  4. +
  5. scale the variables and analyze the resulting model; determine its properties
  6. +
  7. Decide which variables are to be controlled (controlled outputs)
  8. +
  9. Decide on the measurements and manipulated variables: what sensors and actuators will be used and where will they be placed?
  10. +
  11. Select the control configuration
  12. +
  13. Decide on the type of controller to be used
  14. +
  15. Decide on performance specifications, based on the overall control objectives
  16. +
  17. Design a controller
  18. +
  19. Analyze the resulting controlled system to see if the specifications are satisfied; and if they are not satisfied modify the specifications or the type of controller
  20. +
  21. Simulate the resulting controlled system
  22. +
  23. Repeat from step 2 if necessary
  24. +
  25. Choose hardware and software and implement the controller
  26. +
  27. Test and validate the control system, and tune the controller on-line, if necessary
  28. +
+

Input-output controllability analysis is studied in section sec:perf_limit_siso for SISO systems and in section sec:perf_limit_mimo for MIMO systems. +The steps 4, 5, 6 and 7 are corresponding to the control structure design. This is treated in section sec:controller_structure_design. +The design of the controller is described in section sec:controller_design. +The analysis of performance and robustness of a controlled system is studied in sections sec:uncertainty_robustness_siso and sec:robust_perf_mimo.

+

The Control Problem

+

The objective of a control system is to make the output \(y\) behave in a desired way by manipulating the plant input \(u\). +The regulator problem is to manipulate \(u\) to counteract the effect of a disturbance \(d\). +The servo problem is to manipulate \(u\) to keep the output close to a given reference input \(r\).

+

In both cases, we want the control error \(e = y - r\) to be small. +The algorithm for adjusting \(u\) based on \(y\) is the controller \(K\). +To arrive at a good design for \(K\) we need information about the expected disturbances, the reference inputs, the plant model \(G\) and disturbance model \(G_d\).

+

A major source of difficulty is that models may be inaccurate or may change with time. +The inaccuracy in \(G\) may cause instability problems as it is part of the feedback loop. +To deal with such a problem, the concept of model uncertainty will be used.

+
+
+
+
Nominal Stability (NS)
+
The system is stable with no model uncertainty
+
Nominal Performance (NP)
+
The system satisfies the performance specifications with no model uncertainty
+
Robust Stability (RS)
+
The system is stable for all perturbed plants about the nominal model up to the worst case uncertainty
+
Robust Performance (RP)
+
The system satisfies the performance specifications for all perturbed plants about the nominal model up to the worst-case model uncertainty
+
+
+

Transfer Functions

+

Properties of transfer functions:

+
    +
  • A system \(G(s)\) is strictly proper if \(G(s) \rightarrow 0\) as \(\w \rightarrow \infty\)
  • +
  • A system \(G(s)\) is semi-proper if \(G(s) \rightarrow D \ne 0\) as \(\w \rightarrow \infty\)
  • +
  • A system \(G(s)\) is proper if \(G(s)\) is strictly proper or semi-proper
  • +
  • The order of the system noted \(n\) and is the order of the denominator (or pole polynomial) of its matrix transfer function
  • +
+

Scaling

+

Scaling is very important in applications, both for model analysis (input-output controllability) and for controller design.

+

The scaling is done by dividing each variable by its maximum expected or allowed change. +That way, the scaled variable should be less than one in magnitude.

+

We denote variables in their unscaled units by a hat.

+
    +
  • \(d = \hat{d}/D_d\) with \(D_d = \hat{d}_{\max}\) is the largest expected change in disturbance
  • +
  • \(u = \hat{u}/D_u\) with \(D_u = \hat{u}_{\max}\) is the largest allowed input change
  • +
+

The variables \(\hat{y}\), \(\hat{r}\) and \(\hat{e}\) are in the same unit, so we choose to scale them with respect to the maximum allowed control error:

+
    +
  • \(e = \hat{e}/D_e\) with \(D_e = \hat{e}_{\max}\) is the largest allowed control error
  • +
  • \(r = \hat{r}/D_e\)
  • +
  • \(y = \hat{y}/D_e\)
  • +
+

For MIMO systems, each variables in the vectors \(\hat{d}\), \(\hat{r}\), \(\hat{u}\) and \(\hat{e}\) may have a different maximum value, in which case \(D_e\), \(D_u\), \(D_s\) and \(D_r\), become diagonal scaling matrices.

+
+
+

\begin{align*} +G &= D_e^{-1} \hat{G} D_u\\\
+G_d &= D_e^{-1} \hat{G_d} D_d +\end{align*}

+
+

We then obtain the following model in terms of scaled variables: +\[ y = G u + G_d d \] +where \(u\) and \(d\) should be less than 1 in magnitude.

+

It is sometimes useful to introduce a scaled reference \(\tilde{r}\) which is less than 1 in magnitude: \(\tilde{r} = \hat{r}/\hat{r}_{\max} = D_r^{-1}\hat{r}\) +Then we have \(r = R \tilde{r}\) with \(R \triangleq D_e^{-1}D_r = \hat{r}_{\max}/\hat{e}_{\max}\) is the largest expected change in reference relative to the allowed control error.

+

With scaling you make initial decision regarding performance. This makes weight selection simple later (may often select identity weights if initial scaling is reasonable!).

+

Deriving Linear Models

+

Linear models may be obtained from physical “first-principle” models or from analyzing input-output data (identification).

+

In order to obtain a linear model from the “first-principle”, the following approach is used:

+
    +
  1. Formulate a nonlinear state-space model based on physical knowledge
  2. +
  3. Determine the steady-state operating point about which to linearize
  4. +
  5. Introduce deviation variables and linearize the model
  6. +
+

Notation

+

Notations used throughout this note are summarized in tables table:notation_conventional, table:notation_general and table:notation_tf.

+

+
+ Table 1: + Notations for the conventional control configuration +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NotationMeaning
\(G\)Plant model
\(K\)Controller
\(G_d\)Disturbance model
\(r\)Reference inputs
\(n\)Measurement noise
\(y\)Plant outputs
\(y_m\)Measurements
\(u\)Control signals
+

+
+ Table 2: + Notations for the general configuration +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
NotationMeaning
\(P\)Generalized plant model
\(w\)Exogenous inputs: commands, disturbances, noise
\(z\)Exogenous outputs: signals to be minimized
\(v\)Controller inputs: measurements
\(u\)Control signals
+

+
+ Table 3: + Notations for transfer functions +
+ + + + + + + + + + + + + + + + + + + + + +
NotationMeaning
\(L\)Loop gain: \(L = GK\)
\(S\)Sensitivity function: \(S = (I + L)^{-1}\)
\(T\)Complementary sensitivity function: \(T = (I + L)*(I + L)^{-1}\)
+

Classical Feedback Control

+

+

Frequency Response

+

By replacing \(s\) by \(j\omega\) in a transfer function \(G(s)\), we get the frequency response description. It can be used to describe:

+
    +
  • A system’s response to sinusoids of varying frequency
  • +
  • The frequency content of a deterministic signal via the Fourier transform
  • +
  • The frequency distribution of a stochastic signal via the power spectral density
  • +
+

After sending a sinusoidal signal through a system \(G(s)\), the signal’s magnitude is amplified by a factor \(\abs{G(j\omega)}\) and its phase is shifted by \(\angle{G(j\omega)}\).

+
+
+

minimum phase systems are systems with no time delays or RHP-zeros.

+

The name minimum phase refers to the fact that such a system has the minimum possible phase lag for the given magnitude response \(|G(j\omega)|\).

+

RHP-zeros and time delays contribute additional phase lag to a system when compare to that of a minimum phase system with the same gain (hence the term non-minimum phase system).

+
+

For minimum phase systems, there is a unique relationship between the gain and phase of the frequency response: the Bode gain-phase relationship:

+

\begin{equation} +\angle{G(j\w_0)} = \frac{1}{\pi} \int_{-\infty}^{\infty} \frac{d\ln{\abs{G(j\w)}}}{d\ln{\w}} \ln{\abs{\frac{\w+\w_0}{\w-\w_0}}} \frac{d\w}{\w} +\end{equation}

+

We note \(N(\w_0) = \left( \frac{d\ln{|G(j\w)|}}{d\ln{\w}} \right)_{\w=\w_0}\) that corresponds to the slope of the magnitude of \(G(s)\) in log-variables. We then have the following approximation of the Bode gain-phase relationship:

+

\begin{equation} +\tcmbox{\angle{G(j\w_0)} \approx \frac{\pi}{2} N(\w_0)} +\end{equation}

+

Feedback Control

+

One Degree-of-Freedom Controller

+

The simple one degree-of-freedom controller negative feedback structure is represented in Fig. fig:classical_feedback_alt.

+

The input to the controller \(K(s)\) is \(r-y_m\) where \(y_m = y+n\) is the measured output and \(n\) is the measurement noise. +Thus, the input to the plant is \(u = K(s) (r-y-n)\). +The objective of control is to manipulate \(u\) (design \(K\)) such that the control error \(e\) remains small in spite of disturbances \(d\). +The control error is defined as \(e = y-r\).

+

+
+ Figure 1: Configuration for one degree-of-freedom control
+

Figure 1: Configuration for one degree-of-freedom control

+
+
+ +

Closed-loop Transfer Functions

+
+
+

\begin{subequations} +\begin{align} +y &= T r + S G_d d + T n\\\
+e &= -S r + S G_d d - T n\\\
+y &= KS r - KS G_d d - KS n +\end{align} +\end{subequations}

+
+

Why Feedback?

+

We could think that we can use a “perfect” feedforward controller \(K_r(s) = G^{-1}(s)\) with \(r-G_d d\) as the controller input: +\[ y = G u + G_d d = G K_r (r - G_d d) + G_d d = r \] +Unfortunately, \(G\) is never an exact model and the disturbances are never known exactly.

+
+
+
    +
  • Signal uncertainty
  • +
  • Unknown disturbance
  • +
  • Model uncertainty
  • +
  • An unstable plant
  • +
+
+

Closed Loop Stability

+

Two methods are commonly used to determine closed-loop stability:

+
    +
  1. The system is stable if and only if all the closed-loop poles (roots of \(1 + L(s) = 0\)) are in the open LHP. The poles are also equal to the eigenvalues of the state-space \(A\) matrix (this is how the poles are computed).
  2. +
  3. The frequency response of \(L(j\w)\) is plotted in the complex plane and the number of encirclement it makes around the critical point \(-1\) is counted. +
      +
    • Nyquist’s stability criterion: Closed-loop stability is inferred by equating the number of encirclement to the number of open-loop RHP-poles
    • +
    • Bode’s stability condition: The closed loop system is stable if and only if \(\vert L(j \w_{180})\vert < 1\) where \(\w_{180}\) is the phase crossover frequency defined by \(\angle L(j \w_{180})=\ang{-180}\). This is only valid for open-loop stable systems where \(\angle L(j\w)\) falls with frequency and such that \(\angle L(j\w)\) crosses \(\ang{-180}\) only once.
    • +
    +
  4. +
+

Method 1 is best suited for numerical calculation while method 2 has a nice graphical interpretation and may also be used for systems with time delays. +Moreover, method 2 provides useful measure of relative stability and will be used for robustness test.

+

Evaluating Closed-Loop Performance

+

Gain Margin

+

The Gain Margin is defined as:

+

\begin{equation} +\tcmbox{\text{GM} = \frac{1}{|L(j\w_{180})|}} +\end{equation}

+

with \(\w_{180}\) is the phase crossover frequency defined by \(\angle L(j \w_{180}) = \ang{-180}\). +If there is more than one crossing (\(\angle L(j \w_{180}) = \ang{-180}\)), the largest value of \(\vert L(j\w_{180})\vert\) is taken.

+

The GM is the factor by which the loop gain \(\vert L(s)\vert\) may be increased before the closed-loop system becomes unstable.

+

Phase Margin

+

The Phase Margin is defined as:

+

\begin{equation} +\tcmbox{\text{PM} = \angle L(j \w_c) + \ang{180}} +\end{equation}

+

with \(\w_c\) the gain crossover frequency defined by \(\vert L(j \w_c)\vert = 1\).

+

The PM tells how much negative phase (phase lag) we can add to \(L(s)\) at frequency \(\omega_c\) before closed-loop instability appears.

+

Typically, we required the PM to be larger than \(\SI{30}{\degree}\). This is a safeguard against time delay uncertainty, the system becomes unstable is we add a delay of \(\theta_{max} = PM / \w_c\).

+

Note that by decreasing the value of \(\omega_c\) (lowering the closed-loop bandwidth) the system can tolerate larger time delays.

+

Maximum Peak Criteria

+
+
+

\begin{subequations} +\begin{align} +M_S &= \max_{\w} \abs{S(j\w)} = \hnorm{S}\\\
+M_T &= \max_{\w} \abs{T(j\w)} = \hnorm{T} +\end{align} +\end{subequations}

+
+

Typically, we require \(M_S < 2\ (6dB)\) and \(M_T < 1.25\ (2dB)\).

+

Why do we want \(M_S\) small?

+
    +
  • Without feedback, with have \(e = r - G_d d\) but with feedback \(e = S(r - G_d d)\). Thus feedback improves performance in terms of reducing \(|e|\) where \(|S|<1\). However, we cannot avoid having \(|S|>1\) at some intermediate frequency where feedback control degrades performance. The value of \(M_S\) is then a measure of the worst-case performance degradation
  • +
  • \(M_S\) is also a measure of the robustness because the smallest distance between \(L(\w)\) and the critical point \(-1\) is \({M_S}^{-1}\)
  • +
+

There is a close relationship between these maximum peaks and the gain and phase margins. +For a given value of \(M_S\), we have:

+

\begin{equation} +\tcmbox{\text{GM} \geq \frac{M_S}{M_S-1}; \quad \text{PM} \geq \frac{1}{M_S}} +\end{equation}

+

Example of guaranteed stability margins:

+
    +
  • \(M_S < 2 \Rightarrow GM > 2\) and \(PM > \SI{29}{\degree}\)
  • +
  • \(M_T < 2 \Rightarrow GM > 1.5\) and \(PM > \SI{29}{\degree}\)
  • +
+

Bandwidth and Crossover Frequency

+

In general, a large bandwidth corresponds to a faster rise time, however, this also indicates an higher sensitivity to noise and to parameter variations.

+
+
+

The bandwidth, is the frequency range \([\w_1, \w_2]\) over which control is effective. In most case we simple call \(\w_2 = \w_B\) the bandwidth.

+
+

As the word “effective” may be interpreted in different ways, there are multiple definitions of bandwidth:

+
    +
  • The closed-loop bandwidth \(\w_B\) is the frequency where \(\vert S(j\w)\vert\) first crosses \(1/\sqrt{2}\approx -3dB\) from below.
  • +
  • The gain crossover frequency \(\w_c\) is defined as the frequency where \(\vert L(j \w_c)\vert\) first crosses 1 from above
  • +
  • The bandwidth in terms of \(T\), \(\w_{BT}\), is the highest frequency at which \(\vert T(j \w_c)\vert\) crosses \(1/\sqrt{2}\approx -3dB\) from above.
  • +
+

For systems with \(PM < \ang{90}\), we have: \(\w_{B} <\w_{c} < \w_{BT}\) +Then we have the following regions:

+
    +
  • \(\w < \w_B\): \(|S|<0.7\) and control is effective
  • +
  • \(\w_B < \w < \w_{BT}\): we may have \(|S| > 1\) and control degrades performance
  • +
  • \(\w_{BT} < \w\): \(|S| \approx 1\) and control has no significant effect on the response
  • +
+

The closed-loop time constant \(\tau_{\text{cl}}\) can be related to the bandwidth:

+

\begin{equation} +\tcmbox{\tau_{\text{cl}} \approx \frac{1}{\w_b}} +\end{equation}

+

Controller Design

+

There is 3 mains approaches to controller design:

+
    +
  1. Shaping of transfer functions. The designer specifies the magnitude of some transfer functions as a function of frequency and then finds a controller which gives the desired shape(s) +
      +
    1. Loop shaping of the open-loop transfer function \(L(j\w)\)
    2. +
    3. Shaping of closed-loop transfer functions such as \(S\), \(T\) and \(KS\)
    4. +
    +
  2. +
  3. The signal based approach. This involves time domain problem formulations resulting in the minimization of a norm of a transfer function. Linear Quadratic Gaussian (LQG) is an example of a signal based approach. A signal based \(\hinf\) optimal control methodology can be derived.
  4. +
  5. Numerical optimization. This often involves multi-objective optimization where one attempts to optimize directly the true objectives such as rise times, stability margins, … This problems may be difficult to solve, especially if one does not have convexity in the control parameters. This optimization may also be performed online.
  6. +
+

Loop Shaping

+

Trade-offs in Terms of \(L\)

+

Let’s consider a feedback control system with error \(e = -S r + S G_d d - T n\). +If we want perfect control:

+
    +
  • For disturbance rejection and command tracking, we obtain \(S \approx 0\), this implies that the loop transfer function \(L\) must be large in magnitude
  • +
  • For zero noise transmission, we want \(T \approx 0\) or equivalently \(S \approx I\) which is obtained with \(L \approx 0\).
  • +
+

This illustrate the fundamental nature of feedback design which always involves a trade-off between conflicting objectives.

+

The most important design objectives are:

+
+
Performance
+
\(L\) large
+
Good dist. rejection
+
\(L\) large
+
Limitation of meas. noise on plant output
+
\(L\) small
+
Small magnitude of input signal
+
\(K\) and \(L\) small
+
Strictly proper controller
+
\(K\rightarrow 0\) at high frequencies
+
Nominal stability
+
\(L\) small (RHP zeros and time delays)
+
Robust stability
+
\(L\) small (neglected dynamics)
+
+

Fortunately, the conflicting design objectives are generally in different frequency ranges, and we can meet most of the objectives by using large loop gain at low frequencies and a small gain at high frequencies above crossover.

+

Fundamentals of Loop-Shaping Design

+
+
+

Design procedure that involves explicitly shaping the magnitude of the loop transfer function \(\abs{L(j\w)}\).

+
+

To get the benefits of feedback control, we want the loop gain \(\abs{L(j\w)}\) to be as large as possible within the bandwidth region. +However, due to time delays, RHP-zeros, unmodelled high-frequency dynamics and limitations on the allowed manipulated inputs, the loop gain has to drop below one at and above the crossover frequency \(\w_c\).

+
+
+

To measure how \(\abs{L(j\w)}\) falls with frequency, we consider the logarithmic slope:

+

\begin{equation} +N = \frac{d \ln{\abs{L}}}{d \ln{\w}} +\end{equation}

+

The value of \(-N\) at high frequencies is called the roll-off rate.

+
+

To get a high bandwidth (fast response) we want \(\w_c\) large (thus \(\w_{180}\) large), that is we want the phase lag in \(L\) to be small. Unfortunately, that is not consistent with the desire that \(\abs{L(j\w)}\) should fall sharply (because of the approximation \(\angle{L} \approx -N * \SI{90}{\degree}\)).

+

The situation becomes even worse for cases with delays or RHP-zeros in \(L(s)\) which add undesirable phase lag without contributing to a desirable negative slope.

+

We can define the desired loop transfer function in terms of the following specifications:

+
    +
  1. The gain crossover frequency \(\w_c\), where \(\abs{L(j\w_c)} = 1\)
  2. +
  3. The shape of \(\abs{L(j\w)}\): +
      +
    • Slope of \(N=-1\) around crossover
    • +
    • Large roll-off at higher frequencies (\(N>2\))
    • +
    • Slope at low frequencies depending on the nature of the disturbance or reference signal. +We required a slope of \(-1\) for step changes and \(-2\) for ramp changes
    • +
    +
  4. +
  5. The system type, defined as the number of pure integrators in \(L(s)\)
  6. +
+

Limitations Imposed by RHP-zeros and Time Delays

+

We usually want the loop shape to have a slope of \(-1\) around crossover \(\w_c\), then the phase lag of \(L\) at \(\w_c\) will be at least \(\SI{-90}{\degree}\). +If we require a phase margin of \(\SI{-35}{\degree}\), then the additional phase contribution from delays and RHP zeros at \(\w_c\) cannot exceed \(\SI{-55}{\degree}\).

+

First consider a time delay \(\theta\) which adds a phase of \(-\theta \omega\). +Thus, we want \(\theta \omega_c < \SI{55}{\degree} \approx \SI{1}{\radian}\). +The attainable bandwidth is limited by the time delay:

+

\begin{equation} +\tcmbox{\omega_c < 1/\theta} +\end{equation}

+

Next consider a RHP-zero at \(s = z\). +To avoid an increase in slope cause by the zero, we add a pole at \(s = -z\), then \(L\) contains \(\frac{-s+z}{s+z}\) which corresponds to an all-pass filter. +The phase contribution is \(\approx \SI{-55}{\degree}\) at \(\w = z/2\). +Thus, this limits the attainable bandwidth:

+

\begin{equation} +\tcmbox{\w_c < z/2} +\end{equation}

+

Inverse-Based Controller Design

+

The idea is to have \(L(s) = \frac{\w_c}{s}\) with \(\w_c\) the desired gain crossover frequency. +The controller associated is then \(K(s) = \frac{\w_c}{s}G^{-1}(s)\) {the plant is inverted and an integrator is added}. +This idea is the essential part of the internal model control (IMC). +This loop shape yields a phase margin of \(\SI{90}{\degree}\) and an infinite gain margin.

+

They are many reasons why the inverse-based controller may not be a good choice:

+
    +
  • The controller will not be realizable if \(G(s)\) has a pole excess of two or larger
  • +
  • The loop shape is not generally desirable, unless the references and disturbances are steps
  • +
+

Loop Shaping for Disturbance Rejection

+

We have \(e = S G_d d\) with \(\abs{d(j\w)} < 1\) at each frequency (thanks to scaling). +The main control objective is to achieve \(\abs{e(j\w)} < 1\). +Then, we require: \(\abs{S(j\w) G_d(j\w)} < 1, \forall \w\) or equivalently \(\abs{1 + L(j\w)} > \abs{G_d}, \forall \w\).

+

Note that we don’t want to have larger loop gain than necessary to not increase input signals and sensitivity to noise. +A reasonable loop shape is then \(\abs{L} = \abs{G_d}\).

+

The corresponding controller satisfies

+

\begin{equation} +\abs{K} = \abs{G^{-1}G_d} +\end{equation}

+

This means that:

+
    +
  • For disturbances entering at the plant output (\(G_d = 1\)), we get \(\abs{K} = \abs{G^{-1}}\)
  • +
  • For disturbances entering at the plant input (\(G_d = G\)), we get \(\abs{K} = 1\)
  • +
  • Note that reference change may be viewed as a disturbance directly affecting the output
  • +
+

The loop-shape \(L(s)\) may be modify as follows:

+
    +
  • Around crossover, make the slope of \(|L|\) to be about -1. This is to achieve good transient behavior with acceptable gain and phase margins
  • +
  • Improve the low frequency performance by adding integral action \(\abs{K} = \abs{\frac{s+\w_I}{s}}\abs{G^{-1}G_d}\)
  • +
  • Let \(L(s)\) roll of faster at high frequencies in order to reduce the effect of noise and the input magnitude
  • +
+

Two Degrees-of-freedom Design

+

For reference tracking, we typically want the controller to look like \(\frac{1}{s} G^{-1}\), whereas for disturbance rejection we want the controller to look like \(\frac{1}{s} G^{-1}G_d\).

+

We cannot achieve both of these simultaneously with a single feedback controller.

+

The solution is to use a two degrees of freedom controller where the reference signal \(r\) and output measurement \(y_m\) are independently treated by the controller (Fig. fig:classical_feedback_2dof_alt), rather than operating on their difference \(r - y_m\).

+

+
+ Figure 2: 2 degrees-of-freedom control architecture
+

Figure 2: 2 degrees-of-freedom control architecture

+
+
+ +

The controller can be slit into two separate blocks (Fig. fig:classical_feedback_sep):

+
    +
  • the feedback controller \(K_y\) that is used to reduce the effect of uncertainty (disturbances and model errors)
  • +
  • the prefilter \(K_r\) that shapes the commands \(r\) to improve tracking performance
  • +
+

+
+ Figure 3: 2 degrees-of-freedom control architecture with two separate blocs
+

Figure 3: 2 degrees-of-freedom control architecture with two separate blocs

+
+
+ +

It is optimal to design the combined two degrees of freedom controller \(K\) in one step, however, in practice \(K_y\) is often designed first for disturbance rejection, and then \(K_r\) is designed to improve reference tracking.

+

Shaping Closed-Loop Transfer Functions

+

Specifications on the open-loop transfer function \(L = GK\) does not consider directly the closed-loop transfer functions, such as \(S\) and \(T\) which determine the final response. +An alternative design strategy is to directly shape the magnitude of the closed loop transfer functions. This strategy can be formulated as an \(\hinf\) optimal control problem.

+

The Terms \(\hinf\) and \(\htwo\)

+

The \(\hinf\) norm of a stable scalar transfer function \(f(s)\) is simply the peak value of \(\abs{f(j\w)}\) as a function of frequency:

+

\begin{equation} +\tcmbox{\hnorm{f(s)} \triangleq \max_{\w} \abs{f(j\w)}} +\end{equation}

+

Similarly, the symbol \(\htwo\) stands for the Hardy space of transfer function with bounded 2-norm:

+

\begin{equation} +\tcmbox{\normtwo{f(s)} \triangleq \left( \frac{1}{2\pi} \int_{-\infty}^{\infty} \abs{f(j\w)}^2 d\w \right)^{1/2}} +\end{equation}

+

Weighted Sensitivity

+

The sensitivity function \(S\) is a very good indicator of closed-loop performance. The main advantage of considering \(S\) is that we want \(S\) small and it is sufficient to consider just its magnitude \(\abs{S}\).

+
+
+
    +
  • Minimum bandwidth frequency \(\w_B^*\)
  • +
  • Maximum tracking error at selected freq.
  • +
  • The maximum steady state tracking error \(A\)
  • +
  • Shape of \(S\) over selected frequency ranges
  • +
  • Maximum magnitude of \(S\): \(\hnorm{S(j\w)} \leq M\)
  • +
+
+

The maximum peak specification prevents amplification of noise at high frequencies, and also introduces a margin of robustness. Typically, we select \(M = 2\).

+

Mathematically, these specifications may be captured by an upper bound \(1/\abs{W_P(s)}\) on the magnitude of \(S\) where \(W_P(s)\) is a weight selected by the designer. +The subscript \(P\) stands for performance since \(S\) is mainly used as a performance indicator.

+

The performance requirement becomes +\[ S(j\w) < 1/\abs{W_P(j\w)}, \forall \w \] +Which can be expressed as an \(\mathcal{H}_\infty\):

+

\begin{equation} +\tcmbox{\hnorm{W_P S} < 1} +\end{equation}

+
+
+

\[W_P(s) = \frac{s/M + \w_B^*}{s + \w_B^* A}\]

+

With (see Fig. fig:performance_weigth):

+
    +
  • \(M\): maximum magnitude of \(\abs{S}\)
  • +
  • \(\w_B\): crossover frequency
  • +
  • \(A\): steady-state offset
  • +
+
+

+
+ Figure 4: Inverse of performance weight
+

Figure 4: Inverse of performance weight

+
+
+ +

If we want a steeper slope for \(L\) below the bandwidth, an higher order weight may be selected. A weight which ask for a slope of \(-2\) for \(L\) below crossover is: +\[W_P(s) = \frac{(s/M^{1/2} + \w_B^*)^2}{(s + \w_B^* A^{1/2})^2}\]

+

Stacked Requirements: Mixed Sensitivity

+

The specification \(\hnorm{W_P S} < 1\) puts a lower bound on the bandwidth, but not an upper one and nor does it allow us to specify the roll-off of \(L(s)\) above the bandwidth.

+

To do this, we can make demands on another closed-loop transfer function \(T\) by specifying an upper bound \(1/\abs{W_T}\) on the magnitude \(\abs{T}\) to make sure that \(L\) rolls off sufficiently fast at high frequencies.

+

Also, to achieve robustness or to restrict the magnitude of the input signal \(u\), one may place an upper bound \(1/\abs{W_U}\) on the magnitude \(KS\).

+

To combined these mixed sensitivity specifications, a stacking approach is usually used, resulting in the following overall specification: +\[\maxw \maxsv(N(j\w)) < 1; \quad N = \colvec{W_P S \ W_T T \ W_U KS}\]

+

After selecting the form of \(N\) and the weights, the \(\hinf\) optimal controller is obtained by solving the problem \(\min_K\hnorm{N(K)}\).

+

Introduction to Multivariable Control

+

+

Introduction

+

The main difference between a SISO system and a MIMO system is the presence of directions in the latter.

+

However, most of the ideas and techniques used for SISO systems may be extended to MIMO systems. +This is done by considering the maximum singular value instead of the absolute value.

+

The singular value decomposition (SVD) provides a useful way of quantifying multivariable directionality.

+

For MIMO systems the gain \(\frac{\abs{Gd}}{\abs{d}}\) (where \(\abs{\cdot}\) is some norm) is independent of the magnitude \(\abs{d}\) (like for SISO systems), but it does depend on its direction.

+

A plant is said to be ill-conditioned if the gain depends strongly on the input direction. It is quantified by the condition number \(\Gamma\) (which is much larger than 1 for an ill-conditioned plant).

+

For MIMO systems the order of the transfer functions matter, so in general:

+

\begin{equation} +\tcmbox{GK \neq KG} +\end{equation}

+

even when \(G\) and \(K\) are square matrices.

+

Transfer Functions

+
+
+

The main rule for evaluating transfer functions is the MIMO Rule: Start from the output and write down the transfer functions as you meet them going to the input. If you exit a feedback loop then we get a term \((I-L)^{-1}\) where \(L = GK\) is the transfer function around the loop (gain going backwards).

+
+

Negative Feedback Control Systems

+

For negative feedback system (Fig. fig:classical_feedback_bis), we define \(L\) to be the loop transfer function as seen when breaking the loop at the output of the plant:

+
    +
  • \(L = G K\)
  • +
  • \(S \triangleq (I + L)^{-1}\) is the transfer function from \(d_1\) to \(y\)
  • +
  • \(T \triangleq L(I + L)^{-1}\) is the transfer function from \(r\) to \(y\)
  • +
+

+
+ Figure 5: Conventional negative feedback control system
+

Figure 5: Conventional negative feedback control system

+
+
+ +

We define \(L_1\) to be the loop transfer function as seen when breaking the loop at the input to the plant:

+
    +
  • \(L_1 = K G\)
  • +
  • \(S_1 \triangleq (I + L_1)^{-1}\)
  • +
  • \(T_1 \triangleq L_1(I + L_1)^{-1}\) is the transfer function from \(d_2\) to \(-u\)
  • +
+

Multivariable Frequency Response Analysis

+

Obtaining the Frequency Response from \(G(s)\)

+

Consider the system \(G(s)\) with input \(d(s)\) and output \(y(s)\). +The element \(g_{ij}(j\w)\) of the matrix \(G\) represents the sinusoidal response from the input \(j\) to output \(i\).

+

Directions in Multivariable Systems

+

For a SISO system, the gain at \(\omega\) is simply:

+

\begin{equation} +\frac{|y(\w)|}{|d(\w)|} = \frac{|G(j\w)d(\w)|}{|d(\w)|} = |G(j\w)| +\end{equation}

+

The gain depends on the frequency \(\w\) but it is independent of the input magnitude \(|d(\w)|\).

+

For MIMO systems, we have to use norms to measure the amplitude of the inputs/outputs. +If we select vector 2-norm, the magnitude of the vector input signal is: +\[ \normtwo{d(\w)} = \sqrt{\sum_j |d_j(\w)|^2} \]

+

The gain of the system is then:

+

\begin{equation} +\frac{\normtwo{y(\w)}}{\normtwo{d(\w)}} = \frac{\normtwo{G(j\w)d(\w)}}{\normtwo{d(\w)}} = \frac{\sqrt{\sum_j |y_j(\w)|^2}}{\sqrt{\sum_j |d_j(\w)|^2}} +\end{equation}

+

Again the gain depends on the frequency \(\w\) and again it is independent of the input magnitude \(\normtwo{d(\w)}\). However, the gain depends also on the direction of the input \(d\).

+

Eigenvalues as a Poor Measure of Gain

+

The magnitudes of the eigenvalues of a transfer function matrix \(\abs{\lambda_i(G(j\w))}\) do not provide a useful means of generalizing the SISO gain. +The main problem is that the eigenvalues measure the gain for the special case when the inputs and the outputs are in the same direction, namely in the direction of the eigenvectors.

+

Singular Value Decomposition

+

We are interested by the physical interpretation of the SVD when applied to the frequency response of a MIMO system \(G(s)\) with \(m\) inputs and \(l\) outputs.

+
+
+

\begin{equation} +G = U \Sigma V^H +\end{equation}

+
+
\(\Sigma\)
+
is an \(l \times m\) matrix with \(k = \min\{l, m\}\) non-negative singular values \(\sigma_i\), arranged in descending order along its main diagonal, the other entries are zero.
+
\(U\)
+
is an \(l \times l\) unitary matrix. The columns of \(U\), denoted \(u_i\), represent the output directions of the plant. They are orthonormal.
+
\(V\)
+
is an \(m \times m\) unitary matrix. The columns of \(V\), denoted \(v_i\), represent the input directions of the plant. They are orthonormal.
+
+
+

The input and output directions are related through the singular values:

+

\begin{equation} +\tcmbox{G v_i = \sigma_i u_i} +\end{equation}

+

So, if we consider an input in the direction \(v_i\), then the output is in the direction \(u_i\). Furthermore, since \(\normtwo{v_i}=1\) and \(\normtwo{u_i}=1\), we see that the singular value \(\sigma_i\) directly gives the gain of the matrix \(G\) in this direction.

+

The largest gain for any input is equal to the maximum singular value: +\[\maxsv(G) \equiv \sigma_1(G) = \max_{d\neq 0}\frac{\normtwo{Gd}}{\normtwo{d}} = \frac{\normtwo{Gv_1}}{\normtwo{v_1}} \] +The smallest gain for any input direction is equal to the minimum singular value: +\[\minsv(G) \equiv \sigma_k(G) = \min_{d\neq 0}\frac{\normtwo{Gd}}{\normtwo{d}} = \frac{\normtwo{Gv_k}}{\normtwo{v_k}} \]

+

We define \(u_1 = \bar{u}\), \(v_1 = \bar{v}\), \(u_k=\ubar{u}\) and \(v_k = \ubar{v}\). Then is follows that: +\[ G\bar{v} = \maxsv \bar{u} ; \quad G\ubar{v} = \minsv \ubar{u} \]

+

Non Square Plants

+

If the plant has more output than inputs, the outputs singular vectors \(u_i\) with \(i > k\) correspond to the outputs directions that cannot be controlled.

+

Similarly, for a plant with more inputs and outputs, the additional input singular vectors tells us in which directions the input will have no effect.

+

Singular Values for Performance

+

The gain of the MIMO system from the vector of reference inputs \(r\) and the vector of control error \(e\) is bounded by the minimum and maximum singular values of \(S\): +\[ \minsv(S(j\w)) < \frac{\normtwo{e(\w)}}{\normtwo{r(\w)}} < \maxsv(S(j\w)) \]

+

In terms of performance, we require that the gain remains small for any direction of \(r(\w)\) including the “worst-case” direction corresponding to the gain \(\maxsv(S(j\w))\). Let \(1/\abs{W_P(j\w)}\) represent the maximum allowed magnitude of \(\frac{\normtwo{e(\w)}}{\normtwo{r(\w)}}\) at each frequency: +\[ \maxsv(S(j\w)) < \frac{1}{\abs{W_P}}, \forall \w \Leftrightarrow \hnorm{W_P S} < 1 \]

+
+
+

The \(\hinf\) norm is defined as the peak of the maximum singular value of the frequency response:

+

\begin{equation} +\hnorm{M(s)} \triangleq \max_{\w} \maxsv(M(j\w)) +\end{equation}

+
+

For MIMO systems the bandwidth depends on direction. +If we want to associate a single bandwidth frequency for a multivariable system, then we consider the worst-case direction, and define the bandwidth \(\w_B\) as the frequency where \(\maxsv(S)\) crosses \(\frac{1}{\sqrt{2}} = 0.7\) from below.

+

Control of Multivariable Plants

+

A conceptually simple approach to multivariable control is given by a two-step procedure:

+
    +
  1. Design a pre-compensator \(W_1\), which counteracts the interactions in the plant and results in a new shaped plant \(G_S(s) = G(s) W_1(s)\) which is more diagonal and easier to control than the original plant \(G(s)\).
  2. +
  3. Design a diagonal controller \(K_S(s)\) for the shaped plant using methods similar to those for SISO systems.
  4. +
+

The overall controller is then: +\[ K(s) = W_1(s)K_s(s) \]

+

Decoupling

+

There are mainly three different cases:

+
    +
  1. Dynamic decoupling: \(G_S(s)\) is diagonal at all frequencies. For that we can choose \(W_1(s) = G^{-1}(s)\) and this is an inverse-based controller.
  2. +
  3. Steady-state decoupling: \(G_S(0)\) is diagonal. This can be obtained by selecting \(W_1(s) = G^{-1}(0)\).
  4. +
  5. Approximate decoupling at frequency \(\w_0\): \(G_S(j\w_0)\) is as diagonal as possible. Decoupling the system at \(\w_0\) is a good choice because the effect on performance of reducing interaction is normally greatest at this frequency.
  6. +
+

The idea of decoupling control is appealing, but there are several difficulties:

+
    +
  1. It is very sensitive to modelling errors
  2. +
  3. It may not be required for disturbance rejection
  4. +
  5. If the plant has RHP-zero, the decoupling generally introduces extra RHP-zero in the closed-loop system
  6. +
+

SVD-Controller

+

We can also introduce a post compensator \(W_2(s)\). +The shaped plant is then: +\[G_S(s) = W_2(s)G(s)W_1(s)\]

+

A diagonal controller \(K_S\) can then be designed for the shaped plant. The overall controller is then: +\[K(s) = W_1(s)K_S(s)W_2(s)\]

+

The SVD-controller is a special case of a pre and post compensator design: \(W_1 = V_0\) and \(W_2 = U_0^T\). +\(V_0\) and \(U_0\) are obtained from a SVD of \(G_0 = U_0 \Sigma_0 V_0^T\) where \(G_0\) is a real approximation of \(G(j\w_0)\).

+

Decentralized Control

+

Another approach is to use a diagonal or block-diagonal controller \(K(s)\). This works well if \(G(s)\) is close to diagonal, because then the plant to be controlled is essentially a collection of independent sub-plants, and each element in \(K(s)\) may be designed independently. +However, if off-diagonal elements in \(G(s)\) are large, the performance with decentralized diagonal control may be poor because no attempt is made to counteract the interactions.

+

What is the Shape of the “best” Feedback Controller?

+

Consider the problem of disturbance rejection: \(y = S G_d d\) where \(\normtwo{d}<1\) and our performance requirement is that \(\normtwo{y}<1\) which is equivalent to requiring \(\maxsv(SG_d) < 1\).

+

However there is generally a trade-off between input usage and performance. The controller that minimize the input magnitude while meeting the performance requirement is the one that yields all singular values of \(SG_d\) equal to 1, i.e. \(\sigma_i(SG_d) = 1, \forall \w\). This corresponds to: +\[S_{\text{min}} G_d = U_1\] +Where \(U_1\) is some all-pass transfer function (which at each frequency has all its singular values equal to 1).

+

At frequencies where feedback is effective, we have \(S\approx L^{-1}\) and then \(L_{\text{min}} = GK_{\text{min}} \approx G_d U_1^{-1}\). +In conclusion, the controller and loop shape with the minimum gain will often look like: +\[ K_{\text{min}} \approx G^{-1} G_d U_2 \] +where \(U_2 = U_1^{-1}\) is some all-pass transfer function matrix.

+

We see that for disturbances entering at the plant inputs, \(G_d = G\), we get \(G_{\text{min}} = U_2\), so a simple constant unit gain controller yields a good trade-off between output performance and input usage.

+

Summary of Mixed-Sensitivity \(\hinf\) Synthesis

+

In the mixed-sensitivity \(S/KS\) problem, the objective is to minimize the \(\hinf\) norm of:

+

\begin{equation} +N = \colvec{W_P S \ W_U K S} +\end{equation}

+

Here are some guidelines for the choice of the weights \(W_P\) and \(W_U\):

+
    +
  • \(KS\) is the transfer function from \(r\) to \(u\), so for a system which has been scaled, a reasonable initial choice for the input weight is \(W_U = I\)
  • +
  • \(S\) is the transfer function from \(r\) to \(-e = r-y\). A common choice for the performance weight is \(W_P = \text{diag}\{w_{p_i}\}\) with: +\[ w_{p_i} = \frac{s/M_i + \w_{B_i}^*}{s + \w_{B_i}^*A_i}, \quad A_i \ll 1 \] +Selecting \(A_i \ll 1\) ensures approximate integral action. +Often we select \(M_i\) about 2 for all outputs, whereas \(\w_{B_i}^*\) may be different for each output.
  • +
+

For disturbance rejection, we may in some cases want a steeper slope for \(w_{P_i}(s)\) at low frequencies. +However it may be better to consider the disturbances explicitly by considering the \(\hinf\) norm of:

+

\begin{equation} +N = \begin{bmatrix} +W_P S & W_P S G_d \\\
+W_U K S & W_U K S G_d +\end{bmatrix} +\end{equation}

+

We can also considerate \(T\) which is the transfer function from \(-n\) to \(y\). To reduce the sensitivity to noise and uncertainty, we want \(T\) small at high frequencies, and so we may want additional roll-off in \(L\). +This can be achieved in several ways:

+
    +
  • One approach is to add \(W_T T\) to the stack for \(N\) where \(W_T = \text{diag}\{w_{T_i}\}\) and \(\abs{w_{T_i}}\) is smaller than 1 at low frequencies and large at high frequencies
  • +
  • A more direct approach is to add high-frequency dynamics \(W_1(s)\) to the plant model to ensure that the resulting shaped plant, \(G_S=GW_1\) rolls off with the desired slope. We then obtain an \(\hinf\) optimal controller \(K_S\) for this shaped plant, and finally include \(W_1(s)\) in the controller \(K=W_1 K_S\)
  • +
+

Introduction to MIMO RHP-Zeros

+

Whereas the poles \(p\) of MIMO system \(G\) are essentially poles of elements of \(G\), the zeros are generally not the zeros of elements of \(G\). +However, for square MIMO plants, the poles and zeros are in most cases the poles and zeros of \(\det G(s)\).

+
+
+

The zeros \(z\) of a MIMO system \(G\) are defined as the values \(s=z\) where \(G(s)\) loses rank.

+
+

As for SISO systems, we find that RHP-zeros impose fundamental limitations on control. +Poles and zeros of MIMO systems have directions:

+
    +
  • We can find the direction of a zero by looking at the direction in which the matrix \(G(z)\) has zero gain
  • +
  • Pole direction is direction where \(G(p)\) is infinite
  • +
+

It is generally possible to move the effect of RHP-zero to particular outputs. +If it is not, the zero is called a “pinned zero".

+

Condition Number and RGA

+

Condition Number

+
+
+

We define the condition number of a matrix as the ratio between its maximum and minimum singular values:

+

\begin{equation} +\gamma(G) \triangleq \maxsv(G)/\minsv(G) +\end{equation}

+
+

A matrix with large condition number is said to be ill-conditioned.

+

For a non-singular square matrix \(\minsv(G)=1/\maxsv(G^{-1})\), so \(\gamma(G) = \maxsv(G) \maxsv(G^{-1})\). +It then follows that the condition number is large if the product of the largest element in \(G\) and \(G^{-1}\) is large.

+

Note that the condition number depends strongly on scaling. One might consider minimizing the condition number over all possible scalings. +This results in the minimized or optimal condition number which is defined by:

+

\begin{equation} +\gamma^*(G) = \min_{D_1,D_2} \gamma(D_1 G D_2) +\end{equation}

+

If the condition number is small, then the multivariable effects of uncertainty are not likely to be serious. +However if the condition number is large (say, larger than 10), then this may indicate control problems.

+

Relative Gain Array (RGA)

+
+
+

The relative gain array (RGA) for a non-singular square matrix \(G\) is a square matrix defined as:

+

\begin{equation} +\text{RGA}(G) = \Lambda(G) \triangleq G \times G^{-T} +\end{equation}

+

where \(\times\) is element-by-element multiplication

+
+

In most case, it is the value of the RGA at frequencies close to crossover which is most important.

+

The RGA has interesting algebraic properties:

+
    +
  • It is independent of input and output scaling
  • +
  • Its rows and columns sum to one
  • +
  • The sum-norm of the RGA \(\|\Lambda\|_\text{sum}\) is close to the minimized condition number \(\gamma^*\). +Plants with large RGA-elements are thus always ill-conditioned
  • +
  • The RGA is the identity matrix if \(G\) is upper of lower triangular. This follows that \(\Gamma - I\) provides a measure of two-way interactions
  • +
+

It has also a number of useful control properties:

+
    +
  • Plants with large RGA-elements around the crossover frequency are fundamentally difficult to control because of sensitivity to input uncertainty
  • +
  • If the sign of a RGA-element changes from \(s=0\) to \(s=\infty\), then there is a RHP-zero in \(G\)
  • +
  • The definition of the RGA may be generalized to non-square matrices by using the pseudo inverse
  • +
  • The RGA-number can be used as a measure of diagonal dominance: \(\|\Lambda(G)-I\|_{\text{sum}}\)
  • +
  • For decentralized control, we prefer pairing input and outputs for which the RGA-number at crossover frequencies is close to \(0\)
  • +
+

Introduction to Robustness for MIMO Plants

+

Multivariable plants can show a sensitivity to uncertainty which is fundamentally different from what is possible in SISO systems. +It is possible to have excellent stability margins (GM and PM) when considering one loop at a time, but small simultaneous input gain errors can give instability.

+

For SISO systems, we generally have that nominal performance and robust stability imply robust performance, but this is not the case for MIMO systems.

+

Although we have useful indicators of robustness problems (RGA-number, Sensitivity Peaks, etc), they provide no exact answer to whether a given source of uncertainty will yield instability or poor performance. +The structured singular value \(\mu\) is a tool for analyzing the effects of model uncertainty.

+

General Control Problem Formulation

+

The general control problem formulation is represented in Fig. fig:general_control_names.

+

+
+ Figure 6: General control configuration
+

Figure 6: General control configuration

+
+
+ +
+
+

Find a controller \(K\) which based on the information in \(v\), generates a control signal \(u\) which counteracts the influence of \(w\) on \(z\), thereby minimizing the closed-loop norm from \(w\) to \(z\).

+
+

Obtaining the Generalized Plant \(P\)

+

We must first find a block diagram representation of the system and identify the signals \(w\), \(z\), \(u\) and \(v\). +Then we have to break all the “loops” entering and exiting the controller \(K\) to obtain \(P\) such that:

+

\begin{equation} +\colvec{z\v} = P \colvec{w\u} +\end{equation}

+

Controller Design: Including Weights in \(P\)

+

In order to get a meaningful controller synthesis problem, for example in terms of the \(\hinf\) norms, we generally have to include the weights \(W_z\) and \(W_w\) in the generalized plant \(P\) (Fig. fig:general_plant_weights). +We consider:

+
    +
  • The weighted or normalized exogenous inputs \(w\) (where \(\tilde{w} = W_w w\) consists of the “physical” signals entering the system)
  • +
  • The weighted or normalized controlled outputs \(z = W_z \tilde{z}\) (where \(\tilde{z}\) often consists of the control error \(y-r\) and the manipulated input \(u\))
  • +
+

+
+ Figure 7: General Weighted Plant
+

Figure 7: General Weighted Plant

+
+
+ +

The weighted matrices are usually frequency dependent and typically selected such that weighted signals \(w\) and \(z\) are of magnitude 1.

+

Partitioning the Generalized Plant \(P\)

+

We often partition \(P\) as:

+

\begin{equation} +\begin{bmatrix} z \ v \end{bmatrix} = \begin{bmatrix} +P_{11} & P_{12} \\\
+P_{21} & P_{22} +\end{bmatrix} \begin{bmatrix} w \ u \end{bmatrix} +\end{equation}

+

\(P_{22}\) has dimensions compatible with the controller.

+

Analysis: Closing the Loop the get \(N\)

+

In the previous representations, the controller \(K\) has a separate block. This is useful when synthesizing the controller. However, for analysis of closed-loop performance the controller is given, and we may absorb \(K\) into the interconnection structure and obtain the system \(N\).

+
+
+

\begin{equation} +z = N w +\end{equation}

+

\(N\) is given by: +\[N = P_{11} + P_{12}K(I-P_{22}K)^{-1}P_{12} \triangleq F_l(P, K) \] +where \(F_l(P, K)\) denotes a lower linear fractional transformation (LFT).

+
+

A General Control Configuration Including Model Uncertainty

+

The general control configuration may be extended to include model uncertainty as shown in Fig. fig:general_config_model_uncertainty.

+

+
+ Figure 8: General control configuration for the case with model uncertainty
+

Figure 8: General control configuration for the case with model uncertainty

+
+
+ +

The matrix \(\Delta\) is a block-diagonal matrix that includes all possible perturbations (representing uncertainty). +It is usually normalized in such a way that \(\hnorm{\Delta} \leq 1\).

+

Conclusion

+
+
+

The Singular Value Decomposition (SVD) of the plant transfer function matrix provides insight into multivariable directionality.

+

Other useful tools for analyzing directionality and interactions are the condition number and the Relative Gain Array (RGA).

+

Closed loop performance may be analyzed in the frequency domain by evaluating the maximum singular value of the sensitivity function as the function of frequency.

+

Multivariable RHP-zeros impose fundamental limitations on performance, but for MIMO systems we can often direct the undesired effect of a RHP-zero to a subset of the outputs.

+

MIMO systems are often more sensitive to uncertainty than SISO systems.

+
+

Elements of Linear System Theory

+

+

System Descriptions

+

For linear systems there are several alternative system representations:

+
    +
  • state-space representation often follows directly from a physical model, and is used in most numerical calculations.
  • +
  • transfer function representation is a nice compact representation which yields invaluable insights; it allows for series connections to be represented by multiplication of transfer functions. It also leads directly to the frequency response by setting \(s = j\w\).
  • +
  • coprime factorization is a factorization into two stable systems, and that it is useful for representing the class of all stabilizing controllers. It forms the basis for the very useful coprime uncertainty description.
  • +
+

State-Space Representation

+

A natural way to represent many physical systems is by nonlinear state-space models of the form +\[\dot{x} \triangleq \frac{dx}{dt} = f(x, u);\quad y = g(x, u)\]

+

Linear state-space models may then be derived from the linearization of such models.

+

\begin{align*} +\dot{x}(t) & = A x(t) + B u(t)\\\
+y(t) & = C x(t) + D u(t) +\end{align*}

+

where \(A\), \(B\), \(C\) and \(D\) are real matrices.

+

These equations may be rewritten as +\[\colvec{\dot{x}\y} = \begin{bmatrix} +A & B \\\
+C & D +\end{bmatrix} \colvec{x\u}\] +which gives rise to the short-hand notation +\[G = \left[ \begin{array}{c|c} +A & B \ \hline +C & D \\\
+\end{array} \right]\]

+

The state-space representation of a system is not unique, there exist realizations with the same input-output behavior, but with additional unobservable and/or uncontrollable state.

+
+
+

A minimal realization is a realization with the fewest number of states and consequently no unobservable or uncontrollable modes.

+
+

The state-space representation yields an internal description of the system which may be useful if the model is derived from physical principles. It is also more suitable for numerical calculations.

+

Impulse Response Representation

+

The impulse response matrix is +\[g(t) = \begin{cases} +0 & t < 0 \\\
+C e^{At} B + D \delta(t) & t \geq 0 +\end{cases}\] +The \(ij\)‘th element of the impulse response matrix, \(g_{ij}(t)\), represents the response \(y_i(t)\) to an impulse \(u_j(t)=\delta(t)\) for a systems with a zero initial state.

+

With initial state \(x(0) = 0\), the dynamic response to an arbitrary input \(u(t)\) is +\[y(t) = g(t)*u(t) = \int_0^t g(t-\tau)u(\tau)d\tau\]

+

Transfer Function Representation - Laplace Transforms

+

The transfer function representation is unique and is defined as the Laplace transform of the impulse response.

+
+
+

\[ G(s) = \int_0^\infty g(t)e^{-st}dt \]

+
+

We can also obtain the transfer function representation from the state-space representation by taking the Laplace transform of the state-space equations +\[ s x(s) = A x(s) + B u(s) \ \Rightarrow \ x(s) = (sI-A)^{-1} B u(s) \] +\[ y(s) = C x(s) + D u(s) \ \Rightarrow \ y(s) = \underbrace{\left(C(sI-A)^{-1}B+D\right)}_{G(s)}u(s) \]

+

Time delays and improper systems can be represented by Laplace transforms, but do not have a state-space representation.

+

Coprime Factorization

+
+
+

\[G(s) = N_r(s) M_r^{-1}(s)\] +where \(N_r(s)\) and \(M_r(s)\) are stable coprime transfer functions.

+
+

The stability implies that \(N_r(s)\) should contains all the RHP-zeros of \(G(s)\), and \(M_r(s)\) should contain as RHP-zeros all the RHP-poles of \(G(s)\). +Mathematically, coprimeness means that there exist stable \(U_r(s)\) and \(V_r(s)\) such that the Bezout identity is satisfied: \(U_r N_r + V_r M_r = I\)

+

State Controllability and State Observability

+

There are many ways to check for state controllability and observability, e.g. with Gramians, input/output pole vectors, controllability/observability matrix, etc.

+
Input and output pole vectors
+

The method which yields the most insight is probably to compute the input and output directions associated with each pole (mode).

+

For the case when \(A\) has distinct eigenvalues, we have the following dyadic expansion of the transfer function matrix from inputs to outputs +\[G(s) = \sum_{i=1}^{n} \frac{C t_i q_i^H B}{s - \lambda_i} + D = \sum_{i=1}^{n} \frac{y_{p_i} u_{p_i}}{s - \lambda_i} + D\]

+
    +
  • The \(i\)‘th input pole vector \(u_{p_i} \triangleq q_i^H B\) is an indication of how much the \(i\)‘th mode is excited (and thus may be “controlled”) by the inputs.
  • +
  • The \(i\)‘th output pole vector \(y_{p_i} \triangleq C t_i\) indicates how much the \(i\)‘th mode is observed in the outputs.
  • +
+
State Controllability
+

Let \(\lambda_i\) be the \(i^{\text{th}}\) eigenvalue of \(A\), \(q_i\) the corresponding left eigenvector (\(q_i^H A = \lambda_i q_i^H\)), and \(u_{p_i} = B^H q_i\) the \(i^{\text{th}}\) input pole vector. Then the system \((A, B)\) is state controllable if and only if +\[u_{p_i} \neq 0, \forall i\] +That is if and only if all its input pole vectors are nonzero.

+
State Observability
+

Let \(\lambda_i\) be the \(i^{\text{th}}\) eigenvalue of \(A\), \(t_i\) the corresponding right eigenvector (\(A t_i = \lambda_i t_i\)), and \(y_{p_i} = C t_i\) the \(i^{\text{th}}\) output pole vector. Then the system \((A, C)\) is state observable if and only if +\[y_{p_i} \neq 0, \forall i\] +That is if and only if all its output pole vectors are nonzero.

+
Minimal realization
+

A state space realization \((A, B, C, D)\) of \(G(s)\) is said to be a minimal realization of \(G(s)\) if \(A\) has the smallest possible dimension. The smallest dimension is called the McMillan degree of \(G(s)\). A mode is hidden if it is not state controllable or observable and thus does not appear in the minimal realization. +It follows that a state-space realization is minimal if and only if \((A, B)\) is state controllable and \((A, C)\) is state observable.

+

Stability

+
+
+

A system is (internally) stable is none of its components contain hidden unstable modes and the injection of bounded external signals at any place in the system result in bounded output signals measured anywhere in the system.

+
+
+
+

A system is (state) stabilizable if all unstable modes are state controllable. +A system is (state) detectable if all unstable modes are state observable.

+

A system with unstabilizable or undetectable modes is said to contain hidden unstable modes.

+
+

Poles

+
+
+

The poles \(p_i\) of a system with state-space description are the eigenvalues \(\lambda_i(A), i=1, \dotsc, n\) of the matrix \(A\). +The pole or characteristic polynomial \(\phi(s)\) is defined as \(\phi(s) \triangleq \det(sI-A) = \Pi_{i=1}^n (s-p_i)\). +Thus the poles are the roots or the characteristic equation +\[\phi(s) \triangleq \det(sI-A) = 0\]

+
+

Poles and Stability

+

A linear dynamic system is stable if and only if all the poles are in the LHP, that is, \(\text{Re}\{\lambda_i(A)\} < 0, \forall i\)

+

Poles from Transfer Functions

+

The pole polynomial \(\phi(s)\) corresponding to a minimal realization of a system with transfer function \(G(s)\) is the least common denominator of all non-identically-zero minors of all orders of \(G(s)\).

+

The poles are essentially the sum of the poles in the elements of the transfer function, but to get the correct multiplicity a more careful analysis is needed.

+

Pole Vectors and Directions

+

In multivariable system poles have directions associated with them. To quantify this, we use the input and output pole vectors.

+
+
+

\[ u_{p_i} = B^H q_i \] +With \(q_i\) the left eigenvector of \(A\) (\({q_i}^T A = \lambda_i {q_i}^T\)). +The input pole direction is \(\frac{1}{\normtwo{u_{p_i}}} u_{p_i}\)

+
+
+
+

\[ y_{p_i} = C t_i \] +With \(t_i\) the right eigenvector of \(A\) (\(A t_i = \lambda_i t_i\)). +The output pole direction is \(\frac{1}{\normtwo{y_{p_i}}} y_{p_i}\)

+
+

The pole directions may be defined in terms of the transfer function matrix by evaluating \(G(s)\) at the pole \(p_i\) and considering the directions of the resulting complex matrix \(G(p_i)\). The matrix is infinite in the direction of the pole, and we may write +\[ G(p_i) u_{p_i} = \infty \cdot y_{p_i} \] +where \(u_{p_i}\) is the input pole direction and \(y_{p_i}\) is the output pole direction.

+

The pole directions may in principle be obtained from an SVD of \(G(p_i) = U\Sigma V^H\). +Then \(u_{p_i}\) is the first column in \(V\) (corresponding to the maximum singular value) and \(y_{p_i}\) the first column in \(U\).

+

The pole direction is usually very interesting because it gives information about which output (or combination of outputs) may be difficult to control.

+

Zeros

+

Zeros of a system arise when competing effects, internal to the system, are such that the output is zero even when the inputs (and the states) are not themselves identically zero.

+
+
+

\(z_i\) is a zero of \(G(s)\) if the rank of \(G(z_i)\) is less than the normal rank of \(G(s)\). +The zero polynomial is defined as \(z(s) = \Pi_{i=1}^{n_z}(s-z_i)\) where \(n_z\) is the number of finite zeros of \(G(s)\)

+
+

Zeros from State-Space Realizations

+

The state-space equations of a system may be written as +\[P(s) \colvec{x\u} = \colvec{0\y}, \quad P(s) = \begin{bmatrix} +sI-A & -B \\\
+C & D \\\
+\end{bmatrix}\]

+

The zeros are then the values \(s=z\) for which the polynomial system matrix, \(P(s)\), loses rank, resulting in zero output for some non-zero input.

+

Zeros from Transfer Functions

+

The zero polynomial \(z(s)\), corresponding to a minimal realization of the system, is the greatest divisor of all the numerator of all order-\(r\) minors of \(G(s)\), where \(r\) is the normal rank of \(G(s)\), provided that these minors have been adjusted in such a way as to have the pole polynomial \(\phi(s)\) as their denominator.

+

The zeros are values of \(s\) for which \(G(s)\) looses rank. In general, there is no relationship between the elements of the transfer function and its (multivariable) zeros.

+

Zero Directions

+

Let \(G(s)\) have a zero at \(s=z\). Then \(G(s)\) loses rank at \(s=z\), and there will exist non-zero vectors \(u_z\) and \(y_z\) such that +\[G(z) u_z = 0 \cdot y_z\] +Here \(u_z\) is defined as the input zero direction and \(y_z\) is defined as the output zero direction.

+

From a practical point of view, \(y_z\) is usually of more interest than \(u_z\) because it give information about which combination of outputs may be difficult to control.

+

Again, we may obtain input and output zero directions from an SVD of \(G(s)\): \(u_z\) is the last column of \(U\) and \(y_z\) is the last column of \(V\) (corresponding to the zero singular value of \(G(z)\)).

+

Some Remarks on Poles and Zeros

+
    +
  • We should always find a minimal realization of the system before computing the zeros.
  • +
  • For a square system \(G(s)\), the poles and zeros are essentially the poles and zeros of \(\det G(s)\).
  • +
  • Poles and zeros can occurs at the same location, but their directions may be different so they do not cancel or otherwise interact with each other.
  • +
  • If \(G^{-1}(s)\) exists, then the poles of \(G(s)\) are the zeros of \(G^{-1}(s)\) and vice versa (as for SISO systems).
  • +
  • Zeros usually appear when there are fewer inputs or outputs than states or when \(D \neq 0\)
  • +
  • Moving poles and zeros: +
      +
    • Feedback: \(G(I+GK)^{-1}\). Poles (of \(G\)) are moved and zeros (of \(G\)) are unchanged (in addition we get as zeros the poles of \(K\))
    • +
    • Series: \(GK\). Poles and zeros are unchanged (with the exception of possible cancellations between poles and zeros in \(G\) and \(K\))
    • +
    • Parallel: \(G+K\). Poles are unchanged, zeros are moved (but note that physically a parallel interconnection requires an additional manipulated input)
    • +
    +
  • +
  • Pinned zeros. A zero is pinned to a subset of the outputs if \(y_z\) has one or more elements equal to zero. Their effect cannot be moved freely to any output. Similarly, a zero is pinned to certain input if \(u_z\) has one or more elements equal to zero.
  • +
+
+
+

Consider a SISO negative feedback system with plant \(G(s)=\frac{z(s)}{\phi(s)}\) and a constant gain controller, \(K(s)=k\). The closed-loop response from reference \(r\) to output \(y\) is +\[T(s) = \frac{kG(s)}{1+kG(s)} = \frac{kz(s)}{\phi(s)+kz(s)} = k\frac{z_{\text{cl}}(s)}{\phi_{\text{cl}}(s)}\]

+

We note that:

+
    +
  • The zero locations are unchanged by feedback
  • +
  • The pole locations are changed by feedback
  • +
+

\begin{align*} +\phi_{\text{cl}(s)} &\underset{k \rightarrow 0}{\longrightarrow} \phi(s) \\\
+\phi_{\text{cl}(s)} &\underset{k \rightarrow \infty}{\longrightarrow} k z(s) +\end{align*}

+

That is, as we increase the feedback gain, the closed loop poles moves from open-loop poles to the open-loop zeros. +RHP-zeros therefore imply high gain instability.

+
+

Internal Stability of Feedback Systems

+

+
+ Figure 9: Block diagram used to check internal stability
+

Figure 9: Block diagram used to check internal stability

+
+
+ +

Assume that the components \(G\) and \(K\) contain no unstable hidden modes. Then the feedback system in Fig. fig:block_diagram_for_stability is internally stable if and only if all four closed-loop transfer matrices are stable.

+

\begin{align*} +&(I+KG)^{-1} & -K&(I+GK)^{-1} \\\
+G&(I+KG)^{-1} & &(I+GK)^{-1} +\end{align*}

+

Assume there are no RHP pole-zero cancellations between \(G(s)\) and \(K(s)\), the feedback system in Fig. fig:block_diagram_for_stability is internally stable if and only if one of the four closed-loop transfer function matrices is stable.

+

Stabilizing Controllers

+

The Q-parameterization is a parameterization that generates all controllers that yield internal stability of the closed loop transfer function.

+
+
+

For stable plants, a parameterization of all stabilizing negative feedback controllers for the stable plant \(G(s)\) is given by +\[K = (I-QG)^{-1} Q = Q(I-GQ)^{-1}\] +where the parameter \(Q\) is any stable transfer function matrix.

+
+

This may have significant advantages in controller synthesis where the objective is to a find a \(K\) which minimizes some norm of \(N(K)\). +The search over stabilizing \(K\) (which involves checking the stability of closed-loop transfer functions) is replaced by a search over stable \(Q\). +The closed-loop transfer functions turn out to be affine in \(Q\), e.g. \(S\) or \(T\) can be written \(H1 + H2 Q H3\), which may significantly simplify the optimization (e.g. compared to \(GK(I+GK)^{-1}\) which is fractional in \(K\)).

+

Stability Analysis in the Frequency Domain

+
+
+

Let \(P_{ol}\) denote the number of unstable poles in \(L(s) = G(s)K(s)\). The closed-loop system with loop transfer \(L(s)\) and negative feedback is stable if and only if the Nyquist plot of \(\det(I+L(s))\):

+
    +
  1. makes \(P_{ol}\) anti-clockwise encirclements of the origin
  2. +
  3. does not pass through the origin
  4. +
+
+
+
+

The spectral radius \(\rho(L(j\w))\) is defined as the maximum eigenvalue magnitude: +\[ \rho(L(j\w)) \triangleq \max_{i} \abs{\lambda_i (L(j\w))} \]

+
+
+
+

Consider a system with a stable loop transfer function \(L(s)\). Then the closed-loop system is stable if +\[ \rho(L(j\w)) < 1 \quad \forall \w \]

+
+
+
+

Consider a system with a stable loop transfer function \(L(s)\). Then the closed-loop system is stable if +\[ \norm{L(j\w)} < 1 \quad \forall \w\] +Where \(\norm{L}\) denotes any matrix norm that satisfies the multiplicative property \(\norm{AB} \leq \norm{A}\cdot\norm{B}\)

+
+

The Small gain theorem for SISO system says that the system is stable if \(\abs{L(j\w)} < 1\) at all frequencies \(\w\). This is clearly a very conservative condition as no phase information is taken into account.

+

This may be understood as follows: the signals which “return” in the same direction after “one turn around the loop” are magnified by the eigenvalues \(\lambda_i\) (and the directions are the eigenvectors \(x_i\)):

+

\[ L x_i = \lambda_i x_i \]

+

So if all the eigenvalues \(\lambda_i\) are less than 1 in magnitude, all signals become smaller after each round, and the closed-loop system is stable.

+

System Norms

+

\(\htwo\) norm

+
+
+

Consider a strictly proper system \(G(s)\). The \(\htwo\) norm is:

+

\begin{align*} +\normtwo{G(s)} &\triangleq \sqrt{\frac{1}{2\pi} \int_{-\infty}^{\infty} \text{tr}\left(G(j\w)^HG(j\w)\right) d\w} \\\
+& = \sqrt{\frac{1}{2\pi} \int_{-\infty}^{\infty} \sum_i {\sigma_i}^2(G(j\w)) d\w} +\end{align*}

+
+

The \(\htwo\) norm can have a stochastic interpretation where we measure the expected root mean square value of the output in response to white noise excitation.

+

\(\hinf\) norm

+
+
+

Consider a proper linear stable system \(G(s)\). The \(\hinf\) norm is the peak value of its maximum singular value: +\[ \hnorm{G(s)} \triangleq \max_{\w} \maxsv(G(j\w)) \]

+
+

The \(\hinf\) norm has several interpretations in the time and frequency domains:

+
    +
  • it is the peak of the transfer function magnitude
  • +
  • by introducing weights, it can be interpreted as the magnitude of the some closed-loop transfer function relative to an upper bound
  • +
  • it is the worst case steady-state gain for sinusoidal inputs at any frequency
  • +
  • it is equal to the 2-norm in the time domain:
  • +
+

\[ \hnorm{G(s)} = \max_{w(t) \neq 0} \frac{\normtwo{z(t)}}{\normtwo{w(t)}} = \max_{\normtwo{w(t)} = 1} \normtwo{z(t)} \]

+
    +
  • is has an interpretation as an induced norm in terms of the expected values of stochastic signals
  • +
+

Difference Between the \(\htwo\) and \(\hinf\) norms

+

Minimizing the \(\hinf\) norm corresponds to minimizing the peak of the largest singular value, whereas minimizing the \(\htwo\) norm corresponds to minimizing the sum of the square of all the singular values over all frequencies.

+
+
+

The \(\hinf\) norm is convenient for representing unstructured model uncertainty and because if satisfies the multiplicative property \(\hnorm{A(s)B(s)} \leq \hnorm{A(s)} \cdot \hnorm{B(s)}\) +It follows that the \(\hinf\) norm is an induced norm.

+
+

The \(\htwo\) norm on the other hand is not and induced norm and does not satisfies the multiplicative property. +This implies that we cannot, by evaluating the \(\htwo\) norm of the individual components say anything about how their series interconnection will behave.

+

Hankel norm

+

The Hankel norm of a stable system \(G(s)\) is obtained when one applies an input \(w(t)\) up to \(t=0\) and measures the output \(z(t)\) for \(t>0\), and selects \(w(t)\) to maximize the ratio of the 2-norms: +\[ \left\|G(s)\right\|_H \triangleq \max_{w(t)} \frac{\sqrt{\int_{0}^{\infty} \normtwo{z(\tau)}^2 d\tau }}{\sqrt{\int_{-\infty}^0 \normtwo{w(\tau)}^2 d\tau}} \] +The Hankel norm is a kind of induced norm from past inputs to future outputs.

+

It may be shown that the Hankel norm is equal to \(\left\|G(s)\right\|_H = \sqrt{\rho(PQ)}\) where \(\rho\) is the spectral radius, \(P\) is the controllability Gramian and \(Q\) the observability Gramian.

+

Limitations on Performance in SISO Systems

+

+

Input-Output Controllability

+
+
+

The input-output controllability is the ability to achieve acceptable control performance; that is, to keep the outputs (\(y\)) within specified bounds from their references (\(r\)), in spite of unknown but bounded variations, such as disturbances (\(d\)) and plant changes, using available inputs (\(u\)) and available measurements (\(y_m\)).

+
+

A plant is controllable if there exists a controller that yields acceptable performance for all expected plant variation. Thus, controllability is independent of the controller and is a property of the plant alone. +It may be affected by changing the plant itself:

+
    +
  • changing the mechanical design
  • +
  • relocating sensors and actuators
  • +
  • adding new equipment to dampen disturbances
  • +
  • adding extra sensor or actuators
  • +
  • changing the configuration of the lower layers of control already in place
  • +
+
+
+

Input-output controllability analysis is applied to a plant to find out what control performance can be expected.

+

It is also called performance targeting.

+
+

If the system has been scaled, the requirement for acceptable performance is: +For any disturbance \(\abs{d} \leq 1\) and any reference \(\abs{r} \leq R\), the performance requirement is to keep the control error \(\abs{e} \leq 1\) using an input \(\abs{u} \leq 1\).

+

Perfect Control and Plant Inversion

+

To obtain insight into the inherent limitations on performance, let’s consider the input needed to achieve perfect control. +Let the plant model be: \(y = G u + G_d d\) +Since we want perfect control, \(y = r\) and we have \(u = G^{-1} r - G^{-1} G_d d\) that represents a perfect feedforward controller.

+

For a feedback control, \(u = K(r - y)\), and we have \(u = KS r - KSG_d d\) that we can rewrite \(u = G^{-1}Tr - G^{-1}TG_d d\).

+

We see that at frequency where feedback is effective (\(T \approx I\)), the input generated by feedback is the same as the perfect control input. That is, high gain feedback generates an inverse of \(G\).

+

Perfect control requires the controller to somehow generate an inverse of \(G\). Perfect control cannot be achieved if:

+
    +
  • \(G\) contains RHP-zeros (since then \(G^{-1}\) is unstable)
  • +
  • \(G\) contains time delay (since then \(G^{-1}\) contains non-causal prediction)
  • +
  • \(G\) has more pole than zero (since then \(G^{-1}\) is unrealizable)
  • +
+

The required input must not exceed maximum physically allowed value (\(\abs{u} \leq 1\)), therefore perfect control cannot be achieve if:

+
    +
  • \(\abs{G^{-1} G_d}\) is large (\(\geq 1\))
  • +
  • \(\abs{G^{-1} R}\) is large (\(\geq 1\))
  • +
+

Constrain of \(S\) and \(T\)

+

\(S\) Plus \(T\) is One

+
+
+

From the definitions \(S = (I + L)^{-1}\) and \(T = L(I+L)^{-1}\) we derive

+

\begin{equation} +S + T = I +\end{equation}

+
+

Ideally, we want \(S\) small to obtain small control error for commands and disturbances, and \(T\) small to avoid sensitivity to noise. There requirements are not simultaneously possible at any frequency.

+

The Waterbed Effects

+

In general, a trade-off between sensitivity reduction and sensitivity increase must be performed whenever:

+
    +
  1. \(L(s)\) has at least two more poles than zeros (first waterbed formula)
  2. +
  3. \(L(s)\) has a RHP-zero (second waterbed formula)
  4. +
+
+
+

Suppose that the open-loop transfer function \(L(s)\) is rational and has at least two more poles than zeros. +Suppose also that \(L(s)\) has \(N_p\) RHP-poles at locations \(p_i\). +Then for closed-loop stability, the sensitivity function must satisfy the following Bode Sensitivity Integral:

+

\begin{equation} +\int_0^\infty \ln\abs{S(j\w)} d\w = \pi \sum_{i=1}^{N_p} \text{Re}(p_i) +\end{equation}

+
+

For a stable plant, we must have:

+

\begin{equation} +\int_0^\infty \ln\abs{S(j\w)} d\w = 0 +\end{equation}

+

The area of sensitivity reduction (\(\ln\abs{S}\) negative) must equal the area of sensitivity increase (\(\ln\abs{S}\) positive): the benefits and costs of feedback are balanced.

+

For unstable plant, the presence of unstable poles usually increase the peak of \(\abs{S}\) as seen from the contribution \(\pi \sum_{i=1}^{N_p} \text{Re}(p_i)\). This is the price to pay for stabilizing the system.

+

From the first waterbed formula, we expect that an increase in the bandwidth must come at the expense of a large peak in \(\abs{S}\). +Although this is true in most practical cases, however this is not strictly implied by the formula. +This is because the increase in area may happen over an infinite frequency range.

+
+
+

Suppose that \(L(s)\) has a single real RHP-zero \(z\) or a complex conjugate pair of zero \(z=x\pm jy\), and has \(N_p\) RHP-poles \(p_i\). +For closed-loop stability, the sensitivity function must satisfy +\[ \int_0^\infty \ln\abs{S(j\w)} w(z, \w) d\w = \pi \ln \sum_{i=1}^{N_p} \abs{\frac{p_i + z}{\bar{p_i}-z}} \]

+

where if the zero is real +\[ w(z, \w) = \frac{2z}{z^2 + \w^2} \] +and if the zero pair is complex +\[ w(z, \w) = \frac{x}{x^2 + (y-\w)^2} + \frac{x}{x^2 + (y+\w)^2} \]

+
+

The second waterbed formula implies that the peak of \(\abs{S}\) is even higher for plants with RHP-zeros.

+

The weight \(w(z, \w)\) effectively “cuts off” the contribution from \(\ln\abs{S}\) to the integral at frequencies \(\w > z\). +So we have approximately: +\[ \int_0^z \ln \abs{S(j\w)} d\w \approx 0 \]

+

This is similar to the Bode sensitivity integral, except that the trade-off is done over a limited frequency range. +Thus, a large peak for \(\abs{S}\) is unavoidable if we try to push down \(\abs{S}\) at low frequencies.

+

Interpolation Constraints

+
+
+

If \(p\) is a RHP-pole of the loop transfer function \(L(s)\) then

+

\begin{equation} +T(p) = 1, \quad S(p) = 0 +\end{equation}

+

If \(z\) is a RHP-zero of the loop transfer function \(L(s)\) then

+

\begin{equation} +T(z) = 0, \quad S(z) = 1 +\end{equation}

+
+

Sensitivity Peaks

+
+
+

Suppose \(f(s)\) is stable, then the maximum value of \(\abs{f(s)}\) for \(s\) in the RHP is attained on the region’s boundary (somewhere along the \(j\w\)-axis): +\[ \hnorm{f(j\w)} = \max_{\omega} \abs{f(j\w)} \geq \abs{f(s_0)} \quad \forall s_0 \in \text{RHP} \]

+
+

We can derive the following bounds on the peaks of \(S\) and \(T\) from the maximum modulus principle: +\[ \hnorm{S} \geq \max_{j} \prod_{i=1}^{N_p} \frac{\abs{z_j + \bar{p_i}}}{\abs{z_j - p_i}} \quad \hnorm{T} \geq \max_{i} \prod_{j=1}^{N_z} \frac{\abs{\bar{z_j} + p_i}}{\abs{z_j - p_i}} \]

+

This shows that large peaks for \(\abs{S}\) and \(\abs{T}\) are unavoidable if we have a RHP-zero and RHP-pole located close to each other.

+

Limitation Imposed by Time Delays

+

Consider a plant \(G(s)\) that contains a time delay \(e^{-\theta s}\). Even the “ideal” controller cannot remove this delay and the “ideal” sensitivity function is \(S = 1 - T = 1 - e^{-\theta s}\).

+
+
+

\(S\) crosses 1 at a frequency of about \(1/\theta\), so we expect to have an upper bound on \(\w_c\): +\[ \w_c < 1/\theta \]

+
+

Limitation Imposed by RHP-Zeros

+

RHP-zeros typically appear when we have competing effects of slow and fast dynamics. Their presence induces many limitations.

+

Inverse Response

+

We can show that the output of a step change in the input of a stable plant with \(n_z\) real RHP-zeros will cross zero \(n_z\) times, that is, we have inverse response.

+

High Gain Instability

+

It is well known that the closed-loop poles migrate from the open-loop poles to the open-loop zeros as the feedback gain increases. Thus the presence of RHP-zeros implies high-gain instability.

+

Bandwidth Limitation

+

To derive bounds for the bandwidth, we select performance weight \(w_P(s)\) and we then use the interpolation constraint \(S(z) = 1\).

+

We require \(\abs{S(j\w)} < 1/\abs{w_P(j\w)} \quad \forall \w\), so we must at least require that the weight satisfies \(\abs{w_P(z)} < 1\).

+
Performance at low frequencies
+

If we specify performance at low frequencies, we may use the following weight: +\[ w_P = \frac{s/M + \w_B^*}{s + \w_B^* A} \] +Where \(\w_B^*\) is the minimum wanted bandwidth, \(M\) the maximum peak of \(\abs{S}\) and \(A\) the steady-state offset.

+

If we consider a real RHP-zero: +\[ \w_B^* < z \frac{1 - 1/M}{1 - A} \] +For example, with \(A=0\) and \(M=2\), we must at least require \(\w_B^* < 0.5z\).

+

If we consider an imaginary RHP-zero: +\[ \w_B^* < \abs{z} \sqrt{1 - \frac{1}{M^2}} \] +For example, with \(M=2\), we must at least require \(\w_B^* < 0.86\abs{z}\).

+
+
+

The presence of RHP-zero imposes an upper bound on the achievable bandwidth when we want tight control at low frequencies

+
+
Performance at high frequencies
+

We consider the case where we want tight control at high frequencies, by use of the performance weight: +\[ w_P = \frac{1}{M} + \frac{s}{\w_B^*} \]

+

If we consider a real RHP-zero: +\[ \w_B^* > z \frac{1}{1-1/M} \] +For example, with \(M=2\) the requirement is \(\w_B^* > 2z\), so we can only achieve tight control at frequencies beyond the frequency of the RHP-zero.

+
+
+

The presence of RHP-zero imposes and lower bound on the achievable bandwidth when we want tight control at high frequencies

+
+

Limitation Imposed by RHP-Poles

+

For unstable plants with a RHP-pole at \(s = p\), we need feedback for stabilization.

+
+
+

In presence of a RHP-pole at \(s=p\): +\[ \hnorm{KS} \geq \abs{G_s(p)^{-1}} \] +where \(G_s\) is the “stable version” of \(G\) with its RHP-poles mirrored into the LHP.

+

Since \(u = -KS(G_d d + n)\) and because of the previous inequality, the presence of disturbances \(d\) and measurement noise \(n\) may require the input \(u\) to saturate. +When the inputs saturate, the system is practically open-loop and the stabilization is not possible.

+
+
+
+

We need to react sufficiently fast. +For a real RHP-pole \(p\) we must require that the closed-loop bandwidth is larger than \(2p\). +The presence of RHP-poles generally imposes a lower bound on the bandwidth.

+
+

Combined Unstable (RHP) Poles and Zeros

+

A strictly proper plant with a single real RHP-zero \(z\) and a single real RHP-pole \(p\) can be stabilized by a stable proper controller if and only if \(z>p\). In words “the system may go unstable before we have time to react”.

+

In order to achieve acceptable performance and robustness, we must approximately require \(z>4p\). That is, we want to RHP-pole to be much lower than the RHP-zero.

+

The presence of RHP-zeros (or time delays) make stabilization more difficult.

+

Performance Requirements Imposed by Disturbances and Commands

+
Disturbance rejection
+

Consider a single disturbance \(d\) and a constant reference \(r=0\). Without control, we have \(e = G_d d\). +We conclude that no control is needed if \(\abs{G_d(j\w)} < 1\) at all frequencies. In that case, the plant is said to be “self-regulated".

+

If \(\abs{G_d(j\w)} > 1\) at some frequency, then we need control. In case of feedback control, we have +\[ e(s) = S(s)G_d(s)d(s) \] +The performance requirement \(\abs{e(\w)} < 1\) for any \(\abs{d(\w)}\) at any frequency is satisfied if and only if +\[ \abs{S G_d(j\w)} < 1 \quad \forall\w \quad \Leftrightarrow \quad \abs{S(j\w)} < 1/\abs{G_d(j\w)} \quad \forall\w \]

+
+
+

If the plant has a RHP-zero at \(s=z\), then \(S(z) = 1\) and we have the following condition: +\[ \abs{G_d(z)} < 1 \]

+
+
+
+

We also have that +\[ \w_B > \w_d \] +where \(\w_d\) is defined by \(\abs{G_d(j\w_d)} = 1\).

+
+

The actual bandwidth requirement imposed by disturbances may be higher than \(\w_d\) if \(\abs{G_d(j\w)}\) drops with a slope steeper than \(-1\) just before the frequency \(\w_d\). This is because we cannot let the slope of \(\abs{L(j\w)}\) around the crossover be much larger than \(-1\) due to stability margins. It is however possible to overcome this issue using local feedback loops in series.

+
Command tracking
+

Assume than \(d=0\) and \(r(t) = R\sin(\w t)\). For acceptable control (\(\abs{e} < 1\)) we must have +\[ \abs{S(j\w)R}<1 \quad \forall\w\leq\w_r \] +where \(\w_r\) is the frequency up to which performance tracking is required.

+

Limitation Imposed by Input Constraints

+
+
+

To achieve acceptable control (\(\abs{e}<1\)) and avoid input saturation (\(\abs{u}<1\)), we must require:

+

For disturbance rejection: +\[ \abs{G} > \abs{G_d} - 1 \text{ at frequencies where } \abs{G_d} > 1 \]

+

For command tracking: +\[ \abs{G} > \abs{R} - 1 \quad \forall \w \leq \w_r \]

+
+

Limitation Imposed by Phase Lag

+

Phase lag in the plant present no fundamental limitations, however is usually does on practical designs.

+
+
+

Let define \(\w_u\) as the frequency where the phase lag of the plant \(G\) is \(\SI{-180}{\degree}\)

+

\begin{equation} +\angle G(j\w_u) \triangleq \SI{-180}{\degree} +\end{equation}

+
+

With simple controllers such as a proportional controller or a PI-controller, the phase lag does pose a fundamental limitation on the achievable bandwidth because of stability bounds: +\[ \w_c < \w_u \]

+

However, if the model is exactly known and there are no RHP-zeros or time delays, one may extend \(\w_c\) to infinite frequency by placing zeros in the controller at the plant poles.

+

Limitation Imposed by Uncertainty

+
Uncertainty with feedforward control
+

Perfect control is obtained using a controller which generates the control input +\[ u = G^{-1} r - G^{-1} G_d d \] +When we apply this perfect controller to the actual plant \(y’ = G’ u + G_d’ d\), we find +\[ e’ = y’ - r = \underbrace{\left( \frac{G’}{G} - 1 \right)}_{\text{rel. error in }G} r - \underbrace{\left( \frac{G’/G_d’}{G/G_d} - 1 \right)}_{\text{rel. error in } G/G_d} G_d’ d \] +For feedforward control, the model error propagates directly to the control error.

+

If we want acceptable control (\(\abs{e’}<1\)), we must require that the model error in \(G/G_d\) is less than \(1/\abs{G_d’}\). This is very difficult to satisfy at frequencies where \(\abs{G_d’}\) is much larger than 1.

+

The presence of uncertainty then requires us to use feedback control rather than just feedforward control.

+
Uncertainty with feedback control
+

With feedback control, the closed-loop response is \(e = y - r = S G_d d - S r\). +With model error, we get \(y’ - r = S’(G_d’d - r)\) where \(S’ = (I + G’K)^{-1}\). +\(S’\) can be rewritten as \(S’ = S \frac{1}{1+ET}\) with \(E = \frac{G’-G}{G}\) the relative error for \(G\).

+

We see that the control error in only weakly affected by model error at frequencies where feedback is effective (\(T \approx 1\)).

+
+
+

Uncertainty in the crossover frequency region can result in poor performance and even instability:

+
    +
  • Uncertainty which keeps \(\abs{G(j\w_u)}\) approximately constant will not change the gain margin.
  • +
  • Uncertainty which increases \(\abs{G(j\w_u)}\) may yield instability.
  • +
+
+

Summary: Controllability Analysis with Feedback Control

+

+
+ Figure 10: Feedback control system
+

Figure 10: Feedback control system

+
+
+ +

Consider the control system in Fig. fig:classical_feedback_meas. +Here \(G_m(s)\) denotes the measurement transfer function and we assume \(G_m(0) = 1\) (perfect steady-state measurement).

+
+
+
    +
  1. Speed of response to reject disturbances. We approximately require \(\w_c > \w_d\). With feedback control we require \(\abs{S(j\w)} \leq \abs{1/G_d(j\w)} \quad \forall\w\).
  2. +
  3. Speed of response to track reference changes. We require \(\abs{S(j\w)} \leq 1/R\) up to the frequency \(\w_r\) where tracking is required.
  4. +
  5. Input constraints arising from disturbances. For acceptable control we require \(\abs{G(j\w)} > \abs{G_d(j\w)} - 1\) at frequencies where \(\abs{G_d(j\w)} > 1\).
  6. +
  7. Input constraints arising from setpoints. We require \(\abs{G(j\w)} > R - 1\) up to the frequency \(\w_r\) where tracking is required.
  8. +
  9. Time delay \(\theta\) in \(G(s)G_m(s)\). We approximately require \(\w_c < 1/\theta\).
  10. +
  11. Tight control at low frequencies with a RHP-zero \(z\) in \(G(s)G_m(s)\). For a real RHP-zero we require \(\w_c < z/2\) and for an imaginary RHP-zero we approximately require \(\w_c < \abs{z}\).
  12. +
  13. Phase lag constraint. We require in most practical cases \(\w_c < \w_u\). Here the ultimate frequency \(\w_u\) is where \(\angle GG_m(j\w_u) = \SI{-180}{\degree}\). Since time delays and RHP-zeros also contribute to the phase lag, it is possible to combine the corresponding rules in the single rule \(\w_c < \w_u\).
  14. +
  15. Real open-loop unstable pole in \(G(s)\) at \(s=p\). We need high feedback gains to stabilize the system and we approximately require \(\w_c > 2p\).
  16. +
+
+

In summary:

+
    +
  • rules 1, 2 and 8 tell us that we need high feedback gain in order to reject disturbances, to track setpoints and to stabilize the plant.
  • +
  • rules 5, 6 and 7 tell us we must use low feedback gains in the frequency range where there are RHP-zeros or delays or where the plant has a lot of phase lag.
  • +
+

Sometimes, the disturbances are so large that we hit input saturation or the required bandwidth is not achievable. To avoid the latter problem, we must at least require that the effect of the disturbance is less than \(1\) at frequencies beyond the bandwidth: +\[ \abs{G_d(j\w)} < 1 \quad \forall \w \geq \w_c \]

+

+
+ Figure 11: Illustration of controllability requirements
+

Figure 11: Illustration of controllability requirements

+
+
+ +
Controllability analysis with feedforward control
+

We find that essentially the same conclusions apply to feedforward control when relevant.

+

A major difference is that a delay in \(G_d(s)\) is an advantage for feedforward control (“it gives the feedforward controller more time to make the right action”).

+

Conclusion

+

The controllability analysis is summarized in terms of eight controllability rules. +These rules are necessary conditions to achieve acceptable control performance. +They are not sufficient since among other things they only consider one effect at a time. +The rules may be used to determine whether or not a given plant is controllable.

+

Limitations on Performance in MIMO Systems

+

+

Introduction

+

In a MIMO system, disturbances, the plant, RHP zeros, RHP poles, delays and disturbances have each directions associated with them.

+

We quantify the directionality of the various effects in \(G\) and \(G_d\) by their output directions:

+
    +
  • \(y_z\): output dir. of RHP-zero, \(G(z) u_z = 0 \cdot y_z\)
  • +
  • \(y_p\): output dir. of RHP-pole, \(G(p_i) u_p = \infty \cdot y_p\)
  • +
  • \(y_d\): output dir. of disturbance, \(y_d(s) = \frac{1}{\normtwo{g_d(s)}} g_d(s)\)
  • +
  • \(u_i\): i’th output dir. (singular vector) of the plant, \(G(s) v_i(s) = \sigma_i(s) u_i(s)\)
  • +
+

We may also consider input directions, however we are primarily concerned with the performance at the output of the plant.

+

The angle between various output directions is quantified using their inner products.

+

For example, the output angle between a pole and a zero is \(\phi = \cos^{-1} \abs{y_z^H y_p}\), and:

+
    +
  • if \(\phi = \SI{90}{\degree}\), then the pole and zero are in completely different directions and there is no interaction (they may be considered separately)
  • +
  • if \(\phi = \SI{0}{\degree}\), then they interact as in a SISO system
  • +
+

Constraints on \(S\) and \(T\)

+

\(S\) plus \(T\) is the Identity Matrix

+

From the identity \(S + T = I\), we get:

+

\begin{subequations} +\begin{align} +|1 - \maxsv(S)| \leq \maxsv(T) \leq 1 + \maxsv(S)\\\
+|1 - \maxsv(T)| \leq \maxsv(S) \leq 1 + \maxsv(T) +\end{align} +\end{subequations}

+

This shows that we cannot have \(S\) and \(T\) small simultaneously and that \(\maxsv(S)\) is large if and only if \(\maxsv(T)\) is large.

+

Sensitivity Intregrals

+

The waterbed effect can be generalized for MIMO systems:

+

\begin{align*} +\int_0^{\infty} \ln{|\det{S(j\w)}|} d\w &= \sum_j \int_0^\infty \ln{\sigma_j(S(j\w))} d\w \\\
+&= \pi \cdot \sum_{i=1}^{N_p} \text{Re}(p_i) +\end{align*}

+

Interpolation Constraints

+

The basis of many of the results in this chapter are the “interpolation constraints".

+
+
+

If \(G(s)\) has a RHP-zero at \(z\) with output direction \(y_z\), \(T(s)\) must have a RHP-zero at \(z\), i.e., \(T(z)\) has a zero gain in the direction of output direction \(y_z\) of the zero, and we get +\[ y_z^H T(z) = 0 ; \quad y_z^H S(z) = y_z^H \]

+
+
+
+

If \(G(s)\) has a RHP-pole at \(p\) with output direction \(y_p\), \(S(s)\) must have a RHP-zero at \(p\), i.e. \(S(p)\) has a zero gain in the input direction of the output direction \(y_p\) of the RHP-pole, and we get +\[ S(p) y_p = 0 ; \quad T(p) y_p = y_p \]

+
+

Sensitivity Peaks

+

Consider a plant \(G(s)\) with RHP-poles \(p_i\) and RHP-zeros \(z_j\). +The factorization of \(G(s)\) in terms of Blaschke products is: +\[ \tcmbox{G(s) = B_p^{-1} G_s(s), \quad G(s) = B_z(s) G_m(s)} \] +where \(G_s\) is the stable and \(G_m\) the minimum-phase version of \(G\). +\(B_p\) and \(B_z\) are stable all-pass transfer matrices (all singular values are 1 for \(s=j\w\)) containing the RHP-poles and RHP-zeros respectively.

+
MIMO sensitivity peaks
+

Suppose that \(G(s)\) has \(N_z\) RHP-zeros \(z_j\) with output directions \(y_{zj}\), and \(N_p\) RHP-poles \(p_i\) with output direction \(y_{pi}\). +We define the all-pass transfer matrices from the Blaschke factorization and compute the real constants: +\[ c_{1j} = \normtwo{y_{zj}^H B_p(z_j)} \geq 1; \quad c_{2i} = \normtwo{B_z^{-1}(p_i) y_{pi}} \geq 1 \]

+

Let \(w_P(s)\) be a stable weight. Then, for closed-loop stability the weighted sensitivity function must satisfy for each RPH-zero \(z_j\) +\[ \hnorm{w_p S} \ge c_{1j} \abs{w_p(z_j)} \]

+

Let \(w_T(s)\) be a stable weight. Then, for closed-loop stability the weighted complementary sensitivity function must satisfy for each RPH-pole \(p_i\) +\[ \hnorm{w_T T} \ge c_{2j} \abs{w_T(p_i)} \]

+
+
+

By selecting \(w_P(s) = 1\) and \(w_T(s) = 1\), we get +\[ \hnorm{S} \ge \max_{\text{zeros } z_j} c_{1j}; \quad \hnorm{T} \ge \max_{\text{poles } p_i} c_{2j} \]

+
+

Functional Controllability

+
+
+

An m-input l-output system \(G(s)\) is functionally controllable is the normal rank of \(G(s)\), denoted \(r\), is equal to the number of outputs (\(r = l\)), that is, if \(G(s)\) has full row rank. +A system is functionally uncontrollable if \(r<l\).

+
+

A square MIMO system is uncontrollable if and only if \(\det{G(s)} = 0,\ \forall s\).

+

A plant is functionally uncontrollable if and only if \(\sigma_l(G(j\omega)) = 0,\ \forall\w\). +\(\sigma_l(G(j\w))\) is then a measure of how close a plant is to being functionally uncontrollable.

+
+
+

If the plant is not functionally controllable (\(r<l\)), then there are \(l-r\) output directions, denoted \(y_0\) which cannot be affected. These directions will vary with frequency, and we have +\[ y_0^H(j\w) G(j\w) = 0 \] +From an SVD of \(G(j\w) = U \Sigma V^H\), the uncontrollable output directions \(y_0(j\w)\) are the last \(l-r\) columns of \(U(j\w)\).

+
+

By analyzing the uncontrollable output directions, an engineer can decide on whether it is acceptable to keep certain output combinations uncontrolled, or if additional actuators are needed.

+

Limitation Imposed by Time Delays

+

Time delays pose limitation also in MIMO systems. Let \(\theta_{ij}\) denote the time delay in the \(ij\)‘th element of \(G(s)\). Then a lower bound on the time delay for output \(i\) is given by the smallest delay in row \(i\) of \(G(s)\), that is +\[ \theta_i^{\min} = \min_j \theta_{ij} \]

+

For MIMO systems, we have the surprising result that an increase time delay may sometimes improve the achievable performance. The time delay may indeed increase the decoupling between the outputs.

+

Limitations Imposed by RHP-Zeros

+

The limitations imposed by RHP-zeros on MIMO systems are similar to those for SISO system, although they only apply in particular directions.

+

The limitations of a RHP-zero located at \(z\) may be derived from the bound: +\[ \hnorm{w_P S(s)} = \max_{\w} \abs{w_P(j\w)} \maxsv(S(j\w)) \ge \abs{w_P(z)} \]

+

All the results derived for SISO systems generalize if we consider the “worst” direction corresponding to the maximum singular value \(\maxsv(S)\). +For instance, if we choose \(w_P(s)\) to require tight control at low frequencies, the bandwidth must satisfy \(w_B^* < z/2\).

+

In MIMO systems, one can often move the deteriorating effect of a RHP-zero to a given output which may be less important to control well. +This is possible because, although the interpolation constraint \(y_z^H T(z) = 0\) imposes a certain relationship between the elements within each column of \(T(s)\), the columns of \(T(s)\) may still be selected independently.

+

Requiring a decoupled response from \(r\) to \(y\) generally leads to the introduction of additional RHP-zero in \(T(s)\) which are not present in \(G(s)\). +Moving the effect of the RHP-zero to a particular output generally add some interaction. Also, moving to RHP-zero in a direction where \(y_z\) is small usually introduces more interaction than in a direction where \(y_z\) is large.

+

For example, if we have a RHP-zero with \(y_z = [0.03,\ -0.04,\ 0.9,\ 0.43]^T\), then one may in theory move the bad effect of the RHP-zero to any of the outputs. However, in practice, it will be difficult to avoid the effect of the RHP-zero on output 3, because the zero direction is mainly in that output. Trying to move it somewhere else will give large interactions and poor performance.

+

Limitation Imposed by Unstable (RHP) Poles

+

For unstable plants, feedback is needed for stabilization. More precisely, the presence of an unstable pole \(p\) requires for internal stability \(T(p) y_p = y_p\) where \(y_p\) is the output pole direction.

+
+
+

The transfer function \(KS\) from plant output to plant inputs must satisfy for any RHP-pole \(p\) +\[ \hnorm{KS} \ge \normtwo{u_p^H G_s(p)^{-1}} \] +where \(u_p\) is the input pole direction, and \(G_s\) is the “stable version” of \(G\) with its RHP-poles mirrored in the LHP.

+
+
+
+

From the bound \(\hnorm{w_T(s) T(s)} \ge \abs{w_T(p)}\), we find that a RHP-pole \(p\) imposes restrictions on \(\maxsv(T)\) which are identical to those derived on \(\abs{T}\) for SISO systems. +Thus, we need to react sufficiently fast and we must require that \(\maxsv(T(j\w))\) is about 1 or larger up to the frequency \(2 \abs{p}\).

+
+

RHP-poles Combined with RHP-Zeros

+

For a MIMO plant with single RHP-zero \(z\) and single RHP-pole \(p\), we derive

+

\[ \hnorm{S} \ge c \quad \hnorm{T} \ge c \] +\[ \text{with } c = \sqrt{\sin^2 \phi + \frac{\abs{z + p}^2}{\abs{z-p}^2} \cos^2 \phi} \] +where \(\phi = cos^{-1} \abs{y_z^H y_p}\) is the angle between the RHP-zero and the RHP-pole.

+

Thus the angle between the RHP-zero and the RHP-pole is of great importance, we usually want \(\abs{y_z^H y_p}\) close to zero so that they don’t interact with each other.

+

Limitations Imposed by Disturbances

+

For SISO systems, we found that large and “fast” disturbances require tight control and a large bandwidth. +The same results apply for MIMO systems, but again the issue of directions is important.

+
+
+

Consider a scalar disturbance \(d\) and let the vector \(g_d\) represents its effect on the outputs (\(y = g_d d\)). +The disturbance direction is defined as

+

\begin{equation} +y_d = \frac{1}{\normtwo{g_d}} g_d +\end{equation}

+

For a plant with multiple disturbances, \(g_d\) is a column of the matrix \(G_d\).

+
+
+
+

\begin{equation} +\gamma_d (G) = \maxsv(G) \maxsv(G^\dagger y_d) +\end{equation}

+

where \(G^\dagger\) is the pseudo inverse of \(G\)

+
+

The disturbance condition number provides a measure of how a disturbance is aligned with the plant. It may vary between 1 (for \(y_d = \bar{u}\)) if the disturbance is in the “good” direction, and the condition number \(\gamma(G) = \maxsv(G) \maxsv(G^\dagger)\) (for \(y_d = \ubar{u}\)) if it is in the “bad” direction.

+

Let assume \(r=0\) and that the system has been scaled. With feedback control \(e = S g_d d\) and the performance objective is +\[ \normtwo{S g_d} = \maxsv(S g_d) < 1 \ \forall\w \quad \Leftrightarrow \quad \hnorm{S g_d} < 1 \]

+

We derive bounds in terms of the singular values of \(S\): +\[ \minsv(S) \normtwo{g_d} \le \normtwo{S g_d} \le \maxsv(S) \normtwo{g_d} \]

+
+
+

For acceptable performance we must at least require that +\[ \maxsv(I+L) > \normtwo{g_d} \]

+

And we may require that +\[ \minsv(I+L) > \normtwo{g_d} \]

+
+

If \(G(s)\) has a RHP-zero at \(s = z\), then the performance may be poor if the disturbance is aligned with the output direction of this zero. +To satisfy \(\hnorm{S g_d} < 1\), we must require +\[ \abs{y_z^H g_d(z)} < 1 \] +where \(y_z\) is the direction of the RHP-zero.

+

Limitations Imposed by Input Constraints

+

Inputs for Perfect Control

+

We here consider the question: can the disturbances be rejected perfectly while maintaining \(\|u\|<1\)?

+

For a square plant, the input needed for perfect disturbance rejection is \(u = -G^{-1} G_d d\).

+

For a single disturbance, as the worst-cast disturbance is \(\abs{d(\w)} = 1\), we get that input saturation is avoided (\(\|u\|_{\text{max}} \le 1\)) if all elements in the vector \(G^{-1} g_d\) are less than 1 in magnitude: +\[ \|G^{-1} g_d\|_{\text{max}} < 1, \ \forall\w \]

+

It is first recommended to consider one disturbance at a time by plotting as a function of frequency the individual elements of \(G^{-1} G_d\). This will yields more information about which particular input is most likely to saturate and which disturbance is the most problematic.

+

Inputs for Acceptable Control

+

We here consider the question: is it possible to achieve \(\|e\|<1\) while using inputs with \(\|u\| \le 1\)?

+

For SISO systems, we have to required \(\abs{G} > \abs{g_d} - 1\) at frequencies where \(\abs{g_d} > 1\). +We would like to generalize this result to MIMO systems.

+
+
+

Each singular value \(\sigma_i\) of \(G\) must approximately satisfy:

+

\begin{equation} +\sigma_i(G) \ge \abs{u_i^H g_d} - 1 \text{ where } \abs{u_i^H g_d} > 1 +\end{equation}

+

with \(u_i\) the \(i\)‘th output singular vector of \(G\).

+

\(u_i^H g_d\) may be interpreted as the projection of \(g_d\) onto the \(i\)‘th output singular vector of the plant.

+
+

Using the previous approximation, we can find out:

+
    +
  • For which disturbances and at which frequencies input constraints may cause problems. This may give ideas on which disturbances should be reduced.
  • +
  • In which direction \(i\) the plant gain is too small. By looking at the corresponding input singular vector \(v_i\), one can determine which actuators should be redesigned. By looking at the corresponding output singular vector \(u_i\), one can determine on which outputs we may have to reduce our performance requirements.
  • +
+

For combined disturbances, one requires the \(i\)‘th row sum of \(U^H G_d\) to be less than \(\sigma_i(G)\). However, we usually derive more insight by considering one disturbance at a time.

+

Unstable Plant and Input Constraints

+

Active use of inputs are needed to stabilize an unstable plant. +We must require \(\hnorm{KS} \ge \normtwo{u_p^H G_s(p)^{-1}}\). +If the required inputs exceed the constraints, then stabilization is most likely not possible.

+

Limitation Imposed by Uncertainty

+

The presence of uncertainty requires the use of feedback rather than simply feedforward control to get acceptable performance. +Sensitivity reduction with respect to uncertainty is achieved with high-gain feedback, but for any real system, we have a crossover frequency range where the loop gain has to drop below 1. The presence of uncertainty in this frequency range may result in poor performance or even instability.

+

The issues are the same for SISO and MIMO systems, however, with MIMO systems there is an additional problem in that there is also uncertainty associated with the plant directionality.

+

Input and Output Uncertainty

+

In practice, the difference between the true perturbed plant \(G^\prime\) and the plant model \(G\) is caused by a number of different sources. +We here focus on input and output uncertainty. +In multiplicative form, the input and output uncertainties are given by (see Fig. fig:input_output_uncertainty): +\[ G^\prime = (I + E_O) G (I + E_I) \]

+

+
+ Figure 12: Plant with multiplicative input and output uncertainty
+

Figure 12: Plant with multiplicative input and output uncertainty

+
+
+ +

Input and output uncertainty may seem similar, but their implications for control may be very different.

+

If all the elements of \(E_O\) and \(E_I\) are non-zero, then we have full block (unstructured) uncertainty.

+

In many cases, the source of uncertainty is in the individual input or output channels, and we have that \(E_I\) and \(E_O\) are diagonal matrices. For example \(E_I = \text{diag}\{\epsilon_1, \epsilon_2, \dots\}\) where \(\epsilon_i\) is the relative uncertainty in input channel \(i\).

+

Diagonal input uncertainty is always present in real systems and the magnitude of \(\epsilon_i\) is typically \(0.1\) or larger.

+

Effect of Uncertainty on Feedforward Control

+

Consider a feedforward controller \(u = K_r r\) for the case with no disturbance (\(d = 0\)). We assume that \(G\) is inversible and we select \(K_r = G^{-1}\) to achieve perfect control (\(e = 0\)). +However, for the actual plant \(G^\prime\) (with uncertainty), the actual control error \(e^\prime = y^\prime - r = G^\prime G^{-1} r - r\) is not null and we get:

+
    +
  • For output uncertainty: \(e^\prime = E_O r\)
  • +
  • For input uncertainty: \(e^\prime = G E_I G^{-1} r\)
  • +
+

For output uncertainty, we have an identical result as for SISO systems: the worst case relative control error \(\normtwo{e^\prime}/\normtwo{r}\) is equal to the magnitude of the relative output uncertainty \(\maxsv(E_O)\). +However, for input uncertainty, the sensitivity may be much larger because the elements in the matrix \(G E_I G^{-1}\) can be much larger than the elements in \(E_I\).

+
+
+

For diagonal input uncertainty, the elements of \(G E_I G^{-1}\) are directly related to the RGA: +\[ \left[ G E_I G^{-1} \right]_{ii} = \sum_{j=1}^n \lambda_{ij}(G) \epsilon_j \]

+
+

Since diagonal input uncertainty is always present, we can conclude that if the plant has large RGA elements within in the frequency range where effect control is desired, then it is not possible to achieve good reference tracking with feedforward control because of strong sensitivity to diagonal input uncertainty. The reverse statement is not true.

+

Uncertainty and the Benefits of Feedback

+

To illustrate the benefits of feedback control in reducing the sensitivity to uncertainty, we consider the effect of output uncertainty on reference tracking both for feedforward and feedback.

+

Feedforward Let the nominal transfer function with feedforward control be \(y = T_r r\) where \(T_r = G K_r\) and \(K_r = G^{-1}\). +With model error \(T_r^\prime = G^\prime K_r\) and the change in response is \(y^\prime - y = (T_r^\prime - T_r) r = (G^\prime - G)G^{-1} T_r r = E_O T_r r\). +Thus, the control error caused by the uncertainty is equal to the relative output uncertainty.

+

Feedback control The output is \(y = T r\). +The change in response is \(y^\prime - y = (T^\prime - T)r = S^\prime E_O T r = S^\prime E_O y\). +With feedback control, the effect of the uncertainty is reduced by a factor \(S^\prime\) compared to that with feedforward control.

+

Uncertainty and the Sensitivity Peak

+

Consider a controller \(K(s) = l(s)G^{-1}(s)\) which results in a nominally decoupled response with sensitivity \(S = s \cdot I\) and complementary sensitivity \(T = t \cdot I\) where \(t(s) = 1 - s(s)\). +Suppose the plant has diagonal input uncertainty of relative magnitude \(\abs{w_I(j\w)}\) in each input channel. +Then there exists a combination of input uncertainties such that at each frequency: +\[ \maxsv(S^\prime) \ge \maxsv(S) \left( 1 + \frac{\abs{w_I t}}{1+\abs{w_I t}} \|\Lambda(G)\|_{i\infty} \right) \] +where \(\| \Lambda(G) \|_{i\infty}\) is the maximum row sum of the RGA and \(\maxsv(S) = \abs{s}\).

+

We can see that with an inverse based controller, the worst case sensitivity will be much larger than the nominal sensitivity at frequencies where the plant has large RGA elements.

+
+
+

These statements apply to the frequency range around crossover. +By “small”, we mean smaller than 2 and by “large” we mean larger than 10.

+
    +
  • Condition number \(\gamma(G)\) or \(\gamma(K)\) small: robust performance to both diagonal and full-block input uncertainty
  • +
  • Minimized condition number \(\gamma_I^* (G)\) or \(\gamma_O^*(K)\) small: robust performance to diagonal input uncertainty
  • +
  • \(\text{RGA}(G)\) has large elements: inverse based controller is not robust to diagonal input uncertainty. +Since diagonal input uncertainty is unavoidable in practice, the rule is never to use a decoupling controller for a plant with large RGA-elements. +Plant with large RGA elements are fundamentally difficult to control.
  • +
+
+

Element-by-element Uncertainty

+

Consider any complex matrix \(G\) and let \(\lambda_{ij}\) denote the \(ij\)‘th element in the RGA-matrix of \(G\).

+
+
+

The matrix \(G\) becomes singular if we make a relative change \(-1/\lambda_{ij}\) in its \(ij\)‘th elements, that is, if a single element in \(G\) is perturbed from \(g_{ij}\) to \(g_{pij} = g_{ij}(1-\frac{1}{\lambda_{ij}})\)

+
+

Thus, the RGA-matrix is a direct measure of sensitivity to element-by-element uncertainty and matrices with large RGA-values become singular for small relative errors in the elements.

+

The above result has important implications:

+
    +
  • Identification. Models of multivariable plants \(G(s)\) are often obtained by identifying one element at a time, for example using step responses. This simple analysis will most likely give meaningless results if there are large RGA-elements within the bandwidth where the model is intended to be used.
  • +
  • RHP-zeros. Consider a plant with transfer function matrix \(G(s)\). If the relative uncertainty in an element at a given frequency is larger than \(\abs{1/\lambda_{ij}(j\w)}\) then the plant may be singular at this frequency, implying that the uncertainty allows for a RHP-zero on the \(j\w\text{-axis}\).
  • +
+

MIMO Input-Output Controllability

+

The following procedure assumes that we have made a decision on the plant inputs and plant outputs, and we want to analyze the model \(G\) to find out what control performance can be expected. +It can also be used to assist in control structure design.

+

A typical MIMO controllability analysis may proceed as follows:

+
    +
  1. Scale all variables (inputs \(u\), outputs \(y\), disturbances \(d\), references \(r\)) to obtain a scaled model \(y = G(s) u + G_d(s) d\), \(r = R \tilde{r}\)
  2. +
  3. Obtain a minimal realization
  4. +
  5. Check functional controllability. To be able to control the outputs independently, we first need at least as many inputs \(u\) as outputs \(y\). Second, we need the rank of \(G(s)\) to be equal to the number of outputs \(l\), i.e. the minimum singular value \(G(j\w)\), \(\minsv(G) = \sigma_l(G)\), should be non-zero (except at possible \(j\w\text{-axis}\) zeros). If the plant is not functionally controllable, then compute the output direction where the plant has no gain to have insight into the source of the problem
  6. +
  7. Compute the poles. For RHP poles, obtain their locations and associated directions. “Fast” RHP-poles far from the origin are bad
  8. +
  9. Compute the zeros. For RHP zeros, obtain their locations and associated directions. Look for zeros pinned into certain outputs. “Small” RHP-zeros (close to the origin) are bad if tight performance is needed at low frequencies
  10. +
  11. Obtain the frequency response \(G(j\w)\) and compute the RGA matrix \(\Gamma = G \times (G^\dagger)^{-1}\). Plants with large RGA-elements at crossover frequencies are difficult to control and should be avoided
  12. +
  13. Compute the singular values of \(G(j\w)\) and plot them as a function of frequency. Also consider the associated input and output singular vectors
  14. +
  15. The minimum singular value \(\minsv(G(j\w))\) is a particularly useful controllability measure. It should generally be as large as possible at frequencies where control is needed. If \(\minsv(G(j\w)) < 1\) then we cannot at frequency \(\w\) make independent output changes of unit magnitude by using inputs of unit magnitude
  16. +
  17. For disturbances, consider the elements of the matrix \(G_d\). At frequencies where one or more elements is larger than 1, we need control. We get more information by considering one disturbance at a time (the columns \(g_d\) of \(G_d\)). We must require for each disturbance that \(S\) is less than \(1/\normtwo{g_d}\) in the disturbance direction \(y_d\), i.e. \(\normtwo{S y_d} \le 1/\normtwo{g_d}\). Thus, we must at least require \(\minsv(S) \le 1/\normtwo{g_d}\) and we may have to require \(\maxsv(S) \le 1/\normtwo{g_d}\)
  18. +
  19. Disturbances and input saturation: +
      +
    • First step. Consider the input magnitudes needed for perfect control by computing the elements in the matrix \(G^\dagger G_d\). If all elements are less than 1 at all frequencies, then input saturation is not expected to be a problem. If some elements of \(G^\dagger G_d\) are larger than 1, then perfect control cannot be achieve at this frequency, but “acceptable” control may be possible
    • +
    • Second step. Consider the elements of \(U^H G_d\) and make sure that the elements in the \(i\)‘th row are smaller than \(\sigma_i(G) + 1\) at all frequencies
    • +
    +
  20. +
  21. Are the requirements compatible? Look at disturbances, RHP-poles, RHP-zeros and their associated locations and directions. For example, we must required for each disturbance and each RHP-zero that \(\abs{y_z^H g_d(z)} \le 1\). Similar relations exist for combined RHP-zero and RHP-pole.
  22. +
  23. Uncertainty. If the condition number \(\gamma(G)\) is small then we expect no particular problems with uncertainty. If the RGA-elements are large, we expect strong sensitivity to uncertainty.
  24. +
+
Plant design changes
+

If the plant is not input-output controllable, then it must be modified. +Some possible modifications are:

+
    +
  • Controlled outputs. Identify the outputs which cannot be controlled satisfactory. Can the specifications for these be relaxed?
  • +
  • Manipulated inputs. If input constraints are encountered, then consider replacing or moving actuators. If there are RHP-zeros which cause control problems, then the zeros may often be eliminated by adding another input. This may not be possible if the zero is pinned to a particular output
  • +
  • Extra measurements. If the effect of disturbances or uncertainty is large, and the dynamics of the plant are such that acceptable control cannot be achieved, then consider adding “fast local loops” based on extra measurements which are located close to the inputs and disturbances
  • +
  • Disturbances. If the effect of disturbances is too large, then see whether the disturbance itself may be reduced. This may involve adding extra equipment to dampen the disturbances. In other cases, this may involve improving or changing the control of another part of the system: we may have a disturbance which is actually the manipulated input for another part of the system
  • +
  • Plant dynamics and time delays. In most cases, controllability is improved by making the plant dynamics faster and by reducing time delays. An exception to this is a strongly interactive plant, where an increased dynamic lag or time delay may be helpful if it somehow “delays” the effect of the interactions
  • +
+

Conclusion

+

We have found that most of the insights into the performance limitation of SISO systems carry over to MIMO systems. +For RHP-zeros, RHP-poles and disturbances, the issue of directions usually makes the limitation less severe for MIMO than for SISO systems. +However, the situation is usually the opposite with model uncertainty because for MIMO systems, there is also uncertainty associated with plant directionality.

+

Uncertainty and Robustness for SISO Systems

+

+

Introduction to Robustness

+

A control system is robust if it is insensitive to differences between the actual system and the model of the system which was used to design the controller. +The key idea in the \(\hinf\) robust control paradigm is to check whether the design specifications are satisfied even for the “worst-case” uncertainty.

+

Our approach is then as follows:

+
    +
  1. Determine the uncertainty set. Find a mathematical representation of the model uncertainty
  2. +
  3. Check Robust Stability (RS). Determine whether the system remains stable for all plants in the uncertainty set
  4. +
  5. Check Robust Performance (RP). If RS is satisfied, determine whether the performance specifications are met for all plants in the uncertainty set
  6. +
+

This approach may not always achieve optimal performance. In particular, if the worst case plant rarely occurs, other approaches, such as optimizing some average performance or using adaptive control may yield better performance.

+

To account for model uncertainty, we will assume that the dynamic behavior of a plant is described not by a single linear time invariant model but by a set \(\Pi\) of possible linear time invariant models, sometimes denoted the “uncertainty set".

+

We adopt the following notation:

+
    +
  • \(\Pi\) - a set of possible perturbed plant models
  • +
  • \(G(s) \in \Pi\) - nominal plant model
  • +
  • \(G_p(s) \in \Pi\) - particular perturbed plant models
  • +
+

We will use a “norm-bounded uncertainty description” where the set \(\Pi\) is generated by allowing \(\hinf\) norm-bounded stable perturbations to the nominal plant \(G(s)\). +We let \(E\) denote a perturbation which is not normalized, and let \(\Delta\) denote a normalized perturbation with its \(\hinf\) norm less than 1.

+

Representing Uncertainty

+

Uncertainty in the plant model may have several origins:

+
    +
  1. There are always parameters in the linear model which are only known approximatively
  2. +
  3. Parameters in the model may vary due to non-linearities or changes in the operating conditions
  4. +
  5. Measurement devices have imperfections
  6. +
  7. At high frequencies, even the structure and the model order is unknown, and the uncertainty will always exceed \(\SI{100}{\percent}\) at some frequency
  8. +
  9. Even when a very detailed model is available, we may choose to work with a simpler nominal model and represent the neglected dynamics as “uncertainty”
  10. +
  11. The controller implemented may differ from the one obtained by solving the synthesis problem. +One may include uncertainty to allow for controller order reduction and implementation inaccuracies
  12. +
+

The various sources of model uncertainty may be grouped into two main classes:

+
    +
  1. Parametric uncertainty. The structure of the model is known, but some parameters are uncertain
  2. +
  3. Neglected and unmodelled dynamics uncertainty. The model is in error because of missing dynamics, usually at high frequencies
  4. +
+
+
+

Parametric uncertainty will be quantified by assuming that each uncertain parameters is bounded within some region \([\alpha_{\min}, \alpha_{\text{max}}]\). That is, we have parameter sets of the form

+

\begin{equation} +\alpha_p = \bar{\alpha}(1 + r_\alpha \Delta); \quad r_\alpha = \frac{\alpha_{\text{max}} - \alpha_{\min}}{\alpha_{\text{max}} + \alpha_{\min}} +\end{equation}

+

where \(\bar{\alpha}\) is the mean parameter value, \(r_\alpha\) is the relative uncertainty in the parameter, and \(\Delta\) is any real scalar satisfying \(\abs{\Delta} \le 1\).

+
+

Neglected and unmodelled dynamics uncertainty is somewhat less precise and thus more difficult to quantify, but it appears that frequency domain is particularly well suited for this class. +This leads to complex perturbations which we normalize such that \(\hnorm{\Delta} \le 1\).

+

There is also a third class of uncertainty (which is a combination of the other two) called Lumped uncertainty. +Here the uncertainty description represents one or several sources of parametric and/or unmodelled dynamics uncertainty combined into a single lumped perturbation of a chosen structure. +The frequency domain is also well suited for describing lumped uncertainty.

+
+
+

In most cases, we prefer to lump the uncertainty into a multiplicative uncertainty of the form +\[ G_p(s) = G(s)(1 + w_I(s)\Delta_I(s)); \quad \abs{\Delta_I(j\w)} \le 1 , \forall\w \] +which may be represented by the diagram in Fig. fig:input_uncertainty_set.

+
+

+
+ Figure 13: Plant with multiplicative uncertainty
+

Figure 13: Plant with multiplicative uncertainty

+
+
+ +

Parametric Uncertainty

+

Parametric uncertainty may also be represented in the \(\hinf\) framework if we restrict \(\Delta\) to be real.

+
+
+

\[ G_p(s) = k_p G_0(s); \quad k_{\min} \le k_p \le k_{\text{max}} \] +where \(k_p\) is an uncertain gain and \(G_0(s)\) is a transfer function with no uncertainty. +By writing \(k_p = \bar{k}(1 + r_k \Delta)\) where \(r_k\) is the relative magnitude of the gain uncertainty and \(\bar{k}\) is the average gain, be may write +\[ G_p = \underbrace{\bar{k}G_0(s)}_{G(s)} (1 + r_k \Delta), \quad \abs{\Delta} \le 1 \] +where \(\Delta\) is a real scalar and \(G(s)\) is the nominal plant.

+
+
+
+

\[ G_p(s) = \frac{1}{\tau_p s + 1}G_0(s); \quad \tau_{\min} \le \tau_p \le \tau_{\text{max}} \] +By writing \(\tau_p = \bar{\tau}(1 + r_\tau \Delta)\), with \(\abs{\Delta} \le 1\), the model set can be rewritten as +\[ G_p(s) = \frac{G_0}{1+\bar{\tau} s + r_\tau \bar{\tau} s \Delta} = \underbrace{\frac{G_0}{1+\bar{\tau}s}}_{G(s)} \frac{1}{1 + w_{iI}(s) \Delta} \] +with \(\displaystyle w_{iI}(s) = \frac{r_\tau \bar{\tau} s}{1 + \bar{\tau} s}\).

+
+

As shown in the two examples, one can represent parametric uncertainty in the \(\hinf\) framework. +However, parametric uncertainty is often avoided for the following reasons:

+
    +
  1. It usually requires a large effort to model parametric uncertainty
  2. +
  3. A parametric uncertainty model is somewhat deceiving in the sense that it provides a very detailed and accurate description, even though the underlying assumptions about the model and the parameters may be much less exact
  4. +
  5. The exact model structure is required and so unmodelled dynamics cannot be dealt with
  6. +
  7. Real perturbations are required, which are more difficult to deal with mathematically and numerically, especially when it comes to controller synthesis
  8. +
+

Therefore, parametric uncertainty is often represented by complex perturbations. For example, we may simply replace the real perturbation, \(-1 \le \Delta \le 1\) by a complex perturbation with \(\abs{\Delta(j\w)} \le 1\). +This is of course conservative as it introduces possible plants that are not present in the original set. However, if there are several real perturbations, then the conservatism if often reduced by lumping these perturbations into a single complex perturbation.

+

Representing Uncertainty in the Frequency Domain

+

Uncertain Regions

+

To illustrate how parametric uncertainty translate into frequency domain uncertainty, consider in Fig. fig:uncertainty_region the Nyquist plots generated by the following set of plants +\[ G_p(s) = \frac{k}{\tau s + 1} e^{-\theta s}, \quad 2 \le k, \theta, \tau \le 3 \]

+
    +
  • Step 1. At each frequency, a region of complex numbers \(G_p(j\w)\) is generated by varying the parameters. +In general, these uncertain regions have complicated shapes and complex mathematical descriptions
  • +
  • Step 2. We therefore approximate such complex regions as discs, resulting in a complex additive uncertainty description
  • +
+

+
+ Figure 14: Uncertainty regions of the Nyquist plot at given frequencies
+

Figure 14: Uncertainty regions of the Nyquist plot at given frequencies

+
+
+ +

Representing Uncertainty Regions by Complex Perturbations

+
+
+

The disc-shaped regions may be generated by additive complex norm-bounded perturbations around a nominal plant \(G\)

+

\begin{equation} +\begin{aligned} +\Pi_A: \ G_p(s) &= G(s) + w_A(s) \Delta_A(s) \\\
+& \text{with }\abs{\Delta_A(j\w)} \le 1 , \forall\w +\end{aligned} +\end{equation}

+

At each frequency, all possible \(\Delta(j\w)\) “generates” a disc-shaped region with radius 1 centered at 0, so \(G(j\w) + w_A(j\w)\Delta_A(j\w)\) generates at each frequency a disc-shapes region of radius \(\abs{w_A(j\w)}\) centered at \(G(j\w)\) as shown in Fig. fig:uncertainty_disc_generated.

+
+

+
+ Figure 15: Disc-shaped uncertainty regions generated by complex additive uncertainty
+

Figure 15: Disc-shaped uncertainty regions generated by complex additive uncertainty

+
+
+ +
+
+

The disc-shaped region may alternatively be represented by a multiplicative uncertainty

+

\begin{equation} +\begin{aligned} +\Pi_I: \ G_p(s) &= G(s)(1 + w_I(s)\Delta_I(s)); \\\
+& \text{with }\abs{\Delta_I(j\w)} \le 1 , \forall\w +\end{aligned} +\end{equation}

+
+

And we see that for SISO systems, additive and multiplicative uncertainty are equivalent if at each frequency: +\[ \abs{w_I(j\w)} = \abs{w_A(j\w)}/\abs{G(j\w)} \]

+

However, multiplicative weights are often preferred because their numerical value is more informative. At frequencies where \(\abs{w_I(j\w)} > 1\) the uncertainty exceeds \(\SI{100}{\percent}\) and the Nyquist curve may pass through the origin. +Then, at these frequencies, we do not know the phase of the plant, and we allow for zeros crossing from the left to the right-half plane. Tight control is then not possible at frequencies where \(\abs{w_I(j\w)} \ge 1\).

+

Obtaining the Weight for Complex Uncertainty

+

Consider a set \(\Pi\) of possible plants resulting, for example, from parametric uncertainty. We now want to describe this set of plants by a single complex perturbation \(\Delta_A\) or \(\Delta_I\).

+

This complex disc-shaped uncertainty description may be generated as follows:

+
    +
  1. Select a nominal \(G(s)\)
  2. +
  3. Additive uncertainty. +At each frequency, find the smallest radius \(l_A(\w)\) which includes all the possible plants \(\Pi\) +\[ l_A(\w) = \max_{G_p\in\Pi} \abs{G_p(j\w) - G(j\w)} \] +If we want a rational transfer function weight, \(w_A(s)\), then it must be chosen to cover the set, so +\[ \abs{w_A(j\w)} \ge l_A(\w) \quad \forall\w \] +Usually \(w_A(s)\) is of low order to simplify the controller design.
  4. +
  5. Multiplicative uncertainty. +This is often the preferred uncertainty form, and we have +\[ l_I(\w) = \max_{G_p\in\Pi} \abs{\frac{G_p(j\w) - G(j\w)}{G(j\w)}} \] +and with a rational weight \(\abs{w_I(j\w)} \ge l_I(\w), , \forall\w\)
  6. +
+
+
+

We want to represent the following set using multiplicative uncertainty with a rational weight \(w_I(s)\) +\[ \Pi: \quad G_p(s) = \frac{k}{\tau s + 1} e^{-\theta s}, \quad 2 \le k, \theta, \tau \le 3 \] +To simplify subsequent controller design, we select a delay-free nominal model +\[ G(s) = \frac{\bar{k}}{\bar{\tau} s + 1} = \frac{2.5}{2.5 s + 1} \]

+

To obtain \(l_I(\w)\), we consider three values (2, 2.5 and 3) for each of the three parameters (\(k, \theta, \tau\)). +The corresponding relative errors \(\abs{\frac{G_p-G}{G}}\) are shown as functions of frequency for the \(3^3 = 27\) resulting \(G_p\) (Fig. fig:uncertainty_weight). +To derive \(w_I(s)\), we then try to find a simple weight so that \(\abs{w_I(j\w)}\) lies above all the dotted lines.

+
+

+
+ Figure 16: Relative error for 27 combinations of \(k,\ \tau\) and \(\theta\). Solid and dashed lines: two weights \(\abs{w_I}\)
+

Figure 16: Relative error for 27 combinations of \(k,\ \tau\) and \(\theta\). Solid and dashed lines: two weights \(\abs{w_I}\)

+
+
+ +

Choice of Nominal Model

+

With parametric uncertainty represented as complex perturbations, there are three main options for the choice of nominal model:

+
    +
  1. A simplified model, for instance a low order, delay free model. +It usually yields the largest uncertainty region, but the model is simple and this facilitates controller design in later stages.
  2. +
  3. A model of mean parameter values, \(G(s) = \bar{G}(s)\). +It is probably the most straightforward choice.
  4. +
  5. The central plant obtained from a Nyquist plot. +It yields the smallest region, but in this case a significant effort may be required to obtain the nominal model which is usually not a rational transfer function.
  6. +
+

For SISO systems, we find that for plants with an uncertain time delay, it is simplest and sometimes best to use a delay-free nominal model, and to represent the nominal delay as additional uncertainty.

+

If we use a parametric uncertainty description, based on multiple real perturbations, then we should always use the mean parameter values in the nominal model.

+

Neglected Dynamics Represented as Uncertainty

+

We saw that one advantage of frequency domain uncertainty description is that one can choose to work with a simple nominal model, and represent neglected dynamics as uncertainty.

+

Consider a set of plants +\[ G_p(s) = G_0(s) f(s) \] +where \(G_0(s)\) is fixed. +We want to neglect the term \(f(s) \in \Pi_f\), and represent \(G_p\) by multiplicative uncertainty with a nominal model \(G = G_0\).

+

The magnitude of the relative uncertainty caused by neglecting the dynamics in \(f(s)\) is +\[ l_I(\w) = \max_{G_p} \abs{\frac{G_p - G}{G}} = \max_{f(s) \in \Pi_f} \abs{f(j\w) - 1} \]

+
Neglected delay
+

Let \(f(s) = e^{-\theta_p s}\), where \(0 \le \theta_p \le \theta_{\text{max}}\). We want to represent \(G_p(s) = G_0(s)e^{-\theta_p s}\) by a delay-free plant \(G_0(s)\) and multiplicative uncertainty. Let first consider the maximum delay, for which the relative error \(\abs{1 - e^{-j \w \theta_{\text{max}}}}\) is shown as a function of frequency (Fig. fig:neglected_time_delay). If we consider all \(\theta \in [0, \theta_{\text{max}}]\) then: +\[ l_I(\w) = \begin{cases} \abs{1 - e^{-j\w\theta_{\text{max}}}} & \w < \pi/\theta_{\text{max}} \ 2 & \w \ge \pi/\theta_{\text{max}} \end{cases} \]

+

+
+ Figure 17: Neglected time delay
+

Figure 17: Neglected time delay

+
+
+ +
Neglected lag
+

Let \(f(s) = 1/(\tau_p s + 1)\), where \(0 \le \tau_p \le \tau_{\text{max}}\). In this case the resulting \(l_I(\w)\) (Fig. fig:neglected_first_order_lag) can be represented by a rational transfer function with \(\abs{w_I(j\w)} = l_I(\w)\) where +\[ w_I(s) = \frac{\tau_{\text{max}} s}{\tau_{\text{max}} s + 1} \]

+

+
+ Figure 18: Neglected first-order lag uncertainty
+

Figure 18: Neglected first-order lag uncertainty

+
+
+ +
Multiplicative weight for gain and delay uncertainty
+

Consider the following set of plants +\[ G_p = k_p e^{-\theta_p s} G_0(s); \quad k_p \in [k_{\min}, k_{\text{max}}], \ \theta_p \in [\theta_{\min}, \theta_{\text{max}}] \] +which we want to represent by multiplicative uncertainty and a delay-free nominal model \(G(s) = \bar{k} G_0(s)\). +There is an exact expression, its first order approximation is +\[ w_I(s) = \frac{(1+\frac{r_k}{2})\theta_{\text{max}} s + r_k}{\frac{\theta_{\text{max}}}{2} s + 1} \] +However, as shown in Fig. fig:lag_delay_uncertainty, the weight \(w_I\) is optimistic, especially around frequencies \(1/\theta_{\text{max}}\). To make sure that \(\abs{w_I(j\w)} \le l_I(\w)\), we can apply a correction factor: +\[ w_I^\prime(s) = w_I \cdot \frac{(\frac{\theta_{\text{max}}}{2.363})^2 s^2 + 2\cdot 0.838 \cdot \frac{\theta_{\text{max}}}{2.363} s + 1}{(\frac{\theta_{\text{max}}}{2.363})^2 s^2 + 2\cdot 0.685 \cdot \frac{\theta_{\text{max}}}{2.363} s + 1} \]

+

It is suggested to start with the simple weight and then if needed, to try the higher order weight.

+

+
+ Figure 19: Multiplicative weight for gain and delay uncertainty
+

Figure 19: Multiplicative weight for gain and delay uncertainty

+
+
+ +

Unmodelled Dynamics Uncertainty

+

The most important reason for using frequency domain (\(\hinf\)) uncertainty description and complex perturbations, is the incorporation of unmodelled dynamics. +Unmodelled dynamics, while being close to neglected dynamics, also include unknown dynamics of unknown or even infinite order.

+
+
+

To represent unmodelled dynamics, we usually use a simple multiplicative weight of the form

+

\begin{equation} +w_I(s) = \frac{\tau s + r_0}{(\tau/r_\infty) s + 1} +\end{equation}

+

where \(r_0\) is the relative uncertainty at steady-state, \(1/\tau\) is the frequency at which the relative uncertainty reaches \(\SI{100}{\percent}\), and \(r_\infty\) is the magnitude of the weight at high frequency.

+
+

SISO Robust Stability

+

RS with Multiplicative Uncertainty

+

We want to determine the stability of the uncertain feedback system in Fig. fig:feedback_multiplicative_uncertainty where there is multiplicative uncertainty of magnitude \(\abs{w_I(j\w)}\). +The loop transfer function becomes +\[ L_P = G_p K = G K (1 + w_I \Delta_I) = L + w_I L \Delta_I \] +We assume (by design) the stability of the nominal closed-loop system (with \(\Delta_I = 0\)). +We use the Nyquist stability condition to test for robust stability of the closed loop system:

+

\begin{align*} +\text{RS} \quad &\stackrel{\text{def}}{\Longleftrightarrow} \quad \text{System stable} \ \forall L_p \\\
+&\Longleftrightarrow \quad L_p \ \text{should not encircle -1}, \ \forall L_p +\end{align*}

+

+
+ Figure 20: Feedback system with multiplicative uncertainty
+

Figure 20: Feedback system with multiplicative uncertainty

+
+
+ +
Graphical derivation of RS-condition
+

Consider the Nyquist plot of \(L_p\) as shown in Fig. fig:nyquist_uncertainty. \(\abs{1+L}\) is the distance from the point \(-1\) to the center of the disc representing \(L_p\) and \(\abs{w_I L}\) is the radius of the disc. +Encirclements are avoided if none of the discs cover \(-1\), and we get:

+

\begin{align*} +\text{RS} \quad &\Leftrightarrow \quad \abs{w_I L} < \abs{1 + L}, \ \forall\w \\\
+&\Leftrightarrow \quad \abs{\frac{w_I L}{1 + L}} < 1, \ \forall\w \\\
+&\Leftrightarrow \quad \abs{w_I T} < 1, \ \forall\w \\\
+\end{align*}

+

+
+ Figure 21: Nyquist plot of \(L_p\) for robust stability
+

Figure 21: Nyquist plot of \(L_p\) for robust stability

+
+
+ +
+
+

The requirement of robust stability for the case with multiplicative uncertainty gives an upper bound on the complementary sensitivity

+

\begin{equation} +\text{RS} \quad \Leftrightarrow \quad \abs{T} < 1/\abs{w_I}, \ \forall\w +\end{equation}

+
+

We see that we have to make \(T\) small at frequencies where the relative uncertainty \(\abs{w_I}\) exceeds 1 in magnitude.

+
Algebraic derivation of RS-condition
+

Since \(L_p\) is assumed stable, and the nominal closed-loop is stable, the nominal loop transfer function \(L(j\w)\) does not encircle -1. Therefore, since the set of plants is norm-bounded, it then follows that if some \(L_{p1}\) in the uncertainty set encircles -1, then there must be another \(L_{p2}\) in the uncertainty set which goes exactly through -1 at some frequency. Thus

+

\begin{align*} +\text{RS} \quad & \Leftrightarrow \abs{1 + L_p} \ne 0,\ \forall L_p,,\forall \w\\\
+& \Leftrightarrow \abs{1 + L_p} > 0,\ \forall L_p,,\forall \w\\\
+& \Leftrightarrow \abs{1 + L + w_I L \Delta_I} > 0,\ \forall \abs{\Delta_I} \le 1,,\forall \w\\\
+\end{align*}

+

At each frequency, the last condition is most easily violated when the complex number \(\Delta_I(j\w)\) is selected with \(\abs{\Delta(j\w)} = 1\) and with phase such that \(1+L\) and \(w_I L \Delta_I\) point in the opposite direction. Thus +\[ \text{RS} \ \Leftrightarrow \ \abs{1 + L} - \abs{w_I L} > 0, \ \forall\w \ \Leftrightarrow \ \abs{w_I T} < 1, \ \forall\w \] +And we obtain the same condition as before.

+

RS with Inverse Multiplicative Uncertainty

+

We will derive a corresponding RS-condition for feedback system with inverse multiplicative uncertainty (Fig. fig:inverse_uncertainty_set) in which +\[ G_p = G(1 + w_{iI}(s) \Delta_{iI})^{-1} \]

+

+
+ Figure 22: Feedback system with inverse multiplicative uncertainty
+

Figure 22: Feedback system with inverse multiplicative uncertainty

+
+
+ +

We assume that \(L_p\) and the nominal closed-loop systems are stable. Robust stability is guaranteed if \(L_p(j\w)\) does not encircles the point -1:

+

\begin{align*} +\text{RS} \quad &\Leftrightarrow \quad \abs{1 + L_p} > 0, \ \forall L_p, , \forall\w\\\
+&\Leftrightarrow \quad \abs{1 + L (1 + w_{iI} \Delta_{iI})^{-1}} > 0, \ \forall \abs{\Delta_{iI}} < 1, , \forall\w\\\
+&\Leftrightarrow \quad \abs{1 + w_{iI} \Delta_{iI} + L} > 0, \ \forall \abs{\Delta_{iI}} < 1, , \forall\w\\\
+&\Leftrightarrow \quad \abs{1 + L} - \abs{w_{iI} \Delta_{iI}} > 0, \ \forall\w\\\
+&\Leftrightarrow \quad \abs{w_{iI} S} < 1, \ \forall\w\\\
+\end{align*}

+
+
+

The requirement for robust stability for the case with inverse multiplicative uncertainty gives an upper bound on the sensitivity

+

\begin{equation} +\text{RS} \quad \Leftrightarrow \quad \abs{S} < 1/\abs{w_{iI}}, \ \forall\w +\end{equation}

+

We see that we need tight control and have to make \(S\) small at frequencies where the uncertainty is large and \(w_{iI}\) exceeds 1 in magnitude.

+
+

The reason is that the uncertainty represents pole uncertainty, and at frequencies where \(\abs{w_{iI}}\) exceeds 1, we allow for poles crossing from the left to the right-half plant, and we then need feedback (\(\abs{S} < 1\)) in order to stabilize the system.

+

SISO Robust Performance

+

SISO Nominal Performance

+
+
+

The condition for nominal performance when considering performance in terms of the weighted sensitivity function is

+

\begin{equation} +\begin{aligned} +\text{NP} &\Leftrightarrow \abs{w_P S} < 1 \ \forall\omega \\\
+&\Leftrightarrow \abs{w_P} < \abs{1 + L} \ \forall\omega +\end{aligned} +\end{equation}

+
+

Now \(\abs{1 + L}\) represents at each frequency the distance of \(L(j\omega)\) from the point \(-1\) in the Nyquist plot, so \(L(j\omega)\) must be at least a distance of \(\abs{w_P(j\omega)}\) from \(-1\). +This is illustrated graphically in Fig. fig:nyquist_performance_condition.

+

+
+ Figure 23: Nyquist plot illustration of the nominal performance condition \(\abs{w_P} &lt; \abs{1 + L}\)
+

Figure 23: Nyquist plot illustration of the nominal performance condition \(\abs{w_P} < \abs{1 + L}\)

+
+
+ +

Robust Performance

+
+
+

For robust performance, we require the performance condition to be satisfied for all possible plants:

+

\begin{equation} +\begin{aligned} +\text{RP}\ &\overset{\text{def}}{\Leftrightarrow}\ \abs{w_P S} < 1 \quad \forall S_p, \forall \omega\\\
+\ &\Leftrightarrow\ \abs{w_P} < \abs{1 + L_p} \quad \forall L_p, \forall \omega +\end{aligned} +\end{equation}

+
+

Let’s consider the case of multiplicative uncertainty as shown on Fig. fig:input_uncertainty_set_feedback_weight_bis. +The robust performance corresponds to requiring \(\abs{\hat{y}/d}<1\ \forall \Delta_I\) and the set of possible loop transfer functions is +\[ L_p = G_p K = L (1 + w_I \Delta_I) = L + w_I L \Delta_I \]

+

+
+ Figure 24: Diagram for robust performance with multiplicative uncertainty
+

Figure 24: Diagram for robust performance with multiplicative uncertainty

+
+
+ +
Graphical derivation of RP-condition
+

As illustrated on Fig. fig:nyquist_performance_condition, we must required that all possible \(L_p(j\omega)\) stay outside a disk of radius \(\abs{w_P(j\omega)}\) centered on \(-1\). +Since \(L_p\) at each frequency stays within a disk of radius \(|w_I(j\omega) L(j\omega)|\) centered on \(L(j\omega)\), the condition for RP becomes:

+

\begin{align*} +\text{RP}\ &\Leftrightarrow\ \abs{w_P} + \abs{w_I L} < \abs{1+L} \quad \forall\omega\\\
+&\Leftrightarrow\ \abs{w_P(1 + L)^{-1}} + \abs{w_I L(1 + L)^{-1}} < 1 \quad \forall\omega\\\
+\end{align*}

+
+
+

Finally, we obtain the following condition for Robust Performance:

+

\begin{equation} +\text{RP} \ \Leftrightarrow\ \max_{\omega} \left(\abs{w_P S} + \abs{w_I T} \right) < 1 +\end{equation}

+
+
Algebraic derivation of RP-condition
+

RP is satisfied if the worst-case weighted sensitivity at each frequency is less than \(1\): +\[ \text{RP} \ \Leftrightarrow\ \max_{S_p} \abs{w_P S_p} < 1, \quad \forall\omega \]

+

The perturbed sensitivity \(S_p\) is +\[ S_p = \frac{1}{1 + L_p} = \frac{1}{1 + L + w_I L \Delta_I} \] +Thus: +\[ \max_{S_p} \abs{w_P S_p} = \frac{\abs{w_P}}{\abs{1 + L} - \abs{w_I L}} = \frac{\abs{w_P S}}{1 - \abs{w_I T}} \] +And we obtain the same RP-condition as the graphically derived one.

+
Remarks on RP-condition
+
    +
  1. +

    The RP-condition for this problem is closely approximated by the mixed sensitivity \(\hinf\) condition: +\[ \tcmbox{\hnorm{\begin{matrix}w_P S \ w_I T\end{matrix}} = \max_{\omega} \sqrt{\abs{w_P S}^2 + \abs{w_I T}^2} <1} \] +This condition is within a factor at most \(\sqrt{2}\) of the true RP-condition. +This means that for SISO systems, we can closely approximate the RP-condition in terms of an \(\hinf\) problem, so there is no need to make use of the structured singular value. +However, we will see that the situation can be very different for MIMO systems.

    +
  2. +
  3. +

    The RP-condition can be used to derive bounds on the loop shape \(\abs{L}\):

    +

    \begin{align*} +\abs{L} &> \frac{1 + \abs{w_P}}{1 - \abs{w_I}}, \text{ at frequencies where } \abs{w_I} < 1\\\
    +\abs{L} &< \frac{1 - \abs{w_P}}{1 + \abs{w_I}}, \text{ at frequencies where } \abs{w_P} < 1\\\
    +\end{align*}

    +
  4. +
+

The Relationship Between NP, RS and RP

+

Consider a SISO system with multiplicative input uncertainty, and assume that the closed-loop is nominally stable (NS). +The conditions for nominal performance (NP), robust stability (RS) and robust performance (RP) as summarized as follows:

+
+
+

\begin{subequations} +\begin{align} +\text{NP} & \Leftrightarrow |w_P S| < 1,\ \forall \omega \\\
+\text{RS} & \Leftrightarrow |w_I T| < 1,\ \forall \omega \\\
+\text{RP} & \Leftrightarrow |w_P S| + |w_I T| < 1,\ \forall \omega +\end{align} +\end{subequations}

+
+

From this we see that a prerequisite for RP is that we satisfy both NP and RS. +This applies in general, both for SISO and MIMO systems and for any uncertainty.

+

In addition, for SISO systems, if we satisfy both RS and NP, then we have at each frequency: +\[ |w_P S| + |w_I T| < 2 \cdot \max \{|w_P S|, |w_I T|\} < 2 \] +It then follows that, within a factor at most 2, we will automatically get RP when NP and RS are satisfied. +This, RP is not a “big issue” for SISO systems.

+

To satisfy RS we generally want \(T\) small, whereas to satisfy \(NP\) we generally want \(S\) small. +However, we cannot make both \(S\) and \(T\) small at the same frequency because of the identity \(S + T = 1\). +This has implications for RP:

+

\begin{align*} +|w_P S| + |w_I T| &\ge \text{min}\{|w_P|, |w_I|\}(|S| + |T|) \\\
+&\ge \text{min}\{|w_P|, |w_I|\}(|S + T|) \\\
+&\ge \text{min}\{|w_P|, |w_I|\} +\end{align*}

+

This means that we cannot have both \(|w_P|>1\) (i.e. good performance) and \(|w_I|>1\) (i.e. more than \(\si{100}{%}\) uncertainty) at the same frequency.

+

Examples of Parametric Uncertainty

+

Parametric Pole Uncertainty

+

Consider the following set of plants: +\[ G_p(s) = \frac{1}{s - a_p} G_0(s); \quad a_\text{min} \le a_p \le a_{\text{max}} \]

+

If \(a_\text{min}\) and \(a_\text{max}\) have different signs, then this means that the plant can change from stable to unstable with the pole crossing through the origin.

+

This set of plants can be written as +\[ G_p(s) = \frac{G_0(s)}{s - \bar{a}(1 + r_a \Delta)}; \quad -1 \le \Delta \le 1 \] +which can be exactly described by inverse multiplicative uncertainty: +\[ G(s) = \frac{G_0(s)}{(s - \bar{a})}; \quad w_{iI}(s) = \frac{r_a \bar{a}}{s - \bar{a}} \]

+

The magnitude of \(w_{iI}(s)\) is equal to \(r_a\) at low frequency and goes to \(0\) at high frequencies.

+
Time constant form
+

It is also interesting to consider another form of pole uncertainty, namely that associated with the time constant: +\[ G_p(s) = \frac{1}{\tau_p s + 1} G_0(s); \quad \tau_\text{min} \le \tau_p \le \tau_\text{max} \]

+

The corresponding uncertainty weight is +\[ w_{iI}(s) = \frac{r_\tau \bar{\tau} s}{1 + \bar{\tau} s} \]

+

This results in uncertainty in the pole location, but here the uncertainty affects the model at high frequency.

+

Parametric Zero Uncertainty

+

Consider zero uncertainty in the “time constant” form as in: +\[ G_p(s) = (1 + \tau_p s)G_0(s); \quad \tau_\text{min} \le \tau_p \le \tau_\text{max} \]

+

This set of plants may be written as multiplicative uncertainty with: +\[ w_I(s) = \frac{r_\tau \bar{\tau} s}{1 + \bar{\tau} s} \] +The magnitude \(|w_I(j\omega)|\) is small at low frequencies and approaches \(r_\tau\) at high frequencies. +For cases with \(r_\tau > 1\) we allow the zero to cross from the LHP to the RHP.

+

Parametric State-Space Uncertainty

+

A general procedure for handling parametric uncertainty which is more suited for numerical calculations, is parametric state-space uncertainty. +Consider an uncertain state-space model:

+

\begin{align*} +\dot{x} &= A_p x + B_p u \\\
+y &= C_p x + D_p u +\end{align*}

+

Assume that the underlying cause for the uncertainty is uncertainty in some real parameters \(\delta_1, \delta_2, \dots\) and assume that the state space matrices depends linearly on these parameters:

+

\begin{align*} +A_p = A + \sum \delta_i A_i; \quad & B_p = B + \sum \delta_i B_i \\\
+C_p = C + \sum \delta_i C_i; \quad & D_p = D + \sum \delta_i D_i +\end{align*}

+

where \(A\), \(B\), \(C\) and \(D\) model the nominal system.

+

We can collect the perturbations \(\delta_i\) in a large diagonal matrix \(\Delta\) with the real \(\delta_i\)‘s along its diagonal: +\[ A_p = A + \sum \delta_i A_i = A + W_2 \Delta W_1 \]

+

In the transfer function form:

+

\begin{align*} +(s I - A_p)^{-1} &= (sI - A - W_2 \Delta W_1)^{-1} \\\
+&= (I - \Phi(s) W_2 \Delta W_1)^{-1} \Phi(s) +\end{align*}

+

with \(\Phi(s) \triangleq (sI - A)^{-1}\).

+

This is illustrated in the block diagram of Fig. fig:uncertainty_state_a_matrix, which is in the form of an inverse additive perturbation.

+

+
+ Figure 25: Uncertainty in state space A-matrix
+

Figure 25: Uncertainty in state space A-matrix

+
+
+ +

Conclusion

+

Model uncertainty for SISO systems can be represented in the frequency domain using complex norm-bounded perturbations \(\hnorm{\Delta} \le 1\).

+

Requirements of robust stability for the case of multiplicative complex uncertainty imposes an upper bound on the allowed complementary sensitivity, \(\abs{w_I T} < 1, \ \forall\w\).

+

Similarly, the inverse multiplicative uncertainty imposes an upper bound on the sensitivity, \(\abs{w_{iI} S} < 1, \ \forall\w\).

+

We also derived a condition for robust performance with multiplicative uncertainty, \(\abs{w_P S} + \abs{w_I T} < 1, \ \forall\w\).

+

Robust Stability and Performance Analysis

+

+

General Control Configuration with Uncertainty

+

The starting point for our robustness analysis is a system representation in which the uncertain perturbations are “pulled out” into a block diagonal matrix +\[ \Delta = \text{diag} \{\Delta_i\} = \begin{bmatrix}\Delta_1 \ & \ddots \ & & \Delta_i \ & & & \ddots \end{bmatrix} \] +where each \(\Delta_i\) represents a specific source of uncertainty, e.g. input uncertainty \(\Delta_I\) or parametric uncertainty \(\delta_i\).

+

If we also pull out the controller \(K\), we get the generalized plant \(P\) as shown in Fig. fig:general_control_delta. This form is useful for controller synthesis.

+

+
+ Figure 26: General control configuration used for controller synthesis
+

Figure 26: General control configuration used for controller synthesis

+
+
+ +

If the controller is given and we want to analyze the uncertain system, we use the \(N\Delta\text{-structure}\) in Fig. fig:general_control_Ndelta.

+

+
+ Figure 27: \(N\Delta\text{-structure}\) for robust performance analysis
+

Figure 27: \(N\Delta\text{-structure}\) for robust performance analysis

+
+
+ +

\(N\) is related to \(P\) and \(K\) by a lower LFT

+

\begin{align*} +N &= F_l(P, K) \\\
+&\triangleq P_{11} + P_{12} K (I - P_{22}K)^{-1} P_{21} +\end{align*}

+

Similarly, the uncertain closed-loop transfer function from \(w\) to \(z\), is related to \(N\) and \(\Delta\) by an upper LFT

+

\begin{align*} +F &= F_u(N, \Delta) \\\
+&\triangleq N_{22} + N_{21} \Delta (I - N_{11} \Delta)^{-1} N_{12} +\end{align*}

+

To analyze robust stability of \(F\), we can rearrange the system into the \(M\Delta\text{-structure}\) shown in Fig. fig:general_control_Mdelta_bis where \(M = N_{11}\) is the transfer function from the output to the input of the perturbations.

+

+
+ Figure 28: \(M\Delta\text{-structure}\) for robust stability analysis
+

Figure 28: \(M\Delta\text{-structure}\) for robust stability analysis

+
+
+ +

Representing Uncertainty

+

Each individual perturbation is assumed to be stable and normalized: +\[ \maxsv(\Delta_i(j\w)) \le 1 \quad \forall\w \]

+

As the maximum singular value of a block diagonal matrix is equal to the largest of the maximum singular values of the individual blocks, it then follows for \(\Delta = \text{diag}\{\Delta_i\}\) that +\[ \maxsv(\Delta_i(j\w)) \le 1 \quad \forall\w, \forall i \quad \Leftrightarrow \quad \tcmbox{\hnorm{\Delta} \le 1} \]

+

Differences Between SISO and MIMO Systems

+

The main difference between SISO and MIMO systems is the concept of directions which is only relevant in the latter. +As a consequence, MIMO systems may experience much larger sensitivity to uncertainty than SISO systems.

+

Parametric Uncertainty

+

The representation of parametric uncertainty for MIMO systems is the same as for SISO systems. +However, the inclusion of parametric uncertainty may be more significant for MIMO plants because it offers a simple method of representing uncertain transfer function elements.

+

Unstructured Uncertainty

+

Unstructured perturbations are often used to get a simple uncertainty model. +We here define unstructured uncertainty as the use of a “full” complex perturbation matrix \(\Delta\), usually with dimensions compatible with those of the plant, where at each frequency any \(\Delta(j\w)\) satisfying \(\maxsv(\Delta(j\w)) < 1\) is allowed.

+

Three common forms of feedforward unstructured uncertainty are shown Fig. fig:feedforward_uncertainty: additive uncertainty, multiplicative input uncertainty and multiplicative output uncertainty.

+
+
+

\begin{alignat*}{3} +&\Pi_A: \quad &&G_p = G + E_A; \quad& &E_a = w_A \Delta_a \\\
+&\Pi_I: \quad &&G_p = G(I + E_I); \quad& &E_I = w_I \Delta_I \\\
+&\Pi_O: \quad &&G_p = (I + E_O)G; \quad& &E_O = w_O \Delta_O +\end{alignat*}

+
+

+
+ Table 4: + Common feedforward unstructured uncertainty +
+ + + + + + + + + + + + + + + +
Additive uncertainty Multiplicative input uncertainty Multiplicative output uncertainty
+

In Fig. fig:feedback_uncertainty, three feedback or inverse unstructured uncertainty forms are shown: inverse additive uncertainty, inverse multiplicative input uncertainty and inverse multiplicative output uncertainty.

+
+
+

\begin{alignat*}{3} +&\Pi_{iA}: \quad &&G_p = G(I - E_{iA} G)^{-1}; & & \quad E_{ia} = w_{iA} \Delta_{ia} \\\
+&\Pi_{iI}: \quad &&G_p = G(I - E_{iI})^{-1}; & & \quad E_{iI} = w_{iI} \Delta_{iI} \\\
+&\Pi_{iO}: \quad &&G_p = (I - E_{iO})^{-1}G; & & \quad E_{iO} = w_{iO} \Delta_{iO} +\end{alignat*}

+
+

+
+ Table 5: + Common feedback unstructured uncertainty +
+ + + + + + + + + + + + + + + +
Inverse additive uncertainty Inverse multiplicative input uncertainty Inverse multiplicative output uncertainty
+
Lumping uncertainty into a single perturbation
+

For SISO systems, we usually lump multiple sources of uncertainty into a single complex perturbation; often in the multiplicative form. +This may be also done for MIMO systems, but then it makes a difference whether the perturbation is at the input or the output.

+

Since output uncertainty is frequently less restrictive than input uncertainty in terms of control performance, we first attempt to lump the uncertainty at the output. For example, a set of plant \(\Pi\) may be represented by multiplicative output uncertainty with a scalar weight \(w_O(s)\) using +\[ G_p = (I + w_O \Delta_O) G, \quad \hnorm{\Delta_O} \le 1 \] +where +\[ l_O(\w) = \max_{G_p \in \Pi} \maxsv\left( (G_p - G)G^{-1} \right); \ \abs{w_O(j\w)} \ge l_O(\w), , \forall\w \]

+

If the resulting uncertainty weight is reasonable and the analysis shows that robust stability and performance may be achieve, then this lumping of uncertainty at the output is fine. +If this is not the case, then one may try to lump the uncertainty at the input instead, using multiplicative input uncertainty with a scalar weight, +\[ G_p = G(I + w_I \Delta_I), \quad \hnorm{\Delta_I} \le 1 \] +where +\[ l_I(\w) = \max_{G_p \in \Pi} \maxsv\left( G^{-1}(G_p - G) \right); \ \abs{w_I(j\w)} \ge l_I(\w), , \forall\w \]

+

However, in many cases, this approach of lumping uncertainty either at the output or the input does not work well because it usually introduces additional plants that were not present in the original set.

+
Conclusion
+

Ideally, we would like to lump several sources of uncertainty into a single perturbation to get a simple uncertainty description. +Often an unstructured multiplicative output perturbation is used. +However, we should be careful about doing this, at least for plants with a large condition number. +In such cases we may have to represent the uncertainty as it occurs physically (at the input, in the elements, etc.) thereby generating several perturbations.

+

Diagonal Uncertainty

+

By “diagonal uncertainty” we mean that the perturbation is a complex diagonal matrix +\[ \Delta(s) = \text{diag}\{\delta_i(s)\}; \quad \abs{\delta_i(j\w)} \le 1, \ \forall\w, , \forall i \]

+

Diagonal uncertainty usually arises from a consideration of uncertainty or neglected dynamics in the individual input or output channels. +This type of diagonal uncertainty is always present.

+
+
+

Let us consider uncertainty in the input channels. With each input \(u_i\), there is a physical system (amplifier, actuator, etc.) which based on the controller output signal \(u_i\), generates a physical plant input \(m_i\) +\[ m_i = h_i(s) u_i \] +The scalar transfer function \(h_i(s)\) is often absorbed into the plant model \(G(s)\). +We can represent its uncertainty as multiplicative uncertainty +\[ h_{pi}(s) = h_i(s)(1 + w_{Ii}(s)\delta_i(s)); \quad \abs{\delta_i(j\w)} \le 1, , \forall\w \] +which after combining all input channels results in diagonal input uncertainty for the plant

+

\begin{align*} +G_p(s) = G(I + W_I \Delta_I) \text{ with } &\Delta_I = \diag{\delta_i} \\\
+&W_I = \diag{w_{Ii}} +\end{align*}

+
+

Normally, we would represent the uncertainty in each input or output channel using a simple weight in the form +\[ w(s) = \frac{\tau s + r_0}{(\tau/r_\infty)s + 1} \] +where \(r_0\) is the relative uncertainty at steady-state, \(1/\tau\) is the frequency where the relative uncertainty reaches \(\SI{100}{\percent}\), and \(r_\infty\) is the magnitude of the weight at high frequencies.

+

Diagonal input uncertainty should always be considered because:

+
    +
  • it is always present and a system which is sensitive to this uncertainty will not work in practice
  • +
  • it often restrict achievable performance with multivariable control
  • +
+

Obtaining \(P\), \(N\) and \(M\)

+

Let’s consider the feedback system with multiplicative input uncertainty \(\Delta_I\) shown Fig. fig:input_uncertainty_set_feedback_weight. +\(W_I\) is a normalization weight for the uncertainty and \(W_P\) is a performance weight.

+

+
+ Figure 29: System with multiplicative input uncertainty and performance measured at the output
+

Figure 29: System with multiplicative input uncertainty and performance measured at the output

+
+
+ +

We want to derive the generalized plant \(P\) which has inputs \([u_\Delta,\ w,\ u]^T\) and outputs \([y_\Delta,\ z,\ v]^T\).

+

By breaking the loop before and after \(K\) and \(\Delta_I\), we get +\[ P = \begin{bmatrix} +0 & 0 & W_I \\\
+W_P G & W_P & W_P G \\\
+-G & -I & -G +\end{bmatrix} \]

+

Next, we want to derive the matrix \(N\). We fist partition \(P\) to be compatible with \(K\):

+

\begin{align*} +P_{11} = \begin{bmatrix}0&0\GW_P&W_P\end{bmatrix},\quad & P_{12} = \begin{bmatrix}W_I\GW_P\end{bmatrix} \\\
+P_{21} = \begin{bmatrix}G&-1\end{bmatrix}, \quad & P_{22} = -G \\\
+\end{align*}

+

and then we find \(N\) using \(N = F_l(P, K)\).

+

Definitions of Robust Stability and Robust Performance

+

The next step is to check whether we have stability and acceptable performance for all plant in the set:

+
    +
  1. Robust stability analysis: with a given controller \(K\) we determine whether the system remains stable for all plants in the uncertainty set
  2. +
  3. Robust performance analysis: is RS is satisfied, we determine how “large” the transfer function from exogenous inputs \(w\) to outputs \(z\) may be for all plants in the uncertainty set
  4. +
+

We have \(z = F(\Delta) \cdot w\) with

+

\begin{align*} +F &= F_u(N, \Delta) \\\
+&\triangleq N_{22} + N_{21}\Delta(I - N_{11}\Delta)^{-1} N_{12} +\end{align*}

+

We here use \(\hinf\) norm to define performance and require for RP that \(\hnorm{F(\Delta)} \le 1\) for all allowed \(\Delta\). +A typical choice is \(F = w_P S_P\) where \(w_P\) is the performance weight and \(S_P\) represents the set of perturbed sensitivity functions.

+
+
+

In terms of the \(N\Delta\text{-structure}\), our requirements for stability and performance can be summarized as follows:

+

\begin{align*} +\text{NS} &\ \stackrel{\text{def}}{\Longleftrightarrow} \ N \text{ is internally stable} \\\
+\text{NP} &\ \stackrel{\text{def}}{\Longleftrightarrow} \ \text{NS and } \hnorm{N_{22}} < 1 \\\
+\text{RS} &\ \stackrel{\text{def}}{\Longleftrightarrow} \ \text{NS and } F = F_u(N, \Delta) \text{ is stable } \forall\Delta \\\
+\text{RP} &\ \stackrel{\text{def}}{\Longleftrightarrow} \ \text{NS and } \hnorm{F} < 1, \quad \forall \Delta, ,\hnorm{\Delta} \le 1 \\\
+\end{align*}

+
+

Robust Stability for the \(M\Delta\text{-structure}\)

+

Consider the uncertain \(N\Delta\text{-system}\) for which the transfer function from \(w\) to \(z\) is +\[ F_u(N, \Delta) = N_{22} + N_{21}\Delta(I - N_{11}\Delta)^{-1} N_{12} \] +Suppose that the system is nominally stable (with \(\Delta = 0\)) that is \(N\) is stable. We also assume that \(\Delta\) is stable. +We then see from the above equation that the only possible source of instability is the feedback term \((I - N_{11}\Delta)^{-1}\). +Thus, when we have nominal stability, the stability of the \(N\Delta\text{-structure}\) is equivalent to the stability of the \(M\Delta\text{-structure}\) where \(M = N_{11}\).

+

We thus need to derive conditions for checking the stability of the \(M\Delta\text{-structure}\).

+
+
+

Assume that the nominal system \(M(s)\) and the perturbations \(\Delta(s)\) are stable. +Consider the convex set of perturbations \(\Delta\), such that if \(\Delta^\prime\) is an allowed perturbation then so is \(c\Delta^\prime\) where c is any real scalar such that \(\abs{c} \le 1\). +Then the \(M\Delta\text{-structure}\) is stable for all allowed perturbations if and only if the Nyquist plot of \(\det\left( I - M\Delta(s) \right)\) does not encircle the origin, \(\forall\Delta\):

+

\begin{equation} +\det( I - M\Delta(j\w)) \ne 0, \quad \forall\w, , \forall\Delta +\end{equation}

+
+
+
+

Assume that the nominal system \(M(s)\) and the perturbations \(\Delta(s)\) are stable. +Consider the class of perturbations, \(\Delta\), such that if \(\Delta^\prime\) is an allowed perturbation, then so is \(c\Delta^\prime\) where c is any complex scalar such that \(\abs{c} \le 1\). +Then the \(M\Delta\text{-structure}\) is stable for all allowed perturbations if and only if:

+

\begin{equation} +\begin{aligned} +&\rho(M\Delta(j\w)) < 1, \quad \forall\w, , \forall\Delta\\\
+\Leftrightarrow \quad &\max_{\Delta} \rho(M\Delta(j\w)) < 1, \quad \forall\w +\end{aligned} +\end{equation}

+
+

RS for Complex Unstructured Uncertainty

+

Let \(\Delta\) be the set of all complex matrices such that \(\maxsv(\Delta) \le 1\) (\(\|\Delta\|_\infty \le 1\)). +This is often referred to as unstructured uncertainty or as full-block complex perturbation uncertainty. +Then we have

+

\begin{align*} +\max_\Delta \rho(M\Delta) &= \max_\Delta \maxsv(M\Delta) \\\
+&= \max_\Delta \maxsv(\Delta) \maxsv(M) \\\
+&= \maxsv(M) +\end{align*}

+
+
+

Assume that the nominal system \(M(s)\) is stable and that the perturbations \(\Delta(s)\) are stable. +Then the \(M\Delta\text{-system}\) is stable for all perturbations \(\Delta\) satisfying \(\hnorm{\Delta} \le 1\) if and only if

+

\begin{equation} +\maxsv(M(j\w)) < 1 \ \forall\w \quad \Leftrightarrow \quad \hnorm{M} < 1 +\end{equation}

+
+

Application of the Unstructured RS-condition

+

We will now present necessary and sufficient conditions for robust stability for each of the six single unstructured perturbations in Figs fig:feedforward_uncertainty and fig:feedback_uncertainty with +\[ E = W_2 \Delta W_1, \quad \hnorm{\Delta} \le 1 \]

+

To derive the matrix \(M\) we simply “isolate” the perturbation, and determine the transfer function matrix +\[ M = W_1 M_0 W_2 \] +from the output to the input of the perturbation, where \(M_0\) for each of the six cases is given by

+

\begin{alignat*}{2} +G_p &= G + E_A: \quad && M_0 = K (I + GK)^{-1} = KS\\\
+G_p &= G(I + E_I): \quad && M_0 = K (I + GK)^{-1}G = T_I\\\
+G_p &= (I + E_O)G: \quad && M_0 = G K (I + GK)^{-1} = T\\\
+G_p &= G(I - E_{iA}G)^{-1}: \quad && M_0 = (I + GK)^{-1} G = SG\\\
+G_p &= G(I - E_{iI})^{-1}: \quad && M_0 = (I + KG)^{-1} = S_I\\\
+G_p &= (I - E_{iO})^{-1} G: \quad && M_0 = (I + GK)^{-1} = S +\end{alignat*}

+

Using the theorem to check RS for unstructured perturbations +\[ \text{RS} \quad \Leftrightarrow \quad \hnorm{W_1 M_0 W_2(j\w)} < 1, \ \forall\w \]

+

For instance, for feedforward input uncertainty, we get +\[ \text{RS}\ \forall G_p = G(I + w_I \Delta_I), \hnorm{\Delta_I} \le 1 \Leftrightarrow \hnorm{w_I T_I} < 1 \]

+

In general, the unstructured uncertainty descriptions in terms of a single perturbation are not “tight” (in the sense that at each frequency all complex perturbations satisfying \(\maxsv(\Delta(j\w)) \le 1\) may not be possible in practice). +Thus, the above RS-conditions are often conservative. +In order to get tighter condition we must use a tighter uncertainty description in terms of a block-diagonal \(\Delta\).

+

RS for Coprime Factor Uncertainty

+

Robust stability bound in terms of the \(\hinf\) norm (\(\text{RS}\Leftrightarrow\hnorm{M}<1\)) are in general only tight when there is a single full perturbation block. +An “exception” to this is when the uncertainty blocks enter or exit from the same location in the block diagram, because they can then be stacked on top of each other or side-by-side, in an overall \(\Delta\) which is then full matrix.

+

One important uncertainty description that falls into this category is the coprime uncertainty description shown in Fig. fig:coprime_uncertainty, for which the set of plants is +\[ G_p = (M_l + \Delta_M)^{-1}(Nl + \Delta_N), \quad \hnorm{[\Delta_N, \ \Delta_N]} \le \epsilon \] +Where \(G = M_l^{-1} N_l\) is a left coprime factorization of the nominal plant.

+

This uncertainty description is surprisingly general, it allows both zeros and poles to cross into the right-half plane, and has proven to be very useful in applications.

+

+
+ Figure 30: Coprime Uncertainty
+

Figure 30: Coprime Uncertainty

+
+
+ +

Since we have no weights on the perturbations, it is reasonable to use a normalized coprime factorization of the nominal plant. +In any case, to test for RS we can rearrange the block diagram to match the \(M\Delta\text{-structure}\) with +\[ \Delta = [\Delta_N, \ \Delta_M]; \quad M = -\begin{bmatrix}K\I\end{bmatrix} (I + GK)^{-1} M_l^{-1} \] +And we get +\[ \text{RS}\ \forall\ \hnorm{\Delta_N, \ \Delta_M} \le \epsilon \quad \Leftrightarrow \quad \hnorm{M} < 1/\epsilon \]

+

The coprime uncertainty description provides a good generic uncertainty description for cases where we do not use any specific a priori uncertainty information. +Note that the uncertainty magnitude is \(\epsilon\), so it is not normalized to be less than 1 in this case. +This is because this uncertainty description is most often used in a controller design procedure where the objective is to maximize the magnitude of the uncertainty \(\epsilon\) such that RS is maintained.

+

RS with Structured Uncertainty: Motivation

+

Consider now the presence of structured uncertainty, where \(\Delta = \text{diag}\{\Delta_i\}\) is block-diagonal. +To test for robust stability, we rearrange the system into the \(M\Delta\text{-structure}\) and we have +\[ \text{RS if } \maxsv(M(j\w)) < 1, \ \forall\w \]

+

We have here written “if” rather than “if and only if” since this condition is only sufficient for RS when \(\Delta\) has “no structure”. +The question is whether we can take advantage of the fact that \(\Delta = \text{diag}\{\Delta_i\}\) is structured to obtain an RS-condition which is tighter. +On idea is to make use of the fact that stability must be independent of scaling.

+

To this effect, introduce the block-diagonal scaling matrix +\[ D = \diag{d_i I_i} \] +where \(d_i\) is a scalar and \(I_i\) is an identity matrix of the same dimension as the \(i\)‘th perturbation block \(\Delta_i\).

+

Now rescale the inputs and outputs of \(M\) and \(\Delta\) by inserting the matrices \(D\) and \(D^{-1}\) on both sides as shown in Fig. fig:block_diagonal_scalings. +This clearly has no effect on stability.

+

+
+ Figure 31: Use of block-diagonal scalings, \(\Delta D = D \Delta\)
+

Figure 31: Use of block-diagonal scalings, \(\Delta D = D \Delta\)

+
+
+ +

Note that with the chosen form for the scalings we have for each perturbation block \(\Delta_i = d_i \Delta_i d_i^{-1}\), that is we have \(\Delta = D \Delta D^{-1}\).

+

This means that we have +\[ \text{RS if } \maxsv(DM(j\w)D^{-1}) < 1, \ \forall\w \]

+
+
+

This applies for any \(D\), and therefore the “most improved” (least conservative) RS-condition is obtained by minimizing at each frequency the scaled singular value and we have +\[ \text{RS if } \min_{D(\w) \in \mathcal{D}} \maxsv(D(\w)M(j\w)D(\w)^{-1}) < 1, \ \forall\w \] +where \(\mathcal{D}\) is the set of block-diagonal matrices whose structure is compatible to that of \(\Delta\), i.e, \(\Delta D = D \Delta\).

+
+

When \(\Delta\) is a full matrix, we must select \(D = dI\) and we have \(\maxsv(D M D^{-1}) = \maxsv(M)\), and we cannot improve the RS-condition. +However, when \(\Delta\) has structure, we get more degrees of freedom in \(D\) and \(\maxsv(D M D^{-1})\) may be significantly smaller than \(\maxsv(M)\).

+

The Structured Singular Value

+

Definition

+

The structured singular value \(\mu\) is a function which provides a generalization of the singular value \(\maxsv\) and the spectral radius \(\rho\). +We will use \(\mu\) to get necessary and sufficient conditions for robust stability and also for robust performance.

+

\(\mu\) can be explained as follow:

+
+

Find the smallest structured \(\Delta\) (measured in terms of \(\maxsv(\Delta)\)) which makes the matrix \(I - M \Delta\) singular; then \(\mu(M) = 1/\maxsv(\Delta)\).

+
+

Mathematically +\[ \mu(M)^{-1} \triangleq \min_{\Delta}\{\maxsv(\Delta) | \det(I-M\Delta) = 0 \text{ for struct. }\Delta\} \] +Clearly, \(\mu(M)\) depends not only on \(M\) but also on the allowed structure for \(\Delta\). This is sometimes shown explicitly by using the notation \(\mu_\Delta (M)\).

+

The above definition of \(\mu\) involves varying \(\maxsv(\Delta)\). However, we prefer to normalize \(\Delta\) such that \(\maxsv(\Delta)\le1\). We can do that by scaling \(\Delta\) by a factor \(k_m\), and looking for the smallest \(k_m\) which makes the matrix \(I - k_m M \Delta\) singular. \(\mu\) is then the reciprocal of this small \(k_m\): \(\mu = 1/k_m\). This results in the following alternative definition of \(\mu\).

+
+
+

Let \(M\) be a given complex matrix and let \(\Delta = \diag{\Delta_i}\) denote a set of complex matrices with \(\maxsv(\Delta) \le 1\) and with a given block-diagonal structure. +The real non-negative function \(\mu(M)\), called the structured singular value, is defined by

+

\begin{align*} +\mu(M) \triangleq &(\min\{ k_m | \det(I - k_m M \Delta) = 0\\\
+&\text{for structured } \Delta, \maxsv(\Delta) \le 1 \} )^{-1} +\end{align*}

+

If no such structured \(\Delta\) exists then \(\mu(M) = 0\)

+
+

A value of \(\mu = 1\) means that there exists a perturbation with \(\maxsv(\Delta) = 1\) which is just large enough to make \(I - M\Delta\) singular.

+

A larger value of \(\mu\) is “bad” as it means that a smaller perturbation makes \(I - M\Delta\) singular, whereas a smaller value of \(\mu\) is “good”.

+

Remarks on the Definition of \(\mu\)

+
    +
  1. The structured singular value was introduced by Doyle while at the same time, Safonov introduced the Multivariable Stability Margin \(k_m\) for a diagonally perturbed system as the inverse of \(\mu\), that is \(k_m(M) = \mu(M)^{-1}\).
  2. +
  3. Note that with \(k_m = 0\) we obtain \(I - k_m M \Delta = I\) which is clearly non-singular. +Thus, one possible way to obtain \(\mu\) numerically, is to start with \(k_m = 0\), and gradually increase \(k_m\) until we first find an allowed \(\Delta\) with \(\maxsv(\Delta) = 1\) such that \(I-k_mM\Delta\) is singular.
  4. +
+

Properties of \(\mu\) for Real and Complex \(\Delta\)

+
    +
  1. \(\mu(\alpha M) = \abs{\alpha} \mu(M)\) for any real scalar \(\alpha\)
  2. +
  3. Let \(\Delta = \diag{\Delta_1, \Delta_2}\) be a block-diagonal perturbation and let \(M\) be partitioned accordingly. +Then \[ \mu_\Delta \ge \text{max} \{\mu_{\Delta_1} (M_{11}), \mu_{\Delta_2}(M_{22}) \} \]
  4. +
+

Properties of \(\mu\) for Complex Perturbations \(\Delta\)

+
    +
  1. +

    For complex perturbations \(\Delta\) with \(\maxsv(\Delta) \le 1\)

    +

    \begin{equation} +\tcmbox{\mu(M) = \max_{\Delta, \maxsv(\Delta) \le 1} \rho(M\Delta)} +\end{equation}

    +
  2. +
  3. +

    \(\mu(\alpha M) = \abs{\alpha} \mu(M)\) for any (complex) scalar \(\alpha\)

    +
  4. +
  5. +

    For a full block complex perturbation \(\Delta\) +\[ \mu(M) = \maxsv(M) \]

    +
  6. +
  7. +

    \(\mu\) for complex perturbations is bounded by the spectral radius and the singular value

    +

    \begin{equation} +\tcmbox{\rho(M) \le \mu(M) \le \maxsv(M)} +\end{equation}

    +
  8. +
  9. +

    Improved lower bound. +Defined \(\mathcal{U}\) as the set of all unitary matrices \(U\) with the same block diagonal structure as \(\Delta\). +Then for complex \(\Delta\)

    +

    \begin{equation} +\tcmbox{\mu(M) = \max_{U\in\mathcal{U}} \rho(MU)} +\end{equation}

    +
  10. +
  11. +

    Improved upper bound. +Defined \(\mathcal{D}\) as the set of all unitary matrices \(D\) that commute with \(\Delta\). +Then

    +

    \begin{equation} +\tcmbox{\mu(M) = \min_{D\in\mathcal{D}} \maxsv(DMD^{-1})} +\end{equation}

    +
  12. +
+

Robust Stability with Structured Uncertainty

+

Consider stability of the \(M\Delta\text{-structure}\) for the case where \(\Delta\) is a set of norm-bounded block-diagonal perturbations. +From the determinant stability condition which applies to both complex and real perturbations, we get +\[ \text{RS} \ \Leftrightarrow \ \det(I-M\Delta(j\w)) \ne 0, \ \forall\w,, \forall\Delta, , \|\Delta\|_\infty \le 1 \] +The problem is that this is only a “yes/no” condition. To find the factor \(k_m\) by which the system is robustly stable, we scale the uncertainty \(\Delta\) by \(k_m\), and look for the smallest \(k_m\) which yields “borderline instability”, namely +\[ \det(I - k_m M \Delta) = 0 \] +From the definition of \(\mu\), this value is \(k_m = 1/\mu(M)\), and we obtain the following necessary and sufficient condition for robust stability.

+
+
+

Assume that the nominal system \(M\) and the perturbations \(\Delta\) are stable. +Then the \(M\Delta\text{-system}\) is stable for all allowed perturbations with \(\maxsv(\Delta)\le 1, \ \forall\w\) if on only if

+

\begin{equation} +\mu(M(j\w)) < 1, \ \forall \omega +\end{equation}

+
+
What do \(\mu \ne 1\) and skewed-\(\mu\) mean?
+

A value of \(\mu = 1.1\) for robust stability means that all the uncertainty blocks must be decreased in magnitude by a factor 1.1 in order to guarantee stability.

+

But if we want to keep some of the uncertainty blocks fixed, how large can one particular source of uncertainty be before we get instability? +We define this value as \(1/\mu^s\), where \(\mu^s\) is called skewed-\(\mu\). We may view \(\mu^s(M)\) as a generalization of \(\mu(M)\).

+
+
+

Let \(\Delta = \diag{\Delta_1, \Delta_2}\) and assume we have fixed \(\norm{\Delta_1} \le 1\) and we want to find how large \(\Delta_2\) can be before we get instability. +The solution is to select +\[ K_m = \begin{bmatrix}I & 0 \ 0 & k_m I\end{bmatrix} \] +and look at each frequency for the smallest value of \(k_m\) which makes \(\det(I - K_m M \Delta) = 0\) and we have that skewed-\(\mu\) is +\[ \mu^s(M) \triangleq 1/k_m \]

+
+

Note that to compute skewed-\(\mu\) we must first define which part of the perturbations is to be constant.

+

Robust Performance

+

Testing RP using \(\mu\)

+

To test for RP, we first “pull out” the uncertain perturbations and rearrange the uncertain system into the \(N\Delta\text{-form}\). +Our RP-requirement, is that the \(\hinf\) norm of the transfer function \(F = F_u(N, \Delta)\) remains less than \(1\) for all allowed perturbations. +This may be tested exactly by computing \(\mu(N)\).

+
+
+

Rearrange the uncertain system into the \(N\Delta\text{-structure}\). Assume nominal stability such that \(N\) is stable. +Then

+

\begin{align*} +\text{RP} \ &\stackrel{\text{def}}{\Longleftrightarrow} \ \hnorm{F} = \hnorm{F_u(N, \Delta)} < 1, \ \forall \hnorm{\Delta} < 1 \\\
+&\Longleftrightarrow \ \mu_{\hat{\Delta}}(N(j\w)) < 1, \ \forall\w +\end{align*}

+

where \(\mu\) is computed with respect to the structure +\[ \hat{\Delta} = \begin{bmatrix}\Delta & 0 \ 0 & \Delta_P\end{bmatrix} \] +and \(\Delta_P\) is a full complex perturbation with the same dimensions as \(F^T\).

+
+

Some remarks on the theorem:

+
    +
  1. Condition \(\mu_{\hat{\Delta}}(N(j\w)) < 1, \ \forall\w\) allows us to test if \(\hnorm{F} < 1\) for all possible \(\Delta\) without having to test each \(\Delta\) individually. Essential, \(\mu\) is defined such that it directly addresses the worst case
  2. +
  3. The \(\mu\text{-condition}\) for RP involves the enlarged perturbation \(\hat{\Delta} = \diag{\Delta, \Delta_P}\). +Here \(\Delta\), which itself may be a block diagonal matrix, represents the true uncertainty, whereas \(\Delta_P\) is a full complex matrix stemming from the \(\hinf\) norm performance specification
  4. +
  5. Since \(\hat{\Delta}\) always has structure, the use of \(\hinf\) norm, \(\hnorm{N} < 1\), is generally conservative for robust performance
  6. +
+

Summary of \(\mu\text{-conditions}\) for NP, RS and RP

+
+
+

Rearrange the uncertain system into the \(N\Delta\text{-structure}\) where the block-diagonal perturbation satisfy \(\hnorm{\Delta} \le 1\). +Introduce +\[ F = F_u(N, \Delta) = N_{22} + N_{21}\Delta(I - N_{11} \Delta)^{-1} N_{12} \] +Let the performance requirement be \(\hnorm{F} \le 1\).

+

\begin{align*} +\text{NS} \ &\Leftrightarrow \ N \text{ (internally) stable} \\\
+\text{NP} \ &\Leftrightarrow \ \text{NS and } \maxsv(N_{22}) = \mu_{\Delta_P} < 1, \ \forall\w \\\
+\text{RS} \ &\Leftrightarrow \ \text{NS and } \mu_\Delta(N_{11}) < 1, \ \forall\w \\\
+\text{RP} \ &\Leftrightarrow \ \text{NS and } \mu_{\tilde{\Delta}}(N) < 1, \ \forall\w, \ \tilde{\Delta} = \begin{bmatrix}\Delta & 0 \ 0 & \Delta_P\end{bmatrix} +\end{align*}

+
+

Here \(\Delta\) is a block-diagonal matrix, whereas \(\Delta_P\) is always a full complex matrix.

+

Although the structured singular value is not a norm, it is sometimes convenient to refer to the peak \(\mu\text{-value}\) as the “\(\Delta\text{-norm}\)". +For a stable rational transfer matrix \(H(s)\), with an associated block structure \(\Delta\), we therefore define

+

\begin{equation} +\tcmbox{\left\|H(s)\right\|_\Delta \triangleq \max_{\w} \mu_\Delta (H(j\w))} +\end{equation}

+

For a nominal stable system, we then have

+

\begin{align*} +\text{NP} \ &\Leftrightarrow \ \hnorm{N_{22}} < 1 \\\
+\text{RS} \ &\Leftrightarrow \ \left\|N_{11}\right\|_\Delta < 1 \\\
+\text{RP} \ &\Leftrightarrow \ \left\|N\right\|_{\tilde{\Delta}} < 1 +\end{align*}

+

Worst-case Performance and Skewed-\(\mu\)

+

Assume we have a system for which the peak \(\mu\text{-value}\) for RP is \(1.1\). What does this mean? +The definition of \(\mu\) tells us that our RP-requirement would be satisfied exactly if we reduced both the performance requirement and the uncertainty by a factor of \(1.1\). +So \(\mu\) does not directly give us the worst-case performance \(\max_{\Delta} \maxsv(F(\Delta))\).

+

To find the worst-case weighted performance for a given uncertainty, one needs to keep the magnitude of the perturbation fixed (\(\maxsv(\Delta) \le 1\)), that is, we must compute the skewed-\(\mu\) of \(N\). +We have, in this case +\[ \max_{\maxsv(\Delta) \le 1} \maxsv(F_l(N, \Delta)(j\w)) = \mu^s (N(j\w)) \]

+

To find \(\mu^s\) numerically, we scale the performance part of \(N\) by a factor \(k_m = 1/\mu^s\) and iterate on \(k_m\) until \(\mu = 1\). +That is, at each frequency skewed-\(\mu\) is the value \(\mu^s(N)\) which solves +\[ \mu(K_mN) = 1, \quad K_m = \begin{bmatrix}I & 0 \ 0 & 1/\mu^s\end{bmatrix} \] +Note that \(\mu\) underestimate how bad or good the actual worst case performance is. This follows because \(\mu^s(N)\) is always further from 1 than \(\mu(N)\).

+

Application: RP with Input Uncertainty

+

We will now consider in some detail the case of multiplicative input uncertainty with performance defined in terms of weighted sensitivity (Fig. fig:input_uncertainty_set_feedback_weight).

+

The performance requirement is then +\[ \text{RP} \quad \stackrel{\text{def}}{\Longleftrightarrow} \quad \hnorm{w_P (I + G_p K)^{-1}} < 1, \quad \forall G_p \] +where the set of plant is given by +\[ G_p = G (I + w_I \Delta_I), \quad \hnorm{\Delta_I} \le 1 \]

+

Here \(w_p(s)\) and \(w_I(s)\) are scalar weights, so the performance objective is the same for all the outputs, and the uncertainty is the same for all the inputs.

+

In this section, we will:

+
    +
  1. Find the interconnection matrix \(N\) for this problem
  2. +
  3. Consider the SISO case, so that useful connections can be made with results for SISO systems
  4. +
  5. Consider a multivariable distillation process
  6. +
  7. Find some simple bounds on \(\mu\) and discuss the role of the condition number
  8. +
  9. Make comparisons with the case where the uncertainty is located at the output
  10. +
+

Interconnection Matrix

+

On rearranging the system into the \(N\Delta\text{-structure}\), we get

+

\begin{equation} +N = \begin{bmatrix} - w_I T_I & - w_I K S \ w_p S G & w_p S \end{bmatrix} +\end{equation}

+

where \(T_I = KG(I + KG)^{-1}\), \(S = (I + GK)^{-1}\). +For simplicity, we can omit the negative signs.

+

For a given controller \(K\) we can now test for NS, NP, RS and RP.

+

RP with Input Uncertainty for SISO System

+

For a SISO system with \(N\) as described above:

+

\begin{align*} +\text{NS} &\Leftrightarrow S,\ SG,\ KS, \text{ and } T_I \text{ are stable} \\\
+\text{NP} &\Leftrightarrow |w_P S| < 1, \quad \forall \omega \\\
+\text{RS} &\Leftrightarrow |w_I T_I| < 1, \quad \forall \omega \\\
+\text{RP} &\Leftrightarrow |w_P S| + |w_I T_I| < 1, \quad \forall \omega +\end{align*}

+

Robust performance optimization, in terms of weighted sensitivity with multiplicative uncertainty for a SISO system, thus involves minimizing the peak value of \(\mu(N) = |w_I T| + |w_P S|\). +This may be solved using DK-iteration. +A closely related problem, which is easier to solve is to minimize the peak value (\(\mathcal{H}_\infty\) norm) of the mixed sensitivity matrix: +\[ N_\text{mix} = \begin{bmatrix} w_P S \ w_I T \end{bmatrix} \]

+

At each frequency, \(\mu(N)\) differs from and \(\bar{\sigma}(N_\text{mix})\) by at most a factor \(\sqrt{2}\). +Thus, minimizing \(\| N_\text{mix} \|_\infty\) is close to optimizing robust performance in terms of \(\mu(N)\).

+

Robust Performance for \(2 \times 2\) Distillation Process

+

Consider a distillation process and a corresponding inverse-based controller: +\[ G(s) = \frac{1}{75s + 1} \begin{bmatrix} 87.8 & -86.4 \ 108.2 & -109.6 \end{bmatrix} ; \quad K(s) = \frac{0.7}{s} G(s)^{-1} \]

+

The controller provides a nominally decoupled system: +\[ L = l I,\ S = \epsilon I \text{ and } T = t I \] +where +\[ l = \frac{0.7}{s}, \ \epsilon = \frac{s}{s + 0.7}, \ t = \frac{0.7}{s + 0.7} \]

+

The following weights for uncertainty and performance are used: +\[ w_I(s) = \frac{s + 0.2}{0.5s + 1}; \quad w_P(s) = \frac{s/2 + 0.05}{s} \]

+

We now test for NS, NP, RS and RP.

+
NS
+

with \(G\) and \(K\) as defined, we find that \(S\), \(SG\), \(KS\) and \(T_I\) are stable, so the system is nominally stable.

+
NP
+

with the decoupling controller we have: +\[ \bar{\sigma}(N_{22}) = \bar{\sigma}(w_P S) = \left|\frac{s/2 + 0.05}{s + 0.7}\right| \] +and we see from Fig. fig:mu_plots_distillation that the NP-condition is satisfied.

+

+
+ Figure 32: \(\mu\text{-plots}\) for distillation process with decoupling controller
+

Figure 32: \(\mu\text{-plots}\) for distillation process with decoupling controller

+
+
+ +
RS
+

In this case \(w_I T_I = w_I T\) is a scalar times the identity matrix: +\[ \mu_{\Delta_I}(w_I T_I) = |w_I t| = \left|0.2 \frac{5s + 1}{(0.5s + 1)(1.43s + 1)}\right| \] +and we see from Fig. fig:mu_plots_distillation that RS is satisfied.

+

The peak value of \(\mu_{\Delta_I}(M)\) is \(0.53\) meaning that we may increase the uncertainty by a factor of \(1/0.53 = 1.89\) before the worst case uncertainty yields instability.

+
RP
+

Although the system has good robustness margins and excellent nominal performance, the robust performance is poor. +This is shown in Fig. fig:mu_plots_distillation where the \(\mu\text{-curve}\) for RP was computed numerically using \(\mu_{\hat{\Delta}}(N)\), with \(\hat{\Delta} = \text{diag}\{\Delta_I, \Delta_P\}\) and \(\Delta_I = \text{diag}\{\delta_1, \delta_2\}\). +The peak value is close to 6, meaning that even with 6 times less uncertainty, the weighted sensitivity will be about 6 times larger than what we require.

+

Robust Performance and the Condition Number

+

We here consider the relationship between \(\mu\) for RP and the condition number of the plant or of the controller. +We consider unstructured multiplicative uncertainty (i.e. \(\Delta_I\) is a full matrix) and performance is measured in terms of the weighted sensitivity. +With \(N\) given by \eqref{eq:n_delta_structure_clasic}, we have: +\[ \overbrace{\mu_{\tilde{\Delta}}(N)}^{\text{RP}} \le [ \overbrace{\bar{\sigma}(w_I T_I)}^{\text{RS}} + \overbrace{\bar{\sigma}(w_P S)}^{\text{NP}} ] (1 + \sqrt{k}) \] +where \(k\) is taken as the smallest value between the condition number of the plant and of the controller: +\[ k = \text{min}(\gamma(G), \gamma(K)) \]

+

We see that with a “round” controller (i.e. one with \(\gamma(K) = 1\)), there is less sensitivity to uncertainty. +On the other hand, we would expect \(\mu\) for RP to be large if we used an inverse-based controller for a plant with large condition number, since then \(\gamma(K) = \gamma(G)\) is large.

+

Comparison with Output Uncertainty

+

Consider output multiplicative uncertainty of magnitude \(w_O(j\omega)\). +In this case, we get the interconnection matrix +\[ N = \begin{bmatrix} w_O T & w_O T \ w_P S & w_P S \end{bmatrix} \] +and for any structure of the uncertainty, \(\mu(N)\) is bounded as follows: +\[ \bar{\sigma}\begin{bmatrix} w_O T \ w_P S\end{bmatrix} \le \overbrace{\mu(N)}^{\text{RP}} \le \sqrt{2}\ \bar{\sigma} \overbrace{\underbrace{\begin{bmatrix} w_O T \ w_P S \end{bmatrix}}_{\text{NP}}}^{\text{RS}} \] +This follows since the uncertainty and performance blocks both enter at the output and that the difference between bounding the combined perturbations \(\bar{\sigma}[\Delta_O \ \Delta_P]\) and the individual perturbations \(\bar{\sigma}(\Delta_O)\) and \(\bar{\sigma}(\Delta_P)\) is at most a factor \(\sqrt{2}\). +Thus, we “automatically” achieve RP if we satisfy separately NP and RS. +Multiplicative output uncertainty then poses no particular problem for performance.

+

\(\mu\text{-synthesis}\) and DK-iteration

+

The structured singular value \(\mu\) is a very powerful tool for the analysis of robust performance with a given controller. However, one may also seek to find the controller that minimizes a given \(\mu\text{-condition}\): this is the \(\mu\text{-synthesis}\) problem.

+

DK-iteration

+

At present, there is no direct method to synthesize a \(\mu\text{-optimal}\) controller. +However, for complex perturbations, a method known as DK-iteration is available. +It combines \(\hinf\) synthesis and \(\mu\text{-analysis}\) and often yields good results.

+

The starting point is the upper bound on \(\mu\) in terms of the scaled singular value

+

\begin{equation} +\mu(N) \le \min_{D \in \mathcal{D}} \maxsv(D N D^{-1}) +\end{equation}

+

The idea is to find the controller that minimizes the peak value over frequency of this upper bound, namely

+

\begin{equation} +\min_{K} \left( \min_{D \in \mathcal{D}} \hnorm{D N(K) D^{-1} } \right) +\end{equation}

+

by alternating between minimizing \(\hnorm{DN(K)D^{-1}}\) with respect to either \(K\) or \(D\) (while holding the other fixed).

+

To start the iterations, one selects an initial stable rational transfer matrix \(D(s)\) with appropriate structure. +The identity matrix is often a good initial choice for \(D\) provided the system has been reasonably scaled for performance.

+
+
+
    +
  1. K-step. Synthesize an \(\hinf\) controller for the scaled problem, \(\min_{K} \hnorm{DN(K)D^{-1}}\) with fixed \(D(s)\)
  2. +
  3. D-step. Find \(D(j\w)\) to minimize at each frequency \(\maxsv(DND^{-1}(j\w))\) with fixed \(N\)
  4. +
  5. Fit the magnitude of each element of \(D(j\w)\) to a stable and minimum phase transfer function \(D(s)\) and go to step 1
  6. +
+
+

The iteration may continue until satisfactory performance is achieve, \(\hnorm{DND^{-1}} < 1\) or until the \(\hinf\) norm no longer decreases. +One fundamental problem with this approach is that although each of the minimization steps are convex, joint convexity is not guaranteed. +Therefore, the iterations may converge to a local minimum.

+

The order of the controller resulting from each iteration is equal to the number of the states in the plant \(G(s)\) plus the number of states in the weights plus twice the number of state in \(D(s)\). +The obtain \(\mu\text{-optimal}\) controller will usually be of high order and will have a flat \(\mu\text{-curve}\) until some high frequency.

+

The DK-iteration depends heavily on optimal solutions for steps 1 and 2, and also on good fits in step 3. +We usually prefers to have a low-order fit in step 3 as it will reduces the order of the \(\hinf\) problem which usually improves the numerical properties of the optimization. +In some cases, the iterations converge slowly, the \(\mu\text{-value}\) can even increase. This may be caused by numerical problems and one may consider going back to the initial problem and rescaling the inputs and outputs.

+

Adjusting the Performance Weight

+

If \(\mu\) at a given frequency is different from 1, then the interpretation is that at this frequency we can tolerate \(1/\mu\) times more uncertainty and still satisfy our performance objective with a margin of \(1/\mu\). +In \(\mu\text{-synthesis}\), the designer will usually adjust some parameter in the performance or uncertainty weights until the weight of the peak \(\mu\text{-value}\) is close to 1.

+

Sometimes, uncertainty is fixed and we effectively optimize worst-cast performance by adjusting a parameter in the performance weight. +Consider the performance weight +\[ w_p(s) = \frac{s/M + \w_B^*}{s + \w_B^* A} \] +where we want to keep \(M\) constant and find the high achievable bandwidth frequency \(\w_B^*\). +The optimization problem becomes +\[ \text{max} \abs{\w_B^*} \quad \text{such that} \quad \mu(N) < 1, \ \forall\w \] +where \(N\), the interconnection matrix for the RP-problem, depends on \(\w_B^*\). This may be implemented as an outer loop around the DK-iteration.

+

Fixed Structure Controller

+

Sometimes it is desirable to find a low-order controller with a given structure. +This may be achievable by numerical optimization where \(\mu\) is minimized with respect to the controller parameters. +This problem here is that the optimization is not generally convex in the parameters. +Sometimes it helps to switch the optimization between minimizing the peak of \(\mu\) and minimizing the integral square deviation of \(\mu\) away from \(k\) (i.e. \(\normtwo{\mu(j\w) - k}\)) where \(k\) is usually close to 1. +The latter is an attempt to “flatten out” \(\mu\).

+

Example: \(\mu\text{-synthesis}\) with DK-iteration

+

For simplicity, we will consider again the case of multiplicative uncertainty and performance defined in terms of weighted sensitivity. +The uncertainty weight \(w_I I\) and performance weight \(w_P I\) are shown graphically in Fig. fig:weights_distillation.

+

+
+ Figure 33: Uncertainty and performance weights
+

Figure 33: Uncertainty and performance weights

+
+
+ +

The objective is to minimize the peak value of \(\mu_{\tilde{\Delta}}(N)\), \(\tilde{\Delta} = \text{diag}\{\Delta_I, \Delta_P\}\). +\(\Delta_I\) is a diagonal \(2 \times 2\) matrix representing the diagonal input uncertainty and \(\Delta_P\) is a full \(2 \times 2\) matrix representing the performance specifications.

+

First, the generalized plant \(P\) is constructed which includes the plant model, the uncertainty weight and the performance weight. +Then the block structure is defined, it consists of two \(1 \times 1\) blocks to represent \(\Delta_I\) and a \(2 \times 2\) block to represent \(\Delta_P\). +The scaling matrix \(D\) for \(DND^{-1}\) then has the structure \(D = \text{diag}\{d_1, d_2, d_3I_2\}\). We select \(d_3 = 1\) and as initial scalings we select \(d_1^0 = d_2^0 = 1\). +\(P\) is then scaled with the matrix \(\text{diag}\{D, I_2\}\) where \(I_2\) is associated with the inputs and outputs from the controller (we do not want to scale the controller).

+
    +
  • Iteration No. 1. +Step 1: with the initial scalings, the \(\mathcal{H}_\infty\) synthesis produced a 6 state controller (2 states from the plant model and 2 from each of the weights). +Step 2: the upper \(\mu\text{-bound}\) is shown in Fig. fig:dk_iter_mu. +Step 3: the frequency dependent \(d_1(\omega)\) and \(d_2(\omega)\) from step 2 are fitted using a 4th order transfer function shown in Fig. fig:dk_iter_d_scale
  • +
  • Iteration No. 2. +Step 1: with the 8 state scalings \(D^1(s)\), the \(\mathcal{H}_\infty\) synthesis gives a 22 state controller. +Step 2: This controller gives a peak value of \(\mu\) of \(1.02\). +Step 3: the scalings are only slightly changed
  • +
  • Iteration No. 3. +Step 1: The \(\mathcal{H}_\infty\) norm is only slightly reduced. We thus decide the stop the iterations.
  • +
+

+
+ Figure 34: Change in \(\mu\) during DK-iteration
+

Figure 34: Change in \(\mu\) during DK-iteration

+
+
+ +

+
+ Figure 35: Change in D-scale \(d_1\) during DK-iteration
+

Figure 35: Change in D-scale \(d_1\) during DK-iteration

+
+
+ +

The final \(\mu\text{-curves}\) for NP, RS and RP with the controller \(K_3\) are shown in Fig. fig:mu_plot_optimal_k3. +The objectives of RS and NP are easily satisfied. +The peak value of \(\mu\) is just slightly over 1, so the performance specification \(\bar{\sigma}(w_P S_p) < 1\) is almost satisfied for all possible plants.

+

+
+ Figure 36: (mutext{-plots}) with (mu) &ldquo;optimal&rdquo; controller (K_3)
+

Figure 36: (mutext{-plots}) with (mu) “optimal” controller (K_3)

+
+
+ +

To confirm that, 6 perturbed plants are used to compute the perturbed sensitivity functions shown in Fig. fig:perturb_s_k3.

+

+
+ Figure 37: Perturbed sensitivity functions (bar{sigma}(S^prime)) using (mu) &ldquo;optimal&rdquo; controller (K_3). Lower solid line: nominal plant. Upper solid line: worst-case plant
+

Figure 37: Perturbed sensitivity functions (bar{sigma}(S^prime)) using (mu) “optimal” controller (K_3). Lower solid line: nominal plant. Upper solid line: worst-case plant

+
+
+ +

Further Remarks on \(\mu\)

+

For complex perturbations, the scaled singular value \(\maxsv(DND^{-1})\) is a tight upper bound on \(\mu(N)\) in most cases, and minimizing the upper bound \(\hnorm{DND^{-1}}\) form the basis for the DK-iteration.

+

The use of constant D-scales (\(D\) is not allowed to vary with frequency), provides a necessary and sufficient condition for robustness to arbitrary fast time varying linear uncertainty. While such perturbations are unlikely in a practical situation, we know that this controller will work very well even for rapid changes in the plant. Moreover, the use of constant D-scales make the computation of \(\mu\) straightforward and solvable using LMIs.

+

Conclusion

+

We have discussed how to represent uncertainty and how to analyze its effect on stability (RS) and performance (RP) using the structured singular value \(\mu\).

+

To analyze robust stability of an uncertain system, we make use of the \(M\Delta\text{-structure}\) where \(M\) represents the transfer function for the “new” feedback part generated by the uncertainty. +From the small gain theorem +\[ \tcmbox{RS \quad \Leftarrow \quad \maxsv(M) < 1, \ \forall\w} \] +which is tight (necessary and sufficient) for the special case where at each frequency any complex \(\Delta\) satisfying \(\maxsv(\Delta) \le 1\) is allowed. +More generally, the tight condition is +\[ \tcmbox{RP \quad \Leftrightarrow \quad \mu(M) < 1, \ \forall\w} \] +where \(\mu(M)\) is the structured singular value. The calculation of \(\mu\) makes use of the fact that \(\Delta\) has a given block-diagonal structure, where certain blocks may also be real (e.g. to handle parametric uncertainty).

+

We defined robust performance as \(\hnorm{F_l(N, \Delta)} < 1\) for all allowed \(\Delta\). +Since we used the \(\hinf\) norm in both the representation of uncertainty and the definition of performance, we found that RP could be viewed as a special case of RS, and we derived +\[ \tcmbox{RS \quad \Leftrightarrow \quad \mu(N) < 1, \ \forall\w} \] +where \(\mu\) is computed with respect to the block-diagonal structure \(\diag{\Delta, \Delta_P}\). +Here \(\Delta\) represents the uncertainty and \(\Delta_P\) is a fictitious full uncertainty block representing the \(\hinf\) performance bound.

+

There are two main approaches to getting a robust design:

+
    +
  1. We aim to make the system robust to some “general” class of uncertainty which we do not explicitly model. +For SISO systems, the classical gain and phase margins and the peaks of \(S\) and \(T\) provide useful robustness measures. +For MIMO systems, normalized coprime factor uncertainty provides a good general class of uncertainty, and the associated Glover-McFlarlane \(\hinf\) loop-shaping design procedure has proved itself very useful in applications
  2. +
  3. We explicitly model and quantify the uncertainty in the plant and aim to make the system robust to this specific uncertainty. +Potentially, it yields better designs, but it may require a much larger effort in terms of uncertainty modelling, especially if parametric uncertainty is consider. +Analysis and in particular, synthesis using \(\mu\) can be very involved
  4. +
+

In applications, it is therefore recommended to start with the first approach, at least for design. +The robust stability and performance is then analyzed in simulations and using the structured singular value, for example, by considering first simple sources of uncertainty such as multiplicative input uncertainty. +One then iterates between design and analysis until a satisfactory solution is obtained. +If resulting control performance is not satisfactory, one may switch to the second approach.

+
Practical \(\mu\text{-synthesis}\) in practice:
+
    +
  1. Because of the effort involved in deriving detailed uncertainty descriptions, and the subsequent complexity in synthesizing controllers, the rule is to start simple with a crude uncertainty description, and then to see whether the performance specifications can be met. Only if they can’t, one should consider more detailed uncertainty descriptions such as parametric uncertainty
  2. +
  3. The use of \(\mu\) implies a worst-case analysis, so one should be careful about including too many sources of uncertainty, noise and disturbances - otherwise it becomes very unlikely for the worst case to occur, and the resulting analysis and design may be unnecessarily conservative
  4. +
  5. There is always uncertainty with respect to the inputs and outputs, so it is generally sage to include diagonal input and output uncertainty. The relative multiplicative form is very convenient in this case
  6. +
  7. \(\mu\) is most commonly used for analysis. If \(\mu\) is used for synthesis, then we recommend that you keep the uncertainty fixed and adjust the parameters in the performance weight until \(\mu\) is close to 1
  8. +
+

Controller Design

+

+

Trade-offs in MIMO Feedback Design

+

The shaping of multivariable transfer functions is based on the idea that a satisfactory definition of gain for a matrix transfer function is given by the singular values. +By multivariable transfer function shaping, therefore, we mean the shaping of the singular values of appropriate specified transfer functions such as the loop transfer function of one or more closed-loop transfer functions.

+

The classical loop-shaping ideas can be further generalized to MIMO systems by considering the singular values.

+

Consider the one degree-of-freedom system as shown in Fig. fig:classical_feedback_small. +We have the following important relationships:

+

\begin{subequations} +\begin{align} +y(s) &= T(s) r(s) + S(s) d(s) - T(s) n(s) \\\
+u(s) &= K(s) S(s) \big(r(s) - n(s) - d(s) \big) +\end{align} +\end{subequations}

+

+
+ Figure 38: One degree-of-freedom feedback configuration
+

Figure 38: One degree-of-freedom feedback configuration

+
+
+ +
+
+
    +
  1. For disturbance rejection make \(\maxsv(S)\) small
  2. +
  3. For noise attenuation make \(\maxsv(T)\) small
  4. +
  5. For reference tracking make \(\maxsv(T) \approx \minsv(T) \approx 1\)
  6. +
  7. For control energy reduction make \(\maxsv(KS)\) small
  8. +
  9. For robust stability in presence of an additive perturbation (\(G_p = G + \Delta\)) make \(\maxsv(KS)\) small
  10. +
  11. For robust stability in presence of a multiplicative output perturbation (\(G_p = (I + \Delta) G\)) make \(\maxsv(T)\) small
  12. +
+
+

The closed-loop requirements cannot all be satisfied simultaneously. +Feedback design is therefore a trade-off over frequency of conflicting objectives. +This is not always as difficult as it sounds because the frequency range over which the objectives are important can be quite different.

+

In classical loop shaping, it is the magnitude of the open-loop transfer function \(L = GK\) which is shaped, whereas the above requirements are all in terms of closed-loop transfer functions. +However, we have that +\[ \minsv(L) - 1 \le \frac{1}{\maxsv(S)} \le \minsv(L) + 1 \] +from which we see that \(\maxsv(S) \approx 1/\minsv(L)\) at frequencies where \(\minsv(L)\) is much larger than \(1\). +Furthermore, from \(T = L(I+L)^{-1}\) it follows that \(\maxsv(T) \approx \maxsv(L)\) at frequencies where \(\maxsv(L)\) is much smaller than \(1\).

+

Thus, over specified frequency ranges, it is relatively easy to approximate the closed-loop requirements by open-loop objectives.

+
+
+
    +
  1. For disturbance rejection make \(\minsv(GK)\) large
  2. +
  3. For noise attenuation make \(\maxsv(GK)\) small
  4. +
  5. For reference tracking make \(\minsv(GK)\) large
  6. +
  7. For control energy reduction make \(\maxsv(K)\) small
  8. +
  9. For robust stability in presence of an additive perturbation make \(\maxsv(K)\) small
  10. +
  11. For robust stability in presence of an multiplicative output perturbation make \(\maxsv(GK)\) small
  12. +
+
+

Typically, the open-loop requirements 1 and 3 are valid and important at low frequencies \(0 \le \omega \le \omega_l \le \omega_B\), while conditions 2, 4, 5 and 6 are conditions which are valid and important at high frequencies \(\omega_B \le \omega_h \le \omega \le \infty\), as illustrated in Fig. fig:design_trade_off_mimo_gk.

+

+
+ Figure 39: Design trade-offs for the multivariable loop transfer function \(GK\)
+

Figure 39: Design trade-offs for the multivariable loop transfer function \(GK\)

+
+
+ +

The control engineer must design \(K\) such that \(\minsv(GK)\) lies above a performance boundary for all \(\omega\) up to \(\omega_l\), and such that \(\maxsv(GK)\) lies below a robustness boundary for all \(\omega\) above \(\omega_h\).

+

Shaping the singular values of \(GK\) by selecting \(K\) is relatively easy task, but to do this in a way which also guarantees closed-loop stability is in general difficult as closed-loop stability cannot be determined from open-loop singular values.

+

For SISO systems, closed-loop stability is closely related to the open-loop roll-off rate from high to low gain at the crossover (which is in practice less than \(\SI{40}{\decibel\per dec}\)). +An immediate consequence of this is that there is a lower limit to the difference between \(\omega_h\) and \(\omega_l\).

+

For MIMO systems, a similar gain/phase relationship holds in the crossover frequency region, but this is in terms of roll-off rate of the magnitude of the eigenvalues of \(GK\) and not the singular values. +The stability constraint is therefore more difficult to handle.

+

LQG Control

+

LQG control was developed and successfully applied for aerospace problems where accurate plants are available. +For other control problems, it was not easy, and the assumption of white noise disturbance is not always relevant. +As a result, LQG designs were sometimes not robust enough to be used in practice.

+

It is assumed that the plant dynamics are linear and known, and that the measurement noise and disturbance signals are stochastic with known statistical properties:

+

\begin{align*} +\dot{x} &= A x + B u + w_d \\\
+y &= C x + D u + w_n +\end{align*}

+

with \(w_d\) and \(w_n\) are the disturbance and measurement noise which are assumed to be uncorrelated zero-mean Gaussian stochastic processes with constant power spectral density matrices \(W\) and \(V\) respectively.

+
+
+

The LQG control problem is to find the optimal control \(u(t)\) that minimize: +\[J = E \bigg\{ \lim_{T\rightarrow \infty} \frac{1}{T} \int_0^T \big[ x^T Q x + u^T R u \big] dt \bigg\} \] +Where \(Q\) and \(R\) are appropriately chosen constant weighting matrices (design parameters) such that \(Q = Q^T \ge 0\) and \(R = R^T > 0\).

+
+

The solution to the LQG problem, known as the Separation Theorem, is separated into two problems.

+

It consists of first determining the optimal control to a deterministic LQR problem (LQG without \(w_d\) and \(w_n\)). +The solution to this problem is a state feedback law

+

\begin{equation} +\tcmbox{u(t) = -K_r x(t)} +\end{equation}

+

where \(K_r\) is a constant matrix that can be easily computed.

+

The next step is to find an optimal estimate \(\hat{x}\) of the state \(x\) so that \(E \big\{ [x-\hat{x}]^T [x-\hat{x}] \big\}\) is minimized. +The optimal state estimate is given by a Kalman filter.

+

The solution to the LQG problem is then found by replacing \(x\) by \(\hat{x}\) to give \(u(t) = -K_r \hat{x}\).

+

We therefore see that the LQG problem and its solution can be separated into two distinct parts as illustrated in Fig. fig:lqg_separation: the optimal state feedback and the optimal state estimator (the Kalman filter).

+

+
+ Figure 40: The separation theorem
+

Figure 40: The separation theorem

+
+
+ +
+
+

The LQR problem, where all the states are known is to find the input signal \(u(t)\) that takes the system \(\dot{x} = Ax+Bu\) to the zero state (\(x=0\)) by minimizing the deterministic cost

+

\begin{equation} +J_r = \int_0^\infty \big( x(t)^T Q x(t) + u(t)^T R u(t) \big) dt +\end{equation}

+

The optimal solution is \(u=-K_r x(t)\) with

+

\begin{equation} +K_r = R^{-1} B^T X +\end{equation}

+

and \(X\) is the unique positive-semi definite solution of the algebraic Riccati equation:

+

\begin{equation} +A^T X + X A - XBR^{-1}B^TX + Q = 0 +\end{equation}

+
+
+
+

The Kalman filter has the structure of an ordinary state-estimator, as shown on Fig. fig:lqg_kalman_filter, with:

+

\begin{equation} +\dot{\hat{x}} = A\hat{x} + Bu + K_f(y-C\hat{x}) +\end{equation}

+

The optimal choice of \(K_f\), which minimize \(E \big\{ [x-\hat{x}]^T [x-\hat{x}] \big\}\) is given by

+

\begin{equation} +K_f = Y C^T V^{-1} +\end{equation}

+

Where \(Y\) is the unique positive-semi definite solution of the algebraic Riccati equation

+

\begin{equation} +YA^T + AY - YC^TV^{-1}CY + W = 0 +\end{equation}

+
+

+
+ Figure 41: The LQG controller and noisy plant
+

Figure 41: The LQG controller and noisy plant

+
+
+ +

The structure of the LQG controller is illustrated in Fig. fig:lqg_kalman_filter, its transfer function from \(y\) to \(u\) is given by

+

\begin{align*} +L_{\text{LQG}}(s) &= \left[ \begin{array}{c|c} +A - B K_r - K_f C & K_f \ \hline +-K_r & 0 +\end{array} \right] \\\
+&= \left[ \begin{array}{c|c} +A - B R^{-1} B^T X - Y C^T V^{-1} C & Y C^T V^{-1} \ \hline +-R^{-1} B^T X & 0 +\end{array} \right] +\end{align*}

+

It has the same degree (number of poles) as the plant.

+

For the LQG-controller, as shown on Fig. fig:lqg_kalman_filter, it is not easy to see where to position the reference input \(r\) and how integral action may be included, if desired. Indeed, the standard LQG design procedure does not give a controller with integral action. One strategy is illustrated in Fig. fig:lqg_integral. Here, the control error \(r-y\) is integrated and the regulator \(K_r\) is designed for the plant augmented with these integral states.

+

+
+ Figure 42: LQG controller with integral action and reference input
+

Figure 42: LQG controller with integral action and reference input

+
+
+ +

For an LQG-controller system with a combined Kalman filter and LQR control law, there are no guaranteed stability margins, and there exist LQG combinations with arbitrary small gain margins. +However, there are procedures for improving robustness properties of LQG control such as Loop Transfer Recovery (LTR).

+

These procedure are somehow difficult to use in practice. +Their main limitation is that they can only be applied to minimum phase plants.

+

\(\htwo\) and \(\hinf\) Control

+

+

General Control Problem Formulation

+

+There are many ways in which feedback design problems can be cast as \(\htwo\) and \(\hinf\) optimization problems. +It is very useful therefore to have a standard problem formulation into which any particular problem may be manipulated.

+

Such a general formulation is afforded by the general configuration shown in Fig. fig:general_control.

+

+
+ Figure 43: General control configuration
+

Figure 43: General control configuration

+
+
+ +

The system is described by

+

\begin{subequations} +\begin{align} +\colvec{z\v} &= P(s) \colvec{w\u} = \begin{bmatrix}P_{11}(s) & P_{12}(s)\ P_{21}(s) & P_{22}(s) \end{bmatrix} \colvec{w\u}\\\
+u &= K(s) v +\end{align} +\end{subequations}

+

With a state space realization of the generalized plant \(P\) given by

+

\begin{equation} +P = \left[ +\begin{array}{c|cc} +A & B_1 & B_2 \\\
+\hline +C_1 & D_{11} & D_{12} \\\
+C_2 & D_{21} & D_{22} +\end{array} +\right] +\end{equation}

+

The closed loop transfer function from \(w\) to \(z\) is given by the linear fractional transformation:

+

\begin{align*} +z &= F_l(P, K) w \\\
+&= [P_{11} + P_{12}K(I-P_{22}K)^{-1} P_{21}] w +\end{align*}

+

\(\htwo\) and \(\hinf\) control involve the minimization of the \(\htwo\) and \(\hinf\) norms of \(F_l(P, K)\).

+

The most general and widely used algorithms for \(\htwo\) and \(\hinf\) control problems are based on the state space formulation and requires the solution of two Riccati equations.

+

The following assumptions are typically made in \(\htwo\) and \(\hinf\) problems:

+
    +
  1. \((A, B_2, C_2)\) is stabilizable and detectable. +This is required for the existence of stabilizing controllers
  2. +
  3. \(D_{12}\) and \(D_{21}\) have full rank. +This is sufficient to ensure that the controllers are proper
  4. +
  5. \(\begin{bmatrix} A-j\w I & B_2 \ C_1 & D_{12} \end{bmatrix}\) and \(\begin{bmatrix} A-j\w I & B_1 \ C_2 & D_{21} \end{bmatrix}\) have respectively full column and full row rank for all \(\w\). +This ensures that the controller does not cancel poles or zeros in the imaginary axis which would result in closed-loop instability
  6. +
  7. \(D_{11} = 0\) and \(D_{22} = 0\) is a conventional requirement for \(\htwo\) control. +This is not required for \(\hinf\) control but this significantly simplify algorithm formulas
  8. +
  9. \(D_{12}^T C_1 = 0\) and \(B_1 D_{12}^T = 0\) is common in \(\htwo\) control. +\(D_{12}^T C_1 = 0\) means that there is no cross terms in the cost function and \(B_1 D_{12}^T = 0\) that the process noise and measurement noise are uncorrelated
  10. +
  11. \((A, B_1)\) is stabilizable and \((A, C_1)\) is detectable
  12. +
+

If the Matlab Robust Control Toolbox complains, then it probably means that the control problem is not well formulated and that some assumptions are not met.

+

\(\hinf\) algorithms, in general, find a sub-optimal controller. That is, for a specified \(\gamma\) a stabilizing controller is found for which \(\hnorm{F_l(P,K)}<\gamma\). +This contrasts with \(\htwo\) theory, in which the optimal controller is unique and can be found from the solution of two Riccati equations.

+

\(\htwo\) Optimal Control

+
+
+

The standard \(\htwo\) optimal control problem is to find a stabilizing controller \(K\) which minimizes +\[\normtwo{F(s)} = \sqrt{\frac{1}{2\pi}\int_{-\infty}^{\infty} tr[F(j\w)F(j\w)^H]d\w }\] +With \(F = F_l(P, K)\).

+
+

For a particular problem, the generalized plant \(P\) will include the plant model, the interconnection structure, and the designer specified weighting functions.

+

The \(\htwo\) norm can be given different deterministic interpretations. +It also has the following stochastic interpretation.

+

Suppose in the general control configuration that the exogenous input \(w\) is white noise of unit density. That is +\[ E\{w(t)w(\tau)^T\} = I \delta(t-\tau) \]

+

Expected power in the error signal \(z\) is then given by

+

\begin{align*} +P_z &= E\bigg\{ \lim_{T\rightarrow\infty} \frac{1}{2T} \int_{-T}^{T} z(t)^T z(t) dt \bigg\} \\\
+&= \text{tr}\ E\{z(t)z(t)^H\}\\\
+&= \frac{1}{2\pi} \int_{-\infty}^{\infty}\text{tr}\left[F(j\omega)F(j\omega)^H\right]d\omega\\\
+&= \normtwo{F}^2 = \normtwo{F_l(P,K)}^2 +\end{align*}

+
+
+

Thus, by minimizing the \(\htwo\) norm, the error power of the generalized system, due to a unit intensity white noise input, is minimized. +We are minimizing the Root Mean Square value of \(z\).

+
+

LQG: a Special \(\htwo\) Optimal Controller

+

An important special case of \(\htwo\) optimal control is the LQG problem. +For the stochastic system

+

\begin{align*} +\dot{x} &= A x + B u + w_d \\\
+y &= Cx + w_n +\end{align*}

+

where +\[ E \left\{ \begin{bmatrix} w_d(t)\w_n(t) \end{bmatrix} \begin{bmatrix} w_d(\tau)^T & w_n(\tau)^T \end{bmatrix} \right\} = \begin{bmatrix} W & 0 \ 0 & V \end{bmatrix} \delta (t - \tau) \]

+

The LQG problem is to find \(u = K(s) y\) such that +\[ J = E \left\{ \lim_{T\to \infty} \frac{1}{T} \int_0^T [x^T Q x + u^T R u] dt \right\} \] +is minimized with \(Q = Q^T \ge 0\) and \(R = R^T > 0\).

+

This problem can be cast as an \(\htwo\) optimization in the general framework in the following manner.

+

Define the error signal \(z\) as +\[ z = \begin{bmatrix} +Q^{\frac{1}{2}} & 0 \\\
+0 & R^{\frac{1}{2}} +\end{bmatrix} \begin{bmatrix} +x \ u +\end{bmatrix} \]

+

Represent the stochastic inputs as +\[ \begin{bmatrix} +w_d \ w_n +\end{bmatrix} = \begin{bmatrix} +W^{\frac{1}{2}} & 0 \\\
+0 & V^{\frac{1}{2}} +\end{bmatrix} w \] +where \(w\) is a white noise process of unit density.

+

Then the LQG cost function is +\[ K = E \left\{ \lim_{T\to \infty} \frac{1}{T} \int_0^T z(t)^T z(t) dt \right\} = \normtwo{F_l(P,K)}^2 \]

+

\(\hinf\) Optimal Control

+

With reference to the general control configuration on Fig. fig:general_control, the standard \(\hinf\) optimal control problem is to find all stabilizing controllers \(K\) which minimize +\[ \hnorm{F_l(P, K)} = \max_{\omega} \maxsv\big(F_l(P, K)(j\omega)\big) \]

+

The \(\hinf\) norm has several interpretations in terms of performance. +One is that it minimizes the peak of the maximum singular value of \(F_l(P(j\omega), K(j\omega))\).

+

It also has a time domain interpretation as the worst-cast 2-norm:

+

\begin{equation} +\hnorm{F_l(P,K)} = \max_{w(t)\ne0} \frac{\normtwo{z(t)}}{\normtwo{w(t)}} +\end{equation}

+

where \(\normtwo{z(t)} = \sqrt{\int_0^\infty \sum_i \abs{z_i}^2 dt}\) is the 2-norm of the vector signal.

+

In practice, it is usually not necessary to obtain an optimal controller for the \(\hinf\) problem, and it is simpler to design a sub-optimal one.

+

Let \(\gamma_\text{min}\) be the minimum value of \(\hnorm{F_l(P,K)}\) over all stabilizing controllers \(K\). +Then the \(\hinf\) sub-optimal control problem is: given a \(\gamma > \gamma_\text{min}\), find all stabilizing controllers \(K\) such that

+

\begin{equation} +\hnorm{F_l(P, K)} < \gamma +\end{equation}

+

By reducing \(\gamma\) in an iterative way, an optimal solution is approached.

+

General \(\hinf\) algorithm. +For the general control configuration and with assumptions described above, there exists a stabilizing controller \(K(s)\) such that \(\hnorm{F_l(P,K)}<\gamma\) if and only if

+
    +
  1. \(X_\infty \ge 0\) is a solution to the algebraic Riccati equation \(A^T X_\infty + X_\infty A + C_1^T C_1 + X_\infty (\gamma^{-2} B_1 B_1^T - B_2 B_2^T)X_\infty = 0\) such that \(\text{Re } \lambda_i \left[ A + (\gamma^{-2}B_1B_1^T - B_2B_2^T)X_\infty \right] < 0, \ \forall i\)
  2. +
  3. \(Y_\infty \ge 0\) is a solution to the algebraic Riccati equation \(A Y_\infty + Y_\infty A^T + B_1 B_1^T + Y_\infty (\gamma^{-2} C_1^T C_1 - C_2^T C_2)Y_\infty = 0\) such that \(\text{Re } \lambda_i \left[ A + Y_\infty(\gamma^{-2}C_1^TC_1 - C_2^TC_2)Y_\infty \right] < 0, \ \forall i\)
  4. +
  5. \(\rho(X_\infty Y_\infty) < \gamma^2\)
  6. +
+

All such controllers are then given by \(K = F_l(K_c, Q)\) where

+

\begin{align*} +K_c(s) &= \left[ \begin{array}{c|cc} +A_\infty & -Z_\infty L_\infty & Z_\infty B_2 \ \hline +F_\infty & 0 & I \\\
+-C_2 & I & 0 +\end{array} \right], \ L_\infty = -Y_\infty C_2^T \\\
+F_\infty &= -B_2^T X_\infty, \ Z_\infty = (I - \gamma^2 Y_\infty X_\infty)^{-1} \\\
+A_\infty &= A + \gamma^{-2} B_1 B_1^T X_\infty + B_2F_\infty + Z_\infty L_\infty C_2 +\end{align*}

+

and \(Q(s)\) is any stable proper transfer function such that \(\hnorm{Q} < \gamma\).

+

For \(Q(s) = 0\), we get

+

\begin{equation} +K(s) = K_{c11}(s) = -Z_\infty L_\infty (s I - A_\infty)^{-1} F_\infty +\end{equation}

+

This is called the central controller and has the same number of states as the generalized plant \(P(s)\).

+

The central controller can be separated into a state estimator (observer) of the form +\[ \dot{\hat{x}} = A\hat{x} + B_1 \gamma^{-2} B_1^T X_\infty \hat{x} + B_2 u + Z_\infty L_\infty (C_2 \hat{x} - y) \] +and a state feedback \(u = F_\infty \hat{x}\).

+
+
+

If we desire a controller that achieves \(\gamma_\text{min}\), to within specified tolerance, then we can perform a bisection on \(\gamma\) until its value is sufficiently accurate. +The above conditions provide a test for each value of \(\gamma\) to determine if \(\gamma<\gamma_\text{min}\) or \(\gamma>\gamma_\text{min}\).

+
+

There are mainly two methodologies for \(\hinf\) controller design: the transfer function shaping approach and the signal-based approach.

+

In the shaping approach, \(\hinf\) optimization is used to shape the singular values of specified transfer functions over frequency. +The maximum singular values are relatively easy to shape by forcing them to lie below user defined bounds, thereby ensuring desirable bandwidth and roll-off rates.

+

In the signal-based approach, we seek to minimize the energy in certain error signal given a set of exogenous input signals.

+

A difficulty that sometimes arises with \(\hinf\) control is the selection of weights such that the \(\hinf\) optimal controller provides a good trade-off between conflicting objectives in various frequency ranges. +Thus, for practical designs it is sometimes recommended to perform only a few iterations of the \(\hinf\) algorithm. +The justification for this is that the initial design, after one iteration, is similar to an \(\htwo\) design which does trade-off over various frequency ranges. +Therefore stopping the iterations before the optimal value is achieved gives the design an \(\htwo\) flavor which may be desirable.

+

Mixed-Sensitivity \(\hinf\) Control

+

Mixed-sensitivity is the name given to transfer function shaping problems in which the sensitivity function \(S = (I + GK)^{-1}\) is shaped along with one or more other closed-loop transfer functions such as \(KS\) or \(T = I - S\).

+

Suppose that we have a regulation problem in which we want to reject a disturbance \(d\) entering at the plant output and it is assumed that the measurement noise is relatively insignificant. +It makes sense to shape the closed-loop transfer functions \(S\) and \(KS\). +Recall that \(S\) is the transfer function between \(d\) and the output, and \(KS\) the transfer function from \(d\) and the control signal. +It is important to include \(KS\) as a mechanism for limiting the size and bandwidth of the controller, and hence the energy used. +The size of \(KS\) is also important for robust stability with respect to uncertainty modeled as additive plant perturbations.

+

The disturbance \(d\) is typically a low frequency signal, and therefore it will be successfully rejected if the maximum singular value of \(S\) is made small over the same low frequency range. +To do this, we could select a scalar low pass filter \(w_1(s)\) with a bandwidth equal to that of the disturbance, and then find a stabilizing controller that minimizes \(\hnorm{w_1 S}\). +This cost function alone is not very practical, it focuses on just one closed-loop transfer function and the controller may have infinite gain. +It is far more useful in practice to minimize

+

\begin{equation} +\hnorm{\begin{matrix} w_1 S \ w_2 KS \end{matrix}} +\end{equation}

+

where \(w_2(s)\) is a scalar high pass filter with a crossover frequency approximately equal to that of the desired closed-loop bandwidth.

+

In general, the scalar weighting functions \(w_1(s)\) and \(w_2(s)\) can be replaced by matrices \(W_1(s)\) and \(W_2(s)\). +This can be useful for systems with channels of quite different bandwidths. +In that case, diagonal weights are recommended as anything more complicated is usually not worth the effort.

+

To see how this mixed sensitivity problem can be formulated in the general setting, we can imagine the disturbance \(d\) as a single exogenous input and define and error signal \(z = [z_1^T\ z_2^T]^T\), where \(z_1 = W_1 y\) and \(z_2 = -W_2 u\) as illustrated in Fig. fig:mixed_sensitivity_dist_rejection. +We can then see that \(z_1 = W_1 S w\) and \(z_2 = W_2 KS w\) as required. +The elements of the generalized plant are

+

\begin{equation*} +\begin{array}{ll} +P_{11} = \begin{bmatrix}W_1\0\end{bmatrix} & P_{12} = \begin{bmatrix}W_1G\-W_2\end{bmatrix} \\\
+P_{21} = -I & P_{22} = -G +\end{array} +\end{equation*}

+

+
+ Figure 44: \(S/KS\) mixed-sensitivity optimization in standard form (regulation)
+

Figure 44: \(S/KS\) mixed-sensitivity optimization in standard form (regulation)

+
+
+ +

Another interpretation can be put on the \(S/KS\) mixed-sensitivity optimization as shown in the standard control configuration of Fig. fig:mixed_sensitivity_ref_tracking. +Here we consider a tracking problem. +The exogenous input is a reference command \(r\), and the error signals are \(z_1 = -W_1 e = W_1 (r-y)\) and \(z_2 = W_2 u\). +As the regulation problem of Fig. fig:mixed_sensitivity_dist_rejection, we have that \(z_1 = W_1 S w\) and \(z_2 = W_2 KS w\).

+

+
+ Figure 45: \(S/KS\) mixed-sensitivity optimization in standard form (tracking)
+

Figure 45: \(S/KS\) mixed-sensitivity optimization in standard form (tracking)

+
+
+ +

Another useful mixed sensitivity optimization problem, is to find a stabilizing controller which minimizes

+

\begin{equation} +\hnorm{\begin{matrix} W_1 S \ W_2 T \end{matrix}} +\end{equation}

+

The ability to shape \(T\) is desirable for tracking problems and noise attenuation. +It is also important for robust stability with respect to multiplicative perturbations at the plant output.

+

The \(S/T\) mixed-sensitivity minimization problem can be put into the standard control configuration as shown in Fig. fig:mixed_sensitivity_s_t.

+

The elements of the generalized plant are

+

\begin{equation*} +\begin{array}{ll} +P_{11} = \begin{bmatrix}W_1\0\end{bmatrix} & P_{12} = \begin{bmatrix}-W_1G\W_2G\end{bmatrix} \\\
+P_{21} = -I & P_{22} = -G \\\
+\end{array} +\end{equation*}

+

+
+ Figure 46: \(S/T\) mixed-sensitivity optimization in standard form
+

Figure 46: \(S/T\) mixed-sensitivity optimization in standard form

+
+
+ +

The shaping of closed-loop transfer functions as described above with the stacked cost functions becomes difficult with more than two functions whereas with two, the process is relatively easy. +The bandwidth requirements on each are usually complementary and simple, stable low-pass and high-pass filters are sufficient to carry out the required shaping and trade-offs.

+

The weights \(W_i\) in mixed-sensitivity \(\hinf\) optimal control must all be stable. +Therefore, if we wish, for example, to emphasize the minimization of \(S\) at low frequency by weighting with a term including integral action, we would have to approximate \(\frac{1}{s}\) by \(\frac{1}{s + \epsilon}\) where \(\epsilon \ll 1\). +Similarly, one might be interested in weighting \(KS\) with a non-proper weight to ensure that \(K\) is small outside of the system bandwidth. +The trick is to replace a non proper term such as \((1 + \tau_1 s)\) by \(\frac{1 + \tau_1 s}{1 + \tau_2 s}\) where \(\tau_2 \ll \tau_1\).

+

Signal-Based \(\hinf\) Control

+

The signal-based approach to controller design is very general and is appropriate for multivariable problems in which several objectives must be taken into account simultaneously. +In this approach, we define the plant, possibly the model uncertainty, the class of external signals affecting the system and the norm of the error signals we want to keep small.

+
+
+

The focus of attention has moved to the size of signals and away from the size and bandwidth of selected closed-loop transfer functions.

+
+

Weights are used to describe the expected or known frequency content of exogenous signals and the desired frequency content of error signals. +Weights are also used if a perturbation is used to model uncertainty, as in Fig. fig:input_uncertainty_hinf, where \(G\) represents the nominal model, \(W\) is a weighting function that captures the relative model fidelity over frequency, and \(\Delta\) represents unmodelled dynamics usually normalized such that \(\hnorm{\Delta} < 1\).

+

+
+ Figure 47: Multiplicative dynamic uncertainty model
+

Figure 47: Multiplicative dynamic uncertainty model

+
+
+ +

LQG control is a simple example of the signal based approach, in which the exogenous signals are assumed to be stochastic and the error signals are measured in terms of the 2-norm. +As we have seen, the weights \(Q\) and \(R\) are constant, but LQG can be generalized to include frequency dependent weights on the signals leading to what is called Wiener-Hopf design or \(\htwo\) control.

+

When we consider a system’s response to persistent sinusoidal signals of varying frequency, or when we consider the induced 2-norm between the exogenous input signals and the error signals, we are required to minimize the \(\hinf\) norm. +In the absence of model uncertainty, there does not appear to be an overwhelming case for using the \(\hinf\) norm rather than the more traditional \(\htwo\) norm. +However, when uncertainty is addressed, as it always should be, \(\hinf\) is clearly the more natural approach using component uncertainty models as in Fig. fig:input_uncertainty_hinf.

+

A typical problem using the signal-based approach to \(\hinf\) control is illustrated in the interconnection diagram of Fig. fig:hinf_signal_based. +\(G\) and \(G_d\) are nominal models of the plant and disturbance dynamics, and \(K\) is the controller to be designed. +The weights \(W_d\), \(W_r\), and \(W_n\) may be constant or dynamic and describe the relative importance and/or the frequency content of the disturbance, set points and noise signals. +The weight \(W_\text{ref}\) is a desired closed-loop transfer function between the weighted set point \(r_s\) and the actual output \(y\). +The weights \(W_e\) and \(W_u\) reflect the desired frequency content of the error \((y-y_\text{ref})\) and the control signals \(u\), respectively. +The problem can be cast as a standard \(\hinf\) optimization in the general control configuration by defining

+

\begin{equation*} +w = \begin{bmatrix}d\r\n\end{bmatrix},\ z = \begin{bmatrix}z_1\z_2\end{bmatrix}, \ v = \begin{bmatrix}r_s\y_m\end{bmatrix},\ u = u +\end{equation*}

+

+
+ Figure 48: A signal-based \(\hinf\) control problem
+

Figure 48: A signal-based \(\hinf\) control problem

+
+
+ +

Suppose we now introduce a multiplicative dynamic uncertainty model at the input to the plant as shown in Fig. fig:hinf_signal_based_uncertainty. +The problem we now want to solve is: find a stabilizing controller \(K\) such that the \(\hinf\) norm of the transfer function between \(w\) and \(z\) is less that 1 for all \(\Delta\) where \(\hnorm{\Delta} < 1\). +We have assumed in this statement that the signal weights have normalized the 2-norm of the exogenous input signals to unity. +This problem is a non-standard \(\hinf\) optimization. +It is a robust performance problem for which the \(\mu\text{-synthesis}\) procedure can be applied where we require the structured singular value: +\[ \mu(M(j\omega)) < 1, \quad \forall\omega \]

+

+
+ Figure 49: A signal-based \(\hinf\) control problem with input multiplicative uncertainty
+

Figure 49: A signal-based \(\hinf\) control problem with input multiplicative uncertainty

+
+
+ +

However, whilst the structured singular value is a useful analysis tool for assessing designs, \(\mu\text{-synthesis}\) is sometimes difficult to use and often too complex for the practical problems.

+

\(\hinf\) Loop-Shaping Design

+

The loop-shaping design procedure described in this section is based on \(\hinf\) robust stabilization combined with classical loop shaping. +It is essentially a two stage design process:

+
    +
  • First the open-loop plant is augmented by pre and post compensators to give a desired shape to the singular values of the open-loop frequency response
  • +
  • Then the resulting shaped plant is robustly stabilized with respect to coprime factor uncertainty using \(\hinf\) optimization
  • +
+

An important advantage is that no problem-dependent uncertainty modelling, or weight selection, is required in this second step.

+

Robust Stabilization

+

For multivariable systems, classical gain and phase margins are unreliable indicators of robust stability when defined for each channel (or loop), taken one at a time, because simultaneous perturbations in more than one loop are not then catered for.

+

It is now common practice to model uncertainty by stable norm-bounded dynamic (complex) matrix perturbations. +With a single perturbation, the associated robustness tests is in terms of the maximum singular values of various closed-loop transfer functions. +Use of a single stable perturbation restricts the plant and perturbed plant models to either have the same number of unstable poles or the same number of RHP zeros.

+

To overcome this, two stable perturbations can be used, one on each of the factors in a coprime factorization of the plant. +Although this uncertainty description seems unrealistic and less intuitive than the others, it is in fact quite general, and for our purposes it leads to a very useful \(\hinf\) robust stabilization problem.

+

Let’s consider the stabilization of a plant \(G\) which has a normalized left coprime factorization

+

\begin{equation} +G = M^{-1} N +\end{equation}

+

where we have dropped the subscripts from \(M\) and \(N\) for simplicity.

+

A perturbed plant model \(G_p\) can then we written has

+

\begin{equation} +G_p = (M + \Delta_M)^{-1} (N + \Delta_N) +\end{equation}

+

where \(\Delta_M\), \(\Delta_N\) are stable unknown transfer functions which represent the uncertainty in the nominal plant \(G\).

+

The objective of robust stabilization is to stabilize not only the nominal model \(G\), but a family of perturbed plants defined by

+

\begin{equation} +G_p = \{ (M + \Delta_M)^{-1} (N + \Delta_N) \ :\ \hnorm{\Delta_N\ \Delta_M} < \epsilon \} +\end{equation}

+

where \(\epsilon > 0\) is then the stability margin.

+

For the perturbed feedback system of Fig. fig:coprime_uncertainty_bis, the stability property is robust if and only if the nominal feedback system is stable and +\[ \gamma \triangleq \hnorm{\begin{bmatrix}K \ I\end{bmatrix} (I - GK)^{-1} M^{-1}} \le \frac{1}{\epsilon} \]

+

Notice that \(\gamma\) is the \(\hinf\) norm from \(\phi\) to \(\begin{bmatrix}u\y\end{bmatrix}\) and \((I-GK)^{-1}\) is the sensitivity function for this positive feedback arrangement.

+

+
+ Figure 50: \(\hinf\) robust stabilization problem
+

Figure 50: \(\hinf\) robust stabilization problem

+
+
+ +

The lowest achievable value of \(\gamma\) and the corresponding maximum stability margin \(\epsilon\) are given as

+

\begin{equation} +\gamma_\text{min} = \epsilon_{\text{max}}^{-1} = \left\{ 1 - \|N \ M\|_H^2 \right\}^{-\frac{1}{2}} = (1 + \rho(XZ))^{\frac{1}{2}} +\end{equation}

+

where \(\|\ \cdot\ \|_H\) denotes Hankel norm, \(\rho\) denotes the spectral radius (maximum eigenvalue), and for a minimal state space realization of G, Z is the unique positive definite solution of the algebraic Riccati equation

+

\begin{align*} +(A - BS^{-1} D^TC)Z &+ Z(A - BS^{-1}D^TC)^T \\\
+&- ZC^TR^{-1}CZ + BS^{-1}B^T = 0 +\end{align*}

+

where +\[ R = I + D D^T, \quad S = I + D^T D \] +\(X\) is the unique positive definite solution of the following algebraic Riccati equation

+

\begin{align*} +(A - BS^{-1} D^T C)X &+ X(A - BS^{-1}D^TC)^T \\\
+&- XBS^{-1} B^T X + C^TR^{-1}C = 0 +\end{align*}

+

A controller which guarantees that +\[ \hnorm{ \begin{bmatrix}K\I\end{bmatrix} (I-GK)^{-1} M^{-1} } \le \gamma \] +for a specified \(\gamma > \gamma_\text{min}\), is given by

+

\begin{subequations} +\begin{align} +K &\triangleq \left[ \begin{array}{c|c} +{\scriptstyle A + BF + \gamma^2L^{-T} Z C^T(C + DF)} & {\scriptstyle \gamma^2L^{-T} Z C^T} \ \hline +{\scriptstyle B^T X} & {\scriptstyle -D^T} +\end{array} \right] \label{eq:control_coprime_factor} \\\
+F &= -S^{-1}(D^T C + B^T X)\\\
+L &= (1-\gamma^2) I + XZ +\end{align} +\end{subequations}

+

The Matlab function coprimeunc can be used to generate the controller in \eqref{eq:control_coprime_factor}. +It is important to emphasize that since we can compute \(\gamma_\text{min}\) from \eqref{eq:gamma_min_coprime} we get an explicit solution by solving just two Riccati equations and avoid the \(\gamma\text{-iteration}\) needed to solve the general \(\mathcal{H}_\infty\) problem.

+

A Systematic \(\hinf\) Loop-Shaping Design Procedure

+

+Robust stabilization alone is not much used in practice because the designer is not able to specify any performance requirements.

+

To do so, pre and post compensators are used to shape the open-loop singular values prior to robust stabilization of the “shaped” plant.

+

If \(W_1\) and \(W_2\) are the pre and post compensators respectively, then the shaped plant \(G_s\) is given by

+

\begin{equation} +G_s = W_2 G W_1 +\end{equation}

+

as shown in Fig. fig:shaped_plant.

+

+
+ Figure 51: The shaped plant and controller
+

Figure 51: The shaped plant and controller

+
+
+ +

The controller \(K_s\) is synthesized by solving the robust stabilization problem for the shaped plant \(G_s\) with a normalized left coprime factorization \(G_s = M_s^{-1}N_s\). +The feedback controller for the plant \(G\) is then \(K = W_1 K_s W_2\).

+

Systematic procedure for \(\hinf\) loop-shaping design:

+
    +
  1. Scale the plant outputs and inputs. +This is very important for most design procedures. +In general, scaling improves the conditioning of the design problem, it enables meaningful analysis to be made of the robustness properties of the feedback system in the frequency domain, and for loop shaping it can simplify the selection of weights: +
      +
    • The outputs are scaled such that equal magnitudes of cross-coupling into each of the outputs is equally undesirable
    • +
    • Each input is scaled by a given percentage (say \(\SI{10}{%}\)) of its expected range of operation. +That is, the inputs are scaled to reflect the relative actuator capabilities.
    • +
    +
  2. +
  3. Order the inputs and outputs so that the plant is as diagonal as possible. +The relative gain array can be useful here. +The purpose of this pseudo-diagonalization is to ease the design of the pre and post compensators which, for simplicity, will be chosen to be diagonal. +Next, we discuss the selection of weights to obtain the shaped plant \(G_s = W_2 G W_1\) where \(W_1 = W_p W_a W_g\)
  4. +
  5. Select the elements of diagonal pre and post compensators \(W_p\) and \(W_2\) so that the singular values of \(W_2 G W_p\) are desirable. +This would normally mean high gain at low frequencies, a slope of about \(-1\) at the desired bandwidth(s), with higher rates at high frequencies. +The weights should be chosen so that no unstable hidden modes are created in \(G_s\) +
      +
    • \(W_2\) is usually chosen as a constant, reflecting the relative importance of the outputs to be controlled and the other measurements being fed back to the controller
    • +
    • \(W_p\) contains the dynamic shaping. Integral action, for low frequency performance; phase-advance for reducing the roll-off rates at crossover; and phase-lag to increase the roll-off rates at high frequencies should all be places in \(W_p\) is desired
    • +
    +
  6. +
  7. Optional: Align the singular values at a desired bandwidth using a further constant weight \(W_a\) cascaded with \(W_p\)
  8. +
  9. Optional: Introduce an additional gain matrix \(W_g\) cascaded with \(W_a\) to provide control over actuator range. \(W_g\) is diagonal and is adjusted so that actuator rate limits are not exceeded for reference demands and typical disturbances on the scaled plant outputs
  10. +
  11. Robustly stabilize the shaped plant \(G_s = W_2 G W_1\) where \(W_1 = W_p W_a W_g\) +
      +
    • First, calculate the maximum stability margin \(\epsilon_{\text{max}} = 1/\gamma_\text{min}\)
    • +
    • If the margin is too small, \(\epsilon_{\text{max}} < 0.25\), then go back to step 4 and modify the weights. Otherwise, select \(\gamma > \gamma_\text{min}\), by about \(\SI{10}{%}\), and synthesize a sub-optimal controller. There is usually no advantage to be gained by using the optimal controller
    • +
    • When \(\epsilon_{\text{max}} > 0.25\) (respectively \(\gamma_\text{min} < 4\)) the design is usually successful. In this case, at least \(\SI{25}{%}\) coprime factor uncertainty is allowed, and we also find that the shape of the open-loop singular values will not have changed much after robust stabilization
    • +
    • A small value of \(\epsilon_{\text{max}}\) indicates that the chosen singular value loop-shapes are incompatible with robust stability requirements
    • +
    +
  12. +
  13. Analyze the design and if not all the specification are met, make further modifications to the weights
  14. +
  15. Implement the controller. +The configuration shown in Fig. fig:shapping_practical_implementation has been found useful when compared with the conventional setup in Fig. fig:classical_feedback_small. +This is because the references do not directly excite the dynamics of \(K_s\), which can result in large amounts of overshoot. +The constant prefilter ensure a steady-state gain of \(1\) between \(r\) and \(y\), assuming integral action in \(W_1\) or \(G\)
  16. +
+

+
+ Figure 52: A practical implementation of the loop-shaping controller
+

Figure 52: A practical implementation of the loop-shaping controller

+
+
+ +

We will conclude this section with a summary of the advantages offered by the above \(\hinf\) loop-shaping design procedure:

+
    +
  • It is relatively easy to use, being based on classical loop-shaping ideas
  • +
  • There exists a closed formula for the \(\hinf\) optimal cost \(\gamma_\text{min}\), which in turn corresponds to a maximum stability margin \(\epsilon_{\text{max}} = 1/\gamma_\text{min}\)
  • +
  • No \(\gamma\text{-iteration}\) is required in the solution
  • +
  • Except for special systems, ones with all-pass factors, there are no pole-zero cancellations between the plant and controller. +Pole-zeros cancellations are common in many \(\hinf\) control problems and are a problem when the plant has lightly damped modes
  • +
+

Two Degrees-of-freedom Controllers

+

Many control design problems possess two degrees-of-freedom:

+
    +
  • on one hand, measurement of feedback signals
  • +
  • and on the other hand, commands and reference
  • +
+

Sometimes, one degree-of-freedom is left out of the design, and the controller is driven by an error signal i.e. the difference between a command and the output. +But in cases where stringent time-domain specifications are set on the output response, a one degree-of-freedom structure may not be sufficient.

+

A general two degrees-of-freedom feedback control scheme is depicted in Fig. fig:classical_feedback_2dof_simple. +The commands and feedbacks enter the controller separately and are independently processed.

+

+
+ Figure 53: General two degrees-of-freedom feedback control scheme
+

Figure 53: General two degrees-of-freedom feedback control scheme

+
+
+ +

The presented \(\mathcal{H}_\infty\) loop-shaping design procedure in section sec:hinf_loop_shaping_procedure is a one-degree-of-freedom design, although a constant pre-filter can be easily implemented for steady-state accuracy. +However, this may not be sufficient and a dynamic two degrees-of-freedom design is required.

+

The design problem is illustrated in Fig. fig:coprime_uncertainty_hinf. +The feedback part of the controller \(K_2\) is designed to meet robust stability and disturbance rejection requirements. +A prefilter is introduced to force the response of the closed-loop system to follow that of a specified model \(T_{\text{ref}}\), often called the reference model.

+

+
+ Figure 54: Two degrees-of-freedom \(\mathcal{H}_\infty\) loop-shaping design problem
+

Figure 54: Two degrees-of-freedom \(\mathcal{H}_\infty\) loop-shaping design problem

+
+
+ +

The design problem is to find the stabilizing controller \(K = [K_1,\ K_2]\) for the shaped plant \(G_s = G W_1\), with a normalized coprime factorization \(G_s = M_s^{-1} N_s\), which minimizes the \(\mathcal{H}_\infty\) norm of the transfer function between the signals \([r^T\ \phi^T]^T\) and \([u_s^T\ y^T\ e^T]^T\) as defined in Fig. fig:coprime_uncertainty_hinf. +This problem is easily cast into the general configuration.

+

The control signal to the shaped plant \(u_s\) is given by: +\[ u_s = \begin{bmatrix} K_1 & K_2 \end{bmatrix} \begin{bmatrix} \beta \ y \end{bmatrix} \] +where \(K_1\) is the prefilter, \(K_2\) is the feedback controller, \(\beta\) is the scaled reference and \(y\) is the measured output. +The purpose of the prefilter is to ensure that: +\[ \left\| (I - G_s K_2)^{-1} G_s K_1 - T_{\text{ref}} \right\|_\infty < \gamma \rho^2 \] +\(T_{\text{ref}}\) is the desired closed-loop transfer function and \(\rho\) is a scalar parameter that the designer can increase to place more emphasis on model matching in the optimization at the expense of robustness.

+

The main steps required to synthesize a two degrees-of-freedom \(\mathcal{H}_\infty\) loop-shaping controller are:

+
    +
  1. Design a one degree-of-freedom \(\mathcal{H}_\infty\) loop-shaping controller (section sec:hinf_loop_shaping_procedure) but without a post-compensator \(W_2\)
  2. +
  3. Select a desired closed-loop transfer function \(T_{\text{ref}}\) between the commands and controller outputs
  4. +
  5. Set the scalar parameter \(\rho\) to a small value greater than \(1\); something in the range \(1\) to \(3\) will usually suffice
  6. +
  7. For the shaped \(G_s = G W_1\), the desired response \(T_{\text{ref}}\), and the scalar parameter \(\rho\), solve the standard \(\mathcal{H}_\infty\) optimization problem to a specified tolerance to get \(K = [K_1,\ K_2]\)
  8. +
  9. Replace the prefilter \(K_1\) by \(K_1 W_i\) to give exact model-matching at steady-state.
  10. +
  11. Analyze and, if required, redesign making adjustments to \(\rho\) and possibly \(W_1\) and \(T_{\text{ref}}\)
  12. +
+

The final two degrees-of-freedom \(\mathcal{H}_\infty\) loop-shaping controller is illustrated in Fig. fig:hinf_synthesis_2dof.

+

+
+ Figure 55: Two degrees-of-freedom \(\mathcal{H}_\infty\) loop-shaping controller
+

Figure 55: Two degrees-of-freedom \(\mathcal{H}_\infty\) loop-shaping controller

+
+
+ +

Observer-Based Structure for \(\hinf\) Loop-Shaping Controllers

+

\(\mathcal{H}_\infty\) designs exhibit an observer/state feedback structure in the controller. +The clear structure of the \(\mathcal{H}_\infty\) loop-shaping controllers has several advantages:

+
    +
  • It is helpful in describing a controller’s function
  • +
  • It lends itself to implementation in a gain-schedule scheme
  • +
  • If offers computational savings in digital implementations
  • +
+

Let’s assume that the shaped plant is strictly proper, with a stabilizable and detectable state space realization +\[ G_s \triangleq \left[ \begin{array}{c|c} +A_s & B_s \ \hline +C_s & 0 +\end{array} \right] \]

+

The single degree-of-freedom \(\mathcal{H}_\infty\) loop-shaping controller can be realized as an observer for the shaped plant plus a state feedback control law:

+

\begin{align*} +\dot{\hat{x}}_s &= A_s \hat{x}_s + H_s(C_s \hat{x}_s - y_s) + B_s u_s \\\
+u_s &= K_s \hat{x}_s +\end{align*}

+

where \(\hat{x}_s\) is the observer state, \(u_s\) and \(y_s\) are respectively the input and output of the shaped plant, and

+

\begin{align*} +H_s &= -Z_s C_s^T \\\
+K_s &= -B_s^T [I - \gamma^{-2}I - \gamma^{-2} X_s Z_s]^{-1} X_s +\end{align*}

+

where \(Z_s\) and \(X_s\) are the appropriate solutions to the generalized algebraic Riccati equations for \(G_s\).

+

The same can be done for two degrees-of-freedom controllers.

+

Implementation Issues

+
Discrete-time controllers
+

For implementation purposes, discrete-time controllers are usually required. +These can be obtained from a continuous-time design using a bilinear transformation from the \(s\text{-domain}\) to the \(z\text{-domain}\), but there can be advantages in being able to design directly in discrete time.

+
Anti-windup
+

In \(\hinf\) loop-shaping the pre compensator weight \(W_1\) would normally include integral action in order to reject low frequency disturbances acting on the system. +However, in the case of actuator saturation, the integrators continue to integrate their input and hence cause windup problems. +An anti-windup scheme is therefore required on the weighting function \(W_1\). +The approach we recommend is to implement the weight \(W_1\) in its self-conditioned or Hanus form. +Let the weight \(W_1\) have a realization +\[ W_1 \triangleq \left[ \begin{array}{c|c} +A_w & B_w \ \hline +C_w & D_w +\end{array} \right] \] +and let \(u\) be the input to the plant actuators and \(u_s\) the input to the shaped plant. +Then \(u = W_1 u_s\). +When implemented in Hanus form, the expression for \(u\) becomes +\[ u = \left[ \begin{array}{c|cc} +A_w - B_wD_w^{-1}C_w & 0 & B_wD_w^{-1} \ \hline +C_w & D_w & 0 +\end{array} \right] \begin{bmatrix} +u_s \ u_a +\end{bmatrix} \] +where \(u_a\) is the actual plant input, that is the measurement at the output of the actuators which therefore contains information about possible actuator saturation.

+

The situation is illustrated in Fig. fig:weight_anti_windup, where the actuators are each modeled by a unit gain and a saturation.

+

+
+ Figure 56: Self-conditioned weight \(W_1\)
+

Figure 56: Self-conditioned weight \(W_1\)

+
+
+ +

The Hanus form prevents windup by keeping the states of \(W_1\) consistent with the actual plant input at all times. +When there is no saturation, \(u_a=u\), the dynamics of \(W_1\) remains unaffected. +But when \(u_a\neq u\), the dynamics are inverted and driven by \(u_a\) so that the states remain consistent with the actual plant input \(u_a\). +Notice that such an implementation requires \(W_1\) to be invertible and minimum phase.

+
Bumpless transfer
+

When multi-mode switched controller is designed, one should ensure smooth transition from one controller to the other (bumpless transfer). +It was found useful to condition the reference models and the observers in each of the controllers. +When on-line, the observer state evolves according to +\[ \dot{\hat{x}}_s = A_s \hat{x}_s + H_s (C_s \hat{x}_s - y_s) + B_s u_s \] +but when off-line, the state equation becomes +\[ \dot{\hat{x}}_s = A_s \hat{x}_s + H_s (C_s \hat{x}_s - y_s) + B_s u_{as} \] +where \(u_{as}\) is the actual input to the shaped plant governed by the on-line controller.

+

Doing so ensure that the inputs to the shaped plant for the off-line controller follows the actual shaped plant input \(u_{as}\) given by the on-line controller. +The observer based structure of the \(\mathcal{H}_\infty\) loop-shaping controller is then helpful for such technique.

+

Conclusion

+

Several methods and techniques for controller design have been described. +The emphasis has been on \(\hinf\) loop shaping which is easy to apply and works well in practice. +It combines classical loop-shaping ideas with an effective method for robustly stabilizing the feedback loop.

+

For complex problems, such as unstable plants with multiple gain crossover frequencies, it may not be easy to decide on a desired loop shape. +In which case, we would suggest doing an initial LQG design (with simple weights) and using the resulting loop shape as the desired one for the \(\hinf\) loop shaping.

+

And alternative to \(\hinf\) loop shaping is a standard \(\hinf\) design with a stacked cost function such as in \(S/KS\) mixed-sensitivity optimization. +In this approach, \(\hinf\) optimization is used to shape two or sometimes three closed-loop transfer functions. +However, with more functions, the shaping becomes increasingly difficult for the designer.

+

In other design situations where there are several performance objectives, it may be more appropriate to follow a signal-based \(\htwo\) or \(\hinf\) approach. +But again, the problem formulations become so complex that the designer has little direct influence on the design.

+

After a design, the resulting controller should be analyzed with respect to robustness and tested using nonlinear simulations. +For the study of robustness, we recommend \(\mu\text{-analysis}\). If the design is not robust, then the weights should be modified. +Sometimes, one might consider synthesizing a \(\mu\text{-optimal}\) controller, but this complexity is rarely necessary in practice. +Moreover, one should be careful about combining controller synthesis and analysis into a single step.

+

Controller Structure Design

+

+

Introduction

+

In previous sections, we considered the general problem formulation in Fig. fig:general_control_names_bis and stated that the controller design problem is to find a controller \(K\) which based on the information in \(v\), generates a control signal \(u\) which counteracts the influence of \(w\) on \(z\), thereby minimizing the closed loop norm from \(w\) to \(z\).

+

+
+ Figure 57: General Control Configuration
+

Figure 57: General Control Configuration

+
+
+ +

In this chapter we are concerned with the structural decisions associated with the following selection tasks of control structure design:

+
    +
  • Controlled outputs: What are the variables \(z\)?
  • +
  • Manipulations and measurements: What are the variable set \(u\) and \(v\)?
  • +
  • Control configuration: What is the structure of \(K\)?
  • +
  • Controller type: What algorithm is used for \(K\)?
  • +
+

The distinction between the words under control structure and control configuration are significant. +The control structure refers to all structural decisions included in the design of a control system. +On the other hand, the control configuration refers only to the structuring of the controller \(K\) itself.

+

Ideally, the tasks involved in designing a complete control system are performed sequentially; first a “top down” selection of controller outputs, measurements and inputs, and then a “bottom up” design of the control system in which the selection of the control configuration is the most important decision. +However, in practice the tasks are closely related so the procedure may involve iteration.

+

One important reason for decomposing the control system into a specific control configuration is that it may allow for simple tuning of the sub-controllers without the need for a detailed plant model describing the dynamics and interactions in the process. +Multivariable centralized controllers may always outperform decomposed (decentralized) controllers, bus this performance gain must be traded off against the cost of obtaining and maintaining a sufficiently detailed plant model.

+

The number of possible control structure is usually very large. +Fortunately, we can often from physical insight obtain a reasonable choice of controlled outputs, measurements and manipulated inputs.

+

Optimization and Control

+

The selection of controlled outputs involves selecting the variables \(y\) to be controlled at given reference values \(y \approx r\). +The reference value \(r\) is usually set at some higher layer in the control hierarchy which is often divided into two layers:

+
    +
  • Optimization layer: computes the desired reference commands \(r\)
  • +
  • Control layer: implements these commands to achieve \(y \approx r\)
  • +
+

Additional layers are possible, as is illustrated in Fig. fig:control_system_hierarchy which shows a typical control hierarchy for a chemical plant.

+

+
+ Figure 58: Typical control system hierarchy in a chemical plant
+

Figure 58: Typical control system hierarchy in a chemical plant

+
+
+ +

In general, the information flow in such a control hierarchy is based on the higher layer sending reference values (setpoints) to the layer below reporting back any problems achieving this (see Fig. fig:optimize_control_b). +There is usually a time scale separation between the layers which means that the setpoints, as viewed from a given layer, are updated only periodically.

+

The optimization tends to be performed open-loop with limited use of feedback. On the other hand, the control layer is mainly based on feedback information. +The optimization is often based on nonlinear steady-state models, whereas we often use linear dynamic models in the control layer.

+

From a theoretical point of view, the optimal performance is obtained with a centralized optimizing controller, which combines the two layers of optimizing and control (see Fig. fig:optimize_control_c). +All control actions in such an ideal control system would be perfectly coordinated and the control system would use on-line dynamic optimization based on nonlinear dynamic model of the complete plant. +However, this solution is normally not used for a number a reasons, included the cost of modeling, the difficulty of controller design, maintenance, robustness problems and the lack of computing power.

+

+
+ Table 6: + Alternative structures for optimization and control +
+ + + + + + + + + + + + + + + +
Open loop optimization Closed-loop implementation with separate control layer Integrated optimization and control
+

Selection of Controlled Outputs

+

A controlled output is an output variable (usually measured) with an associated control objective (usually a reference value). +In many cases, it is clear from a physical understanding of the process what the controlled outputs should be. +In other cases, it is less obvious because each control objective may not be associated with a measured output variable.

+

In the following, we let \(y\) denote the selected controller outputs in the control layer. +Two distinct questions arise:

+
    +
  1. What variables \(y\) should be selected?
  2. +
  3. What is the optimal reference value \(y_\text{opt}\)?
  4. +
+

For the first problem, we make the following assumptions:

+
    +
  1. The overall goal can be quantified in terms of a scalar cost function \(J\) which we want to minimize
  2. +
  3. For a given disturbance \(d\), there exists an optimal value \(u_\text{opt}(d)\) and corresponding value \(y_\text{opt}(d)\) which minimizes the cost function \(J\)
  4. +
  5. The reference values \(r\) for the controlled outputs \(y\) should be constant, i.e. \(r\) should be independent of the disturbances \(d\)
  6. +
+

The system behavior is a function of the independent variables \(u\) and \(d\): \(J = J(u, d)\). +For a given disturbance \(d\) the optimal value of the cost function is

+

\begin{equation} +J_\text{opt}(d) \triangleq J(u_\text{opt}, d) = \min_u J(u, d) +\end{equation}

+

In practice \(u \neq u_\text{opt}\), and we have a loss which can be quantified by \(L = J - J_\text{opt}\). +A reasonable objective for selecting controlled outputs \(y\) is to minimize some norm of the loss, for instance the worst-case loss:

+

\begin{equation} +\Phi \triangleq \max_{d \in \mathcal{D}} |\underbrace{J(u, d) - J(u_\text{opt}, d)}_{L}| +\end{equation}

+

where \(\mathcal{D}\) is the set of possible disturbances.

+

Direct Evaluation of Cost

+

The “brute force” approach for selecting controlled variables is to evaluate the loss for alternative sets of controlled variable. +By solving the non linear equations, we evaluate directly the cost function \(J\) for various disturbances \(d\). +The set of controlled outputs with smallest worst case or average value of \(J\) is then preferred. +This approach may be time consuming because the solution of the nonlinear equations must be repeated for each candidate set of controlled outputs.

+

Linear Analysis

+

Consider the loss \(L = J(u,d) - J_\text{opt}(d)\) where \(d\) is a fixed disturbance. +We make the following additional assumptions:

+
    +
  1. The cost function \\(J\\) is smooth (twice differentiable)
  2. +
  3. The optimization problem is unconstrained. +If it is optimal to keep some variable at a constant, then we assume that this is implemented and consider the remaining unconstrained problem
  4. +
  5. The dynamics of the problem can be neglected, that is, **we consider the steady-state control and optimization**
  6. +
+

For a fixed \(d\) we may express \(J(u, d)\) in terms of a Taylor series expansion in \(u\) around the optimal point. +By neglecting terms of third order and higher, we obtain: +\[ J(u, d) = J_\text{opt}(d) + \frac{1}{2} (u - u_\text{opt}(d))^T \left(\frac{\partial^2 J}{\partial u^2}\right)_\text{opt} (u - u_\text{opt}(d)) \] +This quantifies how \(u-u_\text{opt}\) affects the cost function. +For a fixed \(d\), we have: \(y - y_\text{opt} = G (u - u_\text{opt})\) where \(G\) is the steady state gain matrix. +Thus, we get: +\[ J - J_\text{opt} \approx \frac{1}{2} \big(G^{-1}(y-y_\text{opt})\big)^T \left(\frac{\partial^2 J}{\partial u^2}\right)_\text{opt} G^{-1} (y - y_\text{opt}) \]

+

We conclude that we should select \(y\) such that:

+
    +
  1. \(G^{-1}\) is small: the inputs have a large effect on \(y\)
  2. +
  3. \(e_\text{opt} = r - y_\text{opt}(d)\) is small: its optimal value \(y_\text{opt}(d)\) depends only weakly on the disturbances and other changes
  4. +
  5. \(e = y - r\) is small: it is easy to keep the control error \(e\) small
  6. +
+

Note that \(\bar{\sigma}(G^{-1}) = 1/\underline{\sigma}(G)\) and so we want the smallest singular value of the steady state gain matrix to be large.

+

As this depends of scaling, we should first scale the outputs such that the expected magnitude of \(y_i - y_{i_\text{opt}}\) is similar in magnitude for each output, and scale the inputs such that the effect of a given deviation \(u_j - u_{j_\text{opt}}\) on the cost function \(J\) is similar for each input.

+
+
+

The use of the minimum singular value to select controlled outputs may be summarized in the following procedure:

+
    +
  1. From a (nonlinear) model compute the optimal parameters (inputs and outputs) for various conditions (disturbances, operating points). +This yields a “look-up” table for optimal parameter values as a function of the operating conditions
  2. +
  3. From this data, obtain for each candidate output the variation in its optimal value +\[ v_i = \frac{(y_{i_{\text{opt,max}}} - y_{i_{\text{opt,min}}})}{2} \]
  4. +
  5. Scale the candidate outputs such that for each output the sum of the magnitudes of \(v_i\) and the control error (\(e_i\), including measurement noise \(n_i\)) is similar (e.g. \(|v_i| + |e_i| = 1\))
  6. +
  7. Scale the inputs such that a unit deviation in each input from its optimal value has the same effect on the cost function \(J\)
  8. +
  9. Select as candidates those sets of controlled outputs which corresponds to a large value of \(\underline{\sigma}(G)\). +\(G\) is the transfer function for the effect of the scaled inputs on the scaled outputs
  10. +
+
+

Summary

+

Generally, the optimal values of all variables will change with time during operation. +If the loss imposed by keeping constant setpoints is acceptable, then we have self-optimizing control. +The objective of the control layer is then to keep the controlled outputs at their reference values (which are computed by the optimization layer).

+

The controlled outputs are often measured, but we may also estimated their values based on other measured variables. +We may also use other measurements to improve the control of the controlled outputs, for example, by use of cascade control. +Thus, the selection of controlled and measured outputs are two separate issues.

+

Selection of Manipulations and Measurements

+

We are here concerned with the variable sets \(u\) and \(v\) in Fig. fig:general_control_names_bis. +Note that the measurements \(v\) used by the controller are in general different from the controlled variables \(z\) because we may not be able to measure all the controlled variables and we may want to measure and control additional variables in order to:

+
    +
  • Stabilize the plant, or more generally change its dynamics
  • +
  • Improve local disturbance rejection
  • +
+
Stabilization
+

We usually start of controller design by designing a lower-layer controller to stabilize the plant. +The issue is then: which outputs and inputs should be used for stabilization? +A reasonable objective is to minimize the required input usage of the stabilizing control system.

+
Local disturbance rejection
+

For measurements, the rule is generally to select those which have a strong relationship with the controlled outputs, or which may quickly detect a major disturbance.

+

The selected manipulations should have a large effect on the controlled outputs and should be located “close” (in terms of dynamic response) to the outputs and measurements.

+

To evaluate the combinations of manipulations and measurements, one may perform an input-output controllability analysis for each combination (e.g. consider the minimum singular values, RHP-zeros, interactions, etc). +A more involved approach would be to perform a achievable robust performance analysis. +An even more involved (and exact) approach would be to synthesize controllers for optimal robust performance for each candidate combination. +However, the number of combination has a combinatorial growth and the analysis may become very time-consuming.

+

RGA for Non-Square Plant

+

A simple but effective tool for selecting inputs and outputs, which avoids to combinatorial problem is the Relative Gain Array (RGA) of the “big” transfer matrix \(G_\text{all}\) with all candidates inputs and outputs included:

+

\begin{equation} +\tcmbox{\Lambda = G_{\text{all}} \times G_{\text{all}}^{\dagger^T}} +\end{equation}

+

Essentially, one may consider not using those manipulations \(u\) corresponding to columns in the RGA where the sum of the elements is much smaller than 1.

+

Similarly, one may consider not using those outputs \(v\) corresponding to rows in the RGA where the sum of the elements is much small than 1.

+

Control Configuration Elements

+

We now assume that the measurements, manipulations and controlled outputs are fixed. +The available synthesis theories presented in this book result in a multivariable controller \(K\) which connects all available measurements \(v\) with all available manipulations \(u\): +\[ u = K v \] +However, such a “big” controller may not be desirable.

+
+
+

We define the control configuration to be the restrictions imposed on the overall controller \(K\) by decomposing it into a set of local controllers with predetermined links and with a possibly predetermined design sequence where subcontrollers are designed locally.

+
+

Some elements used to build up a specific control configuration are:

+
    +
  • Cascade controllers. The output from one controller is the input to another
  • +
  • Decentralized controllers. The control system consists of independent feedback controllers which interconnect a subset of the output measurements with a subset of the manipulated inputs. +These subsets should not be used by any other controller
  • +
  • Feedforward elements. Link measured disturbances and manipulated inputs
  • +
  • Decoupling elements. Link one set of manipulated inputs with another set of manipulated inputs. +They are used to improve the performance of decentralized control systems.
  • +
  • Selectors: used to select for control, depending on the conditions of the system, a subset of the manipulated inputs or a subset of the outputs
  • +
+

In addition to restrictions on the structure of \(K\), we may impose restrictions on in which sequence the subcontrollers are designed. +For most decomposed control systems, we design the controllers sequentially, starting with the “fast” or “inner” or “lower-layer” control loops.

+

The choice of control configuration leads to two different ways of partitioning the control system:

+
    +
  • Vertical decomposition. This usually results from a sequential design of the control system
  • +
  • Horizontal decomposition. This usually involves a set of independent decentralized controllers
  • +
+

Of course, a performance loss is inevitable if we decompose the control system. +For example, if we select a poor configuration at the lower control layer, then this may pose fundamental limitations on the achievable performance (RHP zeros, strong interactions, etc).

+

Cascade Control Systems

+

We here use SISO controllers of the form

+

\begin{equation} +u_i = K_i(s) (r_i - y_i) +\end{equation}

+

where \(K_i(s)\) is a scalar. +Then when a SISO control loop is closed, we lose the input \(u_i\) as a degree-of-freedom but the reference \(r_i\) becomes a new degree-of-freedom.

+

A cascade control structure results when either of the following two situations arise:

+
    +
  • The reference \(r_i\) is an output from another controller. +This is the conventional cascade control (Fig. fig:cascade_extra_meas)
  • +
  • The “measurement” \(y_i\) is an output from another controller. +This is referred to as input resetting (Fig. fig:cascade_extra_input)
  • +
+

+
+ Table 7: + Cascade Implementations +
+ + + + + + + + + + + + + +
Extra measurements \(y_2\) Extra inputs \(u_2\)
+

Cascade Control: Extra Measurements

+

Let \(u\) be the manipulated input, \(y_1\) the controlled outputs and \(y_2\) the extra measurement. +In many cases, we may use \(y_2\) to provide local disturbance rejection, linearization, or to reduce the effect of measurement noise. +For example, velocity feedback is frequently used in mechanical systems.

+
Centralized (parallel) implementation
+

A centralized implementation where \(K\) is a 2-inputs-1-output controller may be written

+

\begin{align*} +u &= K(s)(r - y) \\\
+u &= K_{11}(s)(r_1 - y_1) + K_{12}(s)(r_2 - y_2) +\end{align*}

+

where in most cases \(r_2 = 0\) since we do not have a degree-of-freedom to control \(y_2\).

+
Cascade implementation
+

To obtain an implementation with two SISO controllers, we may cascade the controllers as illustrated in Fig. fig:cascade_extra_meas:

+

\begin{align*} +r_2 &= K_1(s)(r_1 - y_1) \\\
+u_2 &= K_2(s)(r_2 - y_2),\ r_2 = \hat{u}_1 +\end{align*}

+

Note that the output \(r_2\) from the slower primary controller \(K_1\) is not a manipulated plant input, but rather the reference input to the faster secondary controller \(K_2\). +Cascades based on measuring the actual manipulated variable (\(y_2 = u_m\)) are commonly used to reduce uncertainty and non-linearity at the plant input.

+

In the general case (Fig. fig:cascade_extra_meas) \(y_1\) and \(y_2\) are not directly related to each other, and this is sometimes referred to as parallel cascade control. +However, it is common to encounter the situation in Fig. fig:cascade_control where the primary output \(y_1\) depends directly on \(y_2\) which is a special case of Fig. fig:cascade_extra_meas.

+
+
+

With reference to the special (but common) case of cascade control shown in Fig. fig:cascade_control, the use of extra measurements is useful under the following circumstances:

+
    +
  • The disturbance \(d_2\) is significant and \(G_1\) is non-minimum phase. +If \(G_1\) is minimum phase, the input-output controllability of \(G_2\) and \(G_1 G_2\) are the same and there is no fundamental advantage in measuring \(y_2\)
  • +
  • The plant \(G_2\) has considerable uncertainty associated with it and the inner loop serves to remove the uncertainty. +The inner loop \(L_2 = G_2 K_2\) removes the uncertainty if it is sufficiently fast and yields a transfer function \((I + L_2)^{-1} L_2\) close to \(I\) at frequencies where \(K_1\) is active.
  • +
+
+

+
+ Figure 59: Common case of cascade control where the primary output \(y_1\) depends directly on the extra measurement \(y_2\)
+

Figure 59: Common case of cascade control where the primary output \(y_1\) depends directly on the extra measurement \(y_2\)

+
+
+ +

In terms of design, it is recommended to first design \(K_2\) to minimize the effect of \(d_2\) on \(y_1\) and then to design \(K_1\) to minimize the effect of \(d_1\) on \(y_1\).

+

Cascade Control: Extra Inputs

+

In some cases we have more manipulated inputs than controlled outputs. +These may be used to improve control performance.

+
Centralized implementation
+

A centralized implementation where \(K\) is a 1-input-2-outputs controller may be written +\[ u_1 = K_{11}(s)(r-y); \quad u_2 = K_{21}(s)(r-y) \] +Here two inputs are used to control one output. +We usually let \(K_{11}\) have integral control whereas \(K_{21}\) does not. +Then \(u_2(t)\) will only be used for transient control and will return to \(0\) as \(t \to \infty\).

+
Cascade implementation
+

To obtain an implementation with two SISO controllers we may cascade the controllers as shown in Fig. fig:cascade_extra_input. +We again let input \(u_2\) take care of the fast control and \(u_1\) of the long-term control. +The fast control loop is then +\[ u_2 = K_2(s)(r - y) \] +The objective of the other slower controller is then to use input \(u_1\) to reset input \(u_2\) to its desired value \(r_{u_2}\): +\[ u_1 = K_1(s)(r_{u_2} - y_1), \ y_1 = u_2 \] +and we see that the output from the fast controller \(K_2\) is the “measurement” for the slow controller \(K_1\).

+

The cascade implementation again has the advantage of decoupling the design of the two controllers. +It also shows more clearly that \(r_{u_2}\), the reference for \(u_2\), may be used as a degree-of-freedom at higher layers in the control system.

+
+
+

Consider the system in Fig. fig:cascade_control_two_layers with two manipulated inputs (\(u_2\) and \(u_3\)), one controlled output (\(y_1\) which should be close to \(r_1\)) and two measured variables (\(y_1\) and \(y_2\)). +Input \(u_2\) has a more direct effect on \(y_1\) than does input \(u_3\) (there is a large delay in \(G_3(s)\)). +Input \(u_2\) should only be used for transient control as it is desirable that it remains close to \(r_3 = r_{u_2}\). +The extra measurement \(y_2\) is closer than \(y_1\) to the input \(u_2\) and may be useful for detecting disturbances affecting \(G_1\).

+

Controller \(K_1\) controls the primary output \(y_1\) at its reference \(r_1\) by adjusting the “input” \(\hat{u}_1\), which is the reference value for \(y_2\). +Controller \(K_2\) controls the secondary output \(y_2\) using input \(u_2\). +Finally, controller \(K_3\) manipulates \(u_3\) slowly in order to reset input \(u_2\) to its desired value \(r_3\). +We would probably tune the three controllers in the order \(K_2\), \(K_3\), and \(K_1\).

+
+

+
+ Figure 60: Control configuration with two layers of cascade control
+

Figure 60: Control configuration with two layers of cascade control

+
+
+ +

Selectors

+
Slip-range control for extra input
+

Sometimes the input constraints make it necessary to add a manipulated input. +In this case the control range is often split such that, for example, \(u_1\) is used for control when \(y \in [y_\text{min}, y_1]\) and \(u_2\) is used when \(y \in [y_1, y_\text{max}]\).

+
Selector for too few inputs
+

A completely different situation occurs if there are fewer inputs than outputs. +In such case, we cannot control all the outputs independently, so we either need to control all the outputs in some average manner, or we need to make a choice about which outputs are the most important to control. +Selectors are often used for the latter option.

+

Why use Cascade and Decentralized Control?

+

Decomposed control configuration can easily become quite complex and difficult to maintain and understand. +It may therefore be both simpler and better in terms of control performance to set up the controller design problem as an optimization problem and let the computer do the job, resulting in a centralized multivariable controller.

+

However, there are a number of reason why cascade and decentralized control are used in practice. +The most important one is the cost associated with obtaining good plant models, which are a prerequisite for applying multivariable control. +Since cascade and decentralized control systems depend more strongly on feedback rather than models as their source of information, it is usually more important (relative to centralized multivariable control) that the fast control loops be tuned to respond quickly.

+

The cascade and decentralized control are often easier to understand, their tuning parameters have a direct and “localized” effect, and they tend to be less sensitive to uncertainty.

+

The main challenge is then to find a control configuration which allows the controllers to be tuned independently based on a minimum of model information. +To be able to tune the controllers independently, we must require that the loops interact only to a limited extent. +For example, one desirable property is that the steady-state gain from \(u_i\) to \(y_i\) in an “inner” loop does not change too much as outer loops are closed.

+

Hierarchical and Partial Control

+

Partial Control

+
+
+

Partial control involves controlling only a subset of the outputs for which there is a control objective.

+
+

We divide the outputs \(y\) into two classes:

+
    +
  • \(y_1\) - (temporarily) uncontrolled output
  • +
  • \(y_2\) - (locally) measured and controlled output
  • +
+

We also subdivide the available manipulated inputs \(u\):

+
    +
  • \(u_2\) - inputs used for controlling \(y_2\)
  • +
  • \(u_1\) - remaining inputs
  • +
+

Four applications of partial control are:

+
    +
  1. Sequential design on decentralized controllers. +Both \(y_1\) and \(y_2\) have an associated control objective. +First, a controller \(K_2\) is designed to control \(y_2\). +Then, a controlled \(K_1\) may be designed for the remaining outputs.
  2. +
  3. Sequential design of conventional cascade control. +The outputs \(y_2\) are additional measured variables which are not important variables in themselves. +The reason for controlling \(y_2\) is to improve the control of \(y_1\). +The references \(r_2\) are used as degrees-of-freedom for controlling \(y_1\).
  4. +
  5. “true” partial control. +Both \(y_1\) and \(y_2\) have an associated control objective. +We consider whether by controlling only the subset \(y_2\) we can indirectly achieve acceptable control of \(y_1\).
  6. +
  7. Indirect control. +The outputs \(y_1\) have an associated control objective but are not measured. +Instead, we aim at indirectly controlling \(y_1\) by controlling the secondary measured variables \(y_2\).
  8. +
+

The table tab:partial_control shows clearly the differences between the four applications of partial control. +In all cases, there is a control objective associated with \(y_1\) and a feedback involving measurement and control of \(y_2\) and we want:

+
    +
  • The effect of disturbances on \(y_1\) to be small (when \(y_2\) is controlled)
  • +
  • The control of \(y_2\) using \(u_2\) to be (dynamically) easy
  • +
+

+
+ Table 8: + Applications of partial control +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ControlMeas. and control of \(y_1\)?Control objective for \(y_2\)?
Sequ. decentralizedYesYes
Sequ. cascadeYesNo
“True” partialNoYes
IndirectNoNo
+

By partitioning the inputs and outputs, the overall model \(y = G u\) can be written

+

\begin{equation} +\begin{aligned} +y_1 &= G_{11} u_1 + G_{12} u_2 + G_{d1} d\\\
+y_2 &= G_{21} u_1 + G_{22} u_2 + G_{d2} d +\end{aligned} +\end{equation}

+

Assume now that feedback control \(u_2 = K_2(r_2 - y_2 - n_2)\) is used for the “secondary” subsystem involving \(u_2\) and \(y_2\) (Fig. fig:partial_control). +We get:

+

\begin{equation} +\begin{aligned} +y_1 = &(G_{11} - G_{12}K_2(I + G_{22}K_2)^{-1}G_{21})u_1 \\\
+& + (G_{d1} - G_{12}K_2(I + G_{22}K_2)^{-1}G_{d2})d \\\
+& + G_{12} K_2 (I + G_{22}K_2)^{-1}(r_2 - n_2) +\end{aligned} +\end{equation}

+

+
+ Figure 61: Partial Control
+

Figure 61: Partial Control

+
+
+ +
Tight control of \(y_2\)
+

In some cases, we can assume that the control of \(y_2\) is fast compared to the control of \(y_1\) so we may let \(K_2 \to \infty\) to get: +\[ u_2 = -G_{22}^{-1} G_{d2} d - G_{22}^{-1} G_{21} u_1 + G_{22}^{-1} y_2 \]

+

The dynamics of the system becomes:

+

\begin{equation} +\begin{aligned} +y_1 = &\underbrace{(G_{11} - G_{12} G_{22}^{-1} G_{21})}_{\triangleq P_u} u_1 \\\
+& + \underbrace{(G_{d1} - G_{12} G_{22}^{-1} G_{d2})}_{\triangleq P_d} d + \underbrace{G_{12} G_{22}^{-1}}_{\triangleq P_r} \underbrace{(r_2 - e_2)}_{y_2} +\end{aligned} +\end{equation}

+

where

+
    +
  • \(P_d\) is called the partial disturbance gain, which is the disturbance gain for a system under perfect partial control
  • +
  • \(P_u\) is the effect of \(u_1\) on \(y_1\) with \(y_2\) perfectly controlled
  • +
+

The obtained dynamics is independent of \(K_2\), but this only applies at frequencies where \(y_2\) is tightly controlled.

+

Hierarchical Control and Sequential Design

+

A hierarchical control system results when we design the subcontrollers in a sequential manner, usually starting with the fast loops. +This means that the controller at some higher layer in the hierarchy is designed based on a partially controlled plant.

+

The idea is to first implement a local lower-layer control system for controlling the outputs \(y_2\). +Next, with this lower-layer in place, we design a controller \(K_1\) to control \(y_1\).

+

The objectives for this hierarchical decomposition are:

+
    +
  • to allow for simple or even on-line tuning of \(K_2\)
  • +
  • to allow the use of longer sampling intervals for \(K_1\)
  • +
  • to allow simple models when designing \(K_1\)
  • +
  • to “stabilize” the plant using \(K_2\) such that it is amenable to manual control
  • +
+
+
+

The selection of \(u_2\) and \(y_2\) for use in the lower-layer control system can be done with the following criteria:

+
    +
  • The lower-layer must quickly implement the setpoints computed by the higher layers, that is, the input-output controllability of the subsystem involving the use of \(u_2\) to control \(y_2\) should be good (consider \(G_{22}\) and \(G_{d2}\))
  • +
  • The control of \(y_2\) using \(u_2\) should provide local disturbance rejection, that is, it should minimize the effect of disturbances on \(y_1\)
  • +
  • The control of \(y_2\) using \(u_2\) should not impose unnecessary control limitations (RHP-zero, ill-conditioning, etc.) on the remaining control problem which involves using \(u_1\) to control \(y_1\)
  • +
+
+
Sequential design of cascade control systems
+

Consider the conventional cascade control system in Fig. fig:cascade_extra_meas where we have additional “secondary” measurements \(y_2\) with no associated control objective, and the objective is to improve the control of \(y_1\) by locally controlling \(y_2\). +The idea is that this should reduce the effect of disturbances and uncertainty on \(y_1\).

+

From \eqref{eq:partial_control}, it follows that we should select \(y_2\) and \(u_2\) such that \(\|P_d\|\) is small and at least smaller than \(\|G_{d1}\|\). +These arguments particularly apply at high frequencies. +More precisely, we want the input-output controllability of \([P_u\ P_r]\) with disturbance model \(P_d\) to be better that of the plant \([G_{11}\ G_{12}]\) with disturbance model \(G_{d1}\).

+

“True” Partial Control

+

We here consider the case where we attempt to leave a set of primary outputs \(y_1\) uncontrolled. +This may be possible in cases where the outputs are correlated such that controlling the outputs \(y_2\) indirectly gives acceptable control of \(y_1\).

+
+
+

A set of outputs \(y_1\) may be left uncontrolled only if the effects of all disturbances (including \(r_2\)) on \(y_1\), as expressed by the elements in the corresponding partial disturbance gain matrix \(P_d\) are less than \(1\) in magnitude at all frequencies.

+
+

To evaluate the feasibility of partial control, one must for each choice of \(y_2\) and \(u_2\), rearrange the system as in \eqref{eq:partial_control_partitioning} and \eqref{eq:partial_control}, and compute \(P_d\) using \eqref{eq:tight_control_y2}.

+

Measurement Selection for Indirect Control

+

Assume the overall goal is to keep some variable \(y_1\) at a given value \(r_1\), e.g. our objective is to minimize \(J = \|y_1 - r_1\|\). +We assume that we cannot measure \(y_1\), and instead we attempt to achieve our goal by controlling \(y_2\) at a constant value \(r_2\). +For small changes, we may assume linearity and write:

+

\begin{align*} +y_1 &= G_1 u + G_{d1} d\\\
+y_2 &= G_2 u + G_{d2} d +\end{align*}

+

With feedback control of \(y_2\) we get \(y_2 = r_2 + e_2\) where \(e_2\) is the control error. +From the above two equations, we obtain +\[ y_1 = (G_{d1} - G_1 G_2^{-1} G_{d2})d + G_1 G_2^{-1} (r_2 + e_2) \]

+

With \(e_2 = 0\) and \(d = 0\) this gives \(y_1 = G_1 G_2^{-1} r_2\), so \(r_2\) must be chosen such that +\[ r_1 = G_1 G_2^{-1} r_2 \]

+

The control error in the primary output is then

+

\begin{equation} +y_1 - r_1 = \underbrace{(G_{d1} - G_1 G_2^{-1} G_{d2})}_{P_d} d + \underbrace{G_1 G_2^{-1}}_{P_r} e_2 +\end{equation}

+

To minimize \(J\), we should therefore select controlled outputs such that \(\|P_d d\|\) and \(\|P_r e_2\|\) are small. +Note that \(P_d\) depends on the scaling of \(d\) and \(y_1\). +Also the magnitude of \(e_2\) depends on the choice of outputs \(y_2\).

+
+
+

Scale the disturbances \(d\) to be of magnitude 1, and scale the outputs \(y_2\) so that the expected control error \(e_2\) (measurement noise) is of magnitude 1 for each outputs. +Then to minimize the control error for the primary output, \(J = \|y_1 - r_1\|\), we should select sets of controlled outputs which minimizes \(\|[ P_d \ P_r]\|\).

+
+

Decentralized Feedback Control

+

In this section, \(G(s)\) is a square plant which is to be controlled using a diagonal controller (Fig. fig:decentralized_diagonal_control).

+

+
+ Figure 62: Decentralized diagonal control of a \(2 \times 2\) plant
+

Figure 62: Decentralized diagonal control of a \(2 \times 2\) plant

+
+
+ +

The design of decentralized diagonal control systems involves two steps:

+
    +
  1. The choice of pairing (control configuration selection)
  2. +
  3. The design of each controller \(k_i(s)\)
  4. +
+

\[ K(s) = \text{diag}\{k_i(s)\} = \begin{bmatrix} +k_1(s) & & & \\\
+& k_2(s) & & \\\
+& & \ddots & \\\
+& & & k_m(s) +\end{bmatrix} \]

+

Notations for decentralized diagonal control

+

\(G(s)\) denotes a square \(m \times m\) plant with elements \(g_{ij}\). +\(G^{ij}(s)\) denotes the remaining \((m-1) \times (m-1)\) plant obtained by removing row \(i\) and column \(j\) in \(G(s)\). +We introduce: +\[ \tilde{G} \triangleq \text{diag}\{g_{ii}\} = \begin{bmatrix} +g_{11} & & & \\\
+& g_{22} & & \\\
+& & \ddots & \\\
+& & & g_{mm} \\\
+\end{bmatrix} \] +The loop transfer function in loop \(i\) is denoted \(L_i = g_{ii} k_i\).

+

RGA as a Measure of the Interaction for Decentralized Control

+

Let \(u_j\) and \(y_i\) denote a particular input and output for the multivariable plant \(G(s)\) and assume that our task is to use \(u_j\) to control \(y_i\). +There are two extreme cases:

+
    +
  • Other loops open: \(u_k = 0, \forall k \neq j\)
  • +
  • Other loops closed: \(y_k = 0, \forall k \neq i\). +It is assumed that the other loop are closed with perfect control which is a good approximation at frequencies within the bandwidth of each loop
  • +
+

We now evaluate the effect \(\partial y_i / \partial u_j\) for the two cases:

+

\begin{subequations} +\begin{align} +& \left( \frac{\partial y_i}{\partial u_j} \right)_{u_k = 0, k \neq j} = g_{ij} = [G]_{ij}\\\
+& \left( \frac{\partial y_i}{\partial u_j} \right)_{y_k = 0, k \neq i} \triangleq \hat{g}_{ij} = 1/[G^{-1}]_{ji} +\end{align} +\end{subequations}

+

The ratio between the gains corresponding the two extreme cases is a useful measure of interactions and is defined as the \(ij\text{‘th}\) relative gain:

+

\begin{equation} +\tcmbox{\lambda_{ij} \triangleq \frac{g_{ij}}{\hat{g}_{ij}} = [G]_{ij}[G^{-1}]_{ji}} +\end{equation}

+

The Relative Gain Array (RGA) is the corresponding matrix of relative gains:

+

\begin{equation} +\tcmbox{\Lambda(G) = G \times (G^{-1})^T} +\end{equation}

+

where \(\times\) denotes element-by-element multiplication.

+
+
+

Intuitively, we would like to pair variables \(u_j\) and \(y_i\) so that \(\lambda_{ij}\) is close to \(1\), because this means that the gain from \(u_j\) to \(y_i\) is unaffected by closing the other loops. +More precisely, we would like to pair such that the rearranged system, with the pairings along the diagonal, has a RGA matrix close to identity.

+
+

Factorization of Sensitivity Function

+

The magnitude of the off-diagonal elements in \(G\) (the interactions) relative to its diagonal elements are given by the matrix

+

\begin{equation} +E \triangleq (G - \tilde{G})\tilde{G}^{-1} +\end{equation}

+

An important relationship for decentralized control is:

+

\begin{equation} +\tcmbox{\underbrace{(I + G K)}_{\text{overall}} = \underbrace{(I + E \tilde{T})}_{\text{interactions}} \quad \underbrace{(I + \tilde{G} K)}_{\text{individual loops}}} +\end{equation}

+

or equivalently in terms of the sensitivity function:

+

\begin{equation} +\tcmbox{S = \tilde{S} (I + E \tilde{T})^{-1}} +\end{equation}

+

with

+

\begin{align*} +\tilde{S} &\triangleq (I + \tilde{G}K)^{-1} = \text{diag}\left\{\frac{1}{1 + g_{ii} k_i}\right\} \\\
+\tilde{T} &= I - \tilde{S} +\end{align*}

+

which contain the sensitivity and complementary sensitivity functions for the individual loops. +Note that \(\tilde{S}\) is not equal to the matrix of diagonal elements of \(S\).

+

Stability of Decentralized Control Systems

+

Consider a \(m \times m\) plant with single-loop controllers. +There are \(m!\) alternative pairings possible. +Thus tools are needed for quickly evaluating alternative pairings. +In this section, we first derive sufficient conditions for stability which may be used to select promising pairings. +We then derive necessary conditions for stability which may be used to eliminate undesirable pairings.

+
Sufficient conditions for stability
+

For decentralized diagonal control, it is desirable that the system can be tuned and operated one loop at a time. +Assume therefore that \(G\) is stable and each individual loop is stable by itself (\(\tilde{S}\) and \(\tilde{T}\) are stable). +Using the spectral radius condition on the factorized \(S\) in \eqref{eq:S_factorization}, we have that the overall system is stable (\(S\) is stable) if

+

\begin{equation} +\rho(E\tilde{T}(j\omega)) < 1, \forall\omega +\end{equation}

+

Sufficient conditions in terms of \(E\). +Assume \(G\) is stable and that the individual loops are stable (\(\tilde{T}\) is stable). +The least conservative approach is to use \(\rho(E\tilde{T}) \leq \mu(E) \maxsv(\tilde{T})\). +Then the entire system is closed-loop stable (\(T\) is stable) if

+

\begin{equation} +\tcmbox{\maxsv(\tilde{T}) = \max_i |\tilde{t}_i| < 1 / \mu(E) \quad \forall\omega} +\end{equation}

+

\(\mu(E)\) is called the structured singular value interaction measure, and is computed with respect to the diagonal structure of \(\tilde{T}\) where we may view \(\tilde{T}\) as the “design uncertainty”.

+

We usually would like to use integral action in the loops, that is we want \(\tilde{T} \approx I\) at low frequencies, i.e. \(\maxsv(\tilde{T}) \approx 1\). +Thus, we prefer pairings for which we have \(\mu(E) < 1\) at low frequencies where we have tight control. +This ensures a “generalized diagonal dominance”.

+

Sufficient conditions in terms of RGA. +Suppose the plant \(G(s)\) is stable. If the RGA-matrix \(\Lambda(G) = I\ \forall\omega\) (which can only arise for a triangular plant \(G(s)\)), then stability of each of the individual loops implies stability of the entire system.

+

In most cases, it is sufficient for overall stability to require that \(G(j\omega)\) is close to triangular (or \(\Lambda(G) \approx I\)) at crossover frequencies. +This gives the “first pairing rule”.

+
+
+

To achieve stability with decentralized control, prefer pairings such that at frequencies \(\omega\) around crossover, the rearranged matrix \(G(j\omega)\) (with the paired elements along the diagonal) is close to triangular. +This is equivalent to requiring \(\Lambda(G(j\omega)) \approx I\), i.e. the RGA-number \(\|\Lambda(G(j\omega)) - I\|_\text{sum}\) should be small.

+
+
Necessary steady-state conditions for stability
+

A desirable property of a decentralized control system is that it has integrity, i.e. the closed loop system should remain stable as subsystem controllers are brought in and out of service. +Mathematically, the system possesses integrity if it remains stable when the controller \(K\) is replace by \(\mathbb{E}K\) where \(\mathbb{E} = \text{diag}\{\epsilon_i\}, \ \epsilon_i=0,1\).

+

An even stronger requirement is that the system remains stable as the gain in various loops are reduced: \(0 \le \epsilon_i \le 1\).

+
+
+

The plant \(G(s)\) (corresponding to a given pairing with the paired elements along its diagonal) is Decentralized Integral Controllability (DIC) if there exists a stabilizing decentralized controller with integral action in each loop such that each individual loop may be detuned independently by a factor \(\epsilon_1\) (\(0 \le \epsilon_i \le 1\)) without introducing instability.

+
+

Steady-State RGA and DIC. +Consider a stable square plant \(G\) and a diagonal controller \(K\) with integral action in all elements, and assume that the loop transfer function \(GK\) is strictly proper. +If a pairing of outputs and manipulated inputs corresponds to a negative steady-state relative gain, then the closed-loop system has at least one of the following properties:

+
    +
  • The overall closed-loop system is unstable
  • +
  • The loop with the negative relative gain is unstable by itself
  • +
  • The closed-loop system is unstable if the loop with the negative relative gain is opened
  • +
+

This can be summarized as follows:

+
+
+

\begin{equation} +\begin{aligned} +&\text{A stable (reordered) plant } G(s)\\\
+&\text{is DIC only if } \lambda_{ii}(0) \ge 0 \text{ for all } i +\end{aligned} +\end{equation}

+
+

The RGA and RHP-zeros: Further reasons for not pairing on negative RGA elements

+

With decentralized control, we usually design and implement the controller by tuning and closing one loop at a time in a sequential manner. +Assume that we pair on a negative steady-state RGA-element, \(\lambda_{ij}(0) < 0\), assume that \(\lambda_{ij}(\infty)\) is positive, and assume that the element \(g_{ij}\) has no RHP-zero. +We have the following implications:

+
    +
  • If we start by closing the loop involving input \(u_i\) and \(y_j\), then we will get a RHP-zero in \(G^{ij}(s)\) which will limit the performance in the other outputs
  • +
  • If we end by closing this loop, then we will get a RHP-zero in \(\hat{g}_{ij}(s)\) which will limit the performance in output \(y_i\)
  • +
+
+
+

For a stable plant, avoid pairings that corresponds to negative steady-state RGA-elements \(\lambda_{ij}(0) < 0\)

+
+
+
+

\begin{align*} +G(0) &= \begin{bmatrix} +10.2 & 5.6 & 1.4 \\\
+15.5 & -8.4 & -0.7 \\\
+18.1 & 0.4 & 1.8 +\end{bmatrix} \\\
+\Lambda(0) &= \begin{bmatrix} +0.96 & 1.45 & -1.41 \\\
+0.94 & -0.37 & 0.43 \\\
+-0.90 & -0.07 & 1.98 +\end{bmatrix} +\end{align*}

+

For a \(3 \times 3\) plant there are 6 alternative pairings. +From the steady state RGA, we see that there is only one positive element in columns 2, and only positive element in row 3, and therefore there is only on possible pairing if we require DIC: +\[ u_1 \leftrightarrow y_2,\ u_2 \leftrightarrow y_1,\ u_3 \leftrightarrow y_3 \]

+
+
+
+

\begin{align*} +G(s) &= \frac{-s + 1}{(5 s + 1)^2} \begin{bmatrix} +1 & 4 & -26 \\\
+6.2 & 1 & -26 \\\
+1 & 1 & 1 +\end{bmatrix}\\\
+\Lambda(G) &= \begin{bmatrix} +1 & 5 & -5 \\\
+-5 & 1 & 5 \\\
+5 & -5 & 1 +\end{bmatrix} +\end{align*}

+

Only two of the six possible pairings gives positive steady-state RGA-elements: the diagonal pairing on all \(\lambda_{ii} = 1\) or the pairing on all \(\lambda_{ii} = 5\). +Intuitively, one may expect pairing with \(\lambda_{ii} = 1\) since it corresponds to pairing on RGA-elements equal to \(1\). +However, the RGA matrix is far from identify, and the RGA-number \(\| \Lambda - I \|_\text{sum} = 30\) for both alternative. +Thus none of the two alternatives satisfy Pairing Rule 1, and decentralized control should not be used for this plant.

+
+

Performance of Decentralized Control Systems

+

To study performance, we use the following factorization

+

\begin{equation} +S = (I + \tilde{S}(\Gamma - I)^{-1}) \tilde{S} \Gamma +\end{equation}

+

where \(\Gamma\) is the Performance Relative Gain Array (PRGA)

+

\begin{equation} +\tcmbox{\Gamma(s) \triangleq \tilde{G}(s) G^{-1}(s)} +\end{equation}

+

which is a scaled inverse of the plant.

+

At frequencies where feedback is effective (\(\tilde{S} \approx 0\)), \(S \approx \tilde{S} \Gamma\) which shows that \(\Gamma\) is important when evaluating performance with decentralized control.

+

Note that the diagonal elements of the PRGA-matrix are equal to the diagonal elements of the RGA and that the off-diagonal elements of the PRGA depend on the relative scaling on the outputs which is not the case for the RGA.

+

We will also use the related Closed-Loop Disturbance Gain (CLDG) matrix:

+

\begin{equation} +\tcmbox{\tilde{G}_d(s) \triangleq \Gamma(s)G_d(s) = \tilde{G}(s) G^{-1}(s) G_d(s)} +\end{equation}

+

which depends on both output and disturbance scaling.

+

Suppose the system has been scaled such that:

+
    +
  • Each disturbance magnitude is less than \(1\), \(|d_k| < 1\)
  • +
  • Each reference change is less than the corresponding diagonal element in \(R\), \(|r_j| < R_j\)
  • +
  • For each output the acceptable control error is less than \(1\), \(|e_i| < 1\)
  • +
+
Single disturbance
+

Consider a single disturbance, in which case \(G_d\) is a vector, and let \(g_{di}\) denote the \(i\text{‘th}\) element of \(G_d\). +Let \(L_i = g_{ii} k_i\) denote the loop transfer function in loop \(i\). +Consider frequencies where feedback is effective so \(\tilde{S}\Gamma\) is small. +Then for acceptable disturbance rejection (\(|e_i| < 1\)) we must with decentralized control required for each loop \(i\)

+

\begin{equation} +\tcmbox{|1 + L_i| > |\tilde{g}_{di}| \quad \forall i} +\end{equation}

+

which is the same as the SISO-condition except that \(G_d\) is replaced by the CLDG. +In words, \(\tilde{g}_{di}\) gives the “apparent” disturbance gain as seen from the loop \(i\) when the system is controlled using decentralized control.

+
Single reference change
+

Consider a change in reference for output \(j\) of magnitude \(R_j\). +Consider frequencies where feedback is effective. +Then for acceptable reference tracking (\(|e_i|<1\)) we must require for each loop \(i\)

+

\begin{equation} +\tcmbox{|1 + L_i| > |\gamma_{ij}| \cdot |R_j| \quad \forall i} +\end{equation}

+

which is the same as the SISO-condition except for the PRGA-factor \(|\gamma_{ij}|\).

+

Consequently, for performance it is desirable to have small elements in \(\Gamma\), at least at frequencies where feedback is effective. +However, at frequencies close to crossover, stability is the main issue and since the diagonal elements of the PRGA and RGA are equal, we usually prefer to have \(\gamma_{ii}\) close to \(1\).

+

Summary: Controllability Analysis for Decentralized Control

+

When considering decentralized diagonal control of a plant, one should first check that the plant is controllable with any controller. +The next step is to compute the RGA matrix as a function of frequency, and to determine if one can find a good set of input-output pairs bearing in mind the following:

+
    +
  1. Prefer pairings which have the RGA-matrix close to identity at frequencies around crossover, i.e. the RGA-number \(\|\Lambda(j\omega)-I\|\) should be small
  2. +
  3. Avoid a pairing \(ij\) with negative steady-state RGA elements \(\lambda_{ij}(G(0)\)
  4. +
  5. Prefer a pairing \(ij\) where \(g_{ij}(s)\) puts minimal restrictions on the achievable bandwidth. +Specifically, the frequency \(\omega_{uij}\) where \(\angle g_{ij}(j\omega_{uij}) = \SI{-180}{\degree}\) should be as large as possible +This rule favors parings on variables “close to each other”
  6. +
+

When a reasonable choice of pairings have been made, one should rearrange \(G\) to have the paired elements along the diagonal and perform a controllability analysis:

+
    +
  1. Compute the CLDG and PRGA, and plot these as a function of frequency
  2. +
  3. For systems with many loops, it is best to perform the analysis one loop at the time, that is, for each loop \\(i\\), plot \\(|\tilde{g}\_{dik}|\\) for each disturbance \\(k\\) and plot \\(|\gamma\_{ij}|\\) for each reference \\(j\\). +For performance, we need \\(|1 + L\_i|\\) to be larger than each of these: +

    \begin{equation} +|1 + L_i| > \max_{k,j}\{|\tilde{g}_{dik}|, |\gamma_{ij}|\} +\end{equation}

    +

    To achieve stability of the individual loops, one must analyze \(g_{ii}(s)\) to ensure that the bandwidth required by \eqref{eq:decent_contr_one_loop} is achievable. +Note that RHP-zeros in the diagonal elements may limit achievable decentralized control, whereas they may not pose any problems for a multivariable controller. +Since with decentralized control, we usually want to use simple controllers, the achievable bandwidth in each loop will be limited by the frequency where \(\angle g_{ii}\) is \(\SI{-180}{\degree}\)

  4. +
  5. Check for constraints by considering the elements of \\(G^{-1} G\_d\\) and make sure that they do not exceed one in magnitude within the frequency range where control is needed. +Equivalently, one may for each loop \\(i\\), plot \\(|g\_{ii}|\\) and the requirement is then that +

    \begin{equation} +|g_{ii}| > |\tilde{g}_{dik}| \quad \forall k +\end{equation}

    +

    at frequencies where \(|\tilde{g}_{dik}|\) is larger than \(1\). +This provides a direct generalization of the requirement \(|G| > |G_d|\) for SISO systems.

  6. +
+

If the plant is not controllable, then one may consider another choice of pairing and go back to Step 4. +If one still cannot find any pairing which are controllable, then one should consider multivariable control.

+
    +
  1. If the chosen pairing is controllable, then \eqref{eq:decent_contr_one_loop} tells us how large \\(|L\_i| = |g\_{ii} k\_i|\\) must be. +This can be used as a basis for designing the controller \\(k\_i(s)\\) for loop \\(i\\)
  2. +
+

Sequential Design of Decentralized Controllers

+

Usually the local controllers \(k_i(s)\) are designed locally and then all the loops are closed. +One problem with this is that the interactions may cause the overall system \(T\) so be unstable, even though the local loops \(\tilde{T}\) are stable. +This will not happen if the plant is diagonally dominant, such that we satisfy, for example \(\maxsv(\tilde{T}) < 1/\mu(E)\).

+

The stability problem is avoided if the controllers are designed sequentially when, for example, the bandwidths of the loops are quite different. +In this case, the outer loops are tuned with the inner loops in place, and each step may be considered as a SISO control problem. +In particular, overall stability is determined by \(m\) SISO stability conditions. +However, the issue of performance is more complicated because the closing of a loop may cause “disturbances” (interactions) into a previously designed loop. +The engineer must then go back and redesign a loop that has been designed earlier. +Thus sequential design may involve many iterations.

+

Conclusion on Decentralized Control

+

A number of conditions for the stability, e.g. \eqref{eq:decent_contr_cond_stability} and \eqref{eq:decent_contr_necessary_cond_stability}, and performance, e.g. \eqref{eq:decent_contr_cond_perf_dist} and \eqref{eq:decent_contr_cond_perf_ref}, of decentralized control systems have been derived.

+

The conditions may be useful in determining appropriate pairings of inputs and outputs and the sequence in which the decentralized controllers should be designed.

+

The conditions are also useful in an input-output controllability analysis for determining the viability of decentralized control.

+

Model Reduction

+

+

Introduction

+

Modern controller design methods such as \(\mathcal{H}_\infty\) and LQG, produce controllers of order at least equal to that of the plant, and usually higher because of the inclusion of weights. +These control laws may be too complex with regards to practical implementation and simpler designs are then sought. +For this purpose, one can either reduce the order of the plant model prior to controller design, or reduce the controller in the final stage.

+
+
+

Given a high-order linear time-invariant stable model \(G\), find a low-order approximation \(G_a\) such that the infinity (\(\mathcal{H}_\infty\) or \(\mathcal{L}_\infty\)) norm of the difference \(\|G - G_a\|_\infty\) is small.

+
+

By model order, we mean the dimension of the state vector in a minimal realization. +This is sometimes called the McMillan degree.

+

So far we have only been interested in the infinity (\(\mathcal{H}_\infty\)) norm of stable systems. +But the error \(G-G_a\) may be unstable and the definition of the infinity norm needs to be extended to unstable systems.

+
+
+

\(\mathcal{L}_\infty\) defines the set of rational functions which have no poles on the imaginary axis, it includes \(\mathcal{H}_\infty\), and its norm (like \(\mathcal{H}_\infty\)) is given by

+

\begin{equation} +\|G\|_\infty = \sup_\omega \maxsv(G(j\omega)) +\end{equation}

+
+

We will describe three main methods for this problem:

+
    +
  • Balanced truncation
  • +
  • Balanced residualization
  • +
  • Optimal Hankel norm approximation
  • +
+

Each method gives a stable approximation and a guaranteed bound on the error in the approximation. +We will further show how the methods can be employed to reduce the order of an unstable model \(G\).

+

All these methods start from a special state-space realization of \(G\) referred to as balanced. +We will describe this realization, but first we will show how the techniques of truncation and residualization can be used to remove the high frequency or fast modes of a state-space realization.

+

Truncation and Residualization

+

Let \((A,B,C,D)\) be a minimal realization of a stable system \(G(s)\), and partition the state vector \(x\), of dimension \(n\), into \(\colvec{x_1 \ x_2}\) where \(x_2\) is the vector of \(n-k\) states we wish to remove. +With approximate partitioning of \(A\), \(B\) and \(C\), the state space equations become

+

\begin{equation} +\begin{aligned} +\dot{x}_1 &= A_{11} x_1 + A_{12} x_2 + B_1 u \\\
+\dot{x}_2 &= A_{21} x_1 + A_{22} x_2 + B_2 u \\\
+y &= C_1 x_1 + C_2 x_2 + D u +\end{aligned} +\end{equation}

+

Truncation

+

A k-th order truncation of the realization \(G \triangleq (A, B, C, D)\) is given by \(G_a \triangleq (A_{11}, B_1, C_1, D)\). +The truncated model \(G_a\) is equal to \(G\) at infinite frequency \(G(\infty) = G_a(\infty) = D\), but apart from this, we cannot say anything for the general case about the relationship between \(G\) and \(G_a\).

+

If however, \(A\) is in Jordan form, then it is easy to order the states so that \(x_2\) corresponds to high frequency or fast modes.

+ +

For simplicity, assume that \(A\) has been diagonalized so that

+

\begin{align*} +A &= \begin{bmatrix} +\lambda_1 & 0 & \dots & 0 \\\
+0 & \lambda_2 & \dots & 0 \\\
+\vdots & \vdots & \ddots & \vdots \\\
+0 & 0 & \dots & \lambda_n \\\
+\end{bmatrix},\quad B = \begin{bmatrix} +b_1^T \ b_2^T \ \vdots \ b_n^T +\end{bmatrix} \\\
+C &= \begin{bmatrix} +c_1, c_2, \dots, c_n +\end{bmatrix} +\end{align*}

+

Then, if the \(\lambda_i\) are ordered so that \(|\lambda_1| < |\lambda_2| < \dots\), the fastest modes are removed from the model after truncation. +The difference between \(G\) and \(G_a\) following a k-th order model truncation is given by +\[ G - G_a = \sum_{i = k+1}^n \frac{c_i b_i^T}{s - \lambda_i} \] +and therefore

+

\begin{equation} +\| G - G_a \|_\infty \le \sum_{i = k+1}^n \frac{\maxsv(c_i b_i^t)}{|\text{Re}(\lambda_i)|} +\end{equation}

+

It is interesting to note that the error depends on the residues \(c_i b_i^T\) as well as the \(\lambda_i\). +The distance of \(\lambda_i\) from the imaginary axis is therefore not a reliable indicator of whether the associated mode should be included in the reduced order model or not.

+

An advantage of modal truncation is that the poles of the truncated model are a subset of the poles of the original model and therefore retain any physical interpretation they might have.

+

Residualization

+

In truncation, we discard all the states and dynamics associated with \(x_2\). +Suppose that instead of this, we simply set \(\dot{x}_2 = 0\), i.e. we residualize \(x_2\), in the state-space equations. +One can then solve for \(x_2\) in terms of \(x_1\) and \(u\), and back substitution of \(x_2\), then gives

+

\begin{align*} +\dot{x}_1 &= (A_{11} - A_{12} A_{22}^{-1} A_{21}) x_1 + (B_1 - A_{12} A_{22}^{-1} B_2) u \\\
+y &= (C_1 - C_2 A_{22}^{-1} A_{21}) x_1 + (D - C_2 A_{22}^{-1} B_2) u +\end{align*}

+

And let assume \(A_{22}\) is invertible and define

+

\begin{alignat*}{3} +&A_r \triangleq A_{11} - A_{12}A_{22}^{-1}A_{21} & & \quad B_r \triangleq B_1 - A_{12}A_{22}^{-1}B_2\\\
+&C_r \triangleq C_1 - C_2A_{22}^{-1}A_{21} & & \quad D_r \triangleq D - C_2A_{22}^{-1}B_2 +\end{alignat*}

+

The reduced order model \(G_a(s) = (A_r, B_r, C_r, D_r)\) is called a residualization of \(G(s) = (A, B, C, D)\). +Usually \((A, B, C, D)\) will have been put into Jordan form, with the eigenvalues ordered so that \(x_2\) contains the fast modes.

+

Model reduction by residualization is then equivalent to singular perturbation approximation, where the derivatives of the fastest states are allowed to approach zero with some parameter \(\epsilon\).

+

An important property of residualization is that it preserves the steady-state gain of the system:

+

\begin{equation} +\tcmbox{G_a(0) = G(0)} +\end{equation}

+

This should be no surprise since the residualization process sets derivatives to zero, which are zero anyway at steady-state. +But it is in stark contrast to truncation which retains the system behavior at infinite frequency. +This contrast between truncation and residualization follows from the simple bilinear relationship \(s \to \frac{1}{s}\) which relates the two.

+

It is clear that truncation is to be preferred when accuracy is required at high frequencies, whereas residualization is better for low frequency modelling.

+

Both methods depend to a large extent on the original realization and we have suggested to use of the Jordan form. +A better realization, with many useful properties, is the balanced realization.

+

Balanced Realization

+

A balanced realization is an asymptotically stable minimal realization in which the controllability and observability Gramiams are equal and diagonal.

+

Let \((A,B,C,D)\) be a minimal realization of a stable, rational transfer function \(G(s)\), then \((A,B,C,D)\) is called balanced if the solutions to be following Lyapunov equations

+

\begin{subequations} +\begin{align} +AP + PA^T + BB^T &= 0 \\\
+A^TQ + QA + C^TC &= 0 +\end{align} +\end{subequations}

+

are \(P = Q = \text{diag}(\sigma_1, \sigma_2, \dots, \sigma_n) \triangleq \Sigma\), where \(\sigma_1 \ge \sigma_2 \ge \dots \ge \sigma_n > 0\). +\(P\) and \(Q\) are the controllability and observability Gramiams, also defined by

+

\begin{subequations} +\begin{align} +P &\triangleq \int_0^\infty e^{At} B B^T e^{A^Tt} dt \\\
+Q &\triangleq \int_0^\infty e^{A^Tt} C^T C e^{At} dt +\end{align} +\end{subequations}

+

\(\Sigma\) is therefore simply referred to as the Gramiam of \(G(s)\). +The \(\sigma_i\) are the ordered Hankel singular values of \(G(s)\), more generally defined as \(\sigma_i \triangleq \lambda_i^{\frac{1}{2}}(PQ)\), \(i = 1, \dots, n\). +Notice that \(\sigma_1 = \|G\|_H\) is the Hankel norm of \(G(s)\).

+

In balanced realization the value of each \(\sigma_i\) is associated with a state \(x_i\) of the balanced system.

+
+
+

The size of \(\sigma_i\) is a relative measure of the contribution that \(x_i\) makes to the input-output behavior of the system.

+
+

Therefore if \(\sigma_1 \gg \sigma_2\), then the state \(x_1\) affects the input-output behavior much more than \(x_2\), or indeed any other state because of the ordering of the \(\sigma_i\).

+

After balancing a system, each state is just as controllable as it is observable, and a measure of a state’s joint observability and controllability is given by its associated Hankel singular value. +This property is fundamental to the model reduction methods in the remainder of this chapter which work by removing states having little effect on the system’s input-output behavior.

+

Balanced Truncation and Balanced Residualization

+

Let the balanced realization \((A,B,C,D)\) of \(G(s)\) and the corresponding \(\Sigma\) be partitioned compatibly as

+

\begin{equation} +\begin{aligned} +A &= \begin{bmatrix} +A_{11} & A_{12} \\\
+A_{21} & A_{22} +\end{bmatrix}, \quad B = \begin{bmatrix} +B_1 \ B_2 +\end{bmatrix} \\\
+C &= \begin{bmatrix} +C_1 & C_2 +\end{bmatrix}, \quad \Sigma = \begin{bmatrix} +\Sigma_1 & 0 \\\
+0 & \Sigma_2 +\end{bmatrix} +\end{aligned} +\end{equation}

+

where

+

\begin{align*} +\Sigma_1 &= \text{diag}(\sigma_1, \sigma_2, \dots, \sigma_k)\\\
+\Sigma_2 &= \text{diag}(\sigma_{k+1}, \sigma_{k+2}, \dots, \sigma_n),\ \sigma_k > \sigma_{k+1} +\end{align*}

+
Balanced Truncation
+

The reduced order model given by \((A_{11},B_1,C_1,D)\) is called a balanced truncation of the full order system \(G(s)\). +The idea of balancing truncation is thus to first make a balanced realization of the system and then to discard the states corresponding to small Hankel singular values.

+

A balanced truncation is also a balanced realization, and the infinity norm of the error between \(G(s)\) and the reduced order system \(G_a(s)\) is bounded by twice the sum of the last \(n-k\) Hankel singular values, i.e. twice the trace of \(\Sigma_2\):

+

\begin{equation} +\|G(s) - G_a(s)\|_\infty \le 2 \cdot \text{Tr}\big( \Sigma_2 \big) +\end{equation}

+

For the case of repeated Hankel singular values, each repeated Hankel singular value is to be counted only once in calculating the sum.

+

Useful algorithms that compute balanced truncations without first computing a balanced realization still require the computation of the observability and controllability Gramiam, which can be a problem if the system to be reduced is of very high order.

+
Balanced Residualization
+

In balanced truncation above, we discarded the least controllable and observable states corresponding to \(\Sigma_2\). +In balanced residualization, we simply set to zero the derivatives of all these states.

+
Theorem
+

Let \(G(s)\) be a stable rational transfer function with Hankel singular values \(\sigma_1 > \sigma_2 > \dots > \sigma_N\) where each \(\sigma_i\) has multiplicity \(r_i\) and let \(G_a^k(s)\) be obtained by truncating or residualizing the balanced realization of \(G(s)\) to the first \((r_1 + r_2 + \dots + r_k)\) states. +Then

+

\begin{equation} +\|G(s) - G_a^k(s)\|_\infty \le 2(\sigma_{k+1} + \sigma_{k+2} + \dots + \sigma_N) +\end{equation}

+

Optimal Hankel Norm Approximation

+

In this approach to model reduction, the problem that is directly addressed is the following: given a stable model \(G(s)\) of order \(n\), find a reduced order model \(G_h^k(s)\) of degree \(k\) such that the Hankel norm of the approximation error, \(\| G(s) - G_h^k(s) \|_H\), is minimized.

+
+
+

The Hankel norm of any stable transfer function \(E(s)\) is defined as

+

\begin{equation} +\| E(s) \|_H \triangleq \rho^{\frac{1}{2}} (PQ) +\end{equation}

+

where \(P\) and \(Q\) are the controllability and observability Gramiams of \(E(s)\).

+
+

So in the optimization we seek an error which is in some sense closest to being completely unobservable and completely uncontrollable.

+

The infinity norm bound on the approximate error for the optimal Hankel norm approximation is better than for balanced truncation and residualization. This is shown with the following theorem.

+
Theorem
+

Let \(G(s)\) be a stable, square, transfer function \(G(s)\) with Hankel singular values \(\sigma_1 \ge \sigma_2 \ge \dots \ge \sigma_k \ge \sigma_{k+1} = \sigma_{k+2} = \dots = \sigma_{k+l} > \sigma_{k+l+1} \ge \dots \ge \sigma_n > 0\). +An optimal Hankel norm approximation of order \(k\), \(G_h^k(s)\), can be constructed as follows.

+

Let \((A,B,C,D)\) be a balanced realization of \(G(s)\) with the Hankel singular values reordered so that the Gramiam matrix is

+

\begin{align*} +\Sigma &= \text{diag}(\sigma_1,\dots,\sigma_k,\sigma_{k+l+1},\dots,\sigma_n,\sigma_{k+1},\dots,\sigma_{k+l})\\\
+&\triangleq \text{diag}(\Sigma_l, \sigma_{k+1}I) +\end{align*}

+

Partition \((A,B,C,D)\) to conform with \(\Sigma\) +\[ A = \begin{bmatrix} A_{11} & A_{12} \ A_{21} & A_{22} \end{bmatrix},\ B = \begin{bmatrix} B_1 \ B_2 \end{bmatrix},\ C = \begin{bmatrix} C_1 & C_2 \end{bmatrix} \] +Define \((\hat{A},\hat{B},\hat{C},\hat{D})\) by

+

\begin{subequations} +\begin{align} +\hat{A} &\triangleq \Gamma^{-1} \left( \sigma_{k+1}^2 A_{11}^T + \sigma_1 A_{11} \Sigma_1 - \sigma_{k+1} C_{1}^T U B_{1}^T \right) \\\
+\hat{B} &\triangleq \Gamma^{-1} \left( \sigma_1 B_1 + \sigma_{k+1} C_1^T U \right) \\\
+\hat{C} &\triangleq C_1 \Sigma_1 + \sigma_{k+1} U B_1^T \\\
+\hat{D} &\triangleq D - \sigma_{k+1} U +\end{align} +\end{subequations}

+

where \(U\) is a unitary matrix satisfying +\[ B_2 = - C_2^T U \ \text{ and } \ \Gamma \triangleq \Sigma_1^2 - \sigma_{k+1}^2 I \]

+

The matrix \(\hat{A}\) has \(k\) “stable” eigenvalues; the remaining ones are in the open right-half plane. +Then +\[ G_h^k(s) + F(s) = \left[ \begin{array}{c|cc} +\hat{A} & \hat{B} \ \hline +\hat{C} & \hat{D} +\end{array} \right] \] +where \(G_h^k(s)\) is a stable optimal Hankel norm approximation of order \(k\), and \(F(s)\) is an anti-stable (all poles in the open right-half plane) transfer function of order \(n-k-l\). +The Hankel norm of the error between \(G\) and the optimal approximation \(G_h^k\) is equal to the \((k+1)\text{‘th}\) Hankel singular value of \(G\):

+

\begin{equation} +\tcmbox{\| G - G_h^k \|_H = \sigma_{k+1}(G)} +\end{equation}

+

Model Reduction - Practical Summary

+

Reduction of model

+

Three reduction techniques have been discussed here: balanced residualization, balance truncation and optimal Hankel norm approximation.

+

It is sometimes desirable to have the steady-state gain of the reduced plant model the same as the full order model. +For instance, this is the case if we want to use feedforward control. +The truncated and optimal Hankel norm approximated systems do not preserve the steady-state gain and they have to be scaled, i.e. the model approximation \(G_a\) is replaced by \(G_a W_s\) where \(W_a = G_a(0)^{-1} G(0)\), \(G(s)\) being the full order model.

+

However, this scaling generally introduced large model errors at other frequencies.

+
+
+

Hence residualization is to be preferred whenever low frequency matching is desired.

+
+

Reduction of a 2 degrees-of-freedom controller

+

Let’s consider a 2 degrees-of-freedom controller \(K = [K_1\ K_2]\). +In order ensure perfect steady-state tracking, i.e. to match \(T_{\text{ref}}\) at steady-state, a prefilter \(W_i\) is added to scale the controller: \(K = [K_1 W_i\ K_2]\).

+

There are two approaches for order reduction:

+
    +
  1. the scaled controller \([K_1 W_i\ K_2]\) is reduced. +A balanced residualization of the controller preserves the controller’s steady state gain and would not need to be scaled again. +Reductions via truncation and optimal Hankel norm approximation techniques, however, lose the steady-state gain and reduced controllers would need to be re-scaled to match \(T_{\text{ref}}(0)\)
  2. +
  3. the full order controller \([K_1\ K_2]\) is reduced without first scaling the prefilter. +In which case, scaling is done after reduction. +A larger scaling is generally required for the truncated and optimal Hankel norm approximated controllers and this gives poorer model matching at other frequencies.
  4. +
+

In both cases, the balanced residualization is preferred.

+

Reduction of Unstable Models

+

Balanced truncation, balanced residualization and optimal Hankel norm approximation only apply to stable models. +In this section we briefly present two approaches for reducing the order of an unstable model.

+

Stable Part Model Reduction

+

The unstable model can be first decomposed into its stable and anti-stable parts:

+

\begin{equation} +G(s) = G_u(s) + G_s(s) +\end{equation}

+

where \(G_u(s)\) has all its poles in the closed right-half plane and \(G_s(s)\) has all its poles in the open left-half plane. +Balanced truncation, balanced residualization or optimal Hankel norm approximation can then be applied to the stable part \(G_s(s)\) to find a reduced order approximation \(G_{sa}(s)\). +This is then added to the anti-stable part to give

+

\begin{equation} +G_a(s) = G_u(s) + G_{sa}(s) +\end{equation}

+

as an approximation to the full order model \(G(s)\).

+

Coprime Factor Model Reduction

+

The coprime factors of a transfer function \(G(s)\) are stable, and therefore we could reduce the order of these factors using balanced truncation, balanced residualization or optimal Hankel norm approximation:

+
    +
  • Let \(G(s) = M^{-1}(s) N(s)\), where \(M(s)\) and \(N(s)\) are stable left-coprime factors of \(G(s)\)
  • +
  • Approximate \([N\ M]\) of degree \(n\) by \([N_a \ M_a]\) of degree \(k<n\), using balanced truncation, balanced residualization or optimal Hankel norm approximation
  • +
  • Realize the reduced order transfer function \(G_a(s)\), or degree \(k\), by \(G_a(s) = M_a^{-1}(s) N_a(s)\)
  • +
+
Theorem
+

Let \((N,M)\) be a normalized left-coprime factorization of \(G(s)\) of degree \(n\). +Let \([N_a,\ M_a]\) be a degree \(k\) balanced truncation of \([N\ M]\) which has Hankel singular values \(\sigma_1 \ge \sigma_2 \ge \dots \ge \sigma_k \ge \sigma_{k+1} \ge \dots \ge \sigma_n > 0\). +Then \((N_a, M_a)\) is a normalized left-coprime factorization of \(G_a = M_a^{-1} N_a\), and \([N_a,\ M_a]\) has Hankel singular values \(\sigma_1, \sigma_2, \dots, \sigma_k\).

+

Conclusion

+

We have presented and compared three main methods for model reduction based on balanced realizations: balanced truncation, balanced residualization and optimal Hankel norm approximation.

+

Residualization, unlike truncation and optimal Hankel norm approximation, preserves the steady-state gain of the system, and like truncation, it is simple and computationally inexpensive. +It is observed that truncation and optimal Hankel norm approximation perform better at high frequencies, where residualization performs better at low and medium frequencies, i.e. up to the critical frequencies.

+

Thus for plant model reduction, where models are not accurate at high frequencies to start with, residualization would seem to be a better option. +Further, if the steady state gains are to be kept unchanged, truncated and optimal Hankel norm approximated systems require scaling, which may result in large errors. +In such a case, too, residualization would be preferred choice.

+

For controller reduction, we have shown in a two degrees-of-freedom example, the importance of scaling and steady-state gain matching.

+

In general, steady-state gain matching may not be crucial, but the matching should usually be good near the desired closed-loop bandwidth. +Balanced residualization has been seen to perform close to the full order system in this frequency range. +Good approximation at high frequencies may also sometimes be desired. +In such a case, using truncation or optimal Hankel norm approximation with appropriate frequency weightings may yield better results.

+

Bibliography

+

Skogestad, S., & Postlethwaite, I., Multivariable feedback control: analysis and design (2007), : John Wiley.

+ +
+
+
+
+
+ +
+ + + + +
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + diff --git a/public/book/taghirad13_paral/index.html b/public/book/taghirad13_paral/index.html new file mode 100644 index 0000000..4b29acb --- /dev/null +++ b/public/book/taghirad13_paral/index.html @@ -0,0 +1,2277 @@ + + + + + + Parallel robots : mechanics and control - My digital brain + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+
+ +
+ + +
+
+
+
+
+
+
Tags
+
Stewart Platforms, Reference Books
+
Reference
+
(Taghirad, 2013)
+
Author(s)
+
Taghirad, H.
+
Year
+
2013
+
+

Introduction

+

+

This book is intended to give some analysis and design tools for the increase number of engineers and researchers who are interested in the design and implementation of parallel robots. +A systematic approach is presented to analyze the kinematics, dynamics and control of parallel robots. +To define the motion characteristics of such robots, it is necessary to represent 3D motion of the robot moving platform with respect to a fixed coordinate. +This issue leads to the requirements for 3D representation of position, orientation and motion of bodies in space. +In chapter sec:motion_representation, such representation are introduced with emphasis on screw coordinates, which makes the representation of the general motion of the robot much easier to follow.

+

Kinematic analysis refers to the study of robot motion geometry without considering the forces and torques that cause the motion. +In this analysis (chapter sec:kinematics), the relation between the geometrical parameters of the manipulator and the final motion of the moving platform is derived and analyzed.

+

In Chapter sec:jacobian, the kinematics analysis of robot manipulators is further examined beyond static positioning. +Jacobian analysis not only reveals the relation between the joint variable velocities of a parallel manipulator and the moving platform linear and angular velocities, but also constructs the transformation needed to find the actuator forces from the forces and moments acting on the moving platform. +A systematic means to perform Jacobian analysis of parallel manipulators is given in this chapter.

+

Dynamic analysis of parallel manipulators presents an inherent complexity due to their closed-loop structure and kinematic constraints. +Nevertheless, dynamic modeling is quite important for the control, in particular because parallel manipulators are preferred in applications where precise positioning and suitable dynamic performance under high loads are the prime requirements. +In Chapter sec:dynamics, the dynamic analysis of such robots is examined through three methods, namely the Newton-Euler principle of virtual work and Lagrange formations. +Furthermore, a method is presented in this chapter to formulate the dynamic equation of parallel robots into closed form, by which the dynamic matrices are more tractable, and dynamics verification becomes feasible.

+

The control of parallel robots is elaborated in the last two chapters, in which both the motion and force control are covered.

+

Motion Representation

+

+

Spatial Motion Representation

+

Six independent parameters are sufficient to fully describe the spatial location of a rigid body.

+

Consider a rigid body in a spatial motion as represented in Figure fig:rigid_body_motion. +Let us define:

+
    +
  • A fixed reference coordinate system \((x, y, z)\) denoted by frame \(\{\bm{A}\}\) whose origin is located at point \(O_A\)
  • +
  • A moving coordinate system \((u, v, z)\) denoted by frame \(\{\bm{B}\}\) attached to the rigid body at point \(O_B\)
  • +
+

The absolute position of point \(P\) of the rigid body can be constructed from the relative position of that point with respect to the moving frame \(\{\bm{B}\}\), and the position and orientation of the moving frame \(\{\bm{B}\}\) with respect to the fixed frame \(\{\bm{A}\}\).

+

+
+ Figure 1: Representation of a rigid body spatial motion
+

Figure 1: Representation of a rigid body spatial motion

+
+
+ +

Position of a point

+

The position of a point \(P\) with respect to a frame \(\{\bm{A}\}\) can be described by a \(3 \times 1\) position vector. +The name of the frame is usually added as a leading superscript: \({}^A\bm{P}\) which reads as vector \(\bm{P}\) in frame \(\{\bm{A}\}\).

+

\begin{equation} +\tcmbox{{}^A\bm{P} = \begin{bmatrix} P_x\ P_y\ P_z \end{bmatrix}} +\end{equation}

+

Orientation of a Rigid Body

+

The orientation of the whole rigid body is the same for all its points (by definition). +Hence, representation of the orientation of a rigid body can be viewed as that for the orientation of a moving frame attached to the rigid body. +It can be represented in several different ways: the rotation matrix, the screw axis representation and Euler angles are common descriptions.

+
Rotation Matrix
+

We consider a rigid body that has been exposed to a pure rotation. +Its orientation has changed from a state represented by frame \(\{\bm{A}\}\) to its current orientation represented by frame \(\{\bm{B}\}\) (Figure 2).

+

A \(3 \times 3\) rotation matrix \({}^A\bm{R}_B\) is defined by

+

\begin{equation} +\tcmbox{{}^A\bm{R}_B = \left[ {}^A\hat{\bm{x}}_B | {}^A\hat{\bm{y}}_B | {}^A\hat{\bm{z}}_B \right] = \begin{bmatrix} +u_{x} & v_{x} & z_{x} \\\
+u_{y} & v_{y} & z_{y} \\\
+u_{z} & v_{z} & z_{z} +\end{bmatrix}} +\end{equation}

+

in which \({}^A\hat{\bm{x}}_B, {}^A\hat{\bm{y}}_B\) and \({}^A\hat{\bm{z}}_B\) are the Cartesian unit vectors of frame \(\{\bm{B}\}\) represented in frame \(\{\bm{A}\}\).

+

\begin{align*} +{}^A\hat{\bm{x}}_B &= {}^A\hat{u} = u_x \hat{i} + u_y \hat{j} + u_z \hat{k} \\\
+{}^A\hat{\bm{y}}_B &= {}^A\hat{v} = v_x \hat{i} + v_y \hat{j} + v_z \hat{k} \\\
+{}^A\hat{\bm{z}}_B &= {}^A\hat{w} = w_x \hat{i} + w_y \hat{j} + w_z \hat{k} +\end{align*}

+

The nine elements of the rotation matrix can be simply represented as the projections of the Cartesian unit vectors of frame \(\{\bm{B}\}\) on the unit vectors of frame \(\{\bm{A}\}\).

+

+
+ Figure 2: Pure rotation of a rigid body
+

Figure 2: Pure rotation of a rigid body

+
+
+ +

The rotation matrix has a number of properties linking each of its nine elements:

+
    +
  • Orthonormality: the rotation matrix is an orthonormal matrix
  • +
  • Transposition: \({}^B\bm{R}_A = {}^A\bm{R}_B^{T}\)
  • +
  • Inverse: \({}^B\bm{R}_A = {}^A\bm{R}_B^{-1} = {}^A\bm{R}_B^{T}\)
  • +
  • Pure Rotation Mapping: Suppose that the point of a rigid body with respect to the moving frame \(\{\bm{B}\}\) is given and denoted by \({}^B\bm{P}\) and we wish to express the position of this point with respect to the fixed frame \(\{\bm{A}\}\). Consider that the rigid body has been exposed to a pure rotation (\(\{\bm{A}\}\) and \(\{\bm{B}\}\) are coincident at their origins). Then +\[ \tcmbox{{}^A\bm{P} = {}^A\bm{R}_B {}^B\bm{P}} \]
  • +
  • Determinant: \(\det({}^A\bm{R}_B) = 1\)
  • +
  • Eigenvalues: The eigenvalues of a rotation matrix \({}^A\bm{R}_B\) are equal to \(1\), \(e^{i\theta}\) and \(e^{-i\theta}\) where \(\theta\) is calculated from \(\theta = \cos^{-1}\frac{\text{tr}({}^A\bm{R}_B) - 1}{2}\).
  • +
+
Screw Axis Representation
+

As seen previously, there exist an invariant angle \(\theta\) corresponding to the rotation matrix. This angle is an equivalent angle of rotation. +The rotation is a spatial change of orientation about an axis which is called the screw axis. +It can be shown that this screw axis is also an invariant of the rotation matrix, it is the eigenvector corresponding to the eigenvalue \(\lambda = 1\).

+

The term screw axis for this axis of rotation has the benefit that a general motion of a rigid body, which is composed as a pure translation and a pure rotation, can be further represented by the same axis of rotation.

+

The screw axis representation has the benefit of using only four parameters to describe a pure rotation. +These parameters are the angle of rotation \(\theta\) and the axis of rotation which is a unit vector \({}^A\hat{\bm{s}} = [s_x, s_y, s_z]^T\).

+

+
+ Figure 3: Pure rotation about a screw axis
+

Figure 3: Pure rotation about a screw axis

+
+
+ +

The Rodrigue’s rotation formula for spatial rotation of a rigid body gives us the new position \(\bm{P}_2\) of point \(\bm{P}_1\) after a rotation represented by the screw axis \(\hat{\bm{s}}\) and the angle \(\theta\):

+

\begin{equation} +\tcmbox{\bm{P}_2 = \bm{P}_1 \cos \theta + (\hat{\bm{s}} \times \bm{P}_1)\sin\theta + (\bm{P}_1 \cdot \hat{\bm{s}})\hat{\bm{s}}} +\end{equation}

+
Euler Angles
+

Since rotation in space is a motion with three-degrees-of-freedom, a set of three independent parameters is sufficient to represent the orientation.

+

In an Euler angle representation, three successive rotations about the coordinate system of either fixed or moving frame are used to describe the orientation of the rigid body.

+

One type of Euler angle corresponds to rotations considered with respect to the fixed frame. The representation is called pitch-roll-yaw, or fixed X-Y-Z Euler angles.

+

Three other types of Euler angles are consider with respect to a moving frame: they are denoted \(w-v-u\), \(w-v-w\) and \(w-u-w\) Euler angles.

+

Pitch-Roll-Yaw Euler Angles

+

The pitch, roll and yaw angles are defined for a moving object in space as the rotations along the lateral, longitudinal and vertical axes attached to the moving object.

+

+
+ Figure 4: Definition of pitch, roll and yaw angles on an air plain
+

Figure 4: Definition of pitch, roll and yaw angles on an air plain

+
+
+ +

Since all three rotations take place about the axes of a fixed coordinate frame, the resulting rotation matrix is obtained by multiplying the three basic rotation matrices as follows: +\[ \tcmbox{\bm{R}_{PRY}(\alpha, \beta, \gamma) = \bm{R}_z(\gamma) \bm{R}_y(\beta) \bm{R}_x(\alpha)} \]

+

To go from rotation matrix to Pitch-Roll-Yaw angles, the following set of equations can be used:

+

\begin{align*} +\alpha &= \atan2\left( \frac{r_{32}}{\cos \beta}, \frac{r_{33}}{\cos \beta} \right) \\\
+\beta &= \atan2\left( -r_{31}, \pm \sqrt{r_{11}^2 + r_{21}^2} \right) \\\
+\gamma &= \atan2\left( \frac{r_{21}}{\cos \beta}, \frac{r_{11}}{\cos \beta} \right) +\end{align*}

+

u-v-w Euler Angles

+

Another way to describe the orientation of a moving object is to consider three successive rotations about the coordinate axes of the moving frame. +Since the rotations do not occur about fixed axes, pre-multiplications of the individual rotation matrices fails to give the correct solution. It can be shown that the resulting matrix can be derived by post-multiplication of the individual rotation matrices as follows: +\[ {}^A\bm{R}_B(\alpha, \beta, \gamma) = \bm{R}_u(\alpha) \bm{R}_v(\beta) \bm{R}_w(\gamma) \]

+

The inverse solution for the u-v-w Euler angles is the following (for \(\cos \beta \ne 0\)):

+

\begin{align*} +\alpha &= \atan2\left( -\frac{r_{23}}{\cos \beta}, \frac{r_{33}}{\cos \beta} \right) \\\
+\beta &= \atan2\left( r_{13}, \pm \sqrt{r_{11}^2 + r_{12}^2} \right) \\\
+\gamma &= \atan2\left( -\frac{r_{12}}{\cos \beta}, \frac{r_{11}}{\cos \beta} \right) +\end{align*}

+

w-v-w Euler Angles

+

Similarly: +\[ \bm{R}_{wvw}(\alpha, \beta, \gamma) = \bm{R}_w(\alpha) \bm{R}_v(\beta) \bm{R}_w(\gamma) \]

+

And for \(\sin\beta\ne0\):

+

\begin{align*} +\alpha &= \atan2\left( \frac{r_{23}}{\sin\beta}, \frac{r_{13}}{\sin\beta} \right) \\\
+\beta &= \atan2\left( \pm \sqrt{r_{31}^2 + r_{32}^2}, r_{33} \right) \\\
+\gamma &= \atan2\left( \frac{r_{32}}{\sin\beta}, -\frac{r_{31}}{\sin\beta} \right) +\end{align*}

+

w-u-w Euler Angles

+

Here, the second rotation is about the \(u\) axis: +\[ \bm{R}_{wuw}(\alpha, \beta, \gamma) = \bm{R}_w(\alpha) \bm{R}_u(\beta) \bm{R}_w(\gamma) \]

+

And for \(\sin\beta\ne0\):

+

\begin{align*} +\alpha &= \atan2\left( \frac{r_{13}}{\sin\beta}, -\frac{r_{23}}{\sin\beta} \right) \\\
+\beta &= \atan2\left( \pm \sqrt{r_{31}^2 + r_{32}^2}, r_{33} \right) \\\
+\gamma &= \atan2\left( \frac{r_{31}}{\sin\beta}, \frac{r_{32}}{\sin\beta} \right) +\end{align*}

+

Notes about Euler Angles

+

If the Euler angle is given, a unique rotation matrix is determined for the orientation of the rigid body. +However, the inverse map is not one-to-one, and at least two Euler angle sets can be found for each orientation.

+

If the Euler angle is chosen for the representation of the orientation, extra care should be taken. From the continuity of the motion, a suitable solution may be chosen, such that no abrupt changes are seen in the variation of the Euler angles in a typical maneuver.

+

The use of rotation matrix to represent the orientation of a rigid body is then generally preferred although there are nine parameters for that description.

+

Motion of a Rigid Body

+

Since the relative positions of a rigid body with respect to a moving frame \(\{\bm{B}\}\) attached to it is fixed for all time, it is sufficient to know the position of the origin of the frame \(O_B\) and the orientation of the frame \(\{\bm{B}\}\) with respect to the fixed frame \(\{\bm{A}\}\), to represent the position of any point \(P\) in the space.

+

Representation of the position of \(O_B\) is uniquely given by the position vector, while orientation of the rigid body is represented in different forms. +However, for all possible orientation representation, a rotation matrix \({}^A\bm{R}_B\) can be derived.

+
+
+

Therefore, the location or pose of a rigid body, can be fully determined by:

+
    +
  1. The position vector of point \(O_B\) with respect to frame \(\{\bm{A}\}\) which is denoted \({}^A\bm{P}_{O_B}\)
  2. +
  3. The orientation of the rigid body, or the moving frame \(\{\bm{B}\}\) attached to it with respect to the fixed frame \(\{\bm{A}\}\), that is represented by \({}^A\bm{R}_B\).
  4. +
+
+

The position of any point \(P\) of the rigid body with respect to the fixed frame \(\{\bm{A}\}\), which is denoted \({}^A\bm{P}\) may be determined thanks to the Chasles’ theorem.

+
+
+

If the pose of a rigid body \(\{{}^A\bm{R}_B, {}^A\bm{P}_{O_B}\}\) is given, then the position of any point \(P\) of this rigid body with respect to \(\{\bm{A}\}\) is given by:

+

\begin{equation} +{}^A\bm{P} = {}^A\bm{R}_B {}^B\bm{P} + {}^A\bm{P}_{O_B} +\end{equation}

+
+

Homogeneous Transformations

+

To describe general transformations, we introduce the \(4\times1\) homogeneous coordinates, and Eq. eq:chasles_therorem is generalized to

+

\begin{equation} +\tcmbox{{}^A\bm{P} = {}^A\bm{T}_B {}^B\bm{P}} +\end{equation}

+

in which \({}^A\bm{T}_B\) is a \(4\times4\) homogeneous transformation matrix.

+

Homogeneous Coordinates

+

There are two basic classes of vector quantities, the generalization to homogeneous coordinates of which are different.

+

The first type is called line vector. Line vectors refer to a vector of which its value depends on the line of action, or the position of where it is applied. Examples are the position vector, linear velocity, force vector.

+

On the contrary, there exist quantities likes orientation that hold for the whole rigid body and do not correspond to a point. They can be positioned freely throughout the whole rigid body, without any change in their quantity. These types of vectors are called free vectors.

+

For line vectors, both orientation and translation of the moving frame contribute to their value. +Homogeneous coordinate of such vectors is generated by appending \(1\) to the three components of that vector:

+

\begin{equation} +\tcmbox{\bm{V} = \begin{bmatrix} v_x \ v_y \ v_z \ 1 \end{bmatrix}} +\end{equation}

+

For free vectors, only the orientation of the moving frame contributes to their value. +The homogeneous coordinate is then

+

\begin{equation} +\tcmbox{\bm{\omega} = \begin{bmatrix} \omega_x \ \omega_y \ \omega_z \ 0 \end{bmatrix}} +\end{equation}

+

Homogeneous Transformation Matrix

+
+
+

The homogeneous transformation matrix is a \(4\times4\) matrix, defined for the purpose of transformation mapping of a vector in a homogeneous coordinate from one frame to another in a compact form. +The matrix is composed of the rotation matrix \({}^A\bm{R}_B\) representing the orientation and the position vector \({}^A\bm{P}_{O_B}\) representing the translation. +It is partitioned as follows:

+

\begin{equation} +{}^A\bm{T}_B = +\left[ \begin{array}{ccc|c} +& & & \\\
+& {}^A\bm{R}_B & & {}^A\bm{P}_{O_B} \\\
+& & & \\\
+\hline +0 & 0 & 0 & 1 \\\
+\end{array} \right] +\end{equation}

+
+

The homogeneous transformation matrix \({}^A\bm{T}_B\) is a \(4\times4\) matrix operator mapping vector valued quantities represented by \(4\times1\) homogeneous coordinates.:

+

\begin{align*} +\left[ \begin{array}{c} \ {}^A\bm{P} \ \ \hline 1 \end{array} \right] +& = +\left[ \begin{array}{ccc|c} +& & & \\\
+& {}^A\bm{R}_B & & {}^A\bm{P}_{O_B} \\\
+& & & \\\
+\hline +0 & 0 & 0 & 1 \\\
+\end{array} \right] +\left[ \begin{array}{c} \ {}^B\bm{P} \ \ \hline 1 \end{array} \right] \\\
+{}^A\bm{P} &= {}^A\bm{R}_B {}^B\bm{P} + {}^A\bm{P}_{O_B} +\end{align*}

+

Using homogeneous coordinate for a free vector like angular velocity of a rigid body:

+

\begin{align*} +\left[ \begin{array}{c} \ {}^A\bm{\omega} \ \ \hline 0 \end{array} \right] +& = +\left[ \begin{array}{ccc|c} +& & & \\\
+& {}^A\bm{R}_B & & {}^A\bm{P}_{O_B} \\\
+& & & \\\
+\hline +0 & 0 & 0 & 1 \\\
+\end{array} \right] +\left[ \begin{array}{c} \ {}^B\bm{\omega} \ \ \hline 0 \end{array} \right] \\\
+{}^A\bm{P} &= {}^A\bm{R}_B {}^B\bm{P} +\end{align*}

+

Screw Displacement

+

The most general rigid body displacement can be produced by a translation along a line followed by a rotation about the same line. +The line is called the screw axis.

+

There exist transformations to from screw displacement notation to the transformation matrix.

+

Transformation Arithmetics

+
Consecutive transformations
+

Let us consider the motion of a rigid body described at three locations (Figure fig:consecutive_transformations). +Frame \(\{\bm{A}\}\) represents the initial location, frame \(\{\bm{B}\}\) is an intermediate location, and frame \(\{\bm{C}\}\) represents the rigid body at its final location.

+

+
+ Figure 5: Motion of a rigid body represented at three locations by frame \(\{\bm{A}\}\), \(\{\bm{B}\}\) and \(\{\bm{C}\}\)
+

Figure 5: Motion of a rigid body represented at three locations by frame \(\{\bm{A}\}\), \(\{\bm{B}\}\) and \(\{\bm{C}\}\)

+
+
+ +

Furthermore, suppose the position vector of a point \(P\) of the rigid body is given in the final location, that is \({}^C\bm{P}\) is given, and the position of this point is to be found in the fixed frame \(\{\bm{A}\}\), that is \({}^A\bm{P}\). +Since the locations of the rigid body is known relative to each other, \({}^C\bm{P}\) can be transformed to \({}^B\bm{P}\) using \({}^B\bm{T}_C\): +\[{}^B\bm{P} = {}^B\bm{T}_C {}^C\bm{P}\]

+

Now, \({}^B\bm{P}\) can be transformed into \({}^A\bm{P}\): +\[ {}^A\bm{P} = {}^A\bm{T}_B {}^B\bm{P} \]

+

And we have: +\[ {}^A\bm{P} = {}^A\bm{T}_B {}^B\bm{T}_C {}^C\bm{P} \]

+

From which, the consecutive transformation can be defined as follows:

+

\begin{equation} +\tcmbox{{}^A\bm{T}_C = {}^A\bm{T}_B {}^B\bm{T}_C} +\end{equation}

+
Inverse transformation
+

Direct inversion of the \(4\times4\) homogeneous transfer matrix \({}^A\bm{T}_B\) to obtain \({}^B\bm{T}_A\) might be computationally intensive. +It is much easier to use the specific structure of the transfer matrix for inversion.

+

To obtain \({}^B\bm{T}_A\), it is necessary to compute \({}^B\bm{R}_A\) and \({}^B\bm{P}_{O_A}\) from the known \({}^A\bm{R}_B\) and \({}^A\bm{P}_{O_B}\), then

+

\begin{equation*} +{}^B\bm{T}_A = +\left[ \begin{array}{ccc|c} +& & & \\\
+& {}^B\bm{R}_A & & {}^B\bm{P}_{O_A} \\\
+& & & \\\
+\hline +0 & 0 & 0 & 1 \\\
+\end{array} \right] +\end{equation*}

+

Moreover

+

\begin{align*} +{}^B\bm{R}_A &= {}^A\bm{R}_B^T \\\
+{}^B\bm{P}_{O_A} &= {}^B\bm{R}_A {}^A\bm{P}_{O_A} = - {}^B\bm{R}_A {}^A\bm{P}_{O_B} \\\
+&= -{}^A\bm{R}_B^T {}^A\bm{P}_{O_B} +\end{align*}

+

Hence, the inverse of the transformation matrix can be obtain by

+

\begin{equation} +{}^B\bm{T}_A = {}^A\bm{T}_B^{-1} = +\left[ \begin{array}{ccc|c} +& & & \\\
+& {}^A\bm{R}_B^T & & -{}^A \bm{R}_B^T {}^A\bm{P}_{O_B} \\\
+& & & \\\
+\hline +0 & 0 & 0 & 1 \\\
+\end{array} \right] +\end{equation}

+

Kinematics

+

+

Introduction

+
+
+

Kinematic analysis refers to the study of the geometry of motion of a robot, without considering the forces an torques that cause the motion. +In this analysis, the relation between the geometrical parameters of the manipulator with the final motion of the moving platform is derived and analyzed.

+
+

A parallel robot is a mechanism with a number of closed kinematic chains, and its moving platform is linked to the base by several independent kinematic chains. +Parallel robots for which the number of kinematic chains is equal to the number of degrees-of-freedom of the moving platform are called fully parallel robots.

+

If in addition to this condition, if the type and number of joints at each limb, and the number and location of the actuated joints are identical in all the limbs, such a parallel robot is called symmetric.

+

There are three main cases for fully parallel manipulators. +Planar robots with two translation and one rotational degree-of-freedom in the plane. +Spatial orientation manipulators with three rotational degrees-of-freedom in space. +And a general spatial robot with three translational and three rotational degrees-of-freedom in space.

+

It is known that unlike serial manipulators, inverse kinematic analysis of parallel robots is usually simple and straightforward. +In most cases, limb variable may be computed independently using the given pose of the moving platform, and the solution in most cases even for redundant manipulators is uniquely determined. +However, forward kinematics of parallel manipulators is generally very complicated, and its solution usually involves systems of nonlinear equations, which are highly coupled and in general have no closed form and unique solution.

+

Loop Closure Method

+

A typical parallel manipulator consists of two main bodies. +Body \(A\) is arbitrary designated as fixed and is called the base, while body \(B\) is designated to be movable and is called the moving platform.
+These two bodies are coupled via \(n\) limbs, each attached to points \(A_i\) and \(B_i\) and called fixed and moving attachment points of the limb \(i\).

+

At the displacement level, the forward kinematic problem permits the determination of the actual location or pose of the moving platform relative to the base from a set of joint-position readouts.

+

At the velocity level, the forward kinematic problem refers to the determination of the translational and angular velocities of the moving platform relative to the base, from a set of joint-velocity readouts and for a known configuration.

+

To describe the motion of the moving platform relative to the base, frame \(\{\bm{A}\}\) is attached to body \(A\) and frame \(\{\bm{B}\}\) to body \(B\). +The pose of the moving platform relative to the base is thus defined by:

+
    +
  • A position vector \(\bm{p}\) which denotes the position vector of the origin of \(\{\bm{B}\}\) with respect to frame \(\{\bm{A}\}\)
  • +
  • A \(3\times3\) rotation matrix \(R\) which denotes the rotation of \(\{\bm{B}\}\) with respect to \(\{\bm{A}\}\)
  • +
+

Each limb of a parallel manipulator defines a kinematic loop passing through the origins of frames \(\{\bm{A}\}\) and \(\{\bm{B}\}\), and through the two limb attachment points \(A_i\) and \(B_i\).

+

At the displacement level, the closure of each kinematic loop can be express in the vector form as +\[ \vec{AB} = \vec{AA_i} + \vec{A_iB_i} - \vec{BB_i} \quad \text{for } i = 1,2,\dots,n \] +in which \(\vec{AA_i}\) and \(\vec{BB_i}\) can be easily obtained from the geometry of the attachment points in the base and in the moving platform.

+

Let us defined \(\bm{a}_i = \vec{AA_i}\) in the fixed frame \(\{\bm{A}\}\), and \(\bm{b}_i = \vec{BB_i}\) in the moving frame \(\{\bm{B}\}\). +Furthermore, \(\bm{q}_i = \vec{A_iB_i}\) is defined as the limb variable, which indicated the geometry of the limb.

+
+
+

The loop closure can be written as the unknown pose variables \(\bm{p}\) and \(\bm{R}\), the position vectors describing the known geometry of the base and of the moving platform, \(\bm{a}_i\) and \(\bm{b}_i\), and the limb vector \(\bm{q}_i\)

+

\begin{equation} +\bm{p} = \bm{a}_i + \bm{q}_i - \bm{R} \bm{b}_i \quad \text{for } i=1,2,\dots,n +\end{equation}

+
+

For an inverse kinematic problem, it is assumed that the moving platform position \(\bm{p}\) and orientation \(\bm{R}\) are given and the problem is to solve the active limb variables. +This analysis is usually straightforward and results in unique solution for the limb variables.

+

However, the inverse solution is not straightforward, and usually numerical methods are used for forward kinematic solution.

+

Kinematic Analysis of a Stewart-Gough Platform

+

Mechanism Description

+

One frame \(\{\bm{A}\}\) is attached to the fixed base and frame \(\{\bm{B}\}\) is attached to the moving platform at points \(O_A\) and \(O_B\) respectively.

+

The number of actuators is equal to the degrees-of-freedom of the manipulator and hence the manipulator is fully parallel.

+
+
+

Since all the limbs are connected to the moving platform and to the base by spherical joints, no twisting torque can be transmitted and the force acting on each limb is directed along the longitudinal axis of the limb.

+
+

Geometry of the Manipulator

+
+
+

The position of the attachment points on the fixed base are denoted by the vectors \(\bm{a}_i\) and the position of moving attachment points are denoted by the vectors \(\bm{b}_i\). +The geometry of each limb is described by its length \(l_i\) and its direction is denoted by a unit vector \(\hat{\bm{s}}_i\).

+
+

The position of the point \(O_B\) of the moving platform is described by the position vector \({}^A\bm{P} = [p_x\ p_y\ p_z]^T\) and orientation of the moving platform is described by the rotation matrix \({}^A\bm{R}_B\) which can by represented by the components of the unit vectors \(\hat{\bm{u}}\), \(\hat{\bm{v}}\), \(\hat{\bm{z}}\) as follows:

+

\begin{equation} +^A\bm{R}_B = \begin{bmatrix} +u_x & v_x & w_x \\\
+u_y & v_y & w_y \\\
+u_z & v_z & w_z \\\
+\end{bmatrix} +\end{equation}

+

+
+ Figure 6: Geometry of a Stewart-Gough platform
+

Figure 6: Geometry of a Stewart-Gough platform

+
+
+ +

The geometry of the manipulator is shown Figure fig:stewart_schematic.

+

Inverse Kinematics

+
+
+

For inverse kinematic analysis, it is assumed that the position \({}^A\bm{P}\) and orientation of the moving platform \({}^A\bm{R}_B\) are given and the problem is to obtain the joint variables \(\bm{L} = \left[ l_1, l_2, l_3, l_4, l_5, l_6 \right]^T\).

+
+

From the geometry of the manipulator, one can write:

+

\begin{equation} +{}^A \bm{a}_i + l_i {}^A \hat{\bm{s}}_i = {}^A\bm{P} + {}^A\bm{b}_i +\end{equation}

+

Then, we can find \(l_i\) given \({}^A\bm{P}\) and \({}^A\bm{R}_B\):

+

\begin{equation} +\begin{aligned} +l_i = &\Big[ {}^A\bm{P}^T {}^A\bm{P} + {}^B\bm{b}_i^T {}^B\bm{b}_i + {}^A\bm{a}_i^T {}^A\bm{a}_i - 2 {}^A\bm{P}^T {}^A\bm{a}_i + \dots\\\
+&2 {}^A\bm{P}^T \left[{}^A\bm{R}_B {}^B\bm{b}_i\right] - 2 \left[{}^A\bm{R}_B {}^B\bm{b}_i\right]^T {}^A\bm{a}_i \Big]^{1/2} +\end{aligned} +\end{equation}

+

If the position and orientation of the platform lie in the feasible workspace, the solution is unique. +Otherwise, the solution gives complex numbers.

+

Forward Kinematics

+
+
+

In forward kinematic analysis, it is assumed that the vector of limb lengths \(\bm{L}\) is given and the problem is to find the position \({}^A\bm{P}\) and the orientation \({}^A\bm{R}_B\).

+
+

The size of the problem depends of the representation used for orientation (rotation matrix, Euler angles, …).

+

The forward kinematic problem is then to solve many highly nonlinear equations that are extremely difficult to solve.

+

The complexity of the problem depends widely on the manipulator architecture and geometry.

+

Jacobian: Velocities and Static Forces

+

+

Introduction

+
+
+

The Jacobian matrix not only reveals the relation between the joint variable velocities of a parallel manipulator to the moving platform linear and angular velocities, it also constructs the transformation needed to find the actuator forces from the forces and moments acting on the moving platform.

+
+

For specific configurations, local degeneracy can occur and leads to:

+
    +
  1. An instantaneous change in the degrees-of-freedom of the system and hence a loss of controllability
  2. +
  3. An important degradation of the natural stiffness that may lead to very high joint forces or torques
  4. +
+

Therefore, it is very important to identify singular configurations at the design stage to improve the performance.

+

Angular and Linear Velocities

+

To determine the absolute linear velocity of a point, the derivative must be calculated relative to a fixed frame. +Differentiation of a position vector with respect to a moving frame results in a relative velocity. +Therefore, it is necessary to define the arithmetics to transform the relative velocities to the absolute ones.

+

Angular Velocity of a Rigid Body

+

Angular velocity is an attribute of a rigid body that describes the rotational motion of the frame \(\{\bm{B}\}\) that is attached to the rigid body.

+
+
+

The angular velocity vector \(\bm{\Omega}\) describes the instantaneous rotation of frame \(\{\bm{B}\}\) with respect to the fixed frame \(\{\bm{A}\}\). +The direction of \(\bm{\Omega}\) indicates the instantaneous axis of rotation and its magnitude indicates the speed of rotation.

+
+

The angular velocity vector is related to the screw formalism by equation eq:angular_velocity_vector.

+

\begin{equation} +\tcmbox{\bm{\Omega} \triangleq \dot{\theta} \hat{\bm{s}}} +\end{equation}

+

The angular velocity can be expressed in any frame. For example \({}^A\bm{\Omega}\) denotes the angular velocity of the rigid body expressed in the frame \(\{\bm{A}\}\) and we have:

+

\begin{equation} +\begin{aligned} +^A \bm{\Omega} &= \Omega_x \hat{\bm{x}} + \Omega_y \hat{\bm{y}} + \Omega_z \hat{\bm{z}} \\\
+&= \dot{\theta}\left( s_x \hat{\bm{x}} + s_y \hat{\bm{y}} + s_z \hat{\bm{z}} \right) +\end{aligned} +\end{equation}

+

in which \(\Omega_x\), \(\Omega_y\) and \(\Omega_z\) are the three components of angular velocity of a rigid body expressed in frame \(\{\bm{A}\}\).

+

Linear Velocity of a Point

+

Linear velocity of a point P can be easily determined by the time derivative of the position vector \(p\) of that point with respect to a fixed frame:

+

\begin{equation} +v_p = \dot{p} = \left( \dv{p}{t} \right)_{\text{fix}} +\end{equation}

+

If the variation of the position vector is determined with respect to a moving frame, we obtain the relative velocity:

+

\begin{equation} +v_{\text{rel}} = \left( \pdv{p}{t} \right)_{\text{mov}} +\end{equation}

+

In classical mechanics, it is shown that the relation between absolute derivative of any vector to its relative derivative is given by:

+

\begin{equation} +\left( \dv{(\cdot)}{t} \right)_{\text{fix}} = \left( \pdv{(\cdot)}{t} \right)_{\text{mov}} + \bm{\Omega} \times (\cdot) +\end{equation}

+

in which \(\bm{\Omega}\) denotes the angular velocity of the moving frame with respect to the fixed frame.

+

The term \(\bm{\Omega}\times(\cdot)\) can be written in matrix form:

+

\begin{equation} +\tcmbox{\left( \dv{(\cdot)}{t} \right)_{\text{fix}} = \left( \pdv{(\cdot)}{t} \right)_{\text{mov}} + \bm{\Omega}^\times(\cdot)} +\end{equation}

+

The matrix \(\bm{\Omega}^\times\) denotes a skew-symmetric matrix defined by:

+

\begin{equation} +\tcmbox{\bm{\Omega}^\times = \begin{bmatrix} +0 & -\Omega_z & \Omega_y \\\
+\Omega_z & 0 & -\Omega_x \\\
+-\Omega_y & \Omega_x & 0 +\end{bmatrix}} +\end{equation}

+

Now consider the general motion of a rigid body shown in Figure fig:general_motion, in which a moving frame \(\{\bm{B}\}\) is attached to the rigid body and the problem is to find the absolute velocity of point \(P\) with respect to a fixed frame \(\{\bm{A}\}\).

+

+
+ Figure 7: Instantaneous velocity of a point \(P\) with respect to a moving frame \(\{\bm{B}\}\)
+

Figure 7: Instantaneous velocity of a point \(P\) with respect to a moving frame \(\{\bm{B}\}\)

+
+
+ +

The rigid body perform a general motion which is a combination of a translation, denoted by the vector \({}^A\bm{P}_{O_B}\), and an instantaneous rotation. +To determine the velocity of point \(P\), we start with the relation between absolute and relative position vectors: +\[ ^A\bm{P} = {}^A\bm{P}_{O_B} + {}^A\bm{R}_B {}^B\bm{P} \]

+

To derive the velocity of point \(P\), we differentiate with respect to time: +\[ {}^A\bm{v}_P = {}^A\bm{v}_{O_B} + {}^A\dot{\bm{R}}_B{}^B\bm{P} + {}^A\bm{R}_B\underbrace{{}^B\bm{v}_P}_{=0} \]

+

The time derivative of the rotation matrix \({}^A\dot{\bm{R}}_B\) is:

+

\begin{equation} +\tcmbox{{}^A\dot{\bm{R}}_B = {}^A\bm{\Omega}^\times \ {}^A\bm{R}_B} +\end{equation}

+

And we finally obtain equation eq:absolute_velocity_formula.

+
+
+

\begin{equation} +{}^A\bm{v}_P = {}^A\bm{v}_{O_B} + {}^A\bm{\Omega}^\times \ {}^A\bm{R}_B {}^B\bm{P} +\end{equation}

+
+

Screw Coordinates

+

Finite rotation of a rigid body can be expressed as a rotation \(\theta\) about a screw axis \(\hat{\bm{s}}\). +Furthermore, it is shown that the angular velocity of a rigid body is also defined as the rate of instantaneous rotation angle \(\dot{\theta}\) about the same screw axis \(\hat{\bm{s}}\).

+
+
+

The most general rigid-body displacement can be produced by a translation along a line followed by a rotation about the same line. Since this displacement is reminiscent of the displacement of a screw, it is called a screw displacement, and the line of axis is called the screw axis.

+
+

Jacobian Matrices of a Parallel Manipulator

+

Let \(\bm{q} = \left[ q_1, q_2, \ldots, q_m \right]^T\) denote the vector of actuated joint coordinates (linear displacement of an actuator prismatic joint or angular rotation of an actuated revolute joint) and \(\bm{\mathcal{X}} = \left[ x_1, x_2, \ldots, x_n \right]^T\) denote the vector of moving platform motion variables (position or orientation).

+

\(m\) denotes the number of actuated joints in the manipulator, \(n\) denotes the number of degrees-of-freedom of the manipulator.

+

Generally \(m \geq n\), in which for a fully parallel manipulator \(m=n\) and for redundant manipulator \(m>n\).

+

\(\bm{q}\) and \(\bm{\mathcal{X}}\) are related through a system of nonlinear algebraic equations representing the kinematic constraints imposed by the limbs, which can be generally written as

+

\begin{equation} +f(\bm{q}, \bm{\mathcal{X}}) = 0 +\end{equation}

+

We can differentiate this equation with respect to time and obtain:

+

\begin{equation} +\tcmbox{\bm{J}_x \dot{\bm{\mathcal{X}}} = \bm{J}_q \dot{\bm{q}}} +\end{equation}

+

where

+

\begin{equation} +\bm{J}_x = \pdv{f}{\bm{\mathcal{X}}} \quad \text{and} \quad \bm{J}_q = -\pdv{f}{\bm{q}} +\end{equation}

+
+
+

The general Jacobian matrix is defined as:

+

\begin{equation} +\dot{\bm{q}} = \bm{J} \dot{\bm{\mathcal{X}}} +\end{equation}

+

From equation eq:jacobians, we have:

+

\begin{equation} +\bm{J} = {\bm{J}_q}^{-1} \bm{J}_x +\end{equation}

+
+

Velocity Loop Closure

+

The velocity loop closures are used for obtaining the Jacobian matrices in a straightforward manner. +Velocity loop closures are derived by direct differentiation of kinematic loop closures.

+

Kinematic loop closures are: +\[ \bm{p} = \bm{a}_i + \bm{d}_i - \bm{R} \bm{b}_i \quad \text{for}\ i = 1, \ldots, m \]

+

with

+
    +
  • \(\bm{p}\) the position vector of the moving platform w.r.t. frame \(\{\bm{A}\}\)
  • +
  • \(\bm{R}\) the rotation matrix of the moving platform
  • +
  • \(\bm{a}_i\) the position vector of the \(i\)‘th limb of the fixed platform w.r.t. frame \(\{\bm{A}\}\)
  • +
  • \(\bm{b}_i\) the position vector of the \(i\)‘th limb of the moving platform w.r.t. frame \(\{\bm{B}\}\)
  • +
  • \(\bm{d}_i\) the limb vector
  • +
+

By taking the time derivative, we obtain the following Velocity Loop Closure:

+

\begin{equation} +\tcmbox{\dot{\bm{p}} = \dot{\bm{d}_i} - \bm{\omega} \times \bm{R} \bm{b}_i \quad \text{for}\ i = 1, \ldots, m} +\end{equation}

+

Singularity Analysis of Parallel Manipulators

+

The singularities occur when:

+
    +
  • \(\bm{J}_q\) is rank deficient (Inverse kinematic singularity)
  • +
  • \(\bm{J}_x\) is rank deficient (Forward kinematic singularity)
  • +
+

Inverse Kinematic Singularity

+

Inverse kinematic singularity happens when \(\bm{J}_q\) (\(m \times m\) matrix) is rank deficient (\(\det \bm{J}_q = 0\)).

+

The corresponding configurations are located at the boundary of the manipulator workspace or on the internal boundaries between sub-regions of the workspace.

+

In such cases, there exist nonzero vectors \(\dot{\bm{q}}\) which correspond to a null Cartesian twist vector \(\dot{\bm{\mathcal{X}}}\). In other words, infinitesimal motion of the moving platform along certain directions cannot be accomplished. +The manipulator looses one or more degrees-of-freedom.

+

Forward Kinematic Singularity

+

Forward kinematic singularity happens when \(\bm{J}_x\) (\(m \times n\) matrix) is rank deficient (\(\det({\bm{J}_x}^T \bm{J}_x) = 0\)). +If the manipulator is not redundantly actuated (\(m=n\)), then the Jacobian matrix \(\bm{J}_x\) is square and the forward kinematic singularity happens when \(\det \bm{J}_x = 0\).

+

The degeneracy occur inside the manipulator’s Cartesian workspace and corresponds to the set of configurations for which two different branches of forward kinematic problem meet.

+

There exist nonzero cartesian twist vectors \(\dot{\bm{\mathcal{X}}}\) that are mapped into a vanishing actuator velocity vector \(\dot{\bm{\mathcal{q}}}\).

+

The corresponding configuration will be one in which an infinitesimal motion of the platform is possible even if the actuator are locked. The manipulator gains one or several degrees-of-freedom and its stiffness vanishes in the corresponding direction(s).

+

Jacobian Analysis of the Stewart-Gough Platform

+

Velocity Loop Closure

+

The input joint rate is denoted by \(\dot{\bm{\mathcal{L}}} = [ \dot{l}_1, \dot{l}_2, \dot{l}_3, \dot{l}_4, \dot{l}_5, \dot{l}_6 ]^T\), and the output twist vector is denoted by \(\dot{\bm{\mathcal{X}}} = [^A\bm{v}_p, {}^A\bm{\omega}]^T\).

+

The jacobian matrix can be derived by formulating a velocity loop closure equation of each limb. +The loop closure equations for each limb are:

+

\begin{equation} +{}^A\bm{P} + {}^A\bm{R}_B {}^B\bm{b}_i = l_i {}^A\hat{\bm{s}}_i + {}^A\bm{a}_i +\end{equation}

+

By differentiate this with respect to time:

+

\begin{equation} +{}^A\bm{v}_p + {}^A \dot{\bm{R}}_B {}^B\bm{b}_i = \dot{l}_i {}^A\hat{\bm{s}}_i + l_i {}^A\dot{\hat{\bm{s}}}_i +\end{equation}

+

Moreover, we have:

+
    +
  • \({}^A\dot{\bm{R}}_B {}^B\bm{b}_i = {}^A\bm{\omega} \times {}^A\bm{R}_B {}^B\bm{b}_i = {}^A\bm{\omega} \times {}^A\bm{b}_i\) in which \({}^A\bm{\omega}\) denotes the angular velocity of the moving platform expressed in the fixed frame \(\{\bm{A}\}\).
  • +
  • \(l_i {}^A\dot{\hat{\bm{s}}}_i = l_i \left( {}^A\bm{\omega}_i \times \hat{\bm{s}}_i \right)\) in which \({}^A\bm{\omega}_i\) is the angular velocity of limb \(i\) express in fixed frame \(\{\bm{A}\}\).
  • +
+

Then, the velocity loop closure eq:loop_closure_limb_diff simplifies to +\[ {}^A\bm{v}_p + {}^A\bm{\omega} \times {}^A\bm{b}_i = \dot{l}_i {}^A\hat{\bm{s}}_i + l_i ({}^A\bm{\omega}_i \times \hat{\bm{s}}_i) \]

+

By dot multiply both side of the equation by \(\hat{\bm{s}}_i\): +\[ \hat{\bm{s}}_i {}^A\bm{v}_p + ({}^A\bm{b}_i \times \hat{\bm{s}}_i) {}^A\bm{\omega} = \dot{l}_i \]

+

We then omit the superscript \(A\) and we can rearrange the 6 equations into a matrix form

+

\begin{equation} +\tcmbox{\dot{\bm{\mathcal{L}}} = \bm{J} \dot{\bm{\mathcal{X}}}} +\end{equation}

+
+
+

\begin{equation} +\bm{J} = \begin{bmatrix} +{\hat{\bm{s}}_1}^T & (\bm{b}_1 \times \hat{\bm{s}}_1)^T \\\
+{\hat{\bm{s}}_2}^T & (\bm{b}_2 \times \hat{\bm{s}}_2)^T \\\
+{\hat{\bm{s}}_3}^T & (\bm{b}_3 \times \hat{\bm{s}}_3)^T \\\
+{\hat{\bm{s}}_4}^T & (\bm{b}_4 \times \hat{\bm{s}}_4)^T \\\
+{\hat{\bm{s}}_5}^T & (\bm{b}_5 \times \hat{\bm{s}}_5)^T \\\
+{\hat{\bm{s}}_6}^T & (\bm{b}_6 \times \hat{\bm{s}}_6)^T +\end{bmatrix} +\end{equation}

+

\(\bm{J}\) then depends only on:

+
    +
  • \(\hat{\bm{s}}_i\) the orientation of the limbs
  • +
  • \(\bm{b}_i\) the position of the joints with respect to \(O_B\) and express in \(\{\bm{A}\}\).
  • +
+
+

Singularity Analysis

+

It is of primary importance to avoid singularities in a given workspace. +To study the singularity configurations of the Stewart-Gough platform, we consider the Jacobian matrix determined with the equation eq:jacobian_formula_stewart.

+

From equation eq:jacobians, it is clear that for the Stewart-Gough platform, \(\bm{J}_q = \bm{I}\) and \(\bm{J}_x = \bm{J}\). +Hence the manipulator has no inverse kinematic singularities within the manipulator workspace, but may possess forward kinematic singularity when \(\bm{J}\) becomes rank deficient. This may occur when +\[ \det \bm{J} = 0 \]

+

Static Forces in Parallel Manipulators

+

The relation between the forces/moments applied to the environment at the point of contact and the actuator forces/torques is determined and analyzed in the study of static force analysis.

+

It is assumed that the manipulator is at a static equilibrium, and that the actuator forces required to produce the desired contact forces are determined.

+

Two methods are usually applied: the free-body diagram and the principle of virtual work.

+

In the free-body diagram approach, the actuator forces are determined to produce desired contact forces/moments as well as the internal and interacting forces/torques applied at the limbs. The analysis of such forces is essential in the design of a manipulator to determine the stresses and deflection of each link and joint.

+

However, if only the actuator forces are desired to be determined, the principle of virtual work is more efficient and computationally less expensive.

+

Virtual Work Approach

+

A virtual displacement for a parallel manipulator refers to an infinitesimal change in the general displacement of the moving platform as a result of any arbitrary infinitesimal changes in the joint variables at a given instant of time.

+

The virtual displacement of the joints can be written as \(\delta \bm{q} = [\delta q_1, \delta q_2, \cdots, \delta q_m]^T\) and \(\delta \bm{\mathcal{X}} = [\delta x, \delta y, \delta z, \delta \theta_x, \delta \theta_y, \delta \theta_z ]^T\) denotes the virtual displacement of a contacting point of the moving platform. +\([\delta \theta_x, \delta \theta_y, \delta \theta_z ]^T = \delta \theta \hat{\bm{s}}\) are the orientation variables represented by screw coordinates.

+

Let the vector of actuator forces be denoted by \(\bm{\tau} = [\tau_1, \tau_2, \cdots, \tau_m]^T\), and the external forces/torque acting on the contact point of the moving platform denoted by a wrench in a screw coordinate as \(\bm{\mathcal{F}} = [\bm{f}, \bm{n}]^T\) in which \(\bm{f} = [f_x, f_y, f_z]^T\) denotes the external forces, and \(\bm{n} = [n_x, n_y, n_z]^T\) denotes the external torque action on the moving platform at the point of contact to the environment.

+

We assume that the frictional forces acting on the joints are negligible, and also that the gravitational forces of the limb links are much smaller than the interacting force of the moving platform to the environment. +The principle of virtual work states that the total virtual work, \(\delta W\), done by all actuators and external forces is equal to zero:

+

\begin{equation} +\tcmbox{\delta W = \bm{\tau}^T \delta \bm{q} - \bm{\mathcal{F}}^T \delta \bm{\mathcal{X}} = 0} +\end{equation}

+

Furthermore, from the definition of the Jacobian, the virtual displacements \(\delta \bm{q}\) and \(\delta \bm{\mathcal{X}}\) are related by the Jacobian: +\[ \delta \bm{q} = \bm{J} \cdot \delta \bm{\mathcal{X}} \]

+

We then have \(\left( \bm{\tau}^T \bm{J} - \bm{\mathcal{F}}^T \right) \delta \bm{\mathcal{X}} = 0\) that holds for any arbitrary virtual displacement \(\delta \bm{\mathcal{X}}\), hence +\[ \bm{\tau}^T \bm{J} - \bm{\mathcal{F}}^T = 0 \]

+
+
+

We obtain that the Jacobian matrix constructs the transformation needed to find the actuator forces \(\bm{\tau}\) from the wrench acting on the moving platform \(\bm{\mathcal{F}}\):

+

\begin{equation} +\bm{\mathcal{F}} = \bm{J}^T \bm{\tau} +\end{equation}

+
+

Static Forces of the Stewart-Gough Platform

+

As shown in Figure fig:stewart_static_forces, the twist of moving platform is described by a 6D vector \(\dot{\bm{\mathcal{X}}} = \left[ {}^A\bm{v}_P \ {}^A\bm{\omega} \right]^T\), in which \({}^A\bm{v}_P\) is the velocity of point \(O_B\), and \({}^A\bm{\omega}\) is the angular velocity of moving platform.

+

+
+ Figure 8: Free-body diagram of forces and moments action on the moving platform and each limb of the Stewart-Gough platform
+

Figure 8: Free-body diagram of forces and moments action on the moving platform and each limb of the Stewart-Gough platform

+
+
+ +

Consider an external wrench generated by the manipulator and applied to the environment at the point \(O_B\) denoted by \(\bm{\mathcal{F}} = [\bm{f} \ \bm{n}]^T\).

+

It is assumed that no external forces are applied to the limbs except the actuator forces. +Therefore, the static force can be assumed to be along the limb axis \(\hat{\bm{s}}_i\), and the limb is subject to a tension/compression force \(f_i\).

+

At static equilibrium, the summation of all acting forces on the moving platform shall be zero, therefore

+

\begin{equation} +-\bm{f} + \sum_{i=1}^6 f_i \hat{\bm{s}}_i = 0 +\end{equation}

+

in which \(-\bm{f}\) if the external force applied to the moving platform from the environment.

+

The summation of moments contributed by all forces acting on the moving platform about \(O_B\) is as follows:

+

\begin{equation} +-\bm{n} + \sum_{i=1}^6 b_i \times f_i \hat{\bm{s}}_i = 0 +\end{equation}

+

in which \(-n\) is the external moment applied to the moving platform by the environment, and \(b_i\) is the position vector from the point \(O_B\) to the attached point \(B_i\) on the moving platform.

+

Writing the two equations together in a matrix form results in

+

\begin{equation} +\begin{bmatrix} +\hat{\bm{s}}_1 & \hat{\bm{s}}_2 & \cdots & \hat{\bm{s}}_6 \\\
+\bm{b}_1 \times \hat{\bm{s}}_1 & \bm{b}_2 \times \hat{\bm{s}}_2 & \cdots & \bm{b}_6 \times \hat{\bm{s}}_6 +\end{bmatrix} \cdot \begin{bmatrix} +f_1 \ f_2 \ \vdots \ f_6 +\end{bmatrix} = \begin{bmatrix} +\bm{f} \ \bm{n} +\end{bmatrix} +\end{equation}

+

There we can recognize the transpose of the Jacobian matrix:

+

\begin{equation} +\tcmbox{\bm{\mathcal{F}} = \bm{J}^T \bm{\tau}} +\end{equation}

+

in which \(\bm{\tau} = [f_1, f_2, \cdots, f_6]^T\) is the vector of actuator forces, and \(\bm{\mathcal{F}} = [\bm{f}, \bm{n}]^T\) is the 6D wrench applied by the manipulator to the environment.

+

Stiffness Analysis of Parallel Manipulators

+

Here, we focus on the deflections of the manipulator moving platform that are the result of the applied wrench to the environment. +The amount of these deflections are a function of the applied wrench as well as the manipulator structural stiffness. +Thus, the stiffness of a manipulator has a direct impact on its overall positioning accuracy if the manipulator is in contact with a stiff environment.

+

Stiffness and Compliance Matrices

+

The relation between the applied actuator force \(\tau_i\) and the corresponding small deflection \(\Delta q_i\) along the applied force axis can be approximated as a linear function:

+

\begin{equation} +\tcmbox{\tau_i = k_i \cdot \Delta q_i} +\end{equation}

+

in which \(k_i\) denotes the stiffness constant of the actuator.

+

Re-writing the equation eq:stiffness_actuator for all limbs in a matrix form result in

+

\begin{equation} +\tcmbox{\bm{\tau} = \mathcal{K} \cdot \Delta \bm{q}} +\end{equation}

+

in which \(\bm{\tau}\) is the vector of actuator forces, and \(\Delta \bm{q}\) corresponds to the actuator deflections. +\(\mathcal{K} = \text{diag}\left[ k_1 \ k_2 \dots k_m \right]\) is an \(m \times m\) diagonal matrix composed of the actuator stiffness constants.

+

Writing the Jacobian relation given in equation eq:jacobian_disp for infinitesimal deflection read

+

\begin{equation} +\Delta \bm{q} = \bm{J} \cdot \Delta \bm{\mathcal{X}} +\end{equation}

+

in which \(\Delta \bm{\mathcal{X}} = [\Delta x\ \Delta y\ \Delta z\ \Delta\theta x\ \Delta\theta y\ \Delta\theta z]\) is the infinitesimal linear and angular deflection of the moving platform.

+

Furthermore, rewriting the Jacobian as the projection of actuator forces to the moving platform eq:jacobian_forces gives

+

\begin{equation} +\bm{\mathcal{F}} = \bm{J}^T \bm{\tau} +\end{equation}

+

Hence, by substituting eq:stiffness_matrix_relation and eq:jacobian_disp_inf in eq:jacobian_force_inf, we obtain:

+

\begin{equation} +\tcmbox{\bm{\mathcal{F}} = \underbrace{\bm{J}^T \mathcal{K} \bm{J}}_{\bm{K}} \cdot \Delta \bm{\mathcal{X}}} +\end{equation}

+

Equation eq:stiffness_jacobian implies that the moving platform output wrench is related to its deflection by the stiffness matrix \(K\).

+
+
+

\begin{equation} +\bm{K} = \bm{J}^T \mathcal{K} \bm{J} +\end{equation}

+
+

The stiffness matrix has desirable characteristics for analysis:

+
    +
  • It is a symmetric positive definite matrix, however, it is configuration dependent
  • +
  • If the manipulator actuators have all the same stiffness constants \(k\), the stiffness matrix is reduced to the form \(\bm{K} = k \bm{J}^T \bm{J}\)
  • +
+

If the stiffness matrix is inversible (\(\det( \bm{J}^T \bm{J}) \ne 0\)), the compliance matrix of the manipulator is defined as

+

\begin{equation} +\tcmbox{\bm{C} = \bm{K}^{-1} = (\bm{J}^T \mathcal{K} \bm{J})^{-1}} +\end{equation}

+

The compliance matrix of a manipulator shows the mapping of the moving platform wrench to its deflection by

+

\begin{equation} +\Delta \bm{\mathcal{X}} = \bm{C} \cdot \bm{\mathcal{F}} +\end{equation}

+

Transformation Ellipsoid

+

As seen previously, the Jacobian matrix \(\bm{J}\) transforms n-dimensional moving platform velocity vector \(\dot{\bm{\mathcal{X}}}\) into m-dimensional actuated joint velocity \(\dot{\bm{q}}\). +Also, the Jacobian transpose \(\bm{J}^T\) maps m-dimensional actuated joint forces \(\bm{\tau}\) into n-dimensional applied wrench \(\bm{\mathcal{F}}\).

+

One way to characterize these transformation is to compare the amplitude and direction of the moving platform velocity generated by a unit actuator joint velocity. +To achieve this goal, we confine the actuator joint velocity vector on a m-dimensional unit sphere +\[ \dot{\bm{q}}^T \dot{\bm{q}} = 1 \] +and compare the resulting moving platform velocity in n-dimensional space: +\[ \dot{\bm{\mathcal{X}}}^T \bm{J}^T \bm{J} \dot{\bm{\mathcal{X}}} = 1 \]

+

Similarly, we can confine the exerted moving platform wrench \(\bm{\mathcal{F}}^T \bm{\mathcal{F}} = 1\) and compare the required actuator forces: \(\bm{\tau}^T \bm{J} \bm{J}^T \bm{\tau} = 1\).

+

Consider the case of fully parallel manipulators. +Then \(\bm{J}\bm{J}^T\) and \(\bm{J}^T\bm{J}\) transformations are represented by \(n \times n\) matrices. +Geometrically, these transformations represent a hyper-ellipsoid in n-dimensional space, whose principal axes are the eigenvectors of \(\bm{J}^T\bm{J}\) and \(\bm{J}\bm{J}^T\) respectively. +Furthermore, the lengths of the principal axes are equal to the reciprocals of the square roots of the eigenvalues of \(\bm{J}\bm{J}^T\) and \(\bm{J}^T\bm{J}\), which are also equal to the reciprocals of the singular values of \(\bm{J}\).

+

The shape of this hyper-ellipsoid in space indicates the characteristics of the transformation. +As this hyper-ellipsoid is closer to a hyper-sphere, the transformation becomes more uniform in different directions. +Since Jacobian matrix is configuration dependent, the shape of the hyper-ellipsoid is also configuration dependent, and as the moving platform moves from one pose to the other, the shape of the hyper-ellipsoid changes accordingly.

+

A measure of the dexterity of the manipulator is the reciprocal of the Jacobian matrix condition number defined as:

+

\begin{equation} +\frac{1}{\kappa} = \frac{\sigma_{\text{min}}}{\sigma_{\text{max}}} +\end{equation}

+

in which \(\sigma_{\text{min}}\) and \(\sigma_{\text{max}}\) are the smallest and the largest singular values of the Jacobian matrix.

+

Stiffness Analysis of the Stewart-Gough Platform

+

In this section, we restrict our analysis to a 3-6 structure (Figure fig:stewart36) in which there exist six distinct attachment points \(A_i\) on the fixed base and three moving attachment point \(B_i\).

+

+
+ Figure 9: Schematic of a 3-6 Stewart-Gough platform
+

Figure 9: Schematic of a 3-6 Stewart-Gough platform

+
+
+ +

Denote the vector of actuated joint forces by \(\bm{\tau} = [f_1 \ f_2 \ f_3 \ f_4 \ f_5 \ f_6 ]\), and the corresponding vector of infinitesimal displacements of actuated limbs denoted by \(\Delta \bm{L} = [\Delta l_1 \ \Delta l_2 \ \Delta l_3 \ \Delta l_4 \ \Delta l_5 \ \Delta l_6 ]\). +The relation between \(\Delta \bm{L}\) and \(\bm{\tau}\) is described by a diagonal \(6 \times 6\) matrix \(\mathcal{K}\): +\[ \bm{\tau} = \mathcal{K} \cdot \Delta \bm{L} \]

+

Also, from the definition of the Jacobian, we have: +\[ \Delta \bm{L} = \bm{J} \cdot \Delta \bm{\mathcal{X}} \] +in which \(\Delta \bm{\mathcal{X}} = [\Delta_x \ \Delta_y \ \Delta_z \ \Delta \theta_x \ \Delta \theta_y \ \Delta \theta_z ]\) is the vector of infinitesimal linear and angular motions of the moving platform.

+

Also, the vector of the moving platform output wrench denoted by \(\bm{F} = [f_x \ f_y \ f_z \ n_x \ n_y \ n_z ]\) is related to the vector of actuated joint forces \(\bm{\tau}\) by: +\[ \bm{F} = \bm{J}^T \cdot \bm{\tau} \]

+

By substitution, we obtain: +\[ \bm{\mathcal{F}} = \bm{K} \cdot \Delta \bm{\mathcal{X}} \] +in which +\[ \bm{K} = \bm{J}^T \mathcal{K} \bm{J} \] +where \(K\) is called the stiffness matrix of the Stewart-Gough manipulator.

+

For a given configuration of the moving platform, the eigenvalue of the stiffness matrix represents the stiffness of the manipulator in the corresponding eigenvector direction. +Furthermore, the reciprocal of the stiffness matrix condition number may be used to represent the dexterity of the manipulator.

+

The maximum stiffness of the manipulator can be analyzed by the maximum singular value of the Jacobian matrix. +The largest axis of the stiffness transformation hyper-ellipsoid is given by this value at each configuration.

+

Dynamics

+

+

Introduction

+

The dynamic analysis of parallel manipulators presents an inherent complexity due to their closed-loop structure. +Several approaches have been proposed.

+

Traditional Newton-Euler formulation is used for dynamic analysis of general parallel manipulators. +In this formulation, the equation of motion of each limb and the moving platform must be derived, which inevitably leads to a large number of equations and less computational efficiency. +On the other hand, all the reaction forces can be computed, which is very useful in the design of a parallel manipulator.

+

The Lagrangian formulation eliminates all the unwanted reaction forces at the outset, and therefore, is quite efficient. +However, because of the constraints imposed by the closed-loop structure, deriving explicit equations of motions in terms of a set of generalized coordinates becomes a prohibitive task.

+

A third approach is to use the principle of virtual work, in which the computation of the constraint forces are bypassed. +In this method, inertial forces and moments are computed using linear and angular accelerations of the bodies. +Then, the whole manipulator is considered to be in static equilibrium by using the d’Alembert’s principle, and the principle of virtual work is applied to derive the input forces and torques.

+

Different objectives require different forms of formulations, there are three key issues pursued to derive dynamic formulation of parallel manipulators:

+
    +
  1. Calculation of internal forces either active or passive for the design process of the manipulator
  2. +
  3. Study on dynamical properties of the manipulator for controller design
  4. +
  5. Utilization of dynamic specifications in an inverse dynamics controller or any model-based control topology
  6. +
+

The first item is the main advantage of the Newton-Euler formulation, the second and third items are the benefits of using the Lagrange or virtual work approaches.

+

The dynamic equations in an explicit form can be written as:

+

\begin{equation} +\tcmbox{\bm{M}(\bm{\mathcal{X}}) \ddot{\bm{\mathcal{X}}} + \bm{C}(\bm{\mathcal{X}}, \dot{\bm{\mathcal{X}}}) \dot{\bm{\mathcal{X}}} + \bm{G}(\bm{\mathcal{X}}) = \bm{\mathcal{F}}} +\end{equation}

+

in which:

+
    +
  • \(\bm{\mathcal{X}}\) is a vector of the generalized coordinates
  • +
  • \(\bm{M}(\bm{\mathcal{X}})\) denotes the system mass matrix
  • +
  • \(\bm{C}(\bm{X},\dot{\bm{X}})\) denotes the Coriolis and centrifugal matrix
  • +
  • \(\bm{G}(\bm{X})\) denotes the gravity vector
  • +
  • \(\bm{\mathcal{F}}\) denotes the generalized force
  • +
+

Deriving explicit dynamic equations for parallel manipulators is a very prohibitive task because of the closed-loop nature of the manipulator.

+

Dynamics of the Rigid Bodies

+

Acceleration of Rigid Bodies

+
+
+

The acceleration analysis consists of studying the variations of linear velocity of a point and angular velocity of a rigid body with respect to time.

+
+

Direct differentiation of these vectors with respect to time in a fixed frame leads to linear velocity of a point and angular velocity of a rigid body, respectively. +Note that, to determine the absolute linear velocity of a point, the derivative must be calculated relative to a fixed frame. +In the study of robotic manipulators, usually multiple moving frames are defined to carefully determine the motion of the moving platform. +Therefore, it is necessary to define the required arithmetics to transform the relative accelerations into absolute ones.

+
Angular Acceleration of a Rigid Body
+

To define angular acceleration of a rigid body, consider a moving frame \(\{\bm{B}\}\) attached to the rigid body, and the motion analyzed with respect to a fixed frame. +Angular acceleration is an attribute of a rigid body and describes the variation of angular velocity of frame \(\{\bm{B}\}\) with respect to time.

+
+
+

Angular acceleration vector, denoted by the symbol \(\dot{\bm{\Omega}}\), describes the instantaneous change of the angular velocity of frame \(\{\bm{B}\}\), denoted by \(\bm{\Omega}\), with respect to the fixed frame \(\{\bm{A}\}\):

+

\begin{equation} +\begin{aligned} +\dot{\bm{\Omega}} = \frac{d \bm{\Omega}}{dt} &= \ddot{\theta} \hat{\bm{s}} + \dot{\theta} \dot{\hat{\bm{s}}} \\\
+&= \ddot{\theta} \hat{\bm{s}} + \dot{\theta} (\bm{\Omega} \times \hat{\bm{s}}) \\\
+&= \ddot{\theta} \hat{\bm{s}} +\end{aligned} +\end{equation}

+

where \(\{\theta, \hat{\bm{s}}\}\) are the screw parameters representing the rotation of the rigid body.

+
+

As shown by eq:angular_acceleration, the angular acceleration of the rigid body is also along the screw axis \(\hat{\bm{s}}\) with a magnitude equal to \(\ddot{\theta}\).

+
Linear Acceleration of a Point
+

Linear acceleration of a point \(P\) can be easily determined by time derivative of the velocity vector \(\bm{v}_P\) of that point with respect to a fixed frame:

+

\begin{equation} +\bm{a}_p = \dot{\bm{v}}_p = \left( \frac{d\bm{v}_p}{dt} \right)_\text{fix} +\end{equation}

+

Note that this is correct only if the derivative is taken with respect to a fixed frame.

+

Now consider the general motion of a rigid body, in which a moving frame \(\{\bm{B}\}\) is attached to the rigid body and the problem is to find the absolute acceleration of point \(P\) with respect to the fixed frame \(\{\bm{A}\}\). +The rigid body performs a general motion, which is a combination of a translation, denoted by the velocity vector \({}^A\bm{v}_{O_B}\), and an instantaneous angular rotation denoted by \(\bm{\Omega}\) (see Figure fig:general_motion). +To determine acceleration of point \(P\), we start with the relation between absolute and relative velocities of point \(P\):

+

\begin{equation} +{}^A\bm{v}_P = {}^A\bm{v}_{O_B} + {}^A\bm{R}_B{}^B\bm{v}_P + {}^A\bm{\Omega}^\times {}^A\bm{R}_B {}^B\bm{P} +\end{equation}

+

In order to derive acceleration of point \(P\), we differentiate both sides with respect to time and we obtain

+

\begin{equation} +\begin{split} +{}^A\bm{a}_p\ &= {}^A\bm{a}_{O_B} \quad \text{(linear acc. of } \{\bm{B}\} \text{)} \\\
+&+ {}^A\bm{R}_B{}^B\bm{a}_p \quad \text{(relative acc. of } P \text{ w.r.t. } \{\bm{B}\} \text{)} \\\
+&+ {}^A\dot{\bm{\Omega}}^\times {}^A\bm{R}_B {}^B\bm{P} \quad \text{(angular acceleration of } \{\bm{B}\} \text{)} \\\
+&+ {}^A\bm{\Omega}^\times ({}^A\bm{\Omega}^\times {}^A\bm{R}_B {}^B\bm{P}) \quad \text{(centrifugal)} \\\
+&+ 2{}^A\bm{\Omega}^\times {}^A\bm{R}_B {}^B\bm{v}_P \quad \text{(Coriolis)} +\end{split} +\end{equation}

+

For the case where \(P\) is a point embedded in the rigid body, \({}^B\bm{v}_P = 0\) and \({}^B\bm{a}_P = 0\) and we obtain:

+

\begin{equation} +\begin{split} +{}^A\bm{a}_P = {}^A\bm{a}_{O_B} &+ {}^A\dot{\bm{\Omega}}^\times {}^A\bm{R}_B {}^B\bm{P} \\\
+&+ {}^A\bm{\Omega}^\times ({}^A\bm{\Omega}^\times {}^A\bm{R}_B {}^B\bm{P}) +\end{split} +\end{equation}

+

Mass Properties

+

In this section, the properties of mass, namely center of mass, moments of inertia and its characteristics and the required transformations are described.

+

+
+ Figure 10: Mass properties of a rigid body
+

Figure 10: Mass properties of a rigid body

+
+
+ +
Center of Mass
+

Consider a reference frame \(\{\bm{A}\}\) in which the mass distribution of a material body is measured, and let \(\bm{p}\) denote the position vector of a differential mass \(\rho dV\) with respect to a reference frame.

+

The center of mass of a rigid body is defined as the point \(C\) which satisfied the following condition

+

\begin{equation} +\bm{p}_c = \frac{1}{m} \int_V \bm{p} \rho dV +\end{equation}

+

in which the mass of the material body \(\{\bm{B}\}\) with density \(\rho\) and volume \(V\) is defined as

+

\begin{equation} +m = \int_V \rho dV +\end{equation}

+
Moments of Inertia
+

As opposed to the mass, which introduces inertia to linear accelerations, moment of inertia is the property of mass which introduces inertia to angular accelerations. +Basically, for rotational motion, the distribution of mass with respect to the axis of rotation introduces resistance to the angular acceleration.

+

Moments of inertia \(\bm{I}\) about \(\bm{A}\) is defined by the second moment of the mass with respect to a reference frame of rotation as:

+

\begin{equation} +{}^A\bm{I} = \begin{bmatrix} +I_{XX} & I_{XY} & I_{XZ} \\\
+I_{YX} & I_{YY} & I_{YZ} \\\
+I_{ZX} & I_{ZY} & I_{ZZ} +\end{bmatrix} +\end{equation}

+

in which

+

\begin{equation*} +\begin{aligned} +I_{XX} &= \int_V (y^2 + z^2) \rho dV, \quad I_{XY} = I_{YX} = -\int_V xy \rho dV \\\
+I_{YY} &= \int_V (x^2 + z^2) \rho dV, \quad I_{YZ} = I_{ZY} = -\int_V yz \rho dV \\\
+I_{ZZ} &= \int_V (x^2 + y^2) \rho dV, \quad I_{XZ} = I_{ZX} = -\int_V xz \rho dV +\end{aligned} +\end{equation*}

+
Principal Axes
+

As seen in equation eq:moment_inertia, the inertia matrix elements are a function of mass distribution of the rigid body with respect to the frame \(\{\bm{A}\}\). +Hence, it is possible to find orientations of frame \(\{\bm{A}\}\) in which the product of inertia terms vanish and inertia matrix becomes diagonal:

+

\begin{equation} +{}^A\bm{I} = \begin{bmatrix} +I_{XX} & 0 & 0 \\\
+0 & I_{YY} & 0 \\\
+0 & 0 & I_{ZZ} +\end{bmatrix} +\end{equation}

+

Such axes are called the principal axes of inertia, and diagonal terms are called the principal moments of inertia, which represent the maximum, minimum and intermediate values of the moments of inertia for a particular chosen origin \(\{\bm{A}\}\).

+

It can be shown that the principal moments of inertial and principal axes are invariant parameters and can be determined from an eigen value decomposition of the inertia matrix in any configuration of the reference frame \(\{\bm{A}\}\).

+
Inertia Matrix Transformations
+

The moment of inertia is usually given for frames passing through the center of mass of the rigid body. +The inertia matrix changes under change of the reference frame.

+

Consider frame \(\{\bm{C}\}\) parallel to \(\{\bm{A}\}\) and attached to the center of mass of a rigid body and let \(\bm{p}_c = [x_c, y_c, z_c]^T\) denote the vector of the position of the center of mass with respect to frame \(\{\bm{A}\}\). +The relation between the inertia matrix about \(A\) and that about \(C\) is given by the following relation:

+

\begin{equation} +\tcmbox{{}^A\bm{I} = {}^C\bm{I} + m(\bm{p}_c^T \bm{p}_c \bm{I}_{3 \times 3} - \bm{p}_c \bm{p}_c^T)} +\end{equation}

+

in which \(m\) denotes the mass of the rigid body and \(\bm{I}_{3 \times 3}\) denotes the identity matrix.

+

On the other hand, if the reference frame \(\{B\}\) has pure rotation with respect to the frame attached to the center of mass \(\{A\}\):

+

\begin{equation} +{}^A\bm{I} = {}^A\bm{R}_C {}^C\bm{I} {}^A\bm{R}_C^T +\end{equation}

+

Momentum and Kinetic Energy

+
Linear Momentum
+

Linear momentum of a material body, shown in Figure fig:angular_momentum_rigid_body, with respect to a reference frame \(\{\bm{A}\}\) is defined as

+

\begin{equation} +{}^A\bm{G} = \int_V \frac{d\bm{p}}{dt} \rho dV +\end{equation}

+

For any mass element \(\rho dV\), the position vector \(\bm{p}\) can be written as +\[ p = p_c + r \]

+

And because \(\int_V r \rho dV = 0\), we have by substitution +\[ {}^A\bm{G} = \frac{d\bm{p}_c}{dt} \int_V \rho dV \] +and thus

+

\begin{equation} +\tcmbox{{}^A\bm{G} = m \cdot {}^A\bm{v}_C} +\end{equation}

+

in which \({}^A\bm{v}_C\) denotes the velocity of the center of mass with respect to the frame \(\{\bm{A}\}\).

+

This result implies that the total linear momentum of differential masses is equal to the linear momentum of a point mass \(m\) located at the center of mass. +This highlights the important of the center of mass in dynamic formulation of rigid bodies.

+

+
+ Figure 11: The components of the angular momentum of a rigid body about \(A\)
+

Figure 11: The components of the angular momentum of a rigid body about \(A\)

+
+
+ +
Angular Momentum
+

Consider the solid body represented in Figure fig:angular_momentum_rigid_body. +Angular momentum of the differential masses \(\rho dV\) about a reference point \(A\), expressed in the reference frame \(\{\bm{A}\}\) is defined as +\[ {}^A\bm{H} = \int_V \left(\bm{p} \times \frac{d\bm{p}}{dt} \right) \rho dV \] +in which \(d\bm{p}/dt\) denotes the velocity of differential mass with respect to the reference frame \(\{\bm{A}\}\).

+

By substituting \(\bm{p} = \bm{p}_c + \bm{r}\) in the previous equations, be obtain: +\[ {}^A\bm{H} = \bm{p}_c \times m \bm{v}_c + \int_V \bm{r} \times (\bm{\Omega} \times \bm{r}) \rho dV \]

+

Therefore, angular momentum of the rigid body about point \(A\) is reduced to

+

\begin{equation} +\tcmbox{{}^A\bm{H} = \bm{p}_c \times \bm{G}_c + {}^C\bm{H}} +\end{equation}

+

in which +\[ {}^C\bm{H} = \int_V \bm{r} \times (\bm{\Omega} \times \bm{r}) \rho dV = {}^C\bm{I} \cdot \bm{\Omega} \]

+

Equation eq:angular_momentum reveals that angular momentum of a rigid body about a point \(A\) can be written as \(\bm{p}_c \times \bm{G}_c\), which is the contribution of linear momentum of the rigid body about point \(A\), and \({}^C\bm{H}\) which is the angular momentum of the rigid body about the center of mass.

+

This also highlights the important of the center of mass in the dynamic analysis of rigid bodies. +If the center of mass is taken as the reference point, the relation describing angular momentum eq:angular_momentum is very analogous to that of linear momentum eq:linear_momentum.

+
Kinetic Energy
+

The Kinetic energy of a rigid body is defined as

+

\begin{equation} +\tcmbox{\bm{K} = \frac{1}{2} \int_V \bm{v} \cdot \bm{v} \rho dV} +\end{equation}

+

The velocity of a differential mass \(\rho dV\) can be represented by linear velocity of the center of mass and angular velocity of the rigid body as +\[ \bm{v} = \bm{v}_p + \bm{\Omega} \times \bm{r} \]

+

By substitution, the kinetic energy of the rigid body may be obtained by:

+

\begin{equation} +\tcmbox{\bm{K} = \frac{1}{2} \bm{v}_c \times \bm{G}_c + \frac{1}{2} \bm{\Omega} \cdot {}^C\bm{H}} +\end{equation}

+

in which \(\bm{G}_C\) is the linear momentum of the rigid body and \({}^C\bm{H}\) is the angular momentum of the rigid body about the center of mass.

+

This equation reveals that kinetic energy of a moving body can be represented as the kinetic energy of a point mass located as the center of mass, in addition to the kinetic energy of a body rotating about the center of mass.

+

Newton-Euler Laws

+

The Newton and Euler laws can be written for three different cases where the angular motion:

+
    +
  1. is about a fixed point in space
  2. +
  3. is represented about the center of mass
  4. +
  5. is represented about an arbitrary moving point in space
  6. +
+

We only examine the case in which all rotations are represented about the center of mass.

+

Consider a rigid body under general motion, that is, a combination of translation and rotation.

+
+
+

The Newton’s law relates the change of linear momentum of the rigid body to the resulting external forces applied to it +\[ \sum \bm{f}_\text{ext} = \frac{d\bm{G}_c}{dt} \]

+
+

For the case of a constant mass rigid body, this law is reduced to +\[ \sum \bm{f}_\text{ext} = m \frac{d\bm{v}_c}{dt} = m \bm{a}_c \] +in which \(\bm{a}_c\) is the linear acceleration of the center of mass.

+
+
+

The Euler’s law relates the change of angular momentum of a rigid body about the center of mass, to the summation of all external moments applied to the rigid body about center of mass +\[ \sum {}^c\bm{n}_\text{ext} = \frac{d}{dt}({}^c\bm{H}) \]

+
+

For the case of a constant mass rigid body, this law is reduced to +\[ \sum {}^c\bm{n}_\text{ext} = \frac{d}{dt}({}^c\bm{I} \bm{\Omega}) = {}^c\bm{I} \dot{\bm{\Omega}} + \bm{\Omega} \times ({}^c\bm{I} \bm{\Omega}) \] +in which \(\sum {}^c\bm{n}_\text{ext}\) is the summation of all external moments applied to the rigid body about the center of mass, \({}^c\bm{I}\) is the moment of inertia about the center of mass, and \(\bm{\Omega}\) is the angular velocity of the rigid body.

+

Newton-Euler Formulation

+

The most popular approach used in robotics to derive the dynamic equation of motion of a parallel manipulator is the Newton-Euler formulation.

+

In the Newton-Euler formulation, the free-body diagrams of all the limbs and moving platform are considered and the Newton Euler laws are applied to each isolated body. +To apply the laws to each body, it is necessary to derive linear acceleration of links, center of mass, as well as angular acceleration of the links. +Hence, acceleration analysis would be performed on all the links of the manipulator and the moving platform.

+

Furthermore, all the external forces and moments applied to the links and to the moving platform must be carefully determined. +Gravitational forces acting on the center of masses, frictional forces and moments acting on the joints, and any possible disturbance force or moment applied to the links and to the moving platform would be identified. +The most important external forces or moments applied on the manipulator are the one applied by the actuators, denoted by \(\bm{\tau} = [\tau_{1}, \tau_{2}, \dots, \tau_{m}]^{T}\). +The forces and moments shall be derived from the set of Newton-Euler laws, which are written separately for each link and the moving platform.

+

Finally, by elimination of these constraints forces and moments on the Newton-Euler equations written for the moving platform, the dynamic equations relating the actuator forces and moments \(\bm{\tau}\) to the motion variables of the moving platform \(\bm{\mathcal{X}}\), \(\dot{\bm{\mathcal{X}}}\) and \(\ddot{\bm{\mathcal{X}}}\) are derived.

+

Dynamic Formulation of the Stewart-Gough Platform

+
Acceleration Analysis
+

In acceleration analysis, it is intended to derive expressions for linear and angular acceleration of the limbs, namely \(\ddot{l}_{i}\) and \(\dot{\bm{\omega}}_{i}\) as a function of the moving platform acceleration \(\ddot{\bm{\mathcal{X}}} = [\dot{\bm{v}}_{p}, \dot{\bm{\omega}}]^{T}\). +To obtain such a relation, let us rewrite the velocity loop closure:

+

\begin{equation} +\bm{v}_{p} + \bm{\omega} \times \bm{b}_{i} = \dot{l}_{i} \hat{\bm{s}}_{i} + l_{i}(\bm{\omega}_{i} \times \hat{\bm{s}}_{i}) +\end{equation}

+

Since there is no actuation torque about \(\hat{\bm{s}}_{i}\), the limb angular velocity and acceleration vectors (\(\bm{\omega}_i\) and \(\dot{\bm{\omega}}_i\)) are normal to \(\hat{\bm{s}}_{i}\) provided that the following assumption are considered for the platform:

+
    +
  • both end joints of the limb are spherical
  • +
  • the limbs are symmetric with respect to their axes
  • +
  • the effects of friction in spherical joints are neglected
  • +
+

Considering these assumptions, it can be concluded that the limbs cannot spin about their axes: \(\bm{\omega}_{i} \cdot \hat{\bm{s}}_{i} = 0\) and \((\hat{\bm{s}}_i \times (\bm{\omega}_i \times \hat{\bm{s}}_i)) = \bm{\omega}_i\).

+

To obtain the angular velocity of the limbs \(\bm{\omega}_{i}\), we cross multiply \(\hat{\bm{s}}_{i}\) to both sides of the previous equation:

+

\begin{equation} +\bm{\omega}_{i} = \frac{1}{l_i} ( \hat{\bm{s}}_i \times \bm{v}_{b_i} ) +\end{equation}

+

With \(\bm{v}_{b_{i}}\) an intermediate variable corresponding to the velocity of point \(\bm{b}_{i}\):

+

\begin{equation} +\bm{v}_{b_{i}} = \bm{v}_{p} + \bm{\omega} \times \bm{b}_{i} +\end{equation}

+

As illustrated in Figure fig:free_body_diagram_stewart, the piston-cylinder structure of the limbs is decomposed into two separate parts, the masses of which are denoted by \(m_{i_1}\) and \(m_{i_2}\). +The position vector of these two center of masses can be determined by the following equations:

+

\begin{align} +\bm{p}_{i_1} &= \bm{a}_{i} + c_{i_1} \hat{\bm{s}}_{i} \\\
+\bm{p}_{i_2} &= \bm{a}_{i} + ( l_i - c_{i_2}) \hat{\bm{s}}_{i} +\end{align}

+

+
+ Figure 12: Free-body diagram of the limbs and the moving platform of a general Stewart-Gough manipulator
+

Figure 12: Free-body diagram of the limbs and the moving platform of a general Stewart-Gough manipulator

+
+
+ +

By differentiating the previous equations and doing some manipulations, we obtain:

+

\begin{align} +\ddot{l}_i &= \bm{a}_{b_i} \times \hat{\bm{s}}_i + l_i (\bm{\omega_i} \cdot \bm{\omega_i}) \\\
+\dot{\bm{\omega}}_i &= \frac{1}{l_i} (\hat{\bm{s}}_i \times \bm{a}_{b_i} - 2 \dot{l}_i \bm{\omega}_i) \\\
+\bm{a}_{i_1} &= c_{i_1} ( \dot{\bm{\omega}}_i \times \hat{\bm{s}}_{i} + \bm{\omega}_i \times (\bm{\omega}_i \times \hat{\bm{s}}_i)) \\\
+\bm{a}_{i_2} &= ( l_i - c_{i_2}) (\dot{\bm{\omega}}_i \times \hat{\bm{s}}_{i} - (\bm{\omega}_i \cdot \bm{\omega}_i) \hat{\bm{s}}_i) + 2 \dot{l}_i (\bm{\omega}_i \times \hat{\bm{s}}_i) + \ddot{l}_i \hat{\bm{s}}_i +\end{align}

+

with

+

\begin{equation} +\bm{a}_{b_i} = \bm{a}_p + \dot{\bm{\omega}} \times \bm{b}_i + \bm{\omega} \times (\bm{\omega} \times \bm{b}_i) +\end{equation}

+
Dynamic Formulation of the Limbs
+

To derive the dynamic formulation of the Stewart-Gough platform, the manipulator is decomposed into a moving platform and six identical limbs. +We assume that each limb consists of two parts, the cylinder and the piston, where the velocities and the accelerations of their centers of masses are determined. +We also assume that the centers of masses of the cylinder and the piston are located at a distance of \(c_{i_1}\) and \(c_{i_2}\) above their foot points, and their masses are denoted by \(m_{i_1}\) and \(m_{i_2}\). +Moreover, consider that the pistons are symmetric about their axes, and their centers of masses lie at their midlengths.

+

The free-body diagrams of the limbs and the moving platforms is given in Figure fig:free_body_diagram_stewart. +The reaction forces at fixed points \(A_i\) are denoted by \(\bm{f}_{a_i}\), the internal force at moving points \(B_i\) are dentoed by \(\bm{f}_{b_i}\), and the internal forces and moments between cylinders and pistons are denoted by \(\bm{f}_{c_i}\) and \(\bm{M_{c_i}}\) respectively.

+

Assume that the only existing external disturbance wrench is applied on the moving platform and is denoted by \(\bm{\mathcal{F}}_d = [\bm{F}_d, \bm{n}_d]^T\).

+
+
+

\begin{equation} +\begin{aligned} +\bm{f}_{b_i} &= \frac{1}{l_i}(I_{xx_i} + l_i^2 m_{c_e}) \hat{\bm{s}}_i \times \dot{\bm{\omega}}_i \\\
+&\quad + \frac{2}{l_i} m_{i_2} c_{i_2} \dot{l}_i \hat{\bm{s}}_i \times \bm{\omega}_i \\\
+&\quad - m_{g_e} \hat{\bm{s}}_i \times (\hat{\bm{s}}_i \times \bm{g}) +\end{aligned} +\end{equation}

+

in which \(m_{c_e}\) is defined as

+

\begin{equation} +m_{c_e} = \frac{1}{l_i^2} \left( m_{i_1} c_{i_1}^2 + m_{i_2} c_{i_2}^2 \right) +\end{equation}

+
+
Dynamic Formulation of the Moving Platform
+

Assume that the moving platform center of mass is located at the center point \(P\) and it has a mass \(m\) and moment of inertia \({}^A\bm{I}_{P}\). +Furthermore, consider that gravitational force and external disturbance wrench are applied on the moving platform, \(\bm{\mathcal{F}}_d = [\bm{F}_d, \bm{n}_d]^T\) as depicted in Figure fig:free_body_diagram_stewart.

+

The Newton-Euler formulation of the moving platform is as follows:

+

\begin{align} +\sum \bm{F}_{\text{ext}} &= \sum_{i=1}^6 \bm{f}_{b_i} + m \bm{g} + \bm{F}_{d} = m \bm{a}_p \\\
+\sum {}^p\bm{n}_{\text{ext}} &= \bm{n}_d + \sum_{i=1}^6 \bm{b}_i \times \bm{f}_{b_i} \nonumber \\\
+& = {}^{A}\bm{I}_{P} \dot{\bm{\omega}} + \bm{\omega} \times {}^{A}\bm{I}_{P} \bm{\omega} +\end{align}

+

in which \({}^A\bm{I}_P\) is considered in the fixed frame \(\{\bm{A}\}\) and can be calculated by:

+

\begin{equation} +{}^A\bm{I}_P = {}^A\bm{R}_B {}^B\bm{I}_P {}^A\bm{R}_B^T +\end{equation}

+

These equations can be rewritten in an implicit form as

+
+
+

\begin{align} +& m(\bm{a}_p - \bm{g}) - \bm{F}_d - \sum_{i=1}^{6} \bm{f}_{b_i} = \bm{0} \label{eq:dyn_form_implicit_trans}\\\
+& {}^A\bm{I}_P \dot{\bm{\omega}} + \bm{\omega} \times {}^A\bm{I}_P\bm{\omega} - \bm{n}_d - \sum_{i=1}^{6} \bm{b}_{i} \times \bm{f}_{b_i} = \bm{0} \label{eq:dyn_form_implicit_rot} +\end{align}

+
+

These two equations are the governing dynamic formulation of the Stewart-Gough platform, in which \(\bm{\mathcal{F}}_d = [\bm{F}_{d}, \bm{n}_{d}]^T\) denotes the disturbance wrench exerted on the moving plateform.

+

They can be viewed in an implicit vector form of

+

\begin{equation} +\bm{f}(\bm{\mathcal{X}}, \dot{\bm{\mathcal{X}}}, \ddot{\bm{\mathcal{X}}}, \bm{\mathcal{F}}_d, \bm{\tau}) = \bm{0} +\end{equation}

+

in which \(\bm{\mathcal{X}} = [\bm{x}_P, \bm{\theta}]^T\) is the motion variable of the moving platform consisting of the linear position of point \(P\) and the moving platform orientation represented by screw coordinates.

+

Closed-Form Dynamics

+

While dynamic formulation in the form of Equation eq:dynamic_formulation_implicit can be used to simulate inverse dynamics of the Stewart-Gough platform, its implicit nature makes it unpleasant for the dynamic analysis and control.

+
Closed-Form Dynamics of the Limbs
+

To derive a closed-form dynamic formulation for the Stewart-Gough platform as

+

\begin{equation} +\bm{M}(\bm{\mathcal{X}})\ddot{\bm{\mathcal{X}}} + \bm{C}(\bm{\mathcal{X}}, \dot{\bm{\mathcal{X}}})\dot{\bm{\mathcal{X}}} + \bm{G}(\bm{\mathcal{X}}) = \bm{\mathcal{F}} +\end{equation}

+

first consider an intermediate generalized coordinate \(x_i\), which is in fact the position of point \(b_i\). +This generalized coordinate is used to harmonize the limb and the moving platform dynamic formulation and to derive an closed-form structure for the whole manipulator.

+

Now, manipulate each limb dynamic equations to convert them into the closed form. +Let us first introduce some relations to substitute kinematic parameters like \(\dot{\bm{\omega}}_i\), \(\ddot{\bm{\omega}}_i\), \(\ddot{l}_i\) with the intermediate generalized coordinate \(x_i\) and its time derivatives.

+

After some manipulations, we obtain the following closed form equation:

+

\begin{equation} +\bm{M}_i \ddot{\bm{x}}_i + \bm{C}_i \dot{\bm{x}}_i + \bm{G}_i = \bm{F}_i +\end{equation}

+

the corresponding mass matrix \(\bm{M}_i\), the Coriolis matrix \(\bm{C}_i\), and the gravity vector \(\bm{G}_i\) can be simplified into the following form:

+

\begin{align} +\bm{M}_i &= m_{i_2}\hat{\bm{s}}_i \hat{\bm{s}}_i^T - \frac{1}{l_i^2} I_{xx_i} \hat{\bm{s}}_{i \times}^2 \\\
+\bm{C}_i &= -\frac{2}{l_i} m_{c_o}\dot{l}_i \hat{\bm{s}}_{i\times}^2 - \frac{1}{l_i^2} m_{i_2} c_{i_2} \hat{\bm{s}}_i \dot{\bm{x}}_i^T \hat{\bm{s}}_{i \times}^2 \\\
+\bm{G}_i &= \big( m_{g_e} \hat{\bm{s}}_{i\times}^2 - m_{i_2} \hat{\bm{s}}_i \hat{\bm{s}}_i^T \big) \bm{g} \\\
+\bm{F}_i &= -\bm{f}_{b_i} + \tau_i \hat{\bm{s}}_i +\end{align}

+

in which

+

\begin{align} +m_{c_e} &= \frac{1}{l_i^2} (m_{i_1} c_{i_1}^2 + m_{i_2} c_{i_2}^2) \\\
+m_{c_o} &= \frac{1}{l_i} m_{i_2} c_{i_2} - \frac{1}{l_i^2} (I_{xx_i} + l_i^2 m_{c_e}) \\\
+m_{g_e} &= \frac{1}{l_i} (m_{i_1} c_{i_1} + m_{i_2}(l_i - c_{i_2})) +\end{align}

+
Closed-Form Dynamics of the Moving Platform
+

In this section, the dynamic equations of the moving platform are transformed in the following closed-form formulation

+

\begin{equation} +\bm{M}_{p}\ddot{\bm{\mathcal{X}}} + \bm{C}_{p}\dot{\bm{\mathcal{X}}} + \bm{G}_{p} = \bm{\mathcal{F}}_{p} +\end{equation}

+

in which \(\bm{\mathcal{X}}\) consists of six coordinates: the first three \(\bm{x}_p\) represent linear motion of the moving platform, and the last three \(\bm{\theta}\) its angular motion. +It is preferable to use the screw coordinates for representing the angular motion as its derivative is also a vector representing angular velocity:

+

\begin{equation} +\tcmbox{\bm{\mathcal{X}} = \begin{bmatrix}\bm{x}_p \ \bm{\theta}\end{bmatrix}; \quad +\dot{\bm{\mathcal{X}}} = \begin{bmatrix}\bm{v}_p \ \bm{\omega}\end{bmatrix}; \quad +\ddot{\bm{\mathcal{X}}} = \begin{bmatrix}\bm{a}_p \ \dot{\bm{\omega}}\end{bmatrix}} +\end{equation}

+

Equations eq:dyn_form_implicit_trans and eq:dyn_form_implicit_rot can be simply converted into a closed form of Equation eq:close_form_dynamics_platform with the following terms:

+

\begin{equation} +\begin{aligned} +&\bm{M}_p = \begin{bmatrix} m\bm{I}_{3 \times 3} & \bm{O}_{3\times 3} \ \bm{O}_{3\times 3} & {}^A \bm{I}_p \end{bmatrix}_{6\times 6}; \bm{C}_p = \begin{bmatrix} \bm{O}_{3\times 3} & \bm{O}_{3\times 3} \ \bm{O}_{3\times 3} & \omega_{\times} {}^A\bm{I}_p \end{bmatrix}_{6 \times 6} \\\
+&\bm{G}_p = \begin{bmatrix}-m\bm{g} \ \bm{O}_{3\times 1}\end{bmatrix}_{6 \times 1}; \bm{\mathcal{F}}_p = \begin{bmatrix} \bm{F}_d + \sum \bm{f}_{b_i} \ \bm{n}_d + \sum \bm{b}_{i \times} \bm{f}_{b_i} \end{bmatrix}_{6\times 1} +\end{aligned} +\end{equation}

+
Closed-Form Dynamics of the Stewart-Gough Manipulator
+

To derive the closed-form dynamic formulation for the whole manipulator, a transformation is required to map the intermediate generalized coordinates \(x_i\) into the principal generalized coordinates \(\bm{\mathcal{X}}\).

+

Using such a transformation, and by adding the resulting equations of the limbs and the moving platform, the internal forces \(\bm{f}_{b_i}\) can be eliminated, and closed-form dynamic formulation for the whole manipulator can be derived.

+

To generate such a transformation define a Jacobian matrix \(\bm{J}_i\) relating the intermediate coordinates to that of the principal generalized coordinate:

+

\begin{equation} +\dot{\bm{x}}_i = \bm{J}_i \dot{\bm{\mathcal{X}}} +\end{equation}

+

in which

+

\begin{equation} +\bm{J}_i = \begin{bmatrix} \bm{I}_{3 \times 3} & -\bm{b}_{i \times} \end{bmatrix} +\end{equation}

+

\begin{equation} +\bm{M}_{li} \ddot{\bm{x}}_i + \bm{C}_{li} + \dot{\bm{x}}_i + \bm{G}_{li} = \bm{\mathcal{F}}_{li} +\end{equation}

+

in which

+

\begin{equation} +\begin{aligned} +\bm{M}_{li} = \bm{J}_i^T \bm{M}_i \bm{J}_i; \quad & \bm{C}_{li} = J_i^T \bm{M}_i \dot{\bm{J}}_i + \bm{J}_i^T \bm{C}_i \bm{J}_i \\\
+\bm{G}_{li} = \bm{J}_i^T G_i; \quad & \bm{\mathcal{F}}_{li} = \bm{J}_i^T \bm{F}_i +\end{aligned} +\end{equation}

+
+
+

\begin{equation} +\begin{aligned} +\bm{M}(\bm{\mathcal{X}}) &= \bm{M}_p + \sum_{i=1}^6 \bm{M}_{li} \\\
+\bm{C}(\bm{\mathcal{X}}, \dot{\bm{\mathcal{X}}}) &= \bm{C}_p + \sum_{i=1}^6 \bm{C}_{li} \\\
+\bm{G}(\bm{\mathcal{X}}) &= \bm{G}_p + \sum_{i=1}^6 \bm{G}_{li} \\\
+\bm{\mathcal{F}}(\bm{\mathcal{X}}) &= \bm{\mathcal{F}}_d + \sum_{i=1}^6 \bm{\mathcal{F}}_{\tau_i} +\end{aligned} +\end{equation}

+
+
Forward Dynamics Simulations
+

As shown in Figure fig:stewart_forward_dynamics, it is assumed that actuator forces and external disturbance wrench applied to the manipulator are given and the resulting trajectory of the moving platform is to be determined.

+

+
+ Figure 13: Flowchart of forward dynamics implementation sequence
+

Figure 13: Flowchart of forward dynamics implementation sequence

+
+
+ +

The closed-form dynamic formulation of the Stewart-Gough platform corresponds to the set of equations given in eq:closed_form_dynamic_stewart_wanted, whose terms are given in eq:close_form_dynamics_stewart_terms.

+
Inverse Dynamics Simulation
+

In inverse dynamics simulations, it is assumed that the trajectory of the manipulator is given, and the actuator forces required to generate such trajectories are to be determined.

+

As illustrated in Figure fig:stewart_inverse_dynamics, inverse dynamic formulation is implemented in the following sequence. +The first step is trajectory generation for the manipulator moving platform. +Many different algorithms are developed for a smooth trajectory generation. +For such a trajectory, \(\bm{\mathcal{X}}_{d}(t)\) and the time derivatives \(\dot{\bm{\mathcal{X}}}_{d}(t)\), \(\ddot{\bm{\mathcal{X}}}_{d}(t)\) are known.

+

The next step is to solve the inverse kinematics of the manipulator and to find the limbs’ linear and angular positions, velocity and acceleration as a function of the manipulator trajectory. +The manipulator Jacobian matrix \(\bm{J}\) is also calculated in this step.

+

Next, the dynamic matrices given in the closed-form formulations of the limbs and the moving platform are calculated using equations eq:closed_form_intermediate_parameters and eq:close_form_dynamics_stewart_terms, respectively.

+

To combine the corresponding matrices, an to generate the whole manipulator dynamics, it is necessary to find intermediate Jacobian matrices \(\bm{J}_i\), given in eq:jacobian_intermediate, and then compute compatible matrices for the limbs given in eq:closed_form_stewart_manipulator. +Now that all the terms required to computed to actuator forces required to generate such a trajectory is computed, let us define \(\bm{\mathcal{F}}\) as the resulting Cartesian wrench applied to the moving platform. +This wrench can be calculated from the summation of all inertial and external forces excluding the actuator torques \(\bm{\tau}\) in the closed-form dynamic formulation eq:closed_form_dynamic_stewart_wanted.

+

By this definition, \(\bm{\mathcal{F}}\) can be viewed as the projector of the actuator forces acting on the manipulator, mapped to the Cartesian space. +Since there is no redundancy in actuation in the Stewart-Gough manipulator, the Jacobian matrix \(\bm{J}\), squared and actuator forces can be uniquely determined from this wrench, by \(\bm{\tau} = \bm{J}^{-T} \bm{\mathcal{F}}\), provided \(\bm{J}\) is non-singular. +Therefore, actuator forces \(\bm{\tau}\) are computed in the simulation from

+

\begin{equation} +\bm{\tau} = \bm{J}^{-T} \left( \bm{M}(\bm{\mathcal{X}})\ddot{\bm{\mathcal{X}}} + \bm{C}(\bm{\mathcal{X}}, \dot{\bm{\mathcal{X}}})\dot{\bm{\mathcal{X}}} + \bm{G}(\bm{\mathcal{X}}) - \bm{\mathcal{F}}_d \right) +\end{equation}

+

+
+ Figure 14: Flowchart of inverse dynamics implementation sequence
+

Figure 14: Flowchart of inverse dynamics implementation sequence

+
+
+ +

Virtual Work Formulation

+

Lagrange Formulation

+

\begin{equation} +K(\bm{\mathcal{X}}, \dot{\bm{\mathcal{X}}}) = \frac{1}{2} \dot{\bm{\mathcal{X}}}^T \bm{M}(\bm{\mathcal{X}}) \dot{\bm{\mathcal{X}}} +\end{equation}

+

\begin{equation} +\bm{G}(\bm{\mathcal{X}}) = \frac{\partial P(\bm{\mathcal{X}})}{\partial \bm{\mathcal{X}}} +\end{equation}

+

\begin{equation} +\bm{C}(\bm{\mathcal{X}}, \dot{\bm{\mathcal{X}}}) = \frac{1}{2} (\dot{\bm{M}} + \bm{U}^T - \bm{U}) +\end{equation}

+

Motion Control

+

+

Introduction

+

Parallel robots are designed for two different types of applications.

+

In the first type, the moving platform of the robot accurately follows a desired position and orientation path in a specific time frame, while no interacting forces need to be applied to the environment.

+

The second type of application include situations where the robot moving platform is in contact with a stiff environment (e.g. precision machining). +In such application, the contact force describe the state of interaction more effectively than the position and orientation of the moving platform. +The problem of force control can be described as to derive the actuator forces for such a manipulator required to generate a prescribed desired wrench (force and torque) at the manipulator moving platform, while the manipulator is performing its motion.

+

Although a multiple degrees-of-freedom robotic manipulator can usually be represented by a MIMO and nonlinear model, many industrial controllers for such robots consist of a number of linear controller designed to control individual joint motions. +One of the reasons why such decentralization can perform well in practice is the use of large gear reductions in robot actuators, which significantly reduces the coupling and non linear behavior of robot dynamics.

+

However, using advanced techniques in nonlinear and MIMO control permits to overcome limitations of the SISO approach.

+

Controller Topology

+

+
+
+

In motion control of parallel manipulator, it is assumed that the controller computes the required actuator forces or torques to cause the robot motion to follow a desired position and orientation trajectory.

+
+

Let us use the motion variables as the generalized coordinate of the moving platform defined by \(\bm{\mathcal{X}} = [\bm{x}_P, \bm{\theta}]^T\), in which the linear motion is represented by \(\bm{x}_p = [x_p, y_p, z_p]^T\), while the moving platform orientation is represented by screw coordinates \(\bm{\theta} = \theta[s_x, s_y, s_z]^T = [\theta_x, \theta_y, \theta_z]^T\).

+

Consider the general closed-form dynamics formulation of a parallel robot

+

\begin{equation} +\tcmbox{\bm{M}(\bm{\mathcal{X}})\ddot{\bm{\mathcal{X}}} + \bm{C}(\bm{\mathcal{X}}, \dot{\bm{\mathcal{X}}})\dot{\bm{\mathcal{X}}} + \bm{G}(\bm{\mathcal{X}}) = \bm{\mathcal{F}}} +\end{equation}

+

where

+
    +
  • \(\bm{M}(\bm{\mathcal{X}})\) denotes the mass matrix
  • +
  • \(\bm{C}(\bm{\mathcal{X}}, \dot{\bm{\mathcal{X}}})\) denotes the Coriolis and centrifugal matrix
  • +
  • \(\bm{G}(\bm{\mathcal{X}})\) denotes the gravity vector
  • +
  • \(\bm{\mathcal{F}}\) denotes the generalized forces applied to the moving platform center of mass
  • +
+

The generalized forces can be decomposed as follow +\[ \bm{\mathcal{F}} = \bm{J}^T \bm{\tau} + \bm{\mathcal{F}}_d \] +with

+
    +
  • \(\bm{J}\) is the Jacobian
  • +
  • \(\bm{\tau}\) are the actuator forces
  • +
  • \(\bm{\mathcal{F}}_d\) are any external wrenches
  • +
+
+
+

Control topology is referred to the structure of the control system used to compute the actuator forces/torques from the measurements, and the required pre and post processing.

+
+

For motion control of a manipulator, the controller has to compute the actuator force/torques required to cause the motion of the moving platform according to the desired trajectory. +In general, the desired motion of the moving platform may be represented by the desired generalized coordinate of the manipulator, denoted by \(\bm{\mathcal{X}}_d\).

+

To perform such motion in closed loop, it is necessary to measure the output motion \(\bm{\mathcal{X}}\) of the manipulator by an instrumentation system. +Such instrumentation usually consists of two subsystems: the first subsystem may use accurate accelerometers, or global positioning systems to calculate the position of a point on the moving platform; and a second subsystem may use inertial or laser gyros to determine orientation of the moving platform.

+

Figure fig:general_topology_motion_feedback shows the general topology of a motion controller using direct measurement of the motion variable \(\bm{\mathcal{X}}\), as feedback in the closed-loop system. +In such a structure, the measured position and orientation of the manipulator is compared to its desired value to generate the motion error vector \(\bm{e}_\mathcal{X}\). +The controller uses this error information to generate suitable commands for the actuators to minimize the tracking error.

+

+
+ Figure 15: The general topology of motion feedback control: motion variable \(\bm{\mathcal{X}}\) is measured
+

Figure 15: The general topology of motion feedback control: motion variable \(\bm{\mathcal{X}}\) is measured

+
+
+ +

However, it is usually much easier to measure the active joint variable rather than measuring the final position and orientation of the moving platform. +The relation between the joint variable \(\bm{q}\) and motion variable of the moving platform \(\bm{\mathcal{X}}\) is dealt with the forward and inverse kinematics. +The relation between the differential motion variables \(\dot{\bm{q}}\) and \(\dot{\bm{\mathcal{X}}}\) is studied through the Jacobian analysis.

+

It is then possible to use the forward kinematic analysis to calculate \(\bm{\mathcal{X}}\) from the measured joint variables \(\bm{q}\), and one may use the control topology depicted in Figure fig:general_topology_motion_feedback_bis to implement such a controller.

+

+
+ Figure 16: The general topology of motion feedback control: the active joint variable \(\bm{q}\) is measured
+

Figure 16: The general topology of motion feedback control: the active joint variable \(\bm{q}\) is measured

+
+
+ +

In this topology, the forward kinematic analysis of the manipulator has to be performed to implement the feedback loop. +As described earlier, this is a complex task for parallel manipulators. +It is even more complex when a solution has to be found in real time.

+

However, as shown herein before, the inverse kinematic analysis of parallel manipulators is much easier to carry out. +To overcome the implementation problem of the control topology in Figure fig:general_topology_motion_feedback_bis, another control topology is usually implemented for parallel manipulators.

+

In this topology, depicted in Figure fig:general_topology_motion_feedback_ter, the desired motion trajectory of the robot \(\bm{\mathcal{X}}_d\) is used in an inverse kinematic analysis to find the corresponding desired values for joint variable \(\bm{q}_d\). +Hence, the controller is designed based on the joint space error \(\bm{e}_q\).

+

+
+ Figure 17: The general topology of motion feedback control: the active joint variable \(\bm{q}\) is measured, and the inverse kinematic analysis is used
+

Figure 17: The general topology of motion feedback control: the active joint variable \(\bm{q}\) is measured, and the inverse kinematic analysis is used

+
+
+ +

Therefore, the structure and characteristics of the controller in this topology is totally different from that given in the first two topologies.

+

The input and output of the controller depicted in Figure fig:general_topology_motion_feedback_ter are both in the joint space. +However, this is not the case in the previous topologies where the input to the controller is the motion error in task space, while its output is in the joint space.

+

For the topology in Figure fig:general_topology_motion_feedback_ter, independent controllers for each joint may be suitable.

+

To generate a direct input to output relation in the task space, consider the topology depicted in Figure fig:general_topology_motion_feedback_quater. +A force distribution block is added which maps the generated wrench in the task space \(\bm{\mathcal{F}}\), to its corresponding actuator forces/torque \(\bm{\tau}\).

+

+
+ Figure 18: The general topology of motion feedback control in task space: the motion variable \(\bm{\mathcal{X}}\) is measured, and the controller output generates wrench in task space
+

Figure 18: The general topology of motion feedback control in task space: the motion variable \(\bm{\mathcal{X}}\) is measured, and the controller output generates wrench in task space

+
+
+ +

For a fully parallel manipulator such as the Stewart-Gough platform, this mapping can be constructed from the Jacobian transpose of the manipulator: +\[ \bm{\mathcal{F}} = \bm{J}^T \bm{\tau}; \quad \bm{\tau} = \bm{J}^{-T} \bm{\mathcal{F}} \]

+

Motion Control in Task Space

+

+

Decentralized PD Control

+

In the control structure in Figure fig:decentralized_pd_control_task_space, a number of linear PD controllers are used in a feedback structure on each error component. +The decentralized controller consists of six disjoint linear controllers acting on each error component \(\bm{e}_x = [e_x,\ e_y,\ e_z,\ e_{\theta_x},\ e_{\theta_y},\ e_{\theta_z}]\). +The PD controller is denoted by \(\bm{K}_d s + \bm{K}_p\), in which \(\bm{K}_d\) and \(\bm{K}_p\) are \(6 \times 6\) diagonal matrices denoting the derivative and proportional controller gains for each error term.

+

+
+ Figure 19: Decentralized PD controller implemented in task space
+

Figure 19: Decentralized PD controller implemented in task space

+
+
+ +

Hence, by this structure, each tracking error component is treated separately. +The output of the controller is denoted by \(\bm{\mathcal{F}} = [F_x\ F_y\ F_z\ \tau_x\ \tau_y\ \tau_z]\).

+

In practice, the calculated output wrench is transformed into actuator forces through the force distribution block. +This mapping is implemented through inverse of the manipulator Jacobian transpose by \(\bm{\tau} = \bm{J}^{-T} \bm{\mathcal{F}}\).

+

Different alternatives of linear controllers can be used instead of the PD controller used in this structure, however PD controller is the simplest form which can preserve the manipulator stability while providing suitable tracking performance.

+

The proposed decentralized PD controller is very simple in structure and therefore easily implementable. +The design of such a controller needs no detailed information on the manipulator dynamics. +The controller gains are generally tuned experimentally based on physical realization of the controller by trial and error.

+

Feed Forward Control

+

A feedforward wrench denoted by \(\bm{\mathcal{F}}_{ff}\) may be added to the decentralized PD controller structure as depicted in Figure fig:feedforward_control_task_space. +This term is generated from the dynamic model of the manipulator in the task space, represented in a closed form by the following equation: +\[ \bm{\mathcal{F}}_{ff} = \bm{\hat{M}}(\bm{\mathcal{X}}_d)\ddot{\bm{\mathcal{X}}}_d + \bm{\hat{C}}(\bm{\mathcal{X}}_d, \dot{\bm{\mathcal{X}}}_d)\dot{\bm{\mathcal{X}}}_d + \bm{\hat{G}}(\bm{\mathcal{X}}_d) \]

+

+
+ Figure 20: Feed forward wrench added to the decentralized PD controller in task space
+

Figure 20: Feed forward wrench added to the decentralized PD controller in task space

+
+
+ +

The desired trajectory in task space \(\bm{\mathcal{X}}_d\), and its derivatives \(\dot{\bm{\mathcal{X}}}_d\), \(\ddot{\bm{\mathcal{X}}}_d\) are the required inputs for the feedforward block. +This term is called feedforward since no online information of the output motion trajectory \(\bm{\mathcal{X}}\) is needed for its computation.

+

In order to generate this term, dynamic formulation of the robots and its kinematic and dynamic parameters are needed. +In practice, exact knowledge of dynamic matrices are not available, and therefore, estimate of these matrices are used in practice, denoted by \(\hat{\bm{M}}\), \(\hat{\bm{C}}\) and \(\hat{\bm{G}}\).

+

The information required to generate the feedforward wrench \(\bm{\mathcal{F}}_{ff}\) is usually available beforehand and can be derived offline. +The closed-loop dynamic formulation for the manipulator becomes:

+

\begin{equation} +\begin{aligned} +\bm{M}(\bm{\mathcal{X}})\ddot{\bm{\mathcal{X}}} &+ \bm{C}(\bm{\mathcal{X}}, \dot{\bm{\mathcal{X}}})\dot{\bm{\mathcal{X}}} + \bm{G}(\bm{\mathcal{X}}) \\\
+&= \bm{\mathcal{F}} + \bm{\mathcal{F}}_d \\\
+&= \bm{\mathcal{F}}_{pd} + \bm{\mathcal{F}}_{ff} + \bm{\mathcal{F}}_d \\\
+&= \bm{K}_d \dot{\bm{e}}_x + \bm{K}_p \bm{e}_x + \bm{\mathcal{F}}_{ff} + \bm{\hat{M}}\ddot{\bm{\mathcal{X}}}_d + \bm{\hat{C}}\dot{\bm{\mathcal{X}}}_d + \bm{\hat{G}} +\end{aligned} +\end{equation}

+

If the knowledge of the dynamic matrices is complete, we may assume that \(\hat{\bm{M}} = \bm{M}\), \(\hat{\bm{C}} = \bm{C}\) and \(\hat{\bm{G}} = \bm{G}\). +Furthermore, if we consider that the controller performs well such that \(\bm{\mathcal{X}}(t) \simeq \bm{\mathcal{X}}_d(t)\) and \(\dot{\bm{\mathcal{X}}}(t) \simeq \dot{\bm{\mathcal{X}}}_d(t)\), the simplified closed-loop dynamics become:

+

\begin{equation} +\begin{aligned} +\bm{M} (\ddot{\bm{\mathcal{X}}}_d - \ddot{\bm{\mathcal{X}}}) + \bm{K}_d \dot{\bm{e}}_x + \bm{K}_p \bm{e}_x + \bm{\mathcal{F}}_d &= 0 \\\
+\bm{M} \ddot{\bm{e}}_x + \bm{K}_d \dot{\bm{e}}_x + \bm{K}_p \bm{e}_x + \bm{\mathcal{F}}_d &= 0 +\end{aligned} +\end{equation}

+

This equation implies that, if the mentioned assumptions hold, the error dynamics satisfies a set of second-order system in the presence of disturbance. +By choosing appropriate gains for PD controller, the transient and steady-state performance of tracking error can be designed so as to satisfy the application requirements.

+

Note that except the mass matrix, the error dynamic terms are all configuration independent, and therefore, it is much easier to tune the PD controller gains to work well within the whole workspace of the robot.

+

However, this method faces a number of limitations in practice. +The most important limitation of this control technique is the stringent assumption of a complete knowledge requirement of the dynamic matrices. +In practice, derivation of these matrices is a prohibitive task.

+

Finally, because of the dependency of the mass matrix to the configuration of the robot, the error dynamics are not completely decoupled. +This means that correction in one error component may be considered as a disturbance effect to the other components. +To overcome these limitations, inverse dynamic approach is given in the following section.

+

Inverse Dynamics Control

+
+
+

In inverse dynamics control (IDC), nonlinear dynamics of the model is used to add a corrective term to the decentralized PD controller. +By this means, nonlinear and coupling behavior of the robotic manipulator is significantly attenuated, and therefore, the performance of linear controller is greatly improved.

+
+

General structure of IDC applied to a parallel manipulator is depicted in Figure fig:inverse_dynamics_control_task_space. +A corrective wrench \(\bm{\mathcal{F}}_{fl}\) is added in a feedback structure to the closed-loop system, which is calculated from the Coriolis and centrifugal matrix and gravity vector of the manipulator dynamic formulation.

+

Furthermore, mass matrix is added in the forward path in addition to the desired trajectory acceleration \(\ddot{\bm{\mathcal{X}}}_d\).

+

As for the feedforward control, the dynamics and kinematic parameters of the robot are needed, and in practice estimates of these matrices are used.

+

+
+ Figure 21: General configuration of inverse dynamics control implemented in task space
+

Figure 21: General configuration of inverse dynamics control implemented in task space

+
+
+ +

The controller output wrench applied to the manipulator may be derived as follows:

+

\begin{subequations} +\begin{align} +\bm{\mathcal{F}} &= \hat{\bm{M}}(\bm{\mathcal{X}}) \bm{a} + \bm{\mathcal{F}}_{fl} \\\
+&= \hat{\bm{M}}(\bm{\mathcal{X}}) \bm{a} + \hat{\bm{C}}(\bm{\mathcal{X}}, \dot{\bm{\mathcal{X}}}) \dot{\bm{\mathcal{X}}} + \hat{\bm{G}}(\bm{\mathcal{X}}) \\\
+\bm{a} &= \ddot{\bm{\mathcal{X}}}_d + \bm{K}_d \dot{\bm{e}}_x + \bm{K}_p \bm{e}_x +\end{align} +\end{subequations}

+

The closed-loop dynamic formulation for the manipulator becomes:

+

\begin{equation} +\begin{aligned} +\bm{M}(\bm{\mathcal{X}})\ddot{\bm{\mathcal{X}}} &+ \bm{C}(\bm{\mathcal{X}}, \dot{\bm{\mathcal{X}}})\dot{\bm{\mathcal{X}}} + \bm{G}(\bm{\mathcal{X}}) \\\
+&= \bm{\mathcal{F}} + \bm{\mathcal{F}}_d \\\
+&= \hat{\bm{M}}(\bm{\mathcal{X}}) \left(\ddot{\bm{\mathcal{X}}}_d + \bm{K}_d \dot{\bm{e}}_x + \bm{K}_p \bm{e}_x \right) \\\
+&\quad + \hat{\bm{C}}(\bm{\mathcal{X}}, \dot{\bm{\mathcal{X}}})\dot{\bm{\mathcal{X}}} + \hat{\bm{G}}(\bm{\mathcal{X}}) + \bm{\mathcal{F}}_d \\\
+\end{aligned} +\end{equation}

+

If the knowledge of the dynamic matrices is complete, the closed-loop dynamic formulation simplifies to:

+

\begin{equation} +\hat{\bm{M}}(\bm{\mathcal{X}}) \left(\ddot{\bm{e}}_d + \bm{K}_d \dot{\bm{e}}_x + \bm{K}_p \bm{e}_x \right) + \bm{\mathcal{F}}_d = 0 +\end{equation}

+

This control technique is very popular in practice because of the fact that this technique can significantly linearize and decouple dynamic formulation of the closed-loop error dynamics. +Furthermore, the error dynamic terms are all configuration independent, and therefore, it is much easier to tune the PD controller gains for suitable performance in the whole workspace of the robot.

+

However, note that for a good performance, and accurate model of the system is required, and the overall procedure is not robust to modeling uncertainty. +Furthermore, this technique is computationally intensive in terms of the online computations needed to carry out the closed-loop control structure.

+

Partial Linearization IDC

+

Inverse dynamics control has several features making it very attractive in practice. +However, to apply this method, complete knowledge of the dynamic formulation matrices is required. +This requirement has the main drawbacks that the dynamic formulation of the parallel manipulator is a complicated step to be carried out.

+

To implement all the terms in IDC structure, not only the structure and components of such matrices must be carefully determined, but also the kinematics and inertial parameters of the robot are needed to be identified and calibrated. +This step requires the use of high-precision calibration equipment which are not usually accessible. +Finally, if all the terms and parameters are well known, implementation of full inverse dynamic linearization is computationally intensive.

+

These are the reasons why, in practice, IDC control is extended to different forms where the above-mentioned stringent requirements are reduced.

+

To develop the simplest possible implementable IDC, let us recall dynamic formulation complexities:

+
    +
  • the manipulator mass matrix \(\bm{M}(\bm{\mathcal{X}})\) is derived from kinetic energy of the manipulator (Eq. eq:kinetic_energy)
  • +
  • the gravity vector \(\bm{G}(\bm{\mathcal{X}})\) is derived from potential energy (Eq. eq:gravity_vectory)
  • +
  • the Coriolis and centrifugal matrix \(\bm{C}(\bm{\mathcal{X}}, \dot{\bm{\mathcal{X}}})\) is derived from Eq. eq:gravity_vectory
  • +
+

The computation of the Coriolis and centrifugal matrix is more intensive than that of the mass matrix. +Gravity vector is more easily computable.

+

However, it is shown that certain properties hold for mass matrix, gravity vector and Coriolis and centrifugal matrix, which might be directly used in the control techniques developed for parallel manipulators. +One of the most important properties of dynamic matrices is the skew-symmetric property of the matrix \(\dot{\bm{M}} - 2 \bm{C}\) .

+

Consider dynamic formulation of parallel robot given in Eq. eq:closed_form_dynamic_formulation, in which the skew-symmetric property of dynamic matrices is satisfied. +The simplest form of IDC control effort \(\bm{\mathcal{F}}\) consists of: +\[ \bm{\mathcal{F}} = \bm{\mathcal{F}}_{pd} + \bm{\mathcal{F}}_{fl} \] +in which the first term \(\bm{\mathcal{F}}_{pd}\) is generated by the simplified PD form on the motion error: +\[ \bm{\mathcal{F}}_{pd} = \bm{K}_d \dot{\bm{e}}_x + \bm{K}_p + \bm{e}_x \]

+

The second term \(\bm{\mathcal{F}}_{fl}\) is considered to be only the gravity vector of the manipulator \(\bm{G}(\bm{\mathcal{X}})\), at any configuration, and the computationally intensive Coriolis and centrifugal term is not used: +\[ \bm{\mathcal{F}}_{fl} = \bm{G}(\bm{\mathcal{X}}) \]

+

Note that for an appreciable tracking performance with no static error at steady state, it is required to have complete knowledge of only the gravity term. +By this means, computations required in this control technique are significantly less than that of the general IDC.

+

Despite the simple structure of such a controller, the resulting control technique is very well performed, especially at steady state. +We can show that this control topology achieves asymptotic tracking for a constant desired trajectory motion, that is, \(\dot{\bm{\mathcal{X}}}_d = 0\).

+

This reveals the fact that even if the mass matrix and Coriolis and centrifugal matrix are not used in the feedback, and the closed-loop dynamics is not completely linearized, the PD control structure with gravity compensation can still lead to asymptotic tracking. +However, to suitable transient performance, more information of the system dynamics must be used in the linearization technique given in IDC.

+

Robust and Adaptative Control

+

Inverse dynamics control faces the stringent requirement that for a good performance, an accurate model of the system is required, and the overall procedure is not robust to modeling uncertainty. +Furthermore, this technique is computationally intensive in terms of online computation needed to carry out the closed-loop control structure. +The proposed modified inverse dynamics control, while being beneficial in terms of computational cost, is not suitable in terms of a closed-loop transient performance.

+

Another approach to modify IDC is to consider a complete linearization, but assume that complete knowledge of dynamic formulation matrices is not available. +To compensate for the lack of knowledge, two advanced control methods, namely robust and adaptive control are proposed:

+
    +
  • In the robust approach, a fixed controller is designed to satisfy the control objectives for the worst possible case of modeling uncertainty and disturbance wrenches.
  • +
  • In the adaptive approach, the estimates of dynamic formulation matrices are updated such that the difference between the true values of these matrices to their estimates converges to zero.
  • +
+

A global understanding of the trade-offs involved in each method is needed to employ either of them in practice.

+

Robust Inverse Dynamics Control

+

Various sources of uncertainties such as unmodelled dynamics, unknown parameters, calibration error, unknown disturbance wrenches, and varying payloads may exist, and are not seen in dynamic model of the manipulator.

+

To consider these modeling uncertainty in the closed-loop performance of the manipulator, recall the general closed-form dynamic formulation of the manipulator given in Eq. eq:closed_form_dynamic_formulation, and modify the inverse dynamics control input \(\bm{\mathcal{F}}\) as

+

\begin{align*} +\bm{\mathcal{F}} &= \hat{\bm{M}}(\bm{\mathcal{X}}) \bm{a}_r + \hat{\bm{C}}(\bm{\mathcal{X}}, \dot{\bm{\mathcal{X}}}) \dot{\bm{\mathcal{X}}} + \hat{\bm{G}}(\bm{\mathcal{X}})\\\
+\bm{a}_r &= \ddot{\bm{\mathcal{X}}}_d + \bm{K}_d \dot{\bm{e}}_x + \bm{K}_p \bm{e}_x + \bm{\delta}_a +\end{align*}

+

in which \(\bm{a}_r\) is the robustified control input.

+

Comparing this equation to the usual IDC, a robustifying term \(\bm{\delta}_a\) is added to compensate for modeling uncertainties.

+

Note that, as defined earlier, the notation \(\hat{(.)}\) represents the estimated value of \((.)\) and \(\tilde{(.)}\) is defined as the error mismatch between the estimated value and the true value as \(\tilde{(.)} = \hat{(.)}- (.)\).

+

In a similar manner \(\tilde{(.)}\) notation may be applied to the motion variables as +\[ \tilde{\bm{\mathcal{X}}} = \bm{\mathcal{X}} - \bm{\mathcal{X}}_d = - \bm{e}_x \]

+

The closed-loop dynamic formulation of the manipulator can be written as: +\[ \ddot{\bm{\mathcal{X}}} = \bm{a}_r + \bm{\eta}(\bm{\mathcal{X}}, \dot{\bm{\mathcal{X}}}, \bm{a}_r) \] +in which +\[ \bm{\eta} = \bm{M}^{-1} \left( \tilde{\bm{M}} \bm{a}_r + \tilde{\bm{C}} \dot{\bm{\mathcal{X}}} + \tilde{\bm{G}} \right) \] +is a measure of modeling uncertainty.

+

+
+ Figure 22: General configuration of robust inverse dynamics control implemented in the task space
+

Figure 22: General configuration of robust inverse dynamics control implemented in the task space

+
+
+ +

Adaptive Inverse Dynamics Control

+

+
+ Figure 23: General configuration of adaptative inverse dynamics control implemented in task space
+

Figure 23: General configuration of adaptative inverse dynamics control implemented in task space

+
+
+ +

Motion Control in Joint Space

+

Although the motion control schemes developed in section sec:control_task_space are very effective for tracking performance, they suffer from an implementation constraint that the motion variable \(\bm{\mathcal{X}}\) must be measured in practice.

+

If this measurement is available without any doubt, such topologies are among the best routines to be implemented in practice. +However, as explained in Section sec:control_topology, in many practical situations measurement of the motion variable \(\bm{\mathcal{X}}\) is difficult or expensive, and usually just the active joint variables \(\bm{q}\) are measured. +In such cases, the controllers developed in the joint space may be recommended for practical implementation.

+

To generate a direct input to output relation in the joint space, consider the topology depicted in Figure fig:general_topology_motion_feedback_bis. +In this topology, the controller input is the joint variable error vector \(\bm{e}_q = \bm{q}_d - \bm{q}\), and the controller output is directly the actuator force vector \(\bm{\tau}\), and hence there exists a one-to-one correspondence between the controller input to its output.

+

The general form of dynamic formulation of parallel robot is usually given in the task space. +For motion control in joint space, we need to transform the dynamic formulation in the joint space, by which the actuator forces \(\bm{\tau}\) are directly related to the active joint variables \(\bm{q}\).

+

Dynamic Formation in the Joint Space

+

The relation between the task space variables to their counterparts in the joint space can be derived by forward and inverse kinematics relations. +Although both analyses involve solution to a set of non-linear equations, for parallel manipulators, inverse kinematic solution proves to be much easier to obtain than that of forward kinematic solution.

+

This relation in differential kinematics is much simpler and can be completely determined by the Jacobian matrix: +\[ \tcmbox{\dot{\bm{q}} = \bm{J} \dot{\bm{\mathcal{X}}} \Longrightarrow \dot{\bm{\mathcal{X}}} = \bm{J}^{-1} \dot{\bm{q}}} \]

+

The acceleration variables are then: +\[ \ddot{\bm{q}} = \dot{\bm{J}} \dot{\bm{\mathcal{X}}} + \bm{J} \ddot{\mathcal{X}} \Longrightarrow \ddot{X} = \bm{J}^{-1} \ddot{\bm{q}} - \bm{J}^{-1} \dot{\bm{J}} \dot{\bm{\mathcal{X}}} \]

+

Furthermore, the relation between the actuator force vector \(\bm{\tau}\) to the corresponding task space wrench is given by: +\[ \tcmbox{\bm{\mathcal{F}} = \bm{J}^T \bm{\tau} \Longrightarrow \bm{\tau} = \bm{J}^{-T} \bm{\mathcal{F}}} \]

+

Substituting \(\dot{\bm{\mathcal{X}}}\) and \(\ddot{\bm{\mathcal{X}}}\) from the above equations into the dynamic formulation of the parallel robot gives:

+

\begin{equation*} +\begin{aligned} +& \left( \bm{J}^{-T} \bm{M} \bm{J}^{-1} \right) \ddot{\bm{q}} \\\
+& \quad + \bm{J}^{-T} \left( \bm{C} - \bm{M} \bm{J}^{-1} \dot{\bm{J}} \right) \bm{J}^{-1} \dot{\bm{q}} \\\
+& \quad + \bm{J}^{-T} \bm{G} + \bm{J}^{-T} \bm{\mathcal{F}}_d = \bm{\tau} +\end{aligned} +\end{equation*}

+
+
+

\begin{equation} +\bm{M}_q \ddot{\bm{q}} + \bm{C}_q \dot{\bm{q}} + \bm{G}_q + \bm{\tau}_d = \bm{\tau} \label{eq:dynamics_joint_space} +\end{equation}

+

with:

+

\begin{subequations} +\begin{align} +\bm{M}_q =& \bm{J}^{-T} \bm{M} \bm{J}^{-1} \\\
+\bm{D}_q =& \bm{J}^{-T} \left( \bm{C} - \bm{M} \bm{J}^{-1} \dot{\bm{J}} \right) \bm{J}^{-1} \\\
+\bm{G}_q =& \bm{J}^{-T} \bm{G} \\\
+\bm{\tau}_q =& \bm{J}^{-T} \bm{\mathcal{F}}_d +\end{align} +\end{subequations}

+
+

Equation eq:dynamics_joint_space represents the closed form dynamic formulation of a general parallel robot in the joint space.

+

Note that the dynamic matrices are not explicitly represented in terms of the joint variable vector \(\bm{q}\). +In fact, to fully derive these matrices, the Jacobian matrices must be computed and are generally derived as a function of the motion variables \(\bm{\mathcal{X}}\). +Furthermore, the main dynamic matrices are all functions of the motion variable \(\bm{\mathcal{X}}\). +Hence, in practice, to find the dynamic matrices represented in the joint space, forward kinematics should be solved to find the motion variable \(\bm{\mathcal{X}}\) for any given joint motion vector \(\bm{q}\).

+

Since in parallel robots the forward kinematic analysis is computationally intensive, there exist inherent difficulties in finding the dynamic matrices in the joint space as an explicit function of \(\bm{q}\). +In this case it is possible to solve forward kinematics in an online manner, it is recommended to use the control topology depicted in fig:general_topology_motion_feedback_bis, and implement control law design in the task space.

+

However, one implementable alternative to calculate the dynamic matrices represented in the joint space is to use the desired motion trajectory \(\bm{\mathcal{X}}_d\) instead of the true value of motion vector \(\bm{\mathcal{X}}\) in the calculations. +This approximation significantly reduces the computational cost, with the penalty of having mismatch between the estimated values of these matrices to their true values.

+

Decentralized PD Control

+

The first control strategy introduced in the joint space consists of the simplest form of feedback control in such manipulators. +In this control structure, depicted in Figure fig:decentralized_pd_control_joint_space, a number of PD controllers are used in a feedback structure on each error component.

+

The PD controller is denoted by \(\bm{K}_d s + \bm{K}_p\), where \(\bm{K}_d\) and \(\bm{K}_p\) are \(n \times n\) diagonal matrices denoting the derivative and proportional controller gains, respectively.

+

+
+ Figure 24: Decentralized PD controller implemented in joint space
+

Figure 24: Decentralized PD controller implemented in joint space

+
+
+ +

By this structure, each tracking error component is treated separately by its disjoint PD controller. +The proposed decentralized PD controller is very simple in structure, and therefore very easy to be implemented on the manipulator. +The design of such a controller needs no detailed information on the manipulator dynamic formulation and parameters. +However, the tracking performance of such a controller is relatively poor, and static tracking errors might be unavoidable. +Also, the performance of the closed-loop system is configuration dependent.

+

In practice, the gains are tuned experimentally and obtained as a trade-off between transient behavior and steady-state errors at different configurations. +As the dynamics of the system in the joint space is configuration dependent, finding suitable controller gains to result in required performance in all configurations is a difficult task.

+

The performance of the controller to attenuate measurement noise and external disturbance wrenches are also poor in practice. +To remedy these shortcomings, some modifications have been proposed to this structure and further described.

+

Feedforward Control

+

The tracking performance of the simple PD controller implemented in the joint space is usually not sufficient at different configurations. +To improve the tracking performance, a feedforward actuator force denoted by \(\bm{\tau}_{ff}\) may be added to the structure of the controller as depicted in Figure fig:feedforward_pd_control_joint_space.

+

+
+ Figure 25: Feed forward actuator force added to the decentralized PD controller in joint space
+

Figure 25: Feed forward actuator force added to the decentralized PD controller in joint space

+
+
+ +

The feedforward term is generated from the dynamic formulation of the manipulator. +The desired trajectory in the task space \(\bm{\mathcal{X}}_d\) and its derivatives \(\dot{\bm{\mathcal{X}}}_d\), \(\ddot{\bm{\mathcal{X}}}_d\) are thus required.

+

In practice, exact knowledge of dynamic matrices are not available, and therefore, estimates of these matrices are used in this derivation denoted by \(\hat{\bm{M}}\), \(\hat{\bm{C}}\) and \(\hat{\bm{G}}\).

+

The information required to generate the feedforward actuator force \(\bm{\tau}_{ff}\) is usually available beforehand, and in such a case, the feedforward term corresponding to a given trajectory can be determined off-line, while the computation of the decentralized feedback term would be executed online.

+

If complete information of the dynamic matrices is available, and if we assume that the system is performing well, meaning that \(\bm{\mathcal{X}}(t) \simeq \bm{\mathcal{X}}_d(t)\) and \(\dot{\bm{\mathcal{X}}}(t) \simeq \dot{\bm{\mathcal{X}}}_d(t)\), we can write the closed loop dynamics as follow: +\[ \bm{M}_q \ddot{\bm{e}}_q + \bm{K}_d \dot{\bm{e}}_q + \bm{K}_p \bm{e}_q = \bm{\tau}_d \]

+

The error dynamics satisfy a set of second-order differential equations in the presence of disturbance. +Therefore, by choosing appropriate gains of the PD controller, the transient and steady-state performance of the tracking error can be suitably designed.

+

Note that except for the mass matrix, the error dynamics terms are all configuration independent, and therefore, it is much easier to tune the PD controller gains to work well in the whole workspace of the robot in such a structure.

+

However, this method suffers from a number of limitations in practice. +The most important limitation is the stringent assumption of the complete information requirement of dynamics matrices. +Furthermore, even is all the assumption hold, because of the configuration dependence of the mass matrix, the error dynamics is still not completely decoupled. +This means that correction in one component may be considered as a disturbance effect to the other components. +To overcome these limitations, the inverse dynamic approach has been developed and is given in the following section.

+

Inverse Dynamics Control

+

As seen in the previous section, the tracking performance of a decentralized PD controller implemented in the joint space is not uniform at different configurations. +To compensate for such effects, a feedforward torque is added to the structure of the controller, by which the shortcomings of the decentralized controller is partially remedied. +However, the closed-loop performance still faces a number of limitations, which cannot be completely remedied because of the inherent conditions on feedforward structure of that proposed controller. +To overcome these limitations, in this section, a control technique based on inverse dynamic feedback of the manipulator in the joint space is presented.

+
+
+

In the inverse dynamics control (IDC) strategy, the nonlinear dynamics of the model is used to add a corrective term to the decentralized PD controller. +By this means, the nonlinear and coupling characteristics of robotic manipulator is significantly attenuated, and therefore, the performance of linear controller is significantly improved.

+
+

The general structure of inverse dynamics control applied to a parallel manipulator in the joint space is depicted in Figure fig:inverse_dynamics_control_joint_space.

+

A corrective torque \(\bm{\tau}_{fl}\) is added in a feedback structure to the closed-loop system, which is calculated from the Coriolis and Centrifugal matrix, and the gravity vector of the manipulator dynamic formulation in the joint space. +Furthermore, the mass matrix is acting in the forward path, in addition to the desired trajectory acceleration \(\ddot{\bm{q}}_q\). +Note that to generate this term, the dynamic formulation of the robot, and its kinematic and dynamic parameters are needed. +In practice, exact knowledge of dynamic matrices are not available, and there estimates are used.

+

+
+ Figure 26: General configuration of inverse dynamics control implemented in joint space
+

Figure 26: General configuration of inverse dynamics control implemented in joint space

+
+
+ +

The controller output torque applied to the manipulator may be calculated by:

+

\begin{subequations} +\begin{align} +\bm{\tau} &= \hat{\bm{M}}_q \bm{a}_q + \bm{\tau}_{fl} \\\
+\bm{\tau}_{fl} &= \hat{\bm{C}}_q \dot{\bm{q}} + \hat{\bm{G}}_q \\\
+\bm{a}_q &= \ddot{\bm{q}}_d + \bm{K}_d \dot{\bm{e}}_q + \bm{K}_p \bm{e}_q +\end{align} +\end{subequations}

+

If the knowledge of dynamic matrices is complete, the closed-loop dynamic formulation is simplified to: +\[ \hat{\bm{M}}_q \left( \ddot{\bm{e}}_q + \bm{K}_d \dot{\bm{e}}_q + \bm{K}_p \bm{e}_q \right) + \bm{\tau}_d = 0 \]

+

This equation implies that if there exist complete knowledge of the dynamic matrices, the tracking error dynamic equation satisfies a set of second-order systems in the presence of disturbance. +Consider the case where no disturbance wrench is applied to the manipulator, as the mass matrix \(\bm{M}_q\) is positive definite at all non-singular configurations, it can be inverted, and the error dynamics simplifies to: +\[ \ddot{\bm{e}}_q + \bm{K}_d \dot{\bm{e}}_q + \bm{K}_p \bm{e}_q = 0 \]

+

This control technique is very popular in practice because of the fact that it can significantly linearize and decouple the dynamic formulation of the closed-loop system for error dynamics components. +Furthermore, the error dynamic terms are all configuration independent, and therefore, it is much easier to tune the PD controller gains to perform well in the whole workspace of the robot.

+

However, note that for a good performance, an accurate model of the system is required, and the overall procedure is not robust to model uncertainties.

+

Summary of Motion Control Techniques

+

In this section, a number of control techniques have been developed for parallel robots. +Based on the dynamic formulation given in Section sec:dynamics, many model-based control techniques have been developed for implementation in the task space as well as in the joint space. +These control techniques are presented from the simplest form of decentralized PD control to more advanced robust and adaptive inverse dynamics control.

+

A summary of these techniques is given below.

+
Dynamic Formulations
+

The dynamic formulation of a parallel robot may be directly represented as a function of motion variable \(\bm{\mathcal{X}}\) in the task space as follows:

+

\begin{equation*} +\bm{M}(\bm{\mathcal{X}})\ddot{\bm{\mathcal{X}}} + \bm{C}(\bm{\mathcal{X}}, \dot{\bm{\mathcal{X}}})\dot{\bm{\mathcal{X}}} + \bm{G}(\bm{\mathcal{X}}) = \bm{\mathcal{F}} + \bm{\mathcal{F}}_d +\end{equation*}

+

The dynamic formulation may be represented as a function of actuator motion variable \(\bm{q}\) as

+

\begin{equation*} +\bm{M}_q \ddot{\bm{q}} + \bm{C}_q \dot{\bm{q}} + \bm{G}_q = \bm{\tau} + \bm{\tau}_d +\end{equation*}

+

in which these two formulations are closely related to each other by the following relations:

+

\begin{equation*} +\begin{aligned} +\bm{M}_q &= \bm{J}^{-T} \bm{M} \bm{J}^{-1} \\\
+\bm{C}_q &= \bm{J}^{-T} \left( \bm{C} - \bm{M}\bm{J}^{-1}\dot{\bm{J}} \right) \bm{J}^{-1} \\\
+\bm{D}_q &= \bm{J}^{-T} \bm{G} \\\
+\bm{\tau}_q &= \bm{J}^{-T} \bm{\mathcal{F}} +\end{aligned} +\end{equation*}

+
Decentralized PD Control
+

The simplest controller for a parallel robot can be considered as a decentralized PD controller being implemented individually on each error component. +If such a structure is implemented in the task space, the control effort is calculated by

+

\begin{equation*} +\bm{\mathcal{F}} = \bm{K}_d \dot{\bm{e}}_x + \bm{K}_p \bm{e}_x +\end{equation*}

+

and the actuator effort can be generally determined through a force distribution scheme.

+

For a completely parallel manipulator, the actuator forces can be generated by \(\bm{\tau} = \bm{J}^{-T} \bm{\mathcal{F}}\) at non-singular configurations.

+

Decentralized PD control can be directly implemented in the joint space by the following equation:

+

\begin{equation*} +\bm{\tau} = \bm{K}_d \dot{\bm{e}}_q + \bm{K}_p \bm{e}_q +\end{equation*}

+
Feed Forward Control
+

The reduce the performance limitations of simple PD control, the control effort may be enforced with a feed forward wrench given by

+

\begin{equation*} +\bm{\mathcal{F}} = \bm{\mathcal{F}}_{pd} + \bm{\mathcal{F}}_{ff} +\end{equation*}

+

in which

+

\begin{equation*} +\begin{aligned} +\bm{\mathcal{F}}_{ff} &= \bm{K}_d \dot{\bm{e}}_x + \bm{K}_p \bm{e}_x \\\
+&+ \hat{\bm{M}}(\bm{\mathcal{X}}_d)\ddot{\bm{\mathcal{X}}}_d + \hat{\bm{C}}(\bm{\mathcal{X}}_d, \dot{\bm{\mathcal{X}}}_d)\dot{\bm{\mathcal{X}}}_d + \hat{\bm{G}}(\bm{\mathcal{X}}_d) +\end{aligned} +\end{equation*}

+

where \(\hat{\bm{M}}\), \(\hat{\bm{C}}\) and \(\hat{\bm{G}}\) are estimation of the dynamic matrices.

+

This controller can be implemented in joint space as follows

+

\begin{equation*} +\begin{aligned} +\bm{\tau} &= \bm{\tau}_{pd} + \bm{\tau}_{ff} \\\
+&= \bm{K}_d \dot{\bm{e}}_q + \bm{K}_p \bm{e}_q + \bm{J}^{-T} \bm{\mathcal{F}}_{ff} +\end{aligned} +\end{equation*}

+
Inverse Dynamics Control
+

In the inverse dynamics control, the nonlinear dynamics of the model is used to add a corrective term to the decentralized PD controller. +If such a structure is implemented in the task space, the control effort is calculated by

+

\begin{equation*} +\begin{aligned} +\bm{\mathcal{F}} &= \hat{\bm{M}}(\bm{\mathcal{X}})\bm{a} + \hat{\bm{C}}(\bm{\mathcal{X}}, \dot{\bm{\mathcal{X}}})\dot{\bm{\mathcal{X}}} + \hat{\bm{G}}(\bm{\mathcal{X}}) \\\
+\bm{a} &= \ddot{\bm{\mathcal{X}}}_d + \bm{K}_d \dot{\bm{e}}_x + \bm{K}_p \bm{e}_x +\end{aligned} +\end{equation*}

+

In general, the tracking error dynamics can be represented by

+

\begin{equation*} +\ddot{\bm{e}}_x + \bm{K}_d \dot{\bm{e}}_x + \bm{K}_p \bm{e}_x + \hat{\bm{M}}^{-1} \left[ \tilde{\bm{M}} \ddot{\bm{\mathcal{X}}} + \tilde{\bm{C}} \dot{\bm{\mathcal{X}}} + \tilde{\bm{G}} + \bm{\mathcal{F}}_d \right] = 0 +\end{equation*}

+

This controller can be implemented in the joint space as follows:

+

\begin{equation*} +\begin{aligned} +\bm{\tau} &= \hat{\bm{M}}_q \bm{a}_q + \hat{\bm{C}}_q \dot{\bm{q}} + \hat{\bm{G}}_q \\\
+\bm{a}_q &= \ddot{\bm{q}}_d + \bm{K}_d \dot{\bm{e}}_q + \bm{K}_p \bm{e}_q +\end{aligned} +\end{equation*}

+

by which the tracking error dynamics is summarized as

+

\begin{equation*} +\ddot{\bm{e}}_q + \bm{K}_d \dot{\bm{e}}_q + \bm{K}_p \bm{e}_q + \hat{\bm{M}}_{q}^{-1} \left[ \tilde{\bm{M}}_q \ddot{\bm{q}} + \tilde{\bm{C}}_q \dot{\bm{q}} + \tilde{\bm{G}}_q + \bm{\mathcal{\tau}}_d \right] = 0 +\end{equation*}

+
Partial Linearization IDC
+

To reduce the computational cost of the inverse dynamic control, it is possible to use partial linearization of dynamic formulation, just by gravity compensation, while keeping asymptotic tracking stability of the closed-loop system. +In which a case, the control input wrench in the task space is simplified to

+

\begin{equation*} +\bm{\mathcal{F}} = \bm{K}_d \dot{\bm{e}}_x + \bm{K}_p \bm{e}_x + \hat{\bm{G}}(\bm{\mathcal{X}}) +\end{equation*}

+

The following Lyapunov function may be used to analyze the stability of tracking dynamics of the closed-loop system:

+

\begin{equation*} +\dot{V} = \dot{\bm{\mathcal{X}}}^T \bm{M} \ddot{\bm{\mathcal{X}}} + \frac{1}{2} \dot{\bm{\mathcal{X}}}^T \dot{\bm{M}} \dot{\bm{\mathcal{X}}} + \bm{e}_x^T \bm{K}_p \bm{e}_x +\end{equation*}

+

Stability analysis of the closed-loop system in this case reveals the fact that this simplified version of inverse dynamics control can lead to asymptotic tracking for constant desired trajectories.

+
Robust Inverse Dynamics Control
+

To accommodate modeling uncertainties in inverse dynamic control, the following robust control scheme in the task space is developed:

+

\begin{equation*} +\begin{aligned} +\bm{\mathcal{F}} &= \hat{\bm{M}}(\bm{\mathcal{X}}) \bm{a}_r + \hat{\bm{C}}(\bm{\mathcal{X}}, \dot{\bm{\mathcal{X}}})\dot{\bm{\mathcal{X}}} + \hat{\bm{G}}(\bm{\mathcal{X}}) \\\
+\bm{a}_r &= \ddot{\bm{\mathcal{X}}}_d + \bm{K}_d \dot{\bm{e}}_x + \bm{K}_p \bm{e}_x + \bm{\delta}_a +\end{aligned} +\end{equation*}

+

in which the robustifying corrective term \(\bm{\delta}_a\) is found through a Lyapunov stability analysis of tracking error dynamics. +The tracking error dynamics can be represented by the following linear and nonlinear components:

+

\begin{equation*} +\bm{A} = \begin{bmatrix} +\bm{0} & \bm{I} \\\
+-\bm{K}_p & -\bm{K}_d +\end{bmatrix}, \quad \bm{B} = \begin{bmatrix} +\bm{0} \ \bm{I} +\end{bmatrix} +\end{equation*}

+

The corrective term \(\bm{\delta}_a\) can be found as

+

\begin{equation*} +\bm{\delta}_a = \left\{ \begin{matrix} +- \rho \frac{v}{\|v\|} & \text{if} \|v\| > \epsilon \\\
+- \rho \frac{v}{\epsilon} & \text{if} \|v\| \le \epsilon +\end{matrix} \right. +\end{equation*}

+

in which \(v\) is defined by \(v = \bm{B}^T \bm{P} \bm{\epsilon}\), where \(\bm{P}\) is the solution to the matrix Lyapunov equation and \(\epsilon\) is a smoothing threshold. +It is shown that by adding this corrective term to the regular inverse dynamics control, the closed-loop system achieves uniform ultimate bounded tracking errors.

+
Adaptive Inverse Dynamics Control
+

In the adaptive version of the inverse dynamics control, full feedback linearization is considered through adaptive update of dynamic formulation matrices. +The error dynamics in this case is

+

\begin{equation*} +\dot{\bm{\epsilon}} = \bm{A} \bm{\epsilon} + \bm{B} \bm{\Phi} \tilde{\bm{\theta}} +\end{equation*}

+

in which

+

\begin{equation*} +\begin{aligned} +\bm{A} &= \begin{bmatrix} +\bm{0} & \bm{I} \ -bm{K}_p & -\bm{K}_d +\end{bmatrix}, \quad \bm{B} = \begin{bmatrix} +\bm{0} \ \bm{I} +\end{bmatrix} \\\
+\bm{\Phi} &= \hat{\bm{M}}^{-1} \bm{\Upsilon}(\bm{\mathcal{X}}, \dot{\bm{\mathcal{X}}}, \ddot{\bm{\mathcal{X}}}) +\end{aligned} +\end{equation*}

+

Based on the Lyapunov stability analysis, by using the following Lyapunov function

+

\begin{equation*} +V = \bm{\epsilon}^T \bm{P} \bm{\epsilon} + \tilde{\bm{\theta}}^T \bm{\Gamma} \bm{\theta} +\end{equation*}

+

the following parameter adaptation law is derived for updates

+

\begin{equation*} +\dot{\hat{\bm{\theta}}} = - \bm{\Gamma}^{-1} \bm{\Phi}^T \bm{B}^T \bm{P} \bm{\epsilon} +\end{equation*}

+

By this means, the closed-loop system achieves asymptotic tracking performance, while the parameter estimation errors remain bounded.

+

Motion Control of the Stewart-Gough Platform

+

Control in the Task space

+

For the Stewart-Gough platform, the motion variable in the task space is a six-dimensional vector +\[ \bm{\mathcal{X}} = \begin{bmatrix} \bm{x}_p \ \bm{\theta} \end{bmatrix} \] +with:

+
    +
  • \(\bm{x}_p = [x_p\ y_p\ z_p]^T\) is the position vector of the motion platform center of mass
  • +
  • \(\bm{\theta} = \theta [s_x\ s_y\ s_z]^T = [\theta_x\ \theta_y\ \theta_z]^T\) is the moving platform orientation expressed by screw coordinates
  • +
+

Therefore, the tracking error is defined as \(\bm{e} = [e_x\ e_y\ e_z\ e_{\theta_x}\ e_{\theta_y}\ e_{\theta_z}]^T\).

+

The decentralized controller consists of six disjoint proportional derivative controllers acting on each error component and is denoted by \(\bm{K}_d s + \bm{K}_p\).

+

The output of the controller is denoted by \(\bm{\mathcal{F}} = [F_x\ F_y\ F_z\ \tau_x\ \tau_y\ \tau_z]^T\). +Note that since the output of the controller is defined in the task space, each wrench component directly manipulates the corresponding tracking error component, and therefore, the overall tracking performance of the manipulator is suitable is high controller gains are used.

+

In practice, the calculated output wrench is transformed into actuator forces through the force distribution block corresponding to the inverse of Jacobian transpose.

+

Control in the Joint space

+

The joint variable \(\bm{q}(t)\) is a six-dimensional vector consisting of the limb lengths denoted by \(\bm{q} = [l_1\ l_2\ l_3\ l_4\ l_5\ l_6]^T\). +Therefore, the tracking error is defined as \(\bm{e}_q = \bm{q}_d - \bm{q}\), in which is the desired motion variable in the joint space \(\bm{q}_d\) is determined by the solution of inverse kinematics, and \(\bm{q}\) is given by direct measurement of the limb lengths.

+

The decentralized controller, therefore, consists of six disjoint PD controllers acting on each error component. +The output of the controller directly generates the actuator torques denoted by \(\tau\).

+

In simulation, it is observe that the orientation error significantly increase in the joint space control scheme. +The main reason is that the controller gains directly penalize the position error of the limb lengths, and not the orientation errors, and therefore, there is no direct controller action to be suitably tuned to reduce the orientation error.

+

Comparing the closed-loop performance of the PD controllers designed in the joint space to those designed in the task space, it can be concluded that tuning of the PD gains for a suitable performance is much easier in task space designs. +Furthermore, a very small error signature in the joint space may be accumulated to produce relatively larger tracking errors in the task space. +Hence, it is recommended to design and implement controllers in the task space, if the required motion variables can be directly measured or the forward kinematic solution can be calculated in an online routine.

+

Force Control

+

+

Introduction

+

In many applications, it may occur that the robot moving platform is in contact with a stiff environment and specific interacting wrench is required. +In such applications, the contact wrench describes the state of interaction more effectively than the position and orientation of the moving platform.

+
+
+

The problem of force control can be described as to derive the actuator forces required to generate a prescribed desired wrench at the manipulator moving platform, when the manipulator is carrying out its desired motion.

+
+

This problem and its extents are treated in the force control algorithms described in this chapter. +A force control strategy is one that modifies position trajectories based on the sensed wrench, or force-motion relations.

+

If a pure motion control scheme is used for manipulator, in case it contacts an environment, the robot does not sense the presence of the environment, and its driving forces become harshly high to reduce the tracking errors. +In such a case, the robot may break the object it is in contact or will break its internal structure. +Additional sensors should be included in the manipulator in order for it to be able to feel the interaction and to control the interacting forces. +Different wrench sensors are developed for such applications, and it is possible to use joint torque or link force measurement units to determine the projection of the interacting forces in the joint space.

+

The use of wrench sensors either in the task space or in the joint space open horizons to use different force control topologies for the manipulators. +Using such sensors does not imply that regular motion sensors used in motion control schemes are not necessary. +The use of motion sensors and the usual corresponding control topologies are usually necessary, since the motion of the manipulator is one of the outputs to be controlled. +Depending on the type and configuration of the wrench sensors, different force control topologies are developed.

+

Controller Topology

+

For a force control scheme, the desired interacting wrench of the moving platform and the environment may be of interest. +This quantity may be denoted by \(\bm{\mathcal{F}}_d\), which has the same dimension and structure of the manipulator wrench \(\bm{\mathcal{F}}\). +To carry out such a control task in a closed-loop structure, it is necessary to measure the output wrench of the manipulator through an instrumentation system.

+

Although there are many commercial six-degrees-of-freedom wrench sensors available in the market, they are usually more expensive than single joint force measurement units. +Another alternative for force measurement is direct measurement of the actuator forces. +Many commercial linear actuators are available in the market in which embedded force measurement is considered in their design. +Therefore, it might be preferable in some applications to use direct actuator force measurements to carry out the feedback control.

+

Cascade Control

+

In a general force control scheme, the prime objective is tracking of the interacting wrench between the moving platform and the environment. +However, note that the motion control of the robot when the robot is in interaction with the environment is also another less-important objective and when the contact of the robot moving platform is released, motion control becomes the prime objective.

+
+
+

To follow two objectives with different properties in one control system, usually a hierarchy of two feedback loops is used in practice. +This kind of control topology is called cascade control, which is used when there are several measurements and one prime control variable. +Cascade control is implemented by nesting the control loops, as shown in Figure fig:cascade_control. +The output control loop is called the primary loop, while the inner loop is called the secondary loop and is used to fulfill a secondary objective in the closed-loop system.

+
+

+
+ Figure 27: Block diagram of a closed-loop system with cascade control
+

Figure 27: Block diagram of a closed-loop system with cascade control

+
+
+ +

The measured variables are here the motion and interacting wrench that may be measured in the task space or in the joint space, and therefore, different control topologies may be advised for each set of measurement variables.

+

To improve the performance of the control system for a particular objective, it is important to choose the right variables for internal and external feedback loops, and to design suitable controllers for each feedback system. +Although these differ in different topologies described in the following sections, some general rules are applied to design a well performing cascade control system.

+

A general idea in cascade control design is the ideal case, in which the inner loop is designed so tight that the secondary (inner) loop behaves as a perfect servo, and responds very quickly to the internal control command. +This idea is effectively used in many applications, wherein a nearly-perfect actuator to respond to the requested commands is designed by using an inner control feedback.

+
+
+

The design criteria for the inner loop is to have a high control gain such that the time response of the secondary variable is at least 5 times more than that of the primary variable, and such that it can overcome the effect of disturbances and unmodelled dynamics in the internal feedback structure.

+
+

It is also necessary to have a well-defined relation between the primary and secondary variables, to have harmony in the objectives followed in the primary and secondary loops.

+

Force Feedback in Outer Loop

+

Consider the force control schemes, in which force tracking is the prime objective. +In such a case, it is advised that the outer loop of cascade control structure is constructed by wrench feedback, while the inner loop is based on position feedback. +Since different types of measurement units may be used in parallel robots, different control topologies may be constructed to implement such a cascade structure.

+

Consider first the cascade control topology shown in Figure fig:taghira13_cascade_force_outer_loop in which the measured variables are both in the task space. +The inner loop is constructed by position feedback while the outer loop is based on force feedback. +As seen in Figure fig:taghira13_cascade_force_outer_loop, the force controller block is fed to the motion controller, and this might be seen as the generated desired motion trajectory for the inner loop.

+

The output of motion controller is also designed in the task space, and to convert it to implementable actuator force \(\bm{\tau}\), the force distribution block is considered in this topology.

+

+
+ Figure 28: Cascade topology of force feedback control: position in inner loop and force in outer loop. Moving platform wrench \(\bm{\mathcal{F}}\) and motion variable \(\bm{\mathcal{X}}\) are measured in the task space
+

Figure 28: Cascade topology of force feedback control: position in inner loop and force in outer loop. Moving platform wrench \(\bm{\mathcal{F}}\) and motion variable \(\bm{\mathcal{X}}\) are measured in the task space

+
+
+ +

Other alternatives for force control topology may be suggested based on the variations of position and force measurements. +If the force is measured in the joint space, the topology suggested in Figure fig:taghira13_cascade_force_outer_loop_tau can be used. +In this topology, the measured actuator force vector \(\bm{\tau}\) is mapped into its corresponding wrench in the task space by the Jacobian transpose mapping \(\bm{\mathcal{F}} = \bm{J}^T \bm{\tau}\).

+

+
+ Figure 29: Cascade topology of force feedback control: position in inner loop and force in outer loop. Actuator forces \(\bm{\tau}\) and motion variable \(\bm{\mathcal{X}}\) are measured
+

Figure 29: Cascade topology of force feedback control: position in inner loop and force in outer loop. Actuator forces \(\bm{\tau}\) and motion variable \(\bm{\mathcal{X}}\) are measured

+
+
+ +

Consider the case where the force and motion variables are both measured in the joint space. +Figure fig:taghira13_cascade_force_outer_loop_tau_q suggests the force control topology in the joint space, in which the inner loop is based on measured motion variable in the joint space, and the outer loop uses the measured actuator force vector. +In this topology, it is advised that the force controller is designed in the task space, and the Jacobian transpose mapping is used to project the measured actuator force vector into its corresponding wrench in the task space. +However, as the inner loop is constructed in the joint space, the desired motion variable \(\bm{\mathcal{X}}_d\) is mapped into joint space using inverse kinematic solution.

+

Therefore, the structure and characteristics of the position controller in this topology is totally different from that given in the first two topologies.

+

+
+ Figure 30: Cascade topology of force feedback control: position in inner loop and force in outer loop. Actuator forces \(\bm{\tau}\) and joint motion variable \(\bm{q}\) are measured in the joint space
+

Figure 30: Cascade topology of force feedback control: position in inner loop and force in outer loop. Actuator forces \(\bm{\tau}\) and joint motion variable \(\bm{q}\) are measured in the joint space

+
+
+ +

Force Feedback in Inner Loop

+

Consider the force control scheme in which the motion-force relation is the prime objective. +In such a case, force tracking is not the primary objective, and it is advised that the outer loop of cascade control structure consists of a motion control feedback.

+

Since different type of measurement units may be used in parallel robots, different control topologies may be constructed to implement such cascade controllers.

+

Figure fig:taghira13_cascade_force_inner_loop_F illustrates the cascade control topology for the system in which the measured variables are both in the task space (\(\bm{\mathcal{F}}\) and \(\bm{\mathcal{X}}\)). +The inner loop is loop is constructed by force feedback while the outer loop is based on position feedback. +By this means, when the manipulator is not in contact with a stiff environment, position tracking is guaranteed through the primary controller. +However, when there is interacting wrench \(\bm{\mathcal{F}}_e\) applied to the moving platform, this structure controls the force-motion relation. +This configuration may be seen as if the outer loop generates a desired force trajectory for the inner loop.

+

+
+ Figure 31: Cascade topology of force feedback control: force in inner loop and position in outer loop. Moving platform wrench \(\bm{\mathcal{F}}\) and motion variable \(\bm{\mathcal{X}}\) are measured in the task space
+

Figure 31: Cascade topology of force feedback control: force in inner loop and position in outer loop. Moving platform wrench \(\bm{\mathcal{F}}\) and motion variable \(\bm{\mathcal{X}}\) are measured in the task space

+
+
+ +

Other alternatives for control topology may be suggested based on the variations of position and force measurements. +If the force is measured in the joint space, control topology shown in Figure fig:taghira13_cascade_force_inner_loop_tau can be used. +In such case, the Jacobian transpose is used to map the actuator force to its corresponding wrench in the task space.

+

+
+ Figure 32: Cascade topology of force feedback control: force in inner loop and position in outer loop. Actuator forces \(\bm{\tau}\) and motion variable \(\bm{\mathcal{X}}\) are measured
+

Figure 32: Cascade topology of force feedback control: force in inner loop and position in outer loop. Actuator forces \(\bm{\tau}\) and motion variable \(\bm{\mathcal{X}}\) are measured

+
+
+ +

If the force and motion variables are both measured in the joint space, the control topology shown in Figure fig:taghira13_cascade_force_inner_loop_tau_q is suggested. +The inner loop is based on the measured actuator force vector in the joint space \(\bm{\tau}\), and the outer loop is based on the measured actuated joint position vector \(\bm{q}\). +In this topology, the desired motion in the task space is mapped into the joint space using inverse kinematic solution, and both the position and force feedback controllers are designed in the joint space. +Thus, independent controllers for each joint may be suitable for this topology.

+

+
+ Figure 33: Cascade topology of force feedback control: force in inner loop and position in outer loop. Actuator forces \(\bm{\tau}\) and joint motion variable \(\bm{q}\) are measured in the joint space
+

Figure 33: Cascade topology of force feedback control: force in inner loop and position in outer loop. Actuator forces \(\bm{\tau}\) and joint motion variable \(\bm{q}\) are measured in the joint space

+
+
+ +

Stiffness Control

+

Single-Degree-of-Freedom Stiffness Control

+

General Stiffness Control

+

Stiffness Contorl of the Stewart-Gough Platform

+

Direct Force Control

+

+
+ Figure 34: Direct force control scheme, force feedback in the outer loop and motion feedback in the inner loop
+

Figure 34: Direct force control scheme, force feedback in the outer loop and motion feedback in the inner loop

+
+
+ +

Impedance Control

+

For the stiffness control and direct force control schemes, it is observed that when the manipulator-moving platform is in contact with a stiff environment, the motion variable \(\bm{\mathcal{X}}\) and the interacting force variable \(\bm{\mathcal{F}}\) are two dynamically dependent quantities.

+

In stiffness control, it is aimed to adjust the static relation between these two quantities. +In this scheme, no force measurement is required, however, careful design on the desired motion trajectory and PD controller gains is needed to tune the stiffness property of the interaction at steady stage.

+

In force control schemes, on the other hand, the force tracking is the prime objective, and force measurement is a stringent requirement to implement such schemes.

+

The main reason that the motion and force variables are not being gable to be controlled independently is that for an n-degrees-of-freedom manipulator, only n-independent control inputs are available, and therefore, only n-independent variables can be controlled, while the force and motion quantities count to \(2n\) independent variables.

+
+
+

The key idea behind impedance control schemes, is to tune the dynamic relation between the force and the motion variables, and not a hierarchy of tracking objectives in force and in position variables. +In this scheme, contrary to stiffness control schemes, both force and position variables are measured and used in the control structure.

+
+

The definition of mechanical impedance is given in an analogy of the well-known electrical impedance definition as the relationship between the effort and flow variables. +Since this relation can be well determined in the frequency domain, the dynamical relation of force and motion variable may be represented by mechanical impedance. +Impedance control schemes provide control topology to tune the mechanical impedance of a system to a desired value. +By this means, the force and the motion variables are not controlled independently, or in a hierarchy, but their dynamic relation represented by mechanical impedance is suitably controlled.

+

Impedance

+

Impedance was first defined in electrical networks as the measure of the opposition that an electrical circuit presents to the passage of a current when a voltage is applied. +To generalize the impedance definition to other disciplines, voltage is generalized to the effort and current is generalized to the flow.

+

Impedance is a complex function defined as the ratio of the Laplace transform of the effort to the Laplace transform of the flow.

+

Impedance is usually denoted by \(\bm{Z}(s)\) and it may be represented by writing its magnitude and phase in the form of \(\abs{\bm{Z}(s)}\) and \(\angle{\bm{Z}(s)}\). +The magnitude of the complex impedance \(\abs{\bm{Z}}\) is the ratio of the effort amplitude to that of the flow, while the phase \(\angle{\bm{Z}}\) is the phase shift by which the flow is ahead of the effort.

+
+
+

Mechanical Impedance is defined as the ratio of the Laplace transform of the mechanical effort to the Laplace transform of the mechanical flow:

+

\begin{equation} +\bm{Z}(s) = \frac{\bm{F}(s)}{\bm{v}(s)} +\end{equation}

+

in which effort in mechanical systems is represented by force \(\bm{F}\) and flow is represented by velocity \(\bm{v}\).

+
+

Note that this definition is given for a single-degree-of-freedom motion system. +The motion can be generalized to angular motion, in which the effort is represented by torque, while the flow is represented by angular velocity. +Furthermore, the impedance may be generalized to multiple-degrees-of-freedom system, in which for a general spatial motion effort is represented by a wrench \(\bm{\mathcal{F}}\), while flow is represented by motion twist \(\dot{\bm{\mathcal{X}}}\).

+

Nevertheless, note that Laplace transform is only applicable for linear time invariant systems, and for a parallel manipulator the dynamic formulation of which is nonlinear, the concept of mechanical impedance may be extended to the differential equation relating the mechanical wrench \(\bm{\mathcal{F}}\) to motion twist \(\dot{\bm{\mathcal{X}}}\).

+
+
+

Consider an RLC circuit depicted in Figure fig:taghirad13_impedance_control_rlc. +The differential equation relating voltage \(v\) to the current \(i\) is given by +\[ v = L\frac{di}{dt} + Ri + \int_0^t \frac{1}{C} i(\tau)d\tau \] +in which \(L\) denote the inductance, \(R\) the resistance and \(C\) the capacitance.

+

The impedance of the system may be found from the Laplace transform of the above equation:

+

\begin{equation} +Z(s) = \frac{v(s)}{i(s)} = Ls + R + \frac{1}{Cs} \label{eq:rlc_impedance} +\end{equation}

+
+
+
+

Consider the mass-spring-damper system depicted in Figure fig:taghirad13_impedance_control_rlc. +The governing dynamic formulation for this system is given by +\[ m \ddot{x} + c \dot{x} + k x = f \] +in which \(m\) denote the body mass, \(c\) the damper viscous coefficient and \(k\) the spring stiffness.

+

The impedance of the system may be found from the Laplace transform of the above equation:

+

\begin{equation} +Z(s) = \frac{f(s)}{v(s)} = ms + c + \frac{k}{s} \label{eq:mass_spring_damper_impedance} +\end{equation}

+
+

+
+ Figure 35: Analogy of electrical impedance in (a) an electrical RLC circuit to (b) a mechanical mass-spring-damper system
+

Figure 35: Analogy of electrical impedance in (a) an electrical RLC circuit to (b) a mechanical mass-spring-damper system

+
+
+ +

As inferred from the above two examples, although the physical nature of the system may differ from each other, they may be represented by similar impedances. +From this analogy, a terminology for impedance is introduced.

+
+
+

An impedance \(\bm{Z}(s)\) is called

+
    +
  • Inductive if \(\abs{\bm{Z}(0)} = 0\)
  • +
  • Resistive if \(\abs{\bm{Z}(0)} = R\)
  • +
  • Capacitive if \(\lim_{s\to 0} \abs{\bm{K}(s)} = \infty\)
  • +
+
+

Hence, for the mechanical system represented in Figure fig:taghirad13_impedance_control_rlc:

+
    +
  • mass represents inductive impedance
  • +
  • viscous friction represents resistive impedance
  • +
  • spring stiffness represents capacitive impedance
  • +
+

The environments that a robot interacts with may be represented by these classified impedance components. +A very stiff environment may be represented by high-capacitive impedance models, whereas an environment with high structural damping may be represented by high-resitive impedance.

+

Impedance Control Concept

+

The key idea behind impedance control schemes is to tune the dynamic relation between force and motion variables. +Impedance control schemes provide control topology to tune the mechanical impedance of a system toward a desired impedance.

+

A desired impedance could be adjusted by desired inductive, resistive and capacitive impedances, which forms a desired linear impedance for the closed-loop system as follows: +\[ \bm{Z}_d(s) = \bm{M}_d s + \bm{C}_d + \frac{1}{s} \bm{K}_d \] +where \(\bm{Z}_d\) denotes the desired impedance of the closed-loop system, which is composed of the desired inductive impedance \(\bm{M}_d\), desired resistive impedance \(\bm{C}_d\) and desired capacitive impedance \(\bm{K}_d\). +Impedance control structures may be used to tune the closed-loop impedance of the system suitably to follow such a desired impedance.

+

Impedance Control Structure

+

Consider a parallel robot with multiple-degrees-of-freedom interacting with a stiff environment. +In such a case, the motion of the robot end effector is represented by the motion vector \(\bm{\mathcal{X}}\), and the interacting wrench applied to the robot end effector is denoted by \(\bm{\mathcal{F}}_e\). +It is considered that the interacting wrench is measured in the task space and is used in the inner force feedback loop. +Furthermore, it is considered that the motion variable \(\bm{\mathcal{X}}\) is measured and is used in the outer feedback loop.

+

In the impedance control scheme, regulation of the motion-force dynamic relation is the prime objective, and since force tracking is not the primary objective, it is advised to used a cascade control structure with motion control feedback in the outer loop and force feedback in the inner loop.

+

Therefore, when the manipulator is not in contact with a stiff environment, position tracking is guaranteed by a primary controller. +However, when there is an interacting wrench \(\bm{\mathcal{F}}_e\) applied to the moving platform, this structure may be designed to control the force-motion dynamic relation.

+

As a possible impedance control scheme, consider the closed-loop system depicted in Figure fig:taghira13_impedance_control, in which the position feedback is considered in the outer loop, while force feedback is used in the inner loop. +This structure is advised when a desired impedance relation between the force and motion variables is required that consists of desired inductive, resistive, and capacitive impedances. +As shown in Figure fig:taghira13_impedance_control, the motion-tracking error is directly determined from motion measurement by \(\bm{e}_x = \bm{\mathcal{X}}_d - \bm{\mathcal{X}}\) in the outer loop and the motion controller is designed to satisfy the required impedance.

+

Moreover, direct force-tracking objective is not assigned in this control scheme, and therefore the desired force trajectory \(\bm{\mathcal{F}}_d\) is absent in this scheme. +However, an auxiliary force trajectory \(\bm{\mathcal{F}}_a\) is generated from the motion control law and is used as the reference for the force tracking. +By this means, no prescribed force trajectory is tracked, while the motion control scheme would advise a force trajectory for the robot to ensure the desired impedance regulation.

+

+
+ Figure 36: Impedance control scheme; motion feedback in the outer loop and force feedback in the inner loop
+

Figure 36: Impedance control scheme; motion feedback in the outer loop and force feedback in the inner loop

+
+
+ +

The required wrench \(\bm{\mathcal{F}}\) in the impedance control scheme, is based on inverse dynamics control and consists of three main parts. +In the inner loop, the force control scheme is based on a feedback linearization part in addition to a mass matrix adjustment, while in the outer loop usually a linear motion controller is considered based on the desired impedance requirements.

+

Although many different impedance structures may be considered as the basis of the control law, in Figure fig:taghira13_impedance_control, a linear impedance relation between the force and motion variables is generated that consists of desired inductive \(\bm{M}_d\), resistive \(\bm{C}_d\) and capacitive impedances \(\bm{K}_d\).

+

According to Figure fig:taghira13_impedance_control, the controller output wrench \(\bm{\mathcal{F}}\), applied to the manipulator may be formulated as +\[ \bm{\mathcal{F}} = \hat{\bm{M}} \bm{M}_d^{-1} \bm{e}_F + \bm{\mathcal{F}}_{fl} \] +with:

+

\begin{align*} +\bm{e}_F &= \bm{\mathcal{F}}_a - \bm{\mathcal{F}}_m \\\
+\bm{\mathcal{F}}_a &= \bm{M}_d \ddot{\bm{\mathcal{X}}}_{d} + \bm{C}_{d} \dot{\bm{e}}_{x} + \bm{K}_{d} \bm{e}_{x} +\end{align*}

+

\(\bm{M}_d\) denotes the desired inductive impedance, \(\bm{C}_d\) the desired resistive impedance and \(\bm{K}_d\) is desired capacitive impedance matrices.

+

The feedback linearizing term is given by: +\[ \bm{\mathcal{F}}_{fl} = \hat{\bm{C}}(\bm{\mathcal{X}}, \dot{\bm{\mathcal{X}}}) \dot{\bm{\mathcal{X}}} + \hat{\bm{G}}(\bm{\mathcal{X}}) + \bm{\mathcal{F}}_m \]

+

If the information on the dynamic matrices is complete, and if the force measurements are noise free (\(\bm{\mathcal{F}}_m = \bm{\mathcal{F}}_e\)), the closed-loop dynamic formulation simplifies to: +\[ \bm{M}_d \ddot{\bm{e}}_x + \bm{C}_d \dot{\bm{e}}_x + \bm{K}_d \bm{e}_x = \bm{\mathcal{F}}_e \]

+

And thus the closed-loop error dynamic equation satisfies a set of second-order systems with the desired impedance coefficients in relation to the interacting force. +In other words, the control structure guarantees that the force and motion relation follows a desired impedance. +Therefore, by choosing appropriate impedance matrices, the transient performance of the force-motion relation can be shaped so as to have a fast but stable interaction. +By this means, what is controlled is the dynamic relation between the force and motion variables, and not directly the position. +However, if the robot is moving freely in space and has no interaction with the environment, \(\bm{\mathcal{F}}_e = 0\), the closed-loop system will provide a suitable motion tracking thanks to the motion controller in the outer loop.

+

The impedance control scheme is very popular in practice, wherein tuning the force and motion relation in a robot manipulator interacting with a stiff environment is the prime objective. +However, note that for a good performance, an accurate model of the system is required, and the obtained force and motion dynamics are not robust to modeling uncertainty.

+

Bibliography

+

Taghirad, H., Parallel robots : mechanics and control (2013), Boca Raton, FL: CRC Press.

+ +
+
+
+
+
+ +
+ + + + +
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + diff --git a/public/browserconfig.xml b/public/browserconfig.xml new file mode 100644 index 0000000..e8b57e5 --- /dev/null +++ b/public/browserconfig.xml @@ -0,0 +1,9 @@ + + + + + + #b91d47 + + + diff --git a/public/categories/cat1/index.html b/public/categories/cat1/index.html new file mode 100644 index 0000000..87a55e9 --- /dev/null +++ b/public/categories/cat1/index.html @@ -0,0 +1,157 @@ + + + + + + cat1 · My digital brain + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+
+ +
+ + +
+
+
+
+
+

cat1

+
+ +
+ + 0001-01-01 + + + + Active structural vibration control: a review + + +
+
+ + +
+
+
+ +
+ + + + +
+ +
+ +
+
+ + + + + + + + + + + + + + + + + diff --git a/public/categories/cat1/index.xml b/public/categories/cat1/index.xml new file mode 100644 index 0000000..c0f17b8 --- /dev/null +++ b/public/categories/cat1/index.xml @@ -0,0 +1,24 @@ + + + + cat1 on My digital brain + /categories/cat1/ + Recent content in cat1 on My digital brain + Hugo -- gohugo.io + en + + + + + + Active structural vibration control: a review + /paper/alkhatib03_activ_struc_vibrat_contr/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /paper/alkhatib03_activ_struc_vibrat_contr/ + Tags : + Reference (Rabih Alkhatib &amp; Golnaraghi, 2003) Author(s) Alkhatib, R., &amp; Golnaraghi, M. F. Year 2003 Process of designing an active vibration control system Analyze the structure to be controled Obtain an idealized mathematical model with FEM or experimental modal analysis Reduce the model order is necessary Analyze the resulting model: dynamics properties, types of disturbances, &hellip; Quantify sensors and actuators requirements. Decide on their types and location Analyze the impact of the sensors and actuators on the overall dynamic characteristics Specify performance criteria and stability tradeoffs Device of the type of control algorythm to be employed and design a controller to meet the specifications Simulate the resulting controlled system on a computer If the controller does not meet the requirements, adjust the specifications or modify the type of controller Choose hardware and software and integrate the components on a pilot plant Formulate experiments and perform system identification and model updating Implement controller and carry out system test to evaluate the performance Feedback control Active damping The objective is to reduce the resonance peaks of the closed loop transfer function. + + + + \ No newline at end of file diff --git a/public/categories/cat1/page/1/index.html b/public/categories/cat1/page/1/index.html new file mode 100644 index 0000000..7dd18cf --- /dev/null +++ b/public/categories/cat1/page/1/index.html @@ -0,0 +1 @@ +/categories/cat1/ \ No newline at end of file diff --git a/public/categories/cat2/index.html b/public/categories/cat2/index.html new file mode 100644 index 0000000..e5d26e9 --- /dev/null +++ b/public/categories/cat2/index.html @@ -0,0 +1,157 @@ + + + + + + cat2 · My digital brain + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+
+ +
+ + +
+
+
+
+
+

cat2

+
+ +
+ + 0001-01-01 + + + + Active structural vibration control: a review + + +
+
+ + +
+
+
+ +
+ + + + +
+ +
+ +
+
+ + + + + + + + + + + + + + + + + diff --git a/public/categories/cat2/index.xml b/public/categories/cat2/index.xml new file mode 100644 index 0000000..e92c005 --- /dev/null +++ b/public/categories/cat2/index.xml @@ -0,0 +1,24 @@ + + + + cat2 on My digital brain + /categories/cat2/ + Recent content in cat2 on My digital brain + Hugo -- gohugo.io + en + + + + + + Active structural vibration control: a review + /paper/alkhatib03_activ_struc_vibrat_contr/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /paper/alkhatib03_activ_struc_vibrat_contr/ + Tags : + Reference (Rabih Alkhatib &amp; Golnaraghi, 2003) Author(s) Alkhatib, R., &amp; Golnaraghi, M. F. Year 2003 Process of designing an active vibration control system Analyze the structure to be controled Obtain an idealized mathematical model with FEM or experimental modal analysis Reduce the model order is necessary Analyze the resulting model: dynamics properties, types of disturbances, &hellip; Quantify sensors and actuators requirements. Decide on their types and location Analyze the impact of the sensors and actuators on the overall dynamic characteristics Specify performance criteria and stability tradeoffs Device of the type of control algorythm to be employed and design a controller to meet the specifications Simulate the resulting controlled system on a computer If the controller does not meet the requirements, adjust the specifications or modify the type of controller Choose hardware and software and integrate the components on a pilot plant Formulate experiments and perform system identification and model updating Implement controller and carry out system test to evaluate the performance Feedback control Active damping The objective is to reduce the resonance peaks of the closed loop transfer function. + + + + \ No newline at end of file diff --git a/public/categories/cat2/page/1/index.html b/public/categories/cat2/page/1/index.html new file mode 100644 index 0000000..1e9c252 --- /dev/null +++ b/public/categories/cat2/page/1/index.html @@ -0,0 +1 @@ +/categories/cat2/ \ No newline at end of file diff --git a/public/categories/index.html b/public/categories/index.html new file mode 100644 index 0000000..b125d7f --- /dev/null +++ b/public/categories/index.html @@ -0,0 +1,151 @@ + + + + + + Categories - My digital brain + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+
+ +
+ + +
+
+
+
+
+ 2 Categories In Total +
+ +
+
+
+
+ +
+ + + + +
+ +
+ +
+
+ + + + + + + + + + + + + + + + + diff --git a/public/categories/index.xml b/public/categories/index.xml new file mode 100644 index 0000000..f93d1f4 --- /dev/null +++ b/public/categories/index.xml @@ -0,0 +1,32 @@ + + + + Categories on My digital brain + /categories/ + Recent content in Categories on My digital brain + Hugo -- gohugo.io + en + + + + + + cat1 + /categories/cat1/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /categories/cat1/ + + + + + cat2 + /categories/cat2/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /categories/cat2/ + + + + + \ No newline at end of file diff --git a/public/favicon-16x16.png b/public/favicon-16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..6113ea6999a6a4b1a05f0cc5b481becad2f3027b GIT binary patch literal 1806 zcmV+p2l4ocP)deu7TJFo47VKED3E5 zX-b`GN?|e$1QMVPE+sS>rcO~z4Rlh>G+{inlK^d5+R0=l(}bqe1e&m!5E7fk1}_Cm z#=9-c@}gbp4-;FmuQZ+ZXZrm*=e+OH`=0OK^W9JIRS)4mA?@A0d3CFKsJ5-cmN7c+ z77{cHPfn)#xp@9A*F0dW<}L&N8k9b4b&Jn#sBsE{XUD$DOE&Bczj7F zsmW0^-L>$~YhCz!6Fi9o9xX~`Zgw1&oRp)_VV4-Bi# zTVb&|r2u<27xDGHBmlm*EEAnp#mNua09e0j4jaFdGr6yDu9nK$YYYxMq#hgFfxV$L zB;gD=Jid%C#|1gsAZ*2=l&Nu1N)Q&vb$NWV!f8lD0sD48x2(O#_F~VVT@9d1h$JUN zJ&DJ~DA1~vl;$T>JUaY zcfP)B#h1?*U}bSCyEiTfcNl)W|02!i;Th`^L11a2{_N|&JGF8;HX{RDH?95bLVeE? zzaJu%GD`E3SXQWKU0F6NW!P5+%ZQWi!Es9Sl6iPu67gyU{Z*R1 zzx8I|o}dg=y}a@1ch0r{$?x}*KRcevO@(MRijacuoV$kvf$~SQLUIPJPWB%Cf}5=t z1VP}*$FkP%IdJUsWOf3{UH#)b{eC|&QF4sW7ljo!^^8*cb`yu+Zp73*8j`2gC@^j= zB3dQK@AuQ)H@+(n56Y=^)RhMCkRcv*Ohm{Z1#mj23X^5n$+g@4+-V=i?(nef`*TT6 zikieVu@O9Eh~vtwKCGjz^pFPRQi%(|VsirEcKc{*x003^6*e0$zws$vpMP>b-w?;T zvg{zv(1TkMArl-S4J5`ZuL9-GCM$YwWhvc)Sewt0z2O3eALmEiaByHEk4y>`-oRar1nkUy&5>+9^0pit4_WxuNv(wcx zurrs;9R5qw1TR+M)g?q#gfy_T`cUV(AC&i7ZO&wXqTB?2SeDJgX;pA~Jo`kBsQB=h zo0=0hC+Ck8=&FBiJkl4)3AzPUFFm`p@$OJEz_&}&Ik3H$!mlMD2vfJU**wgp>%9a# zat!IQqQ+uXGL{zVC+D|K)(WH17^E4LfzJNXEfX8%ys&m25=n5Obh*9k_)Q%yx0hIz zd~#jzBN~Dru;;l#j=kT)i8HOVn1?mFS*9wWQZxg@WA0RdoGdje#muTFmr0ms&;Vc? zcZ;iv#50f2L8qN~kGcm&p9;i+3`EE!b^y0W{78ZzaBxQnuWl_8H3-mavGdb|b?iUZ zfVpR)KuH9F%#>&V#vGowkOs6didz7U{~F?6*9ezy^s?)>SGavIxS#k&fsSXMm?LVS zp?Q#7Z5BSd+R2vc3tYV3gV*P$tz+UN6{C{(2l9iCkr1!i9U+&lcDcRmIr2FJ!*-l5 zA0H;&XYMRbkkEWXyr_W{52w)4H_E#oo3J}PRKL~0(uFz(trNv9NgH`OkROzRU+jDH z#)=~SX@JiDF`O6k8 zYhOqM0IwZBv3_N7%Da*WS8wS89hv%QQL%7gNQ+_VLfzy%J1y3>C|6TzG#Y(@Jkge{ zruI~Mx-M!Q!0q#iQRubUr^Z8eQI5+qu{R}A7#dJcpI2ror?G1MZK5@9b z{H*2*j}@mfCnFY%)yY4u+-G2T>Z8_bwz0wZG2bjnC0?zh)okPJ)lNKKACU^FKV2XF zLMWZE{|hR2Zg}OxPw&5KcX~v5rFlsW2!c>|qqjf|k5tI~-zrI~+l)5)`_b~V(UGzer^_2>clsnMrOcm`q3&N&ps%i}J^A$K^^HfKU$@*Xl?wS|c8|*K w@d*hUg(q)z!tKTRy7FKC`sk@}8vl=f1111rLiFYGPyhe`07*qoM6N<$f=z~Mz5oCK literal 0 HcmV?d00001 diff --git a/public/favicon-32x32.png b/public/favicon-32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..6113ea6999a6a4b1a05f0cc5b481becad2f3027b GIT binary patch literal 1806 zcmV+p2l4ocP)deu7TJFo47VKED3E5 zX-b`GN?|e$1QMVPE+sS>rcO~z4Rlh>G+{inlK^d5+R0=l(}bqe1e&m!5E7fk1}_Cm z#=9-c@}gbp4-;FmuQZ+ZXZrm*=e+OH`=0OK^W9JIRS)4mA?@A0d3CFKsJ5-cmN7c+ z77{cHPfn)#xp@9A*F0dW<}L&N8k9b4b&Jn#sBsE{XUD$DOE&Bczj7F zsmW0^-L>$~YhCz!6Fi9o9xX~`Zgw1&oRp)_VV4-Bi# zTVb&|r2u<27xDGHBmlm*EEAnp#mNua09e0j4jaFdGr6yDu9nK$YYYxMq#hgFfxV$L zB;gD=Jid%C#|1gsAZ*2=l&Nu1N)Q&vb$NWV!f8lD0sD48x2(O#_F~VVT@9d1h$JUN zJ&DJ~DA1~vl;$T>JUaY zcfP)B#h1?*U}bSCyEiTfcNl)W|02!i;Th`^L11a2{_N|&JGF8;HX{RDH?95bLVeE? zzaJu%GD`E3SXQWKU0F6NW!P5+%ZQWi!Es9Sl6iPu67gyU{Z*R1 zzx8I|o}dg=y}a@1ch0r{$?x}*KRcevO@(MRijacuoV$kvf$~SQLUIPJPWB%Cf}5=t z1VP}*$FkP%IdJUsWOf3{UH#)b{eC|&QF4sW7ljo!^^8*cb`yu+Zp73*8j`2gC@^j= zB3dQK@AuQ)H@+(n56Y=^)RhMCkRcv*Ohm{Z1#mj23X^5n$+g@4+-V=i?(nef`*TT6 zikieVu@O9Eh~vtwKCGjz^pFPRQi%(|VsirEcKc{*x003^6*e0$zws$vpMP>b-w?;T zvg{zv(1TkMArl-S4J5`ZuL9-GCM$YwWhvc)Sewt0z2O3eALmEiaByHEk4y>`-oRar1nkUy&5>+9^0pit4_WxuNv(wcx zurrs;9R5qw1TR+M)g?q#gfy_T`cUV(AC&i7ZO&wXqTB?2SeDJgX;pA~Jo`kBsQB=h zo0=0hC+Ck8=&FBiJkl4)3AzPUFFm`p@$OJEz_&}&Ik3H$!mlMD2vfJU**wgp>%9a# zat!IQqQ+uXGL{zVC+D|K)(WH17^E4LfzJNXEfX8%ys&m25=n5Obh*9k_)Q%yx0hIz zd~#jzBN~Dru;;l#j=kT)i8HOVn1?mFS*9wWQZxg@WA0RdoGdje#muTFmr0ms&;Vc? zcZ;iv#50f2L8qN~kGcm&p9;i+3`EE!b^y0W{78ZzaBxQnuWl_8H3-mavGdb|b?iUZ zfVpR)KuH9F%#>&V#vGowkOs6didz7U{~F?6*9ezy^s?)>SGavIxS#k&fsSXMm?LVS zp?Q#7Z5BSd+R2vc3tYV3gV*P$tz+UN6{C{(2l9iCkr1!i9U+&lcDcRmIr2FJ!*-l5 zA0H;&XYMRbkkEWXyr_W{52w)4H_E#oo3J}PRKL~0(uFz(trNv9NgH`OkROzRU+jDH z#)=~SX@JiDF`O6k8 zYhOqM0IwZBv3_N7%Da*WS8wS89hv%QQL%7gNQ+_VLfzy%J1y3>C|6TzG#Y(@Jkge{ zruI~Mx-M!Q!0q#iQRubUr^Z8eQI5+qu{R}A7#dJcpI2ror?G1MZK5@9b z{H*2*j}@mfCnFY%)yY4u+-G2T>Z8_bwz0wZG2bjnC0?zh)okPJ)lNKKACU^FKV2XF zLMWZE{|hR2Zg}OxPw&5KcX~v5rFlsW2!c>|qqjf|k5tI~-zrI~+l)5)`_b~V(UGzer^_2>clsnMrOcm`q3&N&ps%i}J^A$K^^HfKU$@*Xl?wS|c8|*K w@d*hUg(q)z!tKTRy7FKC`sk@}8vl=f1111rLiFYGPyhe`07*qoM6N<$f=z~Mz5oCK literal 0 HcmV?d00001 diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..cffc8fbae8ea8cc1888972199073c1d437f50e4e GIT binary patch literal 328299 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�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 z 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 literal 0 HcmV?d00001 diff --git a/public/fonts/chancery/apple-chancery-webfont.eot b/public/fonts/chancery/apple-chancery-webfont.eot new file mode 100644 index 0000000000000000000000000000000000000000..39c3936b07576cd74607413ff9da2ff3e84d2680 GIT binary patch literal 26058 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 SZSu&8NkOHXN3MO`njm1}8|E1R literal 0 HcmV?d00001 diff --git a/public/fonts/chancery/apple-chancery-webfont.svg b/public/fonts/chancery/apple-chancery-webfont.svg new file mode 100644 index 0000000..2b18b6a --- /dev/null +++ b/public/fonts/chancery/apple-chancery-webfont.svg @@ -0,0 +1,228 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/fonts/chancery/apple-chancery-webfont.ttf b/public/fonts/chancery/apple-chancery-webfont.ttf new file mode 100644 index 0000000000000000000000000000000000000000..8238aa440733225fa3996010a9e279105a489f00 GIT binary patch literal 60780 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 z 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 literal 0 HcmV?d00001 diff --git a/public/fonts/chancery/apple-chancery-webfont.woff b/public/fonts/chancery/apple-chancery-webfont.woff new file mode 100644 index 0000000000000000000000000000000000000000..e476776e4008e13adbc3968072f37b2040933be0 GIT binary patch literal 30256 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 OO9TJ_0apOOvj70|+6+tp literal 0 HcmV?d00001 diff --git a/public/fonts/chancery/apple-chancery-webfont.woff2 b/public/fonts/chancery/apple-chancery-webfont.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..922dfb33c1d9f014faf12cccff06be0fa40eff23 GIT binary patch literal 23532 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 literal 0 HcmV?d00001 diff --git a/public/fonts/iconfont/iconfont.eot b/public/fonts/iconfont/iconfont.eot new file mode 100644 index 0000000000000000000000000000000000000000..66e449b832e580e0e59a99961eef6343e399490f GIT binary patch literal 10420 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 + + +Generated by IcoMoon + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/fonts/iconfont/iconfont.ttf b/public/fonts/iconfont/iconfont.ttf new file mode 100644 index 0000000000000000000000000000000000000000..f8f81a42737f5e102de42719b41edf1e67b49059 GIT binary patch literal 10256 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 BGhYAz literal 0 HcmV?d00001 diff --git a/public/fonts/iconfont/iconfont.woff b/public/fonts/iconfont/iconfont.woff new file mode 100644 index 0000000000000000000000000000000000000000..e400c037fbf6a87ceb9530a506b532795ab493ec GIT binary patch literal 10336 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/index.html b/public/index.html new file mode 100644 index 0000000..730e0d6 --- /dev/null +++ b/public/index.html @@ -0,0 +1,155 @@ + + + + + + + My digital brain + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+
+ +
+ + +
+
+
+ This is the main page. +
+
+
+ +
+ + + + +
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + diff --git a/public/index.json b/public/index.json new file mode 100644 index 0000000..828ba19 --- /dev/null +++ b/public/index.json @@ -0,0 +1 @@ +[{"categories":null,"contents":" Tags Stewart Platforms Reference (Legnani {\\it et al.}, 2012) Author(s) Legnani, G., Fassi, I., Giberti, H., Cinquemani, S., \u0026amp; Tosi, D. Year 2012 Concepts of isotropy and decoupling for parallel manipulators isotropy: the kinetostatic properties (same applicable force, same possible velocity, same stiffness) are identical in all directions (e.g. cubic configuration for Stewart platform) decoupling: each DoF of the end effector can be controlled by a single actuator (not the case for the Stewart platform) Example of generated isotropic manipulator (not decoupled).\n\n Figure 1: Location of the leg axes using an isotropy generator\n \n Figure 2: Isotropic configuration\n Bibliography Legnani, G., Fassi, I., Giberti, H., Cinquemani, S., \u0026amp; Tosi, D., A new isotropic and decoupled 6-dof parallel manipulator, Mechanism and Machine Theory, 58(nil), 64–81 (2012). http://dx.doi.org/10.1016/j.mechmachtheory.2012.07.008 ↩\n","permalink":"/paper/legnani12_new_isotr_decoup_paral_manip/","tags":null,"title":"A new isotropic and decoupled 6-dof parallel manipulator"},{"categories":null,"contents":" Tags Position Sensors Reference (Andrew Fleming, 2013) Author(s) Fleming, A. J. Year 2013 Define concise performance metric and provide expressions for errors sources (non-linearity, drift, noise) Review current position sensor technologies and compare their performance Sensor Characteristics Calibration and nonlinearity Usually quoted as a percentage of the fill-scale range (FSR):\n\\begin{equation} \\text{mapping error (%)} = \\pm 100 \\frac{\\max{}|e_m(v)|}{\\text{FSR}} \\end{equation}\nWith \\(e_m(v)\\) is the mapping error.\n\n Figure 1: The actual position versus the output voltage of a position sensor. The calibration function \\(f_{cal}(v)\\) is an approximation of the sensor mapping function \\(f_a(v)\\) where \\(v\\) is the voltage resulting from a displacement \\(x\\). \\(e_m(v)\\) is the residual error.\n Drift and Stability If the shape of the mapping function actually varies with time, the maximum error due to drift must be evaluated by finding the worst-case mapping error.\n\n Figure 2: The worst case range of a linear mapping function \\(f_a(v)\\) for a given error in sensitivity and offset.\n Bandwidth The bandwidth of a position sensor is the frequency at which the magnitude of the transfer function \\(P(s) = v(s)/x(s)\\) drops by \\(3,dB\\).\nAlthough the bandwidth specification is useful for predicting the resolution of sensor, it reveals very little about the measurement errors caused by sensor dynamics.\nThe frequency domain position error is\n\\begin{equation} \\begin{aligned} e_{bw}(s) \u0026amp;= x(s) - v(s) \\\\\\\n\u0026amp;= x(s) (1 - P(s)) \\end{aligned} \\end{equation}\nIf the actual position is a sinewave of peak amplitude \\(A = \\text{FSR}/2\\):\n\\begin{equation} \\begin{aligned} e_{bw} \u0026amp;= \\pm \\frac{\\text{FSR}}{2} |1 - P(s)| \\\\\\\n\u0026amp;\\approx \\pm A n \\frac{f}{f_c} \\end{aligned} \\end{equation}\nwith \\(n\\) is the low pass filter order corresponding to the sensor dynamics and \\(f_c\\) is the measurement bandwidth.\nThus, the sensor bandwidth must be significantly higher than the operating frequency if dynamic errors are to be avoided.\nNoise In addition to the actual position signal, all sensors produce some additive measurement noise. In many types of sensor, the majority of noise arises from the thermal noise in resistors and the voltage and current noise in conditioning circuit transistors. These noise processes can usually be approximated by a Gaussian random process.\nA Gaussian random process is usually described by its autocorrelation function or its Power Spectral Density.\nThe autocorrelation function of a random process \\(\\mathcal{X}\\) is\n\\begin{equation} R_{\\mathcal{X}}(\\tau) = E[\\mathcal{X}(t)\\mathcal{X}(t + \\tau)] \\end{equation}\nwhere \\(E\\) is the expected value operator.\nThe variance of the process is equal to \\(R_\\mathcal{X}(0)\\) and is the expected value of the varying part squared:\n\\begin{equation} \\text{Var} \\mathcal{X} = E \\left[ (\\mathcal{X} - E[\\mathcal{X}])^2 \\right] \\end{equation}\nThe standard deviation \\(\\sigma\\) is the square root of the variance:\n\\begin{equation} \\sigma_\\mathcal{X} = \\sqrt{\\text{Var} \\mathcal{X}} \\end{equation}\nThe standard deviation is also the Root Mean Square (RMS) value of a zero-mean random process.\nThe Power Spectral Density \\(S_\\mathcal{X}(f)\\) of a random process represents the distribution of power (or variance) across frequency \\(f\\).\nFor example, if the random process under consideration was measured in volts, the power spectral density would have the units of \\(V^2/\\text{Hz}\\).\nThe Power Spectral Density can be obtained from the autocorrelation function from the Wiener-Khinchin relation:\n\\begin{equation} S_{\\mathcal{X}} = 2 \\mathcal{F}\\{ R_\\mathcal{X}(\\tau) \\} = 2 \\int_{-\\infty}^{\\infty} R_\\mathcal{X}(\\tau) e^{-2j\\pi f \\tau} d\\tau \\end{equation}\nIf the power Spectral Density is known, the variance of the generating process can be found from the area under the curve:\n\\begin{equation} \\sigma_\\mathcal{X}^2 = E[\\mathcal{X}^2(t)] = R_\\mathcal{X}(0) = \\int_0^\\infty S_\\mathcal{X}(f) df \\end{equation}\nRather than plotting the frequency distribution of power, it is often convenient to plot the frequency distribution of the standard deviation, which is referred to as the spectral density. It is related to the power spectral density by a square root:\n\\begin{equation} \\text{spectral density} = \\sqrt{S_\\mathcal{X}(f)} \\end{equation}\nThe units of \\(\\sqrt{S_\\mathcal{X}(f)}\\) are \\(\\text{units}/\\sqrt{Hz}\\).\nThe spectral density if preferred in the electronics literature as the RMS value of a noise process can be determined directly from the noise density and effective bandwidth.\nResolution The random noise of a position sensor causes an uncertainty in the measured position. If the distance between two measured locations is smaller than the uncertainty, it is possible to mistake one point for the other.\nTo characterize the resolution, we use the probability that the measured value is within a certain error bound.\nIf the measurement noise is approximately Gaussian, the resolution can be quantified by the standard deviation \\(\\sigma\\) (RMS value).\nThe empirical rule states that there is a \\(99.7%\\) probability that a sample of a Gaussian random process lie within \\(\\pm 3 \\sigma\\). This if we define the resolution as \\(\\delta = 6 \\sigma\\), we will referred to as the \\(6\\sigma\\text{-resolution}\\).\nAnother important parameter that must be specified when quoting resolution is the sensor bandwidth. There is usually a trade-off between bandwidth and resolution (figure 3).\n\n Figure 3: The resolution versus banwidth of a position sensor.\n Many type of sensor have a limited full-scale-range (FSR) and tend to have an approximated proportional relationship between the resolution and range. As a result, it is convenient to consider the ratio of resolution to the FSR, or equivalently, the dynamic range (DNR). A convenient method for reporting this ratio is in parts-per-million (ppm):\n\\begin{equation} \\text{DNR}_{\\text{ppm}} = 10^6 \\frac{\\text{full scale range}}{6\\sigma\\text{-resolution}} \\end{equation}\nComparison and summary \nTable 1: Summary of position sensor characteristics. The dynamic range (DNR) and resolution are approximations based on a full-scale range of \\(100\\,\\mu m\\) and a first order bandwidth of \\(1\\,kHz\\) Sensor Type Range DNR Resolution Max. BW Accuracy Metal foil \\(10-500,\\mu m\\) 230 ppm 23 nm 1-10 kHz 1% FSR Piezoresistive \\(1-500,\\mu m\\) 5 ppm 0.5 nm \u0026gt;100 kHz 1% FSR Capacitive \\(10,\\mu m\\) to \\(10,mm\\) 24 ppm 2.4 nm 100 kHz 0.1% FSR Electrothermal \\(10,\\mu m\\) to \\(1,mm\\) 100 ppm 10 nm 10 kHz 1% FSR Eddy current \\(100,\\mu m\\) to \\(80,mm\\) 10 ppm 1 nm 40 kHz 0.1% FSR LVDT \\(0.5-500,mm\\) 10 ppm 5 nm 1 kHz 0.25% FSR Interferometer Meters 0.5 nm \u0026gt;100kHz 1 ppm FSR Encoder Meters 6 nm \u0026gt;100kHz 5 ppm FSR Bibliography Fleming, A. J., A review of nanometer resolution position sensors: operation and performance, Sensors and Actuators A: Physical, 190(nil), 106–126 (2013). http://dx.doi.org/10.1016/j.sna.2012.10.016 ↩\n","permalink":"/paper/fleming13_review_nanom_resol_posit_sensor/","tags":null,"title":"A review of nanometer resolution position sensors: operation and performance"},{"categories":null,"contents":" Tags Vibration Isolation, Stewart Platforms, Flexible Joints Reference (Preumont {\\it et al.}, 2007) Author(s) Preumont, A., Horodinca, M., Romanescu, I., Marneffe, B. d., Avraam, M., Deraemaeker, A., Bossens, F., … Year 2007 Summary:\n Cubic Stewart platform (Figure 3) Provides uniform control capability Uniform stiffness in all directions minimizes the cross-coupling among actuators and sensors of different legs Flexible joints (Figure 2) Piezoelectric force sensors Voice coil actuators Decentralized feedback control approach for vibration isolation Effect of parasitic stiffness of the flexible joints on the IFF performance (Figure 1) The Stewart platform has 6 suspension modes at different frequencies. Thus the gain of the IFF controller cannot be optimal for all the modes. It is better if all the modes of the platform are near to each other. Discusses the design of the legs in order to maximize the natural frequency of the local modes. To estimate the isolation performance of the Stewart platform, a scalar indicator is defined as the Frobenius norm of the transmissibility matrix \n Figure 1: Root locus with IFF with no parasitic stiffness and with parasitic stiffness\n \n Figure 2: Flexible joints used for the Stewart platform\n \n Figure 3: Stewart platform\n Bibliography Preumont, A., Horodinca, M., Romanescu, I., Marneffe, B. d., Avraam, M., Deraemaeker, A., Bossens, F., …, A six-axis single-stage active vibration isolator based on stewart platform, Journal of Sound and Vibration, 300(3-5), 644–661 (2007). http://dx.doi.org/10.1016/j.jsv.2006.07.050 ↩\n","permalink":"/paper/preumont07_six_axis_singl_stage_activ/","tags":null,"title":"A six-axis single-stage active vibration isolator based on stewart platform"},{"categories":null,"contents":" Tags Stewart Platforms, Vibration Isolation Reference (Spanos {\\it et al.}, 1995) Author(s) Spanos, J., Rahman, Z., \u0026amp; Blackwood, G. Year 1995 Stewart Platform (Figure 1):\n Voice Coil Flexible joints (cross-blades) Force Sensors Cubic Configuration \n Figure 1: Stewart Platform\n Total mass of the paylaod: 30kg Center of gravity is 9cm above the geometry center of the mount (cube\u0026rsquo;s center?).\nLimitation of the Decentralized Force Feedback:\n high frequency pole due to internal resonances of the struts low frequency zero due to the rotational stiffness of the flexible joints After redesign of the struts:\n high frequency pole at 4.7kHz low frequency zero at 2.6Hz but non-minimum phase (not explained). Small viscous damping material in the cross blade flexures made the zero minimum phase again. \n Figure 2: Experimentally measured transfer function from voice coil drive voltage to collocated load cell output voltage\n The controller used consisted of:\n second order low pass filter to gain stabilize the plant at high frequencies and provide steep roll-off first order lead filter to provide adequate phase margin at the high frequency crossover first order lag filter to provide adequate phase margin at the low frequency crossover a first order high pass filter to attenuate the excess gain resulting from the low frequency zero The results in terms of transmissibility are shown in Figure 3.\n\n Figure 3: Experimentally measured Frobenius norm of the 6-axis transmissibility\n Bibliography Spanos, J., Rahman, Z., \u0026amp; Blackwood, G., A soft 6-axis active vibration isolator, In , Proceedings of 1995 American Control Conference - ACC'95 (pp. ) (1995). : . ↩\n","permalink":"/paper/spanos95_soft_activ_vibrat_isolat/","tags":null,"title":"A soft 6-axis active vibration isolator"},{"categories":null,"contents":"Tags :\n Reference (Devasia {\\it et al.}, 2007) Author(s) Devasia, S., Eleftheriou, E., \u0026amp; Moheimani, S. R. Year 2007 Talks about Scanning Tunneling Microscope (STM) and Scanning Probe Microscope (SPM) Piezoelectric actuators: Creep, Hysteresis, Vibrations, Modeling errors Interesting analysis about Bandwidth-Precision-Range tradeoffs Control approaches for piezoelectric actuators: feedforward, Feedback, Iterative, Sensorless controls \n Figure 1: Tradeoffs between bandwidth, precision and range\n Bibliography Devasia, S., Eleftheriou, E., \u0026amp; Moheimani, S. R., A survey of control issues in nanopositioning, IEEE Transactions on Control Systems Technology, 15(5), 802–823 (2007). ↩\n","permalink":"/paper/devasia07_survey_contr_issues_nanop/","tags":null,"title":"A survey of control issues in nanopositioning"},{"categories":null,"contents":"Tags :\n\u0026lt;./biblio/references.bib\u0026gt;\nBacklinks Active isolation and damping of vibrations via stewart platform Active damping based on decoupled collocated control ","permalink":"/zettels/active_damping/","tags":null,"title":"Active Damping"},{"categories":null,"contents":" Tags Active Damping Reference (Holterman \u0026amp; deVries, 2005) Author(s) Holterman, J., \u0026amp; deVries, T. Year 2005 Bibliography Holterman, J., \u0026amp; deVries, T., Active damping based on decoupled collocated control, IEEE/ASME Transactions on Mechatronics, 10(2), 135–145 (2005). http://dx.doi.org/10.1109/tmech.2005.844702 ↩\n","permalink":"/paper/holterman05_activ_dampin_based_decoup_colloc_contr/","tags":null,"title":"Active damping based on decoupled collocated control"},{"categories":null,"contents":" Tags Stewart Platforms, Vibration Isolation, Active Damping Reference @phdthesis{hanieh03_activ_stewar, author = {Hanieh, Ahmed Abu}, school = {Universit{'e} Libre de Bruxelles, Brussels, Belgium}, title = {Active isolation and damping of vibrations via Stewart platform}, year = 2003, tags = {parallel robot}, } Author(s) Hanieh, A. A. Year 2003 Bibliography Hanieh, A. A., Active isolation and damping of vibrations via stewart platform (Doctoral dissertation) (2003). Universit{'e} Libre de Bruxelles, Brussels, Belgium, . ↩\n","permalink":"/paper/hanieh03_activ_stewar/","tags":null,"title":"Active isolation and damping of vibrations via stewart platform"},{"categories":["cat1","cat2"],"contents":"Tags :\n Reference (Rabih Alkhatib \u0026amp; Golnaraghi, 2003) Author(s) Alkhatib, R., \u0026amp; Golnaraghi, M. F. Year 2003 Process of designing an active vibration control system Analyze the structure to be controled Obtain an idealized mathematical model with FEM or experimental modal analysis Reduce the model order is necessary Analyze the resulting model: dynamics properties, types of disturbances, \u0026hellip; Quantify sensors and actuators requirements. Decide on their types and location Analyze the impact of the sensors and actuators on the overall dynamic characteristics Specify performance criteria and stability tradeoffs Device of the type of control algorythm to be employed and design a controller to meet the specifications Simulate the resulting controlled system on a computer If the controller does not meet the requirements, adjust the specifications or modify the type of controller Choose hardware and software and integrate the components on a pilot plant Formulate experiments and perform system identification and model updating Implement controller and carry out system test to evaluate the performance Feedback control Active damping The objective is to reduce the resonance peaks of the closed loop transfer function.\n\\[T(s) = \\frac{G(s)H(s)}{1+G(s)H(s)}\\]\nThen \\(T(s) \\approx G(s)\\) except near the resonance peaks where the amplitude is reduced.\nThis method can be realized without a model of the structure with guaranteed stability, granted that the actuators and sensors are collocated.\nModel based feedback Objective: keep a control variable (position, velocity, \u0026hellip;) to a desired value in spite of external disturbances \\(d(s)\\).\nWe have \\[\\frac{y(s)}{d(s)} = \\frac{1}{1+G(s)H(s)}\\] so we need large values of \\(G(s)H(s)\\) in the frequency range where the disturbance has considerable effect.\nTo do so, we need a mathematical model of the system, then the control bandwidth and effectiveness are restricted by the accuracy of the model. Unmodeled structural dynamics may destabilize the system.\nFeedforward Control We need a signal that is correlated to the disturbance. Then feedforward can improve performance over simple feedback control.\nAn adaptive filter manipulates the signal correlated to the disturbance and the output is applied to the system by the actuator. The filter coefficients are adapted in such a way that an error signal is minimized. The idea is to generate a secondary disturbance, which destructively interferes with the effect of the primary distance at the location of the error sensor. However, there is no guarantee that the global response is also reduced at other locations.\nThe method is considered to be a local technique, in contrast to feedback which is global.\nContrary to active damping which can only reduce the vibration near the resonance, feedforward control can be effective for any frequency. The major restriction to the application of feedforward adaptive filtering is the accessibility of a reference signal correlated to the disturbance.\n\nTable 1: Comparison of control strategies Type of control Advantages Disadvantages Active Damping Simple to implement Effective only near resonance Does not required accurate model Guaranteed stability (collocated) Model Based Global method Requires accurate model Attenuate all disturbance within bandwidth Required low delay Limited bandwidth Spillover Feedforward Adaptive filtering No model is necessary Error signal required Robust to change in plant transfer function Local method: may amplify vibration elsewhere More effective for narrowband disturbance Large amount of real-time computation Controllability and Observability Controllability and Observability are two fundamental qualitave properties of dynamic systems.\nA system is said to be controllable if every state vector can be transform to a desirate state in finite time by the application of unconstrained control inputs.\nA system is said to be observable at time \\(t_0\\) if for a state \\(z(t_0)\\), there is a finite time \\(t_1\u0026gt;t_0\\) such that the knowledge of the input \\(u(t)\\) and output \\(y(t)\\) from \\(t_0\\) to \\(t_1\\) are sufficient to determine the state \\(z(t_0)\\).\nCoordinate Coupling Control Coordinate coupling control (CCC) is an energy-basded method.\nThe idea is to transfer the vibrations from a low or undamped oscilatory system (the plant) to a damped system (the controller).\nThis can be implemented passively using tuned mass damper. But the key advantage of this technique is that one can replace the physical absorber with a computer model. The coupling terms can then be selected to maximise the energy transfer.\nRobust control Robust control concentrates on the tradeoffs between performance and stability in the presence of uncertainty in the system model as well as the exogenous inputs to which it is subjected.\nUncertainty can be divided into four types:\n parameter errors error in model order neglected disturbances neglected nonlinearities The \\(\\mathcal{H}_\\infty\\) controller is developed to address uncertainty by systematic means. A general block diagram of the control system is shown figure 1.\nA frequency shaped filter \\(W(s)\\) coupled to selected inputs and outputs of the plant is included. The outputs of this frequency shaped filter define the error ouputs used to evaluate the system performance and generate the cost that will be used in the design process.\n\n Figure 1: Block diagram for robust control\n The generalized plan \\(G\\) can be partitionned according to the input-output variables. And we have that the transfer function matrix from \\(d\\) to \\(z\\) is: \\[ H_{z/d} = G_{z/d} + G_{z/u} K (I - G_{y/u} K)^{-1} G_{y/d} \\] This transfer function matrix contains measures of performance and stability robustness.\nThe objective of \\(\\mathcal{H}_\\infty\\) control is to design an admissible control \\(u(s)=K(s)y(s)\\) such that \\(\\| H_{z/d} \\|_\\infty\\) is minimum.\nOptimal Control The control \\(u(t)\\) is designed to minimize a cost function \\(J\\), given the initial conditions \\(z(t_0)\\) and \\(\\dot{z}(t_0)\\) subject to the constraint that:\n\\begin{align*} \\dot{z} \u0026amp;= Az + Bu\\\\\\\ny \u0026amp;= Cz \\end{align*}\nOne such cost function appropriate to a vibration control is \\[J = 1/2 \\int_{t_0}^{t_f} ( z^T A z + u^T R u ) dt\\] Where \\(Q\\) and \\(R\\) and positive definite symmetric weighting matrices.\nState Observers (Estimators) It is not always possible to determine the entire state variables. There are usualy too many degrees of freedom and only limited measurements.\nThe state vector \\(z(t)\\) can be estimated independently of the control problem, and the resulting estimate \\(\\hat{z}(t)\\) can be used.\nIntelligent Structure and Controller Intelligent structure would have the capability to:\n recognize the present dynamic state of its own structure and evaluate the functional performance of the structure identify functional descriptions of external and internal disturbances detect changes in structural properties and changes in external and internal disturbances predict possible future changes in structural properties make intelligent decisions regarding compensations for disturbances and adequately generale actuation forces learn from past performance to improve future actions Two main methodologies:\n artificial neural networks fuzzy logic Adaptive Control Adaptive control is frequently used to control systems whose parameters are unknown, uncertain, or slowly varying.\nThe design of an adaptive controller involves several steps:\n selection of a controller structure with adjustable parameters selection of an adaptation law for adjusting those parameters selection of a performance index real-time evaluation of the performance with respect to some desired behavior real-time plant identification and model updating real-time adjustment of the controller parameters to bring the performance closer to the desired behavior It essentially consists of a real-time system identification technique integrated with a control algorithm.\nTwo different methods\n Direct method: the controller parameters are adjusted directly based on the error between the measured and desired outputs. Indirect method: the computations are divided into two consecutive phases. First, the plant model is first estimated in real time. Second, the controller parameters are modified based on the most recent updated plant parameters. Active Control Effects on the System \n Figure 2: 1 DoF control of a spring-mass-damping system\n Consider the control system figure 2, the equation of motion of the system is: \\[ m\\ddot{x} + c\\dot{x} + kx = f_a + f \\]\nThe controller force can be expressed as: \\(f_a = -g_a \\ddot{x} + g_v \\dot{x} + g_d x\\). The equation of motion becomes: \\[ (m+g_a)\\ddot{x} + (c+g_v)\\dot{x} + (k+g_d)x = f \\]\nDepending of the type of signal used, the active control adds/substracts mass, damping and stiffness.\nTime Delays One of the limits to the performance of active control is the time delay in controllers and actuators. Time delay introduces phase shift, which deteriorates the controller performance or even causes instability in the system.\nOptimal Placement of Actuators The problem of optimizing the locations of the actuators can be more significant than the control law itself.\nIf the actuator is placed at the wrong location, the system will require a greater force control. In that case, the system is said to have a low degree of controllability.\nBibliography Alkhatib, R., \u0026amp; Golnaraghi, M. F., Active structural vibration control: a review, The Shock and Vibration Digest, 35(5), 367–383 (2003). http://dx.doi.org/10.1177/05831024030355002 ↩\n","permalink":"/paper/alkhatib03_activ_struc_vibrat_contr/","tags":["tag1","tag2"],"title":"Active structural vibration control: a review"},{"categories":null,"contents":"Tags :\nHow to choose the correct actuator for my application? For vibration isolation:\n In (Shingo Ito \u0026amp; Georg Schitter, 2016), the effect of the actuator stiffness on the attainable vibration isolation is studied (Notes) Piezoelectric Suppliers Links Cedrat link PI link Piezo System link Noliac link A model of a multi-layer monolithic piezoelectric stack actuator is described in (Fleming, 2010) (Notes).\nVoice Coil Suppliers Links Geeplus link Maccon link TDS PP link H2tech link PBA Systems link Celera Motion link Beikimco link Electromate link Magnetic Innovations link Shaker Suppliers Links BKSV link Vibration Research link Sentek Dynamics link https://www.bksv.com/en/products/shakers-and-exciters/LDS-shaker-systems/permanent-magnet-shakers/V201\nBrush-less DC Motor (Yedamale, 2003) https://www.electricaltechnology.org/2016/05/bldc-brushless-dc-motor-construction-working-principle.html\nBibliography Ito, S., \u0026amp; Schitter, G., Comparison and classification of high-precision actuators based on stiffness influencing vibration isolation, IEEE/ASME Transactions on Mechatronics, 21(2), 1169–1178 (2016). http://dx.doi.org/10.1109/tmech.2015.2478658 ↩\nFleming, A., Nanopositioning system with force feedback for high-performance tracking and vibration control, IEEE/ASME Transactions on Mechatronics, 15(3), 433–447 (2010). http://dx.doi.org/10.1109/tmech.2009.2028422 ↩\nYedamale, P., Brushless dc (bldc) motor fundamentals, Microchip Technology Inc, 20(), 3–15 (2003). ↩\nBacklinks Comparison and classification of high-precision actuators based on stiffness influencing vibration isolation ","permalink":"/zettels/actuators/","tags":null,"title":"Actuators"},{"categories":null,"contents":" Tags Motion Control Reference (Tom Oomen, 2018) Author(s) Oomen, T. Year 2018 \n Figure 1: Envisaged developments in motion systems. In traditional motion systems, the control bandwidth takes place in the rigid-body region. In the next generation systemes, flexible dynamics are foreseen to occur within the control bandwidth.\n Bibliography Oomen, T., Advanced motion control for precision mechatronics: control, identification, and learning of complex systems, IEEJ Journal of Industry Applications, 7(2), 127–140 (2018). http://dx.doi.org/10.1541/ieejjia.7.127 ↩\n","permalink":"/paper/oomen18_advan_motion_contr_precis_mechat/","tags":null,"title":"Advanced motion control for precision mechatronics: control, identification, and learning of complex systems"},{"categories":null,"contents":" Tags Complementary Filters Reference (Sahaj Saxena \u0026amp; YogeshV Hote, 2012) Author(s) Saxena, S., \u0026amp; Hote, Y. Year 2012 Proposed Filter \\(F(s)\\) \\begin{align*} F(s) \u0026amp;= \\frac{1}{(\\lambda s + 1)^n} \\\\\\\nF(s) \u0026amp;= \\frac{n \\lambda + 1}{(\\lambda s + 1)^n} \\end{align*}\nInternal Model Control Central concept in IMC: control can be acheive only if the control system involves, either implicitly or explicitly, some representation of the process to be controlled.\nBasic IMC structure IMC can be considered as a special case of classical feedback structure with plant \\(G(s)\\) and controller \\(C(s)\\).\nThe plan model \\(G_M(s)\\) is added and substracted into the feedback path of feedback controller.\nThe structure can then be modified and we obtain a new controller \\(Q(s)\\).\nIMC is related to the classical controller through:\n\\begin{align*} Q(s) = \\frac{C(s)}{1+G_M(s)C(s)} \\\\\\\nC(s) = \\frac{Q(s)}{1-G_M(s)Q(s)} \\end{align*}\nInternal model control system is characterized by a control device consisting of the controller \\(Q(s)\\) and a predictive model \\(G_M(s)\\) of the process (internal model). The internal model loop uses the difference between the outputs of the process \\(G(s)\\) to be controlled and the internal model. This difference \\(E(s)\\) represents the effect of disturbance and mismatch of the model.\nFeatures of IMC Structure Three properties:\n Dual stability: assume that, if the plant model is perfect (\\(G_M(s) = G(s)\\)) and disturbance is absent, the system becomes open-loop and the closed-loop stability is characterized by the stability of \\(G(s)\\) and \\(Q(s)\\) Perfect control: assume that, if the controller is equal to the model inverse (\\(Q(s) = G_M^{-1}\\)) and \\(G(s) = G_M(s)\\) with \\(G(s)\\) stable, then the system is perfectly controlled. Zero Offset: assume that, if the steady state gain of the controller is equal to the inverse of model gain, then offset free control is obtained for constant step of ramp type inputs and disturbances. As expected, the equivalent classical controller leads to integral action. Issues:\n the plant model is never perfect inverting the model can cause instability control signal may have large magnitude Design procedure for IMC Compensator factorize the plant model as \\(G_M(s) = G_{M-}(s)G_{M+}(s)\\) where \\(G_{M-}(s)\\) is invertible and minimum phase and \\(G_{M+}(s)\\) is non-invertible and contains all non-minimum phase elements (delays, RHP zeros). Then, the controller is the inverse of the invertible portion of the plant model: \\(Q_1(s) = G_{M-}^{-1}(s)\\). Filter selection: to make the controller proper and robust against the plant-model mismatch, a low pass filter of the form \\(F(s) = \\frac{n \\lambda}{(\\lambda s + 1)^n}\\) is augmented with the inverted model \\(Q_1(s)\\): \\(Q(s) = Q_1(s) F(s)\\). \\(\\lambda\\) is a tuning parameter which has an inverse relationship with the speed of closed loop response, \\(n\\) is selected such that \\(Q(s)\\) becomes proper. Issues in IMC Filter selection and tuning guidelines Some advantages and future prospects Conclusion The interesting feature regarding IMC is that the design scheme is identical to the open-loop control design procedure and the implementation of IMC results in a feedback system, thereby copying the disturbances and parameter uncertainties, while open-loop control is not.\nBibliography Saxena, S., \u0026amp; Hote, Y., Advances in internal model control technique: a review and future prospects, IETE Technical Review, 29(6), 461 (2012). http://dx.doi.org/10.4103/0256-4602.105001 ↩\n","permalink":"/paper/saxena12_advan_inter_model_contr_techn/","tags":null,"title":"Advances in internal model control technique: a review and future prospects"},{"categories":null,"contents":" Tags Vibration Isolation Reference @phdthesis{poel10_explor_activ_hard_mount_vibrat, author = {van der Poel, Gerrit Wijnand}, doi = {10.3990/1.9789036530163}, isbn = {978-90-365-3016-3}, school = {University of Twente}, title = {An Exploration of Active Hard Mount Vibration Isolation for Precision Equipment}, url = {https://doi.org/10.3990/1.9789036530163}, year = 2010, year = 2010, tags = {parallel robot}, } Author(s) van der Poel, G. W. Year 2010 Bibliography van der Poel, G. W., An exploration of active hard mount vibration isolation for precision equipment (Doctoral dissertation) (2010). University of Twente, . ↩\n","permalink":"/paper/poel10_explor_activ_hard_mount_vibrat/","tags":null,"title":"An exploration of active hard mount vibration isolation for precision equipment"},{"categories":null,"contents":" Tags Nano Active Stabilization System, Positioning Stations Reference (Holler {\\it et al.}, 2012) Author(s) Holler, M., Raabe, J., Diaz, A., Guizar-Sicairos, M., Quitmann, C., Menzel, A., \u0026amp; Bunk, O. Year 2012 Instrument similar to the NASS. Obtain position stability of 10nm (standard deviation).\n\n Figure 1: Schematic of the tomography setup\n Limited resolution due to instrumentation: The resolution of ptychographic tomography remains above 100nm due to instabilities and drifts of the scanning systems.\n Need of a Metrology System:\n To achieve positioning accuracy and stability in the nanometer range, one cannot rely on the position encoders built into individual positioning stages. A precise exteroceptive measurement of the relative position of the optical elements with respect to the sample is mandatory. Thus, thermal drifts and parasitic motions can be measured and compensated for.\n Interferometer System Concept: The sample is aligned with the X-ray with the XYZ piezo stage. As a result, the metrology sphere will be usually off center with respect to the rotation axis of the spindle. That implies that the laser will not propagate back to the interferometer at all rotation angles. A position sensitive detector (PSD) is used, it provides a measurement of the position of the sphere in the plane perpendicular to the laser. The interferometer is positionned on top of a translation stage. The PSD information is used to close the loop so that the interferometer follows the displacement of the metrology sphere.\n Feedback Loop: Using the signals from the 2 interferometers, the loop is closed to compensate low frequency vibrations and thermal drifts.\n Bibliography Holler, M., Raabe, J., Diaz, A., Guizar-Sicairos, M., Quitmann, C., Menzel, A., \u0026amp; Bunk, O., An instrument for 3d x-ray nano-imaging, Review of Scientific Instruments, 83(7), 073703 (2012). http://dx.doi.org/10.1063/1.4737624 ↩\n","permalink":"/paper/holler12_instr_x_ray_nano_imagin/","tags":null,"title":"An instrument for 3d x-ray nano-imaging"},{"categories":null,"contents":" Tags Stewart Platforms, Vibration Isolation Reference (Jason Geng {\\it et al.}, 1995) Author(s) Geng, Z. J., Pan, G. G., Haynes, L. S., Wada, B. K., \u0026amp; Garba, J. A. Year 1995 \n Figure 1: Local force feedback and adaptive acceleration feedback for active isolation\n Bibliography Geng, Z. J., Pan, G. G., Haynes, L. S., Wada, B. K., \u0026amp; Garba, J. A., An intelligent control system for multiple degree-of-freedom vibration isolation, Journal of Intelligent Material Systems and Structures, 6(6), 787–800 (1995). http://dx.doi.org/10.1177/1045389x9500600607 ↩\n","permalink":"/paper/geng95_intel_contr_system_multip_degree/","tags":null,"title":"An intelligent control system for multiple degree-of-freedom vibration isolation"},{"categories":null,"contents":" Tags Nano Active Stabilization System Reference (Jun Wang {\\it et al.}, 2012) Author(s) Wang, J., Chen, Y. K., Yuan, Q., Tkachuk, A., Erdonmez, C., Hornberger, B., \u0026amp; Feser, M. Year 2012 Introduction of Markers: That limits the type of samples that is studied\nThere is a need for markerless nano-tomography =\u0026gt; the key requirement is the precision and stability of the positioning stages.\nPassive rotational run-out error system: It uses calibrated metrology disc and capacitive sensors\nBibliography Wang, J., Chen, Y. K., Yuan, Q., Tkachuk, A., Erdonmez, C., Hornberger, B., \u0026amp; Feser, M., Automated markerless full field hard x-ray microscopic tomography at sub-50 nm 3-dimension spatial resolution, Applied Physics Letters, 100(14), 143107 (2012). http://dx.doi.org/10.1063/1.3701579 ↩\n","permalink":"/paper/wang12_autom_marker_full_field_hard/","tags":null,"title":"Automated markerless full field hard x-ray microscopic tomography at sub-50 nm 3-dimension spatial resolution"},{"categories":null,"contents":" Tags Precision Engineering Reference (Richard Leach \u0026amp; Stuart Smith, 2018) Author(s) Leach, R., \u0026amp; Smith, S. T. Year 2018 Bibliography Leach, R., \u0026amp; Smith, S. T., Basics of precision engineering - 1st edition (2018), : CRC Press. ↩\n","permalink":"/book/leach18_basic_precis_engin_edition/","tags":null,"title":"Basics of precision engineering - 1st edition"},{"categories":null,"contents":" Tags Vibration Isolation, Actuators Reference (Shingo Ito \u0026amp; Georg Schitter, 2016) Author(s) Ito, S., \u0026amp; Schitter, G. Year 2016 Classification of high-precision actuators Table 1: Zero/Low and High stiffness actuators Categories Pros Cons Zero stiffness No vibration transmission Large and Heavy Low stiffness High vibration isolation Typically for low load High Stiffness High control bandwidth High vibration transmission Time Delay of Piezoelectric Electronics In this paper, the piezoelectric actuator/electronics adds a time delay which is much higher than the time delay added by the voice coil/electronics.\nDefinition of low-stiffness and high-stiffness actuator Low Stiffness actuator is defined as the ones where the transmissibility stays below 0dB at all frequency High Stiffness actuator is defined as the ones where the transmissibility goes above 0dB at some frequency \n Figure 1: Definition of low-stiffness and high-stiffness actuator\n Low-Stiffness / High-Stiffness characteristics The low stiffness actuators achieve smooth transition from active isolation to passive isolation. The high stiffness actuators can have a gap between the passive and active isolation vibration where the vibrations are amplified in a certain frequency band. Controller Design \n Figure 2: Obtained transmissibility\n Discussion The stiffness requirement for low-stiffness actuators can be rephrased in the frequency domain as: \u0026ldquo;the cross-over frequency of the sensitivity function of the feedback system must be larger than \\(\\sqrt{2} \\omega_r\\) with \\(\\omega_r\\) is the resonant frequency of the uncontrolled system\u0026rdquo;.\nIn practice, this is difficult to achieve with piezoelectric actuators as their first resonant frequency \\(\\omega_r\\) is too close to other resonant frequencies to ensure close-loop stability. In contrast, the frequency band between the first and the other resonances of Lorentz actuators can be broad by design making them more suitable to construct a low-stiffness actuators.\nBibliography Ito, S., \u0026amp; Schitter, G., Comparison and classification of high-precision actuators based on stiffness influencing vibration isolation, IEEE/ASME Transactions on Mechatronics, 21(2), 1169–1178 (2016). http://dx.doi.org/10.1109/tmech.2015.2478658 ↩\nBacklinks Actuators ","permalink":"/paper/ito16_compar_class_high_precis_actuat/","tags":null,"title":"Comparison and classification of high-precision actuators based on stiffness influencing vibration isolation"},{"categories":null,"contents":"Tags :\n\u0026lt;./biblio/references.bib\u0026gt;\nBacklinks Advances in internal model control technique: a review and future prospects ","permalink":"/zettels/complementary_filters/","tags":null,"title":"Complementary Filters"},{"categories":null,"contents":"Tags :\nhttps://www.youtube.com/playlist?list=PLMrJAkhIeNNR20Mz-VpzgfQs5zrYi085m\nOverview Linear Systems Stability and Eigenvalues Linearizing Around a Fixed Point Controllability Controllability, Reachability, and Eigenvalue Placement Controllability and the Discrete-Time Impulse Response Degrees of Controllability and Gramians Controllability and the PBH Test Cayley-Hamilton Theorem Reachability and Controllability with Cayley-Hamilton Inverted Pendulum on a Cart Eigenvalue Placement for the Inverted Pendulum on a Cart Linear Quadratic Regulator (LQR) Control for the Inverted Pendulum on a Cart Motivation for Full-State Estimation Observability Full-State Estimation Kalman Filter Observability Example in Matlab Observability Example in Matlab (Part 2) Kalman Filter Example in Matlab Linear Quadratic Gaussian (LQG) LQG Example in Matlab Introduction to Robust Control Three Equivalent Representations of Linear Systems Example Frequency Response (Bode Plot) for Spring-Mass-Damper Laplace Transforms and the Transfer Function Benefits of Feedback on Cruise Control Example Benefits of Feedback on Cruise Control Example (Part 2) Cruise Control Example with Proportional-Integral (PI) control Sensitivity and Complementary Sensitivity Sensitivity and Complementary Sensitivity (Part 2) Loop shaping Loop Shaping Example for Cruise Control Sensitivity and Robustness Limitations on Robustness Cautionary Tale About Inverting the Plant Dynamics Control systems with non-minimum phase dynamics \u0026lt;./biblio/references.bib\u0026gt;\n","permalink":"/websites/control_bootcamp/","tags":null,"title":"Control Bootcamp"},{"categories":null,"contents":" Tags HAC-HAC Reference (Bryson, 1993) Author(s) Bryson, A. E. Year 1993 9.2.3 Roll-Off Filters Synthesizing control logic using only one vibration mode means we are consciously neglecting the higher-order vibration modes. When doing this, it is a good idea to insert \u0026ldquo;roll-off\u0026rdquo; into the control logic, so that the loop-transfer gain decreases rapidly with frequency beyond the control bandwidth. This reduces the possibility of destabilizing the unmodelled higher frequency dynamics (\u0026quot;spillover\u0026quot;).\n 9.5 Robust Compensator Synthesis LQG synthesis using feedback of estimated states will produce almost the same good response as LQR [\u0026hellip;] for systems with control system bandwidths that are well below the frequency of the first vibration mode. However, it may not be true for systems with higher control system bandwidths, even when one or more vibration modes are included in the control design model.\n If a rate sensor is co-located with an actuator on a flexible body, and its signal is fed back to the actuator, all vibration modes are stabilized. If a rate sensor is not co-located with an actuator on a flexible body, ans its signal is fed back to the actuator, some vibration modes are stabilized and others are destabilized, depending on the location of the sensor relative to the actuator.\n 9.5.2 Low-Authority Control/High-Authority Control Figure fig:bryson93_hac_lac shows the concept of Low-Authority Control/High-Authority Control (LAC/HAC) is the s-plane. LAC uses a co-located rate sensor to add damping to all the vibratory modes (but not the rigid-body mode). HAC uses a separated displacement sensor to stabilize the rigid body mode, which slightly decreases the damping of the vibratory modes but not enough to produce instability (called \u0026ldquo;spillover\u0026rdquo;)\n \n Figure 1: HAC-LAC control concept\n LAC/HAC is usually insensitive to small deviation of the plant dynamics away from the design values, that is, it is robust to plant parameter changes.\n Bibliography Bryson, A. E., Control of spacecraft and aircraft (1993), : Princeton university press Princeton, New Jersey. ↩\n","permalink":"/paper/bryson93_contr_spacec_aircr/","tags":null,"title":"Control of spacecraft and aircraft"},{"categories":null,"contents":"Tags :\n\u0026lt;./biblio/references.bib\u0026gt;\nBacklinks Sensors and control of a space-based six-axis vibration isolation system Dynamic modeling and decoupled control of a flexible stewart platform for vibration isolation Simultaneous, fault-tolerant vibration isolation and pointing control of flexure jointed hexapods ","permalink":"/zettels/cubic_architecture/","tags":null,"title":"Cubic Architecture"},{"categories":null,"contents":"Tags :\nData-Driven Control Overview Challenges With modern control (LQR, LQG, H-Infinity), we work with linear system (or linearized systems) and we develop a control law that minimize some cost function.\nChallenging systems where modern control is not efficient:\n Non-linear systems System with unknown dynamics High dimensional systems Limited measurements or control inputs For these kinds of systems, data-driven control seems to be a good alternative.\nWhat is control? It\u0026rsquo;s an optimization constrained by dynamics of the system.\nThe optimization is easy when the system is linear and the cost function is quadratic. When the system is non-linear or when the cost function is non quadratic, the optimization becomes complicated (non closed form). Then the optimization should be rerun on the fly, which is what is done with MPC (model predictive control).\nWhat is Machine-Learning? Machine-learning is powerful non-linear optimization based on data.\nOutline of this lecture Data Driven Models For the problem of unknown dynamics, we can use data driven models. The goal is to collect data to generate of model of the system.\nMachine Learning Control When we use the control inputs, the system changes and the system model might be not valid anymore. The idea is to use data driven machine learning directly to learn a good controller.\nSensor and actuator placement Use powerful optimization techniques from machine learning to learn what are good sensors and actuators.\nLinear System Identification The Goal of Balanced Model Reduction Change of Variables in Control Systems Change of Variables in Control Systems (Correction) Balancing Example Balancing Transformation Balanced Truncation Balanced Truncation Example Error Bounds for Balanced Truncation Balanced Proper Orthogonal Decomposition BPOD and Output Projection Balanced Truncation and BPOD Example Eigensystem Realization Algorithm ERA and the Discrete-Time Impulse Response Eigensystem Realization Algorithm Procedure Balanced Models with ERA Observer Kalman Filter Identification ERA_OKID Example in Matlab System Identification Full-State Models with Control Regression Models Dynamic Mode Decomposition with Control DMD Control Example Koopman with Control Sparse Nonlinear Models with Control Model Predictive Control Sparse Identification of Nonlinear Dynamics for Model Predictive Control Machine Learning Control Overview Genetic Algorithms Tuning a PID Controller with Genetic Algorithms Tuning a PID Controller with Genetic Algorithms (Part 2) Genetic Programming Genetic Programming Control Extremum Seeking Control Introduction Matlab Simulink Challenging Example Applications \u0026lt;./biblio/references.bib\u0026gt;\n","permalink":"/websites/data_driven_dynamical_systems_with_machine_learning/","tags":null,"title":"Data-Driven Dynamical Systems with Machine Learning"},{"categories":null,"contents":" Tags Stewart Platforms Reference (Jie Tang {\\it et al.}, 2018) Author(s) Tang, J., Cao, D., \u0026amp; Yu, T. Year 2018 Bibliography Tang, J., Cao, D., \u0026amp; Yu, T., Decentralized vibration control of a voice coil motor-based stewart parallel mechanism: simulation and experiments, Proceedings of the Institution of Mechanical Engineers, Part C: Journal of Mechanical Engineering Science, 233(1), 132–145 (2018). http://dx.doi.org/10.1177/0954406218756941 ↩\n","permalink":"/paper/tang18_decen_vibrat_contr_voice_coil/","tags":null,"title":"Decentralized vibration control of a voice coil motor-based stewart parallel mechanism: simulation and experiments"},{"categories":null,"contents":" Tags Precision Engineering Reference (Schellekens {\\it et al.}, 1998) Author(s) Schellekens, P., Rosielle, N., Vermeulen, H., Vermeulen, M., Wetzels, S., \u0026amp; Pril, W. Year 1998 Bibliography Schellekens, P., Rosielle, N., Vermeulen, H., Vermeulen, M., Wetzels, S., \u0026amp; Pril, W., Design for precision: current status and trends, Cirp Annals, (2), 557–586 (1998). http://dx.doi.org/10.1016/s0007-8506(07)63243-0 ↩\n","permalink":"/paper/schellekens98_desig_precis/","tags":null,"title":"Design for precision: current status and trends"},{"categories":null,"contents":"Tags :\n Reference (Andrew Fleming \u0026amp; Kam Leang, 2014) Author(s) Fleming, A. J., \u0026amp; Leang, K. K. Year 2014 Bibliography Fleming, A. J., \u0026amp; Leang, K. K., Design, modeling and control of nanopositioning systems (2014), : Springer International Publishing. ↩\n","permalink":"/book/fleming14_desig_model_contr_nanop_system/","tags":null,"title":"Design, modeling and control of nanopositioning systems"},{"categories":null,"contents":" Tags Stewart Platforms, Vibration Isolation, Flexible Joints, Cubic Architecture Reference (Yang {\\it et al.}, 2019) Author(s) Yang, X., Wu, H., Chen, B., Kang, S., \u0026amp; Cheng, S. Year 2019 Discusses:\n flexible-rigid model of Stewart platform the impact of joint stiffness is compensated using a displacement sensor and a force sensor then the MIMO system is decoupled in modal space and 6 SISO controllers are applied for vibration isolation using force sensors The joint stiffness impose a limitation on the control performance using force sensors as it adds a zero at low frequency in the dynamics. Thus, this stiffness is taken into account in the dynamics and compensated for.\nStewart platform (Figure 1):\n piezoelectric actuators flexible joints (Figure 2) force sensors (used for vibration isolation) displacement sensors (used to decouple the dynamics) cubic (even though not said explicitly) \n Figure 1: Stewart Platform\n \n Figure 2: Flexible Joints\n The stiffness of the flexible joints (Figure 2) are computed with an FEM model and shown in Table 1.\n\nTable 1: Stiffness of flexible joints obtained by FEM \\(k_{\\theta u},\\ k_{\\psi u}\\) \\(72 Nm/rad\\) \\(k_{\\theta s}\\) \\(51 Nm/rad\\) \\(k_{\\psi s}\\) \\(62 Nm/rad\\) \\(k_{\\gamma s}\\) \\(64 Nm/rad\\) Dynamics: If the bending and torsional stiffness of the flexible joints are neglected: \\[ M \\ddot{x} + C \\dot{x} + K x = J^T f \\]\n \\(M\\) is the mass matrix \\(C\\) is the damping matrix \\(K\\) is the stiffness matrix \\(x\\) is the generalized coordinates, representing the displacement and orientation of the payload plate \\(f\\) is the actuator forces \\(J\\) is the Jacobian matrix In this paper, the parasitic bending stiffness of the flexible joints are considered: \\[ M \\ddot{x} + C \\dot{x} + (K + K_e) x = J^T f \\] where \\(K_e\\) is the stiffness matrix induced by the parasitic stiffness of the flexible joints.\nAnalytical expression for \\(K_e\\) are derived in the paper.\nController Design: There is a strong coupling between the input forces and the state variables in the task space. The traditional modal decoupled control strategy cannot work with the flexible Stewart platform because it is impossible to achieve simultaneous diagonalization of the mass, damped and stiffness matrices.\nTo make the six-dof system decoupled into six single-dof isolators, a controller based on the leg\u0026rsquo;s force and position feedback is designed.\n The idea is to synthesize the control force that can compensate the parasitic bending and torsional torques of the flexible joints and simultaneously achieve diagonalization of the matrices \\(M\\), \\(C\\) and \\(K\\)\n The force measured by the force sensors are: \\[ y = f - k J x - c J \\dot{x} \\] The displacements measured by the position sensors are: \\[ z = [\\Delta l_1\\ \\dots\\ \\Delta l_6]^T \\]\nLet\u0026rsquo;s apply the feedback control based on both the force sensor and the position sensor: \\[ f = -H(s) y + (1 + H(s)) K_{el} z \\] where \\(K_{el} = J^{-T} K_e J^T\\) is the stiffness matrix of the flexible joints expressed in joint space.\nWe thus obtain: \\[ f = \\frac{H(s)}{1 + H(s)} (k J x + c J \\dot{x}) + J^{-T} K_e x \\]\nIf we substitute \\(f\\) in the dynamic equation, we obtain that the parasitic stiffness effect of the flexible joints has been compensated by the actuation forces and the system can now be decoupled in modal space \\(x = \\Phi u\\). \\(\\Phi\\) is the modal matrix selected such that \\(\\Phi^T M \\Phi = I_6\\) and \\(k \\Phi^T J^T J \\Phi = \\text{diag}(\\omega_1^2\\ \\dots\\ \\omega_6^2)\\): \\[ s^2 + \\frac{1}{1 + H(s)} \\frac{c \\omega_i^2}{k} s + \\frac{1}{1 + H(s)} \\omega_i^2 = 0, \\quad i = 1,\\ \\dots,\\ 6 \\]\nThe six-dof system is now transformed into a six one-dof system where \\(H(s)\\) can be designed for control purpose.\nIn order to apply this control strategy:\n A force sensor and displacement sensor are need in each strut The joint stiffness has to be known The jacobian has to be computed No information about modal matrix is needed The block diagram of the control strategy is represented in Figure 3.\n\n Figure 3: Control Architecture used\n \\(H(s)\\) is designed as a proportional plus integral compensator: \\[ H(s) = k_p + k_i/s \\]\nSubstituting \\(H(s)\\) in the equation of motion gives that:\n an increase of \\(k_i\\) increase the damping and thus suppress the resonance peaks an increase of \\(k_p\\) lowers the resonance frequency and thus the bandwidth of vibration isolation is examped Experimental Validation: An external Shaker is used to excite the base and accelerometers are located on the base and mobile platforms to measure their motion. The results are shown in Figure 4. In theory, the vibration performance can be improved, however in practice, increasing the gain causes saturation of the piezoelectric actuators and then the instability occurs.\n\n Figure 4: Frequency response of the acceleration ratio between the paylaod and excitation (Transmissibility)\n A model-based controller is then designed based on the leg’s force and position feedback. The position feedback compensates the effect of parasitic bending and torsional stiffness of the flexible joints. The force feedback makes the six-DOF MIMO system decoupled into six SISO subsystems in modal space, where the control gains can be designed and analyzed more effectively and conveniently. The proportional and integral gains in the sub-controller are used to separately regulate the vibration isolation bandwidth and active damping simultaneously for the six vibration modes.\n Bibliography Yang, X., Wu, H., Chen, B., Kang, S., \u0026amp; Cheng, S., Dynamic modeling and decoupled control of a flexible stewart platform for vibration isolation, Journal of Sound and Vibration, 439(), 398–412 (2019). http://dx.doi.org/10.1016/j.jsv.2018.10.007 ↩\n","permalink":"/paper/yang19_dynam_model_decoup_contr_flexib/","tags":null,"title":"Dynamic modeling and decoupled control of a flexible stewart platform for vibration isolation"},{"categories":null,"contents":" Tags Stewart Platforms, Flexible Joints Reference (Jian Jiao {\\it et al.}, 2018) Author(s) Jiao, J., Wu, Y., Yu, K., \u0026amp; Zhao, R. Year 2018 Bibliography Jiao, J., Wu, Y., Yu, K., \u0026amp; Zhao, R., Dynamic modeling and experimental analyses of stewart platform with flexible hinges, Journal of Vibration and Control, 25(1), 151–171 (2018). http://dx.doi.org/10.1177/1077546318772474 ↩\n","permalink":"/paper/jiao18_dynam_model_exper_analy_stewar/","tags":null,"title":"Dynamic modeling and experimental analyses of stewart platform with flexible hinges"},{"categories":null,"contents":"Tags :\n\u0026lt;./biblio/references.bib\u0026gt;\nBacklinks The art of electronics - third edition ","permalink":"/zettels/electronics/","tags":null,"title":"Electronics"},{"categories":null,"contents":"Tags :\n Reference (Andrew Fleming, 2012) Author(s) Fleming, A. J. Year 2012 Bibliography Fleming, A. J., Estimating the resolution of nanopositioning systems from frequency domain data, In , 2012 IEEE International Conference on Robotics and Automation (pp. ) (2012). : . ↩\n","permalink":"/paper/fleming12_estim/","tags":null,"title":"Estimating the resolution of nanopositioning systems from frequency domain data"},{"categories":null,"contents":"Tags :\n\u0026lt;./biblio/references.bib\u0026gt;\nBacklinks A six-axis single-stage active vibration isolator based on stewart platform Nanometre-cutting machine using a stewart-platform parallel mechanism Dynamic modeling and experimental analyses of stewart platform with flexible hinges Dynamic modeling and decoupled control of a flexible stewart platform for vibration isolation Simultaneous, fault-tolerant vibration isolation and pointing control of flexure jointed hexapods Investigation on active vibration isolation of a stewart platform with piezoelectric actuators Identification and decoupling control of flexure jointed hexapods ","permalink":"/zettels/flexible_joints/","tags":null,"title":"Flexible Joints"},{"categories":null,"contents":" Tags Vibration Isolation Reference (Preumont {\\it et al.}, 2002) Author(s) Preumont, A., A. Francois, Bossens, F., \u0026amp; Abu-Hanieh, A. Year 2002 Summary:\n Compares the force feedback and acceleration feedback for active damping The use of a force sensor always give alternating poles and zeros in the open-loop transfer function between for force actuator and the force sensor which guarantees the stability of the closed loop Acceleration feedback produces alternating poles and zeros only when the flexible structure is stiff compared to the isolation system The force applied to a rigid body is proportional to its acceleration, thus sensing the total interface force gives a measured of the absolute acceleration of the solid body. Thus force feedback and acceleration feedback are equivalent for solid bodies. When there is a flexible payload, the two sensing options are not longer equivalent.\n For light payload (Figure 1), the acceleration feedback gives larger damping on the higher mode. For heavy payload (Figure 2), the acceleration feedback do not give alternating poles and zeros and thus for high control gains, the system becomes unstable \n Figure 1: Root locus for light flexible payload, (a) Force feedback, (b) acceleration feedback\n \n Figure 2: Root locus for heavy flexible payload, (a) Force feedback, (b) acceleration feedback\n Guaranteed stability of the force feedback:\n If two arbitrary flexible, undamped structures are connected with a single-axis soft isolator with force feedback, the poles and zeros of the open-loop transfer function from the force actuator to the force sensor alternate on the imaginary axis.\n The same is true for the transfer function from the force actuator to the relative displacement of the actuator.\n According to physical interpretation of the zeros, they represent the resonances of the subsystem constrained by the sensor and the actuator.\n Bibliography Preumont, A., A. Fran\\ccois, Bossens, F., \u0026amp; Abu-Hanieh, A., Force feedback versus acceleration feedback in active vibration isolation, Journal of Sound and Vibration, 257(4), 605–613 (2002). http://dx.doi.org/10.1006/jsvi.2002.5047 ↩\n","permalink":"/paper/preumont02_force_feedb_versus_accel_feedb/","tags":null,"title":"Force feedback versus acceleration feedback in active vibration isolation"},{"categories":null,"contents":"Tags :\nSuppliers PCB link Dynamics and Noise of a piezoelectric force sensor An analysis the dynamics and noise of a piezoelectric force sensor is done in (Fleming, 2010) (Notes).\nBibliography Fleming, A., Nanopositioning system with force feedback for high-performance tracking and vibration control, IEEE/ASME Transactions on Mechatronics, 15(3), 433–447 (2010). http://dx.doi.org/10.1109/tmech.2009.2028422 ↩\n","permalink":"/zettels/force_sensors/","tags":null,"title":"Force Sensors"},{"categories":null,"contents":" Tags Metrology Reference (Richard Leach, 2014) Author(s) Leach, R. Year 2014 Measurement of angles Unit:\n radian for plane angle steradian for solid angle \\(1 rad \\approx 55.3deg\\)\nInstrument principles:\n subdivision: index tacle, angular gratings, polygons, \u0026hellip; ratio of two lengths: angular interferometers, sin cars, small angle generators, \u0026hellip; autocollimators with a flat mirror Sources of error in displacement interferometry Two error sources:\n error sources that are proportional to the displacement being measured \\(L\\): cumulative errors error sources that are independent of the displacement being measured: non-cumulative errors Thermal expansion of the metrology frame Deadpath length Deadpath length, \\(d\\), is defined as the difference in distance in air between the reference and measurement reflectors and the beam splitter when the interferometer measurement is initiated. Deadpath error occurs when there is a non-zero deadpath and environmental conditions change during a measurement.\nCosine error \\(\\Delta l = l(1-\\cos(\\theta))\\)\nFor small angles: \\(\\Delta l = \\frac{l \\theta^2}{2}\\)\nThe cosine error is then a second-order effect, contrary to the Abbe error which is a first order effect. The second order nature means that cosine error quickly diminish as the alignment is improved.\nLatest advances in displacement interferometry Commercial interferometers =\u0026gt; fused silica optics housed in Invar mounts =\u0026gt; all the optical components are mounted to one central optic to reduce the susceptibility to thermal variations\nOne advantage that homodyme systems have over heterodyne systems is their ability to readily have the source fibre delivered to the interferometer.\nSpatially separated interferometers It uses heterodyne interferometer and one quadrant photodiode. By knowing the beam size and detector geometry, the measurement target\u0026rsquo;s angle change can be determined by differencing matched pairs of measured phase from the quadrant photodiode while the displacement is determined from the average phase over the four quadrants.\nAngular interferometers Determination of an angle by the ratio of two lengths. The angular optics is used to create two parallel beam paths between the angular interferometer and the angular reflector.\nThe beam that illuminates the angular optics contains two frequencies, \\(f1\\) and \\(f2\\). A polarising beam splitter in the angular interferometer splits the frequencies that travel along separate paths.\nThe measurement of angles is then relative.\nThis type of angular interferometer is used to measure small angles (less than \\(10deg\\)).\nBibliography Leach, R., Fundamental principles of engineering nanometrology (2014), : Elsevier. ↩\n","permalink":"/book/leach14_fundam_princ_engin_nanom/","tags":null,"title":"Fundamental principles of engineering nanometrology"},{"categories":null,"contents":" Tags H Infinity Control Reference (Bibel \u0026amp; Malyevac, 1992) Author(s) Bibel, J. E., \u0026amp; Malyevac, D. S. Year 1992 Properties of feedback control \n Figure 1: Control System Diagram\n From the figure 1, we have:\n\\begin{align*} y(s) \u0026amp;= T(s) r(s) + S(s) d(s) - T(s) n(s)\\\\\\\ne(s) \u0026amp;= S(s) r(s) - S(s) d(s) - S(s) n(s)\\\\\\\nu(s) \u0026amp;= S(s)K(s) r(s) - S(s)K(s) d(s) - S(s)K(s) n(s) \\end{align*}\nWith the following definitions\n \\(L(s) = G(s)K(s)\\) is the loop transfer matrix \\(S(s) = [I+G(s)K(s)]^{-1}\\) is the Sensitivity function matrix \\(T(s) = [I+G(s)K(s)]^{-1}G(s)K(s)\\) is the Transmissibility function matrix \\[ S(s) + T(s) = 1 \\]\n Command following: \\(S=0\\) and \\(T=1\\) =\u0026gt; large gains Disturbance rejection: \\(S=0\\) =\u0026gt; large gains Sensor noise attenuation: \\(T\\) small where the noise is concentrated Control Sensitivity minimization: \\(K S\\) small Robustness to modeling errors: \\(T\\) small in the frequency range of the expected model undertainties SISO tradeoff We want \\(S\\) small for command following and disturbance rejection. We want \\(T\\) small to remain insensitive to sensor noise and modeling errors and to reduce control sensitivity.\nHowever we cannot keep both \\(S\\) and \\(T\\) small as \\(S(s)+T(s)=1\\).\nWe must determine some tradeoff between the sensitivity and the complementary sensitivity functions.\nUsually, reference signals and disturbances occur at low frequencies, while noise and modeling errors are concentrated at high frequencies. The tradeoff, in a SISO sense, is to make \\(|S(j\\omega)|\\) small as low frequencies and \\(|T(j\\omega)|\\) small at high frequencies.\n\\(H_\\infty\\) and weighting functions \\(\\mathcal{H}_\\infty\\) control is a design technique with a state-space computation solution that utilizes frequency-dependent weighting functions to tune the controller\u0026rsquo;s performance and robustness characteristics.\n \n Figure 2: \\(\\mathcal{H}_\\infty\\) control framework\n New design framework (figure 2): \\(P(s)\\) is the generalized plant transfer function matrix:\n \\(w\\): exogenous inputs \\(z\\): regulated performance output \\(u\\): control inputs \\(y\\): measured output variables The plant \\(P\\) has two inputs and two outputs, it can be decomposed into four sub-transfer function matrices: \\[P = \\begin{bmatrix}P_{11} \u0026amp; P_{12} \\ P_{21} \u0026amp; P_{22} \\end{bmatrix}\\]\nLower Linear Fractional Transformation The transformation from the input \\(w\\) to the output \\(z\\), \\(T_{zw}\\) is called the Lower Linear Fractional Transformation \\(F_l (P, K)\\).\n \\[T_{zw} = F_l (P, K) = P_{11} + P_{12}K (I-P_{22})^{-1} P_{21}\\]\n The \\(H_\\infty\\) control problem is to find a controller that minimizes \\(\\| T_{zw} \\|_\\infty\\) over the space of all realizable controllers \\(K(s)\\) that stabilize the closed-loop system.\nWeights for inputs/outputs signals Since \\(S\\) and \\(T\\) cannot be minimized together at all frequency, weights are introduced to shape the solutions. Not only can \\(S\\) and \\(T\\) be weighted, but other regulated performance variables and inputs (figure 3).\n\n Figure 3: Input and Output weights in \\(\\mathcal{H}_\\infty\\) framework\n The weights on the input and output variables are selected to reflect the spatial and frequency dependence of the respective signals and performance specifications.\nThese inputs and output weighting functions are defined as rational, stable and minimum-phase transfer function (no poles or zero in the right half plane).\nGeneral Guidelines for Weight Selection: \\(W_S\\) \\(W_S\\) is selected to reflect the desired performance characteristics. The sensitivity function \\(S\\) should have low gain at low frequency for good tracking performance and high gain at high frequencies to limit overshoot. We have to select \\(W_S\\) such that \\({W_S}^-1\\) reflects the desired shape of \\(S\\).\n Low frequency gain: set to the inverse of the desired steady state tracking error High frequency gain: set to limit overshoot (\\(0.1\\) to \\(0.5\\) is a good compromise between overshoot and response speed) Crossover frequency: chosen to limit the maximum closed-loop time constant (\\(\\omega_c \\approx 1/\\tau\\)) General Guidelines for Weight Selection: \\(W_T\\) We want \\(T\\) near unity for good tracking of reference and near zero for noise suppresion.\n A high pass weight is usualy used on \\(T\\) because the noise energy is mostly concentrated at high frequencies. It should have the following characteristics:\n The crossover frequency is chosen to limit the closed-loop bandwidth The high frequency gain is set high to proide sensor noise rejection and high frequency gain attenuation When using both \\(W_S\\) and \\(W_T\\), it is important to make sure that the magnitude of theise weights at the crossover frequency is less that one to not violate \\(S+T=1\\).\nUnmodeled dynamics weighting function Another method of limiting the controller bandwidth and providing high frequency gain attenuation is to use a high pass weight on an unmodeled dynamics uncertainty block that may be added from the plant input to the plant output (figure 4).\n\n Figure 4: Unmodeled dynamics model\n The weight is chosen to cover the expected worst case magnitude of the unmodeled dynamics. A typical unmodeled dynamics weighting function is shown figure 5.\n\n Figure 5: Example of unmodeled dynamics weight\n Inputs and Output weighting function It is possible to weight the control input and actuator rate. This is used to prevent actuator saturation and limit amplification of sensor noise signals on the control input signal.\nTypically actuator input weights are constant over frequency and set at the inverse of the saturation limit.\nOrder of the weighting functions The order of the optimal controller is equal to the order of the nominal plant model plus the order of the weights. The complexity of the controller is increase as the order of the weights increases.\nThe order of the weights should be kept reasonably low to reduce the order of th resulting optimal compensator and avoid potential convergence problems in the DK interactions.\nBibliography Bibel, J. E., \u0026amp; Malyevac, D. S., Guidelines for the selection of weighting functions for h-infinity control (1992). ↩\n","permalink":"/paper/bibel92_guidel_h/","tags":null,"title":"Guidelines for the selection of weighting functions for h-infinity control"},{"categories":null,"contents":"Tags :\nNice Citations From Rosenbrock, H. H. (1974). Computer-Aided Control System Design, Academic Press, New York:\n Solutions are constrained by so many requirements that it is virtually impossible to list them all. The designer finds himself threading a maze of such requirements, attempting to reconcile conflicting demands of cost, performance, easy maintenance, and so on. A good design usually has strong aesthetic appeal to those who are competent in the subject.\n \u0026lt;./biblio/references.bib\u0026gt;\nBacklinks Guidelines for the selection of weighting functions for h-infinity control ","permalink":"/zettels/h_infinity_control/","tags":null,"title":"H Infinity Control"},{"categories":null,"contents":"Tags :\nHigh-Authority Control/Low-Authority Control\nFrom (Andre Preumont, 2018):\n The HAC/LAC approach consist of combining the two approached in a dual-loop control as shown in Figure 1. The inner loop uses a set of collocated actuator/sensor pairs for decentralized active damping with guaranteed stability ; the outer loop consists of a non-collocated HAC based on a model of the actively damped structure. This approach has the following advantages:\n The active damping extends outside the bandwidth of the HAC and reduces the settling time of the modes which are outsite the bandwidth The active damping makes it easier to gain-stabilize the modes outside the bandwidth of the output loop (improved gain margin) The larger damping of the modes within the controller bandwidth makes them more robust to the parmetric uncertainty (improved phase margin) \n Figure 1: HAC-LAC Control Architecture\n Bibliography Preumont, A., Vibration control of active structures - fourth edition (2018), : Springer International Publishing. ↩\n","permalink":"/zettels/hac_hac/","tags":null,"title":"HAC-HAC"},{"categories":null,"contents":" Tags Stewart Platforms, Flexible Joints Reference (Yixin Chen \u0026amp; McInroy, 2000) Author(s) Chen, Y., \u0026amp; McInroy, J. Year 2000 Bibliography Chen, Y., \u0026amp; McInroy, J., Identification and decoupling control of flexure jointed hexapods, In , Proceedings 2000 ICRA. Millennium Conference. IEEE International Conference on Robotics and Automation. Symposia Proceedings (Cat. No.00CH37065) (pp. ) (2000). : . ↩\n","permalink":"/paper/chen00_ident_decoup_contr_flexur_joint_hexap/","tags":null,"title":"Identification and decoupling control of flexure jointed hexapods"},{"categories":null,"contents":" Tags Multivariable Control Reference (Sanjay Garg, 2007) Author(s) Garg, S. Year 2007 Discusses:\n When to use multivariable control and when not to? Two major issues with implementing multivariable control: gain scheduling and integrator wind up protection Inline simple gain and phase margin measured for SISO, \u0026ldquo;robustness\u0026rdquo; determination of multivariable control requires complex analyses using singular value techniques and Monte Carlo simulations.\n When to use multivariable control:\n System has high input/output coupling and not much separation between loop bandwidth System is complex with large number of states When sequential SISO loop closure will not meet performance requirements Importance of having a mechanism to limit the control rate in the synthesis process. The control rate should be weighted appropriately in order to not saturate the system and stay in the linearity regime.\n importance of scaling the plant prior to synthesis and also replacing pure integrators with slow poles Bibliography Garg, S., Implementation challenges for multivariable control: what you did not learn in school!, In , AIAA Guidance, Navigation and Control Conference and Exhibit (pp. ) (2007). : . ↩\n","permalink":"/paper/garg07_implem_chall_multiv_contr/","tags":null,"title":"Implementation challenges for multivariable control: what you did not learn in school!"},{"categories":null,"contents":" Tags Position Sensors Reviews (Collette {\\it et al.}, 2012) Accelerometers Micromega Dynamics link MMF link PCB link Wireless Accelerometers\n https://micromega-dynamics.com/products/recovib/miniature-vibration-recorder/ \n Figure 1: Characteristics of commercially available accelerometers (Collette {it et al.}, 2011)\n Geophones Sercel link Wilcoxon link \n Figure 2: Characteristics of commercially available geophones (Collette {it et al.}, 2011)\n Bibliography Collette, C., Janssens, S., Fernandez-Carmona, P., Artoos, K., Guinchard, M., Hauviller, C., \u0026amp; Preumont, A., Review: inertial sensors for low-frequency seismic vibration measurement, Bulletin of the Seismological Society of America, 102(4), 1289–1300 (2012). http://dx.doi.org/10.1785/0120110223 ↩\nCollette, C., Artoos, K., Guinchard, M., Janssens, S., Carmona Fernandez, P., \u0026amp; Hauviller, C., Review of sensors for low frequency seismic vibration measurement (2011). ↩\n","permalink":"/zettels/inertial_sensors/","tags":null,"title":"Inertial Sensors"},{"categories":null,"contents":" Tags Nano Active Stabilization System, Positioning Stations Reference (Tomas Stankevic {\\it et al.}, 2017) Author(s) Stankevic, T., Engblom, C., Langlois, F., Alves, F., Lestrade, A., Jobert, N., Cauchon, G., … Year 2017 Similar Station than the NASS Similar Metrology with fiber based interferometers and cylindrical reference mirror \n Figure 1: Positioning Station\n Thermal expansion: Stabilized down to \\(5mK/h\\) using passive water flow through the baseplate below the sample stage and in the interferometry reference frame. Controller: Two Independant PID loops Repeatable errors =\u0026gt; feedforward (Look Up Table) Non-repeatable errors =\u0026gt; feedback Result: 40nm runout error Bibliography Stankevic, T., Engblom, C., Langlois, F., Alves, F., Lestrade, A., Jobert, N., Cauchon, G., …, Interferometric characterization of rotation stages for x-ray nanotomography, Review of Scientific Instruments, 88(5), 053703 (2017). http://dx.doi.org/10.1063/1.4983405 ↩\n","permalink":"/paper/stankevic17_inter_charac_rotat_stages_x_ray_nanot/","tags":null,"title":"Interferometric characterization of rotation stages for x-ray nanotomography"},{"categories":null,"contents":" Tags Stewart Platforms, Vibration Isolation, Flexible Joints Reference (Wang {\\it et al.}, 2016) Author(s) Wang, C., Xie, X., Chen, Y., \u0026amp; Zhang, Z. Year 2016 Model of the Stewart platform:\n Struts are treated as flexible beams Payload and the base are treated as flexible plates The FRF synthesis method permits to derive FRFs of the Stewart platform The model is compared with a Finite Element model and is shown to give the same results. The proposed model is thus effective.\n\n Figure 1: Stewart Platform\n Control: Combines:\n the FxLMS-based adaptive inverse control =\u0026gt; suppress transmission of periodic vibrations direct feedback of integrated forces =\u0026gt; dampen vibration of inherent modes and thus reduce random vibrations Force Feedback (Figure 2).\n the force sensor is mounted between the base and the strut \n Figure 2: Feedback of integrated forces in the platform\n Sorts of HAC-LAC control:\n LAC: Decentralized integral force feedback HAC: Inertial control using accelerometers. Use of the Jacobian to decouple the motion and then Fx-LMS based adaptive control is used Experimental validation:\n All 6 transfer function from actuator force to force sensors are almost the same (gain offset) Effectiveness of control methods are shown Bibliography Wang, C., Xie, X., Chen, Y., \u0026amp; Zhang, Z., Investigation on active vibration isolation of a stewart platform with piezoelectric actuators, Journal of Sound and Vibration, 383(), 1–19 (2016). http://dx.doi.org/10.1016/j.jsv.2016.07.021 ↩\n","permalink":"/paper/wang16_inves_activ_vibrat_isolat_stewar/","tags":null,"title":"Investigation on active vibration isolation of a stewart platform with piezoelectric actuators"},{"categories":null,"contents":" Tags Position Sensors Reference (Gao {\\it et al.}, 2015) Author(s) Gao, W., Kim, S., Bosse, H., Haitjema, H., Chen, Y., Lu, X., Knapp, W., … Year 2015 Bibliography Gao, W., Kim, S., Bosse, H., Haitjema, H., Chen, Y., Lu, X., Knapp, W., …, Measurement technologies for precision positioning, CIRP Annals, 64(2), 773–796 (2015). http://dx.doi.org/10.1016/j.cirp.2015.05.009 ↩\n","permalink":"/paper/gao15_measur_techn_precis_posit/","tags":null,"title":"Measurement technologies for precision positioning"},{"categories":null,"contents":"Tags :\n\u0026lt;./biblio/references.bib\u0026gt;\nBacklinks Fundamental principles of engineering nanometrology ","permalink":"/zettels/metrology/","tags":null,"title":"Metrology"},{"categories":null,"contents":" Tags System Identification, Reference Books Reference (Ewins, 2000) Author(s) Ewins, D. Year 2000 Overview Introduction to Modal Testing The major objectives of modal testing are:\n Determining the nature and extent of vibration response levels in operation Verifying theoretical models and predictions of the vibrations Measurement of the essential materials properties under dynamic loading, such as damping capacity, friction and fatigue endurance For many applications, vibrations is directly related to performance and it is important that the vibration levels are anticipated and brought under satisfactory control.\nThe two major vibration measurement objectives corresponds to two types of test:\n Free vibration: responses are measured during operation of the machine Forced vibrations: the structure is vibrated with a known excitation, often out of its normal service environment. This type of testing is generally made under more closely-controlled conditions than the first one, and yields to more accurate information Modal Testing means \u0026ldquo;the processes involved in testing components or structure with the objective of obtaining a mathematical description of their dynamic of vibration behavior\u0026rdquo;. The form of \u0026ldquo;mathematical description\u0026rdquo; can vary from one application to the other: it can be an estimate of natural frequency and damping factor in one case and a full mass-spring-dashpot model for the next.\nApplications of modal testing We must remember that no single test or analysis procedure is best for all cases and so it is very important that a clear objective is defined before any industrial test is undertaken so that the optimum methods may be used.\nThe different objectives can be:\n Measurement of a structure\u0026rsquo;s vibration properties in order to compare these with a theoretical model (finite element model for instance). This is usually used to validate a model. What is required for the test are:\n accurate estimates of natural frequencies descriptions of the mode shapes At this stage, accurate mode shape data are not essential. It is generally not possible to \u0026ldquo;predict\u0026rdquo; the damping in each mode of vibration from a theoretical model.\n Adjust or correct the theoretical model in order to bring its modal properties closer into line with the measured results. A correlation technique can be used: the two sets of data are combined, quantitatively, in order to identify specifically the causes of the discrepancies between predicted and measured properties. This however, requires precise description of the mode shapes (the eigenvectors) from the modal analysis.\n Sub-structuring process: use modal testing in order to produce a mathematical model of a component which may be incorporated into a structural assembly. Here, as it is a fully quantitative model that is sought, accurate data are required for natural frequencies, modal damping factors and mode shapes. Also, all modes must be included simultaneously as out-of-range modes will influence the structure\u0026rsquo;s behavior in a given frequency range of interest for the complete assembly. This application is altogether more demanding than the previous ones.\n Predicting the effects of modifications to the original structure, as tested. For this application and the sub-structuring process, one need information about rotational degrees-of-freedom, i.e. moments and rotational displacements. These are generally ignore in experimental-based studies as they are much more difficult to measure.\n Force Determination. There are a number of situations where knowledge of the dynamic forces causing vibration is required but where direct measurement of these forces is not practical. For these cases, one solution is offered by a process whereby measurements of the response caused by the forces are combined with a mathematical description of the transfer functions of the structure in order to deduce the forces. This process can be very sensitive to the accuracy of the model used, and it is often essential that the model itself be derived from measurements\n Usually, the normal procedure for modal testing is:\n Measure Analyze the measured data Derive a mathematical model of the structure However, there are some cases where this is not the optimum procedure. The last step is usually taken in order to reduce a vast quantity of actual measurements to a small and efficient data set usually referred to as the \u0026ldquo;modal model\u0026rdquo;. This reduction process has an additional benefit of eliminating small inconsistencies which will inevitably occur in measured data.\nPhilosophy of Modal Testing One of the major requirements to apply modal testing is a thorough integration with an high level of understanding of three components:\n Theoretical basis of vibration Accurate measurement of vibration Realistic and detailed data analysis For instance, there are many features of a frequency response function that can be assessed rapidly understanding some theoretical basis. This could prevent the wasted effort of analyzing incorrect measurements.\nThen, for the practical side, there are many choices of test methods: harmonic, random, transient excitation. The experimenter should be aware of the limitations and implications of the various techniques used in the measurement phases.\nNext, we consider the analysis stage where the measured data (Frequency Response Functions or FRF) are subjected to a range of curve-fitting procedures in an attempt to find the mathematical model which provides the closest description of the actually-observed behavior. There are many approached, and one should be aware of the alternatives in order to choose the optimal one.\nOften, an analysis may be conducted on each measured curve individually. Then, there is a further step in the process: modeling. This is the final stage where all the measured and processed data are combined to yield the most compact and efficient mathematical model of the test structure.\nHowever, the averaging process is a valid and valuable technique only is provided that the data contain random vibrations. Data with systematic trends, such as those causes by poor testing practices or non-linearities, should no be averaged in the same way.\nSummary of Theory It is very important that a clear distinction is made between free vibrations and forced vibration analysis.\nFor the SDOF system, a free vibration analysis yields its natural frequency and damping factor, where a forced response analysis (assuming a harmonic excitation), leads to the definition of the frequency response function. These two types of results are referred to as modal properties and frequency response characteristics.\nNext, we consider the more general class of systems which have more than one degree-of-freedom. For these, it is customary that the spatial properties (the values of the mass, stiffness, and damper elements) be expressed as matrices. Those used are the mass matrix \\(M\\), the stiffness matrix \\(K\\), the viscous damping matrix \\(C\\) and the structural or hysteretic damping matrix \\(D\\).\nThere are three phases in the vibration analysis of such systems:\n Setting up the governing equations of motion, which means determining the elements of the above matrices\n Free vibration analysis using the equations of motion. This analysis produces first a set of \\(N\\) natural frequencies and damping factors, and secondly a matching set of \\(N\\) \u0026ldquo;mode shape\u0026rdquo; vectors, each one of these being associated with a specific natural frequency and damping factor. The complete free vibration solution is conveniently contained in two matrices \\(h^2\\) and \\(\\phi\\), which are again referred to as \u0026ldquo;modal properties\u0026rdquo;, or sometimes, as the eigenvalue and eigenvector matrices. One element from the diagonal eigenvalue matrix \\(\\lambda_r^2\\) contains both the natural frequency and the damping factor for the \\(r^{\\text{th}}\\) normal mode of vibration of the system while the corresponding column \\(\\phi_r\\) describes the shape of that same mode of vibration\n Forced response analysis, and in particular harmonic excitation. By solving the equations of motion when harmonic forcing is applied, we are able to describe the complete solution by a single matrix, known as the frequency response matrix \\(H(\\omega)\\). Thus, element \\(H_{jk}(\\omega)\\) represents the harmonic response, \\(X_j\\) in one of the DOF \\(j\\) caused by a single harmonic force \\(F_k\\) applied in the DOF \\(k\\). The particular relevance of these specific response characteristics is the fact that they are the quantities which are the most likely to be able to measure in practice. However, the same expressions can be drastically simplified if we use the modal properties instead of the spatial properties and it is possible to write an expressing for any FRF, \\(H_{jk}(\\omega)\\), which has the general form\n\\begin{equation*} H_{jk}(\\omega) = \\frac{X_j}{F_k} = \\sum_{r=1}^{N}\\frac{{}_rA_{jk}}{\\lambda_r^2 - \\omega^2} \\label{eq:frf_modal} \\end{equation*}\nwhere \\(\\lambda_r^2\\) is the eigenvalue of the \\(r^{\\text{th}}\\) mode, \\({}_rA_{jk}\\) (the modal constant) is constructed from \\(\\phi_{jk}\\) which is the \\(j^{\\text{th}}\\) element of the \\(r^{\\text{th}}\\) eigenvector \\(\\phi_r\\) and \\(N\\) is the number of degrees-of-freedom (or modes). This expression forms the foundation of modal analysis: it shows a direct connection between the modal properties of a system and its response characteristics.\n Thus, we find that by making a thorough study of the theory of structural vibration, we are able to \u0026ldquo;predict\u0026rdquo; what we might expect to find if we make FRF measurements on actual hardware. Indeed, we shall see later how these predictions can be quite detailed, to the point where it is possible to comment on the likely quality of measured data.\nSummary of measurement methods The main measurement technique studied are those which will permit to make direct measurements of the various FRF properties of the test structure.\nThe type of test best suited to FRF measurement is shown in figure fig:modal_analysis_schematic.\n\n Figure 1: Basic components of FRF measurement system\n Essentially, there are three aspect of the measurement process which demand particular attention in order to ensure the acquisition of the high-quality data which are required for the next stage (data analysis). These are:\n The mechanical aspect of supporting and correctly exciting the structure The correct transduction of the quantities to be measured (force input and motion response) The signal processing which is appropriate to the type of test used Mechanical Aspect We here encounter questions as how the testpiece should be suspended, or supported and how it should be excited. Usually, one of three options is chosen for the support:\n Free or unrestrained: usually means suspended on very soft springs, this has the advantage that free boundaries are easy to simulate Grounded: requires rigid clamping at certain points In situ: the testpiece is connected to some structure representing a non-rigid attachment The mechanics of the excitation are achieve either by connection a vibration generator or shaker, or by using some form of transient input, such as a hammer blow or sudden release from a deformed position. Both approaches have advantages and disadvantages and it can be very important to choose the best one in each case.\nTransducers Transducers are very important elements in the system as it is essential that accurate measurements be made of both the input to the structure and of its response. Nowadays, piezoelectric transducers are widely used to detect both force and acceleration and the major problems associated with them are to ensure that they interfere as little as possible with the test structure and that their performance is adequate for the ranges of frequency and amplitude of the test.\nSignal Processing The FRF parameters to be measured can be obtained directly by applying an harmonic excitation and then measuring the resulting harmonic response. This type of test is often referred to as sinewave testing and it requires the attachment of a shaker to the structure. The frequency range is covered by sweeping the frequency continuously or by step.\nAlternative excitation procedures are now widely used. Transient (including burst signals) periodic, pseudo-random or random excitation signals often replace the signal wave approach and are made practical by the existence of complex signal processing analyser which are capable of resolving the frequency content of both input and response signals using Fourier analysis.\nIn modal testing applications of vibrations measurements, accuracy of the measured data is of paramount importance. This is so because this data are generally to be submitted to a range of analysis procedures, in order to extract the results. Some of these analysis processes are themselves quite complex and can seldom be regarded as insensitive to the accuracy of the input data.\nSummary of Modal Analysis Processes The third skill required for modal testing is concerned with the analysis of the measured FRF data. This is quite separate from the signals processing which may be necessary to convert raw measurements into frequency response.\nIt is a procedure whereby the measured mobilities are analyzed in such a way as to find a theoretical model which most closely resembles the behavior of the actual testpiece. This process itself falls into two stages:\n Identify the appropriate type of model Determine the appropriate parameters of the chosen model Most of the effort goes into this second stage, which is widely referred to as \u0026ldquo;modal parameter extraction\u0026rdquo;, or simply as \u0026ldquo;modal analysis\u0026rdquo;.\nWe have seen that we can predict the form of the FRF plots for a multi degree-of-freedom system, and that these are directly related to the modal properties of that system. The great majority of the modal analysis effort involves curve-fitting an expression such as equation eq:frf_modal to the measured FRF and thereby finding the appropriate modal parameters.\nA completely general curve-fitting approach is possible but generally inefficient. Mathematically, we can take an equation of the form \\[ H(\\omega) = \\sum_{r=1}^N \\frac{A_r}{\\lambda_r^2 - \\omega^2} \\] and curve fit a set of measured values \\(H_m(\\omega_1), H_m(\\omega_2), \\dots\\) to this expression so that we obtain estimates for the coefficients \\(A_1, A_2, \\dots, \\lambda_1^2, \\lambda_2^2, \\dots\\). These coefficients are closely related to the modal properties of the system. However, although such approaches are made, they are inefficient and neither exploit the particular properties of resonant systems nor take due account of the unequal quality of the various measured points in the data set, both of which can have a significant influence on the overall analysis process. Thus there is no single modal analysis method, but rater a selection, each being the most appropriate in differing conditions.\nOne of the most widespread and useful approaches is known as the single-degree-of-freedom curve-fit, or often as the circle fit procedure. This method uses the fact that at frequencies close to a natural frequency, the FRF can often be approximated to that of a single degree-of-freedom system plus a constant offset term (which approximately accounts for the existence of other modes). This assumption allows us to use the circular nature of a modulus/phase polar plot of the frequency response function of a SDOF system (see figure fig:sdof_modulus_phase). This process can be repeated for each resonance individually until the whole curve has been analyzed. At this stage, a theoretical regeneration of the FRF is possible using the set of coefficients extracted.\n\n Figure 2: Curve fit to resonant FRF data\n These simple methods can be used for many of the cases encountered in practice but they become inadequate and inaccurate when the structure has mode which are close. Under these conditions, it becomes necessary to use a more complex process which accepts the simultaneous influence of more than one mode. These methods are referred to as MDOF curve-fits and are naturally more complicated and require more computation effort but, provided the data are accurate, they have the capability of producing more accurate estimates for the modal properties.\nSome of more detailed considerations include: compensating for slightly non-linear behavior, simultaneously analyzing more than one FRF and curve-fitting to actual time histories.\nReview of Test Procedures and Levels The overall objective of the test is to determine a set of modal properties for a structure. These consist of natural frequencies, damping factors and mode shapes. The procedure consists of three steps:\n Measure an appropriate set of mobilities, or FRF Analyze these using appropriate curve-fitting procedures Combine the results of the curve-fits to construct the required model Using our knowledge of the theoretical relationship between FRF functions and modal properties, it is possible to show that an \u0026ldquo;appropriate\u0026rdquo; set of FRFs to measure consists in most cases of just one row or one column in the FRF matrix \\(H(\\omega)\\). In practice this either means exciting the structure at one point and measuring responses at all points or measuring the response at one point while the excitation is applied separately at each point in turn. This last option is most conveniently achieve using a hammer.\nEven though the same overall procedure is always followed, there will be a different level of detail required for each different application.\nTheoretical Basis Introduction Theoretical foundations of modal testing are of paramount importance to its successful implementation.\nThe three phases through a typical theoretical vibration analysis progresses are shown on figure fig:vibration_analysis_procedure. Generally, we start with a description of the structure\u0026rsquo;s physical characteristics (mass, stiffness and damping properties), this is referred to as the Spatial model.\n\n Figure 3: Theoretical route to vibration analysis\n Then, it is customary to perform a theoretical modal analysis of the spatial model which leads to a description of the structure\u0026rsquo;s behavior as a set of vibration modes: the modal model.\n This model is defined a set of natural frequencies with corresponding modal damping factors and vibration mode shapes. This solution describes the various ways in which the structure is capable of vibrating naturally (without any external forces or excitations), and so these are called the natural or normal modes of the structure.\n The third stage is generally that in which we have the greatest interest; namely, the analysis of exactly how the structure will respond under given excitation conditions. It is convenient to present an analysis of the structure\u0026rsquo;s response to a \u0026ldquo;standard\u0026rdquo; excitation (from which the solution for any particular case can be constructed) and to describe this as the response model. The standard excitation chosen is a unit-amplitude sinusoidal force applied to each point on the structure individually, and at every frequency within a specified range. Thus our response model will consist of a set of frequency response functions.\n As indicated in figure fig:vibration_analysis_procedure, it is also possible to do an analysis in the reverse directly: from a description of the response properties (FRFs), we can deduce modal properties and the spatial properties: this is the experimental route to vibration analysis.\n Single Degree of Freedom System Theory Although very few practical structures could realistically be modeled by a SDOF system, the properties of such a system are very important because those for a more complex MDOF system can always be represented as a linear superposition of a number of SDOF characteristics.\n Three classes of system model will be described:\n Undamped Viscously-damped Hysteretically (or structurally) damped The basic model for the SDOF system is shown in figure fig:sdof_model where \\(f(t)\\) and \\(x(t)\\) are general time-varying force and displacement response quantities. The spatial model consists of a mass \\(m\\), a spring \\(k\\) and (when damped) either a viscous dashpot \\(c\\) or hysteretic damper \\(d\\).\n\n Figure 4: Single degree-of-freedom system\n Undamped Systems The governing equation of motion is\n\\begin{equation} m \\ddot{x} + k = 0 \\end{equation}\nThe trial solution \\(x(t) = X e^{i\\omega t}\\) leads to \\[ k - m \\omega^2 = 0 \\]\nHence the modal model consists of a single solution (mode of vibration) with a natural frequency \\[ \\omega_0 = \\sqrt{k/m} \\]\nTurning next to a frequency response analysis, we consider an excitation of the form \\[ f(t) = F e^{i\\omega t} \\] and assume a solution of the form \\[ x(t) = X e^{i\\omega t} \\] where \\(F\\) and \\(X\\) are complex. Now the equation of motion is\n\\begin{equation} (k - m \\omega^2) X e^{i\\omega t} = F e^{i\\omega t} \\end{equation}\nfrom which we extract the required response model in the form of a frequency response function.\n \\begin{equation} \\alpha(\\omega) = \\frac{X}{F} = \\frac{1}{x - \\omega^2 m} \\label{eq:receptance} \\end{equation}\n This particular form of FRF, where the response parameter is displacement (as opposed to velocity of acceleration) is called a receptance.\nViscous Damping If we add a viscous dashpot \\(c\\), the equation of motion becomes\n\\begin{equation} m \\ddot{x} + c \\dot{x} + k x = 0 \\end{equation}\nand we must now use a more general trial solution \\[ x(t) = X e^{st} \\] where \\(s\\) is complex. We obtain the condition \\[ ms^2 + cs + k = 0 \\] which leads to\n\\begin{align} s_{1, 2} \u0026amp;= -\\frac{c}{2 m} \\pm \\frac{\\sqrt{c^2 - 4 k m}}{2 m} \\\\\\\n\u0026amp;= - \\bar{\\omega}_0 \\xi \\pm i \\bar{\\omega}_0 \\sqrt{1 - \\xi^2} \\nonumber \\end{align}\nwhere \\[ \\bar{\\omega}_0^2 = \\frac{k}{m};\\quad \\xi = \\frac{c}{c_0} = \\frac{c}{2 \\sqrt{km}} \\]\nThis implies a modal solution of the form \\[ x(t) = X e^{-\\bar{\\omega}_0 \\xi t} e^{i (\\bar{\\omega}_0 \\sqrt{1 - \\xi^2})t} = X e^{-a t} e^{i \\omega_0^\\prime t} \\] which is a single mode of vibration with a complex natural frequency having two part:\n An imaginary or oscillatory part A real or decay part The physical significance of these two parts is illustrated in the typical free response plot shown in figure fig:sdof_response\n\n Figure 5: Oscillatory and decay part\n Lastly, we consider the forced response when \\(f(t) = F e^{i\\omega t}\\) and, as before, we assume \\(x(t) = Xe^{i\\omega t}\\): \\[ \\left( -\\omega^2 m + i \\omega c + k \\right) X e^{i\\omega t} = F e^{i \\omega t} \\] gives a receptance FRF of the form\n \\begin{equation} \\alpha(\\omega) = \\frac{1}{(k - \\omega^2 m) + i \\omega c} \\end{equation}\nwhich is now complex, containing both magnitude and phase information:\n\\begin{subequations} \\begin{align} \\frac{|X|}{|F|} \u0026amp;= \\frac{1}{\\sqrt{(k - \\omega^2 m)^2 + (\\omega c)^2}} \\\\\\\n\\angle{X} - \\angle{F} \u0026amp;= \\text{tg}^{-1} \\left( \\frac{\\omega c}{k - \\omega^2 m} \\right) \\end{align} \\end{subequations}\n Structural Damping All structures exhibit a degree of damping due to the hysteresis properties of the material(s) from which they are made.\nA typical example of this effect is shown in the force displacement plot in figure fig:material_histeresis in which the area contained by the loop represents the energy lost in one cycle of vibration between the extremities shown. The maximum energy stored corresponds to the elastic energy of the structure at the point of maximum deflection. The damping effect of such a component can conveniently be defined by the ratio of these two: \\[ \\tcmbox{\\text{damping capacity} = \\frac{\\text{energy lost per cycle}}{\\text{maximum energy stored}}} \\]\n\nTable 1: Force-deflection characteristics Material hysteresis Dry friction Viscous damper height=2cm height=2cm height=2cm Another common source of energy dissipation in practical structures, is the friction which exist in joints between components of the structure. It may be described very roughly by the simple dry friction model shown in figure fig:dry_friction.\nThe mathematical model of the viscous damper which we have used can be compared with these more physical effects by plotting the corresponding force-displacement diagram for it, and this is shown in figure fig:viscous_damper. Because the relationship is linear between force and velocity, it is necessary to suppose harmonic motion, at frequency \\(\\omega\\), in order to construct a force-displacement diagram. The resulting diagram shows the nature of the approximation provided by the viscous damper model and the concept of the effective or equivalent viscous damping coefficient for any of the actual phenomena as being which provides the same energy loss per cycle as the real thing.\n The problem which arises with the viscous damping model is that it has a frequency-dependence in the amount of energy loss per cycle whereas the dry friction mechanism is clearly unaffected by the frequency of loading and experiments suggests that the hysteresis effect is similarly independent of frequency. Thus, we find a problem in obtaining a single equivalent viscous dashpot model which will be valid over a range of frequencies, such as will be necessary to represent the damping of a MDOF system over all, or at least several, of its modes of vibration.\n An alternative theoretical damping model is provided by the hysteretic or structural damper which not only has the advantage that the energy lost per cycle is independent of the frequency, but also provides a much simpler analysis for MDOF systems. However, it presents difficulties to a rigorous free vibration analysis and its application is generally focused on the forced response analysis. In this case, we can write an equation of motion: \\[ (-\\omega^2 m + k + i d) X e^{i\\omega t} = F e^{i \\omega t} \\]\n \\begin{equation} \\alpha(\\omega) = \\frac{1/k}{1 - \\left(\\omega/\\bar{\\omega}_0\\right)^2 + i \\eta} \\end{equation}\nwhere \\(\\eta\\) is the structural damping loss factor and replaces the critical damping ratio used for the viscous damping model.\n Presentation and Properties of FRF data for SDOF system Alternative Forms of FRF So far we have defined our receptance frequency response function \\(\\alpha(\\omega)\\) as the ratio between a harmonic displacement response and the harmonic force eq:receptance. This ratio is complex: we can look at its amplitude ratio \\(|\\alpha(\\omega)|\\) and its phase angle \\(\\theta_\\alpha(\\omega)\\).\nWe could have selected the response velocity \\(v(t)\\) as the output quantity and defined an alternative frequency response function eq:mobility. Similarly we could use the acceleration parameter so we could define a third FRF parameter eq:inertance.\n \\begin{equation} \\text{mobility} = Y(\\omega) = \\frac{V}{F} = i \\omega \\alpha(\\omega) \\label{eq:mobility} \\end{equation}\n \\begin{equation} \\text{inertance} = A(\\omega) = \\frac{A}{F} = - \\omega^2 \\alpha(\\omega) \\label{eq:inertance} \\end{equation}\n Table tab:frf_alternatives gives details of all six of the FRF parameters and of the names used for them.\nInverse response can also be defined. For instance, the dynamic stiffness is defined as the force over the displacement.\n \\begin{equation} \\frac{\\text{force}}{\\text{displacement}} = (k - \\omega^2 m) + (i \\omega c) \\label{eq:dynamic_stiffness} \\end{equation}\n It should be noted that that the use of displacement as the response is greatly encouraged as the other options can lead to confusion when used in MDOF system.\n\nTable 2: Definition of Frequency Response Functions Standard FRF Inverse FRF: FIR Disp. Receptance Dynamic Stiffness Admittance Dynamic compliance Dynamic flexibility Vel. Mobility Mechanical Impedance Acc. Accelerance Apparent Mass Inertance Graphical Displays of FRF Data FRF data are complex and thus there are three quantities (frequency and two parts of the complex function) to display. Any simple plot can only show two of the three quantities and so there are different possibilities available for the presentation of such data:\n Modulus of FRF vs Frequency and Phase of FRF vs Frequency: the Bode plot Real Part of FRF vs Frequency and Imaginary Part of FRF vs Frequency Real Part of reciprocal FRF vs Frequency and Imaginary part of reciprocal FRF vs Frequency Real part of FRF vs Imaginary part of FRF: the Nyquist plot Bode Plot Bode plot are usually displayed using logarithmic scales as shown on figure fig:bode_plots.\n\nTable 3: FRF plots for undamped SDOF system Receptance FRF Mobility FRF Accelerance FRF width=\\linewidth width=\\linewidth width=\\linewidth Each plot can be divided into three regimes:\n a low frequency straight line characteristic a high frequency straight line characteristic the resonant region with its abrupt magnitude and phase variations Real part and Imaginary part of FRF Real and imaginary part of a receptance FRF of a damped SDOF system is shown on figure fig:plot_receptance_real_imag. This type of display is not widely used as we cannot use logarithmic axes (as we have to show positive and negative values).\n\nTable 4: Plot of real and imaginary part for the receptance of a damped SDOF Real part Imaginary part width=\\linewidth width=\\linewidth Real part and Imaginary part of reciprocal FRF It can be seen from the expression of the inverse receptance eq:dynamic_stiffness that the Real part depends entirely on the mass and stiffness properties while the Imaginary part is a only function of the damping.\nFigure fig:inverse_frf_mixed shows an example of a plot of a system with a combination of both viscous and structural damping. The imaginary part is a straight line whose slope is given by the viscous damping rate \\(c\\) and whose intercept at \\(\\omega = 0\\) is provided by the structural damping coefficient \\(d\\).\n\nTable 5: Inverse FRF plot for the system Mixed Viscous width=\\linewidth width=\\linewidth Real part vs Imaginary part of FRF Figure fig:nyquist_receptance shows Nyquist type FRF plots of a viscously damped SDOF system. The missing information (in this case, the frequency) must be added by identifying the values of frequency corresponding to particular points on the curve.\n\nTable 6: Nyquist FRF plots of the mobility for a SDOF system Viscous damping Structural damping width=\\linewidth width=\\linewidth The Nyquist plot has the particularity of distorting the plot so as to focus on the resonance area. This makes the Nyquist plot very effective for modal testing applications.\nUndamped MDOF Systems Free Vibration Solution - The modal Properties For an undamped MDOF system, with \\(N\\) degrees of freedom, the governing equations of motion can be written in matrix form eq:undamped_mdof.\n \\begin{equation} [M] \\{\\ddot{x}(t)\\} + [K] \\{x(t)\\} = \\{f(t)\\} \\label{eq:undamped_mdof} \\end{equation}\nwhere \\([M]\\) and \\([K]\\) are \\(N\\times N\\) mass and stiffness matrices, and \\(\\{x(t)\\}\\) and \\(\\{f(t)\\}\\) are \\(N\\times 1\\) vectors of time-varying displacements and forces.\n We shall consider first the free vibration solution by taking \\(f(t) = 0\\). In this case, we assume that a solution exists of the form \\(\\{x(t)\\} = \\{X\\} e^{i \\omega t}\\) where \\(\\{X\\}\\) is an \\(N \\times 1\\) vector of time-independent amplitudes. Substitution of this condition into eq:undamped_mdof leads to\n\\begin{equation} \\left( [K] - \\omega^2 [M] \\right) \\{X\\} e^{i\\omega t} = \\{0\\} \\end{equation}\nfor which the non trivial solutions are those which satisfy \\[ \\det \\left| [K] - \\omega^2 [M] \\right| = 0 \\] from which we can find \\(N\\) values of \\(\\omega^2\\) corresponding to the undamped system\u0026rsquo;s natural frequencies.\nSubstituting any of these back into eq:free_eom_mdof yields a corresponding set of relative values for \\(\\{X\\}\\): \\(\\{\\psi\\}_r\\) the so-called mode shape corresponding to that natural frequency.\n The complete solution can be expressed in two \\(N \\times N\\) eigen matrices.\n\\[ \\begin{bmatrix} \\omega_1^2 \u0026amp; \u0026amp; 0 \\\\\\\n\u0026amp; \\ddots \u0026amp; \\\\\\\n0 \u0026amp; \u0026amp; \\omega_n^2 \\end{bmatrix}; \\quad \\Psi = \\begin{bmatrix} \u0026amp; \u0026amp; \\\\\\\n\\{\\psi_1\\} \u0026amp; \\dots \u0026amp; \\{\\psi_n\\} \\\\\\\n\u0026amp; \u0026amp; \\end{bmatrix} \\]\nwhere \\(\\bar{\\omega}_r^2\\) is the \\(r^\\text{th}\\) eigenvalue squared and \\(\\{\\psi\\}_r\\) is a description of the corresponding mode shape\n Various numerical procedures are available which take the system matrices \\([M]\\) and \\([K]\\) (the Spatial Model), and convert them to the two eigen matrices \\([\\bar{\\omega}_r^2]\\) and \\([\\Psi]\\) which constitute the Modal Model.\nIt is important to realize that whereas the eigenvalue matrix is unique, the eigenvector matrix is not. Indeed, the natural frequencies are fixed quantities, and the mode shapes are subject to an indeterminate scaling factor.\nOrthogonality Properties The modal model possesses some very important properties known as the orthogonality properties:\n\\begin{subequations} \\begin{align} [\\Psi]^T[M][\\Psi] \u0026amp;= [m_r]\\\\\\\n[\\Psi]^T[K][\\Psi] \u0026amp;= [k_r] \\end{align} \\end{subequations}\nfrom which \\([\\bar{\\omega}_r^2] = [m_r]^{-1} [k_r]\\) where \\(m_r\\) and \\(k_r\\) are often referred to as the modal mass and modal stiffness of mode \\(r\\).\n Now, because the eigenvector matrix is subject to an arbitrary scaling factor, the values of \\(m_r\\) and \\(k_r\\) are not unique.\nAmong the many scaling or normalization processes, the mass-normalization has the most relevance.\n The mass-mormalized eigenvectors are written as \\([\\Phi]\\) and have the particular property that\n\\begin{subequations} \\begin{align} [\\Phi]^T[M][\\Phi] \u0026amp;= [I]\\\\\\\n[\\Phi]^T[K][\\Phi] \u0026amp;= [\\bar{\\omega}_r^2] \\end{align} \\end{subequations}\n The relationship between the mass-normalized mode shape for mode \\(r\\) \\(\\{\\Phi\\}_r\\) and its more general form \\(\\{\\Psi\\}_r\\) is simply\n\\begin{equation} \\{\\Phi\\}_r = \\frac{1}{\\sqrt{m_r}} \\{\\Psi\\}_r \\end{equation}\nModal, Generalized and Effective Mass and Stiffness The modal mass is based on the mode shape vector for mode \\(r\\) and the system mass matrix. As mentioned, there is no unique value for the modal mass as it is directly related to the scaling method which has been used to determine the mode shape eigenvector \\(\\{\\Psi\\}_r\\). However, the ratio between any modal stiffness and its associated modal mass is unique and is equal to the corresponding eigenvalue. The modal mass is generally used to convert the original mode shape vector \\(\\{\\Psi\\}_r\\) to the more useful mass-normalized mode shape vector \\(\\{\\Phi\\}_r\\).\n Using the mass-normalized mode shape vectors, we can see how to derive quantities which provide us with information about the effective mass (or stiffness) at any point on the structure (any DOF \\(j\\)). The effective mass at DOF \\(j\\) for mode \\(r\\) is define as \\[ (m_{jj})_r = \\frac{1}{(\\phi_{jr})^2}, \\text{ which as units of mass} \\] and the effective stiffness at DOF \\(j\\) for mode \\(r\\) \\[ (k_{jj})_r = \\frac{\\bar{\\omega}_r^2}{(\\phi_{jr}^2)} \\]\n It can be seen that since the mass-normalized eigenvectors are unique, these effective mass and stiffness properties are also unique and represent a useful description of the behavior of the structure point by point, and mode by mode.\n The other quantities which are sometimes referred to as unique properties of each mode are the generalized mass and generalized stiffness. The generalized mass (or stiffness) of the \\(r^{\\text{th}}\\) mode is defined as the effective mass (or stiffness) at the DOF with the largest amplitude of response. This quantity serves to provide a comparison of the relative strength of each mode of the structure.\n Repeated Roots or Multiple Modes There are situations where two (or more) different modes will have the same natural frequency. This occurs frequently in structures which exhibit a degree of symmetry (especially axi-symmetry). In these cases, there is no guarantee that the corresponding eigenvectors are orthogonal. However, linear combinations of these vectors can always be found such that orthogonality is observed between the mode shapes. It should be noted, that free vibration at that frequency is possible not only in each of the two vectors thus defined, but also in a deformation pattern which is given by any linear combination of these two vectors.\nForce Response Solution - The FRF Characteristics Let\u0026rsquo;s consider the case where the structure is excited sinusoidally by a set of forces all at the same frequency \\(\\omega\\), but with individual amplitudes and phases: \\(\\{f(t)\\} = \\{F\\} e^{i\\omega t}\\).\nAssuming solutions of the form \\(\\{x(t)\\} = \\{X\\} e^{i \\omega t}\\), equation of motion then becomes \\[ \\left( [K] - \\omega^2 [M] \\right) \\{X\\}e^{i\\omega t} = \\{F\\}e^{i\\omega t} \\] That can be written in the following form: \\[ \\{X\\} = \\left( [K] - \\omega^2 [M] \\right)^{-1} \\{F\\} \\]\n We define the \\(N \\times N\\) receptance FRF matrix as \\[ [\\alpha(\\omega)] = \\left( [K] - \\omega^2 [M] \\right)^{-1} \\]\nIt constitutes the Response Model of the system.\nThe general element in the receptance FRF matrix \\(\\alpha_{jk}(\\omega)\\) is defined as follows \\[ \\alpha_{jk}(\\omega) = \\frac{X_j}{F_k}, \\quad F_m = 0, m = 1 \\dots N \\neq k \\]\n It is possible to determine values for the elements of \\([\\alpha(\\omega)]\\) at any frequency of interest by computing the inverse system matrix \\([K] - \\omega^2[M]\\) at each frequency. This has several disadvantages:\n it becomes costly for large-order systems it is inefficient if only a few of the individual FRF are required it provides no insight into the form of the various FRF properties An alternative means of deriving the FRF parameters is used which makes use of the modal properties instead of the spatial properties. \\[ [K] - \\omega^2 [M] = [\\alpha(\\omega)]^{-1} \\] Pre-multiply both sides by \\([\\Phi]^T\\) and post-multiply both sides by \\([\\Phi]\\) to obtain \\[ [\\Phi]^T ([K] - \\omega^2 [M]) [\\Phi] = [\\Phi]^T [\\alpha(\\omega)]^{-1} [\\Phi] \\] which leads to eq:receptance_modal.\n \\begin{equation} [\\alpha(\\omega)] = [\\Phi] \\left[ \\bar{\\omega}_r^2 - \\omega^2 \\right]^{-1} [\\Phi]^T \\label{eq:receptance_modal} \\end{equation}\nEquation eq:receptance_modal permits us to compute any individual FRF parameters \\(\\alpha_{jk}(\\omega)\\) using the following formula\n\\begin{subequations} \\begin{align} \\alpha_{jk}(\\omega) \u0026amp;= \\sum_{r=1}^N \\frac{\\phi_{jr} \\phi_{kr}}{\\bar{\\omega}_r^2 - \\omega^2}\\\\\\\n\u0026amp;= \\sum_{r=1}^N \\frac{\\psi_{jr} \\psi_{kr}}{m_r (\\bar{\\omega}_r^2 - \\omega^2)}\\\\\\\n\u0026amp;= \\sum_{r=1}^N \\frac{{}_rA_{jk}}{\\bar{\\omega}_r^2 - \\omega^2} \\end{align} \\end{subequations}\nwhere \\({}_rA_{jk}\\) is called the modal constant.\n It is clear from equation eq:receptance_modal that the receptance matrix \\([\\alpha(\\omega)]\\) is symmetric and this will be recognized as the principle of reciprocity.\nThis principle of reciprocity applies to many structural characteristics.\nIts implications in this situation are that\n\\begin{equation} \\alpha_{jk} = X_j/F_k = \\alpha_{kj} = X_k/F_j \\label{eq:principle_reciprocity} \\end{equation}\n MDOF Systems with Proportional Damping General Concept and Features of Proportional Damping The modes of a structure with proportional damping are almost identical to those of the undamped version of the model. Specifically, the mode shapes are identical and the natural frequencies are very similar.\nThe equations of motion for an MDOF system with viscous damping is\n\\begin{equation} [M]\\{\\ddot{x}\\} + [C]\\{\\dot{x}\\} + [K]\\{x\\} = \\{f\\} \\end{equation}\nLet\u0026rsquo;s first study the special case where the damping matrix is directly proportional to the stiffness matrix: \\[ [C] = \\beta [K] \\] In this case, we have that \\[ [\\Psi]^T [C] [\\Psi] = \\beta [k_r] = [c_r] \\] where the diagonal elements \\(c_{jj}\\) represent the modal damping of the various modes of the system. The fact that this matrix is also diagonal means that the undamped system mode shapes are also those of the damped system, and this is a particular feature of this type of damping.\nFor the forced response analysis, we obtain \\[ [\\alpha(\\omega)] = [ K + i \\omega C - \\omega^2 M ]^{-1} \\] or\n\\begin{equation} \\alpha_{jk}(\\omega) = \\sum_{r=1}^N \\frac{\\psi_{jr}\\psi_{kr}}{(k_r - \\omega^2 m_r) + i \\omega c_r} \\end{equation}\nGeneral Forms of Proportional Damping If the damping matrix is proportional to the mass matrix, exactly the same type of result is obtained. A usual definition of proportional damping is that the damping matrix \\([C]\\) should be of the form\n\\begin{equation} \\tcmbox{[C] = \\beta [K] + \\gamma [M]} \\end{equation}\nIn this case, the damped system will have eigenvalues and eigenvectors as follows\n\\begin{align*} \u0026amp;\\omega_r^\\prime = \\bar{\\omega}_r \\sqrt{1 - \\xi_r^2} ; \\quad \\xi_r = \\frac{\\beta \\bar{\\omega}_r}{2} + \\frac{\\gamma}{2 \\bar{\\omega}_r}\\\\\\\n\u0026amp;[\\Psi_\\text{damped}] = [\\Psi_\\text{undamped}] \\end{align*}\nDistributions of damping of this type are sometimes, tough not always, found to be plausible from a practical standpoint. The actual damping mechanisms are usually to be found in parallel with stiffness elements (for internal material of hysteresis damping) or with mass elements (for friction damping).\nIdentical treatment can be made of an MDOF system with proportional hysteretic damping. If the general system equations of motion are expressed as \\[ [M]\\{\\ddot{x}\\} + [K + iD]\\{x\\} = \\{f\\} \\] and the hysteretic damping matrix \\([D]\\) has the form\n\\begin{equation} [D] = \\beta [K] + \\gamma [M] \\end{equation}\nthen, we find that the mode shapes for the damped system are again identical to those of the undamped system and that the eigenvalues take the complex form: \\[ \\lambda_r^2 = \\bar{\\omega}_r^2 (1 + i \\eta_r); \\quad \\bar{\\omega}_r^2 = \\frac{k_r}{m_r}; \\quad \\eta_r = \\beta + \\frac{\\gamma}{\\bar{\\omega}_r^2} \\] and the general FRF is written as\n\\begin{equation} \\alpha_{jk}(\\omega) = \\sum_{r=1}^N \\frac{\\psi_{jr}\\psi_{kr}}{(k_r - \\omega^2 m_r) + i \\eta_r k_r} \\end{equation}\nMDOF Systems with Structural (Hysteretic) Damping Free Vibration Solution - Complex Modal Properties We start by writing the general equation of motion for an MDOF system with hysteretic damping and harmonic excitation: \\[ [M] \\{\\ddot{x}\\} + [K]\\{x\\} +i[D]\\{x\\} = \\{F\\}e^{i\\omega t} \\]\nWe consider first the case where there is no excitation and assume a solution of the form \\[ \\{x\\} = \\{X\\} e^{i \\lambda t} \\] where \\(\\lambda\\) is complex.\nWe then obtain complex eigenvalues and eigenvectors.\nWe choose to write the \\(r^\\text{th}\\) eigenvalue as \\[ \\lambda_r^2 = \\omega_r^2(1 + i \\eta_r) \\] where \\(\\omega_r\\) is the natural frequency and \\(\\eta_r\\) is the damping loss factor for that mode. The natural frequency \\(\\omega_r\\) is not necessarily equal to the natural frequency of the undamped system \\(\\bar{\\omega}_r\\) although they are very close in practice.\nThe eigensolution can be seen to possess the same type of orthogonality properties as those demonstrated earlier for the undamped system: \\[ [\\Psi]^T[M][\\Psi] = [m_r] ; \\quad [\\Psi]^T[K + iD][\\Psi] = [k_r] \\]\nThe modal mass and stiffness parameters are now complex but still obey the relationship \\[ \\lambda_r^2 = \\frac{k_r}{m_r} \\] and we define the mass-normalized eigenvectors \\[ \\{\\phi\\}_r = \\frac{1}{\\sqrt{m_r}} \\{\\psi\\}_r \\]\nForced Response Solution - FRF Characteristics For the forced vibration analysis in the case of harmonic excitation and response, we obtain\n\\begin{equation} \\{X\\} = \\left( [K] + i[D] - \\omega^2[M] \\right)^{-1} \\{F\\} \\end{equation}\nBy multiplying both sides of the equation by the eigenvectors, we can write\n\\begin{equation} [\\alpha(\\omega)] = [\\Phi] [\\lambda_r^2 - \\omega^2]^{-1} [\\Phi]^T \\end{equation}\nFrom this full matrix equation, we have:\n\\begin{align*} \\alpha_{jk}(\\omega) \u0026amp;= \\sum_{r=1}^N \\frac{\\phi_{jr} \\phi_{kr}}{\\omega_r^2 - \\omega^2 + i \\eta_r \\omega_r^2}\\\\\\\n\u0026amp;= \\sum_{r=1}^N \\frac{\\psi_{jr} \\psi_{kr}}{m_r\\left(\\omega_r^2 - \\omega^2 + i \\eta_r \\omega_r^2\\right)}\\\\\\\n\u0026amp;= \\sum_{r=1}^N \\frac{{}_rA_{jk}}{\\omega_r^2 - \\omega^2 + i \\eta_r \\omega_r^2}\\\\\\\n\\end{align*}\nExcitation by a general Force Vector Operating deflection shape (ODS) Having derived an expression for the general term in the frequency response function matrix \\(\\alpha_{jk}(\\omega)\\), it is appropriate to consider next the analysis of a situation where the system is excited simultaneously at several points.\nThe general behavior for this case is governed by equation eq:force_response_eom with solution eq:force_response_eom_solution. However, a more explicit form of the solution is\n\\begin{equation} \\{X\\} = \\sum_{r=1}^N \\frac{\\{\\phi\\}_r^T \\{F\\} \\{\\phi\\}_r}{\\omega_r^2 - \\omega^2 + i \\eta_r \\omega_r^2} \\end{equation}\nThis equation permits the calculation of one or more individual responses to an excitation of several simultaneous harmonic forces (all of which must have the same frequency but may vary in magnitude and phase). The resulting vector of responses is sometimes referred to as force vibration mode, or more commonly, as an Operating Deflection Shape (ODS).\nPure mode excitation 1 - Damped system normal modes It is possible to choose the vector of individual forces such that the response of the structure is entirely controlled by a single normal mode of the structure.\n The normal modes are the characteristic modes of the structure in its actual (damped) state. While it is possible to talk of the modes \u0026ldquo;that the structure would have if the damping could be removed\u0026rdquo;, these are not the \u0026ldquo;normal\u0026rdquo; modes of the structures. The properties of the normal modes of the undamped system are of interest because in most cases of test-analysis comparison, the analytical model will be undamped and so there is a desired to be able to extract the test structures \u0026ldquo;undamped\u0026rdquo; modes from the test data in order to do a direct comparison between prediction and measurement.\n We are seeking an excitation vector \\(\\{F\\}\\) such that the response \\(\\{X\\}\\) consists of a single modal component so that all terms in eq:ods but one is zero. This can be attained if \\(\\{F\\}\\) is chosen such that \\[ \\{\\phi_r\\}^T \\{F\\}_s = 0, \\ r \\neq s \\]\nPure mode excitation 2 - Associated undamped system normal modes We here consider an excitation vector of mono-phased forces. We basically impose that all forces have the same frequency and phase. What is of interest in this case it to see that there exist conditions under which it is possible to obtain a similarly mono-phase response.\nLet the force and response vectors be represented by\n\\begin{align*} \\{f\\} \u0026amp;= \\{\\hat{F}\\} e^{i\\omega t} \\\\\\\n\\{x\\} \u0026amp;= \\{\\hat{X}\\} e^{i(\\omega t - \\theta)} \\end{align*}\nwhere both \\(\\{\\hat{F}\\}\\) and \\(\\{\\hat{X}\\}\\) are vectors of real quantities. Substituting these into the equation of motion leads to a complex equation which can be split into real and imaginary parts to give\n\\begin{align*} \\left( (-\\omega^2 [M] + [K]) \\cos \\theta + [D] \\sin \\theta \\right) \\{\\hat{X}\\} \u0026amp;= \\{\\hat{F}\\} \\\\\\\n\\left( (-\\omega^2 [M] + [K]) \\sin \\theta - [D] \\cos \\theta \\right) \\{\\hat{X}\\} \u0026amp;= \\{0\\} \\end{align*}\nWe can show that if we consider that the phase lag between all the forces and all the responses is exactly \\(\\SI{90}{\\degree}\\), the equation reduces to \\[ (-\\omega^2 [M] + [K])\\{\\hat{X}\\} = 0 \\] which is clearly the equation to be solved to find the undamped system natural frequencies and the mode shapes.\nThus we have the important results that it is always possible to find a set of mono-phased forces which will cause a mono-phased set of responses and, moreover, if these two sets are separated by exactly \\(\\SI{90}{\\degree}\\), then the frequency at which the system is vibrating is identical to one of its undamped natural frequencies and the displacement shape is the corresponding undamped mode shape.\nThis most important result is the basic for many of the multi-shaker test procedures used to isolate the undamped modes of the structures for comparison with theoretical predictions. The physics of the technique are quite simple: the force vector is chosen so that it exactly balances all the damping forces.\nPostscript It is often observed that the analysis for hysteretic damping is less than rigorous when applied to the free vibration situation, as we have done above. However, it is an admissible model of damping for describing harmonic forced vibration and this is the objective of most of our studies. Moreover, it is always possible to express each of the receptance expression either as a ratio of two polynomials or as a series of simple terms. Each of the terms in the series may be identified with one of the modes we have defined in the earlier free vibration analysis for the system. Thus, whether or not the solution is strictly valid for a free vibration analysis, we can usefully and confidently consider each of the uncoupled terms or modes as being a genuine characteristic of the system. As will be seen in the next section, the analysis required for the general case of viscous damping, which is more rigorous, is considerably more complicated than that used here which is, in effect, a very simple extension of the undamped case.\nMDOF systems with Viscous Damping Free vibration solution - Complex modal properties The general equation of motion for an MDOF system with viscous damping is\n\\begin{equation} [M] \\{\\ddot{x}\\} + [C]\\{\\dot{x}\\} + [K]\\{x\\} = \\{f\\} \\end{equation}\nWe first consider the case with no excitation, and consider solutions of the form \\[ \\{x\\} = \\{X\\} e^{st} \\]\nSubstituting this into the equation of motion gives \\[ \\left( s^2 [M] + s[C] + [K] \\right) \\{X\\} = \\{0\\} \\]\nThere are now \\(2N\\) eigenvalues \\(s_r\\) (as opposed to \\(N\\) values of \\(\\lambda_r^2\\) before) but these now occur in complex conjugate pairs. The eigenvectors also occur as complex conjugates. The eigensolution can thus be described as \\[ s_r, s_r^*, \\quad \\{\\psi\\}_r, \\{\\psi\\}_r^*;\\quad r = 1, N \\]\nEach eigenvalue \\(s_r\\) is expressed in the form \\[ s_r = \\omega_r \\left( -\\xi_r + i\\sqrt{1 - \\xi_r^2} \\right) \\] where \\(\\omega_r\\) is the natural frequency and \\(\\xi_r\\) is the critical damping ratio for that mode.\nOrthogonality equations can also be derived:\n\\begin{subequations} \\begin{align} (s_r + s_q) \\{\\psi\\}_q^T [M] \\{\\psi\\}_r + \\{\\psi\\}_q^T [C] \\{\\psi\\}_r \u0026amp;= 0 \\\\\\\ns_r s_q \\{\\psi\\}_q^T [M] \\{\\psi\\}_r - \\{\\psi\\}_q^T [K] \\{\\psi\\}_r \u0026amp;= 0 \\end{align} \\end{subequations}\nWhen the modes \\(r\\) and \\(q\\) are a complex conjugate pair: \\[ s_r = \\omega_r \\left( -\\xi_r - i\\sqrt{1 - \\xi_r^2} \\right); \\quad \\{\\psi\\}_q = \\{\\psi\\}_r^* \\]\nFrom equations eq:viscous_damping_orthogonality, we can obtain\n\\begin{subequations} \\begin{align} 2 \\omega_r \\xi_r \u0026amp;= \\frac{\\{\\psi\\}_r^H [C] \\{\\psi\\}_r}{\\{\\psi\\}_r^H [M] \\{\\psi\\}_r} = \\frac{c_r}{m_r} \\\\\\\n\\omega_r^2 \u0026amp;= \\frac{\\{\\psi\\}_r^H [K] \\{\\psi\\}_r}{\\{\\psi\\}_r^H [M] \\{\\psi\\}_r} = \\frac{k_r}{m_r} \\end{align} \\end{subequations}\nForced response solution Assuming a harmonic response \\(\\{x(t)\\} = \\{X\\} e^{i\\omega t}\\), we can write the forced response solution directly as \\[ \\{X\\} = \\big( [K] - \\omega^2 [M] + i\\omega [C] \\big)^{-1} \\{F\\} \\] but this expression is not particularly convenient for numerical applications.\nWe then seek a similar series expansion that was found for the undamped, proportionally-damped and hysteretically damped systems.\nThe obtain result is \\[ \\alpha_{jk}(\\omega) = \\sum_{r=1}^N \\frac{({}_rR_{jk}) + i (\\omega/\\omega_r)({}_rS_{jk})}{\\omega_r^2 - \\omega^2 + 2 i \\omega \\omega_r \\xi_r} \\] where the coefficients \\(R\\) and \\(S\\) are obtained from:\n\\begin{align*} \\{{}_rR_k\\} \u0026amp;= 2 \\left( \\xi_r \\text{Re}\\{{}_rG_k\\} - \\text{Im}\\{{}_rG_k\\} \\sqrt{1 - \\xi_r^2} \\right)\\\\\\\n\\{{}_rS_k\\} \u0026amp;= 2 \\text{Re}\\{{}_rG_k\\}\\\\\\\n\\{{}_rG_k\\} \u0026amp;= (\\theta_{kr}/a_r) \\{\\theta\\}_r \\end{align*}\nThe main difference with the result obtained with the proportional damping is in the frequency dependence of the numerator in case of viscous damping.\nComplex Modes Real and Complex modes, stationary and traveling waves We saw that we can obtain complex eigenvalues whose real part represents the decay and imaginary part the oscillatory component. We can also obtain complex eigenvectors which means that the mode shapes are complex.\n A complex mode is one in which each part of the structure has not only its own magnitude of vibration but also its own phase. As a result, each part of a structure which is vibrating in a complex mode will reach its own maximum deflection at a different instant in the vibration cycle to that of its neighbors.\n A real mode is one in which the phase angles are all identically \\(\\SI{0}{\\degree}\\) or \\(\\SI{180}{\\degree}\\) and which there has the property that all parts in the structure do reach their own maxima at the same time. Equally, in a real mode, all parts of the structure pass through their zero deflection position at the same instant so that there are two moments in each vibration cycle when the structure is completely un-deformed.\n While the real mode has the appearance of a standing wave, the complex mode is better described as exhibiting traveling waves (illustrated on figure fig:real_complex_modes).\n\n Figure 6: Real and complex mode shapes displays\n Another method of displaying modal complexity is by plotting the elements of the eigenvector on an Argand diagram, such as the ones shown in figure fig:argand_diagram. Note that the almost-real mode shape does not necessarily have vector elements with near \\(\\SI{0}{\\degree}\\) or near \\(\\SI{180}{\\degree}\\) phase, what matters are the relative phases between the different elements.\n\nTable 7: Complex mode shapes plotted on Argand diagrams Almost-real mode Complex Mode Measure of complexity width=\\linewidth width=\\linewidth width=\\linewidth Measurement of modal complexity There exist few indicators of the modal complexity. The first one, a simple and crude one, called MCF1 consists of summing all the phase differences between every combination of two eigenvector elements: \\[ \\text{MCF1} = \\sum_{j=1}^N \\sum_{k=1 \\neq j}^N (\\theta_{rj} - \\theta_{rk}) \\]\nThe second measure is shown on figure fig:argand_diagram_c where a polygon is drawn around the extremities of the individual vectors. The obtained area of this polygon is then compared with the area of the circle which is based on the length of the largest vector element. The resulting ratio is used as an indication of the complexity of the mode, and is defined as MCF2.\nOrigins of complex modes Complex modes occur in practice for variety of physical reasons as well as poor measurement or analysis:\n The types of modes which are referred to as operating deflection shapes will frequently exhibit the relative phases differences between responses of adjacent parts of the structure which indicate a complex mode. Complex normal modes can exist even in simple structures which contain rotating components that are prone to gyroscopic forces. However, normal modes of non-rotating linear structures can be complex only if the damping is distributed in a non-proportional way. This situation can arise quite readily in practice because while the internal (hysteresis) damping of most structural elements is distributed in a way which is essentially proportional to the stiffness distribution, the majority of the damping in real structures is generally found to be concentrated at the joints between components of a structural assembly and this does not usually result in a proportional distribution. Another ingredient is found to be necessary to generate significant complexity in a structure\u0026rsquo;s mode and that is the requirement that two or mode of its modes are close. Close modes are those whose natural frequencies are separated by an amount which is less than the prevailing damping in either or both modes. Characteristics of MDOF FRF data A note about natural frequencies The basic definition derives from the undamped system\u0026rsquo;s eigenvalues which yield the frequencies at which free vibration of the system can take place. These undamped system natural frequencies are given by the square roots of the eigenvalues and are identified by the symbol \\(\\bar{\\omega}_r\\). This occurs in expressions for both free and forced vibration response: \\[ x(t) = \\sum_{r=1}^N x_r e^{i\\bar{\\omega}_r t}; \\quad \\alpha(\\omega) = \\sum_{r=1}^N \\frac{A_r}{\\bar{\\omega}_r^2 - \\omega^2} \\]\nFor damped systems, two alternative characteristics frequency are defined:\n \\(\\omega_r^\\prime\\) for free vibration \\(\\omega_r\\) for forced vibration The former constitutes the oscillatory part of the free vibration characteristic which, being complex, contains an exponential decay term as well: \\[ x(t) = \\sum_{r=1}^N x_r e^{-a_r t} e^{i \\omega_r^\\prime t} \\] where \\(\\omega_r^\\prime\\) may not be identical to \\(\\bar{\\omega}_r\\) depending on the type and distribution of the damping.\nThe second definition comes from the general form of the FRF expression: \\[ \\alpha(\\omega) = \\sum_{r=1}^N \\frac{C_r}{\\omega_r^2 - \\omega^2 + i D_r} \\] Here \\(C_r\\) may be complex whereas \\(D_r\\) is real. \\(\\omega_r\\) is in general different to both \\(\\bar{\\omega}_r\\) and \\(\\omega_r^\\prime\\).\nTable tab:frf_natural_frequencies summarizes all the different cases.\n\nTable 8: FRF Formulae and Natural Frequencies Case C D Free \\(\\omega_r^\\prime\\) Forced \\(\\omega_r\\) Undamped \\(\\mathbb{R}\\) 0 \\(\\bar{\\omega}_r\\) \\(\\bar{\\omega}_r\\) Prop. Hyst. \\(\\mathbb{R}\\) \\(\\mathbb{R}\\) \\(\\bar{\\omega}_r\\) \\(\\bar{\\omega}_r\\) Prop. Visc. \\(\\mathbb{R}\\) \\(\\mathbb{R}\\) (\\(\\omega\\)) \\(\\omega_r\\sqrt{1-\\xi_r^2}\\) \\(\\bar{\\omega}_r\\) Gen. Hyst. \\(\\mathbb{C}\\) \\(\\mathbb{R}\\) \\(\\omega_r\\) \\(\\omega_r\\) Gen. Visc. \\(\\mathbb{C}\\) (\\(\\omega\\)) \\(\\mathbb{R}\\) (\\(\\omega\\)) \\(\\omega_r\\sqrt{1-\\xi_r^2}\\) \\(\\omega_r\\) Mobility and Impedance FRF Parameters As well as for SDOF systems, there are three main forms of FRF: using displacement (receptance), velocity (mobility) or acceleration (inertance) response. There exist a further three formats for FRF data, these being the inverses of the standard receptance, mobility and inertance: the dynamic stiffness, mechanical impedance and apparent mass, respectively.\nHowever, for MDOF systems it is usually not feasible to measure the inverse properties. In general, we can determine the response of a structure to an excitation using the equation \\[ {\\dot{X}} = [Y(\\omega)] \\{F\\} \\] Equally, we can write the inverse equation using impedance instead of mobilities: \\[ \\{F\\} = [Z(\\omega)] \\{V\\} \\]\nThe problem arises because the general element in the mobility matrix \\(Y_{ik}(\\omega)\\) is not simply related to its counterpart in the impedance matrix \\(Z_{ik}(\\omega)\\) as was the case for SDOF systems (\\(Y_{ik}(\\omega) = Z_{jk}^{-1}(\\omega)\\)).\nThe reason for this is that \\[ Y_{kj}(\\omega) = \\left( \\frac{V_k}{F_j} \\right)_{F_l = 0}; \\quad Z_{jk}(\\omega) = \\left( \\frac{F_j}{V_k} \\right)_{V_l = 0}; \\ l \\neq k \\]\nThus, the measure of impedance property demands that all DOFs expect one are grounded which is almost impossible in practice. The only types of FRF which we can expect to measure directly are the mobilities.\nDisplay for Undamped System FRF data Construction of FRF plots for 2DOF system We can envisage the form which the total FRF curve will take as it is simply the summation of all the individual terms. However, the exact shape of the curve also depends on the phase of each term. Then the addition of various components is made to determine the complete receptance expression, the signs of the various terms are obviously of considerable importance.\nLet\u0026rsquo;s consider an example with two modes. We write \\(\\alpha_{11}\\) the point FRF and \\(\\alpha_{21}\\) the transfer FRF:\n\\begin{align*} \\alpha_{11}(\\omega) \u0026amp;= \\frac{0.5}{\\omega_1^2 - \\omega^2} + \\frac{0.5}{\\omega_2^2 - \\omega^2} \\\\\\\n\\alpha_{21}(\\omega) \u0026amp;= \\frac{0.5}{\\omega_1^2 - \\omega^2} - \\frac{0.5}{\\omega_2^2 - \\omega^2} \\end{align*}\nIt can be seen that the only difference between the point and transfer receptance is in the sign of the modal constant of the second mode.\nConsider the first point mobility (figure fig:mobility_frf_mdof_point), between the two resonances, the two components have opposite signs so that they are substractive rather than additive, and indeed, at the point where they cross, their sum is zero. On a logarithmic plot, this produces the antiresonance characteristic which reflects that of the resonance.\n\nTable 9: Mobility FRF plot for undamped 2DOF system Point FRF Transfer FRF width=\\linewidth width=\\linewidth For the plot in figure fig:mobility_frf_mdof_transfer, between the two resonances, the two components have the same sign and they add up, no antiresonance is present.\nFRF modulus plots for MDOF systems The same principle may be extended to any number of DOF. The fundamental rule is that if two consecutive modes have the same sign for the modal constants, then there will be an antiresonance at some frequency between the natural frequency of the two modes. If they have apposite signs, there will not be an antiresonance.\nDisplay of FRF Data for Damped systems Bode plots The resonances and antiresonances are blunted by the inclusion of damping, and the phase angles are no longer exactly \\(\\SI{0}{\\degree}\\) or \\(\\SI{180}{\\degree}\\), but the general appearance of the plot is a natural extension of that for the system without damping. Figure fig:frf_damped_system shows a plot for the same mobility as appears in figure fig:mobility_frf_mdof_point but here for a system with added damping.\nMost mobility plots have this general form as long as the modes are relatively well-separated.\nThis condition is satisfied unless the separation between adjacent natural frequencies is of the same order as, or less than, the modal damping factors, in which case it becomes difficult to distinguish the individual modes.\n\n Figure 7: Mobility plot of a damped system\n Nyquist diagrams Each of the frequency response of a MDOF system in the Nyquist plot is composed of a number of SDOF components.\nFigure fig:nyquist_point shows the result of plotting the point receptance \\(\\alpha_{11}\\) for the 2DOF system described above.\nThe plot for the transfer receptance \\(\\alpha_{21}\\) is presented in figure fig:nyquist_transfer where it may be seen that the opposing signs of the modal constants of the two modes have caused one of the modal circle to be in the upper half of the complex plane.\n\nTable 10: Nyquist FRF plot for proportionally-damped system Point receptance Transfer receptance width=\\linewidth width=\\linewidth In the two figures fig:nyquist_nonpropdamp_point and fig:nyquist_nonpropdamp_transfer, we show corresponding data for non-proportional damping. In this case, a relative phase has been introduced between the first and second elements of the eigenvectors: of \\(\\SI{30}{\\degree}\\) in mode 1 and of \\(\\SI{150}{\\degree}\\) in mode 2. Now we find that the individual modal circles are no longer \u0026ldquo;upright\u0026rdquo; but are rotated by an amount dictated by the complexity of the modal constants.\n\nTable 11: Nyquist FRF plot for non-proportionally-damped system Point receptance Transfer receptance width=\\linewidth width=\\linewidth Non-Sinusoidal vibration and FRF properties With receptance and other FRF data, we have a means of computing the response of a MDOF system to an excitation which consists of a set of harmonic forces of different amplitudes and phases but all of the same frequency. In the general case we can simply write \\[ \\{X\\} e^{i\\omega t} = [\\alpha(\\omega)] \\{F\\} e^{i\\omega t} \\]\nPeriodic vibration Periodic signals as Fourier series Let\u0026rsquo;s first consider the case of periodic vibration, in which the excitation (and thus the response) is not simply sinusoidal although it has a property of periodicity.\nThe easiest way of computing the responses in such a case is by mean of the Fourier Series.\nThe basic principle of Fourier analysis is that any periodic function can be represented by a series of sinudoids of suitable frequencies, amplitudes and phases based on the fundamental period \\(T\\):\n\\begin{equation} \\tcmbox{f_0(t) = \\sum_{n=1}^\\infty {}_0F_n e^{i\\omega_n t}; \\quad \\omega_n = \\frac{2 \\pi n}{T}} \\end{equation}\nOnce a frequency decomposition of the forcing function has been obtained, we may use the corresponding FRF data, computed at the specific frequencies present in the forcing spectrum, in order to compute the corresponding frequency components of the responses of interest:\n\\begin{equation} \\tcmbox{x_j(t) = \\sum_{n=1}^\\infty \\alpha_{j0}(\\omega_n) {}_0F_ne^{i\\omega_n t}; \\quad \\omega_n = \\frac{2 \\pi n}{T}} \\end{equation}\nTo derive FRF from periodic vibration signals It is possible to determine a system\u0026rsquo;s FRF properties from excitation and response measurements when the vibration is periodic. To do this, it is necessary to determine the Fourier Series components of both the input force signal and of the relevant output response signal. Both these series will contain components at the same set of discrete frequencies; these being integer multiples of \\(2\\pi/T\\).\nOne these two series are available, the FRF can be defined at the same set of frequency points by computing the ratio of the response component to the input component.\nTransient vibration Analysis via Fourier transform For most transient cases, the input function \\(f(t)\\) will satisfy the Dirichlet condition and so its Fourier Transform \\(F(\\omega)\\) can be computed from eq:fourier_transform.\n\\begin{equation} F(\\omega) = \\frac{1}{2 \\pi} \\int_{-\\infty}^\\infty f(t) e^{i\\omega t} dt \\end{equation}\nNow, at any frequency \\(\\omega\\), the corresponding Fourier Transform of the response \\(X(\\omega)\\) can be determined from\n\\begin{equation} \\tcmbox{X(\\omega) = H(\\omega) F(\\omega)} \\end{equation}\nwhere \\(H(\\omega)\\) represents the appropriate version of the FRF for the particular input and output parameters considered.\nWe may then derive an expression for the response itself \\(x(t)\\) from the Inverse Fourier Transform of \\(X(\\omega)\\)\n\\begin{equation} \\tcmbox{x(t) = \\int_{-\\infty}^\\infty \\left(H(\\omega) F(\\omega)\\right)e^{i\\omega t}d\\omega} \\end{equation}\nResponse via time domain This alternative analysis is referred to as convolution and is based on the ability to compute the response of a system to a simple unit impulse.\nLet consider a unit impulse excitation applied at \\(t = t^\\prime\\) with infinite magnitude and that lasts for an infinitesimal period of time although the area underneath it is equal to unity. The response of a system to such an excitation at \\(t\u0026gt;t^\\prime\\) is defined as the system\u0026rsquo;s unit Impulse Response Function (IRF) and has a direct relationship to the Frequency Response Function.\nThe IRF is written has \\[ h(t - t^\\prime) \\]\nIf we now consider a more general transient excitation, we see that it is possible to represent this as the superposition of several impulses, each of magnitude \\(f(t^\\prime)dt^\\prime\\) and occurring at different instants in time. The response of a system at time \\(t\\) to just one of these incremental impulses at time \\(t^\\prime\\) is \\[ \\delta x (t) = h(t - t^\\prime) f(t^\\prime) dt^\\prime \\] and the total response of the system will be given by superimposing or integrating all the incremental responses as follows \\[ x(t) = \\int_{-\\infty}^\\infty h(t-t^\\prime) f(t^\\prime) dt^\\prime; \\quad h(t-t^\\prime) = 0, \\ t \\leq t^\\prime \\]\nThere is a very close relationship between \\(H(\\omega)\\) and \\(h(t - t^\\prime)\\). Let\u0026rsquo;s use the Fourier Transform approach to compute the response of a system to a unit impulse. Thus, let \\(f(t) = \\delta(0)\\) and determine its Fourier Transform \\(F(\\omega)\\): \\[ F(\\omega) = \\frac{1}{2 \\pi} \\int_{-\\infty}^\\infty \\delta(0) e^{i\\omega t} dt = \\frac{1}{2\\pi} \\] Then \\[ x(t) = \\frac{1}{2\\pi} \\int_{-\\infty}^{\\infty} H(\\omega) e^{i\\omega t} d\\omega \\triangleq h(t) \\]\nThus, we find that the Impulse and Frequency Response Functions constitute a Fourier Transform pair.\nTo derive FRF from transient vibration signals In order to obtain the structure\u0026rsquo;s FRF properties using a transient vibration test, the calculation of the Fourier transforms of both the excitation and the response signals is required. Then, the ratio of these two function can be computed\n\\begin{equation} H(\\omega) = \\frac{X(\\omega)}{F(\\omega)} \\end{equation}\nThis can be done provided that the time period of the measurement both excitation and response signals are effectively zero at the start and the end of the sample.\nRandom vibration Random signals in time and frequency domains We here consider both excitation and response described by random processes. Neither excitation nor response signals can be subjected to a valid Fourier Transform calculation as they violate the Dirichlet condition.\nIt is necessary to introduce the Correlation Function and the Spectral Densities.\n The Autocorrelation Function \\(R_{ff}(\\tau)\\) of a random vibration parameter \\(f(t)\\), is defined as the expected value of the product \\(f(t) f(t + \\tau)\\) computed along the time axis. This will always be a real and even function of time, and is written\n\\begin{equation} R_{ff}(\\tau) = E[f(t) f(t + \\tau)] \\label{eq:autocorrelation} \\end{equation}\n This correlation function, unlike the original quantity \\(f(t)\\) does satisfy the requirements for Fourier transformation and thus we can obtain its Fourier Transform by the usual equation.\nThe resulting parameter we shall call a Spectral Density, in this case the Auto or Power Spectral Density (PSD) \\(S_{ff}(\\omega)\\).\n \\begin{equation} S_{ff}(\\omega) = \\frac{1}{2\\pi} \\int_{-\\infty}^\\infty R_{ff}(\\tau) e^{-i \\omega \\tau} d\\tau \\label{eq:powerspectraldensity} \\end{equation}\n The Spectral Density is a real and even function of frequency, and does in fact provides a description of the frequency composition of the original function \\(f(t)\\). It has units of \\(f^2/\\omega\\).\nExamples of random signals, autocorrelation function and power spectral density are shown on figure fig:random_signals.\n\nTable 12: Random signals Time history Autocorrelation Function Power Spectral Density width=\\linewidth width=\\linewidth width=\\linewidth A similar concept can be applied to a pair of functions such as \\(f(t)\\) and \\(x(t)\\) to produce cross correlation and cross spectral density functions.\n The cross correlation function \\(R_{xf}(\\tau)\\) between functions \\(f(t)\\) and \\(x(t)\\) is defined as\n\\begin{equation} R_{xf}(\\tau) = E[x(t) f(t + \\tau)] \\label{eq:crosscorelation} \\end{equation}\n The Cross Spectral Density (CSD) is defined as the Fourier Transform of the Cross Correlation function:\n\\begin{equation} S_{xf}(\\omega) = \\frac{1}{2\\pi} \\int_{-\\infty}^\\infty R_{xf}(\\tau) e^{-i \\omega \\tau} d\\tau \\label{eq:cross_spectral_density} \\end{equation}\n Cross correlation functions are real, but not always even, functions of time, and cross spectral densities, unlike auto spectral densities, are generally complex functions of frequency with the particular conjugate property that \\[ S_{xf}(\\omega) = S_{fx}^*(\\omega) \\]\nThe analysis to obtain the input/output relationships for systems undergoing random vibrations is based on the general excitation/response relationship in the time domain: \\[ x(t) = \\int_{-\\infty}^\\infty h(t - t^\\prime) f(t^\\prime) dt^\\prime \\]\nUsing this property, it is possible to derive an expression for $x(t) and for \\(x(t - \\tau)\\) and thus to calculate the response autocorrelation \\(R_{xx}(\\tau)\\) \\[ R_{xx}(\\tau) = E[x(t) x(t + \\tau)] \\]\nThis equation can be manipulated to describe the response autocorrelation in terms of the corresponding property of the excitation \\(R_{ff}\\), but the result is complicated. However, the same equation can be transform to the frequency domain\n\\begin{equation} \\tcmbox{ S_{xx}(\\omega) = \\left| H(\\omega) \\right|^2 S_{ff}(\\omega) } \\end{equation}\nAlthough very convenient, equation eq:psd_input_output does not provide a complete description of the random vibration conditions. Further, it is clear that is could not be used to determine the FRF from measurement of excitation and response because it contains only the modulus of \\(H(\\omega)\\), the phase information begin omitted from this formula.\nA second equation is required and this may be obtain by a similar analysis, two alternative formulas can be obtained eq:cross_relation_alternatives.\n \\begin{subequations} \\begin{align} S_{fx}(\\omega) \u0026amp;= H(\\omega) S_{ff}(\\omega) \\\\\\\nS_{xx}(\\omega) \u0026amp;= H(\\omega) S_{xf}(\\omega) \\end{align} \\end{subequations}\n To derive FRF from random vibration signals The pair of equations eq:cross_relation_alternatives provides the basic of determining a system\u0026rsquo;s FRF properties from the measurements and analysis of a random vibration test. Using either of them, we have a simple formula for determining the FRF from estimates of the relevant spectral densities eq:frf_estimates_spectral_densities.\n \\begin{subequations} \\begin{align} H(\\omega) \u0026amp;= \\frac{S_{fx}(\\omega)}{S_{ff}(\\omega)} = H_1(\\omega)\\label{eq:H1} \\\\\\\nH(\\omega) \u0026amp;= \\frac{S_{xx}(\\omega)}{S_{xf}(\\omega)} = H_2(\\omega)\\label{eq:H2} \\end{align} \\end{subequations}\n The existence of two equations presents an opportunity to check the quality of calculations made using measured data.\nInstrumental variable model for FRF There are difficulties to implement some of the above formulae in practice because of noise and other limitations concerned with the data acquisition and processing.\nOne technique involves three quantities, rather than two, in the definition of the output/input ratio. The system considered can best be described with reference to figure fig:frf_determination which shows first in fig:frf_siso_model the traditional single-input single-output model upon which the previous formulae are based. Then in fig:frf_feedback_model is given a more detailed and representative model of the system which is used in a modal test.\n\nTable 13: System for FRF determination Basic SISO model SISO model with feedback width=\\linewidth width=\\linewidth In this configuration, it can be seen that there are two feedback mechanisms which apply. We then introduce an alternative formula which is available for the determination of the system FRF from measurements of the input and output quantities eq:H3.\n \\begin{equation} H(\\omega) = \\frac{S_{x^\\prime v}(\\omega)}{S_{f^\\prime v(\\omega)}} = H_3(\\omega) \\end{equation}\nwhere \\(v\\) is a third signal in the system.\n Derivation of FRF from MIMO data A diagram for the general n-input case is shown in figure fig:frf_mimo.\nWe obtain two alternative formulas:\n\\begin{subequations} \\begin{align} \\left[ H_{xf}(\\omega) \\right]_{n \\times n} \u0026amp;= \\left[ S_{x^\\prime v}(\\omega) \\right]_{n \\times n} \\left[ S_{f^\\prime v}(\\omega) \\right]_{n \\times n}^{-1} \\\\\\\n\\left[ H_{xf}(\\omega) \\right]_{n \\times n} \u0026amp;= \\left[ S_{f^\\prime f^\\prime}(\\omega) \\right]_{n \\times n}^{-1} \\left[ S_{x^\\prime f^\\prime}(\\omega) \\right]_{n \\times n} \\end{align} \\end{subequations}\nIn practical application of both of these formulae, care must be taken to ensure the non-singularity of the spectral density matrix which is to be inverted, and it is in this respect that the former version may be found to be more reliable.\n\n Figure 8: System for FRF determination via MIMO model\n Complete and Incomplete models Some definitions Most of the preceding theory has been concerned with complete models; that is, the analysis has been presented for an \\(N\\) degree-of-freedom system with the implicit assumption that all the mass, stiffness and damping properties are known and that all the elements in the eigenmatrices and the FRF matrix are available. While this is a valid approach for a theoretical study, it is less generally applicable for experimentally-based investigations where it is not usually possible to measure all the DOFs, or to examine all the modes possessed by a structure. Because of this limitation, it is necessary to extend our analysis to examine the implications of having access to something less than a complete set of data, or model, and this leads us to the concept of a reduced or incomplete type of model.\n There are different types of incomplete models:\n There is the model which is reduced in size (from \\(N\\) to \\(n\\)) by simply deleting information about certain degrees-of-freedom. This process leads to a reduced model which retains full accuracy for the DOFs which are retained, but which looses access to those which have been deleted. The process can be applied only to the modal and response models and results in a modal model described by an \\(N\\times N\\) eigenvalue matrix but by an eigenvector matrix which is only \\(n\\times N\\). The corresponding response model is an incomplete FRF matrix of size \\(n \\times n\\), although all the elements of that reduced matrix are themselves fully accurate. Another type of reduced model is one in which the number of modes is reduced as well (from \\(N\\) to \\(m\\)), so that the eigenvalue matrix is only \\(m \\times m\\) in size. A consequence of this is that the elements in the reduced \\(n \\times n\\) FRF matrix in this case are only approximate. Another type of model reduction can be achieved by condensation from \\(N\\) to \\(n\\) DOFs. This is a process in which a number of DOFs are again eliminated from the complete description but an attempt is made to include the effects of the masses and stiffnesses which are thereby eliminated in the retained DOFs. This is the condensation process which is applied in the Guyan and other reduction techniques used to contain the size of otherwise very large finite element models. In such a condensed model, the spatial, modal and response models are all reduced to \\(n \\times n\\) matrices, and it must be noted that the properties of each are approximate in every respect. Incomplete Response models There are two ways in which a model can be incomplete: by the omission of some modes, and/or by the omission of some degrees-of-freedom.\nOmission of some DOFs Consider first the complete FRF matrix which is \\(N \\times N\\): \\[ \\left[ H(\\omega) \\right]_{N \\times N} \\] and then suppose that we decide to limit our description of the system to include certain DOFs only. Our reduced response model is now \\[ \\left[ H^R(\\omega) \\right]_{n \\times n} \\]\nNow it is clear that we have not altered the basic system, and it still has the same number of degrees-of-freedom even though we have foregone our ability to describe the system\u0026rsquo;s behavior at all of them. In this case, the elements which remain in the reduced FRF matrix are identical to the corresponding elements in the full \\(N \\times N\\) matrix.\nAt this point, it is appropriate to mention the consequences of this type of reduction on the impedance type of FRF data. The impedance matrix which corresponds to the reduced model defined by \\([H^R]\\) will be denoted as \\([Z^R]\\) and it is clear that \\[ [Z^R(\\omega)] = [H^R(\\omega)]^{-1} \\]\nIt is also clear that the elements in the reduced impedance matrix such as \\(Z_{jk}^R\\) are not the same quantities as the corresponding elements in the full impedance matrix, and indeed, a completely different impedance matrix applied to each specific reduction: \\[ H_{ij}^R(\\omega) = H_{ij}(\\omega); \\quad Z_{ij}(\\omega) \\neq Z_{ij}(\\omega) \\]\nWe can also consider the implications of this form of reduction on the other types of model, namely the modal model and the spatial model. For the modal model, elimination of the data pertaining to some of the DOFs results in a smaller eigenvector matrix, which then becomes rectangular of order \\(n \\times N\\). The corresponding eigenvalue matrix is still \\(N \\times N\\) because we still have all \\(N\\) modes included.\nFor the spatial model, it is more difficult to effect a reduction of this type. It is clearly not realistic simply to remove the rows and columns corresponding to eliminated DOFs from the mass and stiffness matrices as this would represent a drastic change to the system. It is possible, however, to reduce these spatial matrices by a number of methods which have the effect of redistributing the mass and stiffness properties which relate to the redundant DOFs among those which are retained. In this way, the total mass of the structure, and its correct-stiffness properties can be largely retained. The Guyan reduction procedure is perhaps the best known of this type. Such reduced spatial properties will be denoted as \\[ \\left[M^R\\right], \\ \\left[K^R\\right] \\]\nOmission of some modes Let\u0026rsquo;s consider the other form of reduction in which only \\(m\\) of the \\(N\\) modes of the system are included. Frequently, this is a necessary approach in that many of the high-frequency modes will be of little interest and almost certainly very difficult to measure. Consider first the FRF matrix and include initially all the DOFs but suppose that each element in the matrix is computed using only \\(m\\) of the \\(N\\) terms in the summation \\[ \\tilde{H}_{jk}(\\omega) = \\sum_{r=1}^{m\\leq N} \\frac{{{}_rA_{jk}}}{\\omega_r^2 - \\omega^2 + i \\eta_r \\omega_r^2} \\] In full, we can write the FRF matrix as \\[ \\left[\\tilde{H}(\\omega)\\right]_{N\\times N} = \\left[\\Phi\\right]_{N \\times m} \\left[\\lambda_r^2 - \\omega^2\\right]_{m \\times m}^{-1} \\left[\\Phi\\right]_{m \\times N}^T \\]\nCombination of both reduction Of course, both types of reduction can be combined, the resulting matrix obtained would be \\[ \\left[ \\hat{H}^R(\\omega) \\right]_{n \\times n} \\] However, \\([\\hat{H}^R(\\omega)]\\) will in general be rank deficient, and thus is will not be possible to obtain the impedance matrix by numerical inversion. In order to overcome this problem, it is often convenient to add a constant or residual term to each FRF: \\[ [H(\\omega)] = [\\hat{H}(\\omega)] + [R] \\]\nIncomplete modal and spatial models It has been shown that the orthogonality properties of the modal model provide a direct link between the modal and the spatial model: \\[ [\\Phi]^T [M] [\\Phi] = [I]; \\quad [\\Phi]^T [K] [\\Phi] = [\\omega_r^2] \\] Which can be inverted to yield\n\\begin{subequations} \\begin{align} [M] \u0026amp;= [\\Phi]^{-T}[\\Phi]^{-1}\\\\\\\n[K] \u0026amp;= [\\Phi]^{-T}[\\omega_r^2][\\Phi]^{-1} \\end{align} \\end{subequations}\nIf the modal model is incomplete, then we can note the implications for the orthogonality properties.\nFirst, if we have a modal incompleteness (\\(m\u0026lt;N\\) modes included), then we can write:\n\\begin{subequations} \\begin{align} [\\Phi]_{m\\times N}^T [M] [\\Phi]_{N\\times m} \u0026amp;= [I]_{m\\times m}\\\\\\\n[\\Phi]_{m\\times N}^T [K] [\\phi]_{N\\times m} \u0026amp;= [\\omega_r^2]_{m\\times m} \\end{align} \\end{subequations}\nHowever, if we have spatial incompleteness (only \\(n\u0026lt;N\\) DOFs included), then we cannot express any orthogonality properties at all because the eigenvector matrix is not commutable with the system mass and stiffness matrices.\nIn both reduced-model cases, it is not possible to use equation eq:spatial_model_from_modal to re-construct the system mass and stiffness matrices. First of all because the eigen matrices are generally singular and even if it is not, the obtained mass and stiffness matrices produced have no physical significance and should not be used.\nSensitivity of models Introduction The sensitivity of a model describe the rates of change of some of the key properties, such as the natural frequencies and mode shapes, with small changes in some of the modal parameters, such as individual masses of stiffnesses.\n The model sensitivities are required for various purposes:\n they help to locate errors in models the are useful in guiding design optimization procedures they are used in the course of curve-fitting for the purposes of testing the reliability of the modal analysis processes Modal sensitivities The most commonly used sensitivities are those which describe the rates of change of the modal parameters with the individual mass and stiffness elements in the spatial model. These quantities are defined as follows: \\[ \\frac{\\partial \\omega_r}{\\partial p} \\text{ and } \\frac{\\partial \\{\\phi\\}_r}{\\partial p} \\] where \\(p\\) represents any variable of interest\nSDOF system It is useful to approach the general expressions for these parameters via a simple example based on an undamped SDOF system. We can introduce the concept of sensitivity through the basic SDOF system comprising mass \\(m\\) and spring \\(k\\). We can define the basic sensitivities of the system\u0026rsquo;s natural frequency \\(\\omega_0\\): \\[ \\frac{\\partial \\omega_0}{\\partial m} \\text{ and } \\frac{\\partial \\omega_0}{\\partial k} \\]\nWe can show that: \\[ \\frac{\\partial \\omega_0^2}{\\partial m} = \\frac{-\\sqrt{k}}{m^2} ; \\quad \\frac{\\partial \\omega_0}{\\partial k} = \\frac{1}{2 \\sqrt{km}} \\]\nMDOF systems - eigenvalue sensitivity We can differentiate the following equation of motion of a MDOF system with respect to an arbitrary variable \\(p\\) that might be an individual mass \\(m_i\\) of stiffness \\(k_j\\). \\[ \\left( [K] - \\omega_r^2 [M] \\right) \\{\\phi\\}_r = \\{0\\} \\]\nWe then obtain \\[ \\frac{\\partial \\omega_r^2}{\\partial p} = \\{\\phi\\}_r^T \\left( \\frac{\\partial [K]}{\\partial p} - \\omega_r^2 \\frac{\\partial [M]}{\\partial p} \\right) \\{\\phi\\}_r \\]\nMDOF systems - eigenvector sensitivity A similar analysis can be made for the eigenvector sensitivity terms.\nFRF sensitivities It may be seen it is also possible to derive FRF sensitivities.\nIf we consider first the simple SDOF system with a receptance FRF \\(\\alpha(\\omega)\\) \\[ \\alpha(\\omega) = \\frac{1}{k + i \\omega c - \\omega^2 m} \\] We can differentiate this with respect to \\(m\\) and \\(k\\).\nThe same can be done with the more general case for \\(MDOF\\) system as follows: \\[ \\frac{\\partial [\\alpha(\\omega)]}{\\partial p} = [\\alpha(\\omega)] \\left( \\frac{\\partial [K]}{\\partial p} + i \\omega \\frac{\\partial [C]}{\\partial p} - \\omega^2\\frac{\\partial [M]}{\\partial p} \\right) [\\alpha(\\omega)] \\]\nModal sensitivities from FRF data There exists the possibility of deriving certain sensitivity parameters directly from FRF data such as can be measured in a modal test. Essentially, it is possible to derive expressions for the eigenvalue sensitivities to selected individual mass and stiffness parameters by analyzing the point FRF properties at the selected DOFs.\nFRF Measurement Techniques Introduction and Test Planning Introduction There are two types of vibration measurement:\n those in which just the response level is measured those in which both input and response output parameters are measured Recalling the basic relationship: \\[ \\tcmbox{ \\text{response} = \\text{properties} \\times \\text{input} } \\]\nWe can see that only when two of the three terms in this equation have been measured, we can defined completely what is going on in the vibration of the test object. If we measure only the response, then we are unable to say whether a particularly large response level is due to a strong excitation or to a resonance of the structure.\nFor the second type of vibration measurement, both the excitation and the response are measured simultaneously so that basic equation can be used to deduce the system properties.\nOur interest will first be on the mobility measurements or FRF measurements where the excitation is applied at a single point. In that case, FRF data are directly obtained by \u0026ldquo;dividing\u0026rdquo; the measured responses by the measured excitation force.\nResponses obtained using several simultaneous excitations yield Operation Deflection Shapes (ODSs) from which it is necessary to extract the required FRF data by sometimes complicated analysis procedures. These are referred to as MIMO tests.\nTest Planning It is clear that there will need to be an extensive test planning phase before full-scale measurements are made an decisions taken concerning the methods of excitation, signal processing and data analysis, as well as the proper selection of which data to measure, where to excite the structure and how to prepare and support it for those measurements.\nChecking the quality of the measured data Signal Quality It is sometimes found that the dynamic range of the measured quantities is extreme, especially when the frequency range being covered is wide. What often happens is that there is a very large component of signal in one frequency range that dictates the gain settings on amplifiers and analysers such that lower-level components are difficult to measure accurately.\nSignal fidelity This arise when the signals obtained do not truly represent the quantity which is to be measured. For example, large motion perpendicular to the measurement axis can contaminate the measurement and gives misleading indications.\nOne should verify that the labeling and the connection of transducers are correct. This can be check by looking at the pattern of resonances visible on the FRF curves:\n for excitation and response at the same DOF, resonances and anti-resonances must alternate excitation and response points which are well separated on the test structure will tend to possess fewer anti-resonances Measurement repeatability One essential check for any modal test is the repeatability of the measurements. Certain FRF should be re-measured from time to time, just to check that neither the structure nor the measurement system have experienced any significant changes.\nMeasurement reliability We here seek to establish that the measured data are independent of the measuring system. One should measure the same quantity (usually an FRF) with a slightly different setup, or procedure such as a different excitation signal. These checks are very important to demonstrate the underlying validity of the measurement method being used.\nMeasured data consistency, including reciprocity The various FRF data measured on a given structure should exhibit consistency, by which is meant that the underlying natural frequencies, damping factors and mode shapes visible in the FRF data must all derive from a common modal model.\nThe reciprocity expected to exist between FRFs such as \\(H_{jk}\\) and \\(H_{kj}\\) should be checked and found to be at an acceptable level.\nBasic Measurement System The experimental setup used for mobility measurement contains three major items:\n An excitation mechanism. This contains a source for the excitation signal (sinusoidal, periodic, random, transient), a power amplifier and a exciter (usually a shaker or an hammer) A transduction system. For the most part, piezoelectric transducer are used, although lasers and strain gauges are convenient because of their minimal interference with the test object. Conditioning amplifiers are used depending of the transducer used An analyzer A typical layout for the measurement system is shown on figure fig:general_frf_measurement_setup.\n\n Figure 9: General layout of FRF measurement system\n Structure preparation Free supports By \u0026ldquo;free\u0026rdquo; is meant that the test object is not attached to ground at any of its coordinates and is, in effect, freely suspended in space. In this condition, the structure will exhibit rigid body modes which are determined solely by its mass and inertia properties and in which there is no bending or flexing at all. Six rigid body modes are then obtained with a natural frequency of \\(\\SI{0}{Hz}\\). Mass and inertial properties can then be measured with such a support.\nHowever, in practice it is not feasible to provide a truly free support. Approximate to the free condition can be achieved by supporting the testpiece on very soft springs such that the frequency of the rigid body mode are less than \\(\\SI{10}{%}\\) of that of the lowest resonance frequency.\nGrounded supports The other type of support is referred to as \u0026ldquo;grounded\u0026rdquo; because it attempts to fix selected points on the structure to ground. In practice, it is very difficult to attach the test structure to a base structure which is sufficiently rigid to provide the necessary grounding.\nThe safest procedure is to measure the mobility FRF of the base structure itself over the frequency range for the test and to establish that this is a much lower mobility than the corresponding levels for the test structure at the point of attachment. If this condition is satisfied for all the coordinates to be grounded, then the base structure can reasonably be assumed to be grounded.\nLoaded boundaries A compromise procedure can be applied in which the test object is connected at certain coordinates to another simple component of known mobility, such as a specific mass. The effects of the added component is then removed analytically.\nExcitation of the structure Devices for exciting the structure can be divided into two type:\n Contacting: these involves the connection of an exciter of some form which remains attached to the structure throughout the test. Non-contacting: devices which are either out of contact throughout the vibration (such as provided by a voice coil) or which are only in contact for a short period (such as a hammer) Exciters are often limited at very low frequencies by the stroke rather than by the force generated.\nElectromagnetic Exciters The most common type of exciter is the electromagnetic shaker in which a magnetic force is applied is applied on the structure without any physical contact.\nThe frequency and amplitude of the excitation are controlled independently of each other, which gives flexibility.\nHowever, we need a direct measurement of the force applied to the structure (we cannot rely on the current going through the coil).\nThe shakers are usually stiff in the orthogonal directions to the excitation. This can modify the response of the system in those directions. In order to avoid that, a drive rod which is stiff in one direction and flexible in the other five directions is attached between the shaker and the structure as shown on figure fig:shaker_rod. Typical size for the rod are \\(5\\) to \\(\\SI{10}{mm}\\) long and \\(\\SI{1}{mm}\\) in diameter, if the rod is longer, it may introduce the effect of its own resonances.\n\n Figure 10: Exciter attachment and drive rod assembly\n The support of shaker is also of primary importance.\nThe setup shown on figure fig:shaker_mount_1 presents the most satisfactory arrangement in which the shaker is fixed to ground while the test structure is supported by a soft spring.\nFigure fig:shaker_mount_2 shows an alternative configuration in which the shaker itself is supported. It may be necessary to add an additional inertia mass to the shaker in order to generate sufficient excitation forces at low frequencies.\nFigure fig:shaker_mount_3 shows an unsatisfactory setup. Indeed, the response measured at \\(A\\) would not be due solely to force applied at \\(B\\), but would also be caused by the forces applied at \\(C\\).\n\nTable 14: Various mounting arrangement of exciter Ideal Configuration Suspended Configuration Unsatisfactory width=\\linewidth width=\\linewidth width=\\linewidth Hammer or Impactor Excitation Although this type of test places greater demands on the analysis phase of the measurement process, it is a relatively simple means of exciting the structure.\nA set of different tips and heads are used to extend the frequency and force level ranges for testing a variety of different structure. A load cell (or force transducer) which detects the magnitude of the force felt by the impactor is included.\nThe magnitude of the impact is determined by the mass of the hammer head and its velocity when it hits the structure.\nThe frequency range which is effectively excited is controlled by the stiffness of the contacting surface and the mass of the impactor head: there is a resonance at a frequency given by \\(\\sqrt{\\frac{\\text{contact stiffness}}{\\text{impactor mass}}}\\) above which it is difficult to deliver energy into the test structure.\nWhen the hammer tip impacts the test structure, this will experience a force pulse as shown on figure fig:hammer_impulse. A pulse of this type (half-sine shape) has a frequency content of the form illustrated on figure fig:hammer_impulse.\n\n Figure 11: Typical impact force pulse and spectrum\n The stiffer the materials, the shorter will be the duration of the pulse and the higher will be the frequency range covered by the impact. Similarly, the lighter the impactor mass, the higher the effective frequency range.\nGenerally, as soft a tip as possible will be used in order to inject all the input energy into the frequency range of interest: using a stiffer tip than necessary will result in energy being input to vibrations outside the range of interest at the expense of those inside of that range.\nOne of the difficulties of applying excitation using a hammer is ensuring that each impact is essentially the same as the previous ones, not much in magnitude as in position and orientation relative to the normal of the surface.\nTransducers and Amplifiers The piezoelectric type of transducer is by far the most popular and widely used transducer in modal tests.\nThree types of piezoelectric transducers are available for mobility measurements:\n Force gauges Accelerometers Impedance heads: simply a combination of force and acceleration sensitive elements in a single unit The basic principle of operation makes use of the fact that an element of piezoelectric material generates an electric charge across its end faces when subjected to a mechanical stress. By suitable design, such a material may be incorporated into a device which induces in it a stress proportional to the physical quantity to be measured.\nForce Transducers The force transducer is the simplest type of piezoelectric transducer. The transmitter force \\(F\\) is applied directly across the crystal, which thus generates a corresponding charge \\(q\\), proportional to \\(F\\) (figure fig:piezo_force_transducer).\n\n Figure 12: Force transducer\n There exists an undesirable possibility of a cross sensitivity, i.e. an electrical output when there is zero force \\(F\\) but, say, a transverse or shear loading.\nAccelerometers In an accelerometer, transduction is indirect and is achieved using a seismic mass (figure fig:piezo_accelerometer). In this configuration, the force exerted on the crystals is the inertia force of the seismic mass (\\(m\\ddot{z}\\)). Thus, so long as the body and the seismic mass move together, the output of the transducer will be proportional to the acceleration of its body \\(x\\).\n\n Figure 13: Compression-type of piezoelectric accelerometer\n Analysis of a simple dynamical model for this device shows that the ratio \\(\\ddot{x}/\\ddot{z}\\) is effectively unity over a wide range of frequency from zero upwards until the first resonant frequency of the transducer.\nThere is also a problem of cross or transverse sensitivity of accelerometers which can result from imperfections in the crystal geometry and from interaction through the casing.\nSelection of accelerometers Accelerometer sensitivities vary between \\(1\\) and \\(\\SI{10000}{pC/g}\\). In general, we require as high a sensitivity as possible, however, the heavier the transducer, the lower is the transducer\u0026rsquo;s resonant frequency and thus the maximum working frequency. For accurate measurements, especially on complex structures which are liable to vibrate simultaneously in several directions, transducers with low transverse sensitivity (less than \\(\\SI{1}{%}\\)) should be selected.\nConditioning Amplifiers One of the advantages of the piezoelectric transducer is that it is an active device and does not require a power supply in order to function. However, this means that it cannot measure truly static quantities and so there is a low frequency limit below which measurements are not practical. This limit is usually determined not simply by the properties of the transducer itself, but also by those of the amplifiers used to boost the small electric charge that is generated by the crystals.\nTwo types of amplifier are available for this role that both have very high input impedance:\n Voltage amplifiers Charge amplifiers Voltage amplifiers tend to be simpler and to have a better signal/noise characteristic than charge amplifiers. However, they cannot be used at such low frequencies as the charge amplifiers and the overall gain is affected by the length and properties of the transducer cable whereas that for a charge amplifier it is effectively independent of the cable.\nAttachment of transducers The correct installation of transducers, especially accelerometers is important.\nThere are various means of fixing the transducers to the surface of the test structure, some more convenient than others. Some of these methods are illustrated in figure fig:transducer_mounting_types.\nShown on figure fig:transducer_mounting_response are typical high frequency limits for each type of attachment.\n\nTable 15: Accelerometer attachment characteristics Attachment methods Frequency response characteristics width=\\linewidth width=\\linewidth Location of transducers Another problem which may require the removal of the transducer to another location is the possibility that it is positioned at or very close to a node of one or more of the structure\u0026rsquo;s modes. In that case, it will be very difficult to make an effective measurement of that particular mode.\nMost modal test require a point mobility measurement as one of the measured FRF. This is hard to achieve as both force and response transducer should be at the same point on the structure. Three possibilities exist:\n Use an impedance head Place the force and acceleration transducers in line but on opposite sides of the structure Place the accelerometer alongside, as close as possible as the force gauge The third option is the most practical but is the one that presents the problem. Particular care is required to ensure that the measurement is really representative of a point mobility: the accelerometer should be as close as possible as the force gauge.\nDigital Signal Processing Objective The task of the spectrum analyser is to estimate the Fourier transform or Spectral densities of signals.\nWe here relate the two most relevant versions of the fundamental Fourier transformation between the time and frequency domains.\nIn its simplest form, this states that a function \\(x(t)\\), periodic in time \\(T\\), can be written as an infinite series:\n\\begin{equation} x(t) = \\frac{a_0}{2} + \\sum_{n=1}^\\infty \\left( a_n \\cos\\frac{2 \\pi n t}{T} + b_n \\sin\\frac{2 \\pi n t}{T} \\right) \\end{equation}\nwhere \\(a_i\\) and \\(b_i\\) can be computed from knowledge of \\(x(t)\\) via the relationships:\n\\begin{subequations} \\begin{align} a_n \u0026amp;= \\frac{2}{T} \\int_0^T x(t) \\cos \\left(\\frac{2 \\pi n t }{T} \\right) \\\\\\\nb_n \u0026amp;= \\frac{2}{T} \\int_0^T x(t) \\sin \\left(\\frac{2 \\pi n t }{T} \\right) \\end{align} \\end{subequations}\nIn the situation where \\(x(t)\\) is discretised and of finite duration, so that it is defined only at a set of \\(N\\) particular values of time (\\(t_k; k = 1, \\dots, N\\)), we can write a finite Fourier series for \\(k = 1, \\dots, N\\):\n\\begin{align*} x_k \u0026amp;= x(t_k) \\\\\\\n\u0026amp;= \\frac{a_0}{2} + \\sum_{n=1}^{N/2} \\left( a_n \\cos\\left(\\frac{2 \\pi n t_k}{T}\\right) + b_n \\sin\\left(\\frac{2 \\pi n t_k}{T}\\right) \\right) \\end{align*}\nThe coefficients \\(a_i\\) and \\(b_i\\) are the Fourier or Spectral coefficients for the function \\(x(t)\\) and they are often displayed in modulus and phase form:\n\\begin{subequations} \\begin{align} x_n \u0026amp;= \\sqrt{a_n^2 + b_n^2} \\\\\\\n\\phi_n \u0026amp;= t g^{-1} \\left( \\frac{-b_n}{a_n} \\right) \\end{align} \\end{subequations}\nBasics of the DFT In each case, the input signal is digitized and recorded as a set of \\(N\\) discrete values, evenly spaced in the period \\(T\\) during which the measurement is made.\nThere is a basic relationship between the sample length \\(T\\), the number of discrete values \\(N\\), the sampling rate \\(\\omega_s\\) and the range and resolution of the frequency spectrum.\nThe range of the spectrum is \\([0, \\omega_\\text{max}]\\) (\\(\\omega_\\text{max}\\) is called the Nyquist frequency), and the resolution of lines in the spectrum is \\(\\Delta_\\omega\\):\n\\begin{subequations} \\begin{align} \\omega_{\\text{max}} \u0026amp;= \\frac{\\omega_s}{2} = \\frac{1}{2} \\left( \\frac{2\\pi N}{T} \\right) \\\\\\\n\\Delta_\\omega \u0026amp;= \\frac{\\omega_s}{N} = \\frac{2\\pi}{T} \\end{align} \\end{subequations}\nVarious algorithms can be used to determine the spectral composition of the sampled signal, however, the most widely used is the Fast Fourier Transform. That however requires \\(N\\) to be an integral power of \\(2\\).\nAliasing Aliasing originates from the discretisation of the originally continuous time history. With this discretisation process, the existence of very high frequencies in the original signal may well be misinterpreted if the sampling rate is too slow. These high frequencies will be indistinguishable from genuine low frequency components as shown on figure fig:aliasing.\n\n Figure 14: The phenomenon of aliasing. On top: Low-frequency signal, On the bottom: High frequency signal\n A signal of frequency \\(\\omega\\) and one of frequency \\(\\omega_s-\\omega\\) are indistinguishable and this causes a distortion of the spectrum measured via the DFT.\nAs a result, the part of the signal which has frequency components above \\(\\omega_s/2\\) will appear reflected or aliased in the range \\([0, \\omega_s/2]\\). This is illustrated on figure fig:effect_aliasing.\n\nTable 16: Alias distortion of spectrum by DFT True spectrum of signal Indicated spectrum from DFT width=\\linewidth width=\\linewidth The solution of the problem is to use an anti-aliasing filter which subjects the original time signal to a low-pass, sharp cut-off filter. Because the filters used are inevitably less than perfect, and have a finite cut-off rate, it remains necessary to reject the spectral measurement in a frequency range approaching the Nyquist frequency \\(\\omega_s/2\\). Typically, the cut-off rate is set to \\(0.5 \\times \\omega_s/2\\) for simple filters and \\(0.8 \\times \\omega_s/2\\) for more advance filters. As a results, frequencies near \\(\\omega_s/2\\) may still be contaminated by the imperfected anti-aliasing.\nLeakage Leakage is a problem which is a direct consequence of the need to take only a finite length of time history coupled with the assumption of periodicity.\n\nTable 17: Sample length and leakage of spectrum Ideal signal Awkward signal width=\\linewidth width=\\linewidth The problem is illustrated on figure fig:leakage. In the first case (figure fig:leakage_ok), the signal is perfectly periodic and the resulting spectrum is just a single line at the frequency of the sine wave. In the second case (figure fig:leakage_nok), the periodicity assumption is not strictly valid as there is a discontinuity at each end of the sample. As a result, the spectrum produced for this case does not indicate the single frequency which the original time signal possessed. Energy has \u0026ldquo;leaked\u0026rdquo; into a number of the spectral lines close to the true frequency and the spectrum is spread over several lines.\nLeakage is a serious problem in many applications, ways of avoiding its effects are:\n Changing the duration of the measurement sample length to match the periodicity of the signal. This can only work if the signal is periodic and if the period can be determined Increasing the duration of the measurement period \\(T\\) so that the separation between the spectral lines (the frequency resolution) is finer. Although this will not totally remove the leakage effect Adding zeroes to the end of the measured sample (\u0026ldquo;zero padding\u0026rdquo;), thereby partially achieving the preceding result but without requiring more data Modifying the sampled signal obtained in such a way as to reduce the severity of the leakage effect. This effect is referred to as windowing Windowing Windowing involves the imposition of a prescribed profile on the time signal prior to performing the Fourier transform.\nThe profiles, or \u0026ldquo;windows\u0026rdquo; are generally depicted as a time function \\(w(t)\\) as shown in figure fig:windowing_examples.\n\n Figure 15: Different types of window. (a) Boxcar, (b) Hanning, (c) Cosine-taper, (d) Exponential\n The analyzed signal is then \\(x^\\prime(t) = x(t) w(t)\\). The result of using a window is seen in the third column of figure fig:windowing_examples.\nThe Hanning and Cosine Taper windows are typically used for continuous signals, such as are produced by steady periodic or random vibration, while the Exponential window is used for transient vibration applications where much of the important information is concentrated in the initial part of the time record.\nIn all cases, a re-scaling is required to compensated for the attenuation of the signals by the application of the window. However, if both response and excitation signals are subjected to the same window, and the results are used only to compute an FRF ratio, then the re-scaling is not necessary.\nFiltering The process of filtering has a direct parallel with windowing. Common filters are: low-pass, high-pass, band-limited, narrow-band, notch.\nImproving Resolution \nIncreasing transform size An immediate solution to this problem would be to use a larger transform. However, this may not be possible in practice.\nZero padding It may be possible to achieve the same resolution increase by adding a series of zeros to the short sample of the actual signal. Care must be taken in such a procedure are it will smooth the resulting spectrum but no additional information is included. This can be misleading in some cases. For instance where two peaks are close and result in only one peak in the smooth data.\nZoom The common solution to the need for finer frequency resolution is to zoom on the frequency range of interest and to concentrate all the spectral lines into a narrow band between \\(\\omega_\\text{min}\\) and \\(\\omega_\\text{max}\\).\nThere are various ways of achieving this result. The easiest way is to use a frequency shifting process coupled with a controlled aliasing device.\nSuppose the signal to be analyzed \\(x(t)\\) has a spectrum \\(X(\\omega)\\) has shown on figure fig:zoom_range, and that we are interested in a detailed analysis between \\(\\omega_1\\) and \\(\\omega_2\\).\nIf we apply a band-pass filter to the signal, as shown on figure fig:zoom_bandpass, and perform a DFT between \\(0\\) and \\((\\omega_2 - \\omega_1)\\), then because of the aliasing phenomenon described earlier, the frequency components between \\(\\omega_1\\) and \\(\\omega_2\\) will appear between \\(0\\) and \\((\\omega_2 - \\omega_1)\\) with the advantage of a finer resolution (see figure fig:zoom_result).\n\nTable 18: Controlled aliasing for frequency zoom Spectrum of the signal Band-pass filter width=\\linewidth width=\\linewidth \n Figure 16: Effective frequency translation for zoom\n When using zoom the measure FRF in a narrow frequency range, it is important to ensure that there is as little vibration energy as possible outside the frequency range of interest.\nAveraging When analyzing random vibrations signals, it is not sufficient to compute Fourier transforms (strictly, they do not exist for a random process) and we must instead obtain estimates for the spectral densities and correlation functions which are used to characterize this type of signal.\nAlthough these properties are computed from the Fourier transforms, there are additional considerations concerning their accuracy and statistical reliability which must be given due attention.\nGenerally, it is necessary to perform an averaging process, involving several individual time records, or samples, before a result is obtained which can be used with confidence. The two major considerations which determine the number of average required are:\n the statistical reliability the removal of spurious random noise from the signals An indication of the requirements from a statistical standpoint may be provided by the \u0026ldquo;statistical degrees of freedom\u0026rdquo; \\(\\kappa\\) which is provided by\n\\begin{equation} \\kappa = 2 B T_t \\end{equation}\nwhere \\(B\\) is the frequency bandwidth and \\(T_t\\) is the total time encompassing all data. \\(T_t = mT\\) for \\(m\\) samples each of \\(T\\) duration.\nAs a guide, this quantity \\(\\kappa\\) should be a minimum of \\(10\\) and should approach \\(100\\) for reasonably reliable estimates.\nAn other way to average is to apply the DFT on overlapping data. This is called overlap averaging. It is clear that \\(100\\) averages performed in this way cannot have the same statistical properties as would \\(100\\) completely independent samples. Nevertheless, the procedure is more effective than if all the data points are only used once. This manifests by producing smoother spectra.\nUse of different excitation signals There are three different classes of signals used for the excitation signals:\n Periodic: stepped sine, slow sine sweep, periodic, pseudo random, periodic random Transient: burst sine, burst random, chirp, impulse Random: true random, white noise, narrow-band random All of these are in widespread use, each having its own particular merits and drawbacks.\nStepped-Sine testing Stepped-sine testing comes from the classical method of measuring the FRF where a discrete sinusoidal with a fixed amplitude and frequency is used.\nIn order to encompass a frequency range of interest, the command signal frequency is stepped from one discrete value to another in such a way as to provide the necessary density of points in the FRF plot. In this technique, it is necessary to ensure that steady-state conditions have been attained before the measurements are made and this means delaying the start of the measurement process for a short while after a new frequency has been selected as there will be a transient response. The extent of the unwanted transient response will depend on:\n the proximity of the excitation frequency to the natural frequency of the structure the abruptness of the changeover from the previous command signal to the new one the lightness of the damping of the nearby structural modes In practice, this is only in the vicinity of a lightly damped resonance that the necessary delay becomes significant and extra attention is needed.\nOne of the advantages is the facility of taking measurements where it is required. For instance, the typical FRF curve has large region of relatively slow changes of level with frequency (away from resonances and anti-resonances) and in these regions it is sufficient to take measurements at relatively widely spaced frequency points.\nSlow Sine Sweep testing This is the traditional method of FRF measurement and involves the use of a sweep oscillator to provide a sinusoidal command signal with a frequency that varies slowly in the range of interest. It is necessary to check that progress through the frequency range is sufficiently slow to check that steady-state response conditions are attained. If excessive sweep rate is used, then distortions of the FRF plot are introduced as shown on figure fig:sweep_distortions.\n\n Figure 17: FRF measurements by sine sweep test\n One way of checking the suitability of a sweep rate is to make the measurement twice, once sweeping up and the second time sweeping down through the frequency range. If both curves obtained are the same, the sweep rate is not excessive.\nPeriodic Excitation This is very similar to a sine wave test methods, however the input signal contains not one but many frequencies of interest.\nThe method of computing the FRF is quite simple: the discrete Fourier transform is computed for both the force and response signals and the ratio of these transforms gives the FRF.\nTwo types of periodic signals are used:\n Deterministic: all the components are mixed with ordered amplitude and phase relationships (e.g. a square wave) Pseudo-random: generation of a random mixture of amplitudes and phases for the various frequency components The sequence is generated for a duration which equals the period of one sample in the analysis process, and is output repeatedly for several successive cycles. A particular advantage of this type of excitation is its exact periodicity in the analyser bandwidth, resulting in zero leakage errors and therefore requiring no windows to be applied before its spectral analysis.\nOne should not that when there is no need to use a window of any form, as it is the case for periodic signals, then it is very important not to use one.\nRandom Excitation FRF estimates using random excitation True random excitation are generally applied to the structure using a shaker.\nFor a such a random excitation, a different approach is required in order to determine the FRF.\nThe principle upon which the FRF is determined using random excitation relies on the following equations\n\\begin{subequations} \\begin{align} S_{xx}(\\omega) \u0026amp;= |H(\\omega)|^2 S_{ff}(\\omega)\\\\\\\nS_{fx}(\\omega) \u0026amp;= H(\\omega) S_{ff}(\\omega)\\\\\\\nS_{xx}(\\omega) \u0026amp;= H(\\omega) S_{xf}(\\omega) \\end{align} \\end{subequations}\nwhere\n \\(S_{xx}(\\omega)\\) and \\(S_{ff}(\\omega)\\) are the autospectra of the response and excitation signals \\(S_{xf}(\\omega)\\) is the cross spectrum between these two signals \\(H(\\omega)\\) is the FRF linking the quantities \\(x\\) and \\(f\\) Such parameters can never be measured exactly with only a finite length of data. However, we have the possibility of providing a cross check on the results by using the fact that the FRF can be estimated using two sets of data:\n\\begin{subequations} \\begin{align} H_1(\\omega) \u0026amp;= \\frac{S_{fx}(\\omega)}{S_{ff}(\\omega)} \\\\\\\nH_2(\\omega) \u0026amp;= \\frac{S_{xx}(\\omega)}{S_{xf}(\\omega)} \\end{align} \\end{subequations}\nWe now introduce a quantity \\(\\gamma^2\\) which is called the coherence and which is defined as \\[ \\gamma^2 = \\frac{H_1(\\omega)}{H_2(\\omega)}; \\quad 0 \\le \\gamma^2 \\le 1 \\]\nClearly, if all is well with the measurement, the coherence should be unity and we shall be looking for this condition in our test to reassure us that the measurements have been well made. Small values of the coherence means that the FRF estimate obtained is unreliable and one should determine its cause.\nNoisy Data There are several situations in which an imperfect measurement might be made, and a low coherence recorded. There may well be noise on one or other of the two signals which could degrade the measured spectra:\n Near resonance: this is likely to influence the force signal so that \\(S_{ff}(\\omega)\\) becomes vulnerable and \\(H_1(\\omega)\\) will suffer the most, \\(H_2(\\omega)\\) might be a better indicator in that case Near anti-resonance: it is the response signal which will suffer, making \\(S_{xx}(\\omega)\\) liable to errors and this is the opposite for \\(H_1(\\omega)\\) and \\(H_2(\\omega)\\) This is shown by the following equations:\n\\begin{subequations} \\begin{align} H_1(\\omega) \u0026amp;= \\frac{S_{fx}(\\omega)}{S_{ff}(\\omega) + S_{nn}(\\omega)} \\\\\\\nH_2(\\omega) \u0026amp;= \\frac{S_{xx}(\\omega) + S_{mm}(\\omega)}{S_{xf}(\\omega)} \\end{align} \\end{subequations}\nwhere \\(S_{mm}(\\omega)\\) and \\(S_{nn}(\\omega)\\) are the autospectra of the noise on the output and input, \\(m(t)\\) and \\(n(t)\\) respectively.\nOne suggestion which has been made is to define the FRF as the geometric mean of the two standard estimates:\n\\begin{equation} H_v(\\omega) = \\sqrt{H_1(\\omega) H_2(\\omega)} \\end{equation}\nLow coherence can arise when more than one excitation is applied to the structure. Another possibility is that the structure is not completely linear. Here again, the measured response cannot be completely attributed to the measured excitation.\nNoise-free FRF estimates A third estimator for the FRF can be defined in cases of random excitation, which is called the instrumental variable estimate, or \\(H_3(\\omega)\\).\nThis formula for the FRF is only possible if more than the usual two channels are being measured simultaneously. The formula is of interest because it does provide an estimate for the FRF which is unbiased by noise on either the force or the response transducer signals. The formula is:\n\\begin{equation} H_3(\\omega) = \\frac{S_{xv}(\\omega)}{S_{fv}(\\omega)} \\end{equation}\nwhere \\(v(t)\\) is a third signal in the system, such as the voltage supplied to the exciter, and it exploits the fact that noise on either input (force) or output (response) channels does not contaminate cross-spectral density estimates in the way that auto spectra are affected.\nLeakage It is known that a low coherence can arise in a measurement where the frequency resolution of the analyzer is not fine enough to describe adequately the very rapidly changing functions such as are encountered near resonance and anti-resonance on lightly-damped structures.\nThis is known as a bias error and leakage is often the most likely source of low coherence on lightly-damped structures as shown on figure fig:coherence_resonance.\n\n Figure 18: Coherence \\(\\gamma^2\\) and FRF estimate \\(H_1(\\omega)\\) for a lightly damped structure\n It can be shown that near resonance, \\(H_2(\\omega)\\) is a much more accurate representation of the true FRF than \\(H_1(\\omega)\\). When this situation is encountered, the best solution is usually to make a zoom measurement as explained previously.\nPostscript It is sometimes though that a poor coherence can be eliminated by taking many averages, but this is only possible if the reason for the low coherence is random noise which can be averaged out over a period of time. If the reason if more systematic than that, the averaging will not help.\nLastly, mention should be made here of a type of excitation referred to as \u0026ldquo;periodic random\u0026rdquo; which is, in fact, a combination of pseudo-random and \u0026ldquo;true\u0026rdquo; random. In this process, a pseudo-random (or periodic) excitation is generated and after a few cycles, a measurement of the input and the now steady-state response is made. Then, a different pseudo-random sequence is generated, the procedure repeated and the result treated as the second sample in what will develop to be an ensemble of random samples. The advantage over the simple random excitation is that due to the essential periodic nature of each of the pseudo-random samples, there are no leakage or bias errors in any of the measurements. However, the cost is an increase in the measurement time as one has to wait for the steady response condition.\nTransient excitation There are three types of excitation to be included in this section because they all share the same principle for their signals processing. They are:\n Burst excitation: a short section of signal Rapid sine sweep (chirp) excitation Impact excitation from a hammer blow The first and second of these generally require an attached shaker, but the last one can be implemented with a hammer.\nThe principle which all these signals share is that the excitation and the consequent response are completely contained within the single sample of measurement which is made. In practice, it is common to repeat the transient even more than once and to average the results to get the final result. How they differ is in the exact form of the transient excitation signal and in the nature of the repeated application.\nIn the burst type of signal, we have an excitation which is applied and analyzed as if it were a continuous signal, taking the successive samples for averaging one immediately after the other. For the chirp and impulse excitations, each individual sample is collected and processed before making the next one, and averaged.\nBurst excitation signals Burst excitation signals consist of short sections of an underlying continuous signal (which may be a sine wave, a sine sweep or a random signal), followed by a period of zero output, resulting in a response which shows a transient build-up followed by a decay (see figure fig:burst_excitation).\n\n Figure 19: Example of burst excitation and response signals\n The duration of the burst is under the control of the operator and it is selected so as to provide the ideal signal processing conditions, which are essentially that the response signal has just died away by the end of the measurement period. If this condition has not been attained (burst too long), then leakage error will result. If it has been reached well before the end of the period (burst too short), then the signal quality will be poor.\nThe final measurement will be the result of averaging several samples. In the case of the burst sine excitation, each sample would be expected to be identical so that the averaging serves only to remove noise on the signals. In the case of burst random, however, each individual burst will be different to the other and so in this case there is an element of averaging randomly varying behavior, a feature which is believed in some cases to enhance the measurement in the presence of weak non-linearities in the test structure.\nChirp excitation The chirp consist of a short duration signal which has the form shown in figure fig:chirp_excitation.\nThe frequency content of the chirp can be precisely chosen by the starting and finishing frequencies of the sweep.\n\n Figure 20: Example of chirp excitation and response signals\n Impulsive excitation The hammer blow produces an input and response as shown in the figure fig:impulsive_excitation.\nThis and the chirp excitation are very similar in the analysis point of view, the main difference is that the chirp offers the possibility of greater control of both amplitude and frequency content of the input and also permits the input of a greater amount of vibration energy.\n\n Figure 21: Example of impulsive excitation and response signals\n The frequency content of the hammer blow is dictated by the materials involved and is rather more difficult to control. However, it should be recorded that in the region below the first cut-off frequency induced by the elasticity of the hammer tip structure contact, the spectrum of the force signal tends to be very flat.\nOn some structures, the movement of the structure in response to the hammer blow can be such that it returns and rebounds on the hammer tip before the user has had time to move that out of the way. In such cases, the spectrum of the excitation is seen to have \u0026ldquo;holes\u0026rdquo; in it at certain frequencies (figure fig:double_hits).\n\n Figure 22: Double hits time domain and frequency content\n In order to perform the required Fourier analysis of all these cases of transient signals, an assumption is made that the data obtained from a single event can be regarded as representing one period of a quasi-periodic process. This means that if exactly the same input was applied \\(T\\) seconds after the first one, then exactly the same response would be observed.\nThis can be difficult to obtain especially for lightly damped structures as the signal will take long time to die away. In that case, one solution is to lengthen the period \\(T\\), but often this is not easily changeable. A window applied to the raw data provides a more practical solution. It is recommended to apply an exponential window to both signals. By choosing an appropriate exponential decay rate, the modified signal can be made to have effectively died away by the end of the prescribed measurement period, thereby satisfying the signal processing needs.\nHowever, one should be cautious when using such windowing as complex modes can be extracted from data treated this way.\nAn alternative to this problem is to use the zoom facility. One of the consequences of using a zoom is that the frequency band is reduced by a proportionate amount. However, by making a number (equal to the zoom factor) of separate measurements, each one for a different zoom band, it is possible to construct and FRF over the entire frequency range of interest with both the advantage of it being a window-free measurement and having a much finer frequency resolution.\nOne the pseudo-periodicity is established, a discrete Fourier series description can be obtained of both the input and response signals. The FRF can be computed from \\[ H(\\omega_k) = \\frac{X(\\omega_k)}{F(\\omega_k)} \\]\nAlternately, the force signals can be treated in the same way as for random excitation, and the formulae for \\(H_1(\\omega)\\) and \\(H_2(\\omega)\\) are used. However, care must be exercise when interpreting the results since the coherence function has different significance here.\nOne of the parameters indicated by the coherence is the statistical reliability of an estimate based on a number of averages of a random process. In the case of an FRF estimate obtained by treating the signals from a succession of nominally identical impacts as a random process, we must note that, strictly, each such sample is a deterministic, and not probabilistic, calculation and should contain no statistical uncertainty.\nThus, the main source for low coherence in this instance can only be leakage errors, non-linearity or high noise levels, not the same situation as for random excitation.\nAnother feature usually employed in transient testing is that of making a whole series of repeat measurements under nominally identical conditions and then averaging FRF estimates. The idea behind this is that any one measurement is likely to be contaminated by noise, especially in the frequency regions away from resonance where the response levels are likely to be quite low. While this averaging technique does indeed enhance the resulting plots, it may well be that several tens of samples need to be acquired before a smooth FRF plot is obtained and this will diminish somewhat any advantage of speed which is a potential attraction to the method.\nCalibration For all measurement processes, it is necessary to calibrate the equipment which is used. In the case of FRF measurements, there are two levels of calibration which should be made:\n The first of these is a periodic absolute calibration of individual transducers (of force and response) to check that their sensitivities are sensibly the same as those specified by the manufacturer. Any marked deviation could indicate internal damage The second type of calibration is one which can and should be carried out during each test, preferably twice, once at the outset and again at the end. This type of calibration is one which provides the overall sensitivity of the complete instrumentation system without examining the performance of the individual elements. The first type of calibration is quite difficult to make accurately as it requires independent measurement of the quantity of interest. The use of another transducer of the same type is not satisfactory as it is not strictly an independent measure. Optical devices can be used for the calibration of displacement sensors.\nOne of the reasons why the absolute type of calibration has not been further developed for this particular application is the availability of a different type of calibration which is particularly attractive and convenient. The parameters measured in a modal analysis are usually ratios between response and force levels, and so what is required is the ability to calibrate the whole measurement system. The voltage measured are related to the physical quantities (force and acceleration) by the sensitivities of the respective transducers:\n\\begin{subequations} \\begin{align} v_f \u0026amp;= E_f f \\\\\\\nv_{\\ddot{x}} \u0026amp;= E_{\\ddot{x}} \\ddot{x} \\end{align} \\end{subequations}\nAs mentioned, the difficulty is to determine the individual values for \\(E_f\\) and \\(E_{\\ddot{x}}\\). In practice, we only ever use the measured voltages as a ratio to obtain the FRF \\[ \\frac{\\ddot{x}}{f} = \\frac{v_{\\ddot{x}}}{v_f} \\frac{E_f}{E_{\\ddot{x}}} = E \\frac{v_{\\ddot{x}}}{v_f} \\] and so what is required is the ratio of the two sensitivities:\n\\begin{equation} E = \\frac{E_f}{E_{\\ddot{x}}} \\end{equation}\nThe overall sensitivity can be more readily obtained by a calibration process because we can easily make an independent measurement of the quantity now being measured: the ratio of response to force. Suppose the response parameter is acceleration, then the FRF obtained is inertance which has the units of \\(1/\\text{mass}\\), a quantity which can readily be independently measured by other means.\nFigure fig:calibration_setup shows a typical calibration setup.\n\n Figure 23: Mass calibration procedure, measurement setup\n A calibration procedure of this type has the distinct advantage that it is very easy to perform and can be carried out with all the measurement equipment. Thus, frequent checks on the overall calibration factors are strongly recommended, ideally as the beginning and end of each test.\nMass Cancellation It is very important the ensure that the force is measured directly at the point at which it is applied to the structure, rather than deducing its magnitude from the current flowing in the shaker coil or other similar indirect processes. This is because near resonance, the actual applied force becomes very small and is thus very prone to inaccuracy.\nThis same argument applies on a lesser scale as we examine the detail around the attachment to the structure, as shown in figure fig:mass_cancellation.\n\n Figure 24: Added mass to be cancelled (crossed area)\n Here, we see part of the structure, an accelerometer and a force transducer. The dashed line shows the plane at which the force is actually measured. Now, assuming that the extra material (shown by the cross hatching) behaves as a rigid mass \\(m^*\\), we can state that the force actually applied to the structure \\(f_t\\) is different from that measured by the transducer \\(f_m\\) by an amount dependent on the acceleration level at the drive point \\(\\ddot{m}\\) according to\n\\begin{equation} f_t = f_m - m^* \\ddot{x} \\end{equation}\nPhysically, what is happening is that some of the measured force is being \u0026ldquo;used\u0026rdquo; to move the additional mass so that the force actually applied to the structure is the measured force minus the inertia force of the extra mass.\nNow, the frequency response quantity we actually require is \\(A_t(\\omega)\\) although we have measurements of \\(\\ddot{X}\\) and \\(F_m\\) only, yielding to \\(A_m(\\omega)\\). If we express it in its real and imaginary parts, we obtain:\n\\begin{align*} \\text{Re}(F_t) \u0026amp;= \\text{Re}(F_m) - m^* \\text{Re}(\\ddot{X}) \\\\\\\n\\text{Im}(F_t) \u0026amp;= \\text{Im}(F_m) - m^* \\text{Im}(\\ddot{X}) \\end{align*}\nAnd\n\\begin{align*} \\text{Re}(1/A_t) \u0026amp;= \\text{Re}(1/A_m) - m^* \\\\\\\n\\text{Im}(1/A_t) \u0026amp;= \\text{Im}(1/A_m) \\end{align*}\nMass cancellation is important when the mass to be cancelled (\\(m^*\\)) is of the same order as the apparent mass of the modes of the structure under test, and this latter is a quantity which varies from point to point on the structure. If we are near an anti-node of a particular mode, then the apparent mass (and stiffness) will tend to be relatively small and here mass cancellation may be important.\nOne important feature of mass cancellation is that it can only be applied to point measurements (where the excitation and response are both considered at the same point). This arises because the procedure described above corrects the measured force for the influence of the additional mass at the drive point.\nIt should be noted that the transducer\u0026rsquo;s inertia is also effective not only in the direction of the excitation but also laterally and in rotation even though they cannot easily be compensated for.\nRotational FRF measurement Significance of rotational FRF data \\(\\SI{50}{%}\\) of all DOFs are rotations (as opposed to translations) and \\(\\SI{75}{%}\\) of all frequency response functions involve rotation DOFs. However, it is relatively rate the find reference to methods for measurements of rotational DOFs. This situation arises from a considerable difficulty which is encountered when trying to measure either rotational responses or excitations and also when trying to apply rotational excitation.\nMeasurement of Rotational FRFs using two or more transducers There are two problems to be tackled:\n measurement of rotational responses generation of measurement of rotation excitation The first of these is less difficult and techniques usually use a pair a matched conventional accelerometers placed at a short distance apart on the structure to be measured as shown on figure fig:rotational_measurement.\n\n Figure 25: Measurement of rotational response\n The principle of operation is that by measuring both accelerometer signals, the responses \\(x_0\\) and \\(\\theta_0\\) can be deduced by taking the mean and difference of \\(x_A\\) and \\(x_B\\):\n\\begin{subequations} \\begin{align} x_0 \u0026amp;= 0.5(x_A + x_B) \\\\\\\n\\theta_0 \u0026amp;= (x_A - x_B)/l \\label{eq:rotational_diff} \\end{align} \\end{subequations}\nThis approach permits us to measure half of the possible FRFs: all those which are of the \\(X/F\\) and \\(\\Theta/F\\) type. The others can only be measured directly by applying a moment excitation.\nFigure fig:rotational_excitation shows a device to simulate a moment excitation. First, a single applied excitation force \\(F_1\\) corresponds to a simultaneous force \\(F_0 = F_1\\) and a moment \\(M_0 = -F_1 l_1\\). Then, the same excitation force is applied at the second position that gives a force \\(F_0 = F_2\\) and moment \\(M_0 = F_2 l_2\\). By adding and subtracting the responses produced by these two separate excitations conditions, we can deduce the translational and rotational responses to the translational force and the rotational moment separately, thus enabling the measurement of all four types of FRF: \\(X/F\\), \\(\\Theta/F\\), \\(X/M\\) and \\(\\Theta/M\\).\n\n Figure 26: Application of moment excitation\n Then, the full \\(6 \\times 6\\) mobility matrix can be measured, however this procedure is quite demanding.\nOther methods for measuring rotational effects include specially developed rotational accelerometers and shakers.\nHowever, there is a major problem that is encountered when measuring rotational FRF: the translational components of the structure\u0026rsquo;s movement tends to overshadow those due to the rotational motions. For example, the magnitude of the difference in equation eq:rotational_diff is often of the order of \\(\\SI{1}{%}\\) of the two individual values which is similar to the transverse sensitivity of the accelerometers: potential errors in rotations are thus enormous.\nMulti-point excitation methods Multi-point excitation in general Multi-excitation methods for modal testing, called MIMO test methods, have been developed for FRF data which possesses a high degree of consistency. There are other benefits:\n the excitation of large structure with multiple points does more closely simulates their vibration environment in service than the single point excitation test the facility of detecting and identifying double or repeated modes the need to complete some tests in a very minimum of on-structure time Although the majority of modal tests are still performed using single-point excitation procedure, multi-point excitation is today well developed and is largely used for aerospace structures.\nThe practical implementation of the different methods currently used are briefly discussed.\nAppropriation or Normal mode testing We here seek establish vibration in a pure mode of vibration by careful selection of the locations and magnitudes of a set of sinusoidal excitation forces.\nThis works for undamped system\u0026rsquo;s natural frequencies, and in that case the force and response vectors are exactly in quadrature: \\[ i\\{X\\} = [H_\\text{Re}(\\omega) + i H_\\text{Im}(\\omega)] \\{F\\} \\]\nIt follows that this equation is valid only if \\(\\det |H_{\\text{Re}}(\\omega)| = 0\\) and this condition provides the basis of a method to locate the undamped system natural frequencies from measured FRF data.\nMulti-phase stepped-sine (MPSS) testing We here excite a MDOF system at a single sinusoidal frequency \\(a\\) by a set of \\(p\\) excitation forces \\(\\{F\\}e^{i\\omega t}\\) such that there is a set of steady-state responses \\(\\{X\\}e^{i\\omega t}\\). The two vectors are related by the system\u0026rsquo;s FRF properties as:\n\\begin{equation} \\{X\\}_{n\\times 1} = [H(\\omega)]_{n\\times p} \\{F\\}_{p\\times 1} \\end{equation}\nHowever, it is not possible to derive the FRF matrix from the single equation eq:mpss_equation, because there will be insufficient data in the two vectors (one of length \\(p\\), the other of length \\(n\\)) to define completely the \\(n\\times p\\) FRF matrix.\nWhat is required is to make a series of \\(p^\\prime\\) measurements of the same basic type using different excitation vectors \\(\\{F\\}_i\\) that should be chosen such that the forcing matrix \\([F]_{p\\times p^\\prime} = [\\{F\\}_1, \\dots, \\{F\\}_p]\\) is non-singular. This can be assured if:\n there are at least as many vectors as there are forces: \\(p^\\prime \u0026gt; p\\) the individual force vectors are linearly independent of each other A second matrix is also constructed containing the response vectors \\([X]_{n\\times p^\\prime} = [\\{X\\}_1, \\dots, \\{X\\}_{p^\\prime}]\\). Now, these two collections of measured data can be used to determine the required FRF matrix:\n\\begin{equation} [H(\\omega)]_{n\\times p} = [X]_{n\\times p^\\prime} [F]_{p^\\prime \\times p}^+ \\end{equation}\nwhere \\(+\\) denotes the generalized inverse of the forcing matrix.\nMulti-point random (MPR) testing Concept In this method, advantage is taken of the incoherence of several uncorrelated random excitations which are applied simultaneously at several points. Then, the need to repeat the test several times, as was necessary for the MPSS method, is avoided.\nThe purpose of this methods is to obtain the FRF data in an optimal way and to reduce the probability of introducing systematic errors to the FRF measurements.\nLet\u0026rsquo;s consider the simplest form of a multi excitation as that of a system excited by two simultaneous forces \\(f_1(t)\\) and \\(f_2(t)\\) where the response \\(x_i(t)\\) is of particular interest. We can derive expressions for the required FRF parameters functions of the auto and cross spectral densities between of three parameters of interest:\n\\begin{subequations} \\begin{align} H_{i1}(\\omega) \u0026amp;= \\frac{S_{1i}S_{22} - S_{2i}S_{12}}{S_{11}S_{22} - S_{12}S_{21}}\\\\\\\nH_{i1}(\\omega) \u0026amp;= \\frac{S_{2i}S_{11} - S_{1i}S_{21}}{S_{11}S_{22} - S_{12}S_{21}} \\end{align} \\end{subequations}\nThese expressions can be used provided that \\(S_{11}S_{22}\\neq |S_{12}|^2\\) which is equivalent of that the two excitation forces must not be fully correlated.\nGeneral formulation In practice, the method is applied using different numbers of exciters, and several response points simultaneously. We have that\n\\begin{equation} [H_{xf}(\\omega)]_{n\\times p} = [S_{xf}(\\omega)]_{n\\times p} [S_{ff}(\\omega)]_{p\\times p}^{-1} \\end{equation}\nwhere it can be seen that the matrix of spectral densities for the forces \\([S_{ff}(\\omega)]_{p\\times p}\\) must be non singular. Thus, care must be taken in practice to ensure this condition, noting that it is the applied forces and not the signal sources which must meet the requirement.\nIn practice, this is difficult to obtain as even if the input signals to the exciters\u0026rsquo; amplifiers are uncorrelated, the forces applied to the structure will certainly not be. This is particularly true near the resonances as the dynamic response is dominated by the one mode which is independent of the actual force pattern.\nCoherence in MPR measurements In a similar way in which we defined coherence for the SISO system, we can make use of the same concepts for a MIMO system. During a MIMO test, we basically measure three matrices: \\[ [S_{ff}(\\omega)]; \\ [S_{xx}(\\omega)]; \\ [S_{fx}(\\omega)] \\] Then, we can derive an estimate for the FRF matrix: \\[ H_1(\\omega)^T = [S_{ff}(\\omega)]^{-1} [S_{fx}(\\omega)] \\] and then compute an estimate for the autospectrum of the response from:\n\\begin{align*} [\\tilde{S}_{xx}(\\omega)] \u0026amp;= [H_1^*(\\omega)] [S_{fx}(\\omega)] \\\\\\\n\u0026amp;= [S_{xf}(\\omega)] [S_{ff}(\\omega)]^{-1} [S_{fx}(\\omega)] \\end{align*}\nNow, by comparing the estimated response spectrum \\([\\tilde{S}_{xx}(\\omega)]\\) with the actual measurement \\([S_{xx}(\\omega)]\\), we obtain a formula for the multiple coherence between the two parameters \\(\\{f(t)\\}\\) and \\(\\{x(t)\\}\\):\n\\begin{equation*} \\tcmbox{[\\gamma^2(\\omega)] = [S_{xx}(\\omega)]^{-1} [S_{xf}(\\omega)] [S_{ff}(\\omega)]^{-1} [S_{fx}(\\omega)]} \\end{equation*}\nMultiple-reference impact tests This class of hammer excitation is referred to as Multi-reference Impact Tests (MRIT). Typically, three response references are measured (often, the \\(x\\), \\(y\\) and \\(z\\) components at the response measurement location) every time a hammer blow is applied to the structure.\nFRF data collected by performing a test in this way will be the equivalent of exciting the structure at three points simultaneously while measuring the response at each of the \\(n\\) points of interest. Thus, in the same sense that a multiple-input test is a multi-reference measurement (measuring several columns of the FRF matrix), so too is the MRIT since it provides a multi-reference measurement including several rows of the same FRF matrix.\nModal Parameter Extraction Methods Introduction Introduction to the concept of modal analysis This section describes some of the many procedures that are used for Modal Analysis and attempts to explain their various advantages and limitations. These methods generally consists of curve-fitting a theoretical expression for an individual FRF to the actual measured data.\n part of single FRF curve complete curve encompassing several resonances a set of many FRF plots all on the same structure In every case, the task is basically to find the coefficients in a theoretical expression for the FRF which then most closely matches the measured data.\nThis phase of the modal test procedure is often referred to as modal parameter extraction or modal analysis.\nTypes of modal analysis A majority of current curve-fitting methods operate on the response characteristics in the frequency domain, but there are other procedures which perform a curve-fit in the time domain. These latter methods are based on the fact that the Impulse Response Function is another characteristic function of the system.\nModal analysis methods can be classified into a series of different groups.\n It depends on the domain in which the analysis is performed:\n frequency domain of FRFs Time domain of IRFs Next, it is appropriate to consider the frequency range over which each individual analysis will be performed. Either a single mode is to be extracted at a time, or several:\n SDOF methods MDOF methods A further classification relates to the number of FRFs which are to be included in a single analysis:\n SISO: the FRF are measured individually SIMO: a set of FRF are measured simultaneously at several response points but under the same single-point excitation. This describes the FRFs in a column or row of the FRF matrix MIMO: the responses at several points are measured simultaneously while the structure is excited at several points, also simultaneously Difficulties due to damping Many of the problems encounter in practice are related to the difficulties associated with the reliable modeling of damping effects. In practice, we are obliged to make certain assumptions about what model is to be used for the damping effects. Sometimes, significant errors can be obtained in the modal parameter estimates (and not only in the damping parameters), as a result of a conflict between the assumed damping behavior and that which actually occurs in reality.\nAnother difficulty is that of real modes and complex modes. In practice, all modes of practical structures are expected to be complex, although in the majority of cases, such complexity will be very small, and often quite negligible.\nDifficulties of model order One problem is determining how many modes are there in the measured FRF.\nThis question is one of the most difficult to resolve in many practical situations where a combination of finite resolution and noise in the measured data combined to make the issue very unclear.\nMany modern modal analysis curve-fitters are capable of fitting any FRF of almost any order, however, it might fit fictitious modes introduced in the analysis process. Correct differentiation between genuine and fictitious modes remains a critical task in many modal tests.\nPreliminary checks of FRF data Visual Checks Before starting the modal analysis of any measured FRF data, it is always important to do a few simple checks in order to ensure that no obvious error is present in the data. Most of the checks are made using a log log plot of the modulus of the measured FRF.\nLow-frequency asymptotes If the structure is grounded, then we should clearly see a stiffness-like characteristic, appearing as asymptotic to a stiffness line at the lowest frequencies (below the first resonance) and the magnitude of this should correspond to that of the static stiffness of the structure at the point in question.\nIf the structure has been tested in a free condition, then we should expect to see a mass-line asymptote where its magnitude may be deduced from purely rigid-body considerations.\nDeviations from this expected behavior may be caused by the frequency range of measurement not extending low enough to see the asymptotic trend, or they may indicate that the required support conditions have not in fact been achieved.\nHigh-frequency asymptotes In the upper end of the frequency range, is it sometimes found (especially on point mobility measurements), that the curve becomes asymptotic to a mass line or, more usually to a stiffness line. Such situation can result in considerable difficulties for the modal analysis process and reflects a situation where the excitation is being applied at a point of very high mass of flexibility. Then, modal parameters are difficult to extracts as they are overwhelmed by the dominant local effects.\nIncidence of anti-resonances For a point FRF, there must be antiresonance after each resonances, while for transfer FRFs between two points well-separated on the structure, we should expect more minima than antiresonances.\nA second check to be made is that the resonance peaks and the antiresonances exhibit the same sharpness on a log-log plot:\n Frequency resolution limitation will cause blunt resonances Inadequate vibration levels results in poor definition of the antiresonance regions Overall shape of FRF skeleton The relative position of the resonance, antiresonances and ambient levels of the FRF curve can give information on the validity of the data. This will be further explained.\nNyquist plot inspection When plotting the FRF data in a Nyquist format, we expect that each resonance traces out at least part of a circular arc, the extent of which depends largely on the interaction between adjacent modes. For a system with well-separated modes, it is to be expected that each resonance will generate the major part of a circle, but when modal interference increases, only small segments will be identifiable. However, within these bounds, the Nyquist plot should ideally exhibit a smooth curve, and failure to do so may be an indication of a poor measurement technique.\nAssessment of multiple-FRF data set using SVD When several FRFs are acquired (either from SIMO or MIMO data), the Singular Value Decomposition has proved to be a very useful tool to check the quality, reliability and order of the data.\nThe set of FRF which are to be assessed is stored in a series of vectors \\(\\{H_{jk}(\\omega)\\}\\) each of which contains the values for one FRF at all measured frequencies \\(\\omega = \\omega_1, \\dots, \\omega_L\\). These vectors are assembled into a matrix \\[ [A]_{L\\times np} = [\\{H_{11}(\\omega)\\}_{L\\times 1} \\{H_{21}(\\omega)\\}_{L\\times 1} \\dots \\{H_{np}(\\omega)\\}_{L\\times 1} ] \\] where \\(n\\) and \\(p\\) represent the number of measured DOFs and the number of excitation points. \\(L\\) represents the number of frequencies at which the FRF data are defined.\n \\begin{equation} [A]_{L\\times np} = [U]_{L\\times L} [\\Sigma]_{L\\times np} [V]_{np\\times np}^T \\end{equation}\n The singular values \\(\\sigma_1, \\dots, \\sigma_w\\) describes the amplitude information Number of non-zero singular values represents the order of the system (i.e. the number of independent modes of vibration which effectively contribute to the measured FRFs) The columns of \\([U]\\) represent the frequency distribution of these amplitudes The columns of \\([V]\\) represent their spatial distribution From the SVD, we can compute a new matrix \\([P]_{L\\times np}\\) which is referred to as the Principal Response Function (PRF) matrix. Each column of the PRF contains a response function corresponding to one of the original FRFs:\n\\begin{equation} [U]_{L\\times L} [\\Sigma]_{L\\times np} = [P]_{L\\times np} \\end{equation}\nThen, each PRF is, simply, a particular combination of the original FRFs, and thus each FRF contains all the essential information included in those FRFs (eigenvalues for instance).\n On example of this form of pre-processing is shown on figure fig:PRF_numerical for a numerically-simulation test data, and another in figure fig:PRF_measured for the case of real measured test data.\nThe second plot fig:PRF_numerical_svd helps to determine the true order of the system because the number of non-zero singular values is equal to this parameter. The third plot fig:PRF_numerical_PRF shows the genuine modes distinct from the computational modes.\n It can be seen that the PRFs tend to tall into two groups:\n The most prominent are a set of response function, each of which has a small number of dominant peaks. It represents the physical modes of the system. The lower group shows less distinct and clear-cut behavior. It represents the noise or computational modes present in the data. The two groups are usually separated by a clear gap (depending of the noise present in the data):\n If such gap is present, then is will be possible to extract the properties of the \\(m\\) modes which are active in the measured responses over the frequency range covered. If not, then it may be impossible to perform a successful modal parameter extraction. \nTable 19: FRF and PRF characteristics for numerical model FRF Singular Values PRF width=\\linewidth width=\\linewidth width=\\linewidth \nTable 20: FRF and PRF characteristics for measured model FRF Singular Values PRF width=\\linewidth width=\\linewidth width=\\linewidth Mode Indicator Functions (MIFs) General The Mode Indicator Functions are usually used on \\(n\\times p\\) FRF matrix where \\(n\\) is a relatively large number of measurement DOFs and \\(p\\) is the number of excitation DOFs, typically 3 or 4.\nIn these methods, the frequency dependent FRF matrix is subjected to an eigenvalue or singular value decomposition analysis which thus yields a small number (3 or 4) of eigen or singular values, these also being frequency dependent.\nThese methods are used to determine the number of modes present in a given frequency range, to identify repeated natural frequencies and to pre process the FRF data prior to modal analysis.\nComplex mode indicator function (CMIF) The Complex Mode Indicator Function is defined simply by the SVD of the FRF (sub) matrix.\n This decomposition, is defined as\n\\begin{align*} [H(\\omega)]_{n\\times p} \u0026amp;= [U(\\omega)]_{n\\times n} [\\Sigma(\\omega)]_{n\\times p} [V(\\omega)]_{p\\times p}^H\\\\\\\n[CMIF(\\omega)]_{p\\times p} \u0026amp;= [\\Sigma(\\omega)]_{p\\times n}^T [\\Sigma(\\omega)]_{n\\times p} \\end{align*}\n The actual mode indicator values are provided by the squares of the singular values and are usually plotted as a function of frequency in logarithmic form as shown in figure fig:mifs:\n Natural frequencies are indicated by large values of the first CMIF (the highest of the singular values) double or multiple modes by simultaneously large values of two or more CMIF. Associated with the CMIF values at each natural frequency \\(\\omega_r\\) are two vectors:\n the left singular vector \\(\\{U(\\omega_r)\\}_1\\) which approximates the mode shape of that mode the right singular vector \\(\\{V(\\omega_r)\\}_1\\) which represents the approximate force pattern necessary to generate a response on that mode only \n Figure 27: Complex Mode Indicator Function (CMIF)\n In addition to identifying all the significant natural frequencies, the CMIF can also be used to generate a set of enhanced FRFs from the formula:\n\\begin{equation} [EFRF(\\omega)]_{n\\times p} = [H(\\omega)]_{n\\times p} [V(\\omega)]_{p\\times p} \\end{equation}\nThere is one non-trivial EFRF for each mode, the result of which is an almost SDOF characteristic response function which is then readily amenable to modal analysis by the simplest of methods.\nAs in the previous case, these modified FRFs are simply linear combinations of the original measured data and, as such, contain no more and no less information than in their original form.\nHowever, such an approach lends itself to a very reliable extraction of the global properties (eigenvalues) for the measured FRF data set which can then be re-visited in a second stage to determine the local properties (mode shapes) for all the measured DOFs.\n Other MIFs There are multiple variants on the mode indicator function concepts. Some use the eigenvalue decomposition instead of the singular value decomposition. Two are worth mentioning: the Multivariable Mode Indicator Function (MMIF) and the Real Mode Indicator Function (RMIF).\nSDOF Modal Analysis Methods Review of SDOF modal analysis methods The \u0026ldquo;SDOF\u0026rdquo; approach does not imply that the system being modeled is reduced to a single degree of freedom, that that just one resonance is considered at a time.\nThere are limitations to such simple approach, the principal one being that very close modes cannot easily be separated.\nThere are several implementations of the basic concept of SDOF analysis, ranging from the simple peak-picking method, through the classic circle-fit approach to more automatic algorithms such as the inverse FRF \u0026ldquo;he-fit\u0026rdquo; method and the general least-squares methods.\nAs the name implies, the method exploits the fact that in the vicinity of a resonance, the behavior of the system is dominated by a single mode (the magnitude is dominated by one of the terms in the series).\nThe general expression of the receptance FRF\n\\begin{equation} \\alpha_{jk}(\\omega) = \\sum_{s=1}^N \\frac{{}_sA_{jk}}{\\omega_s^2 - \\omega^2 + i \\eta_s \\omega_s^2} \\end{equation}\ncan be rewritten as:\n\\begin{equation} \\alpha_{jk}(\\omega) = \\frac{{}_rA_{jk}}{\\omega_r^2 - \\omega^2 + i \\eta_r \\omega_r^2} + \\sum_{\\substack{s=1\\s \\neq r}}^N \\frac{{}_sA_{jk}}{\\omega_s^2 - \\omega^2 + i \\eta_s \\omega_s^2} \\end{equation}\n Now, the SDOF assumption is that for a small range of frequency in the vicinity of the natural frequency of mode \\(r\\), \\(\\alpha_{jk}(\\omega)\\) can be approximated as\n\\begin{equation} \\alpha_{jk}(\\omega)_{\\omega\\approx\\omega_r} = \\frac{{}_rA_{jk}}{\\omega_r^2 - \\omega^2 + i \\eta_r \\omega_r^2} + {}_rB_{jk} \\end{equation}\n This does not mean that the other modes are unimportant or negligible (their influence can be considerable), but rather that their combined effect can be represented as a constant term around this resonance.\nSDOF Modal Analysis I - Peak-Amplitude method In this method, it is assumed that close to one local mode, any effects due to the other modes can be ignored. This is a method which works adequately for structures whose FRF exhibit well separated modes. This method is useful in obtaining initial estimates to the parameters.\nThe peak-picking method is applied as follows (illustrated on figure fig:peak_amplitude):\n First, individual resonance peaks are detected on the FRF plot and the maximum responses frequency \\(\\omega_r\\) is taken as the natural frequency of that mode\n Second, the local maximum value of the FRF \\(|\\hat{H}|\\) is noted and the frequency bandwidth of the function for a response level of \\(|\\hat{H}|/\\sqrt{2}\\) is determined. The two points thus identified as \\(\\omega_b\\) and \\(\\omega_a\\) are the \u0026ldquo;half power points\u0026rdquo;\n The damping of the mode in question can now be estimated from of the following formulae:\n\\begin{subequations} \\begin{align} \\eta_r \u0026amp;= \\frac{\\omega_a^2 - \\omega_b^2}{2 \\omega_r^2} \\approx \\frac{\\Delta\\omega}{\\omega_r} \\\\\\\n2\\xi_r \u0026amp;= \\eta_r \\end{align} \\end{subequations}\n We now obtain an estimate for the modal constant of the mode being analyzed by assuming that the total response in this resonant region is attributed to a single term in the general FRF series:\n\\begin{equation} |\\hat{H}| = \\frac{A_r}{\\omega_r^2 \\eta_r} \\Leftrightarrow A_r = |\\hat{H}| \\omega_r^2 \\eta_r \\end{equation}\n It must be noted that the estimates of both damping and modal constant depend heavily on the accuracy of the maximum FRF level \\(|\\hat{H}|\\) which is difficult to measure with great accuracy, especially for lightly damped systems. Only real modal constants and thus real modes can be deduced by this method.\n\n Figure 28: Peak Amplitude method of modal analysis\n Alternatives of this method can be applied using the real part of the receptance FRF instead of the modulus plot.\nSDOF Modal Analysis II - Circle Fit Method Properties of the modal circle MDOF systems produce Nyquist plots of FRF data which include sections of near circular arcs corresponding to the regions near the natural frequencies. This characteristic provides the basic of the \u0026ldquo;SDOF circle-fit method\u0026quot;.\nWe here use structural damping and we use the receptance form of FRF data as this will produces an exact circle in a Nyquist plot. However, if it is required to use a model incorporating viscous damping, then the mobility version of the FRF data should be used.\nIn the case of a system assumed to have structural damping, the basic function with which we are dealing is\n\\begin{equation} \\alpha(\\omega) = \\frac{1}{\\omega_r^2\\left( 1 - \\left(\\omega/\\omega_r\\right)^2 + i\\eta_r \\right)} \\end{equation}\nsince the only effect of including the modal constant \\({}_rA_{jk}\\) is to scale the size of the circle by \\(|{}_rA_{jk}|\\) and to rotate it by \\(\\angle {}_rA_{jk}\\). A plot of the quantity \\(\\alpha(\\omega)\\) is given in figure fig:modal_circle.\n\nTable 21: Modal Circle Properties \\(\\omega_b\\) and \\(\\omega_a\\) points width=\\linewidth width=\\linewidth For any frequency \\(\\omega\\), we have the following relationship:\n\\begin{subequations} \\begin{align} \\tan \\gamma \u0026amp;= \\frac{\\eta_r}{1 - (\\omega/\\omega_r)^2}\\\\\\\n\\tan(\\SI{90}{\\degree}-\\gamma) \u0026amp;= \\tan\\left(\\frac{\\theta}{2}\\right) = \\frac{1 - (\\omega/\\omega_r)^2}{\\eta_r} \\label{eq:modal_circle_tan} \\end{align} \\end{subequations}\nFrom eq:modal_circle_tan, we obtain:\n\\begin{equation} \\omega^2 = \\omega_r^2 \\left(1 - \\eta_r \\tan\\left(\\frac{\\theta}{2}\\right) \\right) \\end{equation}\nIf we differentiate eq:modal_circle_omega with respect to \\(\\theta\\), we obtain:\n\\begin{equation} \\frac{d\\omega^2}{d\\theta} = \\frac{-\\omega_r^2 \\eta_r}{2} \\frac{\\left(1 - (\\omega/\\omega_r)^2\\right)^2}{\\eta_r^2} \\end{equation}\nThe reciprocal of this quantity is a measure of the rate at which the locus sweeps around the circular arc. It may be seen to reach a maximum value when \\(\\omega=\\omega_r\\):\n\\begin{equation} \\tcmbox{\\frac{d}{d\\omega} \\left(\\frac{d\\omega^2}{d\\theta}\\right) = 0 \\text{ when } \\omega_r^2 - \\omega^2 = 0} \\end{equation}\nIt may also be seen that an estimate of the damping is provided by the sweep rate:\n\\begin{equation} \\tcmbox{\\left(\\frac{d\\theta}{d\\omega^2}\\right)_{\\omega=\\omega_r} = -\\frac{2}{\\omega_r^2 \\eta_r}} \\end{equation}\nSuppose now we have two specific points on the circle, one corresponding to a frequency \\(\\omega_b\\) below the natural frequency and the other one \\(\\omega_a\\) above the natural frequency. Referring to figure fig:modal_circle_bis, we can write:\n\\begin{subequations} \\begin{align} \\tan\\left(\\frac{\\theta_b}{2}\\right) \u0026amp;= \\frac{1 - (\\omega_b/\\omega_r)^2}{\\eta_r}\\\\\\\n\\tan\\left(\\frac{\\theta_a}{2}\\right) \u0026amp;= \\frac{(\\omega_a/\\omega_r)^2 - 1}{\\eta_r} \\end{align} \\end{subequations}\nFrom these two equations, we can obtain an expression for the damping of the mode:\n\\begin{equation} \\tcmbox{\\eta_r = \\frac{\\omega_a^2 - \\omega_b^2}{\\omega_r^2 \\left(\\tan(\\theta_a/2) + \\tan(\\theta_b/2)\\right)}} \\end{equation}\nwhich is an exact expression and applies for all levels of damping.\nIf we take two points for which \\(\\theta_a = \\theta_b = \\SI{90}{\\degree}\\), we obtain:\n\\begin{subequations} \\begin{align} \\eta_r \u0026amp;= \\frac{\\omega_2^2 - \\omega_1^2}{2 \\omega_r^2}\\\\\\\n\\eta_r \u0026amp;= \\frac{\\omega_2 - \\omega_1}{\\omega_r} \\text{ for light damping} \\end{align} \\end{subequations}\nWhen scaled by a modal constant \\({}_rA_{jk}\\) added in the numerator, the diameter of the circle will be \\[ {}_rD_{jk} = \\frac{\\left|{}_rA_{jk}\\right|}{\\omega_r^2 \\eta_r} \\] and the whole circle will be rotated so that the principal diameter (the one passing through the natural frequency point) is oriented at an angle \\(\\arg({}_rA_{jk})\\) to the negative Imaginary axis.\nFor SDOF system with viscous damping, rather than structural damping, the mobility is \\[ Y(\\omega) = \\frac{i\\omega}{(k - \\omega^2 m) + i \\omega c} \\]\nAnd we have\n\\begin{equation} \\tan\\left(\\frac{\\theta}{2}\\right) = \\frac{1 - (\\omega/\\omega_r)^2}{2 \\xi \\omega/\\omega_r} \\end{equation}\nFrom points at \\(\\omega_a\\) and \\(\\omega_b\\), we obtain\n\\begin{subequations} \\begin{align} \\xi \u0026amp;= \\frac{\\omega_a^2 - \\omega_b^2}{2 \\omega_r \\left( \\omega_a \\tan(\\theta_a/2) + \\omega_b \\tan(\\theta_b/2) \\right)}\\\\\\\n\u0026amp;= \\frac{\\omega_a - \\omega_b}{\\omega_r \\left( \\tan(\\theta_a/2) + \\tan(\\theta_b/2) \\right)} \\text{ for light damping} \\end{align} \\end{subequations}\nFinally, selecting two points for which \\(\\theta_a = \\theta_b = \\SI{90}{\\degree}\\):\n\\begin{equation} \\xi = \\frac{\\omega_2 - \\omega_1}{2 \\omega_r} \\end{equation}\nCircle-fit analysis procedure The sequence is:\n Select points to be used. Fit circle, calculate quality of fit. It is generally done by a least-square algorithm. Then we obtain the center and radius of the circle and the quality factor is the mean square deviation of the chosen points from the circle. Locate natural frequency, obtain damping estimate. The rate of sweep through the region is estimated numerically and the frequency at which it reaches the maximum is deduced. At the same time, an estimate of the damping is derived using eq:estimate_damping_sweep_rate. A typical example is shown on figure fig:circle_fit_natural_frequency. Calculate multiple damping estimates, and scatter. A set of damping estimates using all possible combination of the selected data points are computed using eq:estimate_damping. Then, we can choose the damping estimate to be the mean value. We also look at the distribution of the obtained damping estimates as is permits a useful diagnostic of the quality of the entire analysis: Good measured data should lead to a smooth plot of these damping estimates, any roughness of the surface can be explained in terms of noise in the original data. However, any systematic distortion of the plot is almost certainly caused by some form of error in the data, in the analysis or in the assumed behavior of the system. Determine modal constant modulus and argument. The magnitude and argument of the modal constant is determined from the diameter of the circle and from its orientation relative to the Real and Imaginary axis. \n Figure 29: Location of natural frequency for a Circle-fit modal analysis\n Then, the theoretically regenerated FRF can be plotted against the original measured data for comparison. In order to determines the contribution of other modes on the resonance of mode \\(r\\), the distance from the top of the principal diameter to the origin has to be measured and is equal to \\({}_rB_{jk}\\).\nSDOF Modal Analysis III - Inverse or Line-fit method Properties of inverse FRF plots The original version of this method uses the fact that a function which generates a circle when plotted in the complex plane will, when plotted as a reciprocal, trace out a straight line. Thus, if we were to plot the reciprocal of receptance of a SDOF system with structural damping, we would find that in the Argand diagram it produces a straight line:\n\\begin{subequations} \\begin{align} \\alpha(\\omega) \u0026amp;= \\frac{(k - \\omega^2 m) - i d}{(k - \\omega^2 m)^2 + d^2}\\\\\\\n\\frac{1}{\\alpha(\\omega)} \u0026amp;= (k - \\omega^2 m) + i d \\end{align} \\end{subequations}\nFirst, a least squares best-fit straight line is constructed through the data points and an estimate for the damping parameters is immediately available from the intercept of the line with the Imaginary axis. Furthermore, an indication of the reliability of that estimate may be gained from the nature of the deviations of the data points from the line itself. We can here determine whether the damping is structural (imaginary part constant with frequency) or viscous (imaginary part linear with frequency).\nThen, a second least squares operation is performed, this time on the deviation between the real part of the measured data points and that of the theoretical model. Resulting from this, we obtain estimates for the mass and stiffness parameters.\nIt should be noted that this approach is best suited to systems with real modes and to relatively well-separated modes.\nGeneral inverse analysis method It has been shown that if a purely SDOF system FRF is plotted in this way, then both plots demonstrate straight lines, and separately reveal useful information about the mass, stiffness and damping properties of the measured system.\nThe inverse FRF of a MDOF system is not as convenient as SDOF system as:\n\\begin{align*} H_{jk}^{-1} (\\omega) \u0026amp;= \\frac{1}{\\sum (k - \\omega^2 m) + i \\omega c}\\\\\\\n\u0026amp;\\neq \\sum \\frac{1}{(k - \\omega^2 m) + i \\omega c} \\end{align*}\nThus, in order to determine the modal parameters of a MDOF system using inverse method, some modifications to the basic formulation must be found.\nWe start with the basic formula for SDOF analysis: \\[ \\alpha_{jk}(\\omega)_{\\omega\\simeq\\omega_r} \\simeq \\frac{{}_rA_{jk}}{\\omega_r^2 - \\omega^2 + i \\eta_r \\omega_r^2} + {}_rB_{jk} \\] We can note that the presence of the \\({}_rB_{jk}\\) term is problematic for the inverse plot.\nThe trick is to define a new FRF term \\(\\alpha^\\prime_{ik}(\\omega)\\) which is the difference between the actual FRF and the value of the FRF at one fixed frequency \\(\\Omega\\) in the range of interest called \u0026ldquo;fixing frequency\u0026quot;: \\[ \\alpha^\\prime_{jk}(\\omega) = \\alpha_{jk}(\\omega) - \\alpha_{jk}(\\Omega) \\] from which the inverse FRF parameter that we shall use for the modal analysis \\(\\Delta(\\omega)\\), can be defined as:\n\\begin{align*} \\Delta(\\omega) \u0026amp;= (\\omega^2 - \\Omega^2)/\\alpha^\\prime_{jk}(\\omega)\\\\\\\n\u0026amp;= \\text{Re}(\\Delta) + i \\text{Im}(\\Delta) \\end{align*}\nIt can be seen that \\[ \\text{Re}(\\Delta) = m_R \\omega^2 + c_R; \\quad \\text{Im}(\\Delta) = m_I \\omega^2 + c_I \\] and that\n\\begin{align*} m_R \u0026amp;= a_R(\\Omega^2 - \\omega_r^2) - b_r (\\omega_r^2 \\eta_r) \\\\\\\nm_I \u0026amp;= -b_R(\\Omega^2 - \\omega_r^2) - a_r (\\omega_r^2 \\eta_r) \\\\\\\n{}_rA_{jk} \u0026amp;= a_R + i b_r \\end{align*}\nThe first step of our analysis procedure can be made, as follows:\n Using the FRF data measured in the vicinity of the resonance \\(\\omega_r\\), choose the fixing frequency \\(\\Omega_j\\) and then calculate \\(\\Delta(\\omega)\\) Plot these values on \\(\\text{Re vs } \\omega^2\\) and \\(\\text{Im vs }\\omega^2\\) plots and compute the best fit straight line in order to determine \\(m_R(\\Omega_j)\\) and \\(m_I(\\Omega_j)\\) Now it can be shown that both these straight line slopes \\(m_R\\) and \\(m_I\\) are simple functions of \\(\\Omega\\), and we can write: \\[ m_R = n_R \\Omega^2 + d_R \\text{ and } m_I = n_I \\Omega^2 + d_I \\] where\n\\begin{equation} \\begin{aligned} n_R \u0026amp;= a_r; \\quad n_I = -b_r \\\\\\\nd_R \u0026amp;= -b_r(\\omega_r^2 \\eta_r) - a_r \\omega_r^2; \\quad d_I = b_r \\omega_r^2 - a_r\\omega_r^2\\eta_r \\end{aligned} \\end{equation}\nNow let \\(p = n_I/n_R \\text{ and } q = d_I/d_R\\), and noting that\n\\begin{equation} \\begin{aligned} \\eta_r \u0026amp;= \\frac{q - p}{1 + pq}; \\quad \\omega_r^2 = \\frac{d_R}{(p\\eta_r - 1)n_R} \\\\\\\na_r \u0026amp;= \\frac{\\omega_r^2(p\\eta_r - 1)}{(1 + p^2)d_R}; \\quad b_r = -a_r p \\end{aligned} \\end{equation}\nwe now have sufficient information to extract estimates for the four parameters for the resonance which has been analyzed: \\(\\omega_r, \\eta_r, \\text{ and } {}_rA_{jk} = a_r + i b_r\\).\nPlot graphs of \\\\(m\\_R(\\Omega)\\\\) vs \\\\(\\Omega^2\\\\) and of \\\\(m\\_I(\\Omega)\\\\) vs \\\\(\\Omega^2\\\\) using the results from step 1., each time using a different measurement points as the fixing frequency \\\\(\\Omega\\_j\\\\) Determine the slopes of the best fit straight lines through these two plots, \\\\(n\\_R\\\\) and \\\\(n\\_I\\\\), and their intercepts with the vertical axis \\\\(d\\_R\\\\) and \\\\(d\\_I\\\\) Use these four quantities, and equation [eq:modal_parameters_formula](#eq:modal_parameters_formula), to determine the **four modal parameters** required for that mode This procedure which places more weight to points slightly away from the resonance region is likely to be less sensitive to measurement difficulties of measuring the resonance region.\nResiduals Concept of residual terms We need to introduce the concept of residual terms, necessary in the modal analysis process to take account of those modes which we do not analyze directly but which nevertheless exist and have an influence on the FRF data we use.\nThe first occasion on which the residual problem is encountered is generally at the end of the analysis of a single FRF curve, such as by the repeated application of an SDOF curve-fit to each of the resonances in turn until all modes visible on the plot have been identified. At this point, it is often desired to construct a theoretical curve (called \u0026ldquo;regenerated\u0026quot;), based on the modal parameters extracted from the measured data, and to overlay this on the original measured data to assess the success of the curve-fit process. Then the regenerated curve is compared with the original measurements, the result is often disappointing, as illustrated in figure fig:residual_without. However, by the inclusion of two simple extra terms (the \u0026ldquo;residuals\u0026quot;), the modified regenerated curve is seen to correlate very well with the original experimental data as shown on figure fig:residual_with.\n\nTable 22: Effects of residual terms on FRF regeneration without residual with residuals width=\\linewidth width=\\linewidth If we regenerate an FRF curve from the modal parameters we have extracted from the measured data, we shall use a formula of the type\n\\begin{equation} H_{jk}(\\omega) = \\sum_{r = m_1}^{m_2} \\frac{{}_rA_{jk}}{\\omega_r^2 - \\omega^2 + i \\eta_r \\omega_r^2} \\end{equation}\nin which \\(m_1\\) and \\(m_2\\) reflects that we do not always start at the first mode (\\(r = 1\\)) and continue to the highest mode (\\(r = N\\)).\nHowever, the equation which most closely represents the measured data is:\n\\begin{equation} H_{jk}(\\omega) = \\sum_{r = 1}^{N} \\frac{{}_rA_{jk}}{\\omega_r^2 - \\omega^2 + i \\eta_r \\omega_r^2} \\end{equation}\nwhich may be rewritten as\n\\begin{equation} H_{jk}(\\omega) = \\left( \\sum_{r=1}^{m_1-1} + \\sum_{r=m_1}^{m_2} + \\sum_{r = m_2+1}^{N} \\right) \\frac{{}_rA_{jk}}{\\omega_r^2 - \\omega^2 + i \\eta_r \\omega_r^2} \\end{equation}\nThe three terms corresponds to:\n the low frequency modes not identified the high frequency modes not identified the modes actually identified These three terms are illustrated on figure fig:low_medium_high_modes.\n\n Figure 30: Numerical simulation of contribution of low, medium and high frequency modes\n From the sketch, it may be seen that within the frequency range of interest:\n the first term tends to approximate to a mass-like behavior the third term approximates to a stiffness effect Thus, we have a basis for the residual terms and shall rewrite equation eq:sum_modes:\n\\begin{equation} H_{jk}(\\omega) \\simeq -\\frac{1}{\\omega^2 M_{jk}^R} + \\sum_{r=m_1}^{m_2} \\left( \\frac{{}_rA_{jk}}{\\omega_r^2 - \\omega^2 + i \\eta_r \\omega_r^2} \\right) + \\frac{1}{K_{jk}^R} \\end{equation}\nwhere the quantities \\(M_{jk}^R\\) and \\(K_{jk}^R\\) are the residual mass and stiffness for that particular FRF and chosen frequency range.\nCalculation of residual mass and stiffness terms First, we compute a few values of the regenerated FRF curve at the lower frequencies covered by the tests, using only the identified modal parameters. Then, by comparing these values with those from actual measurements, we estimate a mass residual constant which, when added to the regenerated curve, brings this closely into line with the measured data.\nThen, the process is repeated at the top end of the frequency range, this time seeking a residual stiffness. Often, the process is more effective if there is an antiresonance near either end of the frequency range which this is then used as the point of adjustment.\nThe procedure outlined here may need to be repeated iteratively in case the addition of the stiffness residual term then upsets the effectiveness of the mass term.\nIt should be noted that often there is a physical significance to the residual terms. If the test structure is freely-supported and its rigid body modes are well below the minimum frequency of measurement, then the mass residual term will be a direct reflection of the rigid body mass and inertia properties of the structure. The high frequency residual can represent the local flexibility at the drive point.\nResidual and pseudo modes Sometimes it is convenient to treat the residual terms as if they were modes. Instead of representing each residual effect by a constant, each can be represented by a pseudo mode. For the low frequency residual effects, this pseudo mode has a natural frequency below the lowest frequency on the measured FRF, and for the high frequency residual effects, that pseudo mode has a natural frequency which is above the highest frequency of the measured FRF. These pseudo modes can be conveniently included in the list of modes which have been extracted by modal analysis of that FRF.\nUsing pseudo modes instead of simple residual mass and stiffness terms is a more accurate way of representing the out-of-range modes. There is one warning, however, and that is to point out that these pseudo modes are not genuine modes and that they cannot be used to deduce the corresponding contributions of these same modes for any other FRF curve.\nRefinement of SDOF modal analysis methods In the modal analysis methods discussed above, an assumption is made that near the resonance under analysis, the effect of all the other modes could be represented by a constant. When there are neighboring modes close to the one being analyzed, this assumption may not be valid.\n \u0026ldquo;Close\u0026rdquo; is begin loosely defined as a situation where the separation between the natural frequencies of two adjacent modes is less than the typical damping level, both measured as percentage.\n However, we can usually remove that restriction and thereby make a more precise analysis of the data.\nWe can write the receptance in the frequency range of interest as:\n\\begin{equation} \\begin{aligned} H_{jk}(\\omega) \u0026amp;= \\sum_{s=m_1}^{m_2} \\left( \\frac{{}_sA_{jk}}{\\omega_s^2 - \\omega^2 + i \\eta_s \\omega_s^2} \\right) + \\frac{1}{K_{jk}^R}-\\frac{1}{\\omega^2 M_{jk}^R} \\\\\\\n\u0026amp;= \\left( \\frac{{}_rA_{jk}}{\\omega_r^2 - \\omega^2 + i\\eta_r \\omega_r^2} \\right) \\\\\\\n\u0026amp;+ \\left(\\sum_{\\substack{s=m_1\\s \\neq r}}^{m_2} \\frac{{}_sA_{jk}}{\\omega_s^2 - \\omega^2 + i\\eta_s \\omega_s^2} + \\frac{1}{K_{jk}^R} - \\frac{1}{\\omega^2 M_{jk}^R} \\right) \\end{aligned} \\end{equation}\nIn the previous methods, the second term was assumed to be a constant in the curve-fit procedure for mode \\(r\\). However, if we have good estimates for the coefficients which constitutes the second term, for example by having already completed an SDOF analysis, we may remove the restriction on the analysis. Indeed, suppose we take a set of measured data points around the resonance at \\(\\omega_r\\), and that we can compute the magnitude of the second term in eq:second_term_refinement, we then subtract this from the measurement and we obtain adjusted data points that are conform to a true SDOF behavior and we can use the same technique as before to obtain improved estimated to the modal parameters of more \\(r\\).\nThis procedure can be repeated iteratively for all the modes in the range of interest and it can significantly enhance the quality of found modal parameters for system with strong coupling.\nMDOF Modal analysis in the frequency domain (SISO) General Approach There are a number of situations in which the SDOF approach to modal analysis is inadequate and for these there exist several alternative methods which may generally be classified as MDOF modal analysis methods. These situations are generally those with closely coupled modes where the single mode approximation is inappropriate and those with extremely light damping for which measurements at resonance are inaccurate.\n Three approach to curve-fit the entire FRF in one step are considered here:\n a general approach to multi-mode curve-fitting a method based on the rational fraction FRF formulation a method particularly suited to very lightly-damped structures Method I - General Curve Fit approach - Non-linear Least Squares (NLLS) We shall denote the individual FRF measured data as: \\[ H_{jk}^m(\\Omega_l) = H_l^m \\] while the corresponding \u0026ldquo;theoretical\u0026rdquo; values are:\n\\begin{equation} \\begin{aligned} H_l \u0026amp;=H_{jk}(\\Omega_l) \\\\\\\n\u0026amp;= \\sum_{s=m_1}^{m_2}\\frac{{}_sA_{jk}}{\\omega_s^2 - \\Omega_l^2 + i \\eta_s \\omega_s^2} + \\frac{1}{K_{jk}^R} - \\frac{1}{\\Omega_l^2 M_{jk}^R} \\end{aligned} \\end{equation}\nwhere the coefficients \\({}_1A_{jk}, {}_2A_{jk}, \\dots, \\omega_1, \\omega_2, \\dots, \\eta_1, \\eta_2, \\dots, K_{jk}^R \\text{ and }M_{jk}^R\\) are all to be determined.\nWe can define an individual error as:\n\\begin{equation} \\epsilon_l = H_l^m - H_l \\end{equation}\nand express this as a scalar quantity:\n\\begin{equation} E_l = \\left| \\epsilon_l^2 \\right| \\end{equation}\nIf we further increase the generality by attaching a weighting factor \\(w_l\\) to each frequency point of interest, then the curve fit process has to determine the values of the unknown coefficients such that the total error:\n\\begin{equation} E = \\sum_{l = 1}^p w_l E_l \\end{equation}\nis minimized.\nThis is achieved by differentiating eq:error_weighted with respect to each unknown in turn, thus generating a set of as many equations as there are unknown:\n\\begin{equation} \\frac{d E}{d q} = 0; \\quad q = {}_1A_{jk}, {}_2A_{jk}, \\dots \\end{equation}\nUnfortunately, this set of equations are not linear in many of the coefficients and thus cannot be solved directly. It is from this point that the differing algorithms choose their individual procedures: making various simplifications, assumptions or linearizing the expressions.\nMethod II - Rational Fraction Polynomial Method (RFP) The method which has emerged as one the standard frequency domain modal analysis methods is that known as the Rational Fraction Polynomial (RFP) method. This method is a special version of the general curve fitting approach but is based on a different formulation for the theoretical expression used for the FRF.\n \\begin{subequations} \\begin{align} H(\\omega) \u0026amp;= \\sum_{r=1}^N \\frac{A_r}{\\omega_r^2 - \\omega^2 + 2 i \\omega \\omega_r \\xi_r} \\label{eq:frf_clasic} \\\\\\\n\u0026amp;= \\frac{b_0 + b_1(i\\omega) + \\dots + b_{2N-1}(i\\omega)^{2N-1}}{a_0 + a_1(i\\omega) + \\dots + a_{2N}(i\\omega)^{2N}} \\label{eq:frf_rational} \\end{align} \\end{subequations}\nIn this formulation, we have adopted the viscous damping model.\n The unknown coefficients \\(a_0, \\dots, a_{2N}, b_0, \\dots, b_{2N-1}\\) are not the modal properties but are related to them and are computed in a further stage of processing.\nThe particular advantage of this approach is the possibility of formulating the curve fitting problem as a linear set of equations, thereby making the solution amenable to a direct matrix solution.\nWe shall denote each of our measured FRF data point by \\(\\hat{H}_k\\), where \\(\\hat{H}_k = \\hat{H}(\\omega_k)\\), and define the error between that measured value and the corresponding value derived from the curve-fit expression as\n\\begin{equation} e_k = \\frac{b_0 + b_1(i\\omega_k) + \\dots + b_{2m-1}(i\\omega_k)^{2m-1}}{a_0 + a_1(i\\omega_k) + \\dots + a_{2m}(i\\omega_k)^{2m}} - \\hat{H}_k \\end{equation}\nleading to the modified, but more convenient version actually used in the analysis\n\\begin{equation} \\begin{aligned} e_k^\\prime \u0026amp;= \\left( b_0 + b_1(i\\omega_k) + \\dots + b_{2m-1}(i\\omega_k)^{2m-1} \\right)\\\\\\\n\u0026amp;- \\hat{H}_k\\left( a_0 + a_1(i\\omega_k) + \\dots + a_{2m}(i\\omega_k)^{2m} \\right) \\end{aligned} \\end{equation}\nIn these expressions, only \\(m\\) modes are included in the theoretical FRF formula: the true number of modes, \\(N\\), is actually one of the unknowns to be determined during the analysis. Equation eq:rpf_error can be rewritten as follows:\n\\begin{equation} \\begin{aligned} e_k^\\prime \u0026amp;= \\begin{Bmatrix} 1 \u0026amp; i \\omega_k \u0026amp; \\dots \u0026amp; (i\\omega_k)^{2m-1} \\end{Bmatrix} \\begin{Bmatrix} b_0 \\ \\vdots \\ b_{2m-1} \\end{Bmatrix}\\\\\\\n\u0026amp;- \\hat{H}_k \\begin{Bmatrix} 1 \u0026amp; i\\omega_k \u0026amp; \\dots \u0026amp; (i\\omega_k)^{2m-1} \\end{Bmatrix} \\begin{Bmatrix} a_0 \\ \\vdots \\ a_{2m-1} \\end{Bmatrix}\\\\\\\n\u0026amp;- \\hat{H}_k (i\\omega_k)^{2m} a_{2m} \\end{aligned} \\end{equation}\nand the \\(L\\) linear equations corresponding to \\(L\\) individual frequency points can be combined in matrix form:\n\\begin{equation} \\begin{aligned} \\{E^\\prime\\}_{L \\times 1} \u0026amp;= [P]_{L\\times 2m} \\{b\\}_{2m\\times 1}\\\\\\\n\u0026amp;- [T]_{L\\times(2m+1)} \\{a\\}_{(2m+1)\\times 1}\\\\\\\n\u0026amp;- \\{W\\}_{L\\times 1} \\end{aligned} \\end{equation}\nSolution for the unknown coefficients \\(a_j, \\dots, b_k, \\dots\\) is achieved by minimizing the error function\n\\begin{equation} J = \\{E^*\\}^T\\{E\\} \\end{equation}\nand this leads to\n\\begin{equation} \\begin{bmatrix} [Y] \u0026amp; [X] \\\\\\\n[X]^T \u0026amp; [Z] \\end{bmatrix}_{L \\times (4m+1)} \\begin{Bmatrix} \\{b\\} \\ \\{a\\} \\end{Bmatrix}_{(4m+1) \\times 1} = \\begin{Bmatrix} \\{B\\} \\ \\{F\\} \\end{Bmatrix}_{L \\times 1} \\end{equation}\nwhere \\([X], [Y], [Z], \\{G\\}\\) and \\(\\{F\\}\\) are known measured quantities:\n\\begin{equation} \\begin{aligned} [Y] \u0026amp;= \\text{Re}\\left( [P^*]^T[P] \\right);\\quad [X] = \\text{Re}\\left( [P^*]^T[T] \\right); \\\\\\\n[Z] \u0026amp;= \\text{Re}\\left( [T^*]^T[T] \\right); \\\\\\\n\\{G\\} \u0026amp;= \\text{Re}\\left( [P^*]\\{W\\} \\right);\\quad \\{F\\} = \\text{Re}\\left( [T^*]\\{W\\} \\right); \\end{aligned} \\end{equation}\nOnce the solution has been obtained for the coefficients \\(a_k, \\dots , b_k, \\dots\\) then the second stage of the modal analysis can be performed in which the required modal parameters are derived. This is usually done by solving the two polynomial expressions which form the numerator and denominator of equations eq:frf_clasic and eq:frf_rational:\n the denominator is used to obtain the natural frequencies \\(\\omega_r\\) and damping factors \\(\\xi_r\\) the numerator is used to determine the complex modal constants \\(A_r\\) In order to determine the order, the analysis is repeated using different assumed values for the order \\(m\\) and are compared. For each analysis, there will be properties found for as many modes as prescribed by the chosen model order. Some of these will be genuine modes while others will be fictitious modes. Various strategies may be adopted to separate the fictitious and real modes:\n measuring the difference between the original FRF curve and that regenerated using the modal properties derived measuring the consistency of the various modal parameters for different model order choices and eliminating those which vary widely from run to run In all these checks, interest is concentrated on the repeatability of the various modal properties: modes which reappear for all choices of data and model condition are believed to be genuine, while those which vary from run to run are more likely to have computational features due to the curve-fitting requirements as their origins, rather than physical ones.\nMethod III - Lightly Damped Structures It is found that some structures do not provide FRF data which respond very well to the above modal analysis procedures mainly because of the difficulties encountered in acquiring good measurements near resonance.\nFor such structures, it is often the case that interest is confined to an undamped model of the test structure since the damping in a complete structural assembly is provided mostly from the joints and not from the components themselves. Thus, there is scope for an alternative method of modal analysis which is capable of providing the required modal properties, in this case natural frequencies and real modal constants, using data measured away from the resonance regions.\nThe requirements for the analysis are as follows:\n measure the FRF over the frequency range of interest locate the resonances and note the corresponding natural frequencies select individual FRF measurement data points from as many frequencies as there are modes, plus two, confining the selection to points away from resonance using the data thus gathered, compute the modal constants construct a regenerated curve and compare this with the full set of measured data points Global modal analysis methods in the frequency domain General Approach More recent curve fitting procedures are capable of performing a multi curve fit instead of just working with individual FRF curves. They fit several FRF curves simultaneously, taking due account of the fact that the properties of all the individual curves are related by being from the same structure: all FRF plots on a given testpiece should indicate the same values for natural frequencies and damping factor of each mode.\nSuch methods have the advantage of producing a unique and consistent model as direct output.\n A way in which a set of measured FRF curves may be used collectively, rather than singly, is by the construction of a single Composite Response Function:\n\\begin{equation} \\sum_j\\sum_k H_{jk}(\\omega) = \\sum_j\\sum_k\\sum_{r=1}^N (\\dots) = HH(\\omega) \\end{equation}\nwith \\[ H_{jk} = \\sum_{r=1}^n \\frac{{}_rA_{jk}}{\\omega_r^2 - \\omega^2 + i \\eta_r \\omega_r^2} \\]\n The composite function \\(HH(\\omega)\\) can provide a useful means of determining a single (average) value for the natural frequency and damping factor for each mode where the individual functions would each indicate slightly different values. As an example, a set of mobilities measured are shown individually in figure fig:composite_raw and their summation shown as a single composite curve in figure fig:composite_sum.\n\nTable 23: Set of measured FRF Individual curves Composite curve width=\\linewidth width=\\linewidth The global analysis methods have the disadvantages first, that the computation power required is high and second that there may be valid reasons why the various FRF curves exhibit slight differences in their characteristics and it may not always be appropriate to average them.\nGlobal Rational Fraction Polynomial Method (GRFP) The basic Rational Fraction Polynomial (RFP) method that was described in the context of single FRF curve can be generalized to multi-FRF data. Indeed, all the FRFs from the same structure will have identical numerator polynomials. The number of unknown coefficients in a problem where there are \\(n\\) measured FRFs and \\(m\\) modes of vibration is of the order \\((n+1)(2m + 1)\\).\nGlobal SVD method A set of FRFs with a signal reference (such as are contained within a column from the complete FRF matrix) can be referred to the underlying modal model of the structure (assumed to have viscous damping) by the equation:\n\\begin{align*} \\{H(\\omega)\\}_k \u0026amp;= \\begin{Bmatrix} H_{1k}(\\omega) \\ \\vdots \\ H_{nk}(\\omega) \\ \\end{Bmatrix}_{n\\times 1} \\\\\\\n\u0026amp;= [\\Phi]_{n\\times N} \\{g_k(\\omega)\\}_{N\\times 1} + \\{R_k(\\omega)\\}_{n\\times 1} \\end{align*}\nwhere \\(\\{R_k(\\omega)\\}\\) is a vector containing the relevant residual terms and \\(\\{g_k(\\omega)\\}\\) is defined as: \\[ \\{g_k(\\omega)\\}_{N\\times 1} = [i \\omega - s_r]_{N\\times N}^{-1} \\{\\phi_k\\}_{N\\times 1} \\]\nAlso \\[ \\{\\dot{H}(\\omega)\\}_k = [\\Phi] [s_r] \\{g_k(\\omega)\\} + \\{\\dot{R}_k(\\omega)\\} \\]\nNext, we can write the following expressions\n\\begin{equation} \\begin{aligned} \\{\\Delta H(\\omega_i)\\}_k \u0026amp;= \\{H(\\omega_i)\\}_k - \\{H(\\omega_{i+c})\\}_k \\\\\\\n\u0026amp;\\approx [\\Phi] \\{\\Delta g_k(\\omega_i)\\}_{N\\times 1} \\\\\\\n\\{\\Delta \\dot{H}(\\omega_i)\\}_k \u0026amp;\\approx [\\Phi] [s_r] \\{\\Delta g_k(\\omega_i)\\}_{N\\times 1} \\end{aligned} \\end{equation}\nIf we now consider data at several different frequencies \\(i = 1, 2, \\dots, L\\), we can write\n\\begin{equation} \\begin{aligned} [\\Delta H_k]_{n\\times L} \u0026amp;= [\\Phi] [\\Delta g_k]_{N\\times L} \\\\\\\n[\\Delta \\dot{H}_k]_{n\\times L} \u0026amp;= [\\Phi] [s_r] [\\Delta g_k]_{N\\times L} \\end{aligned} \\end{equation}\nWe can construct an eigenvalue problem: \\[ \\left( [\\Delta \\dot{H}_k]^T - s_r [\\Delta H_k]^T \\right) \\{z\\}_r = \\{0\\} \\] where \\[ [z] = [\\Phi]^{+T} \\]\nIf we solve \\([z] = [\\Phi]^{+T}\\) using the SVD, we can determine the rank of the FRF matrices and thus the correct number of modes \\(m\\) to be identified, leading to the appropriate eigenvalues \\(s_r;\\ r=1, \\dots, m\\).\nThen, in order to determine the mode shapes, the modal constants can be recovered from:\n\\begin{equation} \\begin{aligned} \\begin{Bmatrix} H_{jk}(\\omega_1) \\ \\vdots \\ H_{jk}(\\omega_L) \\ \\end{Bmatrix}_{L\\times 1} = \u0026amp;\\begin{bmatrix} (i\\omega_1 - s_1)^{-1} \u0026amp; (i\\omega_1 - s_2)^{-1} \u0026amp; \\dots \\\\\\\n(i\\omega_2 - s_1)^{-1} \u0026amp; (i\\omega_2 - s_2)^{-1} \u0026amp; \\dots \\\\\\\n\\vdots \u0026amp; \\dots \u0026amp; \\dots \\\\\\\n\\vdots \u0026amp; \\dots \u0026amp; (i\\omega_L - s_m)^{-1} \\\\\\\n\\end{bmatrix}\\\\\\\n\u0026amp;\\begin{Bmatrix} {}_1A_{jk}\\ \\vdots \\ {}_mA_{jk} \\end{Bmatrix}_{m\\times 1} \\end{aligned} \\end{equation}\nUsing this approach, it is possible to extract a consistent set of modal parameters for the model whose FRFs have been supplied.\nConcluding comments In the task of extracting modal model parameters from measured test data, the analyst must rely on the skill of others who have coded the various analysis algorithms since these are generally complex. Because of this, the analyst must develop the various skills which enable him to select the most appropriate analysis procedure for each case and to make the best interpretation of the output of these analysis methods.\nIn this chapter, we have first highlighted the need for accuracy and reliability in the measured data that is the source of a modal analysis. If these data are not of high quality, the resulting modal model cannot be expected to be any better. Thus, attention must be paid at the initial phases to ascertain and to assure the necessary quality of the raw data. Question as to the correct order for the model and the most appropriate model for damping are often foremost among these early interpretations.\nA hierarchy of different types of modal analysis procedure have been cataloged, from the simple SDOF one-mode-at-a-time for a single response function, through MDOF methods which reveal several modes at a time, to global analysis methods where several modes are extracted simultaneously from several FRFs.\nDerivation of Mathematical Models Introduction We consider now the derivation of a mathematical model to describe the dynamic behavior of the test structure. Various types of model exists and are suitable in different cases. The most important aspect of the modeling process is to decide exactly which type of model we should seek before setting out on the acquisition and processing of experimental data.\nThree main categories of model are identified:\n Spatial model: mass, stiffness and damping Modal model: natural frequencies, mode shapes Response model: frequency response functions There exist complete models of each type and the more realistic incomplete models we are obliged to consider in practical cases.\nThe three types of model are usually derived as \\(\\text{Spatial}\\Rightarrow\\text{Modal}\\Rightarrow\\text{Response}\\) for theoretical analysis, and conversely, as \\(\\text{Response}\\Rightarrow\\text{Modal}\\Rightarrow\\text{Spatial}\\) for an experimental study. We may now view them in a different order, according to the facility with which each may be derived from the test data: Modal, Response and then Spatial. This reflects the quantity of the completeness of data required in each case.\n A modal model can be constructed using just one single mode, and including only a handful of degrees of freedom, even though the structure has many modes and many DOFs. Such a model can be built up by adding data from more modes, but it is not a requirement that all the modes should be included nor even that all the modes in the frequency range of interest be taken into account. Thus such a model may be derived with relatively few, or equally, with many data.\n The response type of model in the form of a FRF matrix, such as the mobility matrix, also needs only to include information concerning a limited number of point of interest: not all the DOFs need be considered. However, in this case, it is generally required that the model be valid over a specified frequency range, and here it is necessary that all the modes in that range be included. Also, some account should be taken of the modes whose natural frequencies lie outside of the range of interest to allow for the residual effects. Thus, the response type of model demands more data to be collected from the tests.\n A representative spatial model can only be obtained if we have measured most of the modes of the structure and if we have made measurements at a great many of the DOFs it possesses. This is generally a very demanding requirement to meet, and as result, the derivation of a spatial model from test data is very difficult to achieve.\n This chapter is organized with the following structure:\n We shall describe what data must be measured in order to construct a suitable model and what checks can be made to access the reliability of the model. We shall discuss a number of techniques for \u0026ldquo;refining\u0026rdquo; the model which is obtained from the test so that it matches a number of features of the analytical model. For instance, it is common to extract complex mode shapes from the test data on real structures but the analytical models are usually undamped so that their modes are real. We may wish to expand our experimental model, or, alternatively, reduce the theoretical ones so that the two models which are to be compared are at least of the same order. We shall explore some of the properties of the models which can be derived by the means described here. Modal models Requirements to construct modal model A modal model of a structure consists of two matrices:\n one containing the natural frequencies and damping factors: the eigenvalues one which describes the shapes of the corresponding modes: the eigenvectors Thus, we can construct such a model with just a single mode, and a more complete model is assembled simply by adding together a set of these single-mode descriptions.\nThe basic method of deriving a modal model is as follows. First, we note that from a single FRF curve, \\(H_{jk}(\\omega)\\), it is possible to extract certain modal properties for the \\(r^\\text{th}\\) mode by modal analysis:\n\\begin{equation} H_{jk}(\\omega) \\longrightarrow \\omega_r, \\eta_r, {}_rA_{jk}; \\quad r=1, m \\end{equation}\nNow, although this gives us the natural frequency and damping properties directly, it does not explicitly yield the mode shape: only a modal constant \\({}_rA_{jk}\\) which is formed from the mode shape data. In order to extract the individual elements \\(\\phi_{jr}\\) of the mode shape matrix \\([\\Phi]\\), it is necessary to make a series of measurements of specific FRFs including, especially, the point FRF at the excitation position. If we measure \\(H_{kk}\\), then by using eq:modal_model_from_frf, we also obtain the specific elements in the mode shape matrix corresponding to the excitation point:\n\\begin{equation} H_{kk}(\\omega) \\longrightarrow \\omega_r, \\eta_r, {}_rA_{jk} \\longrightarrow \\phi_{kr}; \\quad r=1, m \\end{equation}\nIf we then measure an associated transfer FRF using the same excitation position, such as \\(H_{jk}\\), we are able to deduce the mode shape element corresponding to the new response point \\(\\phi_{jr}\\) using the fact that the relevant modal constants may be combined with those from the point measurement:\n\\begin{equation} \\tcmbox{\\phi_{jr} = \\frac{{}_rA_{jk}}{\\phi_{kr}}} \\end{equation}\nHence, we find that in order to derive a modal model referred to a particular set of \\(n\\) coordinates, we need to measure and analysis a set of \\(n\\) FRF curves, all sharing the same excitation point and thus constituting one point FRF and \\((n-1)\\) transfer FRFs. In terms of the complete FRF matrix, this corresponds to measure the individual FRF of one entire column. It is also possible to measure one row of the FRF matrix. This corresponds of a set of \\(n\\) FRF curves sharing the same measurement point and varied excitation point.\nOften, several additional elements from the FRF matrix would be measured to provide a check, or to replace poor data, and sometimes measurement of a complete second column or row might be advised in order to ensure that one or more modes have not been missed by an unfortunate choice of exciter location. Indeed, if the exciter is placed at a nodal point of one of the modes, then there would be no indications at all of the existence of that mode because every modal constant would be zero for that mode. It may then require more than one measurement to confirm that we are not exciting the structure at a nodal point.\nOnce all the selected FRF curves have been measured and individually analyzed, we obtain a set of modal properties containing more data than needed:\n we may have determined many separate estimates for the natural frequencies and damping factors as these parameters are extracted from each FRF curve in the even we have measured more than one row or one column for the FRF matrix, we also obtain separate estimates for the mode shapes The simplest procedure is to average all the individual estimates that results in means values \\(\\tilde{\\omega}_r\\) and \\(\\tilde{\\eta}_r\\). In practice, not all the estimates should carry equal weight because some would probably be derived from much more satisfactory curve fits than others. A refined procedure would be to calculate a weighted mean of all the estimate using the quality factor obtained from the curve-fit procedure.\nIf we choose to accept a revised value for \\(\\omega_r\\) and \\(\\eta_r\\) of a particular mode, then the value for the modal constant should also be revised:\n\\begin{equation} {}_r\\tilde{A}_{jk} = {}_rA_{jk}\\frac{\\tilde{\\omega}_r^2 \\tilde{\\eta}_r}{\\omega_r^2 \\eta_r} \\end{equation}\nThe final reduced model obtained consist of the two matrices which constitute a modal model, namely: \\[ \\left[ \\omega_r^2(1 + i\\eta_r) \\right]_{m\\times m};\\quad \\left[ \\Phi \\right]_{n\\times m} \\]\nDouble modes or repeated roots When a structure has two modes that are very close in frequency, it may be impossible to derive a true model for the structure. All we can define in these circumstances is a single equivalent mode which is, in fact, a combination of the two actual modes that are difficult to identify individually.\nHowever, single equivalent modes can lead to erroneous models and it is very important that we can detect the presence of double modes and that we can identify all the modes which are present.\nThe only way repeated modes can be detected and identified in a modal test is by using data from more than on reference. This means that we must measure FRF data from more than a single row or column (as many rows/columns as there are repeated roots).\nConstructing models of NSA structures Structures which are classified as Non-Self-Adjoint (NSA) have non-symmetric mass, stiffness or damping matrices. This often occurs in structures with rotating components. As a result, we cannot take advantage of the symmetry of the system matrices and just measuring a single row or column of the FRF matrix.\nIn the case of NSA structures, we are required to measure and analyze the elements in both a row and a column of the FRF matrix. A mathematical explanation is that this class of system have two types of eigenvectors (left-hand and right-hand) and thus there are twice as many eigenvectors elements to identify.\nQuality checks for modal models It is important to check the reliability of the obtain results. There are two such checks that can be recommended for this phase of the process.\nFirst, it is possible to regenerate FRFs from the modal model. These FRFs can be compared with measured data that as been used for the modal analysis. Furthermore, it is also possible to synthesize FRFs that have not yet been measured (and thus not used for the model), and then to measure the corresponding FRF on the structure and to compare. This test provides a powerful demonstration of the validity of the modal model.\nA second, more demanding but also more convincing, demonstration of the validity of the modal model is to use the model to predict how the dynamic properties of the test structure will change if it is subjected to a small structural modification, such as can be occasioned by adding a small mass at a selected point. Then such modification can be made and the real structure, measurements done and compare with the modified model.\nRefinement of modal models Need for model refinement Several differences exist between most test-derived models and analytical models that make their comparison difficult.\nThe first difference are on the mode shapes:\n test-derived: generally complex analytical: usually real if we use an undamped model Objective comparison between complex mode shapes and real mode shapes is then not possible and some refinement of one of the two sets are required.\nA second incompatibility lies in the difference in the order of the models:\n test-derived: relatively small order given by the number of measured DOFs \\(n\\) analytical: generally an order of magnitude greater than \\(n\\) There is then a desire to refine one or other model to bring them both to the same size for meaningful comparison.\nHowever, all the refinements involve approximations which means that a compromise has been made in order to achieve the greater degree of compatibility which is desired.\nComplex-to-real conversion As we usually don\u0026rsquo;t know the nature, extend and distribution of damping present in the system, the analytical model is chosen to be undamped. We wish here to be able to determine what would be the mode shapes of the tested structure if, by some means, we could remove the damping but leave everything else the same. Then we should be able to compare the modes.\nSimple method This simple method is to convert the mode shape vectors from complex to real by taking the modulus of each element and by assigning a phase to each of \\(\\SI{0}{\\degree}\\) or \\(\\SI{180}{\\degree}\\).\nAny phase angle of a complex mode shape element which is between \\(\\SI{-90}{\\degree}\\) and \\(\\SI{90}{\\degree}\\) is set to \\(\\SI{0}{\\degree}\\), while those between \\(\\SI{90}{\\degree}\\) and \\(\\SI{270}{\\degree}\\) are set to \\(\\SI{180}{\\degree}\\). This procedure can become difficult to apply in borderline cases when the phase is poorly defined.\nMulti point excitation - Asher\u0026rsquo;s method In this method, the test-derived model based on complex modes is used to synthesize the response that would be produced by the application of several simultaneous harmonic forces in order to establish what those forces would need to be in order to produce a mono-modal response vector.\nIf the optimum set of excitation forces for a given mode can be found, then they represent the forces that are actually being generated by the damping in the system at resonance of that mode. We can then deduce the dynamic properties of the structure with these effects removed.\nThe sequence of steps required to determine this solution is as follows:\n Compute \\([\\alpha(\\omega)]\\) from the complex modal model Determine the undamped system natural frequencies \\(\\omega_r\\) by solving the equation \\(\\det|\\text{Re}[\\alpha(\\omega)]|=0\\) Calculate the mono-phase vector for each mode of interest using \\(\\text{Re}[\\alpha(\\omega)]\\{\\hat{F}\\} = \\{0\\}\\) Calculate the undamped system mode shapes \\(\\{\\psi_u\\}\\) using the just-derived force vector: \\(\\{\\psi_u\\} = \\text{Im}[\\alpha(\\omega)]\\{\\hat{F}\\}\\) Matrix transformation We here seek a numerical solution to the expression linking the known damped modes and the unknown undamped modes. The steps are:\n Assume that \\(\\text{Re}[T_1]\\) is unity and calculate \\(\\text{Im}[T_1]\\) from \\[ \\text{Im}[T_1] = -[\\text{Re}[\\phi_d]]^T [\\text{Re}[\\phi_d]]^{-1} [\\text{Re}[\\phi_d]]^T \\text{Im}[\\phi_d] \\] calculate \\([M_1]\\) and \\([K_1]\\) from \\[ [M_1] = [T_1]^T[T_1]; \\quad [K_1] = [T_1]^T[\\lambda^2][T_1] \\] Solve the eigen-problem formed by \\([M_1]\\) and \\([K_1]\\) leading to \\[ [\\omega_r^2]; \\quad [T_2] \\] Calculate the real modes using \\[ [\\phi_u] = [\\phi_d][T_1][T_2] \\] Expansion of models An important model refinement is called expansion and consist of the addition to the actually measured modal data of estimates for selected DOFs which were not measured for one reason or another.\n Prior to conducting each modal test, decisions have to be made as to which of the many DOFs that exist on the structure will be measured. These decisions are made for various practical reasons:\n Limited test time Inaccessibility of some DOFs Anticipated low importance of motion in certain DOFs Three approaches to the expansion of measured modes will be mentioned here:\n Geometric interpolation using spline functions Expansion using the analytical model\u0026rsquo;s spatial properties Expansion using the analytical model\u0026rsquo;s modal properties In all three approached, we are in effect seeking a transformation matrix \\([T]\\) that allows us to construct a long eigenvector \\(\\{\\phi\\}_{N\\times 1}\\) from knowledge of a short (incomplete) one \\(\\{\\phi\\}_{n\\times 1}\\): \\[ \\{\\phi\\}_{N\\times 1} = [T]_{N\\times n} \\{\\phi\\}_{n\\times 1} \\]\n Interpolation Simple interpolation has a limited range of application and can only be used on structures which have large regions of relatively homogeneous structure: those with joints of abrupt changes are must less likely to respond to this form of expansion.\nThe method is simply geometric interpolation between the measured points themselves, such as by fitting a polynomial function through the measured points.\nExpansion using theoretical spatial model - Kidder\u0026rsquo;s method This interpolation uses a theoretical model\u0026rsquo;s mass and stiffness matrices in a form of an inverse Guyan reduction procedure.\nIf we partition the eigenvector of interest, \\(\\{\\phi_A\\}_r\\), into:\n the DOFs to be included: \\(\\{{}_A\\phi_1\\}_r\\) the DOFs which are not available from the measurements: \\(\\{{}_A\\phi_2\\}_r\\) then we may write:\n\\begin{equation*} \\left( \\begin{bmatrix} {}_AK_{11} \u0026amp; {}_AK_{12}\\\\\\\n{}_AK_{21} \u0026amp; {}_AK_{22} \\end{bmatrix} - \\omega_r^2 \\begin{bmatrix} {}_AM_{11} \u0026amp; {}_AM_{12}\\\\\\\n{}_AM_{21} \u0026amp; {}_AM_{22} \\end{bmatrix} \\right) \\begin{Bmatrix}{}_A\\phi_1\\{}_A\\phi_2\\end{Bmatrix} = \\{0\\} \\end{equation*}\nWe can use this relationship between the measured and unmeasured DOFs as the basic for an expansion of the incomplete measured mode shapes: \\[ \\{{}_A\\phi_2\\}_r = [T_{21}]\\{{}_A\\phi_1\\}_r \\] with \\[ [T_{12}] = - \\left( [{}_AK_{22}] - \\omega_r^2[{}_AM_{22}] \\right)^{-1} \\left( [{}_AK_{21}] - \\omega_r^2[{}_AM_{21}] \\right) \\]\nThe relation between the incomplete measured vector to the complete expanded vector is then\n\\begin{equation} \\tcmbox{ \\{\\tilde{\\phi}_X\\}_r = \\begin{Bmatrix} {}_X\\phi_1 \\ {}_X\\tilde{\\phi}_2 \\end{Bmatrix} = \\begin{bmatrix} [I] \\ [T_{21}] \\end{bmatrix} \\{{}_X\\phi_1\\}_r } \\end{equation}\nExpansion using analytical model mode shapes This method uses the analytical model for the interpolation, but is based on the mode shapes derived from the analytical modal spatial matrices, rather than on these matrices themselves.\nWe may write the following expression which relates the experimental model mode shapes to those of the analytical model:\n\\begin{equation*} \\begin{Bmatrix} {}_X\\phi_1 \\ {}_X\\phi_2 \\end{Bmatrix} = \\begin{bmatrix} [{}_A\\Phi_{11}] \u0026amp; [{}_A\\Phi_{12}] \\\\\\\n[{}_A\\Phi_{21}] \u0026amp; [{}_A\\Phi_{22}] \\end{bmatrix} \\begin{Bmatrix} \\gamma_1 \\ \\gamma_2 \\end{Bmatrix}_r \\end{equation*}\nThe basic of this method is to assume that the measured mode shape submatrix can be represented exactly by the simple relationship (which assumes that \\(\\{\\gamma_2\\}_r\\) can be taken to be zero):\n\\begin{equation} \\{{}_X\\phi_1\\}_r = [{}_A\\Phi_{11}] \\{\\gamma_1\\}_r \\end{equation}\nso that an estimate can be provided for the unmeasured part of the eigenvector from\n\\begin{equation} \\begin{aligned} \\{{}_X\\tilde{\\phi}_2\\} \u0026amp;= [T_{21}] \\{{}_X\\phi_1\\}_r \\\\\\\n\u0026amp;= [{}_A\\Phi_{21}][{}_A\\Phi_{11}]^{-1} \\{{}_X\\phi_1\\}_r \\end{aligned} \\end{equation}\nThus, we can write the full transformation as:\n\\begin{equation*} \\tcmbox{ \\{\\tilde{\\phi}_X\\}_r = \\begin{Bmatrix} {}_X\\phi_1 \\ {}_X\\tilde{\\phi}_2 \\end{Bmatrix} = \\begin{bmatrix} [{}_A\\Phi_{11}] \\ [{}_A\\Phi_{21}] \\end{bmatrix} [{}_A\\Phi_{11}]^{-1} \\{{}_X\\phi_1\\}_r } \\end{equation*}\nThis formula can be generalized to a single expression which covers several measured modes:\n\\begin{equation*} \\tcmbox{[\\tilde{\\Phi}_X]_{N\\times m_X} = \\underbrace{[\\Phi_A]_{N\\times m_A} [{}_A\\Phi_{11}]_{m_A \\times n}^+}_{[T]_{N\\times n}} [{}_A\\Phi_1]_{n\\times m_X}} \\end{equation*}\nwhere \\(m_X\\) and \\(m_A\\) are the number of experimental and analytical modes used, respectively.\nOther formulations for \\([T]\\) are possible, they involve various combinations of the available experimental mode shape data and those from the analytical model:\n\\begin{equation} \\begin{aligned} [T_{(1)}] \u0026amp;= [\\Phi_A][{}_A\\Phi_1]^+ \u0026amp; \\text{A model - based} \\\\\\\n[T_{(2)}] \u0026amp;= [\\Phi_A][{}_X\\Phi_1]^+ \u0026amp; \\text{X model - based} \\\\\\\n[T_{(3)}] \u0026amp;= \\begin{bmatrix}{}_X\\Phi_1\\{}_A\\Phi_2\\end{bmatrix}[{}_A\\Phi_1]^+ \u0026amp; \\text{Mixed/A - based} \\\\\\\n[T_{(4)}] \u0026amp;= \\begin{bmatrix}{}_X\\Phi_1\\{}_A\\Phi_2\\end{bmatrix}[{}_X\\Phi_1]^+ \u0026amp; \\text{Mixed/X - based} \\end{aligned} \\end{equation}\nIt must be pointed out that all the above formula are approximate because of the initial assumption that the higher modes are not required to be included in the process (that \\(\\{\\gamma_2\\}\\) is zero).\nReduction of models The model reduction, which is the inverse of the expansion process, is used when it is decided to obtain compatibility between two otherwise disparate models by reducing the size of the larger of the two models (almost always, the analytical model).\nModel reduction has less importance nowadays as computing power is widely available and because such reduction introduces approximations.\nThere are basically two different types of model reduction, both of which are applied to the spatial model (as opposed to the modal model as is the case in model expansion), and both achieve the same end result of yielding a smaller order model, with system matrices which are \\(n\\times n\\) instead of \\(N\\times N\\):\n a condensed model which seeks to represent the entire structure completely at a smaller number of DOFs. This type of model introduces approximation. a reduced model which has removed information related to the DOFs that are eliminated from the model, and which is thus an incomplete model. However, for the retained DOFs, no information is lost. Let\u0026rsquo;s summarize the basic feature of model reduction by condensation. The basic equation of motion for the original model can be expressed as: \\[ [M] \\ddot{x} + [K]\\{x\\} = \\{f\\} \\] and this can be partitioned into the kept DOFs \\(\\{x_1\\}\\) and the eliminated DOFs \\(\\{x_2\\}\\) (which by definition cannot have any excitation forces applied to them):\n\\begin{equation*} \\begin{bmatrix} M_{11} \u0026amp; M_{12} \\\\\\\nM_{21} \u0026amp; M_{22} \\end{bmatrix} \\begin{Bmatrix} \\ddot{x}_1 \\ \\ddot{x}_2 \\end{Bmatrix} + \\begin{bmatrix} K_{11} \u0026amp; K_{12} \\\\\\\nK_{21} \u0026amp; K_{22} \\end{bmatrix} \\begin{Bmatrix} x_1 \\ x_2 \\end{Bmatrix} = \\begin{Bmatrix} f_1 \\ 0 \\end{Bmatrix} \\end{equation*}\nA relationship between the kept and eliminated DOFs can be written in the form:\n\\begin{equation} \\begin{Bmatrix} x_1 \\ x_2 \\end{Bmatrix}_{N\\times 1} = \\begin{bmatrix} [I] \\ [T] \\end{bmatrix}_{N\\times n} \\{x_1\\}_{n\\times 1} \\end{equation}\nwhere the transformation matrix \\([T]\\) can be defined by\n\\begin{equation*} [T] = (1 - \\beta)\\left(-[K_{22}]^{-1}[K_{21}]\\right) + \\beta\\left(-[M_{22}]^{-1}[M_{21}]\\right) \\end{equation*}\nin which \\(\\beta\\) is a reduction coefficient whose limiting values are \\(\\beta = 0\\) for static reduction and \\(\\beta = 1\\) for dynamic reduction.\nThe reduced mass and stiffness matrices which are produced by this process are:\n\\begin{align*} \\left[M^R\\right]_{n\\times n} \u0026amp;= \\begin{bmatrix}[I] \u0026amp; [T]^T\\end{bmatrix}_{n\\times N} \\begin{bmatrix} M_{22} \u0026amp; M_{21} \\ M_{12} \u0026amp; M_{22} \\end{bmatrix}_{N\\times N} \\begin{bmatrix} [I] \\ [T] \\end{bmatrix}_{N\\times n}\\\\\\\n\\left[K^R\\right]_{n\\times n} \u0026amp;= \\begin{bmatrix}[I] \u0026amp; [T]^T\\end{bmatrix}_{n\\times N} \\begin{bmatrix} K_{22} \u0026amp; K_{21} \\ K_{12} \u0026amp; K_{22} \\end{bmatrix}_{N\\times N} \\begin{bmatrix} [I] \\ [T] \\end{bmatrix}_{N\\times n} \\end{align*}\nThe two limiting cases of static and dynamic reduction are of particular interest. In each case, one of the two system matrices is unchanged and the other one is:\n\\begin{align*} \\beta = 1:\\ \u0026amp;[M^{R\\text{static}}] = [M_{12}] \\left(-[M_{22}]^{-1}[M_{21}]\\right)^{-1} + [M_{11}]\\\\\\\n\u0026amp;[K^{R\\text{static}}] = [K]\\\\\\\n\\beta = 0:\\ \u0026amp;[M^{R\\text{dynamic}}] = [M]\\\\\\\n\u0026amp;[K^{R\\text{dynamic}}] = [K_{12}] \\left(-[K_{22}]^{-1}[K_{21}]\\right)^{-1} + [K_{11}] \\end{align*}\nThese reduction procedure can provide useful approximate models of the structure if an optimum choice of which DOFs to retain and which can be eliminated is made. However, a reduced theoretical model of this type does not correspond to a similarly low-order model which is obtained from experiments since that is formed simply by ignoring the eliminated DOFs. The measured data for the included DOFs are the same no matter how many DOFs are eliminated. Thus, there are inherent difficulties involved in using this mixture of condensed (but complete) theoretical models and reduced (but incomplete) experimental models.\nDisplay of modal models One of the attraction of the modal model is possibility of obtaining a graphic display of its form by plotting the mode shapes.\nThere are basically two choices for the graphical display of a modal model:\n a static plot a dynamic (animated) display Static Displays Deflected shapes A static display is often adequate for depicting relatively simple mode shapes. Measured coordinates of the test structure are first linked as shown on figure fig:static_display (a). Then, the grid of measured coordinate points is redrawn on the same plot but this time displaced by an amount proportional to the corresponding element in the mode shape vector as shown on figure fig:static_display (b). The elements in the vector are scaled according the normalization process used (usually mass-normalized), and their absolute magnitudes have no particular significance.\n\n Figure 31: Static display of modes shapes. (a) basic grid (b) single-frame deflection pattern (c) multiple-frame deflection pattern (d) complex mode (e) Argand diagram - quasi-real mode (f) Argand diagram - complex mode\n It is customary to select the largest eigenvector element and to scale the whole vector by an amount that makes that displacement on the plot a viable amount.\nMultiple frames If a series of deflection patterns that has been computed for a different instant of time are superimposed, we obtain a result as shown on figure fig:static_display (c). Some indication of the motion of the structure can be obtained, and the points of zero motion (nodes) can be clearly identified.\nIt is also possible, in this format, to give some indication of the essence of complex modes, as shown in figure fig:static_display (d). Complex modes do not, in general, exhibit fixed nodal points.\nArgand diagram plots Another form of representation which is useful for complex modes is the representation of the individual complex elements of the eigenvectors on a polar plot, as shown in the examples of figure fig:static_display (e) and (f). Although there is no attempt to show the physical deformation of the actual structure in this format, the complexity of the mode shape is graphically displayed.\nDynamic Display The coordinates for the basic picture are computed and stored for multiple fractions of a cycle. Then, 10 to 20 frames are stored and displayed with an update rate which is suitable to give a clear picture of the distortion of the structure during vibration.\nThe dynamic character of animation is the only really effective way to view modal complexity and is very useful to display complex modes.\nInterpretation of mode shape displays There are a number of features associated with mode shape displays that warrant a mention in the context of ensuring that the correct interpretation is made from viewing these displays.\nThe first concerns the consequences of viewing an incomplete model. In that case, there are no mode shape data from some of the points which comprise the grid which outlines the structure, and the indicated result is zero motion of those DOFs and this can be very misleading. For instance, if we measure the displacement of grid points in only one direction, \\(x\\) for instance, then the shape display will show significant x-direction motion of those points with no motion in the other transverse directions. We then tend to interpret this as a motion which is purely in the x-direction which may be clearly not true.\nThe second problem arises when the grid of measurement points that is chosen to display the mode shapes is too coarse in relation to the complexity of the deformation patterns that are to be displayed. This can be illustrated using a very simple example: suppose that our test structure is a straight beam, and that we decide to use just three response measurements points. If we consider the first six modes of the beam, whose mode shapes are sketched in figure fig:beam_modes, then we see that with this few measurement points, modes 1 and 5 look the same as do modes 2, 4 and 6. All the higher modes will be indistinguishable from these first few. This is a well known problem of spatial aliasing.\n\n Figure 32: Misinterpretation of mode shapes by spatial aliasing\n Response models There are two main requirements demanded for a response model:\n the capability of regeneration \u0026ldquo;theoretical\u0026rdquo; curves for the FRFs actually measured and analyzed synthesizing the other response functions which were not measured In general, the form of response model with which we are concerned is an FRF matrix whose order is dictated by the number of coordinates \\(n\\) included in the test. Also, as explained, it is normal in practice to measured and to analyze just a subset of the FRF matrix but rather to measure the full FRF matrix. Usually one column or one row with a few additional elements are measured. Thus, if we are to construct an acceptable response model, it will be necessary to synthesize those elements which have not been directly measured. However, in principle, this need present no major problem as it is possible to compute the full FRF matrix from a modal model using:\n\\begin{equation} \\tcmbox{[H]_{n\\times n} = [\\Phi]_{n\\times m} [\\lambda_r^2 - \\omega^2]_{m\\times m}^{-1} [\\Phi]_{m\\times n}^T} \\end{equation}\nRegenerated FRF curves It is usual practice to regenerate an FRF curve using the results from the modal analysis as a mean of checking the success of that analysis.\nIt should be noted that in order to construct an acceptable response model, it is essential that all the modes in the frequency range of interest be included, and that suitable residual terms are added to take account of out-of-range modes. In this respect, the demands of the response model are more stringent that those of the modal model.\nSynthesis of FRF curves One of the implications of equation eq:regenerate_full_frf_matrix is that it is possible to synthesize the FRF curves which were not measured. This arises because if we measured three individual FRF such as \\(H_{ik}(\\omega)\\), \\(H_{jk}(\\omega)\\) and \\(K_{kk}(\\omega)\\), then modal analysis of these yields the modal parameters from which it is possible to generate the FRF \\(H_{ij}(\\omega)\\), \\(H_{jj}(\\omega)\\), etc.\nHowever, it must be noted that there is an important limitation to this procedure which is highlighted in the example below.\n As an example, suppose that FRF data \\(H_{11}\\) and \\(H_{21}\\) are measured and analyzed in order to synthesize the FRF \\(H_{22}\\) initially unmeasured. The predict curve is compared with the measurements on figure fig:H22_without_residual. Clearly, the agreement is poor and would tend to indicate that the measurement/analysis process had not been successful. However, the synthesized curve contained only those terms relating to the modes which had actually been studied from \\(H_{11}\\) and \\(H_{21}\\) and this set of modes did not include all the modes of the structure. Thus, \\(H_{22}\\) omitted the influence of out-of-range modes. The inclusion of these two additional terms (obtained here only after measuring and analyzing \\(H_{22}\\) itself) resulted in the greatly improved predicted vs measured comparison shown in figure fig:H22_with_residual.\n \nTable 24: Synthesized FRF plot Using measured modal data only After inclusion of residual terms width=\\linewidth width=\\linewidth The appropriate expression for a \u0026ldquo;correct\u0026rdquo; response model, derived via a set of modal properties is thus\n\\begin{equation} [H] = [\\Phi] [\\lambda_r^2 - \\omega^2]^{-1} [\\Phi]^T + [\\text{Res}] \\end{equation}\nIn order to obtain all the data necessary to form such a model, we must first derive the modal model on which it is based and then find some means of determining the elements in the residual matrix \\([\\text{Res}]\\). This latter task may be done in several ways:\n It may be most accurately achieved by measuring all (or at least over half) of the elements in the FRF matrix, but this would increase a lot the quantity of data to be measured. Extend the frequency range of the modal test beyond that over which the model is eventually required. In this way, much of the content of the residual terms is included in separate modes and their actual magnitudes can be reduced to relatively unimportant dimensions. Try to access which of the many FRF elements are liable to need large residual terms and to make sure that these are included in the list of those which are measured and analyzed. We noted earlier that it is the point mobilities which are expected to have the highest-valued residuals and the remote transfers which will have the smallest. Thus, the significant terms in the \\([\\text{Res}]\\) matrix will generally be grouped close to the leading diagonal, and this suggests making measurements of most of the point mobility parameters. Direct measurement It should be noted that it is quite possible to develop a response model by measuring and analyzing all the elements in one half of the FRF matrix (this being symmetric) and by storing the results of this process without constructing a modal model. This procedure clearly solves the residual problem discussed above, but it will introduce inconsistencies into to model which renders it unsatisfactory.\nTransmissibilities One vibration parameter which has not been mentioned so far is that of transmissibility. This is a quantity which is quite widely used in vibration engineering practice to indicate the relative vibration levels between two points.\nIn general, transmissibility is considered to be a frequency dependent response function \\(T_{jk}(\\omega)\\) which defines the ratio between the response levels at two DOFs \\(j\\) and \\(k\\). Simply defined, we can write:\n\\begin{equation} T_{jk} (\\omega) = \\frac{X_j e^{i\\omega t}}{X_k e^{i\\omega t}} \\end{equation}\nbut, in fact, we need also to specify the excitation conditions that give rise to the two responses in question and these are missing from the above definition which is thus not rigorous. It does not give us enough information to be able to reproduce the conditions which have been used to measured \\(T_{jk}(\\omega)\\).\n If the transmissibility is measured during a modal test which has a single excitation, say at DOF \\(i\\), then we can define the transmissibility thus obtained more precisely:\n\\begin{equation} {}_iT_{jk}(\\omega) = \\frac{H_{ji}(\\omega)}{H_{ki}(\\omega)} \\end{equation}\n In general, the transmissibility depends significantly on the excitation point (\\({}_iT_{jk}(\\omega) \\neq {}_qT_{jk}(\\omega)\\) where \\(q\\) is a different DOF than \\(i\\)) and it is shown on figure fig:transmissibility_plots. This may explain why transmissibilities are not widely used in modal analysis.\n\n Figure 33: Transmissibility plots\n Base excitation The one application area where transmissibilities can be used as part of modal testing is in the case of base excitation. Base excitation is a type of test where the input is measured as a response at the drive point \\(x_0(t)\\), instead of as a force \\(f_1(t)\\), as illustrated in figure fig:base_excitation_configuration.\nWe can show that it is possible to determine, from measurements of \\(x_i\\) and \\(x_0\\), modal properties of natural frequency, damping factor and unscaled mode shape for each of the modes that are visible in the frequency range of measurement. The fact that the excitation force is not measured is responsible for the lack of formal scaling of the mode shapes.\n\nTable 25: Base excitation configuration Conventional modal test setup Base excitation setup height=4cm height=4cm Spatial models It would appear from the basic orthogonality properties of the modal model that there exists a simple means of constructing a spatial model from the modal model, thus this is not so. We have that:\n\\begin{equation} \\begin{aligned} [\\Phi]^T[M][\\Phi] \u0026amp;= [I]\\\\\\\n[\\Phi]^T[K][\\Phi] \u0026amp;= [\\lambda_r^2] \\end{aligned} \\end{equation}\nfrom which is would appear that we can write\n\\begin{equation} \\begin{aligned} [M] \u0026amp;= [\\Phi]^{-T} [I] [\\Phi]^{-1}\\\\\\\n[K] \u0026amp;= [\\Phi]^{-T} [\\lambda_r^2] [\\Phi]^{-1} \\end{aligned} \\end{equation}\nHowever, equation eq:m_k_from_modes is only applicable when we have available the complete \\(N \\times N\\) modal model.\nIt is much more usual to have an incomplete model in which the eigenvector matrix is rectangle and, as such, is non-invertible. One step which can be made using the incomplete data is the construction of \u0026ldquo;pseudo\u0026rdquo; flexibility and inverse-mass matrices. This is accomplished using the above equation in the form:\n\\begin{equation} \\begin{aligned} [K]_{n\\times n}^{-1} \u0026amp;= [\\Phi]_{n\\times m} [\\lambda_r^2]_{m\\times m}^{-1} [\\Phi]_{m\\times n}^T\\\\\\\n[M]_{n\\times n}^{-1} \u0026amp;= [\\Phi]_{n\\times m} [\\Phi]_{m\\times n}^T \\end{aligned} \\end{equation}\nBecause the rank of each pseudo matrix is less than its order, it cannot be inverted and so we are unable to construct stiffness or mass matrix from this approach.\nBibliography Ewins, D., Modal testing: theory, practice and application (2000), Baldock, Hertfordshire, England Philadelphia, PA: Wiley-Blackwell. ↩\n","permalink":"/book/ewins00_modal/","tags":null,"title":"Modal testing: theory, practice and application"},{"categories":null,"contents":" Tags Stewart Platforms, Vibration Isolation Reference (Chunling Du \u0026amp; Lihua Xie, 2010) Author(s) Du, C., \u0026amp; Xie, L. Year 2010 Read Chapter 1 and 3.\nBibliography Du, C., \u0026amp; Xie, L., Modeling and control of vibration in mechanical systems (2010), : CRC Press. ↩\n","permalink":"/book/du10_model_contr_vibrat_mechan_system/","tags":null,"title":"Modeling and control of vibration in mechanical systems"},{"categories":null,"contents":"Tags :\n\u0026lt;./biblio/references.bib\u0026gt;\nBacklinks Advanced motion control for precision mechatronics: control, identification, and learning of complex systems ","permalink":"/zettels/motion_control/","tags":null,"title":"Motion Control"},{"categories":null,"contents":"Tags :\n Reference (Chunling Du \u0026amp; Chee Khiang Pang, 2019) Author(s) Du, C., \u0026amp; Pang, C. K. Year 2019 Mechanical Actuation Systems Introduction When high bandwidth, high position accuracy and long stroke are required simultaneously: dual-stage systems composed of a coarse (or primary) actuator and a fine actuator working together are used.\nPopular choices for coarse actuator are:\n DC motor Voice coil motor (VCM) Permanent magnet stepper motor Permanent magnet linear synchronous motor As fine actuators, most of the time piezoelectric actuator are used.\nIn order to overcome fine actuator stringent stroke limitation and increase control bandwidth, three-stage actuation systems are necessary in practical applications.\nActuators Primary Actuator Without loss of generality, the VCM actuator is used as the primary actuator. When current passes through the coil, a force is produced which accelerates the actuator radially. The produced force is a function of the current \\(i_c\\): \\[ f_m = k_t i_c \\] where \\(k_t\\) is a linearized nominal value called the torque constant.\nThe resonance of the actuator is mainly due to the flexibility of the pivot bearing, arm, suspension.\nThen the bandwidth of the control loop is low and the resonances are not a limiting factor of the control design, the actuator model can be considered as follows: \\[ P_v(s) = \\frac{k_{vcm}}{s^2} \\]\nWhen the bandwidth is high, the actuator resonances have to be considered in the control design since the flexible resonance modes will reduce the system stability and affect the control performance. Then the actuator model becomes \\[ P_v(s) = \\frac{k_{vcm}}{s^2} P_r(s) \\] which includes the resonance model \\[ P_r(s) = \\Pi_{i=1}^{N} P_{ri}(s) \\] and the resonance \\(P_{ri}(s)\\) can be represented as one of the following forms\n\\begin{align*} P_{ri}(s) \u0026amp;= \\frac{\\omega_i^2}{s^2 + 2 \\xi_i \\omega_i s + \\omega_i^2} \\\\\\\nP_{ri}(s) \u0026amp;= \\frac{b_{1i} \\omega_i s + b_{0i} \\omega_i^2}{s^2 + 2 \\xi_i \\omega_i s + \\omega_i^2} \\\\\\\nP_{ri}(s) \u0026amp;= \\frac{b_{2i} s^2 + b_{1i} \\omega_i s + b_{0i} \\omega_i^2}{s^2 + 2 \\xi_i \\omega_i s + \\omega_i^2} \\end{align*}\nSecondary Actuators We here consider two types of secondary actuators: the PZT milliactuator (figure 1) and the microactuator.\n\n Figure 1: A PZT-actuator suspension\n There are three popular types of micro-actuators: electrostatic moving-slider microactuator, PZT slider-driven microactuator and thermal microactuator. There characteristics are shown on table 1.\n\nTable 1: Performance comparison of microactuators Elect. PZT Thermal TF \\(\\frac{K}{s^2 + 2\\xi\\omega s + \\omega^2}\\) \\(\\frac{K}{s^2 + 2\\xi\\omega s + \\omega^2}\\) \\(\\frac{K}{\\tau s + 1}\\) \\(\\tau\\) \\(\u0026lt;\\SI{0.1}{ms}\\) \\(\u0026lt;\\SI{0.05}{ms}\\) \\(\u0026gt;\\SI{0.1}{ms}\\) \\(omega\\) \\(1-\\SI{2}{kHz}\\) \\(20-\\SI{25}{kHz}\\) \\(\u0026gt;\\SI{15}{kHz}\\) Single-Stage Actuation Systems A typical closed-loop control system is shown on figure 2, where \\(P_v(s)\\) and \\(C(z)\\) represent the actuator system and its controller.\n\n Figure 2: Block diagram of a single-stage actuation system\n Dual-Stage Actuation Systems Dual-stage actuation mechanism for the hard disk drives consists of a VCM actuator and a secondary actuator placed between the VCM and the sensor head. The VCM is used as the primary stage to provide long track seeking but with poor accuracy and slow response time, while the secondary stage actuator is used to provide higher positioning accuracy and faster response but with a stroke limit.\n\n Figure 3: Block diagram of dual-stage actuation system\n Three-Stage Actuation Systems Due to the limited allowed stroke of the microactuator, the control bandwidth has to be restricted and that limits the dual-stage disturbance rejection capability.\nA three-stage actuation system is therefore introduced to further increase the bandwidth.\nTypically, a VCM actuator is used as the primary actuator, PZT milliactuator as the second stage actuator and a third actuator more collocated is used.\nHigh-Precision Positioning Control of Dual-Stage Actuation Systems Introduction The sensitivity function of the closed-loop system has provided a straightforward view of its disturbance rejection capability. It is demanded that the sensitivity function magnitude in the low-frequency range be sufficiently low, while its hump in high-frequency range stays low enough. In view of this, the controller design for dual-stage actuation systems adopts a weighting function to shape the sensitivity function.\nControl Schemes A popular control scheme for dual-stage actuation system is the decoupled structure as shown in figure 4.\n \\(C_v(z)\\) and \\(C_p(z)\\) are the controllers respectively, for the primary VCM actuator \\(P_v(s)\\) and the secondary actuator \\(P_p(s)\\). \\(\\hat{P}_p(z)\\) is an approximation of \\(P_p\\) to estimate \\(y_p\\). \\(d_1\\) and \\(d_2\\) denote internal disturbances \\(n\\) is the measurement noise \\(d_u\\) stands for external vibration \n Figure 4: Decoupled control structure for the dual-stage actuation system\n The open-loop transfer function from \\(pes\\) to \\(y\\) is \\[ G(z) = P_p(z) C_p(z) + P_v(z) C_v(z) + P_v(z) C_v(z) \\hat{P}_p(z) C_p(z) \\] And the overall sensitivity function of the closed loop system from \\(r\\) to \\(pes\\) is \\[ S(z) = \\frac{1}{1 + G(z)} \\] which is approximately \\[ S(z) = \\frac{1}{[1 + P_p(z) C_p(z)] [1 + P_v(z)C_v(z)]} \\] since within a certain bandwidth \\[ \\hat{P}_p(z) \\approx P_p(z) \\]\nThe sensitivity functions of the VCM loop and the secondary actuator loop are\n\\begin{equation} S_v(z) = \\frac{1}{1 + P_v(z) C_v(z)}, \\quad S_p(z) = \\frac{1}{1 + P_p(z) C_p(z)} \\end{equation}\nAnd we obtain that the dual-stage sensitivity function \\(S(z)\\) is the product of \\(S_v(z)\\) and \\(S_p(z)\\). Thus, the dual-stage system control design can be decoupled into two independent controller designs.\nAnother type of control scheme is the parallel structure as shown in figure 5. The open-loop transfer function from \\(pes\\) to \\(y\\) is \\[ G(z) = P_p(z) C_p(z) + P_v(z) C_v(z) \\]\nThe overall sensitivity function of the closed-loop system from \\(r\\) to \\(pes\\) is \\[ S(z) = \\frac{1}{1 + G(z)} = \\frac{1}{1 + P_p(z) C_p(z) + P_v(z) C_v(z)} \\]\n\n Figure 5: Parallel control structure for the dual-stage actuator system\n Because of the limited displacement range of the secondary actuator, the control efforts for the two actuators should be distributed properly when designing respective controllers to meet the required performance, make the actuators not conflict with each other, as well as prevent the saturation of the secondary actuator.\nController Design Method in the Continuous-Time Domain \\(\\mathcal{H}_\\infty\\) loop shaping method is used to design the controllers for the primary and secondary actuators. The structure of the \\(\\mathcal{H}_\\infty\\) loop shaping method is plotted in figure 6 where \\(W(s)\\) is a weighting function relevant to the designed control system performance such as the sensitivity function.\nFor a plant model \\(P(s)\\), a controller \\(C(s)\\) is to be designed such that the closed-loop system is stable and\n\\begin{equation} \\|T_{zw}\\|_\\infty \u0026lt; 1 \\end{equation}\nis satisfied, where \\(T_{zw}\\) is the transfer function from \\(w\\) to \\(z\\): \\(T_{zw} = S(s) W(s)\\).\n\n Figure 6: Block diagram for \\(\\mathcal{H}_\\infty\\) loop shaping method to design the controller \\(C(s)\\) with the weighting function \\(W(s)\\)\n Equation 1 means that \\(S(s)\\) can be shaped similarly to the inverse of the chosen weighting function \\(W(s)\\). One form of \\(W(s)\\) is taken as\n\\begin{equation} W(s) = \\frac{\\frac{1}{M}s^2 + 2\\xi\\omega\\frac{1}{\\sqrt{M}}s + \\omega^2}{s^2 + 2\\omega\\sqrt{\\epsilon}s + \\omega^2\\epsilon} \\end{equation}\nwhere \\(\\omega\\) is the desired bandwidth, \\(\\epsilon\\) is used to determine the desired low frequency level of sensitivity magnitude and \\(\\xi\\) is the damping ratio.\nThe controller can then be synthesis using the linear matrix inequality (LMI) approach.\nThe primary and secondary actuator control loops are designed separately for the dual-stage control systems. But when designing their respective controllers, certain performances are required for the two actuators, so that control efforts for the two actuators are distributed properly and the actuators don\u0026rsquo;t conflict with each other\u0026rsquo;s control authority. As seen in figure 7, the VCM primary actuator open loop has a higher gain at low frequencies, and the secondary actuator open loop has a higher gain in the high-frequency range.\n\n Figure 7: Frequency responses of \\(G_v(s) = C_v(s)P_v(s)\\) (solid line) and \\(G_p(s) = C_p(s) P_p(s)\\) (dotted line)\n The sensitivity functions are shown in figure 8, where the hump of \\(S_v\\) is arranged within the bandwidth of \\(S_p\\) and the hump of \\(S_p\\) is lowered as much as possible. This needs to decrease the bandwidth of the primary actuator loop and increase the bandwidth of the secondary actuator loop.\n\n Figure 8: Frequency response of \\(S_v(s)\\) and \\(S_p(s)\\)\n A basic requirement of the dual-stage actuation control system is to make the individual primary and secondary loops stable. It also required that the primary actuator path has a higher gain than the secondary actuator path at low frequency range and the secondary actuator path has a higher gain than the primary actuator path in high-frequency range. These can be achieve by choosing appropriate weighting function for the controllers design.\nConclusion The controller design has been discussed for high-precision positioning control of the dual-stage actuation systems. The \\(\\mathcal{H}_\\infty\\) loop shaping method has been applied and the design method has been presented. With the weighting functions, the desired sensitivity function can achieved. Such a design method can produce robust controllers with more disturbance rejection in the low frequency range and less disturbance amplification in the high-frequency range.\nModeling and Control of a Three-Stage Actuation System Introduction In view of the additional bandwidth requirement which is limited by stroke constraint and saturation of secondary actuators, three-stage actuation systems are thereby proposed to meet the demand of a higher bandwidth. In this section, a specific three-stage actuation system is presented and a controller strategy is proposed, which is based on a decoupled master-slave dual-stage control structure combined with a third stage actuation in parallel format.\nActuator and Vibration Modeling A VCM actuator is used as the first-stage actuator denoted by \\(P_v(s)\\), a PZT milliactuator as the second-stage actuator denoted by \\(P_p(s)\\), and a thermal microactuator denoted by \\(P_m(s)\\).\nControl Strategy and Controller Design Figure 9 shows the control structure for the three-stage actuation system.\nThe control scheme is based on the decoupled master-slave dual-stage control and the third stage microactuator is added in parallel with the dual-stage control system. The parallel format is advantageous to the overall control bandwidth enhancement, especially for the microactuator having limited stroke which restricts the bandwidth of its own loop. The reason why the decoupled control structure is adopted here is that its overall sensitivity function is the product of those of the two individual loops, and the VCM and the PTZ controllers can be designed separately.\n\n Figure 9: Control system for the three-stage actuation system\n The open-loop transfer function of the three-stage actuation system is derived as\n\\begin{equation} G(z) = G_v(z) + G_p(z) + G_v(z) G_p(z) + G_m(z) \\end{equation}\nwith\n\\begin{align*} G_v(z) \u0026amp;= P_v(z) C_v(z) \\\\\\\nG_p(z) \u0026amp;= P_p(z) C_p(z) \\\\\\\nG_m(z) \u0026amp;= P_m(z) C_m(z) \\end{align*}\nThe overall sensitivity function is given by\n\\begin{equation} S(z) = \\frac{1}{1 + G(z)} \\end{equation}\nThe VCM actuator \\(P_v(s)\\) works in a low bandwidth below \\(\\SI{1}{kHz}\\). The PZT actuated milliactuator \\(P_p(s)\\) works under a reasonably high bandwidth up to \\(\\SI{3}{kHz}\\). The third-stage actuator \\(P_m(s)\\) is used to further push the bandwidth as high as possible.\nThe control performances of both the VCM and the PZT actuators are limited by their dominant resonance modes. The open-loop frequency responses of the three stages are shown on figure 10.\n\n Figure 10: Frequency response of the open-loop transfer function\n The obtained sensitivity function is shown on figure 11.\n\n Figure 11: Sensitivity function of the VCM single stage, the dual-stage and the three-stage loops\n Performance Evaluation External vibration from the system working environment is much higher than the internal disturbance, especially for ultra-high precision positioning systems. In the presence of external vibration, the actuators control effort is dominantly determined by the external vibration. But because the actuator input is constrained, the external vibration level has to be limited. Otherwise, saturation will occur in the control loop and the control system performance will be degraded.\nTherefore, the stroke specification of the actuators, especially milliactuator and microactuators, is very important for achievable control performance. Higher stroke actuators have stronger abilities to make sure that the control performances are not degraded in the presence of external vibrations.\nFor the three-stage control architecture as shown on figure 9, the position error is \\[ e = -S(P_v d_1 + d_2 + d_e) + S n \\] The control signals and positions of the actuators are given by\n\\begin{align*} u_p \u0026amp;= C_p e,\\ y_p = P_p C_p e \\\\\\\nu_m \u0026amp;= C_m e,\\ y_m = P_m C_m e \\\\\\\nu_v \u0026amp;= C_v ( 1 + \\hat{P}_pC_p ) e,\\ y_v = P_v ( u_v + d_1 ) \\end{align*}\nThe controller design for the microactuators with input constraints must take into account both external vibration requirements and actuators\u0026rsquo; stroke, based on which an appropriate bandwidth should be decided when designing the control system. Higher bandwidth/higher level of disturbance generally means high stroke needed.\nDifferent Configurations of the Control System A decoupled control structure can be used for the three-stage actuation system (see figure 12).\nThe overall sensitivity function is \\[ S(z) = \\approx S_v(z) S_p(z) S_m(z) \\] with \\(S_v(z)\\) and \\(S_p(z)\\) are defined in equation 1 and \\[ S_m(z) = \\frac{1}{1 + P_m(z) C_m(z)} \\]\nDenote the dual-stage open-loop transfer function as \\(G_d\\) \\[ G_d(z) = G_v(z) + G_p(z) + G_v(z) G_p(z) \\]\nThe open-loop transfer function of the overall system is \\[ G(z) = G_d(z) + G_m(z) + G_d(z) G_m(z) \\]\n\n Figure 12: Decoupled control structure for the three-stage actuation system\n The control signals and the positions of the three actuators are\n\\begin{align*} u_p \u0026amp;= C_p(1 + \\hat{P}_m C_m) e, \\ y_p = P_p u_p \\\\\\\nu_m \u0026amp;= C_m e, \\ y_m = P_m M_m e \\\\\\\nu_v \u0026amp;= C_v(1 + \\hat{P}_p C_p) (1 + \\hat{P}_m C_m) e, \\ y_v = P_v u_v \\end{align*}\nThe decoupled configuration makes the low frequency gain much higher, and consequently there is much better rejection capability at low frequency compared to the parallel architecture (see figure 13).\n\n Figure 13: Frequency responses of the open-loop transfer functions for the three-stages parallel and decoupled structure\n Conclusion The relationship among the external vibration, the microactuator stroke, and the achievable control bandwidth has been discussed for being considered in the controller design. The discussion suggests that in addition to the traditional wisdom of just increasing the resonant frequency, adding more stroke to the microactuator will give more freedom to the loop shaping for the control system design.\nDual-Stage System Control Considering Secondary Actuator Stroke Limitation Introduction More Freedom Loop Shaping for Microactuator Controller Design Dual-Stage System Control Design for 5 kHz Bandwidth Evaluation with the Consideration of External Vibration and Microactuator Stroke Conclusion Saturation Control for Microactuators in Dual-Stage Actuation Systems Introduction Modeling and Feedback Control Anti-Windup Compensation Design Simulation and Experimental Results Conclusion Time Delay and Sampling Rate Effect on Control Performance of Dual-Stage Actuation Systems Introduction Modeling of Time Delay Dual-Stage Actuation System Modeling with Time Delay for Controller Design Controller Design with Time Delay for the Dual-Stage Actuation Systems Time Delay Effect on Dual-Stage System Control Performance Sampling Rate Effect on Dual-Stage System Control Performance Conclusion PZT Hysteresis Modeling and Compensation Introduction Modeling of Hysteresis PI Model GPI Model Inverse GPI Model Application of GPI Model to a PZT-Actuated Structure Modeling of the Hysteresis in the PZT-Actuated Structure Hysteresis Compensator Design Experimental Verification Conclusion Seeking Control of Dual-Stage Actuation Systems with Trajectory Optimization Introduction Current Profile of VCM Primary Actuator PTOS Method A General Form of VCM Current Profiles Control System Structure for the Dual-Stage Actuation System Design of VCM Current Profile a[sub(v)] and Dual-Stage Reference Trajectory r[sub(d)] Seeking within PZT Milliactuator Stroke Seeking over PZT Milliactuator Stroke Conclusion High-Frequency Vibration Control Using PZT Active Damping Introduction Singular Perturbation Method-Based Controller Design Singular Perturbation Control Topology Identification of Fast Dynamics Using PZT as a Sensor Design of Controllers Fast Subsystem Estimator G[sub(v)][sup(*)] Fast Controller C[sub(v)] Slow Controller C[sub(v)] Simulation and Experimental Results Frequency Responses Time Responses H[sub(2)] Controller Design Design of Csub(d) with H[sub(2)] Method and Notch Filters Design of Mixed H[sub(2)]/H[sub(∞)] Controller Csub(d) Application Results System Modeling H[sub(2)] Active Damping Control Mixed H[sub(2)]/H[sub(∞)] Active Damping Control Experimental Results Conclusion Self-Sensing Actuation of Dual-Stage Systems Introduction Estimation of PZT Secondary Actuator’s Displacement y[sub(p)][sup(*)] Self-Sensing Actuation and Bridge Circuit PZT Displacement Estimation Circuit H[sub(B)] Design of Controllers VCM Controller and Controller C[sub(D)] PZT Controller Performance Evaluation Effectiveness of C[sub(D)] Position Errors Conclusion Modeling and Control of a MEMS Micro X–Y Stage Media Platform Introduction MEMS Micro X–Y Stage Design and Simulation of Micro X–Y Stage Static Dynamic Modeling of Micro X–Y Stage Fabrication of the MEMS Micro X–Y Stage Capacitive Self-Sensing Actuation Design of CSSA Bridge Circuit Experimental Verification Robust Decoupling Controller Design Choice of Pre-Shaping Filters Controller Synthesis Frequency Responses Time Responses Robustness Analysis Conclusion Conclusions Many secondary actuators have been developed in addition to primary actuators in the field of mechanical actuation systems. The aim is to provide high performance such as high precision and fast response. Several types of secondary actuators have been introduced such as PZT milliactuator, electrostatic microactuator, PZT microactuator, and thermal microactuator. Comparison of these secondary actuators has been made, and these secondary actuators have made dual and multi-stage actuation mechanisms possible.\nThree-stage actuation systems have been proposed for the demand of wider bandwidth, to overcome the limitation by stroke constraint and saturation of secondary actuators. After the characteristics of the three-stage systems have been developed and the models have been identified, the control strategy and algorithm have been developed to deal with vibrations and meet different requirements. Particularly, for the three-stage actuation systems, the presented control strategies make it easy to further push the bandwidth and meet the performance requirement. The control of the thermal microactuator based dual-stage system has been discussed in detail, including linearization and controller design method.\nThe developed advanced algorithms applied in the multi-stage systems include \\(\\mathcal{H}_\\infty\\) loop shaping, anti-windup compensation, \\(\\mathcal{H}_2\\) control method, and mixed \\(\\mathcal{H}_2/\\mathcal{H}_\\infty\\) control method. Typical problems of the milli and micro-actuators as the secondary actuators have been considered and appropriate solutions have been presented such as saturation compensation, hysteresis modeling and compensation, stroke limitation, and PZT self-sensing scheme. Time delay and sampling rate effect on the control performance have been analyzed to help select appropriate sampling rate and design suitable controllers.\nSpecific usage of PZT elements has been produced for system performance improvement. Using PZT elements as a sensor to deal with high-frequency vibration beyond the bandwidth has been proposed and systematic controller design methods have been developed. As a more advanced concept, PZT elements being used as actuator and sensor simultaneously has also been addressed in this book with detailed scheme and controller design methodology for effective utilization.\nBibliography Du, C., \u0026amp; Pang, C. K., Multi-stage actuation systems and control (2019), Boca Raton, FL: CRC Press. ↩\n","permalink":"/book/du19_multi_actuat_system_contr/","tags":null,"title":"Multi-stage actuation systems and control"},{"categories":null,"contents":"Tags :\n\u0026lt;./biblio/references.bib\u0026gt;\nBacklinks Position control in lithographic equipment Implementation challenges for multivariable control: what you did not learn in school! Simultaneous, fault-tolerant vibration isolation and pointing control of flexure jointed hexapods Multivariable control systems: an engineering approach Multivariable feedback control: analysis and design ","permalink":"/zettels/multivariable_control/","tags":null,"title":"Multivariable Control"},{"categories":null,"contents":" Tags Multivariable Control Reference (Albertos \u0026amp; Antonio, 2004) Author(s) Albertos, P., \u0026amp; Antonio, S. Year 2004 Bibliography Albertos, P., \u0026amp; Antonio, S., Multivariable control systems: an engineering approach (2004), : Springer-Verlag. ↩\n","permalink":"/book/albertos04_multiv_contr_system/","tags":null,"title":"Multivariable control systems: an engineering approach"},{"categories":null,"contents":" Tags Reference Books, Multivariable Control Reference (Skogestad \u0026amp; Postlethwaite, 2007) Author(s) Skogestad, S., \u0026amp; Postlethwaite, I. Year 2007 \\( % H Infini \\newcommand{\\hinf}{\\mathcal{H}_\\infty} % H 2 \\newcommand{\\htwo}{\\mathcal{H}_2} % Omega \\newcommand{\\w}{\\omega} % H-Infinity Norm \\newcommand{\\hnorm}[1]{\\left\\|#1\\right\\|_{\\infty}} % H-2 Norm \\newcommand{\\normtwo}[1]{\\left\\|#1\\right\\|_{2}} % Norm \\newcommand{\\norm}[1]{\\left\\|#1\\right\\|} % Absolute value \\newcommand{\\abs}[1]{\\left\\lvert#1\\right\\lvert} % Maximum for all omega \\newcommand{\\maxw}{\\text{max}_{\\omega}} % Maximum singular value \\newcommand{\\maxsv}{\\overline{\\sigma}} % Minimum singular value \\newcommand{\\minsv}{\\underline{\\sigma}} % Under bar \\newcommand{\\ubar}[1]{\\text{\\b{$#1$}}} % Diag keyword \\newcommand{\\diag}[1]{\\text{diag}\\{{#1}\\}} % Vector \\newcommand{\\colvec}[1]{\\begin{bmatrix}#1\\end{bmatrix}} \\) \\( \\newcommand{\\tcmbox}[1]{\\boxed{#1}} % Simulate SIunitx \\newcommand{\\SI}[2]{#1\\,#2} \\newcommand{\\ang}[1]{#1^{\\circ}} \\newcommand{\\degree}{^{\\circ}} \\newcommand{\\radian}{\\text{rad}} \\newcommand{\\percent}{\\%} \\newcommand{\\decibel}{\\text{dB}} \\newcommand{\\per}{/} % Bug with subequations \\newcommand{\\eatLabel}[2]{} \\newenvironment{subequations}{\\eatLabel}{} \\) Introduction \nThe Process of Control System Design The process of designing a control system is a step by step design procedure as follows:\n Study the system (plant) to be controlled and obtain initial information about the control objectives model the system and simplify the model, if necessary scale the variables and analyze the resulting model; determine its properties Decide which variables are to be controlled (controlled outputs) Decide on the measurements and manipulated variables: what sensors and actuators will be used and where will they be placed? Select the control configuration Decide on the type of controller to be used Decide on performance specifications, based on the overall control objectives Design a controller Analyze the resulting controlled system to see if the specifications are satisfied; and if they are not satisfied modify the specifications or the type of controller Simulate the resulting controlled system Repeat from step 2 if necessary Choose hardware and software and implement the controller Test and validate the control system, and tune the controller on-line, if necessary Input-output controllability analysis is studied in section sec:perf_limit_siso for SISO systems and in section sec:perf_limit_mimo for MIMO systems. The steps 4, 5, 6 and 7 are corresponding to the control structure design. This is treated in section sec:controller_structure_design. The design of the controller is described in section sec:controller_design. The analysis of performance and robustness of a controlled system is studied in sections sec:uncertainty_robustness_siso and sec:robust_perf_mimo.\nThe Control Problem The objective of a control system is to make the output \\(y\\) behave in a desired way by manipulating the plant input \\(u\\). The regulator problem is to manipulate \\(u\\) to counteract the effect of a disturbance \\(d\\). The servo problem is to manipulate \\(u\\) to keep the output close to a given reference input \\(r\\).\nIn both cases, we want the control error \\(e = y - r\\) to be small. The algorithm for adjusting \\(u\\) based on \\(y\\) is the controller \\(K\\). To arrive at a good design for \\(K\\) we need information about the expected disturbances, the reference inputs, the plant model \\(G\\) and disturbance model \\(G_d\\).\nA major source of difficulty is that models may be inaccurate or may change with time. The inaccuracy in \\(G\\) may cause instability problems as it is part of the feedback loop. To deal with such a problem, the concept of model uncertainty will be used.\n Nominal Stability (NS) The system is stable with no model uncertainty Nominal Performance (NP) The system satisfies the performance specifications with no model uncertainty Robust Stability (RS) The system is stable for all perturbed plants about the nominal model up to the worst case uncertainty Robust Performance (RP) The system satisfies the performance specifications for all perturbed plants about the nominal model up to the worst-case model uncertainty Transfer Functions Properties of transfer functions:\n A system \\(G(s)\\) is strictly proper if \\(G(s) \\rightarrow 0\\) as \\(\\w \\rightarrow \\infty\\) A system \\(G(s)\\) is semi-proper if \\(G(s) \\rightarrow D \\ne 0\\) as \\(\\w \\rightarrow \\infty\\) A system \\(G(s)\\) is proper if \\(G(s)\\) is strictly proper or semi-proper The order of the system noted \\(n\\) and is the order of the denominator (or pole polynomial) of its matrix transfer function Scaling Scaling is very important in applications, both for model analysis (input-output controllability) and for controller design.\nThe scaling is done by dividing each variable by its maximum expected or allowed change. That way, the scaled variable should be less than one in magnitude.\nWe denote variables in their unscaled units by a hat.\n \\(d = \\hat{d}/D_d\\) with \\(D_d = \\hat{d}_{\\max}\\) is the largest expected change in disturbance \\(u = \\hat{u}/D_u\\) with \\(D_u = \\hat{u}_{\\max}\\) is the largest allowed input change The variables \\(\\hat{y}\\), \\(\\hat{r}\\) and \\(\\hat{e}\\) are in the same unit, so we choose to scale them with respect to the maximum allowed control error:\n \\(e = \\hat{e}/D_e\\) with \\(D_e = \\hat{e}_{\\max}\\) is the largest allowed control error \\(r = \\hat{r}/D_e\\) \\(y = \\hat{y}/D_e\\) For MIMO systems, each variables in the vectors \\(\\hat{d}\\), \\(\\hat{r}\\), \\(\\hat{u}\\) and \\(\\hat{e}\\) may have a different maximum value, in which case \\(D_e\\), \\(D_u\\), \\(D_s\\) and \\(D_r\\), become diagonal scaling matrices.\n \\begin{align*} G \u0026amp;= D_e^{-1} \\hat{G} D_u\\\\\\\nG_d \u0026amp;= D_e^{-1} \\hat{G_d} D_d \\end{align*}\n We then obtain the following model in terms of scaled variables: \\[ y = G u + G_d d \\] where \\(u\\) and \\(d\\) should be less than 1 in magnitude.\nIt is sometimes useful to introduce a scaled reference \\(\\tilde{r}\\) which is less than 1 in magnitude: \\(\\tilde{r} = \\hat{r}/\\hat{r}_{\\max} = D_r^{-1}\\hat{r}\\) Then we have \\(r = R \\tilde{r}\\) with \\(R \\triangleq D_e^{-1}D_r = \\hat{r}_{\\max}/\\hat{e}_{\\max}\\) is the largest expected change in reference relative to the allowed control error.\nWith scaling you make initial decision regarding performance. This makes weight selection simple later (may often select identity weights if initial scaling is reasonable!).\nDeriving Linear Models Linear models may be obtained from physical \u0026ldquo;first-principle\u0026rdquo; models or from analyzing input-output data (identification).\nIn order to obtain a linear model from the \u0026ldquo;first-principle\u0026rdquo;, the following approach is used:\n Formulate a nonlinear state-space model based on physical knowledge Determine the steady-state operating point about which to linearize Introduce deviation variables and linearize the model Notation Notations used throughout this note are summarized in tables table:notation_conventional, table:notation_general and table:notation_tf.\n\nTable 1: Notations for the conventional control configuration Notation Meaning \\(G\\) Plant model \\(K\\) Controller \\(G_d\\) Disturbance model \\(r\\) Reference inputs \\(n\\) Measurement noise \\(y\\) Plant outputs \\(y_m\\) Measurements \\(u\\) Control signals \nTable 2: Notations for the general configuration Notation Meaning \\(P\\) Generalized plant model \\(w\\) Exogenous inputs: commands, disturbances, noise \\(z\\) Exogenous outputs: signals to be minimized \\(v\\) Controller inputs: measurements \\(u\\) Control signals \nTable 3: Notations for transfer functions Notation Meaning \\(L\\) Loop gain: \\(L = GK\\) \\(S\\) Sensitivity function: \\(S = (I + L)^{-1}\\) \\(T\\) Complementary sensitivity function: \\(T = (I + L)*(I + L)^{-1}\\) Classical Feedback Control \nFrequency Response By replacing \\(s\\) by \\(j\\omega\\) in a transfer function \\(G(s)\\), we get the frequency response description. It can be used to describe:\n A system\u0026rsquo;s response to sinusoids of varying frequency The frequency content of a deterministic signal via the Fourier transform The frequency distribution of a stochastic signal via the power spectral density After sending a sinusoidal signal through a system \\(G(s)\\), the signal\u0026rsquo;s magnitude is amplified by a factor \\(\\abs{G(j\\omega)}\\) and its phase is shifted by \\(\\angle{G(j\\omega)}\\).\n minimum phase systems are systems with no time delays or RHP-zeros.\nThe name minimum phase refers to the fact that such a system has the minimum possible phase lag for the given magnitude response \\(|G(j\\omega)|\\).\nRHP-zeros and time delays contribute additional phase lag to a system when compare to that of a minimum phase system with the same gain (hence the term non-minimum phase system).\n For minimum phase systems, there is a unique relationship between the gain and phase of the frequency response: the Bode gain-phase relationship:\n\\begin{equation} \\angle{G(j\\w_0)} = \\frac{1}{\\pi} \\int_{-\\infty}^{\\infty} \\frac{d\\ln{\\abs{G(j\\w)}}}{d\\ln{\\w}} \\ln{\\abs{\\frac{\\w+\\w_0}{\\w-\\w_0}}} \\frac{d\\w}{\\w} \\end{equation}\nWe note \\(N(\\w_0) = \\left( \\frac{d\\ln{|G(j\\w)|}}{d\\ln{\\w}} \\right)_{\\w=\\w_0}\\) that corresponds to the slope of the magnitude of \\(G(s)\\) in log-variables. We then have the following approximation of the Bode gain-phase relationship:\n\\begin{equation} \\tcmbox{\\angle{G(j\\w_0)} \\approx \\frac{\\pi}{2} N(\\w_0)} \\end{equation}\nFeedback Control One Degree-of-Freedom Controller The simple one degree-of-freedom controller negative feedback structure is represented in Fig. fig:classical_feedback_alt.\nThe input to the controller \\(K(s)\\) is \\(r-y_m\\) where \\(y_m = y+n\\) is the measured output and \\(n\\) is the measurement noise. Thus, the input to the plant is \\(u = K(s) (r-y-n)\\). The objective of control is to manipulate \\(u\\) (design \\(K\\)) such that the control error \\(e\\) remains small in spite of disturbances \\(d\\). The control error is defined as \\(e = y-r\\).\n\n Figure 1: Configuration for one degree-of-freedom control\n Closed-loop Transfer Functions \\begin{subequations} \\begin{align} y \u0026amp;= T r + S G_d d + T n\\\\\\\ne \u0026amp;= -S r + S G_d d - T n\\\\\\\ny \u0026amp;= KS r - KS G_d d - KS n \\end{align} \\end{subequations}\n Why Feedback? We could think that we can use a \u0026ldquo;perfect\u0026rdquo; feedforward controller \\(K_r(s) = G^{-1}(s)\\) with \\(r-G_d d\\) as the controller input: \\[ y = G u + G_d d = G K_r (r - G_d d) + G_d d = r \\] Unfortunately, \\(G\\) is never an exact model and the disturbances are never known exactly.\n Signal uncertainty Unknown disturbance Model uncertainty An unstable plant Closed Loop Stability Two methods are commonly used to determine closed-loop stability:\n The system is stable if and only if all the closed-loop poles (roots of \\(1 + L(s) = 0\\)) are in the open LHP. The poles are also equal to the eigenvalues of the state-space \\(A\\) matrix (this is how the poles are computed). The frequency response of \\(L(j\\w)\\) is plotted in the complex plane and the number of encirclement it makes around the critical point \\(-1\\) is counted. Nyquist\u0026rsquo;s stability criterion: Closed-loop stability is inferred by equating the number of encirclement to the number of open-loop RHP-poles Bode\u0026rsquo;s stability condition: The closed loop system is stable if and only if \\(\\vert L(j \\w_{180})\\vert \u0026lt; 1\\) where \\(\\w_{180}\\) is the phase crossover frequency defined by \\(\\angle L(j \\w_{180})=\\ang{-180}\\). This is only valid for open-loop stable systems where \\(\\angle L(j\\w)\\) falls with frequency and such that \\(\\angle L(j\\w)\\) crosses \\(\\ang{-180}\\) only once. Method 1 is best suited for numerical calculation while method 2 has a nice graphical interpretation and may also be used for systems with time delays. Moreover, method 2 provides useful measure of relative stability and will be used for robustness test.\nEvaluating Closed-Loop Performance Gain Margin The Gain Margin is defined as:\n\\begin{equation} \\tcmbox{\\text{GM} = \\frac{1}{|L(j\\w_{180})|}} \\end{equation}\nwith \\(\\w_{180}\\) is the phase crossover frequency defined by \\(\\angle L(j \\w_{180}) = \\ang{-180}\\). If there is more than one crossing (\\(\\angle L(j \\w_{180}) = \\ang{-180}\\)), the largest value of \\(\\vert L(j\\w_{180})\\vert\\) is taken.\nThe GM is the factor by which the loop gain \\(\\vert L(s)\\vert\\) may be increased before the closed-loop system becomes unstable.\nPhase Margin The Phase Margin is defined as:\n\\begin{equation} \\tcmbox{\\text{PM} = \\angle L(j \\w_c) + \\ang{180}} \\end{equation}\nwith \\(\\w_c\\) the gain crossover frequency defined by \\(\\vert L(j \\w_c)\\vert = 1\\).\nThe PM tells how much negative phase (phase lag) we can add to \\(L(s)\\) at frequency \\(\\omega_c\\) before closed-loop instability appears.\nTypically, we required the PM to be larger than \\(\\SI{30}{\\degree}\\). This is a safeguard against time delay uncertainty, the system becomes unstable is we add a delay of \\(\\theta_{max} = PM / \\w_c\\).\nNote that by decreasing the value of \\(\\omega_c\\) (lowering the closed-loop bandwidth) the system can tolerate larger time delays.\nMaximum Peak Criteria \\begin{subequations} \\begin{align} M_S \u0026amp;= \\max_{\\w} \\abs{S(j\\w)} = \\hnorm{S}\\\\\\\nM_T \u0026amp;= \\max_{\\w} \\abs{T(j\\w)} = \\hnorm{T} \\end{align} \\end{subequations}\n Typically, we require \\(M_S \u0026lt; 2\\ (6dB)\\) and \\(M_T \u0026lt; 1.25\\ (2dB)\\).\nWhy do we want \\(M_S\\) small?\n Without feedback, with have \\(e = r - G_d d\\) but with feedback \\(e = S(r - G_d d)\\). Thus feedback improves performance in terms of reducing \\(|e|\\) where \\(|S|\u0026lt;1\\). However, we cannot avoid having \\(|S|\u0026gt;1\\) at some intermediate frequency where feedback control degrades performance. The value of \\(M_S\\) is then a measure of the worst-case performance degradation \\(M_S\\) is also a measure of the robustness because the smallest distance between \\(L(\\w)\\) and the critical point \\(-1\\) is \\({M_S}^{-1}\\) There is a close relationship between these maximum peaks and the gain and phase margins. For a given value of \\(M_S\\), we have:\n\\begin{equation} \\tcmbox{\\text{GM} \\geq \\frac{M_S}{M_S-1}; \\quad \\text{PM} \\geq \\frac{1}{M_S}} \\end{equation}\nExample of guaranteed stability margins:\n \\(M_S \u0026lt; 2 \\Rightarrow GM \u0026gt; 2\\) and \\(PM \u0026gt; \\SI{29}{\\degree}\\) \\(M_T \u0026lt; 2 \\Rightarrow GM \u0026gt; 1.5\\) and \\(PM \u0026gt; \\SI{29}{\\degree}\\) Bandwidth and Crossover Frequency In general, a large bandwidth corresponds to a faster rise time, however, this also indicates an higher sensitivity to noise and to parameter variations.\n The bandwidth, is the frequency range \\([\\w_1, \\w_2]\\) over which control is effective. In most case we simple call \\(\\w_2 = \\w_B\\) the bandwidth.\n As the word \u0026ldquo;effective\u0026rdquo; may be interpreted in different ways, there are multiple definitions of bandwidth:\n The closed-loop bandwidth \\(\\w_B\\) is the frequency where \\(\\vert S(j\\w)\\vert\\) first crosses \\(1/\\sqrt{2}\\approx -3dB\\) from below. The gain crossover frequency \\(\\w_c\\) is defined as the frequency where \\(\\vert L(j \\w_c)\\vert\\) first crosses 1 from above The bandwidth in terms of \\(T\\), \\(\\w_{BT}\\), is the highest frequency at which \\(\\vert T(j \\w_c)\\vert\\) crosses \\(1/\\sqrt{2}\\approx -3dB\\) from above. For systems with \\(PM \u0026lt; \\ang{90}\\), we have: \\(\\w_{B} \u0026lt;\\w_{c} \u0026lt; \\w_{BT}\\) Then we have the following regions:\n \\(\\w \u0026lt; \\w_B\\): \\(|S|\u0026lt;0.7\\) and control is effective \\(\\w_B \u0026lt; \\w \u0026lt; \\w_{BT}\\): we may have \\(|S| \u0026gt; 1\\) and control degrades performance \\(\\w_{BT} \u0026lt; \\w\\): \\(|S| \\approx 1\\) and control has no significant effect on the response The closed-loop time constant \\(\\tau_{\\text{cl}}\\) can be related to the bandwidth:\n\\begin{equation} \\tcmbox{\\tau_{\\text{cl}} \\approx \\frac{1}{\\w_b}} \\end{equation}\nController Design There is 3 mains approaches to controller design:\n Shaping of transfer functions. The designer specifies the magnitude of some transfer functions as a function of frequency and then finds a controller which gives the desired shape(s) Loop shaping of the open-loop transfer function \\(L(j\\w)\\) Shaping of closed-loop transfer functions such as \\(S\\), \\(T\\) and \\(KS\\) The signal based approach. This involves time domain problem formulations resulting in the minimization of a norm of a transfer function. Linear Quadratic Gaussian (LQG) is an example of a signal based approach. A signal based \\(\\hinf\\) optimal control methodology can be derived. Numerical optimization. This often involves multi-objective optimization where one attempts to optimize directly the true objectives such as rise times, stability margins, \u0026hellip; This problems may be difficult to solve, especially if one does not have convexity in the control parameters. This optimization may also be performed online. Loop Shaping Trade-offs in Terms of \\(L\\) Let\u0026rsquo;s consider a feedback control system with error \\(e = -S r + S G_d d - T n\\). If we want perfect control:\n For disturbance rejection and command tracking, we obtain \\(S \\approx 0\\), this implies that the loop transfer function \\(L\\) must be large in magnitude For zero noise transmission, we want \\(T \\approx 0\\) or equivalently \\(S \\approx I\\) which is obtained with \\(L \\approx 0\\). This illustrate the fundamental nature of feedback design which always involves a trade-off between conflicting objectives.\nThe most important design objectives are:\n Performance \\(L\\) large Good dist. rejection \\(L\\) large Limitation of meas. noise on plant output \\(L\\) small Small magnitude of input signal \\(K\\) and \\(L\\) small Strictly proper controller \\(K\\rightarrow 0\\) at high frequencies Nominal stability \\(L\\) small (RHP zeros and time delays) Robust stability \\(L\\) small (neglected dynamics) Fortunately, the conflicting design objectives are generally in different frequency ranges, and we can meet most of the objectives by using large loop gain at low frequencies and a small gain at high frequencies above crossover.\nFundamentals of Loop-Shaping Design Design procedure that involves explicitly shaping the magnitude of the loop transfer function \\(\\abs{L(j\\w)}\\).\n To get the benefits of feedback control, we want the loop gain \\(\\abs{L(j\\w)}\\) to be as large as possible within the bandwidth region. However, due to time delays, RHP-zeros, unmodelled high-frequency dynamics and limitations on the allowed manipulated inputs, the loop gain has to drop below one at and above the crossover frequency \\(\\w_c\\).\n To measure how \\(\\abs{L(j\\w)}\\) falls with frequency, we consider the logarithmic slope:\n\\begin{equation} N = \\frac{d \\ln{\\abs{L}}}{d \\ln{\\w}} \\end{equation}\nThe value of \\(-N\\) at high frequencies is called the roll-off rate.\n To get a high bandwidth (fast response) we want \\(\\w_c\\) large (thus \\(\\w_{180}\\) large), that is we want the phase lag in \\(L\\) to be small. Unfortunately, that is not consistent with the desire that \\(\\abs{L(j\\w)}\\) should fall sharply (because of the approximation \\(\\angle{L} \\approx -N * \\SI{90}{\\degree}\\)).\nThe situation becomes even worse for cases with delays or RHP-zeros in \\(L(s)\\) which add undesirable phase lag without contributing to a desirable negative slope.\nWe can define the desired loop transfer function in terms of the following specifications:\n The gain crossover frequency \\(\\w_c\\), where \\(\\abs{L(j\\w_c)} = 1\\) The shape of \\(\\abs{L(j\\w)}\\): Slope of \\(N=-1\\) around crossover Large roll-off at higher frequencies (\\(N\u0026gt;2\\)) Slope at low frequencies depending on the nature of the disturbance or reference signal. We required a slope of \\(-1\\) for step changes and \\(-2\\) for ramp changes The system type, defined as the number of pure integrators in \\(L(s)\\) Limitations Imposed by RHP-zeros and Time Delays We usually want the loop shape to have a slope of \\(-1\\) around crossover \\(\\w_c\\), then the phase lag of \\(L\\) at \\(\\w_c\\) will be at least \\(\\SI{-90}{\\degree}\\). If we require a phase margin of \\(\\SI{-35}{\\degree}\\), then the additional phase contribution from delays and RHP zeros at \\(\\w_c\\) cannot exceed \\(\\SI{-55}{\\degree}\\).\nFirst consider a time delay \\(\\theta\\) which adds a phase of \\(-\\theta \\omega\\). Thus, we want \\(\\theta \\omega_c \u0026lt; \\SI{55}{\\degree} \\approx \\SI{1}{\\radian}\\). The attainable bandwidth is limited by the time delay:\n\\begin{equation} \\tcmbox{\\omega_c \u0026lt; 1/\\theta} \\end{equation}\nNext consider a RHP-zero at \\(s = z\\). To avoid an increase in slope cause by the zero, we add a pole at \\(s = -z\\), then \\(L\\) contains \\(\\frac{-s+z}{s+z}\\) which corresponds to an all-pass filter. The phase contribution is \\(\\approx \\SI{-55}{\\degree}\\) at \\(\\w = z/2\\). Thus, this limits the attainable bandwidth:\n\\begin{equation} \\tcmbox{\\w_c \u0026lt; z/2} \\end{equation}\nInverse-Based Controller Design The idea is to have \\(L(s) = \\frac{\\w_c}{s}\\) with \\(\\w_c\\) the desired gain crossover frequency. The controller associated is then \\(K(s) = \\frac{\\w_c}{s}G^{-1}(s)\\) {the plant is inverted and an integrator is added}. This idea is the essential part of the internal model control (IMC). This loop shape yields a phase margin of \\(\\SI{90}{\\degree}\\) and an infinite gain margin.\nThey are many reasons why the inverse-based controller may not be a good choice:\n The controller will not be realizable if \\(G(s)\\) has a pole excess of two or larger The loop shape is not generally desirable, unless the references and disturbances are steps Loop Shaping for Disturbance Rejection We have \\(e = S G_d d\\) with \\(\\abs{d(j\\w)} \u0026lt; 1\\) at each frequency (thanks to scaling). The main control objective is to achieve \\(\\abs{e(j\\w)} \u0026lt; 1\\). Then, we require: \\(\\abs{S(j\\w) G_d(j\\w)} \u0026lt; 1, \\forall \\w\\) or equivalently \\(\\abs{1 + L(j\\w)} \u0026gt; \\abs{G_d}, \\forall \\w\\).\nNote that we don\u0026rsquo;t want to have larger loop gain than necessary to not increase input signals and sensitivity to noise. A reasonable loop shape is then \\(\\abs{L} = \\abs{G_d}\\).\nThe corresponding controller satisfies\n\\begin{equation} \\abs{K} = \\abs{G^{-1}G_d} \\end{equation}\nThis means that:\n For disturbances entering at the plant output (\\(G_d = 1\\)), we get \\(\\abs{K} = \\abs{G^{-1}}\\) For disturbances entering at the plant input (\\(G_d = G\\)), we get \\(\\abs{K} = 1\\) Note that reference change may be viewed as a disturbance directly affecting the output The loop-shape \\(L(s)\\) may be modify as follows:\n Around crossover, make the slope of \\(|L|\\) to be about -1. This is to achieve good transient behavior with acceptable gain and phase margins Improve the low frequency performance by adding integral action \\(\\abs{K} = \\abs{\\frac{s+\\w_I}{s}}\\abs{G^{-1}G_d}\\) Let \\(L(s)\\) roll of faster at high frequencies in order to reduce the effect of noise and the input magnitude Two Degrees-of-freedom Design For reference tracking, we typically want the controller to look like \\(\\frac{1}{s} G^{-1}\\), whereas for disturbance rejection we want the controller to look like \\(\\frac{1}{s} G^{-1}G_d\\).\nWe cannot achieve both of these simultaneously with a single feedback controller.\nThe solution is to use a two degrees of freedom controller where the reference signal \\(r\\) and output measurement \\(y_m\\) are independently treated by the controller (Fig. fig:classical_feedback_2dof_alt), rather than operating on their difference \\(r - y_m\\).\n\n Figure 2: 2 degrees-of-freedom control architecture\n The controller can be slit into two separate blocks (Fig. fig:classical_feedback_sep):\n the feedback controller \\(K_y\\) that is used to reduce the effect of uncertainty (disturbances and model errors) the prefilter \\(K_r\\) that shapes the commands \\(r\\) to improve tracking performance \n Figure 3: 2 degrees-of-freedom control architecture with two separate blocs\n It is optimal to design the combined two degrees of freedom controller \\(K\\) in one step, however, in practice \\(K_y\\) is often designed first for disturbance rejection, and then \\(K_r\\) is designed to improve reference tracking.\nShaping Closed-Loop Transfer Functions Specifications on the open-loop transfer function \\(L = GK\\) does not consider directly the closed-loop transfer functions, such as \\(S\\) and \\(T\\) which determine the final response. An alternative design strategy is to directly shape the magnitude of the closed loop transfer functions. This strategy can be formulated as an \\(\\hinf\\) optimal control problem.\nThe Terms \\(\\hinf\\) and \\(\\htwo\\) The \\(\\hinf\\) norm of a stable scalar transfer function \\(f(s)\\) is simply the peak value of \\(\\abs{f(j\\w)}\\) as a function of frequency:\n\\begin{equation} \\tcmbox{\\hnorm{f(s)} \\triangleq \\max_{\\w} \\abs{f(j\\w)}} \\end{equation}\nSimilarly, the symbol \\(\\htwo\\) stands for the Hardy space of transfer function with bounded 2-norm:\n\\begin{equation} \\tcmbox{\\normtwo{f(s)} \\triangleq \\left( \\frac{1}{2\\pi} \\int_{-\\infty}^{\\infty} \\abs{f(j\\w)}^2 d\\w \\right)^{1/2}} \\end{equation}\nWeighted Sensitivity The sensitivity function \\(S\\) is a very good indicator of closed-loop performance. The main advantage of considering \\(S\\) is that we want \\(S\\) small and it is sufficient to consider just its magnitude \\(\\abs{S}\\).\n Minimum bandwidth frequency \\(\\w_B^*\\) Maximum tracking error at selected freq. The maximum steady state tracking error \\(A\\) Shape of \\(S\\) over selected frequency ranges Maximum magnitude of \\(S\\): \\(\\hnorm{S(j\\w)} \\leq M\\) The maximum peak specification prevents amplification of noise at high frequencies, and also introduces a margin of robustness. Typically, we select \\(M = 2\\).\nMathematically, these specifications may be captured by an upper bound \\(1/\\abs{W_P(s)}\\) on the magnitude of \\(S\\) where \\(W_P(s)\\) is a weight selected by the designer. The subscript \\(P\\) stands for performance since \\(S\\) is mainly used as a performance indicator.\nThe performance requirement becomes \\[ S(j\\w) \u0026lt; 1/\\abs{W_P(j\\w)}, \\forall \\w \\] Which can be expressed as an \\(\\mathcal{H}_\\infty\\):\n\\begin{equation} \\tcmbox{\\hnorm{W_P S} \u0026lt; 1} \\end{equation}\n \\[W_P(s) = \\frac{s/M + \\w_B^*}{s + \\w_B^* A}\\]\nWith (see Fig. fig:performance_weigth):\n \\(M\\): maximum magnitude of \\(\\abs{S}\\) \\(\\w_B\\): crossover frequency \\(A\\): steady-state offset \n Figure 4: Inverse of performance weight\n If we want a steeper slope for \\(L\\) below the bandwidth, an higher order weight may be selected. A weight which ask for a slope of \\(-2\\) for \\(L\\) below crossover is: \\[W_P(s) = \\frac{(s/M^{1/2} + \\w_B^*)^2}{(s + \\w_B^* A^{1/2})^2}\\]\nStacked Requirements: Mixed Sensitivity The specification \\(\\hnorm{W_P S} \u0026lt; 1\\) puts a lower bound on the bandwidth, but not an upper one and nor does it allow us to specify the roll-off of \\(L(s)\\) above the bandwidth.\nTo do this, we can make demands on another closed-loop transfer function \\(T\\) by specifying an upper bound \\(1/\\abs{W_T}\\) on the magnitude \\(\\abs{T}\\) to make sure that \\(L\\) rolls off sufficiently fast at high frequencies.\nAlso, to achieve robustness or to restrict the magnitude of the input signal \\(u\\), one may place an upper bound \\(1/\\abs{W_U}\\) on the magnitude \\(KS\\).\nTo combined these mixed sensitivity specifications, a stacking approach is usually used, resulting in the following overall specification: \\[\\maxw \\maxsv(N(j\\w)) \u0026lt; 1; \\quad N = \\colvec{W_P S \\ W_T T \\ W_U KS}\\]\nAfter selecting the form of \\(N\\) and the weights, the \\(\\hinf\\) optimal controller is obtained by solving the problem \\(\\min_K\\hnorm{N(K)}\\).\nIntroduction to Multivariable Control \nIntroduction The main difference between a SISO system and a MIMO system is the presence of directions in the latter.\nHowever, most of the ideas and techniques used for SISO systems may be extended to MIMO systems. This is done by considering the maximum singular value instead of the absolute value.\nThe singular value decomposition (SVD) provides a useful way of quantifying multivariable directionality.\nFor MIMO systems the gain \\(\\frac{\\abs{Gd}}{\\abs{d}}\\) (where \\(\\abs{\\cdot}\\) is some norm) is independent of the magnitude \\(\\abs{d}\\) (like for SISO systems), but it does depend on its direction.\nA plant is said to be ill-conditioned if the gain depends strongly on the input direction. It is quantified by the condition number \\(\\Gamma\\) (which is much larger than 1 for an ill-conditioned plant).\nFor MIMO systems the order of the transfer functions matter, so in general:\n\\begin{equation} \\tcmbox{GK \\neq KG} \\end{equation}\neven when \\(G\\) and \\(K\\) are square matrices.\nTransfer Functions The main rule for evaluating transfer functions is the MIMO Rule: Start from the output and write down the transfer functions as you meet them going to the input. If you exit a feedback loop then we get a term \\((I-L)^{-1}\\) where \\(L = GK\\) is the transfer function around the loop (gain going backwards).\n Negative Feedback Control Systems For negative feedback system (Fig. fig:classical_feedback_bis), we define \\(L\\) to be the loop transfer function as seen when breaking the loop at the output of the plant:\n \\(L = G K\\) \\(S \\triangleq (I + L)^{-1}\\) is the transfer function from \\(d_1\\) to \\(y\\) \\(T \\triangleq L(I + L)^{-1}\\) is the transfer function from \\(r\\) to \\(y\\) \n Figure 5: Conventional negative feedback control system\n We define \\(L_1\\) to be the loop transfer function as seen when breaking the loop at the input to the plant:\n \\(L_1 = K G\\) \\(S_1 \\triangleq (I + L_1)^{-1}\\) \\(T_1 \\triangleq L_1(I + L_1)^{-1}\\) is the transfer function from \\(d_2\\) to \\(-u\\) Multivariable Frequency Response Analysis Obtaining the Frequency Response from \\(G(s)\\) Consider the system \\(G(s)\\) with input \\(d(s)\\) and output \\(y(s)\\). The element \\(g_{ij}(j\\w)\\) of the matrix \\(G\\) represents the sinusoidal response from the input \\(j\\) to output \\(i\\).\nDirections in Multivariable Systems For a SISO system, the gain at \\(\\omega\\) is simply:\n\\begin{equation} \\frac{|y(\\w)|}{|d(\\w)|} = \\frac{|G(j\\w)d(\\w)|}{|d(\\w)|} = |G(j\\w)| \\end{equation}\nThe gain depends on the frequency \\(\\w\\) but it is independent of the input magnitude \\(|d(\\w)|\\).\nFor MIMO systems, we have to use norms to measure the amplitude of the inputs/outputs. If we select vector 2-norm, the magnitude of the vector input signal is: \\[ \\normtwo{d(\\w)} = \\sqrt{\\sum_j |d_j(\\w)|^2} \\]\nThe gain of the system is then:\n\\begin{equation} \\frac{\\normtwo{y(\\w)}}{\\normtwo{d(\\w)}} = \\frac{\\normtwo{G(j\\w)d(\\w)}}{\\normtwo{d(\\w)}} = \\frac{\\sqrt{\\sum_j |y_j(\\w)|^2}}{\\sqrt{\\sum_j |d_j(\\w)|^2}} \\end{equation}\nAgain the gain depends on the frequency \\(\\w\\) and again it is independent of the input magnitude \\(\\normtwo{d(\\w)}\\). However, the gain depends also on the direction of the input \\(d\\).\nEigenvalues as a Poor Measure of Gain The magnitudes of the eigenvalues of a transfer function matrix \\(\\abs{\\lambda_i(G(j\\w))}\\) do not provide a useful means of generalizing the SISO gain. The main problem is that the eigenvalues measure the gain for the special case when the inputs and the outputs are in the same direction, namely in the direction of the eigenvectors.\nSingular Value Decomposition We are interested by the physical interpretation of the SVD when applied to the frequency response of a MIMO system \\(G(s)\\) with \\(m\\) inputs and \\(l\\) outputs.\n \\begin{equation} G = U \\Sigma V^H \\end{equation}\n \\(\\Sigma\\) is an \\(l \\times m\\) matrix with \\(k = \\min\\{l, m\\}\\) non-negative singular values \\(\\sigma_i\\), arranged in descending order along its main diagonal, the other entries are zero. \\(U\\) is an \\(l \\times l\\) unitary matrix. The columns of \\(U\\), denoted \\(u_i\\), represent the output directions of the plant. They are orthonormal. \\(V\\) is an \\(m \\times m\\) unitary matrix. The columns of \\(V\\), denoted \\(v_i\\), represent the input directions of the plant. They are orthonormal. The input and output directions are related through the singular values:\n\\begin{equation} \\tcmbox{G v_i = \\sigma_i u_i} \\end{equation}\nSo, if we consider an input in the direction \\(v_i\\), then the output is in the direction \\(u_i\\). Furthermore, since \\(\\normtwo{v_i}=1\\) and \\(\\normtwo{u_i}=1\\), we see that the singular value \\(\\sigma_i\\) directly gives the gain of the matrix \\(G\\) in this direction.\nThe largest gain for any input is equal to the maximum singular value: \\[\\maxsv(G) \\equiv \\sigma_1(G) = \\max_{d\\neq 0}\\frac{\\normtwo{Gd}}{\\normtwo{d}} = \\frac{\\normtwo{Gv_1}}{\\normtwo{v_1}} \\] The smallest gain for any input direction is equal to the minimum singular value: \\[\\minsv(G) \\equiv \\sigma_k(G) = \\min_{d\\neq 0}\\frac{\\normtwo{Gd}}{\\normtwo{d}} = \\frac{\\normtwo{Gv_k}}{\\normtwo{v_k}} \\]\nWe define \\(u_1 = \\bar{u}\\), \\(v_1 = \\bar{v}\\), \\(u_k=\\ubar{u}\\) and \\(v_k = \\ubar{v}\\). Then is follows that: \\[ G\\bar{v} = \\maxsv \\bar{u} ; \\quad G\\ubar{v} = \\minsv \\ubar{u} \\]\nNon Square Plants If the plant has more output than inputs, the outputs singular vectors \\(u_i\\) with \\(i \u0026gt; k\\) correspond to the outputs directions that cannot be controlled.\nSimilarly, for a plant with more inputs and outputs, the additional input singular vectors tells us in which directions the input will have no effect.\nSingular Values for Performance The gain of the MIMO system from the vector of reference inputs \\(r\\) and the vector of control error \\(e\\) is bounded by the minimum and maximum singular values of \\(S\\): \\[ \\minsv(S(j\\w)) \u0026lt; \\frac{\\normtwo{e(\\w)}}{\\normtwo{r(\\w)}} \u0026lt; \\maxsv(S(j\\w)) \\]\nIn terms of performance, we require that the gain remains small for any direction of \\(r(\\w)\\) including the \u0026ldquo;worst-case\u0026rdquo; direction corresponding to the gain \\(\\maxsv(S(j\\w))\\). Let \\(1/\\abs{W_P(j\\w)}\\) represent the maximum allowed magnitude of \\(\\frac{\\normtwo{e(\\w)}}{\\normtwo{r(\\w)}}\\) at each frequency: \\[ \\maxsv(S(j\\w)) \u0026lt; \\frac{1}{\\abs{W_P}}, \\forall \\w \\Leftrightarrow \\hnorm{W_P S} \u0026lt; 1 \\]\n The \\(\\hinf\\) norm is defined as the peak of the maximum singular value of the frequency response:\n\\begin{equation} \\hnorm{M(s)} \\triangleq \\max_{\\w} \\maxsv(M(j\\w)) \\end{equation}\n For MIMO systems the bandwidth depends on direction. If we want to associate a single bandwidth frequency for a multivariable system, then we consider the worst-case direction, and define the bandwidth \\(\\w_B\\) as the frequency where \\(\\maxsv(S)\\) crosses \\(\\frac{1}{\\sqrt{2}} = 0.7\\) from below.\nControl of Multivariable Plants A conceptually simple approach to multivariable control is given by a two-step procedure:\n Design a pre-compensator \\(W_1\\), which counteracts the interactions in the plant and results in a new shaped plant \\(G_S(s) = G(s) W_1(s)\\) which is more diagonal and easier to control than the original plant \\(G(s)\\). Design a diagonal controller \\(K_S(s)\\) for the shaped plant using methods similar to those for SISO systems. The overall controller is then: \\[ K(s) = W_1(s)K_s(s) \\]\nDecoupling There are mainly three different cases:\n Dynamic decoupling: \\(G_S(s)\\) is diagonal at all frequencies. For that we can choose \\(W_1(s) = G^{-1}(s)\\) and this is an inverse-based controller. Steady-state decoupling: \\(G_S(0)\\) is diagonal. This can be obtained by selecting \\(W_1(s) = G^{-1}(0)\\). Approximate decoupling at frequency \\(\\w_0\\): \\(G_S(j\\w_0)\\) is as diagonal as possible. Decoupling the system at \\(\\w_0\\) is a good choice because the effect on performance of reducing interaction is normally greatest at this frequency. The idea of decoupling control is appealing, but there are several difficulties:\n It is very sensitive to modelling errors It may not be required for disturbance rejection If the plant has RHP-zero, the decoupling generally introduces extra RHP-zero in the closed-loop system SVD-Controller We can also introduce a post compensator \\(W_2(s)\\). The shaped plant is then: \\[G_S(s) = W_2(s)G(s)W_1(s)\\]\nA diagonal controller \\(K_S\\) can then be designed for the shaped plant. The overall controller is then: \\[K(s) = W_1(s)K_S(s)W_2(s)\\]\nThe SVD-controller is a special case of a pre and post compensator design: \\(W_1 = V_0\\) and \\(W_2 = U_0^T\\). \\(V_0\\) and \\(U_0\\) are obtained from a SVD of \\(G_0 = U_0 \\Sigma_0 V_0^T\\) where \\(G_0\\) is a real approximation of \\(G(j\\w_0)\\).\nDecentralized Control Another approach is to use a diagonal or block-diagonal controller \\(K(s)\\). This works well if \\(G(s)\\) is close to diagonal, because then the plant to be controlled is essentially a collection of independent sub-plants, and each element in \\(K(s)\\) may be designed independently. However, if off-diagonal elements in \\(G(s)\\) are large, the performance with decentralized diagonal control may be poor because no attempt is made to counteract the interactions.\nWhat is the Shape of the \u0026ldquo;best\u0026rdquo; Feedback Controller? Consider the problem of disturbance rejection: \\(y = S G_d d\\) where \\(\\normtwo{d}\u0026lt;1\\) and our performance requirement is that \\(\\normtwo{y}\u0026lt;1\\) which is equivalent to requiring \\(\\maxsv(SG_d) \u0026lt; 1\\).\nHowever there is generally a trade-off between input usage and performance. The controller that minimize the input magnitude while meeting the performance requirement is the one that yields all singular values of \\(SG_d\\) equal to 1, i.e. \\(\\sigma_i(SG_d) = 1, \\forall \\w\\). This corresponds to: \\[S_{\\text{min}} G_d = U_1\\] Where \\(U_1\\) is some all-pass transfer function (which at each frequency has all its singular values equal to 1).\nAt frequencies where feedback is effective, we have \\(S\\approx L^{-1}\\) and then \\(L_{\\text{min}} = GK_{\\text{min}} \\approx G_d U_1^{-1}\\). In conclusion, the controller and loop shape with the minimum gain will often look like: \\[ K_{\\text{min}} \\approx G^{-1} G_d U_2 \\] where \\(U_2 = U_1^{-1}\\) is some all-pass transfer function matrix.\nWe see that for disturbances entering at the plant inputs, \\(G_d = G\\), we get \\(G_{\\text{min}} = U_2\\), so a simple constant unit gain controller yields a good trade-off between output performance and input usage.\nSummary of Mixed-Sensitivity \\(\\hinf\\) Synthesis In the mixed-sensitivity \\(S/KS\\) problem, the objective is to minimize the \\(\\hinf\\) norm of:\n\\begin{equation} N = \\colvec{W_P S \\ W_U K S} \\end{equation}\nHere are some guidelines for the choice of the weights \\(W_P\\) and \\(W_U\\):\n \\(KS\\) is the transfer function from \\(r\\) to \\(u\\), so for a system which has been scaled, a reasonable initial choice for the input weight is \\(W_U = I\\) \\(S\\) is the transfer function from \\(r\\) to \\(-e = r-y\\). A common choice for the performance weight is \\(W_P = \\text{diag}\\{w_{p_i}\\}\\) with: \\[ w_{p_i} = \\frac{s/M_i + \\w_{B_i}^*}{s + \\w_{B_i}^*A_i}, \\quad A_i \\ll 1 \\] Selecting \\(A_i \\ll 1\\) ensures approximate integral action. Often we select \\(M_i\\) about 2 for all outputs, whereas \\(\\w_{B_i}^*\\) may be different for each output. For disturbance rejection, we may in some cases want a steeper slope for \\(w_{P_i}(s)\\) at low frequencies. However it may be better to consider the disturbances explicitly by considering the \\(\\hinf\\) norm of:\n\\begin{equation} N = \\begin{bmatrix} W_P S \u0026amp; W_P S G_d \\\\\\\nW_U K S \u0026amp; W_U K S G_d \\end{bmatrix} \\end{equation}\nWe can also considerate \\(T\\) which is the transfer function from \\(-n\\) to \\(y\\). To reduce the sensitivity to noise and uncertainty, we want \\(T\\) small at high frequencies, and so we may want additional roll-off in \\(L\\). This can be achieved in several ways:\n One approach is to add \\(W_T T\\) to the stack for \\(N\\) where \\(W_T = \\text{diag}\\{w_{T_i}\\}\\) and \\(\\abs{w_{T_i}}\\) is smaller than 1 at low frequencies and large at high frequencies A more direct approach is to add high-frequency dynamics \\(W_1(s)\\) to the plant model to ensure that the resulting shaped plant, \\(G_S=GW_1\\) rolls off with the desired slope. We then obtain an \\(\\hinf\\) optimal controller \\(K_S\\) for this shaped plant, and finally include \\(W_1(s)\\) in the controller \\(K=W_1 K_S\\) Introduction to MIMO RHP-Zeros Whereas the poles \\(p\\) of MIMO system \\(G\\) are essentially poles of elements of \\(G\\), the zeros are generally not the zeros of elements of \\(G\\). However, for square MIMO plants, the poles and zeros are in most cases the poles and zeros of \\(\\det G(s)\\).\n The zeros \\(z\\) of a MIMO system \\(G\\) are defined as the values \\(s=z\\) where \\(G(s)\\) loses rank.\n As for SISO systems, we find that RHP-zeros impose fundamental limitations on control. Poles and zeros of MIMO systems have directions:\n We can find the direction of a zero by looking at the direction in which the matrix \\(G(z)\\) has zero gain Pole direction is direction where \\(G(p)\\) is infinite It is generally possible to move the effect of RHP-zero to particular outputs. If it is not, the zero is called a \u0026ldquo;pinned zero\u0026quot;.\nCondition Number and RGA Condition Number We define the condition number of a matrix as the ratio between its maximum and minimum singular values:\n\\begin{equation} \\gamma(G) \\triangleq \\maxsv(G)/\\minsv(G) \\end{equation}\n A matrix with large condition number is said to be ill-conditioned.\nFor a non-singular square matrix \\(\\minsv(G)=1/\\maxsv(G^{-1})\\), so \\(\\gamma(G) = \\maxsv(G) \\maxsv(G^{-1})\\). It then follows that the condition number is large if the product of the largest element in \\(G\\) and \\(G^{-1}\\) is large.\nNote that the condition number depends strongly on scaling. One might consider minimizing the condition number over all possible scalings. This results in the minimized or optimal condition number which is defined by:\n\\begin{equation} \\gamma^*(G) = \\min_{D_1,D_2} \\gamma(D_1 G D_2) \\end{equation}\nIf the condition number is small, then the multivariable effects of uncertainty are not likely to be serious. However if the condition number is large (say, larger than 10), then this may indicate control problems.\nRelative Gain Array (RGA) The relative gain array (RGA) for a non-singular square matrix \\(G\\) is a square matrix defined as:\n\\begin{equation} \\text{RGA}(G) = \\Lambda(G) \\triangleq G \\times G^{-T} \\end{equation}\nwhere \\(\\times\\) is element-by-element multiplication\n In most case, it is the value of the RGA at frequencies close to crossover which is most important.\nThe RGA has interesting algebraic properties:\n It is independent of input and output scaling Its rows and columns sum to one The sum-norm of the RGA \\(\\|\\Lambda\\|_\\text{sum}\\) is close to the minimized condition number \\(\\gamma^*\\). Plants with large RGA-elements are thus always ill-conditioned The RGA is the identity matrix if \\(G\\) is upper of lower triangular. This follows that \\(\\Gamma - I\\) provides a measure of two-way interactions It has also a number of useful control properties:\n Plants with large RGA-elements around the crossover frequency are fundamentally difficult to control because of sensitivity to input uncertainty If the sign of a RGA-element changes from \\(s=0\\) to \\(s=\\infty\\), then there is a RHP-zero in \\(G\\) The definition of the RGA may be generalized to non-square matrices by using the pseudo inverse The RGA-number can be used as a measure of diagonal dominance: \\(\\|\\Lambda(G)-I\\|_{\\text{sum}}\\) For decentralized control, we prefer pairing input and outputs for which the RGA-number at crossover frequencies is close to \\(0\\) Introduction to Robustness for MIMO Plants Multivariable plants can show a sensitivity to uncertainty which is fundamentally different from what is possible in SISO systems. It is possible to have excellent stability margins (GM and PM) when considering one loop at a time, but small simultaneous input gain errors can give instability.\nFor SISO systems, we generally have that nominal performance and robust stability imply robust performance, but this is not the case for MIMO systems.\nAlthough we have useful indicators of robustness problems (RGA-number, Sensitivity Peaks, etc), they provide no exact answer to whether a given source of uncertainty will yield instability or poor performance. The structured singular value \\(\\mu\\) is a tool for analyzing the effects of model uncertainty.\nGeneral Control Problem Formulation The general control problem formulation is represented in Fig. fig:general_control_names.\n\n Figure 6: General control configuration\n Find a controller \\(K\\) which based on the information in \\(v\\), generates a control signal \\(u\\) which counteracts the influence of \\(w\\) on \\(z\\), thereby minimizing the closed-loop norm from \\(w\\) to \\(z\\).\n Obtaining the Generalized Plant \\(P\\) We must first find a block diagram representation of the system and identify the signals \\(w\\), \\(z\\), \\(u\\) and \\(v\\). Then we have to break all the \u0026ldquo;loops\u0026rdquo; entering and exiting the controller \\(K\\) to obtain \\(P\\) such that:\n\\begin{equation} \\colvec{z\\v} = P \\colvec{w\\u} \\end{equation}\nController Design: Including Weights in \\(P\\) In order to get a meaningful controller synthesis problem, for example in terms of the \\(\\hinf\\) norms, we generally have to include the weights \\(W_z\\) and \\(W_w\\) in the generalized plant \\(P\\) (Fig. fig:general_plant_weights). We consider:\n The weighted or normalized exogenous inputs \\(w\\) (where \\(\\tilde{w} = W_w w\\) consists of the \u0026ldquo;physical\u0026rdquo; signals entering the system) The weighted or normalized controlled outputs \\(z = W_z \\tilde{z}\\) (where \\(\\tilde{z}\\) often consists of the control error \\(y-r\\) and the manipulated input \\(u\\)) \n Figure 7: General Weighted Plant\n The weighted matrices are usually frequency dependent and typically selected such that weighted signals \\(w\\) and \\(z\\) are of magnitude 1.\nPartitioning the Generalized Plant \\(P\\) We often partition \\(P\\) as:\n\\begin{equation} \\begin{bmatrix} z \\ v \\end{bmatrix} = \\begin{bmatrix} P_{11} \u0026amp; P_{12} \\\\\\\nP_{21} \u0026amp; P_{22} \\end{bmatrix} \\begin{bmatrix} w \\ u \\end{bmatrix} \\end{equation}\n\\(P_{22}\\) has dimensions compatible with the controller.\nAnalysis: Closing the Loop the get \\(N\\) In the previous representations, the controller \\(K\\) has a separate block. This is useful when synthesizing the controller. However, for analysis of closed-loop performance the controller is given, and we may absorb \\(K\\) into the interconnection structure and obtain the system \\(N\\).\n \\begin{equation} z = N w \\end{equation}\n\\(N\\) is given by: \\[N = P_{11} + P_{12}K(I-P_{22}K)^{-1}P_{12} \\triangleq F_l(P, K) \\] where \\(F_l(P, K)\\) denotes a lower linear fractional transformation (LFT).\n A General Control Configuration Including Model Uncertainty The general control configuration may be extended to include model uncertainty as shown in Fig. fig:general_config_model_uncertainty.\n\n Figure 8: General control configuration for the case with model uncertainty\n The matrix \\(\\Delta\\) is a block-diagonal matrix that includes all possible perturbations (representing uncertainty). It is usually normalized in such a way that \\(\\hnorm{\\Delta} \\leq 1\\).\nConclusion The Singular Value Decomposition (SVD) of the plant transfer function matrix provides insight into multivariable directionality.\nOther useful tools for analyzing directionality and interactions are the condition number and the Relative Gain Array (RGA).\nClosed loop performance may be analyzed in the frequency domain by evaluating the maximum singular value of the sensitivity function as the function of frequency.\nMultivariable RHP-zeros impose fundamental limitations on performance, but for MIMO systems we can often direct the undesired effect of a RHP-zero to a subset of the outputs.\nMIMO systems are often more sensitive to uncertainty than SISO systems.\n Elements of Linear System Theory \nSystem Descriptions For linear systems there are several alternative system representations:\n state-space representation often follows directly from a physical model, and is used in most numerical calculations. transfer function representation is a nice compact representation which yields invaluable insights; it allows for series connections to be represented by multiplication of transfer functions. It also leads directly to the frequency response by setting \\(s = j\\w\\). coprime factorization is a factorization into two stable systems, and that it is useful for representing the class of all stabilizing controllers. It forms the basis for the very useful coprime uncertainty description. State-Space Representation A natural way to represent many physical systems is by nonlinear state-space models of the form \\[\\dot{x} \\triangleq \\frac{dx}{dt} = f(x, u);\\quad y = g(x, u)\\]\nLinear state-space models may then be derived from the linearization of such models.\n\\begin{align*} \\dot{x}(t) \u0026amp; = A x(t) + B u(t)\\\\\\\ny(t) \u0026amp; = C x(t) + D u(t) \\end{align*}\nwhere \\(A\\), \\(B\\), \\(C\\) and \\(D\\) are real matrices.\nThese equations may be rewritten as \\[\\colvec{\\dot{x}\\y} = \\begin{bmatrix} A \u0026amp; B \\\\\\\nC \u0026amp; D \\end{bmatrix} \\colvec{x\\u}\\] which gives rise to the short-hand notation \\[G = \\left[ \\begin{array}{c|c} A \u0026amp; B \\ \\hline C \u0026amp; D \\\\\\\n\\end{array} \\right]\\]\nThe state-space representation of a system is not unique, there exist realizations with the same input-output behavior, but with additional unobservable and/or uncontrollable state.\n A minimal realization is a realization with the fewest number of states and consequently no unobservable or uncontrollable modes.\n The state-space representation yields an internal description of the system which may be useful if the model is derived from physical principles. It is also more suitable for numerical calculations.\nImpulse Response Representation The impulse response matrix is \\[g(t) = \\begin{cases} 0 \u0026amp; t \u0026lt; 0 \\\\\\\nC e^{At} B + D \\delta(t) \u0026amp; t \\geq 0 \\end{cases}\\] The \\(ij\\)\u0026lsquo;th element of the impulse response matrix, \\(g_{ij}(t)\\), represents the response \\(y_i(t)\\) to an impulse \\(u_j(t)=\\delta(t)\\) for a systems with a zero initial state.\nWith initial state \\(x(0) = 0\\), the dynamic response to an arbitrary input \\(u(t)\\) is \\[y(t) = g(t)*u(t) = \\int_0^t g(t-\\tau)u(\\tau)d\\tau\\]\nTransfer Function Representation - Laplace Transforms The transfer function representation is unique and is defined as the Laplace transform of the impulse response.\n \\[ G(s) = \\int_0^\\infty g(t)e^{-st}dt \\]\n We can also obtain the transfer function representation from the state-space representation by taking the Laplace transform of the state-space equations \\[ s x(s) = A x(s) + B u(s) \\ \\Rightarrow \\ x(s) = (sI-A)^{-1} B u(s) \\] \\[ y(s) = C x(s) + D u(s) \\ \\Rightarrow \\ y(s) = \\underbrace{\\left(C(sI-A)^{-1}B+D\\right)}_{G(s)}u(s) \\]\nTime delays and improper systems can be represented by Laplace transforms, but do not have a state-space representation.\nCoprime Factorization \\[G(s) = N_r(s) M_r^{-1}(s)\\] where \\(N_r(s)\\) and \\(M_r(s)\\) are stable coprime transfer functions.\n The stability implies that \\(N_r(s)\\) should contains all the RHP-zeros of \\(G(s)\\), and \\(M_r(s)\\) should contain as RHP-zeros all the RHP-poles of \\(G(s)\\). Mathematically, coprimeness means that there exist stable \\(U_r(s)\\) and \\(V_r(s)\\) such that the Bezout identity is satisfied: \\(U_r N_r + V_r M_r = I\\)\nState Controllability and State Observability There are many ways to check for state controllability and observability, e.g. with Gramians, input/output pole vectors, controllability/observability matrix, etc.\nInput and output pole vectors The method which yields the most insight is probably to compute the input and output directions associated with each pole (mode).\nFor the case when \\(A\\) has distinct eigenvalues, we have the following dyadic expansion of the transfer function matrix from inputs to outputs \\[G(s) = \\sum_{i=1}^{n} \\frac{C t_i q_i^H B}{s - \\lambda_i} + D = \\sum_{i=1}^{n} \\frac{y_{p_i} u_{p_i}}{s - \\lambda_i} + D\\]\n The \\(i\\)\u0026lsquo;th input pole vector \\(u_{p_i} \\triangleq q_i^H B\\) is an indication of how much the \\(i\\)\u0026lsquo;th mode is excited (and thus may be \u0026ldquo;controlled\u0026rdquo;) by the inputs. The \\(i\\)\u0026lsquo;th output pole vector \\(y_{p_i} \\triangleq C t_i\\) indicates how much the \\(i\\)\u0026lsquo;th mode is observed in the outputs. State Controllability Let \\(\\lambda_i\\) be the \\(i^{\\text{th}}\\) eigenvalue of \\(A\\), \\(q_i\\) the corresponding left eigenvector (\\(q_i^H A = \\lambda_i q_i^H\\)), and \\(u_{p_i} = B^H q_i\\) the \\(i^{\\text{th}}\\) input pole vector. Then the system \\((A, B)\\) is state controllable if and only if \\[u_{p_i} \\neq 0, \\forall i\\] That is if and only if all its input pole vectors are nonzero.\nState Observability Let \\(\\lambda_i\\) be the \\(i^{\\text{th}}\\) eigenvalue of \\(A\\), \\(t_i\\) the corresponding right eigenvector (\\(A t_i = \\lambda_i t_i\\)), and \\(y_{p_i} = C t_i\\) the \\(i^{\\text{th}}\\) output pole vector. Then the system \\((A, C)\\) is state observable if and only if \\[y_{p_i} \\neq 0, \\forall i\\] That is if and only if all its output pole vectors are nonzero.\nMinimal realization A state space realization \\((A, B, C, D)\\) of \\(G(s)\\) is said to be a minimal realization of \\(G(s)\\) if \\(A\\) has the smallest possible dimension. The smallest dimension is called the McMillan degree of \\(G(s)\\). A mode is hidden if it is not state controllable or observable and thus does not appear in the minimal realization. It follows that a state-space realization is minimal if and only if \\((A, B)\\) is state controllable and \\((A, C)\\) is state observable.\nStability A system is (internally) stable is none of its components contain hidden unstable modes and the injection of bounded external signals at any place in the system result in bounded output signals measured anywhere in the system.\n A system is (state) stabilizable if all unstable modes are state controllable. A system is (state) detectable if all unstable modes are state observable.\nA system with unstabilizable or undetectable modes is said to contain hidden unstable modes.\n Poles The poles \\(p_i\\) of a system with state-space description are the eigenvalues \\(\\lambda_i(A), i=1, \\dotsc, n\\) of the matrix \\(A\\). The pole or characteristic polynomial \\(\\phi(s)\\) is defined as \\(\\phi(s) \\triangleq \\det(sI-A) = \\Pi_{i=1}^n (s-p_i)\\). Thus the poles are the roots or the characteristic equation \\[\\phi(s) \\triangleq \\det(sI-A) = 0\\]\n Poles and Stability A linear dynamic system is stable if and only if all the poles are in the LHP, that is, \\(\\text{Re}\\{\\lambda_i(A)\\} \u0026lt; 0, \\forall i\\)\nPoles from Transfer Functions The pole polynomial \\(\\phi(s)\\) corresponding to a minimal realization of a system with transfer function \\(G(s)\\) is the least common denominator of all non-identically-zero minors of all orders of \\(G(s)\\).\nThe poles are essentially the sum of the poles in the elements of the transfer function, but to get the correct multiplicity a more careful analysis is needed.\nPole Vectors and Directions In multivariable system poles have directions associated with them. To quantify this, we use the input and output pole vectors.\n \\[ u_{p_i} = B^H q_i \\] With \\(q_i\\) the left eigenvector of \\(A\\) (\\({q_i}^T A = \\lambda_i {q_i}^T\\)). The input pole direction is \\(\\frac{1}{\\normtwo{u_{p_i}}} u_{p_i}\\)\n \\[ y_{p_i} = C t_i \\] With \\(t_i\\) the right eigenvector of \\(A\\) (\\(A t_i = \\lambda_i t_i\\)). The output pole direction is \\(\\frac{1}{\\normtwo{y_{p_i}}} y_{p_i}\\)\n The pole directions may be defined in terms of the transfer function matrix by evaluating \\(G(s)\\) at the pole \\(p_i\\) and considering the directions of the resulting complex matrix \\(G(p_i)\\). The matrix is infinite in the direction of the pole, and we may write \\[ G(p_i) u_{p_i} = \\infty \\cdot y_{p_i} \\] where \\(u_{p_i}\\) is the input pole direction and \\(y_{p_i}\\) is the output pole direction.\nThe pole directions may in principle be obtained from an SVD of \\(G(p_i) = U\\Sigma V^H\\). Then \\(u_{p_i}\\) is the first column in \\(V\\) (corresponding to the maximum singular value) and \\(y_{p_i}\\) the first column in \\(U\\).\nThe pole direction is usually very interesting because it gives information about which output (or combination of outputs) may be difficult to control.\nZeros Zeros of a system arise when competing effects, internal to the system, are such that the output is zero even when the inputs (and the states) are not themselves identically zero.\n \\(z_i\\) is a zero of \\(G(s)\\) if the rank of \\(G(z_i)\\) is less than the normal rank of \\(G(s)\\). The zero polynomial is defined as \\(z(s) = \\Pi_{i=1}^{n_z}(s-z_i)\\) where \\(n_z\\) is the number of finite zeros of \\(G(s)\\)\n Zeros from State-Space Realizations The state-space equations of a system may be written as \\[P(s) \\colvec{x\\u} = \\colvec{0\\y}, \\quad P(s) = \\begin{bmatrix} sI-A \u0026amp; -B \\\\\\\nC \u0026amp; D \\\\\\\n\\end{bmatrix}\\]\nThe zeros are then the values \\(s=z\\) for which the polynomial system matrix, \\(P(s)\\), loses rank, resulting in zero output for some non-zero input.\nZeros from Transfer Functions The zero polynomial \\(z(s)\\), corresponding to a minimal realization of the system, is the greatest divisor of all the numerator of all order-\\(r\\) minors of \\(G(s)\\), where \\(r\\) is the normal rank of \\(G(s)\\), provided that these minors have been adjusted in such a way as to have the pole polynomial \\(\\phi(s)\\) as their denominator.\nThe zeros are values of \\(s\\) for which \\(G(s)\\) looses rank. In general, there is no relationship between the elements of the transfer function and its (multivariable) zeros.\nZero Directions Let \\(G(s)\\) have a zero at \\(s=z\\). Then \\(G(s)\\) loses rank at \\(s=z\\), and there will exist non-zero vectors \\(u_z\\) and \\(y_z\\) such that \\[G(z) u_z = 0 \\cdot y_z\\] Here \\(u_z\\) is defined as the input zero direction and \\(y_z\\) is defined as the output zero direction.\nFrom a practical point of view, \\(y_z\\) is usually of more interest than \\(u_z\\) because it give information about which combination of outputs may be difficult to control.\nAgain, we may obtain input and output zero directions from an SVD of \\(G(s)\\): \\(u_z\\) is the last column of \\(U\\) and \\(y_z\\) is the last column of \\(V\\) (corresponding to the zero singular value of \\(G(z)\\)).\nSome Remarks on Poles and Zeros We should always find a minimal realization of the system before computing the zeros. For a square system \\(G(s)\\), the poles and zeros are essentially the poles and zeros of \\(\\det G(s)\\). Poles and zeros can occurs at the same location, but their directions may be different so they do not cancel or otherwise interact with each other. If \\(G^{-1}(s)\\) exists, then the poles of \\(G(s)\\) are the zeros of \\(G^{-1}(s)\\) and vice versa (as for SISO systems). Zeros usually appear when there are fewer inputs or outputs than states or when \\(D \\neq 0\\) Moving poles and zeros: Feedback: \\(G(I+GK)^{-1}\\). Poles (of \\(G\\)) are moved and zeros (of \\(G\\)) are unchanged (in addition we get as zeros the poles of \\(K\\)) Series: \\(GK\\). Poles and zeros are unchanged (with the exception of possible cancellations between poles and zeros in \\(G\\) and \\(K\\)) Parallel: \\(G+K\\). Poles are unchanged, zeros are moved (but note that physically a parallel interconnection requires an additional manipulated input) Pinned zeros. A zero is pinned to a subset of the outputs if \\(y_z\\) has one or more elements equal to zero. Their effect cannot be moved freely to any output. Similarly, a zero is pinned to certain input if \\(u_z\\) has one or more elements equal to zero. Consider a SISO negative feedback system with plant \\(G(s)=\\frac{z(s)}{\\phi(s)}\\) and a constant gain controller, \\(K(s)=k\\). The closed-loop response from reference \\(r\\) to output \\(y\\) is \\[T(s) = \\frac{kG(s)}{1+kG(s)} = \\frac{kz(s)}{\\phi(s)+kz(s)} = k\\frac{z_{\\text{cl}}(s)}{\\phi_{\\text{cl}}(s)}\\]\nWe note that:\n The zero locations are unchanged by feedback The pole locations are changed by feedback \\begin{align*} \\phi_{\\text{cl}(s)} \u0026amp;\\underset{k \\rightarrow 0}{\\longrightarrow} \\phi(s) \\\\\\\n\\phi_{\\text{cl}(s)} \u0026amp;\\underset{k \\rightarrow \\infty}{\\longrightarrow} k z(s) \\end{align*}\nThat is, as we increase the feedback gain, the closed loop poles moves from open-loop poles to the open-loop zeros. RHP-zeros therefore imply high gain instability.\n Internal Stability of Feedback Systems \n Figure 9: Block diagram used to check internal stability\n Assume that the components \\(G\\) and \\(K\\) contain no unstable hidden modes. Then the feedback system in Fig. fig:block_diagram_for_stability is internally stable if and only if all four closed-loop transfer matrices are stable.\n\\begin{align*} \u0026amp;(I+KG)^{-1} \u0026amp; -K\u0026amp;(I+GK)^{-1} \\\\\\\nG\u0026amp;(I+KG)^{-1} \u0026amp; \u0026amp;(I+GK)^{-1} \\end{align*}\nAssume there are no RHP pole-zero cancellations between \\(G(s)\\) and \\(K(s)\\), the feedback system in Fig. fig:block_diagram_for_stability is internally stable if and only if one of the four closed-loop transfer function matrices is stable.\nStabilizing Controllers The Q-parameterization is a parameterization that generates all controllers that yield internal stability of the closed loop transfer function.\n For stable plants, a parameterization of all stabilizing negative feedback controllers for the stable plant \\(G(s)\\) is given by \\[K = (I-QG)^{-1} Q = Q(I-GQ)^{-1}\\] where the parameter \\(Q\\) is any stable transfer function matrix.\n This may have significant advantages in controller synthesis where the objective is to a find a \\(K\\) which minimizes some norm of \\(N(K)\\). The search over stabilizing \\(K\\) (which involves checking the stability of closed-loop transfer functions) is replaced by a search over stable \\(Q\\). The closed-loop transfer functions turn out to be affine in \\(Q\\), e.g. \\(S\\) or \\(T\\) can be written \\(H1 + H2 Q H3\\), which may significantly simplify the optimization (e.g. compared to \\(GK(I+GK)^{-1}\\) which is fractional in \\(K\\)).\nStability Analysis in the Frequency Domain Let \\(P_{ol}\\) denote the number of unstable poles in \\(L(s) = G(s)K(s)\\). The closed-loop system with loop transfer \\(L(s)\\) and negative feedback is stable if and only if the Nyquist plot of \\(\\det(I+L(s))\\):\n makes \\(P_{ol}\\) anti-clockwise encirclements of the origin does not pass through the origin The spectral radius \\(\\rho(L(j\\w))\\) is defined as the maximum eigenvalue magnitude: \\[ \\rho(L(j\\w)) \\triangleq \\max_{i} \\abs{\\lambda_i (L(j\\w))} \\]\n Consider a system with a stable loop transfer function \\(L(s)\\). Then the closed-loop system is stable if \\[ \\rho(L(j\\w)) \u0026lt; 1 \\quad \\forall \\w \\]\n Consider a system with a stable loop transfer function \\(L(s)\\). Then the closed-loop system is stable if \\[ \\norm{L(j\\w)} \u0026lt; 1 \\quad \\forall \\w\\] Where \\(\\norm{L}\\) denotes any matrix norm that satisfies the multiplicative property \\(\\norm{AB} \\leq \\norm{A}\\cdot\\norm{B}\\)\n The Small gain theorem for SISO system says that the system is stable if \\(\\abs{L(j\\w)} \u0026lt; 1\\) at all frequencies \\(\\w\\). This is clearly a very conservative condition as no phase information is taken into account.\nThis may be understood as follows: the signals which \u0026ldquo;return\u0026rdquo; in the same direction after \u0026ldquo;one turn around the loop\u0026rdquo; are magnified by the eigenvalues \\(\\lambda_i\\) (and the directions are the eigenvectors \\(x_i\\)):\n\\[ L x_i = \\lambda_i x_i \\]\nSo if all the eigenvalues \\(\\lambda_i\\) are less than 1 in magnitude, all signals become smaller after each round, and the closed-loop system is stable.\nSystem Norms \\(\\htwo\\) norm Consider a strictly proper system \\(G(s)\\). The \\(\\htwo\\) norm is:\n\\begin{align*} \\normtwo{G(s)} \u0026amp;\\triangleq \\sqrt{\\frac{1}{2\\pi} \\int_{-\\infty}^{\\infty} \\text{tr}\\left(G(j\\w)^HG(j\\w)\\right) d\\w} \\\\\\\n\u0026amp; = \\sqrt{\\frac{1}{2\\pi} \\int_{-\\infty}^{\\infty} \\sum_i {\\sigma_i}^2(G(j\\w)) d\\w} \\end{align*}\n The \\(\\htwo\\) norm can have a stochastic interpretation where we measure the expected root mean square value of the output in response to white noise excitation.\n\\(\\hinf\\) norm Consider a proper linear stable system \\(G(s)\\). The \\(\\hinf\\) norm is the peak value of its maximum singular value: \\[ \\hnorm{G(s)} \\triangleq \\max_{\\w} \\maxsv(G(j\\w)) \\]\n The \\(\\hinf\\) norm has several interpretations in the time and frequency domains:\n it is the peak of the transfer function magnitude by introducing weights, it can be interpreted as the magnitude of the some closed-loop transfer function relative to an upper bound it is the worst case steady-state gain for sinusoidal inputs at any frequency it is equal to the 2-norm in the time domain: \\[ \\hnorm{G(s)} = \\max_{w(t) \\neq 0} \\frac{\\normtwo{z(t)}}{\\normtwo{w(t)}} = \\max_{\\normtwo{w(t)} = 1} \\normtwo{z(t)} \\]\n is has an interpretation as an induced norm in terms of the expected values of stochastic signals Difference Between the \\(\\htwo\\) and \\(\\hinf\\) norms Minimizing the \\(\\hinf\\) norm corresponds to minimizing the peak of the largest singular value, whereas minimizing the \\(\\htwo\\) norm corresponds to minimizing the sum of the square of all the singular values over all frequencies.\n The \\(\\hinf\\) norm is convenient for representing unstructured model uncertainty and because if satisfies the multiplicative property \\(\\hnorm{A(s)B(s)} \\leq \\hnorm{A(s)} \\cdot \\hnorm{B(s)}\\) It follows that the \\(\\hinf\\) norm is an induced norm.\n The \\(\\htwo\\) norm on the other hand is not and induced norm and does not satisfies the multiplicative property. This implies that we cannot, by evaluating the \\(\\htwo\\) norm of the individual components say anything about how their series interconnection will behave.\nHankel norm The Hankel norm of a stable system \\(G(s)\\) is obtained when one applies an input \\(w(t)\\) up to \\(t=0\\) and measures the output \\(z(t)\\) for \\(t\u0026gt;0\\), and selects \\(w(t)\\) to maximize the ratio of the 2-norms: \\[ \\left\\|G(s)\\right\\|_H \\triangleq \\max_{w(t)} \\frac{\\sqrt{\\int_{0}^{\\infty} \\normtwo{z(\\tau)}^2 d\\tau }}{\\sqrt{\\int_{-\\infty}^0 \\normtwo{w(\\tau)}^2 d\\tau}} \\] The Hankel norm is a kind of induced norm from past inputs to future outputs.\nIt may be shown that the Hankel norm is equal to \\(\\left\\|G(s)\\right\\|_H = \\sqrt{\\rho(PQ)}\\) where \\(\\rho\\) is the spectral radius, \\(P\\) is the controllability Gramian and \\(Q\\) the observability Gramian.\nLimitations on Performance in SISO Systems \nInput-Output Controllability The input-output controllability is the ability to achieve acceptable control performance; that is, to keep the outputs (\\(y\\)) within specified bounds from their references (\\(r\\)), in spite of unknown but bounded variations, such as disturbances (\\(d\\)) and plant changes, using available inputs (\\(u\\)) and available measurements (\\(y_m\\)).\n A plant is controllable if there exists a controller that yields acceptable performance for all expected plant variation. Thus, controllability is independent of the controller and is a property of the plant alone. It may be affected by changing the plant itself:\n changing the mechanical design relocating sensors and actuators adding new equipment to dampen disturbances adding extra sensor or actuators changing the configuration of the lower layers of control already in place Input-output controllability analysis is applied to a plant to find out what control performance can be expected.\nIt is also called performance targeting.\n If the system has been scaled, the requirement for acceptable performance is: For any disturbance \\(\\abs{d} \\leq 1\\) and any reference \\(\\abs{r} \\leq R\\), the performance requirement is to keep the control error \\(\\abs{e} \\leq 1\\) using an input \\(\\abs{u} \\leq 1\\).\nPerfect Control and Plant Inversion To obtain insight into the inherent limitations on performance, let\u0026rsquo;s consider the input needed to achieve perfect control. Let the plant model be: \\(y = G u + G_d d\\) Since we want perfect control, \\(y = r\\) and we have \\(u = G^{-1} r - G^{-1} G_d d\\) that represents a perfect feedforward controller.\nFor a feedback control, \\(u = K(r - y)\\), and we have \\(u = KS r - KSG_d d\\) that we can rewrite \\(u = G^{-1}Tr - G^{-1}TG_d d\\).\nWe see that at frequency where feedback is effective (\\(T \\approx I\\)), the input generated by feedback is the same as the perfect control input. That is, high gain feedback generates an inverse of \\(G\\).\nPerfect control requires the controller to somehow generate an inverse of \\(G\\). Perfect control cannot be achieved if:\n \\(G\\) contains RHP-zeros (since then \\(G^{-1}\\) is unstable) \\(G\\) contains time delay (since then \\(G^{-1}\\) contains non-causal prediction) \\(G\\) has more pole than zero (since then \\(G^{-1}\\) is unrealizable) The required input must not exceed maximum physically allowed value (\\(\\abs{u} \\leq 1\\)), therefore perfect control cannot be achieve if:\n \\(\\abs{G^{-1} G_d}\\) is large (\\(\\geq 1\\)) \\(\\abs{G^{-1} R}\\) is large (\\(\\geq 1\\)) Constrain of \\(S\\) and \\(T\\) \\(S\\) Plus \\(T\\) is One From the definitions \\(S = (I + L)^{-1}\\) and \\(T = L(I+L)^{-1}\\) we derive\n\\begin{equation} S + T = I \\end{equation}\n Ideally, we want \\(S\\) small to obtain small control error for commands and disturbances, and \\(T\\) small to avoid sensitivity to noise. There requirements are not simultaneously possible at any frequency.\nThe Waterbed Effects In general, a trade-off between sensitivity reduction and sensitivity increase must be performed whenever:\n \\(L(s)\\) has at least two more poles than zeros (first waterbed formula) \\(L(s)\\) has a RHP-zero (second waterbed formula) Suppose that the open-loop transfer function \\(L(s)\\) is rational and has at least two more poles than zeros. Suppose also that \\(L(s)\\) has \\(N_p\\) RHP-poles at locations \\(p_i\\). Then for closed-loop stability, the sensitivity function must satisfy the following Bode Sensitivity Integral:\n\\begin{equation} \\int_0^\\infty \\ln\\abs{S(j\\w)} d\\w = \\pi \\sum_{i=1}^{N_p} \\text{Re}(p_i) \\end{equation}\n For a stable plant, we must have:\n\\begin{equation} \\int_0^\\infty \\ln\\abs{S(j\\w)} d\\w = 0 \\end{equation}\nThe area of sensitivity reduction (\\(\\ln\\abs{S}\\) negative) must equal the area of sensitivity increase (\\(\\ln\\abs{S}\\) positive): the benefits and costs of feedback are balanced.\nFor unstable plant, the presence of unstable poles usually increase the peak of \\(\\abs{S}\\) as seen from the contribution \\(\\pi \\sum_{i=1}^{N_p} \\text{Re}(p_i)\\). This is the price to pay for stabilizing the system.\nFrom the first waterbed formula, we expect that an increase in the bandwidth must come at the expense of a large peak in \\(\\abs{S}\\). Although this is true in most practical cases, however this is not strictly implied by the formula. This is because the increase in area may happen over an infinite frequency range.\n Suppose that \\(L(s)\\) has a single real RHP-zero \\(z\\) or a complex conjugate pair of zero \\(z=x\\pm jy\\), and has \\(N_p\\) RHP-poles \\(p_i\\). For closed-loop stability, the sensitivity function must satisfy \\[ \\int_0^\\infty \\ln\\abs{S(j\\w)} w(z, \\w) d\\w = \\pi \\ln \\sum_{i=1}^{N_p} \\abs{\\frac{p_i + z}{\\bar{p_i}-z}} \\]\nwhere if the zero is real \\[ w(z, \\w) = \\frac{2z}{z^2 + \\w^2} \\] and if the zero pair is complex \\[ w(z, \\w) = \\frac{x}{x^2 + (y-\\w)^2} + \\frac{x}{x^2 + (y+\\w)^2} \\]\n The second waterbed formula implies that the peak of \\(\\abs{S}\\) is even higher for plants with RHP-zeros.\nThe weight \\(w(z, \\w)\\) effectively \u0026ldquo;cuts off\u0026rdquo; the contribution from \\(\\ln\\abs{S}\\) to the integral at frequencies \\(\\w \u0026gt; z\\). So we have approximately: \\[ \\int_0^z \\ln \\abs{S(j\\w)} d\\w \\approx 0 \\]\nThis is similar to the Bode sensitivity integral, except that the trade-off is done over a limited frequency range. Thus, a large peak for \\(\\abs{S}\\) is unavoidable if we try to push down \\(\\abs{S}\\) at low frequencies.\nInterpolation Constraints If \\(p\\) is a RHP-pole of the loop transfer function \\(L(s)\\) then\n\\begin{equation} T(p) = 1, \\quad S(p) = 0 \\end{equation}\nIf \\(z\\) is a RHP-zero of the loop transfer function \\(L(s)\\) then\n\\begin{equation} T(z) = 0, \\quad S(z) = 1 \\end{equation}\n Sensitivity Peaks Suppose \\(f(s)\\) is stable, then the maximum value of \\(\\abs{f(s)}\\) for \\(s\\) in the RHP is attained on the region\u0026rsquo;s boundary (somewhere along the \\(j\\w\\)-axis): \\[ \\hnorm{f(j\\w)} = \\max_{\\omega} \\abs{f(j\\w)} \\geq \\abs{f(s_0)} \\quad \\forall s_0 \\in \\text{RHP} \\]\n We can derive the following bounds on the peaks of \\(S\\) and \\(T\\) from the maximum modulus principle: \\[ \\hnorm{S} \\geq \\max_{j} \\prod_{i=1}^{N_p} \\frac{\\abs{z_j + \\bar{p_i}}}{\\abs{z_j - p_i}} \\quad \\hnorm{T} \\geq \\max_{i} \\prod_{j=1}^{N_z} \\frac{\\abs{\\bar{z_j} + p_i}}{\\abs{z_j - p_i}} \\]\nThis shows that large peaks for \\(\\abs{S}\\) and \\(\\abs{T}\\) are unavoidable if we have a RHP-zero and RHP-pole located close to each other.\nLimitation Imposed by Time Delays Consider a plant \\(G(s)\\) that contains a time delay \\(e^{-\\theta s}\\). Even the \u0026ldquo;ideal\u0026rdquo; controller cannot remove this delay and the \u0026ldquo;ideal\u0026rdquo; sensitivity function is \\(S = 1 - T = 1 - e^{-\\theta s}\\).\n \\(S\\) crosses 1 at a frequency of about \\(1/\\theta\\), so we expect to have an upper bound on \\(\\w_c\\): \\[ \\w_c \u0026lt; 1/\\theta \\]\n Limitation Imposed by RHP-Zeros RHP-zeros typically appear when we have competing effects of slow and fast dynamics. Their presence induces many limitations.\nInverse Response We can show that the output of a step change in the input of a stable plant with \\(n_z\\) real RHP-zeros will cross zero \\(n_z\\) times, that is, we have inverse response.\nHigh Gain Instability It is well known that the closed-loop poles migrate from the open-loop poles to the open-loop zeros as the feedback gain increases. Thus the presence of RHP-zeros implies high-gain instability.\nBandwidth Limitation To derive bounds for the bandwidth, we select performance weight \\(w_P(s)\\) and we then use the interpolation constraint \\(S(z) = 1\\).\nWe require \\(\\abs{S(j\\w)} \u0026lt; 1/\\abs{w_P(j\\w)} \\quad \\forall \\w\\), so we must at least require that the weight satisfies \\(\\abs{w_P(z)} \u0026lt; 1\\).\nPerformance at low frequencies If we specify performance at low frequencies, we may use the following weight: \\[ w_P = \\frac{s/M + \\w_B^*}{s + \\w_B^* A} \\] Where \\(\\w_B^*\\) is the minimum wanted bandwidth, \\(M\\) the maximum peak of \\(\\abs{S}\\) and \\(A\\) the steady-state offset.\nIf we consider a real RHP-zero: \\[ \\w_B^* \u0026lt; z \\frac{1 - 1/M}{1 - A} \\] For example, with \\(A=0\\) and \\(M=2\\), we must at least require \\(\\w_B^* \u0026lt; 0.5z\\).\nIf we consider an imaginary RHP-zero: \\[ \\w_B^* \u0026lt; \\abs{z} \\sqrt{1 - \\frac{1}{M^2}} \\] For example, with \\(M=2\\), we must at least require \\(\\w_B^* \u0026lt; 0.86\\abs{z}\\).\n The presence of RHP-zero imposes an upper bound on the achievable bandwidth when we want tight control at low frequencies\n Performance at high frequencies We consider the case where we want tight control at high frequencies, by use of the performance weight: \\[ w_P = \\frac{1}{M} + \\frac{s}{\\w_B^*} \\]\nIf we consider a real RHP-zero: \\[ \\w_B^* \u0026gt; z \\frac{1}{1-1/M} \\] For example, with \\(M=2\\) the requirement is \\(\\w_B^* \u0026gt; 2z\\), so we can only achieve tight control at frequencies beyond the frequency of the RHP-zero.\n The presence of RHP-zero imposes and lower bound on the achievable bandwidth when we want tight control at high frequencies\n Limitation Imposed by RHP-Poles For unstable plants with a RHP-pole at \\(s = p\\), we need feedback for stabilization.\n In presence of a RHP-pole at \\(s=p\\): \\[ \\hnorm{KS} \\geq \\abs{G_s(p)^{-1}} \\] where \\(G_s\\) is the \u0026ldquo;stable version\u0026rdquo; of \\(G\\) with its RHP-poles mirrored into the LHP.\nSince \\(u = -KS(G_d d + n)\\) and because of the previous inequality, the presence of disturbances \\(d\\) and measurement noise \\(n\\) may require the input \\(u\\) to saturate. When the inputs saturate, the system is practically open-loop and the stabilization is not possible.\n We need to react sufficiently fast. For a real RHP-pole \\(p\\) we must require that the closed-loop bandwidth is larger than \\(2p\\). The presence of RHP-poles generally imposes a lower bound on the bandwidth.\n Combined Unstable (RHP) Poles and Zeros A strictly proper plant with a single real RHP-zero \\(z\\) and a single real RHP-pole \\(p\\) can be stabilized by a stable proper controller if and only if \\(z\u0026gt;p\\). In words \u0026ldquo;the system may go unstable before we have time to react\u0026rdquo;.\nIn order to achieve acceptable performance and robustness, we must approximately require \\(z\u0026gt;4p\\). That is, we want to RHP-pole to be much lower than the RHP-zero.\nThe presence of RHP-zeros (or time delays) make stabilization more difficult.\nPerformance Requirements Imposed by Disturbances and Commands Disturbance rejection Consider a single disturbance \\(d\\) and a constant reference \\(r=0\\). Without control, we have \\(e = G_d d\\). We conclude that no control is needed if \\(\\abs{G_d(j\\w)} \u0026lt; 1\\) at all frequencies. In that case, the plant is said to be \u0026ldquo;self-regulated\u0026quot;.\nIf \\(\\abs{G_d(j\\w)} \u0026gt; 1\\) at some frequency, then we need control. In case of feedback control, we have \\[ e(s) = S(s)G_d(s)d(s) \\] The performance requirement \\(\\abs{e(\\w)} \u0026lt; 1\\) for any \\(\\abs{d(\\w)}\\) at any frequency is satisfied if and only if \\[ \\abs{S G_d(j\\w)} \u0026lt; 1 \\quad \\forall\\w \\quad \\Leftrightarrow \\quad \\abs{S(j\\w)} \u0026lt; 1/\\abs{G_d(j\\w)} \\quad \\forall\\w \\]\n If the plant has a RHP-zero at \\(s=z\\), then \\(S(z) = 1\\) and we have the following condition: \\[ \\abs{G_d(z)} \u0026lt; 1 \\]\n We also have that \\[ \\w_B \u0026gt; \\w_d \\] where \\(\\w_d\\) is defined by \\(\\abs{G_d(j\\w_d)} = 1\\).\n The actual bandwidth requirement imposed by disturbances may be higher than \\(\\w_d\\) if \\(\\abs{G_d(j\\w)}\\) drops with a slope steeper than \\(-1\\) just before the frequency \\(\\w_d\\). This is because we cannot let the slope of \\(\\abs{L(j\\w)}\\) around the crossover be much larger than \\(-1\\) due to stability margins. It is however possible to overcome this issue using local feedback loops in series.\nCommand tracking Assume than \\(d=0\\) and \\(r(t) = R\\sin(\\w t)\\). For acceptable control (\\(\\abs{e} \u0026lt; 1\\)) we must have \\[ \\abs{S(j\\w)R}\u0026lt;1 \\quad \\forall\\w\\leq\\w_r \\] where \\(\\w_r\\) is the frequency up to which performance tracking is required.\nLimitation Imposed by Input Constraints To achieve acceptable control (\\(\\abs{e}\u0026lt;1\\)) and avoid input saturation (\\(\\abs{u}\u0026lt;1\\)), we must require:\nFor disturbance rejection: \\[ \\abs{G} \u0026gt; \\abs{G_d} - 1 \\text{ at frequencies where } \\abs{G_d} \u0026gt; 1 \\]\nFor command tracking: \\[ \\abs{G} \u0026gt; \\abs{R} - 1 \\quad \\forall \\w \\leq \\w_r \\]\n Limitation Imposed by Phase Lag Phase lag in the plant present no fundamental limitations, however is usually does on practical designs.\n Let define \\(\\w_u\\) as the frequency where the phase lag of the plant \\(G\\) is \\(\\SI{-180}{\\degree}\\)\n\\begin{equation} \\angle G(j\\w_u) \\triangleq \\SI{-180}{\\degree} \\end{equation}\n With simple controllers such as a proportional controller or a PI-controller, the phase lag does pose a fundamental limitation on the achievable bandwidth because of stability bounds: \\[ \\w_c \u0026lt; \\w_u \\]\nHowever, if the model is exactly known and there are no RHP-zeros or time delays, one may extend \\(\\w_c\\) to infinite frequency by placing zeros in the controller at the plant poles.\nLimitation Imposed by Uncertainty Uncertainty with feedforward control Perfect control is obtained using a controller which generates the control input \\[ u = G^{-1} r - G^{-1} G_d d \\] When we apply this perfect controller to the actual plant \\(y\u0026rsquo; = G\u0026rsquo; u + G_d\u0026rsquo; d\\), we find \\[ e\u0026rsquo; = y\u0026rsquo; - r = \\underbrace{\\left( \\frac{G\u0026rsquo;}{G} - 1 \\right)}_{\\text{rel. error in }G} r - \\underbrace{\\left( \\frac{G\u0026rsquo;/G_d\u0026rsquo;}{G/G_d} - 1 \\right)}_{\\text{rel. error in } G/G_d} G_d\u0026rsquo; d \\] For feedforward control, the model error propagates directly to the control error.\nIf we want acceptable control (\\(\\abs{e\u0026rsquo;}\u0026lt;1\\)), we must require that the model error in \\(G/G_d\\) is less than \\(1/\\abs{G_d\u0026rsquo;}\\). This is very difficult to satisfy at frequencies where \\(\\abs{G_d\u0026rsquo;}\\) is much larger than 1.\nThe presence of uncertainty then requires us to use feedback control rather than just feedforward control.\nUncertainty with feedback control With feedback control, the closed-loop response is \\(e = y - r = S G_d d - S r\\). With model error, we get \\(y\u0026rsquo; - r = S\u0026rsquo;(G_d\u0026rsquo;d - r)\\) where \\(S\u0026rsquo; = (I + G\u0026rsquo;K)^{-1}\\). \\(S\u0026rsquo;\\) can be rewritten as \\(S\u0026rsquo; = S \\frac{1}{1+ET}\\) with \\(E = \\frac{G\u0026rsquo;-G}{G}\\) the relative error for \\(G\\).\nWe see that the control error in only weakly affected by model error at frequencies where feedback is effective (\\(T \\approx 1\\)).\n Uncertainty in the crossover frequency region can result in poor performance and even instability:\n Uncertainty which keeps \\(\\abs{G(j\\w_u)}\\) approximately constant will not change the gain margin. Uncertainty which increases \\(\\abs{G(j\\w_u)}\\) may yield instability. Summary: Controllability Analysis with Feedback Control \n Figure 10: Feedback control system\n Consider the control system in Fig. fig:classical_feedback_meas. Here \\(G_m(s)\\) denotes the measurement transfer function and we assume \\(G_m(0) = 1\\) (perfect steady-state measurement).\n Speed of response to reject disturbances. We approximately require \\(\\w_c \u0026gt; \\w_d\\). With feedback control we require \\(\\abs{S(j\\w)} \\leq \\abs{1/G_d(j\\w)} \\quad \\forall\\w\\). Speed of response to track reference changes. We require \\(\\abs{S(j\\w)} \\leq 1/R\\) up to the frequency \\(\\w_r\\) where tracking is required. Input constraints arising from disturbances. For acceptable control we require \\(\\abs{G(j\\w)} \u0026gt; \\abs{G_d(j\\w)} - 1\\) at frequencies where \\(\\abs{G_d(j\\w)} \u0026gt; 1\\). Input constraints arising from setpoints. We require \\(\\abs{G(j\\w)} \u0026gt; R - 1\\) up to the frequency \\(\\w_r\\) where tracking is required. Time delay \\(\\theta\\) in \\(G(s)G_m(s)\\). We approximately require \\(\\w_c \u0026lt; 1/\\theta\\). Tight control at low frequencies with a RHP-zero \\(z\\) in \\(G(s)G_m(s)\\). For a real RHP-zero we require \\(\\w_c \u0026lt; z/2\\) and for an imaginary RHP-zero we approximately require \\(\\w_c \u0026lt; \\abs{z}\\). Phase lag constraint. We require in most practical cases \\(\\w_c \u0026lt; \\w_u\\). Here the ultimate frequency \\(\\w_u\\) is where \\(\\angle GG_m(j\\w_u) = \\SI{-180}{\\degree}\\). Since time delays and RHP-zeros also contribute to the phase lag, it is possible to combine the corresponding rules in the single rule \\(\\w_c \u0026lt; \\w_u\\). Real open-loop unstable pole in \\(G(s)\\) at \\(s=p\\). We need high feedback gains to stabilize the system and we approximately require \\(\\w_c \u0026gt; 2p\\). In summary:\n rules 1, 2 and 8 tell us that we need high feedback gain in order to reject disturbances, to track setpoints and to stabilize the plant. rules 5, 6 and 7 tell us we must use low feedback gains in the frequency range where there are RHP-zeros or delays or where the plant has a lot of phase lag. Sometimes, the disturbances are so large that we hit input saturation or the required bandwidth is not achievable. To avoid the latter problem, we must at least require that the effect of the disturbance is less than \\(1\\) at frequencies beyond the bandwidth: \\[ \\abs{G_d(j\\w)} \u0026lt; 1 \\quad \\forall \\w \\geq \\w_c \\]\n\n Figure 11: Illustration of controllability requirements\n Controllability analysis with feedforward control We find that essentially the same conclusions apply to feedforward control when relevant.\nA major difference is that a delay in \\(G_d(s)\\) is an advantage for feedforward control (\u0026ldquo;it gives the feedforward controller more time to make the right action\u0026rdquo;).\nConclusion The controllability analysis is summarized in terms of eight controllability rules. These rules are necessary conditions to achieve acceptable control performance. They are not sufficient since among other things they only consider one effect at a time. The rules may be used to determine whether or not a given plant is controllable.\nLimitations on Performance in MIMO Systems \nIntroduction In a MIMO system, disturbances, the plant, RHP zeros, RHP poles, delays and disturbances have each directions associated with them.\nWe quantify the directionality of the various effects in \\(G\\) and \\(G_d\\) by their output directions:\n \\(y_z\\): output dir. of RHP-zero, \\(G(z) u_z = 0 \\cdot y_z\\) \\(y_p\\): output dir. of RHP-pole, \\(G(p_i) u_p = \\infty \\cdot y_p\\) \\(y_d\\): output dir. of disturbance, \\(y_d(s) = \\frac{1}{\\normtwo{g_d(s)}} g_d(s)\\) \\(u_i\\): i\u0026rsquo;th output dir. (singular vector) of the plant, \\(G(s) v_i(s) = \\sigma_i(s) u_i(s)\\) We may also consider input directions, however we are primarily concerned with the performance at the output of the plant.\nThe angle between various output directions is quantified using their inner products.\nFor example, the output angle between a pole and a zero is \\(\\phi = \\cos^{-1} \\abs{y_z^H y_p}\\), and:\n if \\(\\phi = \\SI{90}{\\degree}\\), then the pole and zero are in completely different directions and there is no interaction (they may be considered separately) if \\(\\phi = \\SI{0}{\\degree}\\), then they interact as in a SISO system Constraints on \\(S\\) and \\(T\\) \\(S\\) plus \\(T\\) is the Identity Matrix From the identity \\(S + T = I\\), we get:\n\\begin{subequations} \\begin{align} |1 - \\maxsv(S)| \\leq \\maxsv(T) \\leq 1 + \\maxsv(S)\\\\\\\n|1 - \\maxsv(T)| \\leq \\maxsv(S) \\leq 1 + \\maxsv(T) \\end{align} \\end{subequations}\nThis shows that we cannot have \\(S\\) and \\(T\\) small simultaneously and that \\(\\maxsv(S)\\) is large if and only if \\(\\maxsv(T)\\) is large.\nSensitivity Intregrals The waterbed effect can be generalized for MIMO systems:\n\\begin{align*} \\int_0^{\\infty} \\ln{|\\det{S(j\\w)}|} d\\w \u0026amp;= \\sum_j \\int_0^\\infty \\ln{\\sigma_j(S(j\\w))} d\\w \\\\\\\n\u0026amp;= \\pi \\cdot \\sum_{i=1}^{N_p} \\text{Re}(p_i) \\end{align*}\nInterpolation Constraints The basis of many of the results in this chapter are the \u0026ldquo;interpolation constraints\u0026quot;.\n If \\(G(s)\\) has a RHP-zero at \\(z\\) with output direction \\(y_z\\), \\(T(s)\\) must have a RHP-zero at \\(z\\), i.e., \\(T(z)\\) has a zero gain in the direction of output direction \\(y_z\\) of the zero, and we get \\[ y_z^H T(z) = 0 ; \\quad y_z^H S(z) = y_z^H \\]\n If \\(G(s)\\) has a RHP-pole at \\(p\\) with output direction \\(y_p\\), \\(S(s)\\) must have a RHP-zero at \\(p\\), i.e. \\(S(p)\\) has a zero gain in the input direction of the output direction \\(y_p\\) of the RHP-pole, and we get \\[ S(p) y_p = 0 ; \\quad T(p) y_p = y_p \\]\n Sensitivity Peaks Consider a plant \\(G(s)\\) with RHP-poles \\(p_i\\) and RHP-zeros \\(z_j\\). The factorization of \\(G(s)\\) in terms of Blaschke products is: \\[ \\tcmbox{G(s) = B_p^{-1} G_s(s), \\quad G(s) = B_z(s) G_m(s)} \\] where \\(G_s\\) is the stable and \\(G_m\\) the minimum-phase version of \\(G\\). \\(B_p\\) and \\(B_z\\) are stable all-pass transfer matrices (all singular values are 1 for \\(s=j\\w\\)) containing the RHP-poles and RHP-zeros respectively.\nMIMO sensitivity peaks Suppose that \\(G(s)\\) has \\(N_z\\) RHP-zeros \\(z_j\\) with output directions \\(y_{zj}\\), and \\(N_p\\) RHP-poles \\(p_i\\) with output direction \\(y_{pi}\\). We define the all-pass transfer matrices from the Blaschke factorization and compute the real constants: \\[ c_{1j} = \\normtwo{y_{zj}^H B_p(z_j)} \\geq 1; \\quad c_{2i} = \\normtwo{B_z^{-1}(p_i) y_{pi}} \\geq 1 \\]\nLet \\(w_P(s)\\) be a stable weight. Then, for closed-loop stability the weighted sensitivity function must satisfy for each RPH-zero \\(z_j\\) \\[ \\hnorm{w_p S} \\ge c_{1j} \\abs{w_p(z_j)} \\]\nLet \\(w_T(s)\\) be a stable weight. Then, for closed-loop stability the weighted complementary sensitivity function must satisfy for each RPH-pole \\(p_i\\) \\[ \\hnorm{w_T T} \\ge c_{2j} \\abs{w_T(p_i)} \\]\n By selecting \\(w_P(s) = 1\\) and \\(w_T(s) = 1\\), we get \\[ \\hnorm{S} \\ge \\max_{\\text{zeros } z_j} c_{1j}; \\quad \\hnorm{T} \\ge \\max_{\\text{poles } p_i} c_{2j} \\]\n Functional Controllability An m-input l-output system \\(G(s)\\) is functionally controllable is the normal rank of \\(G(s)\\), denoted \\(r\\), is equal to the number of outputs (\\(r = l\\)), that is, if \\(G(s)\\) has full row rank. A system is functionally uncontrollable if \\(r\u0026lt;l\\).\n A square MIMO system is uncontrollable if and only if \\(\\det{G(s)} = 0,\\ \\forall s\\).\nA plant is functionally uncontrollable if and only if \\(\\sigma_l(G(j\\omega)) = 0,\\ \\forall\\w\\). \\(\\sigma_l(G(j\\w))\\) is then a measure of how close a plant is to being functionally uncontrollable.\n If the plant is not functionally controllable (\\(r\u0026lt;l\\)), then there are \\(l-r\\) output directions, denoted \\(y_0\\) which cannot be affected. These directions will vary with frequency, and we have \\[ y_0^H(j\\w) G(j\\w) = 0 \\] From an SVD of \\(G(j\\w) = U \\Sigma V^H\\), the uncontrollable output directions \\(y_0(j\\w)\\) are the last \\(l-r\\) columns of \\(U(j\\w)\\).\n By analyzing the uncontrollable output directions, an engineer can decide on whether it is acceptable to keep certain output combinations uncontrolled, or if additional actuators are needed.\nLimitation Imposed by Time Delays Time delays pose limitation also in MIMO systems. Let \\(\\theta_{ij}\\) denote the time delay in the \\(ij\\)\u0026lsquo;th element of \\(G(s)\\). Then a lower bound on the time delay for output \\(i\\) is given by the smallest delay in row \\(i\\) of \\(G(s)\\), that is \\[ \\theta_i^{\\min} = \\min_j \\theta_{ij} \\]\nFor MIMO systems, we have the surprising result that an increase time delay may sometimes improve the achievable performance. The time delay may indeed increase the decoupling between the outputs.\nLimitations Imposed by RHP-Zeros The limitations imposed by RHP-zeros on MIMO systems are similar to those for SISO system, although they only apply in particular directions.\nThe limitations of a RHP-zero located at \\(z\\) may be derived from the bound: \\[ \\hnorm{w_P S(s)} = \\max_{\\w} \\abs{w_P(j\\w)} \\maxsv(S(j\\w)) \\ge \\abs{w_P(z)} \\]\nAll the results derived for SISO systems generalize if we consider the \u0026ldquo;worst\u0026rdquo; direction corresponding to the maximum singular value \\(\\maxsv(S)\\). For instance, if we choose \\(w_P(s)\\) to require tight control at low frequencies, the bandwidth must satisfy \\(w_B^* \u0026lt; z/2\\).\nIn MIMO systems, one can often move the deteriorating effect of a RHP-zero to a given output which may be less important to control well. This is possible because, although the interpolation constraint \\(y_z^H T(z) = 0\\) imposes a certain relationship between the elements within each column of \\(T(s)\\), the columns of \\(T(s)\\) may still be selected independently.\nRequiring a decoupled response from \\(r\\) to \\(y\\) generally leads to the introduction of additional RHP-zero in \\(T(s)\\) which are not present in \\(G(s)\\). Moving the effect of the RHP-zero to a particular output generally add some interaction. Also, moving to RHP-zero in a direction where \\(y_z\\) is small usually introduces more interaction than in a direction where \\(y_z\\) is large.\nFor example, if we have a RHP-zero with \\(y_z = [0.03,\\ -0.04,\\ 0.9,\\ 0.43]^T\\), then one may in theory move the bad effect of the RHP-zero to any of the outputs. However, in practice, it will be difficult to avoid the effect of the RHP-zero on output 3, because the zero direction is mainly in that output. Trying to move it somewhere else will give large interactions and poor performance.\nLimitation Imposed by Unstable (RHP) Poles For unstable plants, feedback is needed for stabilization. More precisely, the presence of an unstable pole \\(p\\) requires for internal stability \\(T(p) y_p = y_p\\) where \\(y_p\\) is the output pole direction.\n The transfer function \\(KS\\) from plant output to plant inputs must satisfy for any RHP-pole \\(p\\) \\[ \\hnorm{KS} \\ge \\normtwo{u_p^H G_s(p)^{-1}} \\] where \\(u_p\\) is the input pole direction, and \\(G_s\\) is the \u0026ldquo;stable version\u0026rdquo; of \\(G\\) with its RHP-poles mirrored in the LHP.\n From the bound \\(\\hnorm{w_T(s) T(s)} \\ge \\abs{w_T(p)}\\), we find that a RHP-pole \\(p\\) imposes restrictions on \\(\\maxsv(T)\\) which are identical to those derived on \\(\\abs{T}\\) for SISO systems. Thus, we need to react sufficiently fast and we must require that \\(\\maxsv(T(j\\w))\\) is about 1 or larger up to the frequency \\(2 \\abs{p}\\).\n RHP-poles Combined with RHP-Zeros For a MIMO plant with single RHP-zero \\(z\\) and single RHP-pole \\(p\\), we derive\n\\[ \\hnorm{S} \\ge c \\quad \\hnorm{T} \\ge c \\] \\[ \\text{with } c = \\sqrt{\\sin^2 \\phi + \\frac{\\abs{z + p}^2}{\\abs{z-p}^2} \\cos^2 \\phi} \\] where \\(\\phi = cos^{-1} \\abs{y_z^H y_p}\\) is the angle between the RHP-zero and the RHP-pole.\nThus the angle between the RHP-zero and the RHP-pole is of great importance, we usually want \\(\\abs{y_z^H y_p}\\) close to zero so that they don\u0026rsquo;t interact with each other.\nLimitations Imposed by Disturbances For SISO systems, we found that large and \u0026ldquo;fast\u0026rdquo; disturbances require tight control and a large bandwidth. The same results apply for MIMO systems, but again the issue of directions is important.\n Consider a scalar disturbance \\(d\\) and let the vector \\(g_d\\) represents its effect on the outputs (\\(y = g_d d\\)). The disturbance direction is defined as\n\\begin{equation} y_d = \\frac{1}{\\normtwo{g_d}} g_d \\end{equation}\nFor a plant with multiple disturbances, \\(g_d\\) is a column of the matrix \\(G_d\\).\n \\begin{equation} \\gamma_d (G) = \\maxsv(G) \\maxsv(G^\\dagger y_d) \\end{equation}\nwhere \\(G^\\dagger\\) is the pseudo inverse of \\(G\\)\n The disturbance condition number provides a measure of how a disturbance is aligned with the plant. It may vary between 1 (for \\(y_d = \\bar{u}\\)) if the disturbance is in the \u0026ldquo;good\u0026rdquo; direction, and the condition number \\(\\gamma(G) = \\maxsv(G) \\maxsv(G^\\dagger)\\) (for \\(y_d = \\ubar{u}\\)) if it is in the \u0026ldquo;bad\u0026rdquo; direction.\nLet assume \\(r=0\\) and that the system has been scaled. With feedback control \\(e = S g_d d\\) and the performance objective is \\[ \\normtwo{S g_d} = \\maxsv(S g_d) \u0026lt; 1 \\ \\forall\\w \\quad \\Leftrightarrow \\quad \\hnorm{S g_d} \u0026lt; 1 \\]\nWe derive bounds in terms of the singular values of \\(S\\): \\[ \\minsv(S) \\normtwo{g_d} \\le \\normtwo{S g_d} \\le \\maxsv(S) \\normtwo{g_d} \\]\n For acceptable performance we must at least require that \\[ \\maxsv(I+L) \u0026gt; \\normtwo{g_d} \\]\nAnd we may require that \\[ \\minsv(I+L) \u0026gt; \\normtwo{g_d} \\]\n If \\(G(s)\\) has a RHP-zero at \\(s = z\\), then the performance may be poor if the disturbance is aligned with the output direction of this zero. To satisfy \\(\\hnorm{S g_d} \u0026lt; 1\\), we must require \\[ \\abs{y_z^H g_d(z)} \u0026lt; 1 \\] where \\(y_z\\) is the direction of the RHP-zero.\nLimitations Imposed by Input Constraints Inputs for Perfect Control We here consider the question: can the disturbances be rejected perfectly while maintaining \\(\\|u\\|\u0026lt;1\\)?\nFor a square plant, the input needed for perfect disturbance rejection is \\(u = -G^{-1} G_d d\\).\nFor a single disturbance, as the worst-cast disturbance is \\(\\abs{d(\\w)} = 1\\), we get that input saturation is avoided (\\(\\|u\\|_{\\text{max}} \\le 1\\)) if all elements in the vector \\(G^{-1} g_d\\) are less than 1 in magnitude: \\[ \\|G^{-1} g_d\\|_{\\text{max}} \u0026lt; 1, \\ \\forall\\w \\]\nIt is first recommended to consider one disturbance at a time by plotting as a function of frequency the individual elements of \\(G^{-1} G_d\\). This will yields more information about which particular input is most likely to saturate and which disturbance is the most problematic.\nInputs for Acceptable Control We here consider the question: is it possible to achieve \\(\\|e\\|\u0026lt;1\\) while using inputs with \\(\\|u\\| \\le 1\\)?\nFor SISO systems, we have to required \\(\\abs{G} \u0026gt; \\abs{g_d} - 1\\) at frequencies where \\(\\abs{g_d} \u0026gt; 1\\). We would like to generalize this result to MIMO systems.\n Each singular value \\(\\sigma_i\\) of \\(G\\) must approximately satisfy:\n\\begin{equation} \\sigma_i(G) \\ge \\abs{u_i^H g_d} - 1 \\text{ where } \\abs{u_i^H g_d} \u0026gt; 1 \\end{equation}\nwith \\(u_i\\) the \\(i\\)\u0026lsquo;th output singular vector of \\(G\\).\n\\(u_i^H g_d\\) may be interpreted as the projection of \\(g_d\\) onto the \\(i\\)\u0026lsquo;th output singular vector of the plant.\n Using the previous approximation, we can find out:\n For which disturbances and at which frequencies input constraints may cause problems. This may give ideas on which disturbances should be reduced. In which direction \\(i\\) the plant gain is too small. By looking at the corresponding input singular vector \\(v_i\\), one can determine which actuators should be redesigned. By looking at the corresponding output singular vector \\(u_i\\), one can determine on which outputs we may have to reduce our performance requirements. For combined disturbances, one requires the \\(i\\)\u0026lsquo;th row sum of \\(U^H G_d\\) to be less than \\(\\sigma_i(G)\\). However, we usually derive more insight by considering one disturbance at a time.\nUnstable Plant and Input Constraints Active use of inputs are needed to stabilize an unstable plant. We must require \\(\\hnorm{KS} \\ge \\normtwo{u_p^H G_s(p)^{-1}}\\). If the required inputs exceed the constraints, then stabilization is most likely not possible.\nLimitation Imposed by Uncertainty The presence of uncertainty requires the use of feedback rather than simply feedforward control to get acceptable performance. Sensitivity reduction with respect to uncertainty is achieved with high-gain feedback, but for any real system, we have a crossover frequency range where the loop gain has to drop below 1. The presence of uncertainty in this frequency range may result in poor performance or even instability.\nThe issues are the same for SISO and MIMO systems, however, with MIMO systems there is an additional problem in that there is also uncertainty associated with the plant directionality.\nInput and Output Uncertainty In practice, the difference between the true perturbed plant \\(G^\\prime\\) and the plant model \\(G\\) is caused by a number of different sources. We here focus on input and output uncertainty. In multiplicative form, the input and output uncertainties are given by (see Fig. fig:input_output_uncertainty): \\[ G^\\prime = (I + E_O) G (I + E_I) \\]\n\n Figure 12: Plant with multiplicative input and output uncertainty\n Input and output uncertainty may seem similar, but their implications for control may be very different.\nIf all the elements of \\(E_O\\) and \\(E_I\\) are non-zero, then we have full block (unstructured) uncertainty.\nIn many cases, the source of uncertainty is in the individual input or output channels, and we have that \\(E_I\\) and \\(E_O\\) are diagonal matrices. For example \\(E_I = \\text{diag}\\{\\epsilon_1, \\epsilon_2, \\dots\\}\\) where \\(\\epsilon_i\\) is the relative uncertainty in input channel \\(i\\).\nDiagonal input uncertainty is always present in real systems and the magnitude of \\(\\epsilon_i\\) is typically \\(0.1\\) or larger.\nEffect of Uncertainty on Feedforward Control Consider a feedforward controller \\(u = K_r r\\) for the case with no disturbance (\\(d = 0\\)). We assume that \\(G\\) is inversible and we select \\(K_r = G^{-1}\\) to achieve perfect control (\\(e = 0\\)). However, for the actual plant \\(G^\\prime\\) (with uncertainty), the actual control error \\(e^\\prime = y^\\prime - r = G^\\prime G^{-1} r - r\\) is not null and we get:\n For output uncertainty: \\(e^\\prime = E_O r\\) For input uncertainty: \\(e^\\prime = G E_I G^{-1} r\\) For output uncertainty, we have an identical result as for SISO systems: the worst case relative control error \\(\\normtwo{e^\\prime}/\\normtwo{r}\\) is equal to the magnitude of the relative output uncertainty \\(\\maxsv(E_O)\\). However, for input uncertainty, the sensitivity may be much larger because the elements in the matrix \\(G E_I G^{-1}\\) can be much larger than the elements in \\(E_I\\).\n For diagonal input uncertainty, the elements of \\(G E_I G^{-1}\\) are directly related to the RGA: \\[ \\left[ G E_I G^{-1} \\right]_{ii} = \\sum_{j=1}^n \\lambda_{ij}(G) \\epsilon_j \\]\n Since diagonal input uncertainty is always present, we can conclude that if the plant has large RGA elements within in the frequency range where effect control is desired, then it is not possible to achieve good reference tracking with feedforward control because of strong sensitivity to diagonal input uncertainty. The reverse statement is not true.\nUncertainty and the Benefits of Feedback To illustrate the benefits of feedback control in reducing the sensitivity to uncertainty, we consider the effect of output uncertainty on reference tracking both for feedforward and feedback.\nFeedforward Let the nominal transfer function with feedforward control be \\(y = T_r r\\) where \\(T_r = G K_r\\) and \\(K_r = G^{-1}\\). With model error \\(T_r^\\prime = G^\\prime K_r\\) and the change in response is \\(y^\\prime - y = (T_r^\\prime - T_r) r = (G^\\prime - G)G^{-1} T_r r = E_O T_r r\\). Thus, the control error caused by the uncertainty is equal to the relative output uncertainty.\nFeedback control The output is \\(y = T r\\). The change in response is \\(y^\\prime - y = (T^\\prime - T)r = S^\\prime E_O T r = S^\\prime E_O y\\). With feedback control, the effect of the uncertainty is reduced by a factor \\(S^\\prime\\) compared to that with feedforward control.\nUncertainty and the Sensitivity Peak Consider a controller \\(K(s) = l(s)G^{-1}(s)\\) which results in a nominally decoupled response with sensitivity \\(S = s \\cdot I\\) and complementary sensitivity \\(T = t \\cdot I\\) where \\(t(s) = 1 - s(s)\\). Suppose the plant has diagonal input uncertainty of relative magnitude \\(\\abs{w_I(j\\w)}\\) in each input channel. Then there exists a combination of input uncertainties such that at each frequency: \\[ \\maxsv(S^\\prime) \\ge \\maxsv(S) \\left( 1 + \\frac{\\abs{w_I t}}{1+\\abs{w_I t}} \\|\\Lambda(G)\\|_{i\\infty} \\right) \\] where \\(\\| \\Lambda(G) \\|_{i\\infty}\\) is the maximum row sum of the RGA and \\(\\maxsv(S) = \\abs{s}\\).\nWe can see that with an inverse based controller, the worst case sensitivity will be much larger than the nominal sensitivity at frequencies where the plant has large RGA elements.\n These statements apply to the frequency range around crossover. By \u0026ldquo;small\u0026rdquo;, we mean smaller than 2 and by \u0026ldquo;large\u0026rdquo; we mean larger than 10.\n Condition number \\(\\gamma(G)\\) or \\(\\gamma(K)\\) small: robust performance to both diagonal and full-block input uncertainty Minimized condition number \\(\\gamma_I^* (G)\\) or \\(\\gamma_O^*(K)\\) small: robust performance to diagonal input uncertainty \\(\\text{RGA}(G)\\) has large elements: inverse based controller is not robust to diagonal input uncertainty. Since diagonal input uncertainty is unavoidable in practice, the rule is never to use a decoupling controller for a plant with large RGA-elements. Plant with large RGA elements are fundamentally difficult to control. Element-by-element Uncertainty Consider any complex matrix \\(G\\) and let \\(\\lambda_{ij}\\) denote the \\(ij\\)\u0026lsquo;th element in the RGA-matrix of \\(G\\).\n The matrix \\(G\\) becomes singular if we make a relative change \\(-1/\\lambda_{ij}\\) in its \\(ij\\)\u0026lsquo;th elements, that is, if a single element in \\(G\\) is perturbed from \\(g_{ij}\\) to \\(g_{pij} = g_{ij}(1-\\frac{1}{\\lambda_{ij}})\\)\n Thus, the RGA-matrix is a direct measure of sensitivity to element-by-element uncertainty and matrices with large RGA-values become singular for small relative errors in the elements.\nThe above result has important implications:\n Identification. Models of multivariable plants \\(G(s)\\) are often obtained by identifying one element at a time, for example using step responses. This simple analysis will most likely give meaningless results if there are large RGA-elements within the bandwidth where the model is intended to be used. RHP-zeros. Consider a plant with transfer function matrix \\(G(s)\\). If the relative uncertainty in an element at a given frequency is larger than \\(\\abs{1/\\lambda_{ij}(j\\w)}\\) then the plant may be singular at this frequency, implying that the uncertainty allows for a RHP-zero on the \\(j\\w\\text{-axis}\\). MIMO Input-Output Controllability The following procedure assumes that we have made a decision on the plant inputs and plant outputs, and we want to analyze the model \\(G\\) to find out what control performance can be expected. It can also be used to assist in control structure design.\nA typical MIMO controllability analysis may proceed as follows:\n Scale all variables (inputs \\(u\\), outputs \\(y\\), disturbances \\(d\\), references \\(r\\)) to obtain a scaled model \\(y = G(s) u + G_d(s) d\\), \\(r = R \\tilde{r}\\) Obtain a minimal realization Check functional controllability. To be able to control the outputs independently, we first need at least as many inputs \\(u\\) as outputs \\(y\\). Second, we need the rank of \\(G(s)\\) to be equal to the number of outputs \\(l\\), i.e. the minimum singular value \\(G(j\\w)\\), \\(\\minsv(G) = \\sigma_l(G)\\), should be non-zero (except at possible \\(j\\w\\text{-axis}\\) zeros). If the plant is not functionally controllable, then compute the output direction where the plant has no gain to have insight into the source of the problem Compute the poles. For RHP poles, obtain their locations and associated directions. \u0026ldquo;Fast\u0026rdquo; RHP-poles far from the origin are bad Compute the zeros. For RHP zeros, obtain their locations and associated directions. Look for zeros pinned into certain outputs. \u0026ldquo;Small\u0026rdquo; RHP-zeros (close to the origin) are bad if tight performance is needed at low frequencies Obtain the frequency response \\(G(j\\w)\\) and compute the RGA matrix \\(\\Gamma = G \\times (G^\\dagger)^{-1}\\). Plants with large RGA-elements at crossover frequencies are difficult to control and should be avoided Compute the singular values of \\(G(j\\w)\\) and plot them as a function of frequency. Also consider the associated input and output singular vectors The minimum singular value \\(\\minsv(G(j\\w))\\) is a particularly useful controllability measure. It should generally be as large as possible at frequencies where control is needed. If \\(\\minsv(G(j\\w)) \u0026lt; 1\\) then we cannot at frequency \\(\\w\\) make independent output changes of unit magnitude by using inputs of unit magnitude For disturbances, consider the elements of the matrix \\(G_d\\). At frequencies where one or more elements is larger than 1, we need control. We get more information by considering one disturbance at a time (the columns \\(g_d\\) of \\(G_d\\)). We must require for each disturbance that \\(S\\) is less than \\(1/\\normtwo{g_d}\\) in the disturbance direction \\(y_d\\), i.e. \\(\\normtwo{S y_d} \\le 1/\\normtwo{g_d}\\). Thus, we must at least require \\(\\minsv(S) \\le 1/\\normtwo{g_d}\\) and we may have to require \\(\\maxsv(S) \\le 1/\\normtwo{g_d}\\) Disturbances and input saturation: First step. Consider the input magnitudes needed for perfect control by computing the elements in the matrix \\(G^\\dagger G_d\\). If all elements are less than 1 at all frequencies, then input saturation is not expected to be a problem. If some elements of \\(G^\\dagger G_d\\) are larger than 1, then perfect control cannot be achieve at this frequency, but \u0026ldquo;acceptable\u0026rdquo; control may be possible Second step. Consider the elements of \\(U^H G_d\\) and make sure that the elements in the \\(i\\)\u0026lsquo;th row are smaller than \\(\\sigma_i(G) + 1\\) at all frequencies Are the requirements compatible? Look at disturbances, RHP-poles, RHP-zeros and their associated locations and directions. For example, we must required for each disturbance and each RHP-zero that \\(\\abs{y_z^H g_d(z)} \\le 1\\). Similar relations exist for combined RHP-zero and RHP-pole. Uncertainty. If the condition number \\(\\gamma(G)\\) is small then we expect no particular problems with uncertainty. If the RGA-elements are large, we expect strong sensitivity to uncertainty. Plant design changes If the plant is not input-output controllable, then it must be modified. Some possible modifications are:\n Controlled outputs. Identify the outputs which cannot be controlled satisfactory. Can the specifications for these be relaxed? Manipulated inputs. If input constraints are encountered, then consider replacing or moving actuators. If there are RHP-zeros which cause control problems, then the zeros may often be eliminated by adding another input. This may not be possible if the zero is pinned to a particular output Extra measurements. If the effect of disturbances or uncertainty is large, and the dynamics of the plant are such that acceptable control cannot be achieved, then consider adding \u0026ldquo;fast local loops\u0026rdquo; based on extra measurements which are located close to the inputs and disturbances Disturbances. If the effect of disturbances is too large, then see whether the disturbance itself may be reduced. This may involve adding extra equipment to dampen the disturbances. In other cases, this may involve improving or changing the control of another part of the system: we may have a disturbance which is actually the manipulated input for another part of the system Plant dynamics and time delays. In most cases, controllability is improved by making the plant dynamics faster and by reducing time delays. An exception to this is a strongly interactive plant, where an increased dynamic lag or time delay may be helpful if it somehow \u0026ldquo;delays\u0026rdquo; the effect of the interactions Conclusion We have found that most of the insights into the performance limitation of SISO systems carry over to MIMO systems. For RHP-zeros, RHP-poles and disturbances, the issue of directions usually makes the limitation less severe for MIMO than for SISO systems. However, the situation is usually the opposite with model uncertainty because for MIMO systems, there is also uncertainty associated with plant directionality.\nUncertainty and Robustness for SISO Systems \nIntroduction to Robustness A control system is robust if it is insensitive to differences between the actual system and the model of the system which was used to design the controller. The key idea in the \\(\\hinf\\) robust control paradigm is to check whether the design specifications are satisfied even for the \u0026ldquo;worst-case\u0026rdquo; uncertainty.\nOur approach is then as follows:\n Determine the uncertainty set. Find a mathematical representation of the model uncertainty Check Robust Stability (RS). Determine whether the system remains stable for all plants in the uncertainty set Check Robust Performance (RP). If RS is satisfied, determine whether the performance specifications are met for all plants in the uncertainty set This approach may not always achieve optimal performance. In particular, if the worst case plant rarely occurs, other approaches, such as optimizing some average performance or using adaptive control may yield better performance.\nTo account for model uncertainty, we will assume that the dynamic behavior of a plant is described not by a single linear time invariant model but by a set \\(\\Pi\\) of possible linear time invariant models, sometimes denoted the \u0026ldquo;uncertainty set\u0026quot;.\nWe adopt the following notation:\n \\(\\Pi\\) - a set of possible perturbed plant models \\(G(s) \\in \\Pi\\) - nominal plant model \\(G_p(s) \\in \\Pi\\) - particular perturbed plant models We will use a \u0026ldquo;norm-bounded uncertainty description\u0026rdquo; where the set \\(\\Pi\\) is generated by allowing \\(\\hinf\\) norm-bounded stable perturbations to the nominal plant \\(G(s)\\). We let \\(E\\) denote a perturbation which is not normalized, and let \\(\\Delta\\) denote a normalized perturbation with its \\(\\hinf\\) norm less than 1.\nRepresenting Uncertainty Uncertainty in the plant model may have several origins:\n There are always parameters in the linear model which are only known approximatively Parameters in the model may vary due to non-linearities or changes in the operating conditions Measurement devices have imperfections At high frequencies, even the structure and the model order is unknown, and the uncertainty will always exceed \\(\\SI{100}{\\percent}\\) at some frequency Even when a very detailed model is available, we may choose to work with a simpler nominal model and represent the neglected dynamics as \u0026ldquo;uncertainty\u0026rdquo; The controller implemented may differ from the one obtained by solving the synthesis problem. One may include uncertainty to allow for controller order reduction and implementation inaccuracies The various sources of model uncertainty may be grouped into two main classes:\n Parametric uncertainty. The structure of the model is known, but some parameters are uncertain Neglected and unmodelled dynamics uncertainty. The model is in error because of missing dynamics, usually at high frequencies Parametric uncertainty will be quantified by assuming that each uncertain parameters is bounded within some region \\([\\alpha_{\\min}, \\alpha_{\\text{max}}]\\). That is, we have parameter sets of the form\n\\begin{equation} \\alpha_p = \\bar{\\alpha}(1 + r_\\alpha \\Delta); \\quad r_\\alpha = \\frac{\\alpha_{\\text{max}} - \\alpha_{\\min}}{\\alpha_{\\text{max}} + \\alpha_{\\min}} \\end{equation}\nwhere \\(\\bar{\\alpha}\\) is the mean parameter value, \\(r_\\alpha\\) is the relative uncertainty in the parameter, and \\(\\Delta\\) is any real scalar satisfying \\(\\abs{\\Delta} \\le 1\\).\n Neglected and unmodelled dynamics uncertainty is somewhat less precise and thus more difficult to quantify, but it appears that frequency domain is particularly well suited for this class. This leads to complex perturbations which we normalize such that \\(\\hnorm{\\Delta} \\le 1\\).\nThere is also a third class of uncertainty (which is a combination of the other two) called Lumped uncertainty. Here the uncertainty description represents one or several sources of parametric and/or unmodelled dynamics uncertainty combined into a single lumped perturbation of a chosen structure. The frequency domain is also well suited for describing lumped uncertainty.\n In most cases, we prefer to lump the uncertainty into a multiplicative uncertainty of the form \\[ G_p(s) = G(s)(1 + w_I(s)\\Delta_I(s)); \\quad \\abs{\\Delta_I(j\\w)} \\le 1 , \\forall\\w \\] which may be represented by the diagram in Fig. fig:input_uncertainty_set.\n \n Figure 13: Plant with multiplicative uncertainty\n Parametric Uncertainty Parametric uncertainty may also be represented in the \\(\\hinf\\) framework if we restrict \\(\\Delta\\) to be real.\n \\[ G_p(s) = k_p G_0(s); \\quad k_{\\min} \\le k_p \\le k_{\\text{max}} \\] where \\(k_p\\) is an uncertain gain and \\(G_0(s)\\) is a transfer function with no uncertainty. By writing \\(k_p = \\bar{k}(1 + r_k \\Delta)\\) where \\(r_k\\) is the relative magnitude of the gain uncertainty and \\(\\bar{k}\\) is the average gain, be may write \\[ G_p = \\underbrace{\\bar{k}G_0(s)}_{G(s)} (1 + r_k \\Delta), \\quad \\abs{\\Delta} \\le 1 \\] where \\(\\Delta\\) is a real scalar and \\(G(s)\\) is the nominal plant.\n \\[ G_p(s) = \\frac{1}{\\tau_p s + 1}G_0(s); \\quad \\tau_{\\min} \\le \\tau_p \\le \\tau_{\\text{max}} \\] By writing \\(\\tau_p = \\bar{\\tau}(1 + r_\\tau \\Delta)\\), with \\(\\abs{\\Delta} \\le 1\\), the model set can be rewritten as \\[ G_p(s) = \\frac{G_0}{1+\\bar{\\tau} s + r_\\tau \\bar{\\tau} s \\Delta} = \\underbrace{\\frac{G_0}{1+\\bar{\\tau}s}}_{G(s)} \\frac{1}{1 + w_{iI}(s) \\Delta} \\] with \\(\\displaystyle w_{iI}(s) = \\frac{r_\\tau \\bar{\\tau} s}{1 + \\bar{\\tau} s}\\).\n As shown in the two examples, one can represent parametric uncertainty in the \\(\\hinf\\) framework. However, parametric uncertainty is often avoided for the following reasons:\n It usually requires a large effort to model parametric uncertainty A parametric uncertainty model is somewhat deceiving in the sense that it provides a very detailed and accurate description, even though the underlying assumptions about the model and the parameters may be much less exact The exact model structure is required and so unmodelled dynamics cannot be dealt with Real perturbations are required, which are more difficult to deal with mathematically and numerically, especially when it comes to controller synthesis Therefore, parametric uncertainty is often represented by complex perturbations. For example, we may simply replace the real perturbation, \\(-1 \\le \\Delta \\le 1\\) by a complex perturbation with \\(\\abs{\\Delta(j\\w)} \\le 1\\). This is of course conservative as it introduces possible plants that are not present in the original set. However, if there are several real perturbations, then the conservatism if often reduced by lumping these perturbations into a single complex perturbation.\nRepresenting Uncertainty in the Frequency Domain Uncertain Regions To illustrate how parametric uncertainty translate into frequency domain uncertainty, consider in Fig. fig:uncertainty_region the Nyquist plots generated by the following set of plants \\[ G_p(s) = \\frac{k}{\\tau s + 1} e^{-\\theta s}, \\quad 2 \\le k, \\theta, \\tau \\le 3 \\]\n Step 1. At each frequency, a region of complex numbers \\(G_p(j\\w)\\) is generated by varying the parameters. In general, these uncertain regions have complicated shapes and complex mathematical descriptions Step 2. We therefore approximate such complex regions as discs, resulting in a complex additive uncertainty description \n Figure 14: Uncertainty regions of the Nyquist plot at given frequencies\n Representing Uncertainty Regions by Complex Perturbations The disc-shaped regions may be generated by additive complex norm-bounded perturbations around a nominal plant \\(G\\)\n\\begin{equation} \\begin{aligned} \\Pi_A: \\ G_p(s) \u0026amp;= G(s) + w_A(s) \\Delta_A(s) \\\\\\\n\u0026amp; \\text{with }\\abs{\\Delta_A(j\\w)} \\le 1 , \\forall\\w \\end{aligned} \\end{equation}\nAt each frequency, all possible \\(\\Delta(j\\w)\\) \u0026ldquo;generates\u0026rdquo; a disc-shaped region with radius 1 centered at 0, so \\(G(j\\w) + w_A(j\\w)\\Delta_A(j\\w)\\) generates at each frequency a disc-shapes region of radius \\(\\abs{w_A(j\\w)}\\) centered at \\(G(j\\w)\\) as shown in Fig. fig:uncertainty_disc_generated.\n \n Figure 15: Disc-shaped uncertainty regions generated by complex additive uncertainty\n The disc-shaped region may alternatively be represented by a multiplicative uncertainty\n\\begin{equation} \\begin{aligned} \\Pi_I: \\ G_p(s) \u0026amp;= G(s)(1 + w_I(s)\\Delta_I(s)); \\\\\\\n\u0026amp; \\text{with }\\abs{\\Delta_I(j\\w)} \\le 1 , \\forall\\w \\end{aligned} \\end{equation}\n And we see that for SISO systems, additive and multiplicative uncertainty are equivalent if at each frequency: \\[ \\abs{w_I(j\\w)} = \\abs{w_A(j\\w)}/\\abs{G(j\\w)} \\]\nHowever, multiplicative weights are often preferred because their numerical value is more informative. At frequencies where \\(\\abs{w_I(j\\w)} \u0026gt; 1\\) the uncertainty exceeds \\(\\SI{100}{\\percent}\\) and the Nyquist curve may pass through the origin. Then, at these frequencies, we do not know the phase of the plant, and we allow for zeros crossing from the left to the right-half plane. Tight control is then not possible at frequencies where \\(\\abs{w_I(j\\w)} \\ge 1\\).\nObtaining the Weight for Complex Uncertainty Consider a set \\(\\Pi\\) of possible plants resulting, for example, from parametric uncertainty. We now want to describe this set of plants by a single complex perturbation \\(\\Delta_A\\) or \\(\\Delta_I\\).\nThis complex disc-shaped uncertainty description may be generated as follows:\n Select a nominal \\(G(s)\\) Additive uncertainty. At each frequency, find the smallest radius \\(l_A(\\w)\\) which includes all the possible plants \\(\\Pi\\) \\[ l_A(\\w) = \\max_{G_p\\in\\Pi} \\abs{G_p(j\\w) - G(j\\w)} \\] If we want a rational transfer function weight, \\(w_A(s)\\), then it must be chosen to cover the set, so \\[ \\abs{w_A(j\\w)} \\ge l_A(\\w) \\quad \\forall\\w \\] Usually \\(w_A(s)\\) is of low order to simplify the controller design. Multiplicative uncertainty. This is often the preferred uncertainty form, and we have \\[ l_I(\\w) = \\max_{G_p\\in\\Pi} \\abs{\\frac{G_p(j\\w) - G(j\\w)}{G(j\\w)}} \\] and with a rational weight \\(\\abs{w_I(j\\w)} \\ge l_I(\\w), , \\forall\\w\\) We want to represent the following set using multiplicative uncertainty with a rational weight \\(w_I(s)\\) \\[ \\Pi: \\quad G_p(s) = \\frac{k}{\\tau s + 1} e^{-\\theta s}, \\quad 2 \\le k, \\theta, \\tau \\le 3 \\] To simplify subsequent controller design, we select a delay-free nominal model \\[ G(s) = \\frac{\\bar{k}}{\\bar{\\tau} s + 1} = \\frac{2.5}{2.5 s + 1} \\]\nTo obtain \\(l_I(\\w)\\), we consider three values (2, 2.5 and 3) for each of the three parameters (\\(k, \\theta, \\tau\\)). The corresponding relative errors \\(\\abs{\\frac{G_p-G}{G}}\\) are shown as functions of frequency for the \\(3^3 = 27\\) resulting \\(G_p\\) (Fig. fig:uncertainty_weight). To derive \\(w_I(s)\\), we then try to find a simple weight so that \\(\\abs{w_I(j\\w)}\\) lies above all the dotted lines.\n \n Figure 16: Relative error for 27 combinations of \\(k,\\ \\tau\\) and \\(\\theta\\). Solid and dashed lines: two weights \\(\\abs{w_I}\\)\n Choice of Nominal Model With parametric uncertainty represented as complex perturbations, there are three main options for the choice of nominal model:\n A simplified model, for instance a low order, delay free model. It usually yields the largest uncertainty region, but the model is simple and this facilitates controller design in later stages. A model of mean parameter values, \\(G(s) = \\bar{G}(s)\\). It is probably the most straightforward choice. The central plant obtained from a Nyquist plot. It yields the smallest region, but in this case a significant effort may be required to obtain the nominal model which is usually not a rational transfer function. For SISO systems, we find that for plants with an uncertain time delay, it is simplest and sometimes best to use a delay-free nominal model, and to represent the nominal delay as additional uncertainty.\nIf we use a parametric uncertainty description, based on multiple real perturbations, then we should always use the mean parameter values in the nominal model.\nNeglected Dynamics Represented as Uncertainty We saw that one advantage of frequency domain uncertainty description is that one can choose to work with a simple nominal model, and represent neglected dynamics as uncertainty.\nConsider a set of plants \\[ G_p(s) = G_0(s) f(s) \\] where \\(G_0(s)\\) is fixed. We want to neglect the term \\(f(s) \\in \\Pi_f\\), and represent \\(G_p\\) by multiplicative uncertainty with a nominal model \\(G = G_0\\).\nThe magnitude of the relative uncertainty caused by neglecting the dynamics in \\(f(s)\\) is \\[ l_I(\\w) = \\max_{G_p} \\abs{\\frac{G_p - G}{G}} = \\max_{f(s) \\in \\Pi_f} \\abs{f(j\\w) - 1} \\]\nNeglected delay Let \\(f(s) = e^{-\\theta_p s}\\), where \\(0 \\le \\theta_p \\le \\theta_{\\text{max}}\\). We want to represent \\(G_p(s) = G_0(s)e^{-\\theta_p s}\\) by a delay-free plant \\(G_0(s)\\) and multiplicative uncertainty. Let first consider the maximum delay, for which the relative error \\(\\abs{1 - e^{-j \\w \\theta_{\\text{max}}}}\\) is shown as a function of frequency (Fig. fig:neglected_time_delay). If we consider all \\(\\theta \\in [0, \\theta_{\\text{max}}]\\) then: \\[ l_I(\\w) = \\begin{cases} \\abs{1 - e^{-j\\w\\theta_{\\text{max}}}} \u0026amp; \\w \u0026lt; \\pi/\\theta_{\\text{max}} \\ 2 \u0026amp; \\w \\ge \\pi/\\theta_{\\text{max}} \\end{cases} \\]\n\n Figure 17: Neglected time delay\n Neglected lag Let \\(f(s) = 1/(\\tau_p s + 1)\\), where \\(0 \\le \\tau_p \\le \\tau_{\\text{max}}\\). In this case the resulting \\(l_I(\\w)\\) (Fig. fig:neglected_first_order_lag) can be represented by a rational transfer function with \\(\\abs{w_I(j\\w)} = l_I(\\w)\\) where \\[ w_I(s) = \\frac{\\tau_{\\text{max}} s}{\\tau_{\\text{max}} s + 1} \\]\n\n Figure 18: Neglected first-order lag uncertainty\n Multiplicative weight for gain and delay uncertainty Consider the following set of plants \\[ G_p = k_p e^{-\\theta_p s} G_0(s); \\quad k_p \\in [k_{\\min}, k_{\\text{max}}], \\ \\theta_p \\in [\\theta_{\\min}, \\theta_{\\text{max}}] \\] which we want to represent by multiplicative uncertainty and a delay-free nominal model \\(G(s) = \\bar{k} G_0(s)\\). There is an exact expression, its first order approximation is \\[ w_I(s) = \\frac{(1+\\frac{r_k}{2})\\theta_{\\text{max}} s + r_k}{\\frac{\\theta_{\\text{max}}}{2} s + 1} \\] However, as shown in Fig. fig:lag_delay_uncertainty, the weight \\(w_I\\) is optimistic, especially around frequencies \\(1/\\theta_{\\text{max}}\\). To make sure that \\(\\abs{w_I(j\\w)} \\le l_I(\\w)\\), we can apply a correction factor: \\[ w_I^\\prime(s) = w_I \\cdot \\frac{(\\frac{\\theta_{\\text{max}}}{2.363})^2 s^2 + 2\\cdot 0.838 \\cdot \\frac{\\theta_{\\text{max}}}{2.363} s + 1}{(\\frac{\\theta_{\\text{max}}}{2.363})^2 s^2 + 2\\cdot 0.685 \\cdot \\frac{\\theta_{\\text{max}}}{2.363} s + 1} \\]\nIt is suggested to start with the simple weight and then if needed, to try the higher order weight.\n\n Figure 19: Multiplicative weight for gain and delay uncertainty\n Unmodelled Dynamics Uncertainty The most important reason for using frequency domain (\\(\\hinf\\)) uncertainty description and complex perturbations, is the incorporation of unmodelled dynamics. Unmodelled dynamics, while being close to neglected dynamics, also include unknown dynamics of unknown or even infinite order.\n To represent unmodelled dynamics, we usually use a simple multiplicative weight of the form\n\\begin{equation} w_I(s) = \\frac{\\tau s + r_0}{(\\tau/r_\\infty) s + 1} \\end{equation}\nwhere \\(r_0\\) is the relative uncertainty at steady-state, \\(1/\\tau\\) is the frequency at which the relative uncertainty reaches \\(\\SI{100}{\\percent}\\), and \\(r_\\infty\\) is the magnitude of the weight at high frequency.\n SISO Robust Stability RS with Multiplicative Uncertainty We want to determine the stability of the uncertain feedback system in Fig. fig:feedback_multiplicative_uncertainty where there is multiplicative uncertainty of magnitude \\(\\abs{w_I(j\\w)}\\). The loop transfer function becomes \\[ L_P = G_p K = G K (1 + w_I \\Delta_I) = L + w_I L \\Delta_I \\] We assume (by design) the stability of the nominal closed-loop system (with \\(\\Delta_I = 0\\)). We use the Nyquist stability condition to test for robust stability of the closed loop system:\n\\begin{align*} \\text{RS} \\quad \u0026amp;\\stackrel{\\text{def}}{\\Longleftrightarrow} \\quad \\text{System stable} \\ \\forall L_p \\\\\\\n\u0026amp;\\Longleftrightarrow \\quad L_p \\ \\text{should not encircle -1}, \\ \\forall L_p \\end{align*}\n\n Figure 20: Feedback system with multiplicative uncertainty\n Graphical derivation of RS-condition Consider the Nyquist plot of \\(L_p\\) as shown in Fig. fig:nyquist_uncertainty. \\(\\abs{1+L}\\) is the distance from the point \\(-1\\) to the center of the disc representing \\(L_p\\) and \\(\\abs{w_I L}\\) is the radius of the disc. Encirclements are avoided if none of the discs cover \\(-1\\), and we get:\n\\begin{align*} \\text{RS} \\quad \u0026amp;\\Leftrightarrow \\quad \\abs{w_I L} \u0026lt; \\abs{1 + L}, \\ \\forall\\w \\\\\\\n\u0026amp;\\Leftrightarrow \\quad \\abs{\\frac{w_I L}{1 + L}} \u0026lt; 1, \\ \\forall\\w \\\\\\\n\u0026amp;\\Leftrightarrow \\quad \\abs{w_I T} \u0026lt; 1, \\ \\forall\\w \\\\\\\n\\end{align*}\n\n Figure 21: Nyquist plot of \\(L_p\\) for robust stability\n The requirement of robust stability for the case with multiplicative uncertainty gives an upper bound on the complementary sensitivity\n\\begin{equation} \\text{RS} \\quad \\Leftrightarrow \\quad \\abs{T} \u0026lt; 1/\\abs{w_I}, \\ \\forall\\w \\end{equation}\n We see that we have to make \\(T\\) small at frequencies where the relative uncertainty \\(\\abs{w_I}\\) exceeds 1 in magnitude.\nAlgebraic derivation of RS-condition Since \\(L_p\\) is assumed stable, and the nominal closed-loop is stable, the nominal loop transfer function \\(L(j\\w)\\) does not encircle -1. Therefore, since the set of plants is norm-bounded, it then follows that if some \\(L_{p1}\\) in the uncertainty set encircles -1, then there must be another \\(L_{p2}\\) in the uncertainty set which goes exactly through -1 at some frequency. Thus\n\\begin{align*} \\text{RS} \\quad \u0026amp; \\Leftrightarrow \\abs{1 + L_p} \\ne 0,\\ \\forall L_p,,\\forall \\w\\\\\\\n\u0026amp; \\Leftrightarrow \\abs{1 + L_p} \u0026gt; 0,\\ \\forall L_p,,\\forall \\w\\\\\\\n\u0026amp; \\Leftrightarrow \\abs{1 + L + w_I L \\Delta_I} \u0026gt; 0,\\ \\forall \\abs{\\Delta_I} \\le 1,,\\forall \\w\\\\\\\n\\end{align*}\nAt each frequency, the last condition is most easily violated when the complex number \\(\\Delta_I(j\\w)\\) is selected with \\(\\abs{\\Delta(j\\w)} = 1\\) and with phase such that \\(1+L\\) and \\(w_I L \\Delta_I\\) point in the opposite direction. Thus \\[ \\text{RS} \\ \\Leftrightarrow \\ \\abs{1 + L} - \\abs{w_I L} \u0026gt; 0, \\ \\forall\\w \\ \\Leftrightarrow \\ \\abs{w_I T} \u0026lt; 1, \\ \\forall\\w \\] And we obtain the same condition as before.\nRS with Inverse Multiplicative Uncertainty We will derive a corresponding RS-condition for feedback system with inverse multiplicative uncertainty (Fig. fig:inverse_uncertainty_set) in which \\[ G_p = G(1 + w_{iI}(s) \\Delta_{iI})^{-1} \\]\n\n Figure 22: Feedback system with inverse multiplicative uncertainty\n We assume that \\(L_p\\) and the nominal closed-loop systems are stable. Robust stability is guaranteed if \\(L_p(j\\w)\\) does not encircles the point -1:\n\\begin{align*} \\text{RS} \\quad \u0026amp;\\Leftrightarrow \\quad \\abs{1 + L_p} \u0026gt; 0, \\ \\forall L_p, , \\forall\\w\\\\\\\n\u0026amp;\\Leftrightarrow \\quad \\abs{1 + L (1 + w_{iI} \\Delta_{iI})^{-1}} \u0026gt; 0, \\ \\forall \\abs{\\Delta_{iI}} \u0026lt; 1, , \\forall\\w\\\\\\\n\u0026amp;\\Leftrightarrow \\quad \\abs{1 + w_{iI} \\Delta_{iI} + L} \u0026gt; 0, \\ \\forall \\abs{\\Delta_{iI}} \u0026lt; 1, , \\forall\\w\\\\\\\n\u0026amp;\\Leftrightarrow \\quad \\abs{1 + L} - \\abs{w_{iI} \\Delta_{iI}} \u0026gt; 0, \\ \\forall\\w\\\\\\\n\u0026amp;\\Leftrightarrow \\quad \\abs{w_{iI} S} \u0026lt; 1, \\ \\forall\\w\\\\\\\n\\end{align*}\n The requirement for robust stability for the case with inverse multiplicative uncertainty gives an upper bound on the sensitivity\n\\begin{equation} \\text{RS} \\quad \\Leftrightarrow \\quad \\abs{S} \u0026lt; 1/\\abs{w_{iI}}, \\ \\forall\\w \\end{equation}\nWe see that we need tight control and have to make \\(S\\) small at frequencies where the uncertainty is large and \\(w_{iI}\\) exceeds 1 in magnitude.\n The reason is that the uncertainty represents pole uncertainty, and at frequencies where \\(\\abs{w_{iI}}\\) exceeds 1, we allow for poles crossing from the left to the right-half plant, and we then need feedback (\\(\\abs{S} \u0026lt; 1\\)) in order to stabilize the system.\nSISO Robust Performance SISO Nominal Performance The condition for nominal performance when considering performance in terms of the weighted sensitivity function is\n\\begin{equation} \\begin{aligned} \\text{NP} \u0026amp;\\Leftrightarrow \\abs{w_P S} \u0026lt; 1 \\ \\forall\\omega \\\\\\\n\u0026amp;\\Leftrightarrow \\abs{w_P} \u0026lt; \\abs{1 + L} \\ \\forall\\omega \\end{aligned} \\end{equation}\n Now \\(\\abs{1 + L}\\) represents at each frequency the distance of \\(L(j\\omega)\\) from the point \\(-1\\) in the Nyquist plot, so \\(L(j\\omega)\\) must be at least a distance of \\(\\abs{w_P(j\\omega)}\\) from \\(-1\\). This is illustrated graphically in Fig. fig:nyquist_performance_condition.\n\n Figure 23: Nyquist plot illustration of the nominal performance condition \\(\\abs{w_P} \u0026lt; \\abs{1 + L}\\)\n Robust Performance For robust performance, we require the performance condition to be satisfied for all possible plants:\n\\begin{equation} \\begin{aligned} \\text{RP}\\ \u0026amp;\\overset{\\text{def}}{\\Leftrightarrow}\\ \\abs{w_P S} \u0026lt; 1 \\quad \\forall S_p, \\forall \\omega\\\\\\\n\\ \u0026amp;\\Leftrightarrow\\ \\abs{w_P} \u0026lt; \\abs{1 + L_p} \\quad \\forall L_p, \\forall \\omega \\end{aligned} \\end{equation}\n Let\u0026rsquo;s consider the case of multiplicative uncertainty as shown on Fig. fig:input_uncertainty_set_feedback_weight_bis. The robust performance corresponds to requiring \\(\\abs{\\hat{y}/d}\u0026lt;1\\ \\forall \\Delta_I\\) and the set of possible loop transfer functions is \\[ L_p = G_p K = L (1 + w_I \\Delta_I) = L + w_I L \\Delta_I \\]\n\n Figure 24: Diagram for robust performance with multiplicative uncertainty\n Graphical derivation of RP-condition As illustrated on Fig. fig:nyquist_performance_condition, we must required that all possible \\(L_p(j\\omega)\\) stay outside a disk of radius \\(\\abs{w_P(j\\omega)}\\) centered on \\(-1\\). Since \\(L_p\\) at each frequency stays within a disk of radius \\(|w_I(j\\omega) L(j\\omega)|\\) centered on \\(L(j\\omega)\\), the condition for RP becomes:\n\\begin{align*} \\text{RP}\\ \u0026amp;\\Leftrightarrow\\ \\abs{w_P} + \\abs{w_I L} \u0026lt; \\abs{1+L} \\quad \\forall\\omega\\\\\\\n\u0026amp;\\Leftrightarrow\\ \\abs{w_P(1 + L)^{-1}} + \\abs{w_I L(1 + L)^{-1}} \u0026lt; 1 \\quad \\forall\\omega\\\\\\\n\\end{align*}\n Finally, we obtain the following condition for Robust Performance:\n\\begin{equation} \\text{RP} \\ \\Leftrightarrow\\ \\max_{\\omega} \\left(\\abs{w_P S} + \\abs{w_I T} \\right) \u0026lt; 1 \\end{equation}\n Algebraic derivation of RP-condition RP is satisfied if the worst-case weighted sensitivity at each frequency is less than \\(1\\): \\[ \\text{RP} \\ \\Leftrightarrow\\ \\max_{S_p} \\abs{w_P S_p} \u0026lt; 1, \\quad \\forall\\omega \\]\nThe perturbed sensitivity \\(S_p\\) is \\[ S_p = \\frac{1}{1 + L_p} = \\frac{1}{1 + L + w_I L \\Delta_I} \\] Thus: \\[ \\max_{S_p} \\abs{w_P S_p} = \\frac{\\abs{w_P}}{\\abs{1 + L} - \\abs{w_I L}} = \\frac{\\abs{w_P S}}{1 - \\abs{w_I T}} \\] And we obtain the same RP-condition as the graphically derived one.\nRemarks on RP-condition The RP-condition for this problem is closely approximated by the mixed sensitivity \\(\\hinf\\) condition: \\[ \\tcmbox{\\hnorm{\\begin{matrix}w_P S \\ w_I T\\end{matrix}} = \\max_{\\omega} \\sqrt{\\abs{w_P S}^2 + \\abs{w_I T}^2} \u0026lt;1} \\] This condition is within a factor at most \\(\\sqrt{2}\\) of the true RP-condition. This means that for SISO systems, we can closely approximate the RP-condition in terms of an \\(\\hinf\\) problem, so there is no need to make use of the structured singular value. However, we will see that the situation can be very different for MIMO systems.\n The RP-condition can be used to derive bounds on the loop shape \\(\\abs{L}\\):\n\\begin{align*} \\abs{L} \u0026amp;\u0026gt; \\frac{1 + \\abs{w_P}}{1 - \\abs{w_I}}, \\text{ at frequencies where } \\abs{w_I} \u0026lt; 1\\\\\\\n\\abs{L} \u0026amp;\u0026lt; \\frac{1 - \\abs{w_P}}{1 + \\abs{w_I}}, \\text{ at frequencies where } \\abs{w_P} \u0026lt; 1\\\\\\\n\\end{align*}\n The Relationship Between NP, RS and RP Consider a SISO system with multiplicative input uncertainty, and assume that the closed-loop is nominally stable (NS). The conditions for nominal performance (NP), robust stability (RS) and robust performance (RP) as summarized as follows:\n \\begin{subequations} \\begin{align} \\text{NP} \u0026amp; \\Leftrightarrow |w_P S| \u0026lt; 1,\\ \\forall \\omega \\\\\\\n\\text{RS} \u0026amp; \\Leftrightarrow |w_I T| \u0026lt; 1,\\ \\forall \\omega \\\\\\\n\\text{RP} \u0026amp; \\Leftrightarrow |w_P S| + |w_I T| \u0026lt; 1,\\ \\forall \\omega \\end{align} \\end{subequations}\n From this we see that a prerequisite for RP is that we satisfy both NP and RS. This applies in general, both for SISO and MIMO systems and for any uncertainty.\nIn addition, for SISO systems, if we satisfy both RS and NP, then we have at each frequency: \\[ |w_P S| + |w_I T| \u0026lt; 2 \\cdot \\max \\{|w_P S|, |w_I T|\\} \u0026lt; 2 \\] It then follows that, within a factor at most 2, we will automatically get RP when NP and RS are satisfied. This, RP is not a \u0026ldquo;big issue\u0026rdquo; for SISO systems.\nTo satisfy RS we generally want \\(T\\) small, whereas to satisfy \\(NP\\) we generally want \\(S\\) small. However, we cannot make both \\(S\\) and \\(T\\) small at the same frequency because of the identity \\(S + T = 1\\). This has implications for RP:\n\\begin{align*} |w_P S| + |w_I T| \u0026amp;\\ge \\text{min}\\{|w_P|, |w_I|\\}(|S| + |T|) \\\\\\\n\u0026amp;\\ge \\text{min}\\{|w_P|, |w_I|\\}(|S + T|) \\\\\\\n\u0026amp;\\ge \\text{min}\\{|w_P|, |w_I|\\} \\end{align*}\nThis means that we cannot have both \\(|w_P|\u0026gt;1\\) (i.e. good performance) and \\(|w_I|\u0026gt;1\\) (i.e. more than \\(\\si{100}{%}\\) uncertainty) at the same frequency.\nExamples of Parametric Uncertainty Parametric Pole Uncertainty Consider the following set of plants: \\[ G_p(s) = \\frac{1}{s - a_p} G_0(s); \\quad a_\\text{min} \\le a_p \\le a_{\\text{max}} \\]\nIf \\(a_\\text{min}\\) and \\(a_\\text{max}\\) have different signs, then this means that the plant can change from stable to unstable with the pole crossing through the origin.\nThis set of plants can be written as \\[ G_p(s) = \\frac{G_0(s)}{s - \\bar{a}(1 + r_a \\Delta)}; \\quad -1 \\le \\Delta \\le 1 \\] which can be exactly described by inverse multiplicative uncertainty: \\[ G(s) = \\frac{G_0(s)}{(s - \\bar{a})}; \\quad w_{iI}(s) = \\frac{r_a \\bar{a}}{s - \\bar{a}} \\]\nThe magnitude of \\(w_{iI}(s)\\) is equal to \\(r_a\\) at low frequency and goes to \\(0\\) at high frequencies.\nTime constant form It is also interesting to consider another form of pole uncertainty, namely that associated with the time constant: \\[ G_p(s) = \\frac{1}{\\tau_p s + 1} G_0(s); \\quad \\tau_\\text{min} \\le \\tau_p \\le \\tau_\\text{max} \\]\nThe corresponding uncertainty weight is \\[ w_{iI}(s) = \\frac{r_\\tau \\bar{\\tau} s}{1 + \\bar{\\tau} s} \\]\nThis results in uncertainty in the pole location, but here the uncertainty affects the model at high frequency.\nParametric Zero Uncertainty Consider zero uncertainty in the \u0026ldquo;time constant\u0026rdquo; form as in: \\[ G_p(s) = (1 + \\tau_p s)G_0(s); \\quad \\tau_\\text{min} \\le \\tau_p \\le \\tau_\\text{max} \\]\nThis set of plants may be written as multiplicative uncertainty with: \\[ w_I(s) = \\frac{r_\\tau \\bar{\\tau} s}{1 + \\bar{\\tau} s} \\] The magnitude \\(|w_I(j\\omega)|\\) is small at low frequencies and approaches \\(r_\\tau\\) at high frequencies. For cases with \\(r_\\tau \u0026gt; 1\\) we allow the zero to cross from the LHP to the RHP.\nParametric State-Space Uncertainty A general procedure for handling parametric uncertainty which is more suited for numerical calculations, is parametric state-space uncertainty. Consider an uncertain state-space model:\n\\begin{align*} \\dot{x} \u0026amp;= A_p x + B_p u \\\\\\\ny \u0026amp;= C_p x + D_p u \\end{align*}\nAssume that the underlying cause for the uncertainty is uncertainty in some real parameters \\(\\delta_1, \\delta_2, \\dots\\) and assume that the state space matrices depends linearly on these parameters:\n\\begin{align*} A_p = A + \\sum \\delta_i A_i; \\quad \u0026amp; B_p = B + \\sum \\delta_i B_i \\\\\\\nC_p = C + \\sum \\delta_i C_i; \\quad \u0026amp; D_p = D + \\sum \\delta_i D_i \\end{align*}\nwhere \\(A\\), \\(B\\), \\(C\\) and \\(D\\) model the nominal system.\nWe can collect the perturbations \\(\\delta_i\\) in a large diagonal matrix \\(\\Delta\\) with the real \\(\\delta_i\\)\u0026lsquo;s along its diagonal: \\[ A_p = A + \\sum \\delta_i A_i = A + W_2 \\Delta W_1 \\]\nIn the transfer function form:\n\\begin{align*} (s I - A_p)^{-1} \u0026amp;= (sI - A - W_2 \\Delta W_1)^{-1} \\\\\\\n\u0026amp;= (I - \\Phi(s) W_2 \\Delta W_1)^{-1} \\Phi(s) \\end{align*}\nwith \\(\\Phi(s) \\triangleq (sI - A)^{-1}\\).\nThis is illustrated in the block diagram of Fig. fig:uncertainty_state_a_matrix, which is in the form of an inverse additive perturbation.\n\n Figure 25: Uncertainty in state space A-matrix\n Conclusion Model uncertainty for SISO systems can be represented in the frequency domain using complex norm-bounded perturbations \\(\\hnorm{\\Delta} \\le 1\\).\nRequirements of robust stability for the case of multiplicative complex uncertainty imposes an upper bound on the allowed complementary sensitivity, \\(\\abs{w_I T} \u0026lt; 1, \\ \\forall\\w\\).\nSimilarly, the inverse multiplicative uncertainty imposes an upper bound on the sensitivity, \\(\\abs{w_{iI} S} \u0026lt; 1, \\ \\forall\\w\\).\nWe also derived a condition for robust performance with multiplicative uncertainty, \\(\\abs{w_P S} + \\abs{w_I T} \u0026lt; 1, \\ \\forall\\w\\).\nRobust Stability and Performance Analysis \nGeneral Control Configuration with Uncertainty The starting point for our robustness analysis is a system representation in which the uncertain perturbations are \u0026ldquo;pulled out\u0026rdquo; into a block diagonal matrix \\[ \\Delta = \\text{diag} \\{\\Delta_i\\} = \\begin{bmatrix}\\Delta_1 \\ \u0026amp; \\ddots \\ \u0026amp; \u0026amp; \\Delta_i \\ \u0026amp; \u0026amp; \u0026amp; \\ddots \\end{bmatrix} \\] where each \\(\\Delta_i\\) represents a specific source of uncertainty, e.g. input uncertainty \\(\\Delta_I\\) or parametric uncertainty \\(\\delta_i\\).\nIf we also pull out the controller \\(K\\), we get the generalized plant \\(P\\) as shown in Fig. fig:general_control_delta. This form is useful for controller synthesis.\n\n Figure 26: General control configuration used for controller synthesis\n If the controller is given and we want to analyze the uncertain system, we use the \\(N\\Delta\\text{-structure}\\) in Fig. fig:general_control_Ndelta.\n\n Figure 27: \\(N\\Delta\\text{-structure}\\) for robust performance analysis\n \\(N\\) is related to \\(P\\) and \\(K\\) by a lower LFT\n\\begin{align*} N \u0026amp;= F_l(P, K) \\\\\\\n\u0026amp;\\triangleq P_{11} + P_{12} K (I - P_{22}K)^{-1} P_{21} \\end{align*}\nSimilarly, the uncertain closed-loop transfer function from \\(w\\) to \\(z\\), is related to \\(N\\) and \\(\\Delta\\) by an upper LFT\n\\begin{align*} F \u0026amp;= F_u(N, \\Delta) \\\\\\\n\u0026amp;\\triangleq N_{22} + N_{21} \\Delta (I - N_{11} \\Delta)^{-1} N_{12} \\end{align*}\nTo analyze robust stability of \\(F\\), we can rearrange the system into the \\(M\\Delta\\text{-structure}\\) shown in Fig. fig:general_control_Mdelta_bis where \\(M = N_{11}\\) is the transfer function from the output to the input of the perturbations.\n\n Figure 28: \\(M\\Delta\\text{-structure}\\) for robust stability analysis\n Representing Uncertainty Each individual perturbation is assumed to be stable and normalized: \\[ \\maxsv(\\Delta_i(j\\w)) \\le 1 \\quad \\forall\\w \\]\nAs the maximum singular value of a block diagonal matrix is equal to the largest of the maximum singular values of the individual blocks, it then follows for \\(\\Delta = \\text{diag}\\{\\Delta_i\\}\\) that \\[ \\maxsv(\\Delta_i(j\\w)) \\le 1 \\quad \\forall\\w, \\forall i \\quad \\Leftrightarrow \\quad \\tcmbox{\\hnorm{\\Delta} \\le 1} \\]\nDifferences Between SISO and MIMO Systems The main difference between SISO and MIMO systems is the concept of directions which is only relevant in the latter. As a consequence, MIMO systems may experience much larger sensitivity to uncertainty than SISO systems.\nParametric Uncertainty The representation of parametric uncertainty for MIMO systems is the same as for SISO systems. However, the inclusion of parametric uncertainty may be more significant for MIMO plants because it offers a simple method of representing uncertain transfer function elements.\nUnstructured Uncertainty Unstructured perturbations are often used to get a simple uncertainty model. We here define unstructured uncertainty as the use of a \u0026ldquo;full\u0026rdquo; complex perturbation matrix \\(\\Delta\\), usually with dimensions compatible with those of the plant, where at each frequency any \\(\\Delta(j\\w)\\) satisfying \\(\\maxsv(\\Delta(j\\w)) \u0026lt; 1\\) is allowed.\nThree common forms of feedforward unstructured uncertainty are shown Fig. fig:feedforward_uncertainty: additive uncertainty, multiplicative input uncertainty and multiplicative output uncertainty.\n \\begin{alignat*}{3} \u0026amp;\\Pi_A: \\quad \u0026amp;\u0026amp;G_p = G + E_A; \\quad\u0026amp; \u0026amp;E_a = w_A \\Delta_a \\\\\\\n\u0026amp;\\Pi_I: \\quad \u0026amp;\u0026amp;G_p = G(I + E_I); \\quad\u0026amp; \u0026amp;E_I = w_I \\Delta_I \\\\\\\n\u0026amp;\\Pi_O: \\quad \u0026amp;\u0026amp;G_p = (I + E_O)G; \\quad\u0026amp; \u0026amp;E_O = w_O \\Delta_O \\end{alignat*}\n \nTable 4: Common feedforward unstructured uncertainty Additive uncertainty Multiplicative input uncertainty Multiplicative output uncertainty In Fig. fig:feedback_uncertainty, three feedback or inverse unstructured uncertainty forms are shown: inverse additive uncertainty, inverse multiplicative input uncertainty and inverse multiplicative output uncertainty.\n \\begin{alignat*}{3} \u0026amp;\\Pi_{iA}: \\quad \u0026amp;\u0026amp;G_p = G(I - E_{iA} G)^{-1}; \u0026amp; \u0026amp; \\quad E_{ia} = w_{iA} \\Delta_{ia} \\\\\\\n\u0026amp;\\Pi_{iI}: \\quad \u0026amp;\u0026amp;G_p = G(I - E_{iI})^{-1}; \u0026amp; \u0026amp; \\quad E_{iI} = w_{iI} \\Delta_{iI} \\\\\\\n\u0026amp;\\Pi_{iO}: \\quad \u0026amp;\u0026amp;G_p = (I - E_{iO})^{-1}G; \u0026amp; \u0026amp; \\quad E_{iO} = w_{iO} \\Delta_{iO} \\end{alignat*}\n \nTable 5: Common feedback unstructured uncertainty Inverse additive uncertainty Inverse multiplicative input uncertainty Inverse multiplicative output uncertainty Lumping uncertainty into a single perturbation For SISO systems, we usually lump multiple sources of uncertainty into a single complex perturbation; often in the multiplicative form. This may be also done for MIMO systems, but then it makes a difference whether the perturbation is at the input or the output.\nSince output uncertainty is frequently less restrictive than input uncertainty in terms of control performance, we first attempt to lump the uncertainty at the output. For example, a set of plant \\(\\Pi\\) may be represented by multiplicative output uncertainty with a scalar weight \\(w_O(s)\\) using \\[ G_p = (I + w_O \\Delta_O) G, \\quad \\hnorm{\\Delta_O} \\le 1 \\] where \\[ l_O(\\w) = \\max_{G_p \\in \\Pi} \\maxsv\\left( (G_p - G)G^{-1} \\right); \\ \\abs{w_O(j\\w)} \\ge l_O(\\w), , \\forall\\w \\]\nIf the resulting uncertainty weight is reasonable and the analysis shows that robust stability and performance may be achieve, then this lumping of uncertainty at the output is fine. If this is not the case, then one may try to lump the uncertainty at the input instead, using multiplicative input uncertainty with a scalar weight, \\[ G_p = G(I + w_I \\Delta_I), \\quad \\hnorm{\\Delta_I} \\le 1 \\] where \\[ l_I(\\w) = \\max_{G_p \\in \\Pi} \\maxsv\\left( G^{-1}(G_p - G) \\right); \\ \\abs{w_I(j\\w)} \\ge l_I(\\w), , \\forall\\w \\]\nHowever, in many cases, this approach of lumping uncertainty either at the output or the input does not work well because it usually introduces additional plants that were not present in the original set.\nConclusion Ideally, we would like to lump several sources of uncertainty into a single perturbation to get a simple uncertainty description. Often an unstructured multiplicative output perturbation is used. However, we should be careful about doing this, at least for plants with a large condition number. In such cases we may have to represent the uncertainty as it occurs physically (at the input, in the elements, etc.) thereby generating several perturbations.\nDiagonal Uncertainty By \u0026ldquo;diagonal uncertainty\u0026rdquo; we mean that the perturbation is a complex diagonal matrix \\[ \\Delta(s) = \\text{diag}\\{\\delta_i(s)\\}; \\quad \\abs{\\delta_i(j\\w)} \\le 1, \\ \\forall\\w, , \\forall i \\]\nDiagonal uncertainty usually arises from a consideration of uncertainty or neglected dynamics in the individual input or output channels. This type of diagonal uncertainty is always present.\n Let us consider uncertainty in the input channels. With each input \\(u_i\\), there is a physical system (amplifier, actuator, etc.) which based on the controller output signal \\(u_i\\), generates a physical plant input \\(m_i\\) \\[ m_i = h_i(s) u_i \\] The scalar transfer function \\(h_i(s)\\) is often absorbed into the plant model \\(G(s)\\). We can represent its uncertainty as multiplicative uncertainty \\[ h_{pi}(s) = h_i(s)(1 + w_{Ii}(s)\\delta_i(s)); \\quad \\abs{\\delta_i(j\\w)} \\le 1, , \\forall\\w \\] which after combining all input channels results in diagonal input uncertainty for the plant\n\\begin{align*} G_p(s) = G(I + W_I \\Delta_I) \\text{ with } \u0026amp;\\Delta_I = \\diag{\\delta_i} \\\\\\\n\u0026amp;W_I = \\diag{w_{Ii}} \\end{align*}\n Normally, we would represent the uncertainty in each input or output channel using a simple weight in the form \\[ w(s) = \\frac{\\tau s + r_0}{(\\tau/r_\\infty)s + 1} \\] where \\(r_0\\) is the relative uncertainty at steady-state, \\(1/\\tau\\) is the frequency where the relative uncertainty reaches \\(\\SI{100}{\\percent}\\), and \\(r_\\infty\\) is the magnitude of the weight at high frequencies.\nDiagonal input uncertainty should always be considered because:\n it is always present and a system which is sensitive to this uncertainty will not work in practice it often restrict achievable performance with multivariable control Obtaining \\(P\\), \\(N\\) and \\(M\\) Let\u0026rsquo;s consider the feedback system with multiplicative input uncertainty \\(\\Delta_I\\) shown Fig. fig:input_uncertainty_set_feedback_weight. \\(W_I\\) is a normalization weight for the uncertainty and \\(W_P\\) is a performance weight.\n\n Figure 29: System with multiplicative input uncertainty and performance measured at the output\n We want to derive the generalized plant \\(P\\) which has inputs \\([u_\\Delta,\\ w,\\ u]^T\\) and outputs \\([y_\\Delta,\\ z,\\ v]^T\\).\nBy breaking the loop before and after \\(K\\) and \\(\\Delta_I\\), we get \\[ P = \\begin{bmatrix} 0 \u0026amp; 0 \u0026amp; W_I \\\\\\\nW_P G \u0026amp; W_P \u0026amp; W_P G \\\\\\\n-G \u0026amp; -I \u0026amp; -G \\end{bmatrix} \\]\nNext, we want to derive the matrix \\(N\\). We fist partition \\(P\\) to be compatible with \\(K\\):\n\\begin{align*} P_{11} = \\begin{bmatrix}0\u0026amp;0\\GW_P\u0026amp;W_P\\end{bmatrix},\\quad \u0026amp; P_{12} = \\begin{bmatrix}W_I\\GW_P\\end{bmatrix} \\\\\\\nP_{21} = \\begin{bmatrix}G\u0026amp;-1\\end{bmatrix}, \\quad \u0026amp; P_{22} = -G \\\\\\\n\\end{align*}\nand then we find \\(N\\) using \\(N = F_l(P, K)\\).\nDefinitions of Robust Stability and Robust Performance The next step is to check whether we have stability and acceptable performance for all plant in the set:\n Robust stability analysis: with a given controller \\(K\\) we determine whether the system remains stable for all plants in the uncertainty set Robust performance analysis: is RS is satisfied, we determine how \u0026ldquo;large\u0026rdquo; the transfer function from exogenous inputs \\(w\\) to outputs \\(z\\) may be for all plants in the uncertainty set We have \\(z = F(\\Delta) \\cdot w\\) with\n\\begin{align*} F \u0026amp;= F_u(N, \\Delta) \\\\\\\n\u0026amp;\\triangleq N_{22} + N_{21}\\Delta(I - N_{11}\\Delta)^{-1} N_{12} \\end{align*}\nWe here use \\(\\hinf\\) norm to define performance and require for RP that \\(\\hnorm{F(\\Delta)} \\le 1\\) for all allowed \\(\\Delta\\). A typical choice is \\(F = w_P S_P\\) where \\(w_P\\) is the performance weight and \\(S_P\\) represents the set of perturbed sensitivity functions.\n In terms of the \\(N\\Delta\\text{-structure}\\), our requirements for stability and performance can be summarized as follows:\n\\begin{align*} \\text{NS} \u0026amp;\\ \\stackrel{\\text{def}}{\\Longleftrightarrow} \\ N \\text{ is internally stable} \\\\\\\n\\text{NP} \u0026amp;\\ \\stackrel{\\text{def}}{\\Longleftrightarrow} \\ \\text{NS and } \\hnorm{N_{22}} \u0026lt; 1 \\\\\\\n\\text{RS} \u0026amp;\\ \\stackrel{\\text{def}}{\\Longleftrightarrow} \\ \\text{NS and } F = F_u(N, \\Delta) \\text{ is stable } \\forall\\Delta \\\\\\\n\\text{RP} \u0026amp;\\ \\stackrel{\\text{def}}{\\Longleftrightarrow} \\ \\text{NS and } \\hnorm{F} \u0026lt; 1, \\quad \\forall \\Delta, ,\\hnorm{\\Delta} \\le 1 \\\\\\\n\\end{align*}\n Robust Stability for the \\(M\\Delta\\text{-structure}\\) Consider the uncertain \\(N\\Delta\\text{-system}\\) for which the transfer function from \\(w\\) to \\(z\\) is \\[ F_u(N, \\Delta) = N_{22} + N_{21}\\Delta(I - N_{11}\\Delta)^{-1} N_{12} \\] Suppose that the system is nominally stable (with \\(\\Delta = 0\\)) that is \\(N\\) is stable. We also assume that \\(\\Delta\\) is stable. We then see from the above equation that the only possible source of instability is the feedback term \\((I - N_{11}\\Delta)^{-1}\\). Thus, when we have nominal stability, the stability of the \\(N\\Delta\\text{-structure}\\) is equivalent to the stability of the \\(M\\Delta\\text{-structure}\\) where \\(M = N_{11}\\).\nWe thus need to derive conditions for checking the stability of the \\(M\\Delta\\text{-structure}\\).\n Assume that the nominal system \\(M(s)\\) and the perturbations \\(\\Delta(s)\\) are stable. Consider the convex set of perturbations \\(\\Delta\\), such that if \\(\\Delta^\\prime\\) is an allowed perturbation then so is \\(c\\Delta^\\prime\\) where c is any real scalar such that \\(\\abs{c} \\le 1\\). Then the \\(M\\Delta\\text{-structure}\\) is stable for all allowed perturbations if and only if the Nyquist plot of \\(\\det\\left( I - M\\Delta(s) \\right)\\) does not encircle the origin, \\(\\forall\\Delta\\):\n\\begin{equation} \\det( I - M\\Delta(j\\w)) \\ne 0, \\quad \\forall\\w, , \\forall\\Delta \\end{equation}\n Assume that the nominal system \\(M(s)\\) and the perturbations \\(\\Delta(s)\\) are stable. Consider the class of perturbations, \\(\\Delta\\), such that if \\(\\Delta^\\prime\\) is an allowed perturbation, then so is \\(c\\Delta^\\prime\\) where c is any complex scalar such that \\(\\abs{c} \\le 1\\). Then the \\(M\\Delta\\text{-structure}\\) is stable for all allowed perturbations if and only if:\n\\begin{equation} \\begin{aligned} \u0026amp;\\rho(M\\Delta(j\\w)) \u0026lt; 1, \\quad \\forall\\w, , \\forall\\Delta\\\\\\\n\\Leftrightarrow \\quad \u0026amp;\\max_{\\Delta} \\rho(M\\Delta(j\\w)) \u0026lt; 1, \\quad \\forall\\w \\end{aligned} \\end{equation}\n RS for Complex Unstructured Uncertainty Let \\(\\Delta\\) be the set of all complex matrices such that \\(\\maxsv(\\Delta) \\le 1\\) (\\(\\|\\Delta\\|_\\infty \\le 1\\)). This is often referred to as unstructured uncertainty or as full-block complex perturbation uncertainty. Then we have\n\\begin{align*} \\max_\\Delta \\rho(M\\Delta) \u0026amp;= \\max_\\Delta \\maxsv(M\\Delta) \\\\\\\n\u0026amp;= \\max_\\Delta \\maxsv(\\Delta) \\maxsv(M) \\\\\\\n\u0026amp;= \\maxsv(M) \\end{align*}\n Assume that the nominal system \\(M(s)\\) is stable and that the perturbations \\(\\Delta(s)\\) are stable. Then the \\(M\\Delta\\text{-system}\\) is stable for all perturbations \\(\\Delta\\) satisfying \\(\\hnorm{\\Delta} \\le 1\\) if and only if\n\\begin{equation} \\maxsv(M(j\\w)) \u0026lt; 1 \\ \\forall\\w \\quad \\Leftrightarrow \\quad \\hnorm{M} \u0026lt; 1 \\end{equation}\n Application of the Unstructured RS-condition We will now present necessary and sufficient conditions for robust stability for each of the six single unstructured perturbations in Figs fig:feedforward_uncertainty and fig:feedback_uncertainty with \\[ E = W_2 \\Delta W_1, \\quad \\hnorm{\\Delta} \\le 1 \\]\nTo derive the matrix \\(M\\) we simply \u0026ldquo;isolate\u0026rdquo; the perturbation, and determine the transfer function matrix \\[ M = W_1 M_0 W_2 \\] from the output to the input of the perturbation, where \\(M_0\\) for each of the six cases is given by\n\\begin{alignat*}{2} G_p \u0026amp;= G + E_A: \\quad \u0026amp;\u0026amp; M_0 = K (I + GK)^{-1} = KS\\\\\\\nG_p \u0026amp;= G(I + E_I): \\quad \u0026amp;\u0026amp; M_0 = K (I + GK)^{-1}G = T_I\\\\\\\nG_p \u0026amp;= (I + E_O)G: \\quad \u0026amp;\u0026amp; M_0 = G K (I + GK)^{-1} = T\\\\\\\nG_p \u0026amp;= G(I - E_{iA}G)^{-1}: \\quad \u0026amp;\u0026amp; M_0 = (I + GK)^{-1} G = SG\\\\\\\nG_p \u0026amp;= G(I - E_{iI})^{-1}: \\quad \u0026amp;\u0026amp; M_0 = (I + KG)^{-1} = S_I\\\\\\\nG_p \u0026amp;= (I - E_{iO})^{-1} G: \\quad \u0026amp;\u0026amp; M_0 = (I + GK)^{-1} = S \\end{alignat*}\nUsing the theorem to check RS for unstructured perturbations \\[ \\text{RS} \\quad \\Leftrightarrow \\quad \\hnorm{W_1 M_0 W_2(j\\w)} \u0026lt; 1, \\ \\forall\\w \\]\nFor instance, for feedforward input uncertainty, we get \\[ \\text{RS}\\ \\forall G_p = G(I + w_I \\Delta_I), \\hnorm{\\Delta_I} \\le 1 \\Leftrightarrow \\hnorm{w_I T_I} \u0026lt; 1 \\]\nIn general, the unstructured uncertainty descriptions in terms of a single perturbation are not \u0026ldquo;tight\u0026rdquo; (in the sense that at each frequency all complex perturbations satisfying \\(\\maxsv(\\Delta(j\\w)) \\le 1\\) may not be possible in practice). Thus, the above RS-conditions are often conservative. In order to get tighter condition we must use a tighter uncertainty description in terms of a block-diagonal \\(\\Delta\\).\nRS for Coprime Factor Uncertainty Robust stability bound in terms of the \\(\\hinf\\) norm (\\(\\text{RS}\\Leftrightarrow\\hnorm{M}\u0026lt;1\\)) are in general only tight when there is a single full perturbation block. An \u0026ldquo;exception\u0026rdquo; to this is when the uncertainty blocks enter or exit from the same location in the block diagram, because they can then be stacked on top of each other or side-by-side, in an overall \\(\\Delta\\) which is then full matrix.\nOne important uncertainty description that falls into this category is the coprime uncertainty description shown in Fig. fig:coprime_uncertainty, for which the set of plants is \\[ G_p = (M_l + \\Delta_M)^{-1}(Nl + \\Delta_N), \\quad \\hnorm{[\\Delta_N, \\ \\Delta_N]} \\le \\epsilon \\] Where \\(G = M_l^{-1} N_l\\) is a left coprime factorization of the nominal plant.\nThis uncertainty description is surprisingly general, it allows both zeros and poles to cross into the right-half plane, and has proven to be very useful in applications.\n\n Figure 30: Coprime Uncertainty\n Since we have no weights on the perturbations, it is reasonable to use a normalized coprime factorization of the nominal plant. In any case, to test for RS we can rearrange the block diagram to match the \\(M\\Delta\\text{-structure}\\) with \\[ \\Delta = [\\Delta_N, \\ \\Delta_M]; \\quad M = -\\begin{bmatrix}K\\I\\end{bmatrix} (I + GK)^{-1} M_l^{-1} \\] And we get \\[ \\text{RS}\\ \\forall\\ \\hnorm{\\Delta_N, \\ \\Delta_M} \\le \\epsilon \\quad \\Leftrightarrow \\quad \\hnorm{M} \u0026lt; 1/\\epsilon \\]\nThe coprime uncertainty description provides a good generic uncertainty description for cases where we do not use any specific a priori uncertainty information. Note that the uncertainty magnitude is \\(\\epsilon\\), so it is not normalized to be less than 1 in this case. This is because this uncertainty description is most often used in a controller design procedure where the objective is to maximize the magnitude of the uncertainty \\(\\epsilon\\) such that RS is maintained.\nRS with Structured Uncertainty: Motivation Consider now the presence of structured uncertainty, where \\(\\Delta = \\text{diag}\\{\\Delta_i\\}\\) is block-diagonal. To test for robust stability, we rearrange the system into the \\(M\\Delta\\text{-structure}\\) and we have \\[ \\text{RS if } \\maxsv(M(j\\w)) \u0026lt; 1, \\ \\forall\\w \\]\nWe have here written \u0026ldquo;if\u0026rdquo; rather than \u0026ldquo;if and only if\u0026rdquo; since this condition is only sufficient for RS when \\(\\Delta\\) has \u0026ldquo;no structure\u0026rdquo;. The question is whether we can take advantage of the fact that \\(\\Delta = \\text{diag}\\{\\Delta_i\\}\\) is structured to obtain an RS-condition which is tighter. On idea is to make use of the fact that stability must be independent of scaling.\nTo this effect, introduce the block-diagonal scaling matrix \\[ D = \\diag{d_i I_i} \\] where \\(d_i\\) is a scalar and \\(I_i\\) is an identity matrix of the same dimension as the \\(i\\)\u0026lsquo;th perturbation block \\(\\Delta_i\\).\nNow rescale the inputs and outputs of \\(M\\) and \\(\\Delta\\) by inserting the matrices \\(D\\) and \\(D^{-1}\\) on both sides as shown in Fig. fig:block_diagonal_scalings. This clearly has no effect on stability.\n\n Figure 31: Use of block-diagonal scalings, \\(\\Delta D = D \\Delta\\)\n Note that with the chosen form for the scalings we have for each perturbation block \\(\\Delta_i = d_i \\Delta_i d_i^{-1}\\), that is we have \\(\\Delta = D \\Delta D^{-1}\\).\nThis means that we have \\[ \\text{RS if } \\maxsv(DM(j\\w)D^{-1}) \u0026lt; 1, \\ \\forall\\w \\]\n This applies for any \\(D\\), and therefore the \u0026ldquo;most improved\u0026rdquo; (least conservative) RS-condition is obtained by minimizing at each frequency the scaled singular value and we have \\[ \\text{RS if } \\min_{D(\\w) \\in \\mathcal{D}} \\maxsv(D(\\w)M(j\\w)D(\\w)^{-1}) \u0026lt; 1, \\ \\forall\\w \\] where \\(\\mathcal{D}\\) is the set of block-diagonal matrices whose structure is compatible to that of \\(\\Delta\\), i.e, \\(\\Delta D = D \\Delta\\).\n When \\(\\Delta\\) is a full matrix, we must select \\(D = dI\\) and we have \\(\\maxsv(D M D^{-1}) = \\maxsv(M)\\), and we cannot improve the RS-condition. However, when \\(\\Delta\\) has structure, we get more degrees of freedom in \\(D\\) and \\(\\maxsv(D M D^{-1})\\) may be significantly smaller than \\(\\maxsv(M)\\).\nThe Structured Singular Value Definition The structured singular value \\(\\mu\\) is a function which provides a generalization of the singular value \\(\\maxsv\\) and the spectral radius \\(\\rho\\). We will use \\(\\mu\\) to get necessary and sufficient conditions for robust stability and also for robust performance.\n\\(\\mu\\) can be explained as follow:\n Find the smallest structured \\(\\Delta\\) (measured in terms of \\(\\maxsv(\\Delta)\\)) which makes the matrix \\(I - M \\Delta\\) singular; then \\(\\mu(M) = 1/\\maxsv(\\Delta)\\).\n Mathematically \\[ \\mu(M)^{-1} \\triangleq \\min_{\\Delta}\\{\\maxsv(\\Delta) | \\det(I-M\\Delta) = 0 \\text{ for struct. }\\Delta\\} \\] Clearly, \\(\\mu(M)\\) depends not only on \\(M\\) but also on the allowed structure for \\(\\Delta\\). This is sometimes shown explicitly by using the notation \\(\\mu_\\Delta (M)\\).\nThe above definition of \\(\\mu\\) involves varying \\(\\maxsv(\\Delta)\\). However, we prefer to normalize \\(\\Delta\\) such that \\(\\maxsv(\\Delta)\\le1\\). We can do that by scaling \\(\\Delta\\) by a factor \\(k_m\\), and looking for the smallest \\(k_m\\) which makes the matrix \\(I - k_m M \\Delta\\) singular. \\(\\mu\\) is then the reciprocal of this small \\(k_m\\): \\(\\mu = 1/k_m\\). This results in the following alternative definition of \\(\\mu\\).\n Let \\(M\\) be a given complex matrix and let \\(\\Delta = \\diag{\\Delta_i}\\) denote a set of complex matrices with \\(\\maxsv(\\Delta) \\le 1\\) and with a given block-diagonal structure. The real non-negative function \\(\\mu(M)\\), called the structured singular value, is defined by\n\\begin{align*} \\mu(M) \\triangleq \u0026amp;(\\min\\{ k_m | \\det(I - k_m M \\Delta) = 0\\\\\\\n\u0026amp;\\text{for structured } \\Delta, \\maxsv(\\Delta) \\le 1 \\} )^{-1} \\end{align*}\nIf no such structured \\(\\Delta\\) exists then \\(\\mu(M) = 0\\)\n A value of \\(\\mu = 1\\) means that there exists a perturbation with \\(\\maxsv(\\Delta) = 1\\) which is just large enough to make \\(I - M\\Delta\\) singular.\nA larger value of \\(\\mu\\) is \u0026ldquo;bad\u0026rdquo; as it means that a smaller perturbation makes \\(I - M\\Delta\\) singular, whereas a smaller value of \\(\\mu\\) is \u0026ldquo;good\u0026rdquo;.\nRemarks on the Definition of \\(\\mu\\) The structured singular value was introduced by Doyle while at the same time, Safonov introduced the Multivariable Stability Margin \\(k_m\\) for a diagonally perturbed system as the inverse of \\(\\mu\\), that is \\(k_m(M) = \\mu(M)^{-1}\\). Note that with \\(k_m = 0\\) we obtain \\(I - k_m M \\Delta = I\\) which is clearly non-singular. Thus, one possible way to obtain \\(\\mu\\) numerically, is to start with \\(k_m = 0\\), and gradually increase \\(k_m\\) until we first find an allowed \\(\\Delta\\) with \\(\\maxsv(\\Delta) = 1\\) such that \\(I-k_mM\\Delta\\) is singular. Properties of \\(\\mu\\) for Real and Complex \\(\\Delta\\) \\(\\mu(\\alpha M) = \\abs{\\alpha} \\mu(M)\\) for any real scalar \\(\\alpha\\) Let \\(\\Delta = \\diag{\\Delta_1, \\Delta_2}\\) be a block-diagonal perturbation and let \\(M\\) be partitioned accordingly. Then \\[ \\mu_\\Delta \\ge \\text{max} \\{\\mu_{\\Delta_1} (M_{11}), \\mu_{\\Delta_2}(M_{22}) \\} \\] Properties of \\(\\mu\\) for Complex Perturbations \\(\\Delta\\) For complex perturbations \\(\\Delta\\) with \\(\\maxsv(\\Delta) \\le 1\\)\n\\begin{equation} \\tcmbox{\\mu(M) = \\max_{\\Delta, \\maxsv(\\Delta) \\le 1} \\rho(M\\Delta)} \\end{equation}\n \\(\\mu(\\alpha M) = \\abs{\\alpha} \\mu(M)\\) for any (complex) scalar \\(\\alpha\\)\n For a full block complex perturbation \\(\\Delta\\) \\[ \\mu(M) = \\maxsv(M) \\]\n \\(\\mu\\) for complex perturbations is bounded by the spectral radius and the singular value\n\\begin{equation} \\tcmbox{\\rho(M) \\le \\mu(M) \\le \\maxsv(M)} \\end{equation}\n Improved lower bound. Defined \\(\\mathcal{U}\\) as the set of all unitary matrices \\(U\\) with the same block diagonal structure as \\(\\Delta\\). Then for complex \\(\\Delta\\)\n\\begin{equation} \\tcmbox{\\mu(M) = \\max_{U\\in\\mathcal{U}} \\rho(MU)} \\end{equation}\n Improved upper bound. Defined \\(\\mathcal{D}\\) as the set of all unitary matrices \\(D\\) that commute with \\(\\Delta\\). Then\n\\begin{equation} \\tcmbox{\\mu(M) = \\min_{D\\in\\mathcal{D}} \\maxsv(DMD^{-1})} \\end{equation}\n Robust Stability with Structured Uncertainty Consider stability of the \\(M\\Delta\\text{-structure}\\) for the case where \\(\\Delta\\) is a set of norm-bounded block-diagonal perturbations. From the determinant stability condition which applies to both complex and real perturbations, we get \\[ \\text{RS} \\ \\Leftrightarrow \\ \\det(I-M\\Delta(j\\w)) \\ne 0, \\ \\forall\\w,, \\forall\\Delta, , \\|\\Delta\\|_\\infty \\le 1 \\] The problem is that this is only a \u0026ldquo;yes/no\u0026rdquo; condition. To find the factor \\(k_m\\) by which the system is robustly stable, we scale the uncertainty \\(\\Delta\\) by \\(k_m\\), and look for the smallest \\(k_m\\) which yields \u0026ldquo;borderline instability\u0026rdquo;, namely \\[ \\det(I - k_m M \\Delta) = 0 \\] From the definition of \\(\\mu\\), this value is \\(k_m = 1/\\mu(M)\\), and we obtain the following necessary and sufficient condition for robust stability.\n Assume that the nominal system \\(M\\) and the perturbations \\(\\Delta\\) are stable. Then the \\(M\\Delta\\text{-system}\\) is stable for all allowed perturbations with \\(\\maxsv(\\Delta)\\le 1, \\ \\forall\\w\\) if on only if\n\\begin{equation} \\mu(M(j\\w)) \u0026lt; 1, \\ \\forall \\omega \\end{equation}\n What do \\(\\mu \\ne 1\\) and skewed-\\(\\mu\\) mean? A value of \\(\\mu = 1.1\\) for robust stability means that all the uncertainty blocks must be decreased in magnitude by a factor 1.1 in order to guarantee stability.\nBut if we want to keep some of the uncertainty blocks fixed, how large can one particular source of uncertainty be before we get instability? We define this value as \\(1/\\mu^s\\), where \\(\\mu^s\\) is called skewed-\\(\\mu\\). We may view \\(\\mu^s(M)\\) as a generalization of \\(\\mu(M)\\).\n Let \\(\\Delta = \\diag{\\Delta_1, \\Delta_2}\\) and assume we have fixed \\(\\norm{\\Delta_1} \\le 1\\) and we want to find how large \\(\\Delta_2\\) can be before we get instability. The solution is to select \\[ K_m = \\begin{bmatrix}I \u0026amp; 0 \\ 0 \u0026amp; k_m I\\end{bmatrix} \\] and look at each frequency for the smallest value of \\(k_m\\) which makes \\(\\det(I - K_m M \\Delta) = 0\\) and we have that skewed-\\(\\mu\\) is \\[ \\mu^s(M) \\triangleq 1/k_m \\]\n Note that to compute skewed-\\(\\mu\\) we must first define which part of the perturbations is to be constant.\nRobust Performance Testing RP using \\(\\mu\\) To test for RP, we first \u0026ldquo;pull out\u0026rdquo; the uncertain perturbations and rearrange the uncertain system into the \\(N\\Delta\\text{-form}\\). Our RP-requirement, is that the \\(\\hinf\\) norm of the transfer function \\(F = F_u(N, \\Delta)\\) remains less than \\(1\\) for all allowed perturbations. This may be tested exactly by computing \\(\\mu(N)\\).\n Rearrange the uncertain system into the \\(N\\Delta\\text{-structure}\\). Assume nominal stability such that \\(N\\) is stable. Then\n\\begin{align*} \\text{RP} \\ \u0026amp;\\stackrel{\\text{def}}{\\Longleftrightarrow} \\ \\hnorm{F} = \\hnorm{F_u(N, \\Delta)} \u0026lt; 1, \\ \\forall \\hnorm{\\Delta} \u0026lt; 1 \\\\\\\n\u0026amp;\\Longleftrightarrow \\ \\mu_{\\hat{\\Delta}}(N(j\\w)) \u0026lt; 1, \\ \\forall\\w \\end{align*}\nwhere \\(\\mu\\) is computed with respect to the structure \\[ \\hat{\\Delta} = \\begin{bmatrix}\\Delta \u0026amp; 0 \\ 0 \u0026amp; \\Delta_P\\end{bmatrix} \\] and \\(\\Delta_P\\) is a full complex perturbation with the same dimensions as \\(F^T\\).\n Some remarks on the theorem:\n Condition \\(\\mu_{\\hat{\\Delta}}(N(j\\w)) \u0026lt; 1, \\ \\forall\\w\\) allows us to test if \\(\\hnorm{F} \u0026lt; 1\\) for all possible \\(\\Delta\\) without having to test each \\(\\Delta\\) individually. Essential, \\(\\mu\\) is defined such that it directly addresses the worst case The \\(\\mu\\text{-condition}\\) for RP involves the enlarged perturbation \\(\\hat{\\Delta} = \\diag{\\Delta, \\Delta_P}\\). Here \\(\\Delta\\), which itself may be a block diagonal matrix, represents the true uncertainty, whereas \\(\\Delta_P\\) is a full complex matrix stemming from the \\(\\hinf\\) norm performance specification Since \\(\\hat{\\Delta}\\) always has structure, the use of \\(\\hinf\\) norm, \\(\\hnorm{N} \u0026lt; 1\\), is generally conservative for robust performance Summary of \\(\\mu\\text{-conditions}\\) for NP, RS and RP Rearrange the uncertain system into the \\(N\\Delta\\text{-structure}\\) where the block-diagonal perturbation satisfy \\(\\hnorm{\\Delta} \\le 1\\). Introduce \\[ F = F_u(N, \\Delta) = N_{22} + N_{21}\\Delta(I - N_{11} \\Delta)^{-1} N_{12} \\] Let the performance requirement be \\(\\hnorm{F} \\le 1\\).\n\\begin{align*} \\text{NS} \\ \u0026amp;\\Leftrightarrow \\ N \\text{ (internally) stable} \\\\\\\n\\text{NP} \\ \u0026amp;\\Leftrightarrow \\ \\text{NS and } \\maxsv(N_{22}) = \\mu_{\\Delta_P} \u0026lt; 1, \\ \\forall\\w \\\\\\\n\\text{RS} \\ \u0026amp;\\Leftrightarrow \\ \\text{NS and } \\mu_\\Delta(N_{11}) \u0026lt; 1, \\ \\forall\\w \\\\\\\n\\text{RP} \\ \u0026amp;\\Leftrightarrow \\ \\text{NS and } \\mu_{\\tilde{\\Delta}}(N) \u0026lt; 1, \\ \\forall\\w, \\ \\tilde{\\Delta} = \\begin{bmatrix}\\Delta \u0026amp; 0 \\ 0 \u0026amp; \\Delta_P\\end{bmatrix} \\end{align*}\n Here \\(\\Delta\\) is a block-diagonal matrix, whereas \\(\\Delta_P\\) is always a full complex matrix.\nAlthough the structured singular value is not a norm, it is sometimes convenient to refer to the peak \\(\\mu\\text{-value}\\) as the \u0026ldquo;\\(\\Delta\\text{-norm}\\)\u0026quot;. For a stable rational transfer matrix \\(H(s)\\), with an associated block structure \\(\\Delta\\), we therefore define\n\\begin{equation} \\tcmbox{\\left\\|H(s)\\right\\|_\\Delta \\triangleq \\max_{\\w} \\mu_\\Delta (H(j\\w))} \\end{equation}\nFor a nominal stable system, we then have\n\\begin{align*} \\text{NP} \\ \u0026amp;\\Leftrightarrow \\ \\hnorm{N_{22}} \u0026lt; 1 \\\\\\\n\\text{RS} \\ \u0026amp;\\Leftrightarrow \\ \\left\\|N_{11}\\right\\|_\\Delta \u0026lt; 1 \\\\\\\n\\text{RP} \\ \u0026amp;\\Leftrightarrow \\ \\left\\|N\\right\\|_{\\tilde{\\Delta}} \u0026lt; 1 \\end{align*}\nWorst-case Performance and Skewed-\\(\\mu\\) Assume we have a system for which the peak \\(\\mu\\text{-value}\\) for RP is \\(1.1\\). What does this mean? The definition of \\(\\mu\\) tells us that our RP-requirement would be satisfied exactly if we reduced both the performance requirement and the uncertainty by a factor of \\(1.1\\). So \\(\\mu\\) does not directly give us the worst-case performance \\(\\max_{\\Delta} \\maxsv(F(\\Delta))\\).\nTo find the worst-case weighted performance for a given uncertainty, one needs to keep the magnitude of the perturbation fixed (\\(\\maxsv(\\Delta) \\le 1\\)), that is, we must compute the skewed-\\(\\mu\\) of \\(N\\). We have, in this case \\[ \\max_{\\maxsv(\\Delta) \\le 1} \\maxsv(F_l(N, \\Delta)(j\\w)) = \\mu^s (N(j\\w)) \\]\nTo find \\(\\mu^s\\) numerically, we scale the performance part of \\(N\\) by a factor \\(k_m = 1/\\mu^s\\) and iterate on \\(k_m\\) until \\(\\mu = 1\\). That is, at each frequency skewed-\\(\\mu\\) is the value \\(\\mu^s(N)\\) which solves \\[ \\mu(K_mN) = 1, \\quad K_m = \\begin{bmatrix}I \u0026amp; 0 \\ 0 \u0026amp; 1/\\mu^s\\end{bmatrix} \\] Note that \\(\\mu\\) underestimate how bad or good the actual worst case performance is. This follows because \\(\\mu^s(N)\\) is always further from 1 than \\(\\mu(N)\\).\nApplication: RP with Input Uncertainty We will now consider in some detail the case of multiplicative input uncertainty with performance defined in terms of weighted sensitivity (Fig. fig:input_uncertainty_set_feedback_weight).\nThe performance requirement is then \\[ \\text{RP} \\quad \\stackrel{\\text{def}}{\\Longleftrightarrow} \\quad \\hnorm{w_P (I + G_p K)^{-1}} \u0026lt; 1, \\quad \\forall G_p \\] where the set of plant is given by \\[ G_p = G (I + w_I \\Delta_I), \\quad \\hnorm{\\Delta_I} \\le 1 \\]\nHere \\(w_p(s)\\) and \\(w_I(s)\\) are scalar weights, so the performance objective is the same for all the outputs, and the uncertainty is the same for all the inputs.\nIn this section, we will:\n Find the interconnection matrix \\(N\\) for this problem Consider the SISO case, so that useful connections can be made with results for SISO systems Consider a multivariable distillation process Find some simple bounds on \\(\\mu\\) and discuss the role of the condition number Make comparisons with the case where the uncertainty is located at the output Interconnection Matrix On rearranging the system into the \\(N\\Delta\\text{-structure}\\), we get\n\\begin{equation} N = \\begin{bmatrix} - w_I T_I \u0026amp; - w_I K S \\ w_p S G \u0026amp; w_p S \\end{bmatrix} \\end{equation}\nwhere \\(T_I = KG(I + KG)^{-1}\\), \\(S = (I + GK)^{-1}\\). For simplicity, we can omit the negative signs.\nFor a given controller \\(K\\) we can now test for NS, NP, RS and RP.\nRP with Input Uncertainty for SISO System For a SISO system with \\(N\\) as described above:\n\\begin{align*} \\text{NS} \u0026amp;\\Leftrightarrow S,\\ SG,\\ KS, \\text{ and } T_I \\text{ are stable} \\\\\\\n\\text{NP} \u0026amp;\\Leftrightarrow |w_P S| \u0026lt; 1, \\quad \\forall \\omega \\\\\\\n\\text{RS} \u0026amp;\\Leftrightarrow |w_I T_I| \u0026lt; 1, \\quad \\forall \\omega \\\\\\\n\\text{RP} \u0026amp;\\Leftrightarrow |w_P S| + |w_I T_I| \u0026lt; 1, \\quad \\forall \\omega \\end{align*}\nRobust performance optimization, in terms of weighted sensitivity with multiplicative uncertainty for a SISO system, thus involves minimizing the peak value of \\(\\mu(N) = |w_I T| + |w_P S|\\). This may be solved using DK-iteration. A closely related problem, which is easier to solve is to minimize the peak value (\\(\\mathcal{H}_\\infty\\) norm) of the mixed sensitivity matrix: \\[ N_\\text{mix} = \\begin{bmatrix} w_P S \\ w_I T \\end{bmatrix} \\]\nAt each frequency, \\(\\mu(N)\\) differs from and \\(\\bar{\\sigma}(N_\\text{mix})\\) by at most a factor \\(\\sqrt{2}\\). Thus, minimizing \\(\\| N_\\text{mix} \\|_\\infty\\) is close to optimizing robust performance in terms of \\(\\mu(N)\\).\nRobust Performance for \\(2 \\times 2\\) Distillation Process Consider a distillation process and a corresponding inverse-based controller: \\[ G(s) = \\frac{1}{75s + 1} \\begin{bmatrix} 87.8 \u0026amp; -86.4 \\ 108.2 \u0026amp; -109.6 \\end{bmatrix} ; \\quad K(s) = \\frac{0.7}{s} G(s)^{-1} \\]\nThe controller provides a nominally decoupled system: \\[ L = l I,\\ S = \\epsilon I \\text{ and } T = t I \\] where \\[ l = \\frac{0.7}{s}, \\ \\epsilon = \\frac{s}{s + 0.7}, \\ t = \\frac{0.7}{s + 0.7} \\]\nThe following weights for uncertainty and performance are used: \\[ w_I(s) = \\frac{s + 0.2}{0.5s + 1}; \\quad w_P(s) = \\frac{s/2 + 0.05}{s} \\]\nWe now test for NS, NP, RS and RP.\nNS with \\(G\\) and \\(K\\) as defined, we find that \\(S\\), \\(SG\\), \\(KS\\) and \\(T_I\\) are stable, so the system is nominally stable.\nNP with the decoupling controller we have: \\[ \\bar{\\sigma}(N_{22}) = \\bar{\\sigma}(w_P S) = \\left|\\frac{s/2 + 0.05}{s + 0.7}\\right| \\] and we see from Fig. fig:mu_plots_distillation that the NP-condition is satisfied.\n\n Figure 32: \\(\\mu\\text{-plots}\\) for distillation process with decoupling controller\n RS In this case \\(w_I T_I = w_I T\\) is a scalar times the identity matrix: \\[ \\mu_{\\Delta_I}(w_I T_I) = |w_I t| = \\left|0.2 \\frac{5s + 1}{(0.5s + 1)(1.43s + 1)}\\right| \\] and we see from Fig. fig:mu_plots_distillation that RS is satisfied.\nThe peak value of \\(\\mu_{\\Delta_I}(M)\\) is \\(0.53\\) meaning that we may increase the uncertainty by a factor of \\(1/0.53 = 1.89\\) before the worst case uncertainty yields instability.\nRP Although the system has good robustness margins and excellent nominal performance, the robust performance is poor. This is shown in Fig. fig:mu_plots_distillation where the \\(\\mu\\text{-curve}\\) for RP was computed numerically using \\(\\mu_{\\hat{\\Delta}}(N)\\), with \\(\\hat{\\Delta} = \\text{diag}\\{\\Delta_I, \\Delta_P\\}\\) and \\(\\Delta_I = \\text{diag}\\{\\delta_1, \\delta_2\\}\\). The peak value is close to 6, meaning that even with 6 times less uncertainty, the weighted sensitivity will be about 6 times larger than what we require.\nRobust Performance and the Condition Number We here consider the relationship between \\(\\mu\\) for RP and the condition number of the plant or of the controller. We consider unstructured multiplicative uncertainty (i.e. \\(\\Delta_I\\) is a full matrix) and performance is measured in terms of the weighted sensitivity. With \\(N\\) given by \\eqref{eq:n_delta_structure_clasic}, we have: \\[ \\overbrace{\\mu_{\\tilde{\\Delta}}(N)}^{\\text{RP}} \\le [ \\overbrace{\\bar{\\sigma}(w_I T_I)}^{\\text{RS}} + \\overbrace{\\bar{\\sigma}(w_P S)}^{\\text{NP}} ] (1 + \\sqrt{k}) \\] where \\(k\\) is taken as the smallest value between the condition number of the plant and of the controller: \\[ k = \\text{min}(\\gamma(G), \\gamma(K)) \\]\nWe see that with a \u0026ldquo;round\u0026rdquo; controller (i.e. one with \\(\\gamma(K) = 1\\)), there is less sensitivity to uncertainty. On the other hand, we would expect \\(\\mu\\) for RP to be large if we used an inverse-based controller for a plant with large condition number, since then \\(\\gamma(K) = \\gamma(G)\\) is large.\nComparison with Output Uncertainty Consider output multiplicative uncertainty of magnitude \\(w_O(j\\omega)\\). In this case, we get the interconnection matrix \\[ N = \\begin{bmatrix} w_O T \u0026amp; w_O T \\ w_P S \u0026amp; w_P S \\end{bmatrix} \\] and for any structure of the uncertainty, \\(\\mu(N)\\) is bounded as follows: \\[ \\bar{\\sigma}\\begin{bmatrix} w_O T \\ w_P S\\end{bmatrix} \\le \\overbrace{\\mu(N)}^{\\text{RP}} \\le \\sqrt{2}\\ \\bar{\\sigma} \\overbrace{\\underbrace{\\begin{bmatrix} w_O T \\ w_P S \\end{bmatrix}}_{\\text{NP}}}^{\\text{RS}} \\] This follows since the uncertainty and performance blocks both enter at the output and that the difference between bounding the combined perturbations \\(\\bar{\\sigma}[\\Delta_O \\ \\Delta_P]\\) and the individual perturbations \\(\\bar{\\sigma}(\\Delta_O)\\) and \\(\\bar{\\sigma}(\\Delta_P)\\) is at most a factor \\(\\sqrt{2}\\). Thus, we \u0026ldquo;automatically\u0026rdquo; achieve RP if we satisfy separately NP and RS. Multiplicative output uncertainty then poses no particular problem for performance.\n\\(\\mu\\text{-synthesis}\\) and DK-iteration The structured singular value \\(\\mu\\) is a very powerful tool for the analysis of robust performance with a given controller. However, one may also seek to find the controller that minimizes a given \\(\\mu\\text{-condition}\\): this is the \\(\\mu\\text{-synthesis}\\) problem.\nDK-iteration At present, there is no direct method to synthesize a \\(\\mu\\text{-optimal}\\) controller. However, for complex perturbations, a method known as DK-iteration is available. It combines \\(\\hinf\\) synthesis and \\(\\mu\\text{-analysis}\\) and often yields good results.\nThe starting point is the upper bound on \\(\\mu\\) in terms of the scaled singular value\n\\begin{equation} \\mu(N) \\le \\min_{D \\in \\mathcal{D}} \\maxsv(D N D^{-1}) \\end{equation}\nThe idea is to find the controller that minimizes the peak value over frequency of this upper bound, namely\n\\begin{equation} \\min_{K} \\left( \\min_{D \\in \\mathcal{D}} \\hnorm{D N(K) D^{-1} } \\right) \\end{equation}\nby alternating between minimizing \\(\\hnorm{DN(K)D^{-1}}\\) with respect to either \\(K\\) or \\(D\\) (while holding the other fixed).\nTo start the iterations, one selects an initial stable rational transfer matrix \\(D(s)\\) with appropriate structure. The identity matrix is often a good initial choice for \\(D\\) provided the system has been reasonably scaled for performance.\n K-step. Synthesize an \\(\\hinf\\) controller for the scaled problem, \\(\\min_{K} \\hnorm{DN(K)D^{-1}}\\) with fixed \\(D(s)\\) D-step. Find \\(D(j\\w)\\) to minimize at each frequency \\(\\maxsv(DND^{-1}(j\\w))\\) with fixed \\(N\\) Fit the magnitude of each element of \\(D(j\\w)\\) to a stable and minimum phase transfer function \\(D(s)\\) and go to step 1 The iteration may continue until satisfactory performance is achieve, \\(\\hnorm{DND^{-1}} \u0026lt; 1\\) or until the \\(\\hinf\\) norm no longer decreases. One fundamental problem with this approach is that although each of the minimization steps are convex, joint convexity is not guaranteed. Therefore, the iterations may converge to a local minimum.\nThe order of the controller resulting from each iteration is equal to the number of the states in the plant \\(G(s)\\) plus the number of states in the weights plus twice the number of state in \\(D(s)\\). The obtain \\(\\mu\\text{-optimal}\\) controller will usually be of high order and will have a flat \\(\\mu\\text{-curve}\\) until some high frequency.\nThe DK-iteration depends heavily on optimal solutions for steps 1 and 2, and also on good fits in step 3. We usually prefers to have a low-order fit in step 3 as it will reduces the order of the \\(\\hinf\\) problem which usually improves the numerical properties of the optimization. In some cases, the iterations converge slowly, the \\(\\mu\\text{-value}\\) can even increase. This may be caused by numerical problems and one may consider going back to the initial problem and rescaling the inputs and outputs.\nAdjusting the Performance Weight If \\(\\mu\\) at a given frequency is different from 1, then the interpretation is that at this frequency we can tolerate \\(1/\\mu\\) times more uncertainty and still satisfy our performance objective with a margin of \\(1/\\mu\\). In \\(\\mu\\text{-synthesis}\\), the designer will usually adjust some parameter in the performance or uncertainty weights until the weight of the peak \\(\\mu\\text{-value}\\) is close to 1.\nSometimes, uncertainty is fixed and we effectively optimize worst-cast performance by adjusting a parameter in the performance weight. Consider the performance weight \\[ w_p(s) = \\frac{s/M + \\w_B^*}{s + \\w_B^* A} \\] where we want to keep \\(M\\) constant and find the high achievable bandwidth frequency \\(\\w_B^*\\). The optimization problem becomes \\[ \\text{max} \\abs{\\w_B^*} \\quad \\text{such that} \\quad \\mu(N) \u0026lt; 1, \\ \\forall\\w \\] where \\(N\\), the interconnection matrix for the RP-problem, depends on \\(\\w_B^*\\). This may be implemented as an outer loop around the DK-iteration.\nFixed Structure Controller Sometimes it is desirable to find a low-order controller with a given structure. This may be achievable by numerical optimization where \\(\\mu\\) is minimized with respect to the controller parameters. This problem here is that the optimization is not generally convex in the parameters. Sometimes it helps to switch the optimization between minimizing the peak of \\(\\mu\\) and minimizing the integral square deviation of \\(\\mu\\) away from \\(k\\) (i.e. \\(\\normtwo{\\mu(j\\w) - k}\\)) where \\(k\\) is usually close to 1. The latter is an attempt to \u0026ldquo;flatten out\u0026rdquo; \\(\\mu\\).\nExample: \\(\\mu\\text{-synthesis}\\) with DK-iteration For simplicity, we will consider again the case of multiplicative uncertainty and performance defined in terms of weighted sensitivity. The uncertainty weight \\(w_I I\\) and performance weight \\(w_P I\\) are shown graphically in Fig. fig:weights_distillation.\n\n Figure 33: Uncertainty and performance weights\n The objective is to minimize the peak value of \\(\\mu_{\\tilde{\\Delta}}(N)\\), \\(\\tilde{\\Delta} = \\text{diag}\\{\\Delta_I, \\Delta_P\\}\\). \\(\\Delta_I\\) is a diagonal \\(2 \\times 2\\) matrix representing the diagonal input uncertainty and \\(\\Delta_P\\) is a full \\(2 \\times 2\\) matrix representing the performance specifications.\nFirst, the generalized plant \\(P\\) is constructed which includes the plant model, the uncertainty weight and the performance weight. Then the block structure is defined, it consists of two \\(1 \\times 1\\) blocks to represent \\(\\Delta_I\\) and a \\(2 \\times 2\\) block to represent \\(\\Delta_P\\). The scaling matrix \\(D\\) for \\(DND^{-1}\\) then has the structure \\(D = \\text{diag}\\{d_1, d_2, d_3I_2\\}\\). We select \\(d_3 = 1\\) and as initial scalings we select \\(d_1^0 = d_2^0 = 1\\). \\(P\\) is then scaled with the matrix \\(\\text{diag}\\{D, I_2\\}\\) where \\(I_2\\) is associated with the inputs and outputs from the controller (we do not want to scale the controller).\n Iteration No. 1. Step 1: with the initial scalings, the \\(\\mathcal{H}_\\infty\\) synthesis produced a 6 state controller (2 states from the plant model and 2 from each of the weights). Step 2: the upper \\(\\mu\\text{-bound}\\) is shown in Fig. fig:dk_iter_mu. Step 3: the frequency dependent \\(d_1(\\omega)\\) and \\(d_2(\\omega)\\) from step 2 are fitted using a 4th order transfer function shown in Fig. fig:dk_iter_d_scale Iteration No. 2. Step 1: with the 8 state scalings \\(D^1(s)\\), the \\(\\mathcal{H}_\\infty\\) synthesis gives a 22 state controller. Step 2: This controller gives a peak value of \\(\\mu\\) of \\(1.02\\). Step 3: the scalings are only slightly changed Iteration No. 3. Step 1: The \\(\\mathcal{H}_\\infty\\) norm is only slightly reduced. We thus decide the stop the iterations. \n Figure 34: Change in \\(\\mu\\) during DK-iteration\n \n Figure 35: Change in D-scale \\(d_1\\) during DK-iteration\n The final \\(\\mu\\text{-curves}\\) for NP, RS and RP with the controller \\(K_3\\) are shown in Fig. fig:mu_plot_optimal_k3. The objectives of RS and NP are easily satisfied. The peak value of \\(\\mu\\) is just slightly over 1, so the performance specification \\(\\bar{\\sigma}(w_P S_p) \u0026lt; 1\\) is almost satisfied for all possible plants.\n\n Figure 36: (mutext{-plots}) with (mu) \u0026ldquo;optimal\u0026rdquo; controller (K_3)\n To confirm that, 6 perturbed plants are used to compute the perturbed sensitivity functions shown in Fig. fig:perturb_s_k3.\n\n Figure 37: Perturbed sensitivity functions (bar{sigma}(S^prime)) using (mu) \u0026ldquo;optimal\u0026rdquo; controller (K_3). Lower solid line: nominal plant. Upper solid line: worst-case plant\n Further Remarks on \\(\\mu\\) For complex perturbations, the scaled singular value \\(\\maxsv(DND^{-1})\\) is a tight upper bound on \\(\\mu(N)\\) in most cases, and minimizing the upper bound \\(\\hnorm{DND^{-1}}\\) form the basis for the DK-iteration.\nThe use of constant D-scales (\\(D\\) is not allowed to vary with frequency), provides a necessary and sufficient condition for robustness to arbitrary fast time varying linear uncertainty. While such perturbations are unlikely in a practical situation, we know that this controller will work very well even for rapid changes in the plant. Moreover, the use of constant D-scales make the computation of \\(\\mu\\) straightforward and solvable using LMIs.\nConclusion We have discussed how to represent uncertainty and how to analyze its effect on stability (RS) and performance (RP) using the structured singular value \\(\\mu\\).\nTo analyze robust stability of an uncertain system, we make use of the \\(M\\Delta\\text{-structure}\\) where \\(M\\) represents the transfer function for the \u0026ldquo;new\u0026rdquo; feedback part generated by the uncertainty. From the small gain theorem \\[ \\tcmbox{RS \\quad \\Leftarrow \\quad \\maxsv(M) \u0026lt; 1, \\ \\forall\\w} \\] which is tight (necessary and sufficient) for the special case where at each frequency any complex \\(\\Delta\\) satisfying \\(\\maxsv(\\Delta) \\le 1\\) is allowed. More generally, the tight condition is \\[ \\tcmbox{RP \\quad \\Leftrightarrow \\quad \\mu(M) \u0026lt; 1, \\ \\forall\\w} \\] where \\(\\mu(M)\\) is the structured singular value. The calculation of \\(\\mu\\) makes use of the fact that \\(\\Delta\\) has a given block-diagonal structure, where certain blocks may also be real (e.g. to handle parametric uncertainty).\nWe defined robust performance as \\(\\hnorm{F_l(N, \\Delta)} \u0026lt; 1\\) for all allowed \\(\\Delta\\). Since we used the \\(\\hinf\\) norm in both the representation of uncertainty and the definition of performance, we found that RP could be viewed as a special case of RS, and we derived \\[ \\tcmbox{RS \\quad \\Leftrightarrow \\quad \\mu(N) \u0026lt; 1, \\ \\forall\\w} \\] where \\(\\mu\\) is computed with respect to the block-diagonal structure \\(\\diag{\\Delta, \\Delta_P}\\). Here \\(\\Delta\\) represents the uncertainty and \\(\\Delta_P\\) is a fictitious full uncertainty block representing the \\(\\hinf\\) performance bound.\nThere are two main approaches to getting a robust design:\n We aim to make the system robust to some \u0026ldquo;general\u0026rdquo; class of uncertainty which we do not explicitly model. For SISO systems, the classical gain and phase margins and the peaks of \\(S\\) and \\(T\\) provide useful robustness measures. For MIMO systems, normalized coprime factor uncertainty provides a good general class of uncertainty, and the associated Glover-McFlarlane \\(\\hinf\\) loop-shaping design procedure has proved itself very useful in applications We explicitly model and quantify the uncertainty in the plant and aim to make the system robust to this specific uncertainty. Potentially, it yields better designs, but it may require a much larger effort in terms of uncertainty modelling, especially if parametric uncertainty is consider. Analysis and in particular, synthesis using \\(\\mu\\) can be very involved In applications, it is therefore recommended to start with the first approach, at least for design. The robust stability and performance is then analyzed in simulations and using the structured singular value, for example, by considering first simple sources of uncertainty such as multiplicative input uncertainty. One then iterates between design and analysis until a satisfactory solution is obtained. If resulting control performance is not satisfactory, one may switch to the second approach.\nPractical \\(\\mu\\text{-synthesis}\\) in practice: Because of the effort involved in deriving detailed uncertainty descriptions, and the subsequent complexity in synthesizing controllers, the rule is to start simple with a crude uncertainty description, and then to see whether the performance specifications can be met. Only if they can\u0026rsquo;t, one should consider more detailed uncertainty descriptions such as parametric uncertainty The use of \\(\\mu\\) implies a worst-case analysis, so one should be careful about including too many sources of uncertainty, noise and disturbances - otherwise it becomes very unlikely for the worst case to occur, and the resulting analysis and design may be unnecessarily conservative There is always uncertainty with respect to the inputs and outputs, so it is generally sage to include diagonal input and output uncertainty. The relative multiplicative form is very convenient in this case \\(\\mu\\) is most commonly used for analysis. If \\(\\mu\\) is used for synthesis, then we recommend that you keep the uncertainty fixed and adjust the parameters in the performance weight until \\(\\mu\\) is close to 1 Controller Design \nTrade-offs in MIMO Feedback Design The shaping of multivariable transfer functions is based on the idea that a satisfactory definition of gain for a matrix transfer function is given by the singular values. By multivariable transfer function shaping, therefore, we mean the shaping of the singular values of appropriate specified transfer functions such as the loop transfer function of one or more closed-loop transfer functions.\nThe classical loop-shaping ideas can be further generalized to MIMO systems by considering the singular values.\nConsider the one degree-of-freedom system as shown in Fig. fig:classical_feedback_small. We have the following important relationships:\n\\begin{subequations} \\begin{align} y(s) \u0026amp;= T(s) r(s) + S(s) d(s) - T(s) n(s) \\\\\\\nu(s) \u0026amp;= K(s) S(s) \\big(r(s) - n(s) - d(s) \\big) \\end{align} \\end{subequations}\n\n Figure 38: One degree-of-freedom feedback configuration\n For disturbance rejection make \\(\\maxsv(S)\\) small For noise attenuation make \\(\\maxsv(T)\\) small For reference tracking make \\(\\maxsv(T) \\approx \\minsv(T) \\approx 1\\) For control energy reduction make \\(\\maxsv(KS)\\) small For robust stability in presence of an additive perturbation (\\(G_p = G + \\Delta\\)) make \\(\\maxsv(KS)\\) small For robust stability in presence of a multiplicative output perturbation (\\(G_p = (I + \\Delta) G\\)) make \\(\\maxsv(T)\\) small The closed-loop requirements cannot all be satisfied simultaneously. Feedback design is therefore a trade-off over frequency of conflicting objectives. This is not always as difficult as it sounds because the frequency range over which the objectives are important can be quite different.\nIn classical loop shaping, it is the magnitude of the open-loop transfer function \\(L = GK\\) which is shaped, whereas the above requirements are all in terms of closed-loop transfer functions. However, we have that \\[ \\minsv(L) - 1 \\le \\frac{1}{\\maxsv(S)} \\le \\minsv(L) + 1 \\] from which we see that \\(\\maxsv(S) \\approx 1/\\minsv(L)\\) at frequencies where \\(\\minsv(L)\\) is much larger than \\(1\\). Furthermore, from \\(T = L(I+L)^{-1}\\) it follows that \\(\\maxsv(T) \\approx \\maxsv(L)\\) at frequencies where \\(\\maxsv(L)\\) is much smaller than \\(1\\).\nThus, over specified frequency ranges, it is relatively easy to approximate the closed-loop requirements by open-loop objectives.\n For disturbance rejection make \\(\\minsv(GK)\\) large For noise attenuation make \\(\\maxsv(GK)\\) small For reference tracking make \\(\\minsv(GK)\\) large For control energy reduction make \\(\\maxsv(K)\\) small For robust stability in presence of an additive perturbation make \\(\\maxsv(K)\\) small For robust stability in presence of an multiplicative output perturbation make \\(\\maxsv(GK)\\) small Typically, the open-loop requirements 1 and 3 are valid and important at low frequencies \\(0 \\le \\omega \\le \\omega_l \\le \\omega_B\\), while conditions 2, 4, 5 and 6 are conditions which are valid and important at high frequencies \\(\\omega_B \\le \\omega_h \\le \\omega \\le \\infty\\), as illustrated in Fig. fig:design_trade_off_mimo_gk.\n\n Figure 39: Design trade-offs for the multivariable loop transfer function \\(GK\\)\n The control engineer must design \\(K\\) such that \\(\\minsv(GK)\\) lies above a performance boundary for all \\(\\omega\\) up to \\(\\omega_l\\), and such that \\(\\maxsv(GK)\\) lies below a robustness boundary for all \\(\\omega\\) above \\(\\omega_h\\).\nShaping the singular values of \\(GK\\) by selecting \\(K\\) is relatively easy task, but to do this in a way which also guarantees closed-loop stability is in general difficult as closed-loop stability cannot be determined from open-loop singular values.\nFor SISO systems, closed-loop stability is closely related to the open-loop roll-off rate from high to low gain at the crossover (which is in practice less than \\(\\SI{40}{\\decibel\\per dec}\\)). An immediate consequence of this is that there is a lower limit to the difference between \\(\\omega_h\\) and \\(\\omega_l\\).\nFor MIMO systems, a similar gain/phase relationship holds in the crossover frequency region, but this is in terms of roll-off rate of the magnitude of the eigenvalues of \\(GK\\) and not the singular values. The stability constraint is therefore more difficult to handle.\nLQG Control LQG control was developed and successfully applied for aerospace problems where accurate plants are available. For other control problems, it was not easy, and the assumption of white noise disturbance is not always relevant. As a result, LQG designs were sometimes not robust enough to be used in practice.\nIt is assumed that the plant dynamics are linear and known, and that the measurement noise and disturbance signals are stochastic with known statistical properties:\n\\begin{align*} \\dot{x} \u0026amp;= A x + B u + w_d \\\\\\\ny \u0026amp;= C x + D u + w_n \\end{align*}\nwith \\(w_d\\) and \\(w_n\\) are the disturbance and measurement noise which are assumed to be uncorrelated zero-mean Gaussian stochastic processes with constant power spectral density matrices \\(W\\) and \\(V\\) respectively.\n The LQG control problem is to find the optimal control \\(u(t)\\) that minimize: \\[J = E \\bigg\\{ \\lim_{T\\rightarrow \\infty} \\frac{1}{T} \\int_0^T \\big[ x^T Q x + u^T R u \\big] dt \\bigg\\} \\] Where \\(Q\\) and \\(R\\) are appropriately chosen constant weighting matrices (design parameters) such that \\(Q = Q^T \\ge 0\\) and \\(R = R^T \u0026gt; 0\\).\n The solution to the LQG problem, known as the Separation Theorem, is separated into two problems.\nIt consists of first determining the optimal control to a deterministic LQR problem (LQG without \\(w_d\\) and \\(w_n\\)). The solution to this problem is a state feedback law\n\\begin{equation} \\tcmbox{u(t) = -K_r x(t)} \\end{equation}\nwhere \\(K_r\\) is a constant matrix that can be easily computed.\nThe next step is to find an optimal estimate \\(\\hat{x}\\) of the state \\(x\\) so that \\(E \\big\\{ [x-\\hat{x}]^T [x-\\hat{x}] \\big\\}\\) is minimized. The optimal state estimate is given by a Kalman filter.\nThe solution to the LQG problem is then found by replacing \\(x\\) by \\(\\hat{x}\\) to give \\(u(t) = -K_r \\hat{x}\\).\nWe therefore see that the LQG problem and its solution can be separated into two distinct parts as illustrated in Fig. fig:lqg_separation: the optimal state feedback and the optimal state estimator (the Kalman filter).\n\n Figure 40: The separation theorem\n The LQR problem, where all the states are known is to find the input signal \\(u(t)\\) that takes the system \\(\\dot{x} = Ax+Bu\\) to the zero state (\\(x=0\\)) by minimizing the deterministic cost\n\\begin{equation} J_r = \\int_0^\\infty \\big( x(t)^T Q x(t) + u(t)^T R u(t) \\big) dt \\end{equation}\nThe optimal solution is \\(u=-K_r x(t)\\) with\n\\begin{equation} K_r = R^{-1} B^T X \\end{equation}\nand \\(X\\) is the unique positive-semi definite solution of the algebraic Riccati equation:\n\\begin{equation} A^T X + X A - XBR^{-1}B^TX + Q = 0 \\end{equation}\n The Kalman filter has the structure of an ordinary state-estimator, as shown on Fig. fig:lqg_kalman_filter, with:\n\\begin{equation} \\dot{\\hat{x}} = A\\hat{x} + Bu + K_f(y-C\\hat{x}) \\end{equation}\nThe optimal choice of \\(K_f\\), which minimize \\(E \\big\\{ [x-\\hat{x}]^T [x-\\hat{x}] \\big\\}\\) is given by\n\\begin{equation} K_f = Y C^T V^{-1} \\end{equation}\nWhere \\(Y\\) is the unique positive-semi definite solution of the algebraic Riccati equation\n\\begin{equation} YA^T + AY - YC^TV^{-1}CY + W = 0 \\end{equation}\n \n Figure 41: The LQG controller and noisy plant\n The structure of the LQG controller is illustrated in Fig. fig:lqg_kalman_filter, its transfer function from \\(y\\) to \\(u\\) is given by\n\\begin{align*} L_{\\text{LQG}}(s) \u0026amp;= \\left[ \\begin{array}{c|c} A - B K_r - K_f C \u0026amp; K_f \\ \\hline -K_r \u0026amp; 0 \\end{array} \\right] \\\\\\\n\u0026amp;= \\left[ \\begin{array}{c|c} A - B R^{-1} B^T X - Y C^T V^{-1} C \u0026amp; Y C^T V^{-1} \\ \\hline -R^{-1} B^T X \u0026amp; 0 \\end{array} \\right] \\end{align*}\nIt has the same degree (number of poles) as the plant.\nFor the LQG-controller, as shown on Fig. fig:lqg_kalman_filter, it is not easy to see where to position the reference input \\(r\\) and how integral action may be included, if desired. Indeed, the standard LQG design procedure does not give a controller with integral action. One strategy is illustrated in Fig. fig:lqg_integral. Here, the control error \\(r-y\\) is integrated and the regulator \\(K_r\\) is designed for the plant augmented with these integral states.\n\n Figure 42: LQG controller with integral action and reference input\n For an LQG-controller system with a combined Kalman filter and LQR control law, there are no guaranteed stability margins, and there exist LQG combinations with arbitrary small gain margins. However, there are procedures for improving robustness properties of LQG control such as Loop Transfer Recovery (LTR).\nThese procedure are somehow difficult to use in practice. Their main limitation is that they can only be applied to minimum phase plants.\n\\(\\htwo\\) and \\(\\hinf\\) Control \nGeneral Control Problem Formulation There are many ways in which feedback design problems can be cast as \\(\\htwo\\) and \\(\\hinf\\) optimization problems. It is very useful therefore to have a standard problem formulation into which any particular problem may be manipulated.\nSuch a general formulation is afforded by the general configuration shown in Fig. fig:general_control.\n\n Figure 43: General control configuration\n The system is described by\n\\begin{subequations} \\begin{align} \\colvec{z\\v} \u0026amp;= P(s) \\colvec{w\\u} = \\begin{bmatrix}P_{11}(s) \u0026amp; P_{12}(s)\\ P_{21}(s) \u0026amp; P_{22}(s) \\end{bmatrix} \\colvec{w\\u}\\\\\\\nu \u0026amp;= K(s) v \\end{align} \\end{subequations}\nWith a state space realization of the generalized plant \\(P\\) given by\n\\begin{equation} P = \\left[ \\begin{array}{c|cc} A \u0026amp; B_1 \u0026amp; B_2 \\\\\\\n\\hline C_1 \u0026amp; D_{11} \u0026amp; D_{12} \\\\\\\nC_2 \u0026amp; D_{21} \u0026amp; D_{22} \\end{array} \\right] \\end{equation}\nThe closed loop transfer function from \\(w\\) to \\(z\\) is given by the linear fractional transformation:\n\\begin{align*} z \u0026amp;= F_l(P, K) w \\\\\\\n\u0026amp;= [P_{11} + P_{12}K(I-P_{22}K)^{-1} P_{21}] w \\end{align*}\n\\(\\htwo\\) and \\(\\hinf\\) control involve the minimization of the \\(\\htwo\\) and \\(\\hinf\\) norms of \\(F_l(P, K)\\).\nThe most general and widely used algorithms for \\(\\htwo\\) and \\(\\hinf\\) control problems are based on the state space formulation and requires the solution of two Riccati equations.\nThe following assumptions are typically made in \\(\\htwo\\) and \\(\\hinf\\) problems:\n \\((A, B_2, C_2)\\) is stabilizable and detectable. This is required for the existence of stabilizing controllers \\(D_{12}\\) and \\(D_{21}\\) have full rank. This is sufficient to ensure that the controllers are proper \\(\\begin{bmatrix} A-j\\w I \u0026amp; B_2 \\ C_1 \u0026amp; D_{12} \\end{bmatrix}\\) and \\(\\begin{bmatrix} A-j\\w I \u0026amp; B_1 \\ C_2 \u0026amp; D_{21} \\end{bmatrix}\\) have respectively full column and full row rank for all \\(\\w\\). This ensures that the controller does not cancel poles or zeros in the imaginary axis which would result in closed-loop instability \\(D_{11} = 0\\) and \\(D_{22} = 0\\) is a conventional requirement for \\(\\htwo\\) control. This is not required for \\(\\hinf\\) control but this significantly simplify algorithm formulas \\(D_{12}^T C_1 = 0\\) and \\(B_1 D_{12}^T = 0\\) is common in \\(\\htwo\\) control. \\(D_{12}^T C_1 = 0\\) means that there is no cross terms in the cost function and \\(B_1 D_{12}^T = 0\\) that the process noise and measurement noise are uncorrelated \\((A, B_1)\\) is stabilizable and \\((A, C_1)\\) is detectable If the Matlab Robust Control Toolbox complains, then it probably means that the control problem is not well formulated and that some assumptions are not met.\n\\(\\hinf\\) algorithms, in general, find a sub-optimal controller. That is, for a specified \\(\\gamma\\) a stabilizing controller is found for which \\(\\hnorm{F_l(P,K)}\u0026lt;\\gamma\\). This contrasts with \\(\\htwo\\) theory, in which the optimal controller is unique and can be found from the solution of two Riccati equations.\n\\(\\htwo\\) Optimal Control The standard \\(\\htwo\\) optimal control problem is to find a stabilizing controller \\(K\\) which minimizes \\[\\normtwo{F(s)} = \\sqrt{\\frac{1}{2\\pi}\\int_{-\\infty}^{\\infty} tr[F(j\\w)F(j\\w)^H]d\\w }\\] With \\(F = F_l(P, K)\\).\n For a particular problem, the generalized plant \\(P\\) will include the plant model, the interconnection structure, and the designer specified weighting functions.\nThe \\(\\htwo\\) norm can be given different deterministic interpretations. It also has the following stochastic interpretation.\nSuppose in the general control configuration that the exogenous input \\(w\\) is white noise of unit density. That is \\[ E\\{w(t)w(\\tau)^T\\} = I \\delta(t-\\tau) \\]\nExpected power in the error signal \\(z\\) is then given by\n\\begin{align*} P_z \u0026amp;= E\\bigg\\{ \\lim_{T\\rightarrow\\infty} \\frac{1}{2T} \\int_{-T}^{T} z(t)^T z(t) dt \\bigg\\} \\\\\\\n\u0026amp;= \\text{tr}\\ E\\{z(t)z(t)^H\\}\\\\\\\n\u0026amp;= \\frac{1}{2\\pi} \\int_{-\\infty}^{\\infty}\\text{tr}\\left[F(j\\omega)F(j\\omega)^H\\right]d\\omega\\\\\\\n\u0026amp;= \\normtwo{F}^2 = \\normtwo{F_l(P,K)}^2 \\end{align*}\n Thus, by minimizing the \\(\\htwo\\) norm, the error power of the generalized system, due to a unit intensity white noise input, is minimized. We are minimizing the Root Mean Square value of \\(z\\).\n LQG: a Special \\(\\htwo\\) Optimal Controller An important special case of \\(\\htwo\\) optimal control is the LQG problem. For the stochastic system\n\\begin{align*} \\dot{x} \u0026amp;= A x + B u + w_d \\\\\\\ny \u0026amp;= Cx + w_n \\end{align*}\nwhere \\[ E \\left\\{ \\begin{bmatrix} w_d(t)\\w_n(t) \\end{bmatrix} \\begin{bmatrix} w_d(\\tau)^T \u0026amp; w_n(\\tau)^T \\end{bmatrix} \\right\\} = \\begin{bmatrix} W \u0026amp; 0 \\ 0 \u0026amp; V \\end{bmatrix} \\delta (t - \\tau) \\]\nThe LQG problem is to find \\(u = K(s) y\\) such that \\[ J = E \\left\\{ \\lim_{T\\to \\infty} \\frac{1}{T} \\int_0^T [x^T Q x + u^T R u] dt \\right\\} \\] is minimized with \\(Q = Q^T \\ge 0\\) and \\(R = R^T \u0026gt; 0\\).\nThis problem can be cast as an \\(\\htwo\\) optimization in the general framework in the following manner.\nDefine the error signal \\(z\\) as \\[ z = \\begin{bmatrix} Q^{\\frac{1}{2}} \u0026amp; 0 \\\\\\\n0 \u0026amp; R^{\\frac{1}{2}} \\end{bmatrix} \\begin{bmatrix} x \\ u \\end{bmatrix} \\]\nRepresent the stochastic inputs as \\[ \\begin{bmatrix} w_d \\ w_n \\end{bmatrix} = \\begin{bmatrix} W^{\\frac{1}{2}} \u0026amp; 0 \\\\\\\n0 \u0026amp; V^{\\frac{1}{2}} \\end{bmatrix} w \\] where \\(w\\) is a white noise process of unit density.\nThen the LQG cost function is \\[ K = E \\left\\{ \\lim_{T\\to \\infty} \\frac{1}{T} \\int_0^T z(t)^T z(t) dt \\right\\} = \\normtwo{F_l(P,K)}^2 \\]\n\\(\\hinf\\) Optimal Control With reference to the general control configuration on Fig. fig:general_control, the standard \\(\\hinf\\) optimal control problem is to find all stabilizing controllers \\(K\\) which minimize \\[ \\hnorm{F_l(P, K)} = \\max_{\\omega} \\maxsv\\big(F_l(P, K)(j\\omega)\\big) \\]\nThe \\(\\hinf\\) norm has several interpretations in terms of performance. One is that it minimizes the peak of the maximum singular value of \\(F_l(P(j\\omega), K(j\\omega))\\).\nIt also has a time domain interpretation as the worst-cast 2-norm:\n\\begin{equation} \\hnorm{F_l(P,K)} = \\max_{w(t)\\ne0} \\frac{\\normtwo{z(t)}}{\\normtwo{w(t)}} \\end{equation}\nwhere \\(\\normtwo{z(t)} = \\sqrt{\\int_0^\\infty \\sum_i \\abs{z_i}^2 dt}\\) is the 2-norm of the vector signal.\nIn practice, it is usually not necessary to obtain an optimal controller for the \\(\\hinf\\) problem, and it is simpler to design a sub-optimal one.\nLet \\(\\gamma_\\text{min}\\) be the minimum value of \\(\\hnorm{F_l(P,K)}\\) over all stabilizing controllers \\(K\\). Then the \\(\\hinf\\) sub-optimal control problem is: given a \\(\\gamma \u0026gt; \\gamma_\\text{min}\\), find all stabilizing controllers \\(K\\) such that\n\\begin{equation} \\hnorm{F_l(P, K)} \u0026lt; \\gamma \\end{equation}\nBy reducing \\(\\gamma\\) in an iterative way, an optimal solution is approached.\nGeneral \\(\\hinf\\) algorithm. For the general control configuration and with assumptions described above, there exists a stabilizing controller \\(K(s)\\) such that \\(\\hnorm{F_l(P,K)}\u0026lt;\\gamma\\) if and only if\n \\(X_\\infty \\ge 0\\) is a solution to the algebraic Riccati equation \\(A^T X_\\infty + X_\\infty A + C_1^T C_1 + X_\\infty (\\gamma^{-2} B_1 B_1^T - B_2 B_2^T)X_\\infty = 0\\) such that \\(\\text{Re } \\lambda_i \\left[ A + (\\gamma^{-2}B_1B_1^T - B_2B_2^T)X_\\infty \\right] \u0026lt; 0, \\ \\forall i\\) \\(Y_\\infty \\ge 0\\) is a solution to the algebraic Riccati equation \\(A Y_\\infty + Y_\\infty A^T + B_1 B_1^T + Y_\\infty (\\gamma^{-2} C_1^T C_1 - C_2^T C_2)Y_\\infty = 0\\) such that \\(\\text{Re } \\lambda_i \\left[ A + Y_\\infty(\\gamma^{-2}C_1^TC_1 - C_2^TC_2)Y_\\infty \\right] \u0026lt; 0, \\ \\forall i\\) \\(\\rho(X_\\infty Y_\\infty) \u0026lt; \\gamma^2\\) All such controllers are then given by \\(K = F_l(K_c, Q)\\) where\n\\begin{align*} K_c(s) \u0026amp;= \\left[ \\begin{array}{c|cc} A_\\infty \u0026amp; -Z_\\infty L_\\infty \u0026amp; Z_\\infty B_2 \\ \\hline F_\\infty \u0026amp; 0 \u0026amp; I \\\\\\\n-C_2 \u0026amp; I \u0026amp; 0 \\end{array} \\right], \\ L_\\infty = -Y_\\infty C_2^T \\\\\\\nF_\\infty \u0026amp;= -B_2^T X_\\infty, \\ Z_\\infty = (I - \\gamma^2 Y_\\infty X_\\infty)^{-1} \\\\\\\nA_\\infty \u0026amp;= A + \\gamma^{-2} B_1 B_1^T X_\\infty + B_2F_\\infty + Z_\\infty L_\\infty C_2 \\end{align*}\nand \\(Q(s)\\) is any stable proper transfer function such that \\(\\hnorm{Q} \u0026lt; \\gamma\\).\nFor \\(Q(s) = 0\\), we get\n\\begin{equation} K(s) = K_{c11}(s) = -Z_\\infty L_\\infty (s I - A_\\infty)^{-1} F_\\infty \\end{equation}\nThis is called the central controller and has the same number of states as the generalized plant \\(P(s)\\).\nThe central controller can be separated into a state estimator (observer) of the form \\[ \\dot{\\hat{x}} = A\\hat{x} + B_1 \\gamma^{-2} B_1^T X_\\infty \\hat{x} + B_2 u + Z_\\infty L_\\infty (C_2 \\hat{x} - y) \\] and a state feedback \\(u = F_\\infty \\hat{x}\\).\n If we desire a controller that achieves \\(\\gamma_\\text{min}\\), to within specified tolerance, then we can perform a bisection on \\(\\gamma\\) until its value is sufficiently accurate. The above conditions provide a test for each value of \\(\\gamma\\) to determine if \\(\\gamma\u0026lt;\\gamma_\\text{min}\\) or \\(\\gamma\u0026gt;\\gamma_\\text{min}\\).\n There are mainly two methodologies for \\(\\hinf\\) controller design: the transfer function shaping approach and the signal-based approach.\nIn the shaping approach, \\(\\hinf\\) optimization is used to shape the singular values of specified transfer functions over frequency. The maximum singular values are relatively easy to shape by forcing them to lie below user defined bounds, thereby ensuring desirable bandwidth and roll-off rates.\nIn the signal-based approach, we seek to minimize the energy in certain error signal given a set of exogenous input signals.\nA difficulty that sometimes arises with \\(\\hinf\\) control is the selection of weights such that the \\(\\hinf\\) optimal controller provides a good trade-off between conflicting objectives in various frequency ranges. Thus, for practical designs it is sometimes recommended to perform only a few iterations of the \\(\\hinf\\) algorithm. The justification for this is that the initial design, after one iteration, is similar to an \\(\\htwo\\) design which does trade-off over various frequency ranges. Therefore stopping the iterations before the optimal value is achieved gives the design an \\(\\htwo\\) flavor which may be desirable.\nMixed-Sensitivity \\(\\hinf\\) Control Mixed-sensitivity is the name given to transfer function shaping problems in which the sensitivity function \\(S = (I + GK)^{-1}\\) is shaped along with one or more other closed-loop transfer functions such as \\(KS\\) or \\(T = I - S\\).\nSuppose that we have a regulation problem in which we want to reject a disturbance \\(d\\) entering at the plant output and it is assumed that the measurement noise is relatively insignificant. It makes sense to shape the closed-loop transfer functions \\(S\\) and \\(KS\\). Recall that \\(S\\) is the transfer function between \\(d\\) and the output, and \\(KS\\) the transfer function from \\(d\\) and the control signal. It is important to include \\(KS\\) as a mechanism for limiting the size and bandwidth of the controller, and hence the energy used. The size of \\(KS\\) is also important for robust stability with respect to uncertainty modeled as additive plant perturbations.\nThe disturbance \\(d\\) is typically a low frequency signal, and therefore it will be successfully rejected if the maximum singular value of \\(S\\) is made small over the same low frequency range. To do this, we could select a scalar low pass filter \\(w_1(s)\\) with a bandwidth equal to that of the disturbance, and then find a stabilizing controller that minimizes \\(\\hnorm{w_1 S}\\). This cost function alone is not very practical, it focuses on just one closed-loop transfer function and the controller may have infinite gain. It is far more useful in practice to minimize\n\\begin{equation} \\hnorm{\\begin{matrix} w_1 S \\ w_2 KS \\end{matrix}} \\end{equation}\nwhere \\(w_2(s)\\) is a scalar high pass filter with a crossover frequency approximately equal to that of the desired closed-loop bandwidth.\nIn general, the scalar weighting functions \\(w_1(s)\\) and \\(w_2(s)\\) can be replaced by matrices \\(W_1(s)\\) and \\(W_2(s)\\). This can be useful for systems with channels of quite different bandwidths. In that case, diagonal weights are recommended as anything more complicated is usually not worth the effort.\nTo see how this mixed sensitivity problem can be formulated in the general setting, we can imagine the disturbance \\(d\\) as a single exogenous input and define and error signal \\(z = [z_1^T\\ z_2^T]^T\\), where \\(z_1 = W_1 y\\) and \\(z_2 = -W_2 u\\) as illustrated in Fig. fig:mixed_sensitivity_dist_rejection. We can then see that \\(z_1 = W_1 S w\\) and \\(z_2 = W_2 KS w\\) as required. The elements of the generalized plant are\n\\begin{equation*} \\begin{array}{ll} P_{11} = \\begin{bmatrix}W_1\\0\\end{bmatrix} \u0026amp; P_{12} = \\begin{bmatrix}W_1G\\-W_2\\end{bmatrix} \\\\\\\nP_{21} = -I \u0026amp; P_{22} = -G \\end{array} \\end{equation*}\n\n Figure 44: \\(S/KS\\) mixed-sensitivity optimization in standard form (regulation)\n Another interpretation can be put on the \\(S/KS\\) mixed-sensitivity optimization as shown in the standard control configuration of Fig. fig:mixed_sensitivity_ref_tracking. Here we consider a tracking problem. The exogenous input is a reference command \\(r\\), and the error signals are \\(z_1 = -W_1 e = W_1 (r-y)\\) and \\(z_2 = W_2 u\\). As the regulation problem of Fig. fig:mixed_sensitivity_dist_rejection, we have that \\(z_1 = W_1 S w\\) and \\(z_2 = W_2 KS w\\).\n\n Figure 45: \\(S/KS\\) mixed-sensitivity optimization in standard form (tracking)\n Another useful mixed sensitivity optimization problem, is to find a stabilizing controller which minimizes\n\\begin{equation} \\hnorm{\\begin{matrix} W_1 S \\ W_2 T \\end{matrix}} \\end{equation}\nThe ability to shape \\(T\\) is desirable for tracking problems and noise attenuation. It is also important for robust stability with respect to multiplicative perturbations at the plant output.\nThe \\(S/T\\) mixed-sensitivity minimization problem can be put into the standard control configuration as shown in Fig. fig:mixed_sensitivity_s_t.\nThe elements of the generalized plant are\n\\begin{equation*} \\begin{array}{ll} P_{11} = \\begin{bmatrix}W_1\\0\\end{bmatrix} \u0026amp; P_{12} = \\begin{bmatrix}-W_1G\\W_2G\\end{bmatrix} \\\\\\\nP_{21} = -I \u0026amp; P_{22} = -G \\\\\\\n\\end{array} \\end{equation*}\n\n Figure 46: \\(S/T\\) mixed-sensitivity optimization in standard form\n The shaping of closed-loop transfer functions as described above with the stacked cost functions becomes difficult with more than two functions whereas with two, the process is relatively easy. The bandwidth requirements on each are usually complementary and simple, stable low-pass and high-pass filters are sufficient to carry out the required shaping and trade-offs.\nThe weights \\(W_i\\) in mixed-sensitivity \\(\\hinf\\) optimal control must all be stable. Therefore, if we wish, for example, to emphasize the minimization of \\(S\\) at low frequency by weighting with a term including integral action, we would have to approximate \\(\\frac{1}{s}\\) by \\(\\frac{1}{s + \\epsilon}\\) where \\(\\epsilon \\ll 1\\). Similarly, one might be interested in weighting \\(KS\\) with a non-proper weight to ensure that \\(K\\) is small outside of the system bandwidth. The trick is to replace a non proper term such as \\((1 + \\tau_1 s)\\) by \\(\\frac{1 + \\tau_1 s}{1 + \\tau_2 s}\\) where \\(\\tau_2 \\ll \\tau_1\\).\nSignal-Based \\(\\hinf\\) Control The signal-based approach to controller design is very general and is appropriate for multivariable problems in which several objectives must be taken into account simultaneously. In this approach, we define the plant, possibly the model uncertainty, the class of external signals affecting the system and the norm of the error signals we want to keep small.\n The focus of attention has moved to the size of signals and away from the size and bandwidth of selected closed-loop transfer functions.\n Weights are used to describe the expected or known frequency content of exogenous signals and the desired frequency content of error signals. Weights are also used if a perturbation is used to model uncertainty, as in Fig. fig:input_uncertainty_hinf, where \\(G\\) represents the nominal model, \\(W\\) is a weighting function that captures the relative model fidelity over frequency, and \\(\\Delta\\) represents unmodelled dynamics usually normalized such that \\(\\hnorm{\\Delta} \u0026lt; 1\\).\n\n Figure 47: Multiplicative dynamic uncertainty model\n LQG control is a simple example of the signal based approach, in which the exogenous signals are assumed to be stochastic and the error signals are measured in terms of the 2-norm. As we have seen, the weights \\(Q\\) and \\(R\\) are constant, but LQG can be generalized to include frequency dependent weights on the signals leading to what is called Wiener-Hopf design or \\(\\htwo\\) control.\nWhen we consider a system\u0026rsquo;s response to persistent sinusoidal signals of varying frequency, or when we consider the induced 2-norm between the exogenous input signals and the error signals, we are required to minimize the \\(\\hinf\\) norm. In the absence of model uncertainty, there does not appear to be an overwhelming case for using the \\(\\hinf\\) norm rather than the more traditional \\(\\htwo\\) norm. However, when uncertainty is addressed, as it always should be, \\(\\hinf\\) is clearly the more natural approach using component uncertainty models as in Fig. fig:input_uncertainty_hinf.\nA typical problem using the signal-based approach to \\(\\hinf\\) control is illustrated in the interconnection diagram of Fig. fig:hinf_signal_based. \\(G\\) and \\(G_d\\) are nominal models of the plant and disturbance dynamics, and \\(K\\) is the controller to be designed. The weights \\(W_d\\), \\(W_r\\), and \\(W_n\\) may be constant or dynamic and describe the relative importance and/or the frequency content of the disturbance, set points and noise signals. The weight \\(W_\\text{ref}\\) is a desired closed-loop transfer function between the weighted set point \\(r_s\\) and the actual output \\(y\\). The weights \\(W_e\\) and \\(W_u\\) reflect the desired frequency content of the error \\((y-y_\\text{ref})\\) and the control signals \\(u\\), respectively. The problem can be cast as a standard \\(\\hinf\\) optimization in the general control configuration by defining\n\\begin{equation*} w = \\begin{bmatrix}d\\r\\n\\end{bmatrix},\\ z = \\begin{bmatrix}z_1\\z_2\\end{bmatrix}, \\ v = \\begin{bmatrix}r_s\\y_m\\end{bmatrix},\\ u = u \\end{equation*}\n\n Figure 48: A signal-based \\(\\hinf\\) control problem\n Suppose we now introduce a multiplicative dynamic uncertainty model at the input to the plant as shown in Fig. fig:hinf_signal_based_uncertainty. The problem we now want to solve is: find a stabilizing controller \\(K\\) such that the \\(\\hinf\\) norm of the transfer function between \\(w\\) and \\(z\\) is less that 1 for all \\(\\Delta\\) where \\(\\hnorm{\\Delta} \u0026lt; 1\\). We have assumed in this statement that the signal weights have normalized the 2-norm of the exogenous input signals to unity. This problem is a non-standard \\(\\hinf\\) optimization. It is a robust performance problem for which the \\(\\mu\\text{-synthesis}\\) procedure can be applied where we require the structured singular value: \\[ \\mu(M(j\\omega)) \u0026lt; 1, \\quad \\forall\\omega \\]\n\n Figure 49: A signal-based \\(\\hinf\\) control problem with input multiplicative uncertainty\n However, whilst the structured singular value is a useful analysis tool for assessing designs, \\(\\mu\\text{-synthesis}\\) is sometimes difficult to use and often too complex for the practical problems.\n\\(\\hinf\\) Loop-Shaping Design The loop-shaping design procedure described in this section is based on \\(\\hinf\\) robust stabilization combined with classical loop shaping. It is essentially a two stage design process:\n First the open-loop plant is augmented by pre and post compensators to give a desired shape to the singular values of the open-loop frequency response Then the resulting shaped plant is robustly stabilized with respect to coprime factor uncertainty using \\(\\hinf\\) optimization An important advantage is that no problem-dependent uncertainty modelling, or weight selection, is required in this second step.\nRobust Stabilization For multivariable systems, classical gain and phase margins are unreliable indicators of robust stability when defined for each channel (or loop), taken one at a time, because simultaneous perturbations in more than one loop are not then catered for.\nIt is now common practice to model uncertainty by stable norm-bounded dynamic (complex) matrix perturbations. With a single perturbation, the associated robustness tests is in terms of the maximum singular values of various closed-loop transfer functions. Use of a single stable perturbation restricts the plant and perturbed plant models to either have the same number of unstable poles or the same number of RHP zeros.\nTo overcome this, two stable perturbations can be used, one on each of the factors in a coprime factorization of the plant. Although this uncertainty description seems unrealistic and less intuitive than the others, it is in fact quite general, and for our purposes it leads to a very useful \\(\\hinf\\) robust stabilization problem.\nLet\u0026rsquo;s consider the stabilization of a plant \\(G\\) which has a normalized left coprime factorization\n\\begin{equation} G = M^{-1} N \\end{equation}\nwhere we have dropped the subscripts from \\(M\\) and \\(N\\) for simplicity.\nA perturbed plant model \\(G_p\\) can then we written has\n\\begin{equation} G_p = (M + \\Delta_M)^{-1} (N + \\Delta_N) \\end{equation}\nwhere \\(\\Delta_M\\), \\(\\Delta_N\\) are stable unknown transfer functions which represent the uncertainty in the nominal plant \\(G\\).\nThe objective of robust stabilization is to stabilize not only the nominal model \\(G\\), but a family of perturbed plants defined by\n\\begin{equation} G_p = \\{ (M + \\Delta_M)^{-1} (N + \\Delta_N) \\ :\\ \\hnorm{\\Delta_N\\ \\Delta_M} \u0026lt; \\epsilon \\} \\end{equation}\nwhere \\(\\epsilon \u0026gt; 0\\) is then the stability margin.\nFor the perturbed feedback system of Fig. fig:coprime_uncertainty_bis, the stability property is robust if and only if the nominal feedback system is stable and \\[ \\gamma \\triangleq \\hnorm{\\begin{bmatrix}K \\ I\\end{bmatrix} (I - GK)^{-1} M^{-1}} \\le \\frac{1}{\\epsilon} \\]\nNotice that \\(\\gamma\\) is the \\(\\hinf\\) norm from \\(\\phi\\) to \\(\\begin{bmatrix}u\\y\\end{bmatrix}\\) and \\((I-GK)^{-1}\\) is the sensitivity function for this positive feedback arrangement.\n\n Figure 50: \\(\\hinf\\) robust stabilization problem\n The lowest achievable value of \\(\\gamma\\) and the corresponding maximum stability margin \\(\\epsilon\\) are given as\n\\begin{equation} \\gamma_\\text{min} = \\epsilon_{\\text{max}}^{-1} = \\left\\{ 1 - \\|N \\ M\\|_H^2 \\right\\}^{-\\frac{1}{2}} = (1 + \\rho(XZ))^{\\frac{1}{2}} \\end{equation}\nwhere \\(\\|\\ \\cdot\\ \\|_H\\) denotes Hankel norm, \\(\\rho\\) denotes the spectral radius (maximum eigenvalue), and for a minimal state space realization of G, Z is the unique positive definite solution of the algebraic Riccati equation\n\\begin{align*} (A - BS^{-1} D^TC)Z \u0026amp;+ Z(A - BS^{-1}D^TC)^T \\\\\\\n\u0026amp;- ZC^TR^{-1}CZ + BS^{-1}B^T = 0 \\end{align*}\nwhere \\[ R = I + D D^T, \\quad S = I + D^T D \\] \\(X\\) is the unique positive definite solution of the following algebraic Riccati equation\n\\begin{align*} (A - BS^{-1} D^T C)X \u0026amp;+ X(A - BS^{-1}D^TC)^T \\\\\\\n\u0026amp;- XBS^{-1} B^T X + C^TR^{-1}C = 0 \\end{align*}\nA controller which guarantees that \\[ \\hnorm{ \\begin{bmatrix}K\\I\\end{bmatrix} (I-GK)^{-1} M^{-1} } \\le \\gamma \\] for a specified \\(\\gamma \u0026gt; \\gamma_\\text{min}\\), is given by\n\\begin{subequations} \\begin{align} K \u0026amp;\\triangleq \\left[ \\begin{array}{c|c} {\\scriptstyle A + BF + \\gamma^2L^{-T} Z C^T(C + DF)} \u0026amp; {\\scriptstyle \\gamma^2L^{-T} Z C^T} \\ \\hline {\\scriptstyle B^T X} \u0026amp; {\\scriptstyle -D^T} \\end{array} \\right] \\label{eq:control_coprime_factor} \\\\\\\nF \u0026amp;= -S^{-1}(D^T C + B^T X)\\\\\\\nL \u0026amp;= (1-\\gamma^2) I + XZ \\end{align} \\end{subequations}\nThe Matlab function coprimeunc can be used to generate the controller in \\eqref{eq:control_coprime_factor}. It is important to emphasize that since we can compute \\(\\gamma_\\text{min}\\) from \\eqref{eq:gamma_min_coprime} we get an explicit solution by solving just two Riccati equations and avoid the \\(\\gamma\\text{-iteration}\\) needed to solve the general \\(\\mathcal{H}_\\infty\\) problem.\nA Systematic \\(\\hinf\\) Loop-Shaping Design Procedure Robust stabilization alone is not much used in practice because the designer is not able to specify any performance requirements.\nTo do so, pre and post compensators are used to shape the open-loop singular values prior to robust stabilization of the \u0026ldquo;shaped\u0026rdquo; plant.\nIf \\(W_1\\) and \\(W_2\\) are the pre and post compensators respectively, then the shaped plant \\(G_s\\) is given by\n\\begin{equation} G_s = W_2 G W_1 \\end{equation}\nas shown in Fig. fig:shaped_plant.\n\n Figure 51: The shaped plant and controller\n The controller \\(K_s\\) is synthesized by solving the robust stabilization problem for the shaped plant \\(G_s\\) with a normalized left coprime factorization \\(G_s = M_s^{-1}N_s\\). The feedback controller for the plant \\(G\\) is then \\(K = W_1 K_s W_2\\).\nSystematic procedure for \\(\\hinf\\) loop-shaping design:\n Scale the plant outputs and inputs. This is very important for most design procedures. In general, scaling improves the conditioning of the design problem, it enables meaningful analysis to be made of the robustness properties of the feedback system in the frequency domain, and for loop shaping it can simplify the selection of weights: The outputs are scaled such that equal magnitudes of cross-coupling into each of the outputs is equally undesirable Each input is scaled by a given percentage (say \\(\\SI{10}{%}\\)) of its expected range of operation. That is, the inputs are scaled to reflect the relative actuator capabilities. Order the inputs and outputs so that the plant is as diagonal as possible. The relative gain array can be useful here. The purpose of this pseudo-diagonalization is to ease the design of the pre and post compensators which, for simplicity, will be chosen to be diagonal. Next, we discuss the selection of weights to obtain the shaped plant \\(G_s = W_2 G W_1\\) where \\(W_1 = W_p W_a W_g\\) Select the elements of diagonal pre and post compensators \\(W_p\\) and \\(W_2\\) so that the singular values of \\(W_2 G W_p\\) are desirable. This would normally mean high gain at low frequencies, a slope of about \\(-1\\) at the desired bandwidth(s), with higher rates at high frequencies. The weights should be chosen so that no unstable hidden modes are created in \\(G_s\\) \\(W_2\\) is usually chosen as a constant, reflecting the relative importance of the outputs to be controlled and the other measurements being fed back to the controller \\(W_p\\) contains the dynamic shaping. Integral action, for low frequency performance; phase-advance for reducing the roll-off rates at crossover; and phase-lag to increase the roll-off rates at high frequencies should all be places in \\(W_p\\) is desired Optional: Align the singular values at a desired bandwidth using a further constant weight \\(W_a\\) cascaded with \\(W_p\\) Optional: Introduce an additional gain matrix \\(W_g\\) cascaded with \\(W_a\\) to provide control over actuator range. \\(W_g\\) is diagonal and is adjusted so that actuator rate limits are not exceeded for reference demands and typical disturbances on the scaled plant outputs Robustly stabilize the shaped plant \\(G_s = W_2 G W_1\\) where \\(W_1 = W_p W_a W_g\\) First, calculate the maximum stability margin \\(\\epsilon_{\\text{max}} = 1/\\gamma_\\text{min}\\) If the margin is too small, \\(\\epsilon_{\\text{max}} \u0026lt; 0.25\\), then go back to step 4 and modify the weights. Otherwise, select \\(\\gamma \u0026gt; \\gamma_\\text{min}\\), by about \\(\\SI{10}{%}\\), and synthesize a sub-optimal controller. There is usually no advantage to be gained by using the optimal controller When \\(\\epsilon_{\\text{max}} \u0026gt; 0.25\\) (respectively \\(\\gamma_\\text{min} \u0026lt; 4\\)) the design is usually successful. In this case, at least \\(\\SI{25}{%}\\) coprime factor uncertainty is allowed, and we also find that the shape of the open-loop singular values will not have changed much after robust stabilization A small value of \\(\\epsilon_{\\text{max}}\\) indicates that the chosen singular value loop-shapes are incompatible with robust stability requirements Analyze the design and if not all the specification are met, make further modifications to the weights Implement the controller. The configuration shown in Fig. fig:shapping_practical_implementation has been found useful when compared with the conventional setup in Fig. fig:classical_feedback_small. This is because the references do not directly excite the dynamics of \\(K_s\\), which can result in large amounts of overshoot. The constant prefilter ensure a steady-state gain of \\(1\\) between \\(r\\) and \\(y\\), assuming integral action in \\(W_1\\) or \\(G\\) \n Figure 52: A practical implementation of the loop-shaping controller\n We will conclude this section with a summary of the advantages offered by the above \\(\\hinf\\) loop-shaping design procedure:\n It is relatively easy to use, being based on classical loop-shaping ideas There exists a closed formula for the \\(\\hinf\\) optimal cost \\(\\gamma_\\text{min}\\), which in turn corresponds to a maximum stability margin \\(\\epsilon_{\\text{max}} = 1/\\gamma_\\text{min}\\) No \\(\\gamma\\text{-iteration}\\) is required in the solution Except for special systems, ones with all-pass factors, there are no pole-zero cancellations between the plant and controller. Pole-zeros cancellations are common in many \\(\\hinf\\) control problems and are a problem when the plant has lightly damped modes Two Degrees-of-freedom Controllers Many control design problems possess two degrees-of-freedom:\n on one hand, measurement of feedback signals and on the other hand, commands and reference Sometimes, one degree-of-freedom is left out of the design, and the controller is driven by an error signal i.e. the difference between a command and the output. But in cases where stringent time-domain specifications are set on the output response, a one degree-of-freedom structure may not be sufficient.\nA general two degrees-of-freedom feedback control scheme is depicted in Fig. fig:classical_feedback_2dof_simple. The commands and feedbacks enter the controller separately and are independently processed.\n\n Figure 53: General two degrees-of-freedom feedback control scheme\n The presented \\(\\mathcal{H}_\\infty\\) loop-shaping design procedure in section sec:hinf_loop_shaping_procedure is a one-degree-of-freedom design, although a constant pre-filter can be easily implemented for steady-state accuracy. However, this may not be sufficient and a dynamic two degrees-of-freedom design is required.\nThe design problem is illustrated in Fig. fig:coprime_uncertainty_hinf. The feedback part of the controller \\(K_2\\) is designed to meet robust stability and disturbance rejection requirements. A prefilter is introduced to force the response of the closed-loop system to follow that of a specified model \\(T_{\\text{ref}}\\), often called the reference model.\n\n Figure 54: Two degrees-of-freedom \\(\\mathcal{H}_\\infty\\) loop-shaping design problem\n The design problem is to find the stabilizing controller \\(K = [K_1,\\ K_2]\\) for the shaped plant \\(G_s = G W_1\\), with a normalized coprime factorization \\(G_s = M_s^{-1} N_s\\), which minimizes the \\(\\mathcal{H}_\\infty\\) norm of the transfer function between the signals \\([r^T\\ \\phi^T]^T\\) and \\([u_s^T\\ y^T\\ e^T]^T\\) as defined in Fig. fig:coprime_uncertainty_hinf. This problem is easily cast into the general configuration.\nThe control signal to the shaped plant \\(u_s\\) is given by: \\[ u_s = \\begin{bmatrix} K_1 \u0026amp; K_2 \\end{bmatrix} \\begin{bmatrix} \\beta \\ y \\end{bmatrix} \\] where \\(K_1\\) is the prefilter, \\(K_2\\) is the feedback controller, \\(\\beta\\) is the scaled reference and \\(y\\) is the measured output. The purpose of the prefilter is to ensure that: \\[ \\left\\| (I - G_s K_2)^{-1} G_s K_1 - T_{\\text{ref}} \\right\\|_\\infty \u0026lt; \\gamma \\rho^2 \\] \\(T_{\\text{ref}}\\) is the desired closed-loop transfer function and \\(\\rho\\) is a scalar parameter that the designer can increase to place more emphasis on model matching in the optimization at the expense of robustness.\nThe main steps required to synthesize a two degrees-of-freedom \\(\\mathcal{H}_\\infty\\) loop-shaping controller are:\n Design a one degree-of-freedom \\(\\mathcal{H}_\\infty\\) loop-shaping controller (section sec:hinf_loop_shaping_procedure) but without a post-compensator \\(W_2\\) Select a desired closed-loop transfer function \\(T_{\\text{ref}}\\) between the commands and controller outputs Set the scalar parameter \\(\\rho\\) to a small value greater than \\(1\\); something in the range \\(1\\) to \\(3\\) will usually suffice For the shaped \\(G_s = G W_1\\), the desired response \\(T_{\\text{ref}}\\), and the scalar parameter \\(\\rho\\), solve the standard \\(\\mathcal{H}_\\infty\\) optimization problem to a specified tolerance to get \\(K = [K_1,\\ K_2]\\) Replace the prefilter \\(K_1\\) by \\(K_1 W_i\\) to give exact model-matching at steady-state. Analyze and, if required, redesign making adjustments to \\(\\rho\\) and possibly \\(W_1\\) and \\(T_{\\text{ref}}\\) The final two degrees-of-freedom \\(\\mathcal{H}_\\infty\\) loop-shaping controller is illustrated in Fig. fig:hinf_synthesis_2dof.\n\n Figure 55: Two degrees-of-freedom \\(\\mathcal{H}_\\infty\\) loop-shaping controller\n Observer-Based Structure for \\(\\hinf\\) Loop-Shaping Controllers \\(\\mathcal{H}_\\infty\\) designs exhibit an observer/state feedback structure in the controller. The clear structure of the \\(\\mathcal{H}_\\infty\\) loop-shaping controllers has several advantages:\n It is helpful in describing a controller\u0026rsquo;s function It lends itself to implementation in a gain-schedule scheme If offers computational savings in digital implementations Let\u0026rsquo;s assume that the shaped plant is strictly proper, with a stabilizable and detectable state space realization \\[ G_s \\triangleq \\left[ \\begin{array}{c|c} A_s \u0026amp; B_s \\ \\hline C_s \u0026amp; 0 \\end{array} \\right] \\]\nThe single degree-of-freedom \\(\\mathcal{H}_\\infty\\) loop-shaping controller can be realized as an observer for the shaped plant plus a state feedback control law:\n\\begin{align*} \\dot{\\hat{x}}_s \u0026amp;= A_s \\hat{x}_s + H_s(C_s \\hat{x}_s - y_s) + B_s u_s \\\\\\\nu_s \u0026amp;= K_s \\hat{x}_s \\end{align*}\nwhere \\(\\hat{x}_s\\) is the observer state, \\(u_s\\) and \\(y_s\\) are respectively the input and output of the shaped plant, and\n\\begin{align*} H_s \u0026amp;= -Z_s C_s^T \\\\\\\nK_s \u0026amp;= -B_s^T [I - \\gamma^{-2}I - \\gamma^{-2} X_s Z_s]^{-1} X_s \\end{align*}\nwhere \\(Z_s\\) and \\(X_s\\) are the appropriate solutions to the generalized algebraic Riccati equations for \\(G_s\\).\nThe same can be done for two degrees-of-freedom controllers.\nImplementation Issues Discrete-time controllers For implementation purposes, discrete-time controllers are usually required. These can be obtained from a continuous-time design using a bilinear transformation from the \\(s\\text{-domain}\\) to the \\(z\\text{-domain}\\), but there can be advantages in being able to design directly in discrete time.\nAnti-windup In \\(\\hinf\\) loop-shaping the pre compensator weight \\(W_1\\) would normally include integral action in order to reject low frequency disturbances acting on the system. However, in the case of actuator saturation, the integrators continue to integrate their input and hence cause windup problems. An anti-windup scheme is therefore required on the weighting function \\(W_1\\). The approach we recommend is to implement the weight \\(W_1\\) in its self-conditioned or Hanus form. Let the weight \\(W_1\\) have a realization \\[ W_1 \\triangleq \\left[ \\begin{array}{c|c} A_w \u0026amp; B_w \\ \\hline C_w \u0026amp; D_w \\end{array} \\right] \\] and let \\(u\\) be the input to the plant actuators and \\(u_s\\) the input to the shaped plant. Then \\(u = W_1 u_s\\). When implemented in Hanus form, the expression for \\(u\\) becomes \\[ u = \\left[ \\begin{array}{c|cc} A_w - B_wD_w^{-1}C_w \u0026amp; 0 \u0026amp; B_wD_w^{-1} \\ \\hline C_w \u0026amp; D_w \u0026amp; 0 \\end{array} \\right] \\begin{bmatrix} u_s \\ u_a \\end{bmatrix} \\] where \\(u_a\\) is the actual plant input, that is the measurement at the output of the actuators which therefore contains information about possible actuator saturation.\nThe situation is illustrated in Fig. fig:weight_anti_windup, where the actuators are each modeled by a unit gain and a saturation.\n\n Figure 56: Self-conditioned weight \\(W_1\\)\n The Hanus form prevents windup by keeping the states of \\(W_1\\) consistent with the actual plant input at all times. When there is no saturation, \\(u_a=u\\), the dynamics of \\(W_1\\) remains unaffected. But when \\(u_a\\neq u\\), the dynamics are inverted and driven by \\(u_a\\) so that the states remain consistent with the actual plant input \\(u_a\\). Notice that such an implementation requires \\(W_1\\) to be invertible and minimum phase.\nBumpless transfer When multi-mode switched controller is designed, one should ensure smooth transition from one controller to the other (bumpless transfer). It was found useful to condition the reference models and the observers in each of the controllers. When on-line, the observer state evolves according to \\[ \\dot{\\hat{x}}_s = A_s \\hat{x}_s + H_s (C_s \\hat{x}_s - y_s) + B_s u_s \\] but when off-line, the state equation becomes \\[ \\dot{\\hat{x}}_s = A_s \\hat{x}_s + H_s (C_s \\hat{x}_s - y_s) + B_s u_{as} \\] where \\(u_{as}\\) is the actual input to the shaped plant governed by the on-line controller.\nDoing so ensure that the inputs to the shaped plant for the off-line controller follows the actual shaped plant input \\(u_{as}\\) given by the on-line controller. The observer based structure of the \\(\\mathcal{H}_\\infty\\) loop-shaping controller is then helpful for such technique.\nConclusion Several methods and techniques for controller design have been described. The emphasis has been on \\(\\hinf\\) loop shaping which is easy to apply and works well in practice. It combines classical loop-shaping ideas with an effective method for robustly stabilizing the feedback loop.\nFor complex problems, such as unstable plants with multiple gain crossover frequencies, it may not be easy to decide on a desired loop shape. In which case, we would suggest doing an initial LQG design (with simple weights) and using the resulting loop shape as the desired one for the \\(\\hinf\\) loop shaping.\nAnd alternative to \\(\\hinf\\) loop shaping is a standard \\(\\hinf\\) design with a stacked cost function such as in \\(S/KS\\) mixed-sensitivity optimization. In this approach, \\(\\hinf\\) optimization is used to shape two or sometimes three closed-loop transfer functions. However, with more functions, the shaping becomes increasingly difficult for the designer.\nIn other design situations where there are several performance objectives, it may be more appropriate to follow a signal-based \\(\\htwo\\) or \\(\\hinf\\) approach. But again, the problem formulations become so complex that the designer has little direct influence on the design.\nAfter a design, the resulting controller should be analyzed with respect to robustness and tested using nonlinear simulations. For the study of robustness, we recommend \\(\\mu\\text{-analysis}\\). If the design is not robust, then the weights should be modified. Sometimes, one might consider synthesizing a \\(\\mu\\text{-optimal}\\) controller, but this complexity is rarely necessary in practice. Moreover, one should be careful about combining controller synthesis and analysis into a single step.\nController Structure Design \nIntroduction In previous sections, we considered the general problem formulation in Fig. fig:general_control_names_bis and stated that the controller design problem is to find a controller \\(K\\) which based on the information in \\(v\\), generates a control signal \\(u\\) which counteracts the influence of \\(w\\) on \\(z\\), thereby minimizing the closed loop norm from \\(w\\) to \\(z\\).\n\n Figure 57: General Control Configuration\n In this chapter we are concerned with the structural decisions associated with the following selection tasks of control structure design:\n Controlled outputs: What are the variables \\(z\\)? Manipulations and measurements: What are the variable set \\(u\\) and \\(v\\)? Control configuration: What is the structure of \\(K\\)? Controller type: What algorithm is used for \\(K\\)? The distinction between the words under control structure and control configuration are significant. The control structure refers to all structural decisions included in the design of a control system. On the other hand, the control configuration refers only to the structuring of the controller \\(K\\) itself.\nIdeally, the tasks involved in designing a complete control system are performed sequentially; first a \u0026ldquo;top down\u0026rdquo; selection of controller outputs, measurements and inputs, and then a \u0026ldquo;bottom up\u0026rdquo; design of the control system in which the selection of the control configuration is the most important decision. However, in practice the tasks are closely related so the procedure may involve iteration.\nOne important reason for decomposing the control system into a specific control configuration is that it may allow for simple tuning of the sub-controllers without the need for a detailed plant model describing the dynamics and interactions in the process. Multivariable centralized controllers may always outperform decomposed (decentralized) controllers, bus this performance gain must be traded off against the cost of obtaining and maintaining a sufficiently detailed plant model.\nThe number of possible control structure is usually very large. Fortunately, we can often from physical insight obtain a reasonable choice of controlled outputs, measurements and manipulated inputs.\nOptimization and Control The selection of controlled outputs involves selecting the variables \\(y\\) to be controlled at given reference values \\(y \\approx r\\). The reference value \\(r\\) is usually set at some higher layer in the control hierarchy which is often divided into two layers:\n Optimization layer: computes the desired reference commands \\(r\\) Control layer: implements these commands to achieve \\(y \\approx r\\) Additional layers are possible, as is illustrated in Fig. fig:control_system_hierarchy which shows a typical control hierarchy for a chemical plant.\n\n Figure 58: Typical control system hierarchy in a chemical plant\n In general, the information flow in such a control hierarchy is based on the higher layer sending reference values (setpoints) to the layer below reporting back any problems achieving this (see Fig. fig:optimize_control_b). There is usually a time scale separation between the layers which means that the setpoints, as viewed from a given layer, are updated only periodically.\nThe optimization tends to be performed open-loop with limited use of feedback. On the other hand, the control layer is mainly based on feedback information. The optimization is often based on nonlinear steady-state models, whereas we often use linear dynamic models in the control layer.\nFrom a theoretical point of view, the optimal performance is obtained with a centralized optimizing controller, which combines the two layers of optimizing and control (see Fig. fig:optimize_control_c). All control actions in such an ideal control system would be perfectly coordinated and the control system would use on-line dynamic optimization based on nonlinear dynamic model of the complete plant. However, this solution is normally not used for a number a reasons, included the cost of modeling, the difficulty of controller design, maintenance, robustness problems and the lack of computing power.\n\nTable 6: Alternative structures for optimization and control Open loop optimization Closed-loop implementation with separate control layer Integrated optimization and control Selection of Controlled Outputs A controlled output is an output variable (usually measured) with an associated control objective (usually a reference value). In many cases, it is clear from a physical understanding of the process what the controlled outputs should be. In other cases, it is less obvious because each control objective may not be associated with a measured output variable.\nIn the following, we let \\(y\\) denote the selected controller outputs in the control layer. Two distinct questions arise:\n What variables \\(y\\) should be selected? What is the optimal reference value \\(y_\\text{opt}\\)? For the first problem, we make the following assumptions:\n The overall goal can be quantified in terms of a scalar cost function \\(J\\) which we want to minimize For a given disturbance \\(d\\), there exists an optimal value \\(u_\\text{opt}(d)\\) and corresponding value \\(y_\\text{opt}(d)\\) which minimizes the cost function \\(J\\) The reference values \\(r\\) for the controlled outputs \\(y\\) should be constant, i.e. \\(r\\) should be independent of the disturbances \\(d\\) The system behavior is a function of the independent variables \\(u\\) and \\(d\\): \\(J = J(u, d)\\). For a given disturbance \\(d\\) the optimal value of the cost function is\n\\begin{equation} J_\\text{opt}(d) \\triangleq J(u_\\text{opt}, d) = \\min_u J(u, d) \\end{equation}\nIn practice \\(u \\neq u_\\text{opt}\\), and we have a loss which can be quantified by \\(L = J - J_\\text{opt}\\). A reasonable objective for selecting controlled outputs \\(y\\) is to minimize some norm of the loss, for instance the worst-case loss:\n\\begin{equation} \\Phi \\triangleq \\max_{d \\in \\mathcal{D}} |\\underbrace{J(u, d) - J(u_\\text{opt}, d)}_{L}| \\end{equation}\nwhere \\(\\mathcal{D}\\) is the set of possible disturbances.\nDirect Evaluation of Cost The \u0026ldquo;brute force\u0026rdquo; approach for selecting controlled variables is to evaluate the loss for alternative sets of controlled variable. By solving the non linear equations, we evaluate directly the cost function \\(J\\) for various disturbances \\(d\\). The set of controlled outputs with smallest worst case or average value of \\(J\\) is then preferred. This approach may be time consuming because the solution of the nonlinear equations must be repeated for each candidate set of controlled outputs.\nLinear Analysis Consider the loss \\(L = J(u,d) - J_\\text{opt}(d)\\) where \\(d\\) is a fixed disturbance. We make the following additional assumptions:\nThe cost function \\\\(J\\\\) is smooth (twice differentiable) The optimization problem is unconstrained. If it is optimal to keep some variable at a constant, then we assume that this is implemented and consider the remaining unconstrained problem The dynamics of the problem can be neglected, that is, **we consider the steady-state control and optimization** For a fixed \\(d\\) we may express \\(J(u, d)\\) in terms of a Taylor series expansion in \\(u\\) around the optimal point. By neglecting terms of third order and higher, we obtain: \\[ J(u, d) = J_\\text{opt}(d) + \\frac{1}{2} (u - u_\\text{opt}(d))^T \\left(\\frac{\\partial^2 J}{\\partial u^2}\\right)_\\text{opt} (u - u_\\text{opt}(d)) \\] This quantifies how \\(u-u_\\text{opt}\\) affects the cost function. For a fixed \\(d\\), we have: \\(y - y_\\text{opt} = G (u - u_\\text{opt})\\) where \\(G\\) is the steady state gain matrix. Thus, we get: \\[ J - J_\\text{opt} \\approx \\frac{1}{2} \\big(G^{-1}(y-y_\\text{opt})\\big)^T \\left(\\frac{\\partial^2 J}{\\partial u^2}\\right)_\\text{opt} G^{-1} (y - y_\\text{opt}) \\]\nWe conclude that we should select \\(y\\) such that:\n \\(G^{-1}\\) is small: the inputs have a large effect on \\(y\\) \\(e_\\text{opt} = r - y_\\text{opt}(d)\\) is small: its optimal value \\(y_\\text{opt}(d)\\) depends only weakly on the disturbances and other changes \\(e = y - r\\) is small: it is easy to keep the control error \\(e\\) small Note that \\(\\bar{\\sigma}(G^{-1}) = 1/\\underline{\\sigma}(G)\\) and so we want the smallest singular value of the steady state gain matrix to be large.\nAs this depends of scaling, we should first scale the outputs such that the expected magnitude of \\(y_i - y_{i_\\text{opt}}\\) is similar in magnitude for each output, and scale the inputs such that the effect of a given deviation \\(u_j - u_{j_\\text{opt}}\\) on the cost function \\(J\\) is similar for each input.\n The use of the minimum singular value to select controlled outputs may be summarized in the following procedure:\n From a (nonlinear) model compute the optimal parameters (inputs and outputs) for various conditions (disturbances, operating points). This yields a \u0026ldquo;look-up\u0026rdquo; table for optimal parameter values as a function of the operating conditions From this data, obtain for each candidate output the variation in its optimal value \\[ v_i = \\frac{(y_{i_{\\text{opt,max}}} - y_{i_{\\text{opt,min}}})}{2} \\] Scale the candidate outputs such that for each output the sum of the magnitudes of \\(v_i\\) and the control error (\\(e_i\\), including measurement noise \\(n_i\\)) is similar (e.g. \\(|v_i| + |e_i| = 1\\)) Scale the inputs such that a unit deviation in each input from its optimal value has the same effect on the cost function \\(J\\) Select as candidates those sets of controlled outputs which corresponds to a large value of \\(\\underline{\\sigma}(G)\\). \\(G\\) is the transfer function for the effect of the scaled inputs on the scaled outputs Summary Generally, the optimal values of all variables will change with time during operation. If the loss imposed by keeping constant setpoints is acceptable, then we have self-optimizing control. The objective of the control layer is then to keep the controlled outputs at their reference values (which are computed by the optimization layer).\nThe controlled outputs are often measured, but we may also estimated their values based on other measured variables. We may also use other measurements to improve the control of the controlled outputs, for example, by use of cascade control. Thus, the selection of controlled and measured outputs are two separate issues.\nSelection of Manipulations and Measurements We are here concerned with the variable sets \\(u\\) and \\(v\\) in Fig. fig:general_control_names_bis. Note that the measurements \\(v\\) used by the controller are in general different from the controlled variables \\(z\\) because we may not be able to measure all the controlled variables and we may want to measure and control additional variables in order to:\n Stabilize the plant, or more generally change its dynamics Improve local disturbance rejection Stabilization We usually start of controller design by designing a lower-layer controller to stabilize the plant. The issue is then: which outputs and inputs should be used for stabilization? A reasonable objective is to minimize the required input usage of the stabilizing control system.\nLocal disturbance rejection For measurements, the rule is generally to select those which have a strong relationship with the controlled outputs, or which may quickly detect a major disturbance.\nThe selected manipulations should have a large effect on the controlled outputs and should be located \u0026ldquo;close\u0026rdquo; (in terms of dynamic response) to the outputs and measurements.\nTo evaluate the combinations of manipulations and measurements, one may perform an input-output controllability analysis for each combination (e.g. consider the minimum singular values, RHP-zeros, interactions, etc). A more involved approach would be to perform a achievable robust performance analysis. An even more involved (and exact) approach would be to synthesize controllers for optimal robust performance for each candidate combination. However, the number of combination has a combinatorial growth and the analysis may become very time-consuming.\nRGA for Non-Square Plant A simple but effective tool for selecting inputs and outputs, which avoids to combinatorial problem is the Relative Gain Array (RGA) of the \u0026ldquo;big\u0026rdquo; transfer matrix \\(G_\\text{all}\\) with all candidates inputs and outputs included:\n\\begin{equation} \\tcmbox{\\Lambda = G_{\\text{all}} \\times G_{\\text{all}}^{\\dagger^T}} \\end{equation}\nEssentially, one may consider not using those manipulations \\(u\\) corresponding to columns in the RGA where the sum of the elements is much smaller than 1.\nSimilarly, one may consider not using those outputs \\(v\\) corresponding to rows in the RGA where the sum of the elements is much small than 1.\nControl Configuration Elements We now assume that the measurements, manipulations and controlled outputs are fixed. The available synthesis theories presented in this book result in a multivariable controller \\(K\\) which connects all available measurements \\(v\\) with all available manipulations \\(u\\): \\[ u = K v \\] However, such a \u0026ldquo;big\u0026rdquo; controller may not be desirable.\n We define the control configuration to be the restrictions imposed on the overall controller \\(K\\) by decomposing it into a set of local controllers with predetermined links and with a possibly predetermined design sequence where subcontrollers are designed locally.\n Some elements used to build up a specific control configuration are:\n Cascade controllers. The output from one controller is the input to another Decentralized controllers. The control system consists of independent feedback controllers which interconnect a subset of the output measurements with a subset of the manipulated inputs. These subsets should not be used by any other controller Feedforward elements. Link measured disturbances and manipulated inputs Decoupling elements. Link one set of manipulated inputs with another set of manipulated inputs. They are used to improve the performance of decentralized control systems. Selectors: used to select for control, depending on the conditions of the system, a subset of the manipulated inputs or a subset of the outputs In addition to restrictions on the structure of \\(K\\), we may impose restrictions on in which sequence the subcontrollers are designed. For most decomposed control systems, we design the controllers sequentially, starting with the \u0026ldquo;fast\u0026rdquo; or \u0026ldquo;inner\u0026rdquo; or \u0026ldquo;lower-layer\u0026rdquo; control loops.\nThe choice of control configuration leads to two different ways of partitioning the control system:\n Vertical decomposition. This usually results from a sequential design of the control system Horizontal decomposition. This usually involves a set of independent decentralized controllers Of course, a performance loss is inevitable if we decompose the control system. For example, if we select a poor configuration at the lower control layer, then this may pose fundamental limitations on the achievable performance (RHP zeros, strong interactions, etc).\nCascade Control Systems We here use SISO controllers of the form\n\\begin{equation} u_i = K_i(s) (r_i - y_i) \\end{equation}\nwhere \\(K_i(s)\\) is a scalar. Then when a SISO control loop is closed, we lose the input \\(u_i\\) as a degree-of-freedom but the reference \\(r_i\\) becomes a new degree-of-freedom.\nA cascade control structure results when either of the following two situations arise:\n The reference \\(r_i\\) is an output from another controller. This is the conventional cascade control (Fig. fig:cascade_extra_meas) The \u0026ldquo;measurement\u0026rdquo; \\(y_i\\) is an output from another controller. This is referred to as input resetting (Fig. fig:cascade_extra_input) \nTable 7: Cascade Implementations Extra measurements \\(y_2\\) Extra inputs \\(u_2\\) Cascade Control: Extra Measurements Let \\(u\\) be the manipulated input, \\(y_1\\) the controlled outputs and \\(y_2\\) the extra measurement. In many cases, we may use \\(y_2\\) to provide local disturbance rejection, linearization, or to reduce the effect of measurement noise. For example, velocity feedback is frequently used in mechanical systems.\nCentralized (parallel) implementation A centralized implementation where \\(K\\) is a 2-inputs-1-output controller may be written\n\\begin{align*} u \u0026amp;= K(s)(r - y) \\\\\\\nu \u0026amp;= K_{11}(s)(r_1 - y_1) + K_{12}(s)(r_2 - y_2) \\end{align*}\nwhere in most cases \\(r_2 = 0\\) since we do not have a degree-of-freedom to control \\(y_2\\).\nCascade implementation To obtain an implementation with two SISO controllers, we may cascade the controllers as illustrated in Fig. fig:cascade_extra_meas:\n\\begin{align*} r_2 \u0026amp;= K_1(s)(r_1 - y_1) \\\\\\\nu_2 \u0026amp;= K_2(s)(r_2 - y_2),\\ r_2 = \\hat{u}_1 \\end{align*}\nNote that the output \\(r_2\\) from the slower primary controller \\(K_1\\) is not a manipulated plant input, but rather the reference input to the faster secondary controller \\(K_2\\). Cascades based on measuring the actual manipulated variable (\\(y_2 = u_m\\)) are commonly used to reduce uncertainty and non-linearity at the plant input.\nIn the general case (Fig. fig:cascade_extra_meas) \\(y_1\\) and \\(y_2\\) are not directly related to each other, and this is sometimes referred to as parallel cascade control. However, it is common to encounter the situation in Fig. fig:cascade_control where the primary output \\(y_1\\) depends directly on \\(y_2\\) which is a special case of Fig. fig:cascade_extra_meas.\n With reference to the special (but common) case of cascade control shown in Fig. fig:cascade_control, the use of extra measurements is useful under the following circumstances:\n The disturbance \\(d_2\\) is significant and \\(G_1\\) is non-minimum phase. If \\(G_1\\) is minimum phase, the input-output controllability of \\(G_2\\) and \\(G_1 G_2\\) are the same and there is no fundamental advantage in measuring \\(y_2\\) The plant \\(G_2\\) has considerable uncertainty associated with it and the inner loop serves to remove the uncertainty. The inner loop \\(L_2 = G_2 K_2\\) removes the uncertainty if it is sufficiently fast and yields a transfer function \\((I + L_2)^{-1} L_2\\) close to \\(I\\) at frequencies where \\(K_1\\) is active. \n Figure 59: Common case of cascade control where the primary output \\(y_1\\) depends directly on the extra measurement \\(y_2\\)\n In terms of design, it is recommended to first design \\(K_2\\) to minimize the effect of \\(d_2\\) on \\(y_1\\) and then to design \\(K_1\\) to minimize the effect of \\(d_1\\) on \\(y_1\\).\nCascade Control: Extra Inputs In some cases we have more manipulated inputs than controlled outputs. These may be used to improve control performance.\nCentralized implementation A centralized implementation where \\(K\\) is a 1-input-2-outputs controller may be written \\[ u_1 = K_{11}(s)(r-y); \\quad u_2 = K_{21}(s)(r-y) \\] Here two inputs are used to control one output. We usually let \\(K_{11}\\) have integral control whereas \\(K_{21}\\) does not. Then \\(u_2(t)\\) will only be used for transient control and will return to \\(0\\) as \\(t \\to \\infty\\).\nCascade implementation To obtain an implementation with two SISO controllers we may cascade the controllers as shown in Fig. fig:cascade_extra_input. We again let input \\(u_2\\) take care of the fast control and \\(u_1\\) of the long-term control. The fast control loop is then \\[ u_2 = K_2(s)(r - y) \\] The objective of the other slower controller is then to use input \\(u_1\\) to reset input \\(u_2\\) to its desired value \\(r_{u_2}\\): \\[ u_1 = K_1(s)(r_{u_2} - y_1), \\ y_1 = u_2 \\] and we see that the output from the fast controller \\(K_2\\) is the \u0026ldquo;measurement\u0026rdquo; for the slow controller \\(K_1\\).\nThe cascade implementation again has the advantage of decoupling the design of the two controllers. It also shows more clearly that \\(r_{u_2}\\), the reference for \\(u_2\\), may be used as a degree-of-freedom at higher layers in the control system.\n Consider the system in Fig. fig:cascade_control_two_layers with two manipulated inputs (\\(u_2\\) and \\(u_3\\)), one controlled output (\\(y_1\\) which should be close to \\(r_1\\)) and two measured variables (\\(y_1\\) and \\(y_2\\)). Input \\(u_2\\) has a more direct effect on \\(y_1\\) than does input \\(u_3\\) (there is a large delay in \\(G_3(s)\\)). Input \\(u_2\\) should only be used for transient control as it is desirable that it remains close to \\(r_3 = r_{u_2}\\). The extra measurement \\(y_2\\) is closer than \\(y_1\\) to the input \\(u_2\\) and may be useful for detecting disturbances affecting \\(G_1\\).\nController \\(K_1\\) controls the primary output \\(y_1\\) at its reference \\(r_1\\) by adjusting the \u0026ldquo;input\u0026rdquo; \\(\\hat{u}_1\\), which is the reference value for \\(y_2\\). Controller \\(K_2\\) controls the secondary output \\(y_2\\) using input \\(u_2\\). Finally, controller \\(K_3\\) manipulates \\(u_3\\) slowly in order to reset input \\(u_2\\) to its desired value \\(r_3\\). We would probably tune the three controllers in the order \\(K_2\\), \\(K_3\\), and \\(K_1\\).\n \n Figure 60: Control configuration with two layers of cascade control\n Selectors Slip-range control for extra input Sometimes the input constraints make it necessary to add a manipulated input. In this case the control range is often split such that, for example, \\(u_1\\) is used for control when \\(y \\in [y_\\text{min}, y_1]\\) and \\(u_2\\) is used when \\(y \\in [y_1, y_\\text{max}]\\).\nSelector for too few inputs A completely different situation occurs if there are fewer inputs than outputs. In such case, we cannot control all the outputs independently, so we either need to control all the outputs in some average manner, or we need to make a choice about which outputs are the most important to control. Selectors are often used for the latter option.\nWhy use Cascade and Decentralized Control? Decomposed control configuration can easily become quite complex and difficult to maintain and understand. It may therefore be both simpler and better in terms of control performance to set up the controller design problem as an optimization problem and let the computer do the job, resulting in a centralized multivariable controller.\nHowever, there are a number of reason why cascade and decentralized control are used in practice. The most important one is the cost associated with obtaining good plant models, which are a prerequisite for applying multivariable control. Since cascade and decentralized control systems depend more strongly on feedback rather than models as their source of information, it is usually more important (relative to centralized multivariable control) that the fast control loops be tuned to respond quickly.\nThe cascade and decentralized control are often easier to understand, their tuning parameters have a direct and \u0026ldquo;localized\u0026rdquo; effect, and they tend to be less sensitive to uncertainty.\nThe main challenge is then to find a control configuration which allows the controllers to be tuned independently based on a minimum of model information. To be able to tune the controllers independently, we must require that the loops interact only to a limited extent. For example, one desirable property is that the steady-state gain from \\(u_i\\) to \\(y_i\\) in an \u0026ldquo;inner\u0026rdquo; loop does not change too much as outer loops are closed.\nHierarchical and Partial Control Partial Control Partial control involves controlling only a subset of the outputs for which there is a control objective.\n We divide the outputs \\(y\\) into two classes:\n \\(y_1\\) - (temporarily) uncontrolled output \\(y_2\\) - (locally) measured and controlled output We also subdivide the available manipulated inputs \\(u\\):\n \\(u_2\\) - inputs used for controlling \\(y_2\\) \\(u_1\\) - remaining inputs Four applications of partial control are:\n Sequential design on decentralized controllers. Both \\(y_1\\) and \\(y_2\\) have an associated control objective. First, a controller \\(K_2\\) is designed to control \\(y_2\\). Then, a controlled \\(K_1\\) may be designed for the remaining outputs. Sequential design of conventional cascade control. The outputs \\(y_2\\) are additional measured variables which are not important variables in themselves. The reason for controlling \\(y_2\\) is to improve the control of \\(y_1\\). The references \\(r_2\\) are used as degrees-of-freedom for controlling \\(y_1\\). \u0026ldquo;true\u0026rdquo; partial control. Both \\(y_1\\) and \\(y_2\\) have an associated control objective. We consider whether by controlling only the subset \\(y_2\\) we can indirectly achieve acceptable control of \\(y_1\\). Indirect control. The outputs \\(y_1\\) have an associated control objective but are not measured. Instead, we aim at indirectly controlling \\(y_1\\) by controlling the secondary measured variables \\(y_2\\). The table tab:partial_control shows clearly the differences between the four applications of partial control. In all cases, there is a control objective associated with \\(y_1\\) and a feedback involving measurement and control of \\(y_2\\) and we want:\n The effect of disturbances on \\(y_1\\) to be small (when \\(y_2\\) is controlled) The control of \\(y_2\\) using \\(u_2\\) to be (dynamically) easy \nTable 8: Applications of partial control Control Meas. and control of \\(y_1\\)? Control objective for \\(y_2\\)? Sequ. decentralized Yes Yes Sequ. cascade Yes No \u0026ldquo;True\u0026rdquo; partial No Yes Indirect No No By partitioning the inputs and outputs, the overall model \\(y = G u\\) can be written\n\\begin{equation} \\begin{aligned} y_1 \u0026amp;= G_{11} u_1 + G_{12} u_2 + G_{d1} d\\\\\\\ny_2 \u0026amp;= G_{21} u_1 + G_{22} u_2 + G_{d2} d \\end{aligned} \\end{equation}\nAssume now that feedback control \\(u_2 = K_2(r_2 - y_2 - n_2)\\) is used for the \u0026ldquo;secondary\u0026rdquo; subsystem involving \\(u_2\\) and \\(y_2\\) (Fig. fig:partial_control). We get:\n\\begin{equation} \\begin{aligned} y_1 = \u0026amp;(G_{11} - G_{12}K_2(I + G_{22}K_2)^{-1}G_{21})u_1 \\\\\\\n\u0026amp; + (G_{d1} - G_{12}K_2(I + G_{22}K_2)^{-1}G_{d2})d \\\\\\\n\u0026amp; + G_{12} K_2 (I + G_{22}K_2)^{-1}(r_2 - n_2) \\end{aligned} \\end{equation}\n\n Figure 61: Partial Control\n Tight control of \\(y_2\\) In some cases, we can assume that the control of \\(y_2\\) is fast compared to the control of \\(y_1\\) so we may let \\(K_2 \\to \\infty\\) to get: \\[ u_2 = -G_{22}^{-1} G_{d2} d - G_{22}^{-1} G_{21} u_1 + G_{22}^{-1} y_2 \\]\nThe dynamics of the system becomes:\n\\begin{equation} \\begin{aligned} y_1 = \u0026amp;\\underbrace{(G_{11} - G_{12} G_{22}^{-1} G_{21})}_{\\triangleq P_u} u_1 \\\\\\\n\u0026amp; + \\underbrace{(G_{d1} - G_{12} G_{22}^{-1} G_{d2})}_{\\triangleq P_d} d + \\underbrace{G_{12} G_{22}^{-1}}_{\\triangleq P_r} \\underbrace{(r_2 - e_2)}_{y_2} \\end{aligned} \\end{equation}\nwhere\n \\(P_d\\) is called the partial disturbance gain, which is the disturbance gain for a system under perfect partial control \\(P_u\\) is the effect of \\(u_1\\) on \\(y_1\\) with \\(y_2\\) perfectly controlled The obtained dynamics is independent of \\(K_2\\), but this only applies at frequencies where \\(y_2\\) is tightly controlled.\nHierarchical Control and Sequential Design A hierarchical control system results when we design the subcontrollers in a sequential manner, usually starting with the fast loops. This means that the controller at some higher layer in the hierarchy is designed based on a partially controlled plant.\nThe idea is to first implement a local lower-layer control system for controlling the outputs \\(y_2\\). Next, with this lower-layer in place, we design a controller \\(K_1\\) to control \\(y_1\\).\nThe objectives for this hierarchical decomposition are:\n to allow for simple or even on-line tuning of \\(K_2\\) to allow the use of longer sampling intervals for \\(K_1\\) to allow simple models when designing \\(K_1\\) to \u0026ldquo;stabilize\u0026rdquo; the plant using \\(K_2\\) such that it is amenable to manual control The selection of \\(u_2\\) and \\(y_2\\) for use in the lower-layer control system can be done with the following criteria:\n The lower-layer must quickly implement the setpoints computed by the higher layers, that is, the input-output controllability of the subsystem involving the use of \\(u_2\\) to control \\(y_2\\) should be good (consider \\(G_{22}\\) and \\(G_{d2}\\)) The control of \\(y_2\\) using \\(u_2\\) should provide local disturbance rejection, that is, it should minimize the effect of disturbances on \\(y_1\\) The control of \\(y_2\\) using \\(u_2\\) should not impose unnecessary control limitations (RHP-zero, ill-conditioning, etc.) on the remaining control problem which involves using \\(u_1\\) to control \\(y_1\\) Sequential design of cascade control systems Consider the conventional cascade control system in Fig. fig:cascade_extra_meas where we have additional \u0026ldquo;secondary\u0026rdquo; measurements \\(y_2\\) with no associated control objective, and the objective is to improve the control of \\(y_1\\) by locally controlling \\(y_2\\). The idea is that this should reduce the effect of disturbances and uncertainty on \\(y_1\\).\nFrom \\eqref{eq:partial_control}, it follows that we should select \\(y_2\\) and \\(u_2\\) such that \\(\\|P_d\\|\\) is small and at least smaller than \\(\\|G_{d1}\\|\\). These arguments particularly apply at high frequencies. More precisely, we want the input-output controllability of \\([P_u\\ P_r]\\) with disturbance model \\(P_d\\) to be better that of the plant \\([G_{11}\\ G_{12}]\\) with disturbance model \\(G_{d1}\\).\n\u0026ldquo;True\u0026rdquo; Partial Control We here consider the case where we attempt to leave a set of primary outputs \\(y_1\\) uncontrolled. This may be possible in cases where the outputs are correlated such that controlling the outputs \\(y_2\\) indirectly gives acceptable control of \\(y_1\\).\n A set of outputs \\(y_1\\) may be left uncontrolled only if the effects of all disturbances (including \\(r_2\\)) on \\(y_1\\), as expressed by the elements in the corresponding partial disturbance gain matrix \\(P_d\\) are less than \\(1\\) in magnitude at all frequencies.\n To evaluate the feasibility of partial control, one must for each choice of \\(y_2\\) and \\(u_2\\), rearrange the system as in \\eqref{eq:partial_control_partitioning} and \\eqref{eq:partial_control}, and compute \\(P_d\\) using \\eqref{eq:tight_control_y2}.\nMeasurement Selection for Indirect Control Assume the overall goal is to keep some variable \\(y_1\\) at a given value \\(r_1\\), e.g. our objective is to minimize \\(J = \\|y_1 - r_1\\|\\). We assume that we cannot measure \\(y_1\\), and instead we attempt to achieve our goal by controlling \\(y_2\\) at a constant value \\(r_2\\). For small changes, we may assume linearity and write:\n\\begin{align*} y_1 \u0026amp;= G_1 u + G_{d1} d\\\\\\\ny_2 \u0026amp;= G_2 u + G_{d2} d \\end{align*}\nWith feedback control of \\(y_2\\) we get \\(y_2 = r_2 + e_2\\) where \\(e_2\\) is the control error. From the above two equations, we obtain \\[ y_1 = (G_{d1} - G_1 G_2^{-1} G_{d2})d + G_1 G_2^{-1} (r_2 + e_2) \\]\nWith \\(e_2 = 0\\) and \\(d = 0\\) this gives \\(y_1 = G_1 G_2^{-1} r_2\\), so \\(r_2\\) must be chosen such that \\[ r_1 = G_1 G_2^{-1} r_2 \\]\nThe control error in the primary output is then\n\\begin{equation} y_1 - r_1 = \\underbrace{(G_{d1} - G_1 G_2^{-1} G_{d2})}_{P_d} d + \\underbrace{G_1 G_2^{-1}}_{P_r} e_2 \\end{equation}\nTo minimize \\(J\\), we should therefore select controlled outputs such that \\(\\|P_d d\\|\\) and \\(\\|P_r e_2\\|\\) are small. Note that \\(P_d\\) depends on the scaling of \\(d\\) and \\(y_1\\). Also the magnitude of \\(e_2\\) depends on the choice of outputs \\(y_2\\).\n Scale the disturbances \\(d\\) to be of magnitude 1, and scale the outputs \\(y_2\\) so that the expected control error \\(e_2\\) (measurement noise) is of magnitude 1 for each outputs. Then to minimize the control error for the primary output, \\(J = \\|y_1 - r_1\\|\\), we should select sets of controlled outputs which minimizes \\(\\|[ P_d \\ P_r]\\|\\).\n Decentralized Feedback Control In this section, \\(G(s)\\) is a square plant which is to be controlled using a diagonal controller (Fig. fig:decentralized_diagonal_control).\n\n Figure 62: Decentralized diagonal control of a \\(2 \\times 2\\) plant\n The design of decentralized diagonal control systems involves two steps:\n The choice of pairing (control configuration selection) The design of each controller \\(k_i(s)\\) \\[ K(s) = \\text{diag}\\{k_i(s)\\} = \\begin{bmatrix} k_1(s) \u0026amp; \u0026amp; \u0026amp; \\\\\\\n\u0026amp; k_2(s) \u0026amp; \u0026amp; \\\\\\\n\u0026amp; \u0026amp; \\ddots \u0026amp; \\\\\\\n\u0026amp; \u0026amp; \u0026amp; k_m(s) \\end{bmatrix} \\]\nNotations for decentralized diagonal control \\(G(s)\\) denotes a square \\(m \\times m\\) plant with elements \\(g_{ij}\\). \\(G^{ij}(s)\\) denotes the remaining \\((m-1) \\times (m-1)\\) plant obtained by removing row \\(i\\) and column \\(j\\) in \\(G(s)\\). We introduce: \\[ \\tilde{G} \\triangleq \\text{diag}\\{g_{ii}\\} = \\begin{bmatrix} g_{11} \u0026amp; \u0026amp; \u0026amp; \\\\\\\n\u0026amp; g_{22} \u0026amp; \u0026amp; \\\\\\\n\u0026amp; \u0026amp; \\ddots \u0026amp; \\\\\\\n\u0026amp; \u0026amp; \u0026amp; g_{mm} \\\\\\\n\\end{bmatrix} \\] The loop transfer function in loop \\(i\\) is denoted \\(L_i = g_{ii} k_i\\).\nRGA as a Measure of the Interaction for Decentralized Control Let \\(u_j\\) and \\(y_i\\) denote a particular input and output for the multivariable plant \\(G(s)\\) and assume that our task is to use \\(u_j\\) to control \\(y_i\\). There are two extreme cases:\n Other loops open: \\(u_k = 0, \\forall k \\neq j\\) Other loops closed: \\(y_k = 0, \\forall k \\neq i\\). It is assumed that the other loop are closed with perfect control which is a good approximation at frequencies within the bandwidth of each loop We now evaluate the effect \\(\\partial y_i / \\partial u_j\\) for the two cases:\n\\begin{subequations} \\begin{align} \u0026amp; \\left( \\frac{\\partial y_i}{\\partial u_j} \\right)_{u_k = 0, k \\neq j} = g_{ij} = [G]_{ij}\\\\\\\n\u0026amp; \\left( \\frac{\\partial y_i}{\\partial u_j} \\right)_{y_k = 0, k \\neq i} \\triangleq \\hat{g}_{ij} = 1/[G^{-1}]_{ji} \\end{align} \\end{subequations}\nThe ratio between the gains corresponding the two extreme cases is a useful measure of interactions and is defined as the \\(ij\\text{\u0026lsquo;th}\\) relative gain:\n\\begin{equation} \\tcmbox{\\lambda_{ij} \\triangleq \\frac{g_{ij}}{\\hat{g}_{ij}} = [G]_{ij}[G^{-1}]_{ji}} \\end{equation}\nThe Relative Gain Array (RGA) is the corresponding matrix of relative gains:\n\\begin{equation} \\tcmbox{\\Lambda(G) = G \\times (G^{-1})^T} \\end{equation}\nwhere \\(\\times\\) denotes element-by-element multiplication.\n Intuitively, we would like to pair variables \\(u_j\\) and \\(y_i\\) so that \\(\\lambda_{ij}\\) is close to \\(1\\), because this means that the gain from \\(u_j\\) to \\(y_i\\) is unaffected by closing the other loops. More precisely, we would like to pair such that the rearranged system, with the pairings along the diagonal, has a RGA matrix close to identity.\n Factorization of Sensitivity Function The magnitude of the off-diagonal elements in \\(G\\) (the interactions) relative to its diagonal elements are given by the matrix\n\\begin{equation} E \\triangleq (G - \\tilde{G})\\tilde{G}^{-1} \\end{equation}\nAn important relationship for decentralized control is:\n\\begin{equation} \\tcmbox{\\underbrace{(I + G K)}_{\\text{overall}} = \\underbrace{(I + E \\tilde{T})}_{\\text{interactions}} \\quad \\underbrace{(I + \\tilde{G} K)}_{\\text{individual loops}}} \\end{equation}\nor equivalently in terms of the sensitivity function:\n\\begin{equation} \\tcmbox{S = \\tilde{S} (I + E \\tilde{T})^{-1}} \\end{equation}\nwith\n\\begin{align*} \\tilde{S} \u0026amp;\\triangleq (I + \\tilde{G}K)^{-1} = \\text{diag}\\left\\{\\frac{1}{1 + g_{ii} k_i}\\right\\} \\\\\\\n\\tilde{T} \u0026amp;= I - \\tilde{S} \\end{align*}\nwhich contain the sensitivity and complementary sensitivity functions for the individual loops. Note that \\(\\tilde{S}\\) is not equal to the matrix of diagonal elements of \\(S\\).\nStability of Decentralized Control Systems Consider a \\(m \\times m\\) plant with single-loop controllers. There are \\(m!\\) alternative pairings possible. Thus tools are needed for quickly evaluating alternative pairings. In this section, we first derive sufficient conditions for stability which may be used to select promising pairings. We then derive necessary conditions for stability which may be used to eliminate undesirable pairings.\nSufficient conditions for stability For decentralized diagonal control, it is desirable that the system can be tuned and operated one loop at a time. Assume therefore that \\(G\\) is stable and each individual loop is stable by itself (\\(\\tilde{S}\\) and \\(\\tilde{T}\\) are stable). Using the spectral radius condition on the factorized \\(S\\) in \\eqref{eq:S_factorization}, we have that the overall system is stable (\\(S\\) is stable) if\n\\begin{equation} \\rho(E\\tilde{T}(j\\omega)) \u0026lt; 1, \\forall\\omega \\end{equation}\nSufficient conditions in terms of \\(E\\). Assume \\(G\\) is stable and that the individual loops are stable (\\(\\tilde{T}\\) is stable). The least conservative approach is to use \\(\\rho(E\\tilde{T}) \\leq \\mu(E) \\maxsv(\\tilde{T})\\). Then the entire system is closed-loop stable (\\(T\\) is stable) if\n\\begin{equation} \\tcmbox{\\maxsv(\\tilde{T}) = \\max_i |\\tilde{t}_i| \u0026lt; 1 / \\mu(E) \\quad \\forall\\omega} \\end{equation}\n\\(\\mu(E)\\) is called the structured singular value interaction measure, and is computed with respect to the diagonal structure of \\(\\tilde{T}\\) where we may view \\(\\tilde{T}\\) as the \u0026ldquo;design uncertainty\u0026rdquo;.\nWe usually would like to use integral action in the loops, that is we want \\(\\tilde{T} \\approx I\\) at low frequencies, i.e. \\(\\maxsv(\\tilde{T}) \\approx 1\\). Thus, we prefer pairings for which we have \\(\\mu(E) \u0026lt; 1\\) at low frequencies where we have tight control. This ensures a \u0026ldquo;generalized diagonal dominance\u0026rdquo;.\nSufficient conditions in terms of RGA. Suppose the plant \\(G(s)\\) is stable. If the RGA-matrix \\(\\Lambda(G) = I\\ \\forall\\omega\\) (which can only arise for a triangular plant \\(G(s)\\)), then stability of each of the individual loops implies stability of the entire system.\nIn most cases, it is sufficient for overall stability to require that \\(G(j\\omega)\\) is close to triangular (or \\(\\Lambda(G) \\approx I\\)) at crossover frequencies. This gives the \u0026ldquo;first pairing rule\u0026rdquo;.\n To achieve stability with decentralized control, prefer pairings such that at frequencies \\(\\omega\\) around crossover, the rearranged matrix \\(G(j\\omega)\\) (with the paired elements along the diagonal) is close to triangular. This is equivalent to requiring \\(\\Lambda(G(j\\omega)) \\approx I\\), i.e. the RGA-number \\(\\|\\Lambda(G(j\\omega)) - I\\|_\\text{sum}\\) should be small.\n Necessary steady-state conditions for stability A desirable property of a decentralized control system is that it has integrity, i.e. the closed loop system should remain stable as subsystem controllers are brought in and out of service. Mathematically, the system possesses integrity if it remains stable when the controller \\(K\\) is replace by \\(\\mathbb{E}K\\) where \\(\\mathbb{E} = \\text{diag}\\{\\epsilon_i\\}, \\ \\epsilon_i=0,1\\).\nAn even stronger requirement is that the system remains stable as the gain in various loops are reduced: \\(0 \\le \\epsilon_i \\le 1\\).\n The plant \\(G(s)\\) (corresponding to a given pairing with the paired elements along its diagonal) is Decentralized Integral Controllability (DIC) if there exists a stabilizing decentralized controller with integral action in each loop such that each individual loop may be detuned independently by a factor \\(\\epsilon_1\\) (\\(0 \\le \\epsilon_i \\le 1\\)) without introducing instability.\n Steady-State RGA and DIC. Consider a stable square plant \\(G\\) and a diagonal controller \\(K\\) with integral action in all elements, and assume that the loop transfer function \\(GK\\) is strictly proper. If a pairing of outputs and manipulated inputs corresponds to a negative steady-state relative gain, then the closed-loop system has at least one of the following properties:\n The overall closed-loop system is unstable The loop with the negative relative gain is unstable by itself The closed-loop system is unstable if the loop with the negative relative gain is opened This can be summarized as follows:\n \\begin{equation} \\begin{aligned} \u0026amp;\\text{A stable (reordered) plant } G(s)\\\\\\\n\u0026amp;\\text{is DIC only if } \\lambda_{ii}(0) \\ge 0 \\text{ for all } i \\end{aligned} \\end{equation}\n The RGA and RHP-zeros: Further reasons for not pairing on negative RGA elements With decentralized control, we usually design and implement the controller by tuning and closing one loop at a time in a sequential manner. Assume that we pair on a negative steady-state RGA-element, \\(\\lambda_{ij}(0) \u0026lt; 0\\), assume that \\(\\lambda_{ij}(\\infty)\\) is positive, and assume that the element \\(g_{ij}\\) has no RHP-zero. We have the following implications:\n If we start by closing the loop involving input \\(u_i\\) and \\(y_j\\), then we will get a RHP-zero in \\(G^{ij}(s)\\) which will limit the performance in the other outputs If we end by closing this loop, then we will get a RHP-zero in \\(\\hat{g}_{ij}(s)\\) which will limit the performance in output \\(y_i\\) For a stable plant, avoid pairings that corresponds to negative steady-state RGA-elements \\(\\lambda_{ij}(0) \u0026lt; 0\\)\n \\begin{align*} G(0) \u0026amp;= \\begin{bmatrix} 10.2 \u0026amp; 5.6 \u0026amp; 1.4 \\\\\\\n15.5 \u0026amp; -8.4 \u0026amp; -0.7 \\\\\\\n18.1 \u0026amp; 0.4 \u0026amp; 1.8 \\end{bmatrix} \\\\\\\n\\Lambda(0) \u0026amp;= \\begin{bmatrix} 0.96 \u0026amp; 1.45 \u0026amp; -1.41 \\\\\\\n0.94 \u0026amp; -0.37 \u0026amp; 0.43 \\\\\\\n-0.90 \u0026amp; -0.07 \u0026amp; 1.98 \\end{bmatrix} \\end{align*}\nFor a \\(3 \\times 3\\) plant there are 6 alternative pairings. From the steady state RGA, we see that there is only one positive element in columns 2, and only positive element in row 3, and therefore there is only on possible pairing if we require DIC: \\[ u_1 \\leftrightarrow y_2,\\ u_2 \\leftrightarrow y_1,\\ u_3 \\leftrightarrow y_3 \\]\n \\begin{align*} G(s) \u0026amp;= \\frac{-s + 1}{(5 s + 1)^2} \\begin{bmatrix} 1 \u0026amp; 4 \u0026amp; -26 \\\\\\\n6.2 \u0026amp; 1 \u0026amp; -26 \\\\\\\n1 \u0026amp; 1 \u0026amp; 1 \\end{bmatrix}\\\\\\\n\\Lambda(G) \u0026amp;= \\begin{bmatrix} 1 \u0026amp; 5 \u0026amp; -5 \\\\\\\n-5 \u0026amp; 1 \u0026amp; 5 \\\\\\\n5 \u0026amp; -5 \u0026amp; 1 \\end{bmatrix} \\end{align*}\nOnly two of the six possible pairings gives positive steady-state RGA-elements: the diagonal pairing on all \\(\\lambda_{ii} = 1\\) or the pairing on all \\(\\lambda_{ii} = 5\\). Intuitively, one may expect pairing with \\(\\lambda_{ii} = 1\\) since it corresponds to pairing on RGA-elements equal to \\(1\\). However, the RGA matrix is far from identify, and the RGA-number \\(\\| \\Lambda - I \\|_\\text{sum} = 30\\) for both alternative. Thus none of the two alternatives satisfy Pairing Rule 1, and decentralized control should not be used for this plant.\n Performance of Decentralized Control Systems To study performance, we use the following factorization\n\\begin{equation} S = (I + \\tilde{S}(\\Gamma - I)^{-1}) \\tilde{S} \\Gamma \\end{equation}\nwhere \\(\\Gamma\\) is the Performance Relative Gain Array (PRGA)\n\\begin{equation} \\tcmbox{\\Gamma(s) \\triangleq \\tilde{G}(s) G^{-1}(s)} \\end{equation}\nwhich is a scaled inverse of the plant.\nAt frequencies where feedback is effective (\\(\\tilde{S} \\approx 0\\)), \\(S \\approx \\tilde{S} \\Gamma\\) which shows that \\(\\Gamma\\) is important when evaluating performance with decentralized control.\nNote that the diagonal elements of the PRGA-matrix are equal to the diagonal elements of the RGA and that the off-diagonal elements of the PRGA depend on the relative scaling on the outputs which is not the case for the RGA.\nWe will also use the related Closed-Loop Disturbance Gain (CLDG) matrix:\n\\begin{equation} \\tcmbox{\\tilde{G}_d(s) \\triangleq \\Gamma(s)G_d(s) = \\tilde{G}(s) G^{-1}(s) G_d(s)} \\end{equation}\nwhich depends on both output and disturbance scaling.\nSuppose the system has been scaled such that:\n Each disturbance magnitude is less than \\(1\\), \\(|d_k| \u0026lt; 1\\) Each reference change is less than the corresponding diagonal element in \\(R\\), \\(|r_j| \u0026lt; R_j\\) For each output the acceptable control error is less than \\(1\\), \\(|e_i| \u0026lt; 1\\) Single disturbance Consider a single disturbance, in which case \\(G_d\\) is a vector, and let \\(g_{di}\\) denote the \\(i\\text{\u0026lsquo;th}\\) element of \\(G_d\\). Let \\(L_i = g_{ii} k_i\\) denote the loop transfer function in loop \\(i\\). Consider frequencies where feedback is effective so \\(\\tilde{S}\\Gamma\\) is small. Then for acceptable disturbance rejection (\\(|e_i| \u0026lt; 1\\)) we must with decentralized control required for each loop \\(i\\)\n\\begin{equation} \\tcmbox{|1 + L_i| \u0026gt; |\\tilde{g}_{di}| \\quad \\forall i} \\end{equation}\nwhich is the same as the SISO-condition except that \\(G_d\\) is replaced by the CLDG. In words, \\(\\tilde{g}_{di}\\) gives the \u0026ldquo;apparent\u0026rdquo; disturbance gain as seen from the loop \\(i\\) when the system is controlled using decentralized control.\nSingle reference change Consider a change in reference for output \\(j\\) of magnitude \\(R_j\\). Consider frequencies where feedback is effective. Then for acceptable reference tracking (\\(|e_i|\u0026lt;1\\)) we must require for each loop \\(i\\)\n\\begin{equation} \\tcmbox{|1 + L_i| \u0026gt; |\\gamma_{ij}| \\cdot |R_j| \\quad \\forall i} \\end{equation}\nwhich is the same as the SISO-condition except for the PRGA-factor \\(|\\gamma_{ij}|\\).\nConsequently, for performance it is desirable to have small elements in \\(\\Gamma\\), at least at frequencies where feedback is effective. However, at frequencies close to crossover, stability is the main issue and since the diagonal elements of the PRGA and RGA are equal, we usually prefer to have \\(\\gamma_{ii}\\) close to \\(1\\).\nSummary: Controllability Analysis for Decentralized Control When considering decentralized diagonal control of a plant, one should first check that the plant is controllable with any controller. The next step is to compute the RGA matrix as a function of frequency, and to determine if one can find a good set of input-output pairs bearing in mind the following:\n Prefer pairings which have the RGA-matrix close to identity at frequencies around crossover, i.e. the RGA-number \\(\\|\\Lambda(j\\omega)-I\\|\\) should be small Avoid a pairing \\(ij\\) with negative steady-state RGA elements \\(\\lambda_{ij}(G(0)\\) Prefer a pairing \\(ij\\) where \\(g_{ij}(s)\\) puts minimal restrictions on the achievable bandwidth. Specifically, the frequency \\(\\omega_{uij}\\) where \\(\\angle g_{ij}(j\\omega_{uij}) = \\SI{-180}{\\degree}\\) should be as large as possible This rule favors parings on variables \u0026ldquo;close to each other\u0026rdquo; When a reasonable choice of pairings have been made, one should rearrange \\(G\\) to have the paired elements along the diagonal and perform a controllability analysis:\nCompute the CLDG and PRGA, and plot these as a function of frequency For systems with many loops, it is best to perform the analysis one loop at the time, that is, for each loop \\\\(i\\\\), plot \\\\(|\\tilde{g}\\_{dik}|\\\\) for each disturbance \\\\(k\\\\) and plot \\\\(|\\gamma\\_{ij}|\\\\) for each reference \\\\(j\\\\). For performance, we need \\\\(|1 + L\\_i|\\\\) to be larger than each of these: \\begin{equation} |1 + L_i| \u0026gt; \\max_{k,j}\\{|\\tilde{g}_{dik}|, |\\gamma_{ij}|\\} \\end{equation}\nTo achieve stability of the individual loops, one must analyze \\(g_{ii}(s)\\) to ensure that the bandwidth required by \\eqref{eq:decent_contr_one_loop} is achievable. Note that RHP-zeros in the diagonal elements may limit achievable decentralized control, whereas they may not pose any problems for a multivariable controller. Since with decentralized control, we usually want to use simple controllers, the achievable bandwidth in each loop will be limited by the frequency where \\(\\angle g_{ii}\\) is \\(\\SI{-180}{\\degree}\\)\nCheck for constraints by considering the elements of \\\\(G^{-1} G\\_d\\\\) and make sure that they do not exceed one in magnitude within the frequency range where control is needed. Equivalently, one may for each loop \\\\(i\\\\), plot \\\\(|g\\_{ii}|\\\\) and the requirement is then that \\begin{equation} |g_{ii}| \u0026gt; |\\tilde{g}_{dik}| \\quad \\forall k \\end{equation}\nat frequencies where \\(|\\tilde{g}_{dik}|\\) is larger than \\(1\\). This provides a direct generalization of the requirement \\(|G| \u0026gt; |G_d|\\) for SISO systems.\n If the plant is not controllable, then one may consider another choice of pairing and go back to Step 4. If one still cannot find any pairing which are controllable, then one should consider multivariable control.\nIf the chosen pairing is controllable, then \\eqref{eq:decent_contr_one_loop} tells us how large \\\\(|L\\_i| = |g\\_{ii} k\\_i|\\\\) must be. This can be used as a basis for designing the controller \\\\(k\\_i(s)\\\\) for loop \\\\(i\\\\) Sequential Design of Decentralized Controllers Usually the local controllers \\(k_i(s)\\) are designed locally and then all the loops are closed. One problem with this is that the interactions may cause the overall system \\(T\\) so be unstable, even though the local loops \\(\\tilde{T}\\) are stable. This will not happen if the plant is diagonally dominant, such that we satisfy, for example \\(\\maxsv(\\tilde{T}) \u0026lt; 1/\\mu(E)\\).\nThe stability problem is avoided if the controllers are designed sequentially when, for example, the bandwidths of the loops are quite different. In this case, the outer loops are tuned with the inner loops in place, and each step may be considered as a SISO control problem. In particular, overall stability is determined by \\(m\\) SISO stability conditions. However, the issue of performance is more complicated because the closing of a loop may cause \u0026ldquo;disturbances\u0026rdquo; (interactions) into a previously designed loop. The engineer must then go back and redesign a loop that has been designed earlier. Thus sequential design may involve many iterations.\nConclusion on Decentralized Control A number of conditions for the stability, e.g. \\eqref{eq:decent_contr_cond_stability} and \\eqref{eq:decent_contr_necessary_cond_stability}, and performance, e.g. \\eqref{eq:decent_contr_cond_perf_dist} and \\eqref{eq:decent_contr_cond_perf_ref}, of decentralized control systems have been derived.\nThe conditions may be useful in determining appropriate pairings of inputs and outputs and the sequence in which the decentralized controllers should be designed.\nThe conditions are also useful in an input-output controllability analysis for determining the viability of decentralized control.\nModel Reduction \nIntroduction Modern controller design methods such as \\(\\mathcal{H}_\\infty\\) and LQG, produce controllers of order at least equal to that of the plant, and usually higher because of the inclusion of weights. These control laws may be too complex with regards to practical implementation and simpler designs are then sought. For this purpose, one can either reduce the order of the plant model prior to controller design, or reduce the controller in the final stage.\n Given a high-order linear time-invariant stable model \\(G\\), find a low-order approximation \\(G_a\\) such that the infinity (\\(\\mathcal{H}_\\infty\\) or \\(\\mathcal{L}_\\infty\\)) norm of the difference \\(\\|G - G_a\\|_\\infty\\) is small.\n By model order, we mean the dimension of the state vector in a minimal realization. This is sometimes called the McMillan degree.\nSo far we have only been interested in the infinity (\\(\\mathcal{H}_\\infty\\)) norm of stable systems. But the error \\(G-G_a\\) may be unstable and the definition of the infinity norm needs to be extended to unstable systems.\n \\(\\mathcal{L}_\\infty\\) defines the set of rational functions which have no poles on the imaginary axis, it includes \\(\\mathcal{H}_\\infty\\), and its norm (like \\(\\mathcal{H}_\\infty\\)) is given by\n\\begin{equation} \\|G\\|_\\infty = \\sup_\\omega \\maxsv(G(j\\omega)) \\end{equation}\n We will describe three main methods for this problem:\n Balanced truncation Balanced residualization Optimal Hankel norm approximation Each method gives a stable approximation and a guaranteed bound on the error in the approximation. We will further show how the methods can be employed to reduce the order of an unstable model \\(G\\).\nAll these methods start from a special state-space realization of \\(G\\) referred to as balanced. We will describe this realization, but first we will show how the techniques of truncation and residualization can be used to remove the high frequency or fast modes of a state-space realization.\nTruncation and Residualization Let \\((A,B,C,D)\\) be a minimal realization of a stable system \\(G(s)\\), and partition the state vector \\(x\\), of dimension \\(n\\), into \\(\\colvec{x_1 \\ x_2}\\) where \\(x_2\\) is the vector of \\(n-k\\) states we wish to remove. With approximate partitioning of \\(A\\), \\(B\\) and \\(C\\), the state space equations become\n\\begin{equation} \\begin{aligned} \\dot{x}_1 \u0026amp;= A_{11} x_1 + A_{12} x_2 + B_1 u \\\\\\\n\\dot{x}_2 \u0026amp;= A_{21} x_1 + A_{22} x_2 + B_2 u \\\\\\\ny \u0026amp;= C_1 x_1 + C_2 x_2 + D u \\end{aligned} \\end{equation}\nTruncation A k-th order truncation of the realization \\(G \\triangleq (A, B, C, D)\\) is given by \\(G_a \\triangleq (A_{11}, B_1, C_1, D)\\). The truncated model \\(G_a\\) is equal to \\(G\\) at infinite frequency \\(G(\\infty) = G_a(\\infty) = D\\), but apart from this, we cannot say anything for the general case about the relationship between \\(G\\) and \\(G_a\\).\nIf however, \\(A\\) is in Jordan form, then it is easy to order the states so that \\(x_2\\) corresponds to high frequency or fast modes.\nModal Truncation For simplicity, assume that \\(A\\) has been diagonalized so that\n\\begin{align*} A \u0026amp;= \\begin{bmatrix} \\lambda_1 \u0026amp; 0 \u0026amp; \\dots \u0026amp; 0 \\\\\\\n0 \u0026amp; \\lambda_2 \u0026amp; \\dots \u0026amp; 0 \\\\\\\n\\vdots \u0026amp; \\vdots \u0026amp; \\ddots \u0026amp; \\vdots \\\\\\\n0 \u0026amp; 0 \u0026amp; \\dots \u0026amp; \\lambda_n \\\\\\\n\\end{bmatrix},\\quad B = \\begin{bmatrix} b_1^T \\ b_2^T \\ \\vdots \\ b_n^T \\end{bmatrix} \\\\\\\nC \u0026amp;= \\begin{bmatrix} c_1, c_2, \\dots, c_n \\end{bmatrix} \\end{align*}\nThen, if the \\(\\lambda_i\\) are ordered so that \\(|\\lambda_1| \u0026lt; |\\lambda_2| \u0026lt; \\dots\\), the fastest modes are removed from the model after truncation. The difference between \\(G\\) and \\(G_a\\) following a k-th order model truncation is given by \\[ G - G_a = \\sum_{i = k+1}^n \\frac{c_i b_i^T}{s - \\lambda_i} \\] and therefore\n\\begin{equation} \\| G - G_a \\|_\\infty \\le \\sum_{i = k+1}^n \\frac{\\maxsv(c_i b_i^t)}{|\\text{Re}(\\lambda_i)|} \\end{equation}\nIt is interesting to note that the error depends on the residues \\(c_i b_i^T\\) as well as the \\(\\lambda_i\\). The distance of \\(\\lambda_i\\) from the imaginary axis is therefore not a reliable indicator of whether the associated mode should be included in the reduced order model or not.\nAn advantage of modal truncation is that the poles of the truncated model are a subset of the poles of the original model and therefore retain any physical interpretation they might have.\nResidualization In truncation, we discard all the states and dynamics associated with \\(x_2\\). Suppose that instead of this, we simply set \\(\\dot{x}_2 = 0\\), i.e. we residualize \\(x_2\\), in the state-space equations. One can then solve for \\(x_2\\) in terms of \\(x_1\\) and \\(u\\), and back substitution of \\(x_2\\), then gives\n\\begin{align*} \\dot{x}_1 \u0026amp;= (A_{11} - A_{12} A_{22}^{-1} A_{21}) x_1 + (B_1 - A_{12} A_{22}^{-1} B_2) u \\\\\\\ny \u0026amp;= (C_1 - C_2 A_{22}^{-1} A_{21}) x_1 + (D - C_2 A_{22}^{-1} B_2) u \\end{align*}\nAnd let assume \\(A_{22}\\) is invertible and define\n\\begin{alignat*}{3} \u0026amp;A_r \\triangleq A_{11} - A_{12}A_{22}^{-1}A_{21} \u0026amp; \u0026amp; \\quad B_r \\triangleq B_1 - A_{12}A_{22}^{-1}B_2\\\\\\\n\u0026amp;C_r \\triangleq C_1 - C_2A_{22}^{-1}A_{21} \u0026amp; \u0026amp; \\quad D_r \\triangleq D - C_2A_{22}^{-1}B_2 \\end{alignat*}\nThe reduced order model \\(G_a(s) = (A_r, B_r, C_r, D_r)\\) is called a residualization of \\(G(s) = (A, B, C, D)\\). Usually \\((A, B, C, D)\\) will have been put into Jordan form, with the eigenvalues ordered so that \\(x_2\\) contains the fast modes.\nModel reduction by residualization is then equivalent to singular perturbation approximation, where the derivatives of the fastest states are allowed to approach zero with some parameter \\(\\epsilon\\).\nAn important property of residualization is that it preserves the steady-state gain of the system:\n\\begin{equation} \\tcmbox{G_a(0) = G(0)} \\end{equation}\nThis should be no surprise since the residualization process sets derivatives to zero, which are zero anyway at steady-state. But it is in stark contrast to truncation which retains the system behavior at infinite frequency. This contrast between truncation and residualization follows from the simple bilinear relationship \\(s \\to \\frac{1}{s}\\) which relates the two.\nIt is clear that truncation is to be preferred when accuracy is required at high frequencies, whereas residualization is better for low frequency modelling.\nBoth methods depend to a large extent on the original realization and we have suggested to use of the Jordan form. A better realization, with many useful properties, is the balanced realization.\nBalanced Realization A balanced realization is an asymptotically stable minimal realization in which the controllability and observability Gramiams are equal and diagonal.\nLet \\((A,B,C,D)\\) be a minimal realization of a stable, rational transfer function \\(G(s)\\), then \\((A,B,C,D)\\) is called balanced if the solutions to be following Lyapunov equations\n\\begin{subequations} \\begin{align} AP + PA^T + BB^T \u0026amp;= 0 \\\\\\\nA^TQ + QA + C^TC \u0026amp;= 0 \\end{align} \\end{subequations}\nare \\(P = Q = \\text{diag}(\\sigma_1, \\sigma_2, \\dots, \\sigma_n) \\triangleq \\Sigma\\), where \\(\\sigma_1 \\ge \\sigma_2 \\ge \\dots \\ge \\sigma_n \u0026gt; 0\\). \\(P\\) and \\(Q\\) are the controllability and observability Gramiams, also defined by\n\\begin{subequations} \\begin{align} P \u0026amp;\\triangleq \\int_0^\\infty e^{At} B B^T e^{A^Tt} dt \\\\\\\nQ \u0026amp;\\triangleq \\int_0^\\infty e^{A^Tt} C^T C e^{At} dt \\end{align} \\end{subequations}\n\\(\\Sigma\\) is therefore simply referred to as the Gramiam of \\(G(s)\\). The \\(\\sigma_i\\) are the ordered Hankel singular values of \\(G(s)\\), more generally defined as \\(\\sigma_i \\triangleq \\lambda_i^{\\frac{1}{2}}(PQ)\\), \\(i = 1, \\dots, n\\). Notice that \\(\\sigma_1 = \\|G\\|_H\\) is the Hankel norm of \\(G(s)\\).\nIn balanced realization the value of each \\(\\sigma_i\\) is associated with a state \\(x_i\\) of the balanced system.\n The size of \\(\\sigma_i\\) is a relative measure of the contribution that \\(x_i\\) makes to the input-output behavior of the system.\n Therefore if \\(\\sigma_1 \\gg \\sigma_2\\), then the state \\(x_1\\) affects the input-output behavior much more than \\(x_2\\), or indeed any other state because of the ordering of the \\(\\sigma_i\\).\nAfter balancing a system, each state is just as controllable as it is observable, and a measure of a state\u0026rsquo;s joint observability and controllability is given by its associated Hankel singular value. This property is fundamental to the model reduction methods in the remainder of this chapter which work by removing states having little effect on the system\u0026rsquo;s input-output behavior.\nBalanced Truncation and Balanced Residualization Let the balanced realization \\((A,B,C,D)\\) of \\(G(s)\\) and the corresponding \\(\\Sigma\\) be partitioned compatibly as\n\\begin{equation} \\begin{aligned} A \u0026amp;= \\begin{bmatrix} A_{11} \u0026amp; A_{12} \\\\\\\nA_{21} \u0026amp; A_{22} \\end{bmatrix}, \\quad B = \\begin{bmatrix} B_1 \\ B_2 \\end{bmatrix} \\\\\\\nC \u0026amp;= \\begin{bmatrix} C_1 \u0026amp; C_2 \\end{bmatrix}, \\quad \\Sigma = \\begin{bmatrix} \\Sigma_1 \u0026amp; 0 \\\\\\\n0 \u0026amp; \\Sigma_2 \\end{bmatrix} \\end{aligned} \\end{equation}\nwhere\n\\begin{align*} \\Sigma_1 \u0026amp;= \\text{diag}(\\sigma_1, \\sigma_2, \\dots, \\sigma_k)\\\\\\\n\\Sigma_2 \u0026amp;= \\text{diag}(\\sigma_{k+1}, \\sigma_{k+2}, \\dots, \\sigma_n),\\ \\sigma_k \u0026gt; \\sigma_{k+1} \\end{align*}\nBalanced Truncation The reduced order model given by \\((A_{11},B_1,C_1,D)\\) is called a balanced truncation of the full order system \\(G(s)\\). The idea of balancing truncation is thus to first make a balanced realization of the system and then to discard the states corresponding to small Hankel singular values.\nA balanced truncation is also a balanced realization, and the infinity norm of the error between \\(G(s)\\) and the reduced order system \\(G_a(s)\\) is bounded by twice the sum of the last \\(n-k\\) Hankel singular values, i.e. twice the trace of \\(\\Sigma_2\\):\n\\begin{equation} \\|G(s) - G_a(s)\\|_\\infty \\le 2 \\cdot \\text{Tr}\\big( \\Sigma_2 \\big) \\end{equation}\nFor the case of repeated Hankel singular values, each repeated Hankel singular value is to be counted only once in calculating the sum.\nUseful algorithms that compute balanced truncations without first computing a balanced realization still require the computation of the observability and controllability Gramiam, which can be a problem if the system to be reduced is of very high order.\nBalanced Residualization In balanced truncation above, we discarded the least controllable and observable states corresponding to \\(\\Sigma_2\\). In balanced residualization, we simply set to zero the derivatives of all these states.\nTheorem Let \\(G(s)\\) be a stable rational transfer function with Hankel singular values \\(\\sigma_1 \u0026gt; \\sigma_2 \u0026gt; \\dots \u0026gt; \\sigma_N\\) where each \\(\\sigma_i\\) has multiplicity \\(r_i\\) and let \\(G_a^k(s)\\) be obtained by truncating or residualizing the balanced realization of \\(G(s)\\) to the first \\((r_1 + r_2 + \\dots + r_k)\\) states. Then\n\\begin{equation} \\|G(s) - G_a^k(s)\\|_\\infty \\le 2(\\sigma_{k+1} + \\sigma_{k+2} + \\dots + \\sigma_N) \\end{equation}\nOptimal Hankel Norm Approximation In this approach to model reduction, the problem that is directly addressed is the following: given a stable model \\(G(s)\\) of order \\(n\\), find a reduced order model \\(G_h^k(s)\\) of degree \\(k\\) such that the Hankel norm of the approximation error, \\(\\| G(s) - G_h^k(s) \\|_H\\), is minimized.\n The Hankel norm of any stable transfer function \\(E(s)\\) is defined as\n\\begin{equation} \\| E(s) \\|_H \\triangleq \\rho^{\\frac{1}{2}} (PQ) \\end{equation}\nwhere \\(P\\) and \\(Q\\) are the controllability and observability Gramiams of \\(E(s)\\).\n So in the optimization we seek an error which is in some sense closest to being completely unobservable and completely uncontrollable.\nThe infinity norm bound on the approximate error for the optimal Hankel norm approximation is better than for balanced truncation and residualization. This is shown with the following theorem.\nTheorem Let \\(G(s)\\) be a stable, square, transfer function \\(G(s)\\) with Hankel singular values \\(\\sigma_1 \\ge \\sigma_2 \\ge \\dots \\ge \\sigma_k \\ge \\sigma_{k+1} = \\sigma_{k+2} = \\dots = \\sigma_{k+l} \u0026gt; \\sigma_{k+l+1} \\ge \\dots \\ge \\sigma_n \u0026gt; 0\\). An optimal Hankel norm approximation of order \\(k\\), \\(G_h^k(s)\\), can be constructed as follows.\nLet \\((A,B,C,D)\\) be a balanced realization of \\(G(s)\\) with the Hankel singular values reordered so that the Gramiam matrix is\n\\begin{align*} \\Sigma \u0026amp;= \\text{diag}(\\sigma_1,\\dots,\\sigma_k,\\sigma_{k+l+1},\\dots,\\sigma_n,\\sigma_{k+1},\\dots,\\sigma_{k+l})\\\\\\\n\u0026amp;\\triangleq \\text{diag}(\\Sigma_l, \\sigma_{k+1}I) \\end{align*}\nPartition \\((A,B,C,D)\\) to conform with \\(\\Sigma\\) \\[ A = \\begin{bmatrix} A_{11} \u0026amp; A_{12} \\ A_{21} \u0026amp; A_{22} \\end{bmatrix},\\ B = \\begin{bmatrix} B_1 \\ B_2 \\end{bmatrix},\\ C = \\begin{bmatrix} C_1 \u0026amp; C_2 \\end{bmatrix} \\] Define \\((\\hat{A},\\hat{B},\\hat{C},\\hat{D})\\) by\n\\begin{subequations} \\begin{align} \\hat{A} \u0026amp;\\triangleq \\Gamma^{-1} \\left( \\sigma_{k+1}^2 A_{11}^T + \\sigma_1 A_{11} \\Sigma_1 - \\sigma_{k+1} C_{1}^T U B_{1}^T \\right) \\\\\\\n\\hat{B} \u0026amp;\\triangleq \\Gamma^{-1} \\left( \\sigma_1 B_1 + \\sigma_{k+1} C_1^T U \\right) \\\\\\\n\\hat{C} \u0026amp;\\triangleq C_1 \\Sigma_1 + \\sigma_{k+1} U B_1^T \\\\\\\n\\hat{D} \u0026amp;\\triangleq D - \\sigma_{k+1} U \\end{align} \\end{subequations}\nwhere \\(U\\) is a unitary matrix satisfying \\[ B_2 = - C_2^T U \\ \\text{ and } \\ \\Gamma \\triangleq \\Sigma_1^2 - \\sigma_{k+1}^2 I \\]\nThe matrix \\(\\hat{A}\\) has \\(k\\) \u0026ldquo;stable\u0026rdquo; eigenvalues; the remaining ones are in the open right-half plane. Then \\[ G_h^k(s) + F(s) = \\left[ \\begin{array}{c|cc} \\hat{A} \u0026amp; \\hat{B} \\ \\hline \\hat{C} \u0026amp; \\hat{D} \\end{array} \\right] \\] where \\(G_h^k(s)\\) is a stable optimal Hankel norm approximation of order \\(k\\), and \\(F(s)\\) is an anti-stable (all poles in the open right-half plane) transfer function of order \\(n-k-l\\). The Hankel norm of the error between \\(G\\) and the optimal approximation \\(G_h^k\\) is equal to the \\((k+1)\\text{\u0026lsquo;th}\\) Hankel singular value of \\(G\\):\n\\begin{equation} \\tcmbox{\\| G - G_h^k \\|_H = \\sigma_{k+1}(G)} \\end{equation}\nModel Reduction - Practical Summary Reduction of model Three reduction techniques have been discussed here: balanced residualization, balance truncation and optimal Hankel norm approximation.\nIt is sometimes desirable to have the steady-state gain of the reduced plant model the same as the full order model. For instance, this is the case if we want to use feedforward control. The truncated and optimal Hankel norm approximated systems do not preserve the steady-state gain and they have to be scaled, i.e. the model approximation \\(G_a\\) is replaced by \\(G_a W_s\\) where \\(W_a = G_a(0)^{-1} G(0)\\), \\(G(s)\\) being the full order model.\nHowever, this scaling generally introduced large model errors at other frequencies.\n Hence residualization is to be preferred whenever low frequency matching is desired.\n Reduction of a 2 degrees-of-freedom controller Let\u0026rsquo;s consider a 2 degrees-of-freedom controller \\(K = [K_1\\ K_2]\\). In order ensure perfect steady-state tracking, i.e. to match \\(T_{\\text{ref}}\\) at steady-state, a prefilter \\(W_i\\) is added to scale the controller: \\(K = [K_1 W_i\\ K_2]\\).\nThere are two approaches for order reduction:\n the scaled controller \\([K_1 W_i\\ K_2]\\) is reduced. A balanced residualization of the controller preserves the controller\u0026rsquo;s steady state gain and would not need to be scaled again. Reductions via truncation and optimal Hankel norm approximation techniques, however, lose the steady-state gain and reduced controllers would need to be re-scaled to match \\(T_{\\text{ref}}(0)\\) the full order controller \\([K_1\\ K_2]\\) is reduced without first scaling the prefilter. In which case, scaling is done after reduction. A larger scaling is generally required for the truncated and optimal Hankel norm approximated controllers and this gives poorer model matching at other frequencies. In both cases, the balanced residualization is preferred.\nReduction of Unstable Models Balanced truncation, balanced residualization and optimal Hankel norm approximation only apply to stable models. In this section we briefly present two approaches for reducing the order of an unstable model.\nStable Part Model Reduction The unstable model can be first decomposed into its stable and anti-stable parts:\n\\begin{equation} G(s) = G_u(s) + G_s(s) \\end{equation}\nwhere \\(G_u(s)\\) has all its poles in the closed right-half plane and \\(G_s(s)\\) has all its poles in the open left-half plane. Balanced truncation, balanced residualization or optimal Hankel norm approximation can then be applied to the stable part \\(G_s(s)\\) to find a reduced order approximation \\(G_{sa}(s)\\). This is then added to the anti-stable part to give\n\\begin{equation} G_a(s) = G_u(s) + G_{sa}(s) \\end{equation}\nas an approximation to the full order model \\(G(s)\\).\nCoprime Factor Model Reduction The coprime factors of a transfer function \\(G(s)\\) are stable, and therefore we could reduce the order of these factors using balanced truncation, balanced residualization or optimal Hankel norm approximation:\n Let \\(G(s) = M^{-1}(s) N(s)\\), where \\(M(s)\\) and \\(N(s)\\) are stable left-coprime factors of \\(G(s)\\) Approximate \\([N\\ M]\\) of degree \\(n\\) by \\([N_a \\ M_a]\\) of degree \\(k\u0026lt;n\\), using balanced truncation, balanced residualization or optimal Hankel norm approximation Realize the reduced order transfer function \\(G_a(s)\\), or degree \\(k\\), by \\(G_a(s) = M_a^{-1}(s) N_a(s)\\) Theorem Let \\((N,M)\\) be a normalized left-coprime factorization of \\(G(s)\\) of degree \\(n\\). Let \\([N_a,\\ M_a]\\) be a degree \\(k\\) balanced truncation of \\([N\\ M]\\) which has Hankel singular values \\(\\sigma_1 \\ge \\sigma_2 \\ge \\dots \\ge \\sigma_k \\ge \\sigma_{k+1} \\ge \\dots \\ge \\sigma_n \u0026gt; 0\\). Then \\((N_a, M_a)\\) is a normalized left-coprime factorization of \\(G_a = M_a^{-1} N_a\\), and \\([N_a,\\ M_a]\\) has Hankel singular values \\(\\sigma_1, \\sigma_2, \\dots, \\sigma_k\\).\nConclusion We have presented and compared three main methods for model reduction based on balanced realizations: balanced truncation, balanced residualization and optimal Hankel norm approximation.\nResidualization, unlike truncation and optimal Hankel norm approximation, preserves the steady-state gain of the system, and like truncation, it is simple and computationally inexpensive. It is observed that truncation and optimal Hankel norm approximation perform better at high frequencies, where residualization performs better at low and medium frequencies, i.e. up to the critical frequencies.\nThus for plant model reduction, where models are not accurate at high frequencies to start with, residualization would seem to be a better option. Further, if the steady state gains are to be kept unchanged, truncated and optimal Hankel norm approximated systems require scaling, which may result in large errors. In such a case, too, residualization would be preferred choice.\nFor controller reduction, we have shown in a two degrees-of-freedom example, the importance of scaling and steady-state gain matching.\nIn general, steady-state gain matching may not be crucial, but the matching should usually be good near the desired closed-loop bandwidth. Balanced residualization has been seen to perform close to the full order system in this frequency range. Good approximation at high frequencies may also sometimes be desired. In such a case, using truncation or optimal Hankel norm approximation with appropriate frequency weightings may yield better results.\nBibliography Skogestad, S., \u0026amp; Postlethwaite, I., Multivariable feedback control: analysis and design (2007), : John Wiley. ↩\n","permalink":"/book/skogestad07_multiv_feedb_contr/","tags":null,"title":"Multivariable feedback control: analysis and design"},{"categories":null,"contents":"Tags :\n\u0026lt;./biblio/references.bib\u0026gt;\nBacklinks Interferometric characterization of rotation stages for x-ray nanotomography Automated markerless full field hard x-ray microscopic tomography at sub-50 nm 3-dimension spatial resolution An instrument for 3d x-ray nano-imaging ","permalink":"/zettels/nano_active_stabilization_system/","tags":null,"title":"Nano Active Stabilization System"},{"categories":null,"contents":" Tags Stewart Platforms, Flexible Joints Reference (Katsushi Furutani {\\it et al.}, 2004) Author(s) Furutani, K., Suzuki, M., \u0026amp; Kudoh, R. Year 2004 Lever mechanism to amplify the motion of piezoelectric stack actuators Use of flexure joints Eddy current displacement sensors for control (decentralized) Isotropic performance (cubic configuration even if not said so) Possible sources of error:\n position error of the link ends in assembly =\u0026gt; simulation of position error and it is not significant Inaccurate modelling of the links insufficient generative force unwanted deformation of the links To minimize the errors, a calibration is done between the required leg length and the wanted platform pose. Then, it is fitted with 4th order polynomial and included in the control architecture.\nBibliography Furutani, K., Suzuki, M., \u0026amp; Kudoh, R., Nanometre-cutting machine using a stewart-platform parallel mechanism, Measurement Science and Technology, 15(2), 467–474 (2004). http://dx.doi.org/10.1088/0957-0233/15/2/022 ↩\n","permalink":"/paper/furutani04_nanom_cuttin_machin_using_stewar/","tags":null,"title":"Nanometre-cutting machine using a stewart-platform parallel mechanism"},{"categories":null,"contents":" Tags Sensor Fusion, Force Sensors Reference (Fleming, 2010) Author(s) Fleming, A. Year 2010 Summary:\n The noise generated by a piezoelectric force sensor is much less than a capacitive sensor Dynamical model of a piezoelectric stack actuator and piezoelectric force sensor Noise of a piezoelectric force sensor IFF with a piezoelectric stack actuator and piezoelectric force sensor A force sensor is used as a displacement sensor below the frequency of the first zero Sensor fusion architecture with a capacitive sensor and a force sensor and using complementary filters Virtual sensor fusion architecture (called low-frequency bypass) Analog implementation of the control strategies to avoid quantization noise, finite resolution and sampling delay Model of a multi-layer monolithic piezoelectric stack actuator \n Figure 1: Schematic of a multi-layer monolithic piezoelectric stack actuator model\n The actuator experiences an internal stress in response to an applied voltage. This stress is represented by the voltage dependent force \\(F_a\\) and is related to free displacement by \\[ \\Delta L = \\frac{F_a}{k_a} \\]\n \\(\\Delta L\\) is the change in actuator length in [m] \\(k_a\\) is the actuator stiffness in [N/m] The developed force \\(F_a\\) is related to the applied voltage by: \\[ \\Delta L = d_{33} n V_a \\]\n \\(d_{33}\\) is the piezoelectric strain constant in [m/V] \\(n\\) is the number of layers \\(V_a\\) is the applied voltage in [V] Combining the two equations, we obtain: \\[ F_a = d_{33} n k_a V_a \\]\nThe ratio of the developed force to applied voltage is \\(d_{33} n k_a\\) in [N/V]. We denote this constant by \\(g_a\\) and: \\[ F_a = g_a V_a, \\quad g_a = d_{33} n k_a \\]\nDynamics of a piezoelectric force sensor Piezoelectric force sensors provide a high sensitivity and bandwidth with low noise at high frequencies.\nIf a single wafer of piezoelectric material is sandwiched between the actuator and platform: \\[ D = d_{33} T \\]\n \\(D\\) is the amount of generated charge per unit area in \\([C/m^2]\\) \\(T\\) is the stress in \\([N/m^2]\\) \\(d_{33}\\) is the piezoelectric strain constant in \\([m/V] = [C/N]\\) The generated charge is then \\[ q = d_{33} F_s \\]\nIf an n-layer piezoelectric transducer is used as a force sensor, the generated charge is then: \\[ q = n d_{33} F_s \\]\n We can use a charge amplifier to measure the force \\(F_s\\).\n Figure 2: Electrical model of a piezoelectric force sensor is shown in gray. Developed charge \\(q\\) is proportional to the strain and hence the force experienced by the sensor. Op-amp charge amplifier produces an output voltage \\(V_s\\) equal to \\(-q/C_s\\)\n The output voltage \\(V_s\\) is equal to \\[ V_s = -\\frac{q}{C_s} = -\\frac{n d_{33}F_s}{C_s} \\] that is, the scaling between the force and voltage is \\(-\\frac{n d_{33}F_s}{C_s}\\ [V/N]\\) .\n We can also use a voltage amplifier. In that case, the generated charge is deposited on the transducer\u0026rsquo;s internal capacitance.\nThe open-circuit voltage of a piezoelectric force sensor is: \\[ V_s = \\frac{n d_{33} F_s}{C} \\]\n \\(C\\) is the transducer capacitance defined by \\(C = n \\epsilon_T A / h\\) in [F] \\(A\\) is the area in \\([m^2]\\) \\(h\\) is the layer thickness in [m] \\(\\epsilon_T\\) is the dielectric permittivity under a constant stress in \\([F/m]\\) We obtain \\[ V_s = g_s F_s, \\quad g_s = \\frac{n d_{33}}{C} \\]\nNoise of a piezoelectric force sensor As piezoelectric sensors have a capacitive source impedance, the sensor noise density \\(N_{V_s}(\\omega)\\) is primarily due to current noise \\(i_n\\) reacting the capacitive source impedance: \\[ N_{V_s}(\\omega) = i_n \\frac{1}{C \\omega} \\]\n \\(N_{V_s}\\) is the measured noise in \\(V/\\sqrt{\\text{Hz}}\\) \\(i_n\\) is the current noise in \\(A/\\sqrt{\\text{Hz}}\\) \\(C\\) is the capacitance of the piezoelectric in \\(F\\) The current noise density of a general purpose LM833 FET-input op-amp is \\(0.5\\ pA/\\sqrt{\\text{Hz}}\\). The capacitance of a piezoelectric stack is typically between \\(1 \\mu F\\) and \\(100 \\mu F\\).\nBibliography Fleming, A., Nanopositioning system with force feedback for high-performance tracking and vibration control, IEEE/ASME Transactions on Mechatronics, 15(3), 433–447 (2010). http://dx.doi.org/10.1109/tmech.2009.2028422 ↩\nBacklinks Actuators Force Sensors ","permalink":"/paper/fleming10_nanop_system_with_force_feedb/","tags":null,"title":"Nanopositioning system with force feedback for high-performance tracking and vibration control"},{"categories":null,"contents":" Tags Sensor Fusion Reference (Abu Sebastian \u0026amp; Angeliki Pantazi, 2012) Author(s) Sebastian, A., \u0026amp; Pantazi, A. Year 2012 Bibliography Sebastian, A., \u0026amp; Pantazi, A., Nanopositioning with multiple sensors: a case study in data storage, IEEE Transactions on Control Systems Technology, 20(2), 382–394 (2012). http://dx.doi.org/10.1109/tcst.2011.2177982 ↩\n","permalink":"/paper/sebastian12_nanop_with_multip_sensor/","tags":null,"title":"Nanopositioning with multiple sensors: a case study in data storage"},{"categories":null,"contents":" Tags Stewart Platforms, Reference Books Reference (Taghirad, 2013) Author(s) Taghirad, H. Year 2013 Introduction \nThis book is intended to give some analysis and design tools for the increase number of engineers and researchers who are interested in the design and implementation of parallel robots. A systematic approach is presented to analyze the kinematics, dynamics and control of parallel robots. To define the motion characteristics of such robots, it is necessary to represent 3D motion of the robot moving platform with respect to a fixed coordinate. This issue leads to the requirements for 3D representation of position, orientation and motion of bodies in space. In chapter sec:motion_representation, such representation are introduced with emphasis on screw coordinates, which makes the representation of the general motion of the robot much easier to follow.\nKinematic analysis refers to the study of robot motion geometry without considering the forces and torques that cause the motion. In this analysis (chapter sec:kinematics), the relation between the geometrical parameters of the manipulator and the final motion of the moving platform is derived and analyzed.\nIn Chapter sec:jacobian, the kinematics analysis of robot manipulators is further examined beyond static positioning. Jacobian analysis not only reveals the relation between the joint variable velocities of a parallel manipulator and the moving platform linear and angular velocities, but also constructs the transformation needed to find the actuator forces from the forces and moments acting on the moving platform. A systematic means to perform Jacobian analysis of parallel manipulators is given in this chapter.\nDynamic analysis of parallel manipulators presents an inherent complexity due to their closed-loop structure and kinematic constraints. Nevertheless, dynamic modeling is quite important for the control, in particular because parallel manipulators are preferred in applications where precise positioning and suitable dynamic performance under high loads are the prime requirements. In Chapter sec:dynamics, the dynamic analysis of such robots is examined through three methods, namely the Newton-Euler principle of virtual work and Lagrange formations. Furthermore, a method is presented in this chapter to formulate the dynamic equation of parallel robots into closed form, by which the dynamic matrices are more tractable, and dynamics verification becomes feasible.\nThe control of parallel robots is elaborated in the last two chapters, in which both the motion and force control are covered.\nMotion Representation \nSpatial Motion Representation Six independent parameters are sufficient to fully describe the spatial location of a rigid body.\nConsider a rigid body in a spatial motion as represented in Figure fig:rigid_body_motion. Let us define:\n A fixed reference coordinate system \\((x, y, z)\\) denoted by frame \\(\\{\\bm{A}\\}\\) whose origin is located at point \\(O_A\\) A moving coordinate system \\((u, v, z)\\) denoted by frame \\(\\{\\bm{B}\\}\\) attached to the rigid body at point \\(O_B\\) The absolute position of point \\(P\\) of the rigid body can be constructed from the relative position of that point with respect to the moving frame \\(\\{\\bm{B}\\}\\), and the position and orientation of the moving frame \\(\\{\\bm{B}\\}\\) with respect to the fixed frame \\(\\{\\bm{A}\\}\\).\n\n Figure 1: Representation of a rigid body spatial motion\n Position of a point The position of a point \\(P\\) with respect to a frame \\(\\{\\bm{A}\\}\\) can be described by a \\(3 \\times 1\\) position vector. The name of the frame is usually added as a leading superscript: \\({}^A\\bm{P}\\) which reads as vector \\(\\bm{P}\\) in frame \\(\\{\\bm{A}\\}\\).\n\\begin{equation} \\tcmbox{{}^A\\bm{P} = \\begin{bmatrix} P_x\\ P_y\\ P_z \\end{bmatrix}} \\end{equation}\nOrientation of a Rigid Body The orientation of the whole rigid body is the same for all its points (by definition). Hence, representation of the orientation of a rigid body can be viewed as that for the orientation of a moving frame attached to the rigid body. It can be represented in several different ways: the rotation matrix, the screw axis representation and Euler angles are common descriptions.\nRotation Matrix We consider a rigid body that has been exposed to a pure rotation. Its orientation has changed from a state represented by frame \\(\\{\\bm{A}\\}\\) to its current orientation represented by frame \\(\\{\\bm{B}\\}\\) (Figure 2).\nA \\(3 \\times 3\\) rotation matrix \\({}^A\\bm{R}_B\\) is defined by\n\\begin{equation} \\tcmbox{{}^A\\bm{R}_B = \\left[ {}^A\\hat{\\bm{x}}_B | {}^A\\hat{\\bm{y}}_B | {}^A\\hat{\\bm{z}}_B \\right] = \\begin{bmatrix} u_{x} \u0026amp; v_{x} \u0026amp; z_{x} \\\\\\\nu_{y} \u0026amp; v_{y} \u0026amp; z_{y} \\\\\\\nu_{z} \u0026amp; v_{z} \u0026amp; z_{z} \\end{bmatrix}} \\end{equation}\nin which \\({}^A\\hat{\\bm{x}}_B, {}^A\\hat{\\bm{y}}_B\\) and \\({}^A\\hat{\\bm{z}}_B\\) are the Cartesian unit vectors of frame \\(\\{\\bm{B}\\}\\) represented in frame \\(\\{\\bm{A}\\}\\).\n\\begin{align*} {}^A\\hat{\\bm{x}}_B \u0026amp;= {}^A\\hat{u} = u_x \\hat{i} + u_y \\hat{j} + u_z \\hat{k} \\\\\\\n{}^A\\hat{\\bm{y}}_B \u0026amp;= {}^A\\hat{v} = v_x \\hat{i} + v_y \\hat{j} + v_z \\hat{k} \\\\\\\n{}^A\\hat{\\bm{z}}_B \u0026amp;= {}^A\\hat{w} = w_x \\hat{i} + w_y \\hat{j} + w_z \\hat{k} \\end{align*}\nThe nine elements of the rotation matrix can be simply represented as the projections of the Cartesian unit vectors of frame \\(\\{\\bm{B}\\}\\) on the unit vectors of frame \\(\\{\\bm{A}\\}\\).\n\n Figure 2: Pure rotation of a rigid body\n The rotation matrix has a number of properties linking each of its nine elements:\n Orthonormality: the rotation matrix is an orthonormal matrix Transposition: \\({}^B\\bm{R}_A = {}^A\\bm{R}_B^{T}\\) Inverse: \\({}^B\\bm{R}_A = {}^A\\bm{R}_B^{-1} = {}^A\\bm{R}_B^{T}\\) Pure Rotation Mapping: Suppose that the point of a rigid body with respect to the moving frame \\(\\{\\bm{B}\\}\\) is given and denoted by \\({}^B\\bm{P}\\) and we wish to express the position of this point with respect to the fixed frame \\(\\{\\bm{A}\\}\\). Consider that the rigid body has been exposed to a pure rotation (\\(\\{\\bm{A}\\}\\) and \\(\\{\\bm{B}\\}\\) are coincident at their origins). Then \\[ \\tcmbox{{}^A\\bm{P} = {}^A\\bm{R}_B {}^B\\bm{P}} \\] Determinant: \\(\\det({}^A\\bm{R}_B) = 1\\) Eigenvalues: The eigenvalues of a rotation matrix \\({}^A\\bm{R}_B\\) are equal to \\(1\\), \\(e^{i\\theta}\\) and \\(e^{-i\\theta}\\) where \\(\\theta\\) is calculated from \\(\\theta = \\cos^{-1}\\frac{\\text{tr}({}^A\\bm{R}_B) - 1}{2}\\). Screw Axis Representation As seen previously, there exist an invariant angle \\(\\theta\\) corresponding to the rotation matrix. This angle is an equivalent angle of rotation. The rotation is a spatial change of orientation about an axis which is called the screw axis. It can be shown that this screw axis is also an invariant of the rotation matrix, it is the eigenvector corresponding to the eigenvalue \\(\\lambda = 1\\).\nThe term screw axis for this axis of rotation has the benefit that a general motion of a rigid body, which is composed as a pure translation and a pure rotation, can be further represented by the same axis of rotation.\nThe screw axis representation has the benefit of using only four parameters to describe a pure rotation. These parameters are the angle of rotation \\(\\theta\\) and the axis of rotation which is a unit vector \\({}^A\\hat{\\bm{s}} = [s_x, s_y, s_z]^T\\).\n\n Figure 3: Pure rotation about a screw axis\n The Rodrigue\u0026rsquo;s rotation formula for spatial rotation of a rigid body gives us the new position \\(\\bm{P}_2\\) of point \\(\\bm{P}_1\\) after a rotation represented by the screw axis \\(\\hat{\\bm{s}}\\) and the angle \\(\\theta\\):\n\\begin{equation} \\tcmbox{\\bm{P}_2 = \\bm{P}_1 \\cos \\theta + (\\hat{\\bm{s}} \\times \\bm{P}_1)\\sin\\theta + (\\bm{P}_1 \\cdot \\hat{\\bm{s}})\\hat{\\bm{s}}} \\end{equation}\nEuler Angles Since rotation in space is a motion with three-degrees-of-freedom, a set of three independent parameters is sufficient to represent the orientation.\nIn an Euler angle representation, three successive rotations about the coordinate system of either fixed or moving frame are used to describe the orientation of the rigid body.\nOne type of Euler angle corresponds to rotations considered with respect to the fixed frame. The representation is called pitch-roll-yaw, or fixed X-Y-Z Euler angles.\nThree other types of Euler angles are consider with respect to a moving frame: they are denoted \\(w-v-u\\), \\(w-v-w\\) and \\(w-u-w\\) Euler angles.\nPitch-Roll-Yaw Euler Angles The pitch, roll and yaw angles are defined for a moving object in space as the rotations along the lateral, longitudinal and vertical axes attached to the moving object.\n\n Figure 4: Definition of pitch, roll and yaw angles on an air plain\n Since all three rotations take place about the axes of a fixed coordinate frame, the resulting rotation matrix is obtained by multiplying the three basic rotation matrices as follows: \\[ \\tcmbox{\\bm{R}_{PRY}(\\alpha, \\beta, \\gamma) = \\bm{R}_z(\\gamma) \\bm{R}_y(\\beta) \\bm{R}_x(\\alpha)} \\]\nTo go from rotation matrix to Pitch-Roll-Yaw angles, the following set of equations can be used:\n\\begin{align*} \\alpha \u0026amp;= \\atan2\\left( \\frac{r_{32}}{\\cos \\beta}, \\frac{r_{33}}{\\cos \\beta} \\right) \\\\\\\n\\beta \u0026amp;= \\atan2\\left( -r_{31}, \\pm \\sqrt{r_{11}^2 + r_{21}^2} \\right) \\\\\\\n\\gamma \u0026amp;= \\atan2\\left( \\frac{r_{21}}{\\cos \\beta}, \\frac{r_{11}}{\\cos \\beta} \\right) \\end{align*}\nu-v-w Euler Angles Another way to describe the orientation of a moving object is to consider three successive rotations about the coordinate axes of the moving frame. Since the rotations do not occur about fixed axes, pre-multiplications of the individual rotation matrices fails to give the correct solution. It can be shown that the resulting matrix can be derived by post-multiplication of the individual rotation matrices as follows: \\[ {}^A\\bm{R}_B(\\alpha, \\beta, \\gamma) = \\bm{R}_u(\\alpha) \\bm{R}_v(\\beta) \\bm{R}_w(\\gamma) \\]\nThe inverse solution for the u-v-w Euler angles is the following (for \\(\\cos \\beta \\ne 0\\)):\n\\begin{align*} \\alpha \u0026amp;= \\atan2\\left( -\\frac{r_{23}}{\\cos \\beta}, \\frac{r_{33}}{\\cos \\beta} \\right) \\\\\\\n\\beta \u0026amp;= \\atan2\\left( r_{13}, \\pm \\sqrt{r_{11}^2 + r_{12}^2} \\right) \\\\\\\n\\gamma \u0026amp;= \\atan2\\left( -\\frac{r_{12}}{\\cos \\beta}, \\frac{r_{11}}{\\cos \\beta} \\right) \\end{align*}\nw-v-w Euler Angles Similarly: \\[ \\bm{R}_{wvw}(\\alpha, \\beta, \\gamma) = \\bm{R}_w(\\alpha) \\bm{R}_v(\\beta) \\bm{R}_w(\\gamma) \\]\nAnd for \\(\\sin\\beta\\ne0\\):\n\\begin{align*} \\alpha \u0026amp;= \\atan2\\left( \\frac{r_{23}}{\\sin\\beta}, \\frac{r_{13}}{\\sin\\beta} \\right) \\\\\\\n\\beta \u0026amp;= \\atan2\\left( \\pm \\sqrt{r_{31}^2 + r_{32}^2}, r_{33} \\right) \\\\\\\n\\gamma \u0026amp;= \\atan2\\left( \\frac{r_{32}}{\\sin\\beta}, -\\frac{r_{31}}{\\sin\\beta} \\right) \\end{align*}\nw-u-w Euler Angles Here, the second rotation is about the \\(u\\) axis: \\[ \\bm{R}_{wuw}(\\alpha, \\beta, \\gamma) = \\bm{R}_w(\\alpha) \\bm{R}_u(\\beta) \\bm{R}_w(\\gamma) \\]\nAnd for \\(\\sin\\beta\\ne0\\):\n\\begin{align*} \\alpha \u0026amp;= \\atan2\\left( \\frac{r_{13}}{\\sin\\beta}, -\\frac{r_{23}}{\\sin\\beta} \\right) \\\\\\\n\\beta \u0026amp;= \\atan2\\left( \\pm \\sqrt{r_{31}^2 + r_{32}^2}, r_{33} \\right) \\\\\\\n\\gamma \u0026amp;= \\atan2\\left( \\frac{r_{31}}{\\sin\\beta}, \\frac{r_{32}}{\\sin\\beta} \\right) \\end{align*}\nNotes about Euler Angles If the Euler angle is given, a unique rotation matrix is determined for the orientation of the rigid body. However, the inverse map is not one-to-one, and at least two Euler angle sets can be found for each orientation.\nIf the Euler angle is chosen for the representation of the orientation, extra care should be taken. From the continuity of the motion, a suitable solution may be chosen, such that no abrupt changes are seen in the variation of the Euler angles in a typical maneuver.\nThe use of rotation matrix to represent the orientation of a rigid body is then generally preferred although there are nine parameters for that description.\nMotion of a Rigid Body Since the relative positions of a rigid body with respect to a moving frame \\(\\{\\bm{B}\\}\\) attached to it is fixed for all time, it is sufficient to know the position of the origin of the frame \\(O_B\\) and the orientation of the frame \\(\\{\\bm{B}\\}\\) with respect to the fixed frame \\(\\{\\bm{A}\\}\\), to represent the position of any point \\(P\\) in the space.\nRepresentation of the position of \\(O_B\\) is uniquely given by the position vector, while orientation of the rigid body is represented in different forms. However, for all possible orientation representation, a rotation matrix \\({}^A\\bm{R}_B\\) can be derived.\n Therefore, the location or pose of a rigid body, can be fully determined by:\n The position vector of point \\(O_B\\) with respect to frame \\(\\{\\bm{A}\\}\\) which is denoted \\({}^A\\bm{P}_{O_B}\\) The orientation of the rigid body, or the moving frame \\(\\{\\bm{B}\\}\\) attached to it with respect to the fixed frame \\(\\{\\bm{A}\\}\\), that is represented by \\({}^A\\bm{R}_B\\). The position of any point \\(P\\) of the rigid body with respect to the fixed frame \\(\\{\\bm{A}\\}\\), which is denoted \\({}^A\\bm{P}\\) may be determined thanks to the Chasles\u0026rsquo; theorem.\n If the pose of a rigid body \\(\\{{}^A\\bm{R}_B, {}^A\\bm{P}_{O_B}\\}\\) is given, then the position of any point \\(P\\) of this rigid body with respect to \\(\\{\\bm{A}\\}\\) is given by:\n\\begin{equation} {}^A\\bm{P} = {}^A\\bm{R}_B {}^B\\bm{P} + {}^A\\bm{P}_{O_B} \\end{equation}\n Homogeneous Transformations To describe general transformations, we introduce the \\(4\\times1\\) homogeneous coordinates, and Eq. eq:chasles_therorem is generalized to\n\\begin{equation} \\tcmbox{{}^A\\bm{P} = {}^A\\bm{T}_B {}^B\\bm{P}} \\end{equation}\nin which \\({}^A\\bm{T}_B\\) is a \\(4\\times4\\) homogeneous transformation matrix.\nHomogeneous Coordinates There are two basic classes of vector quantities, the generalization to homogeneous coordinates of which are different.\nThe first type is called line vector. Line vectors refer to a vector of which its value depends on the line of action, or the position of where it is applied. Examples are the position vector, linear velocity, force vector.\nOn the contrary, there exist quantities likes orientation that hold for the whole rigid body and do not correspond to a point. They can be positioned freely throughout the whole rigid body, without any change in their quantity. These types of vectors are called free vectors.\nFor line vectors, both orientation and translation of the moving frame contribute to their value. Homogeneous coordinate of such vectors is generated by appending \\(1\\) to the three components of that vector:\n\\begin{equation} \\tcmbox{\\bm{V} = \\begin{bmatrix} v_x \\ v_y \\ v_z \\ 1 \\end{bmatrix}} \\end{equation}\nFor free vectors, only the orientation of the moving frame contributes to their value. The homogeneous coordinate is then\n\\begin{equation} \\tcmbox{\\bm{\\omega} = \\begin{bmatrix} \\omega_x \\ \\omega_y \\ \\omega_z \\ 0 \\end{bmatrix}} \\end{equation}\nHomogeneous Transformation Matrix The homogeneous transformation matrix is a \\(4\\times4\\) matrix, defined for the purpose of transformation mapping of a vector in a homogeneous coordinate from one frame to another in a compact form. The matrix is composed of the rotation matrix \\({}^A\\bm{R}_B\\) representing the orientation and the position vector \\({}^A\\bm{P}_{O_B}\\) representing the translation. It is partitioned as follows:\n\\begin{equation} {}^A\\bm{T}_B = \\left[ \\begin{array}{ccc|c} \u0026amp; \u0026amp; \u0026amp; \\\\\\\n\u0026amp; {}^A\\bm{R}_B \u0026amp; \u0026amp; {}^A\\bm{P}_{O_B} \\\\\\\n\u0026amp; \u0026amp; \u0026amp; \\\\\\\n\\hline 0 \u0026amp; 0 \u0026amp; 0 \u0026amp; 1 \\\\\\\n\\end{array} \\right] \\end{equation}\n The homogeneous transformation matrix \\({}^A\\bm{T}_B\\) is a \\(4\\times4\\) matrix operator mapping vector valued quantities represented by \\(4\\times1\\) homogeneous coordinates.:\n\\begin{align*} \\left[ \\begin{array}{c} \\ {}^A\\bm{P} \\ \\ \\hline 1 \\end{array} \\right] \u0026amp; = \\left[ \\begin{array}{ccc|c} \u0026amp; \u0026amp; \u0026amp; \\\\\\\n\u0026amp; {}^A\\bm{R}_B \u0026amp; \u0026amp; {}^A\\bm{P}_{O_B} \\\\\\\n\u0026amp; \u0026amp; \u0026amp; \\\\\\\n\\hline 0 \u0026amp; 0 \u0026amp; 0 \u0026amp; 1 \\\\\\\n\\end{array} \\right] \\left[ \\begin{array}{c} \\ {}^B\\bm{P} \\ \\ \\hline 1 \\end{array} \\right] \\\\\\\n{}^A\\bm{P} \u0026amp;= {}^A\\bm{R}_B {}^B\\bm{P} + {}^A\\bm{P}_{O_B} \\end{align*}\nUsing homogeneous coordinate for a free vector like angular velocity of a rigid body:\n\\begin{align*} \\left[ \\begin{array}{c} \\ {}^A\\bm{\\omega} \\ \\ \\hline 0 \\end{array} \\right] \u0026amp; = \\left[ \\begin{array}{ccc|c} \u0026amp; \u0026amp; \u0026amp; \\\\\\\n\u0026amp; {}^A\\bm{R}_B \u0026amp; \u0026amp; {}^A\\bm{P}_{O_B} \\\\\\\n\u0026amp; \u0026amp; \u0026amp; \\\\\\\n\\hline 0 \u0026amp; 0 \u0026amp; 0 \u0026amp; 1 \\\\\\\n\\end{array} \\right] \\left[ \\begin{array}{c} \\ {}^B\\bm{\\omega} \\ \\ \\hline 0 \\end{array} \\right] \\\\\\\n{}^A\\bm{P} \u0026amp;= {}^A\\bm{R}_B {}^B\\bm{P} \\end{align*}\nScrew Displacement The most general rigid body displacement can be produced by a translation along a line followed by a rotation about the same line. The line is called the screw axis.\nThere exist transformations to from screw displacement notation to the transformation matrix.\nTransformation Arithmetics Consecutive transformations Let us consider the motion of a rigid body described at three locations (Figure fig:consecutive_transformations). Frame \\(\\{\\bm{A}\\}\\) represents the initial location, frame \\(\\{\\bm{B}\\}\\) is an intermediate location, and frame \\(\\{\\bm{C}\\}\\) represents the rigid body at its final location.\n\n Figure 5: Motion of a rigid body represented at three locations by frame \\(\\{\\bm{A}\\}\\), \\(\\{\\bm{B}\\}\\) and \\(\\{\\bm{C}\\}\\)\n Furthermore, suppose the position vector of a point \\(P\\) of the rigid body is given in the final location, that is \\({}^C\\bm{P}\\) is given, and the position of this point is to be found in the fixed frame \\(\\{\\bm{A}\\}\\), that is \\({}^A\\bm{P}\\). Since the locations of the rigid body is known relative to each other, \\({}^C\\bm{P}\\) can be transformed to \\({}^B\\bm{P}\\) using \\({}^B\\bm{T}_C\\): \\[{}^B\\bm{P} = {}^B\\bm{T}_C {}^C\\bm{P}\\]\nNow, \\({}^B\\bm{P}\\) can be transformed into \\({}^A\\bm{P}\\): \\[ {}^A\\bm{P} = {}^A\\bm{T}_B {}^B\\bm{P} \\]\nAnd we have: \\[ {}^A\\bm{P} = {}^A\\bm{T}_B {}^B\\bm{T}_C {}^C\\bm{P} \\]\nFrom which, the consecutive transformation can be defined as follows:\n\\begin{equation} \\tcmbox{{}^A\\bm{T}_C = {}^A\\bm{T}_B {}^B\\bm{T}_C} \\end{equation}\nInverse transformation Direct inversion of the \\(4\\times4\\) homogeneous transfer matrix \\({}^A\\bm{T}_B\\) to obtain \\({}^B\\bm{T}_A\\) might be computationally intensive. It is much easier to use the specific structure of the transfer matrix for inversion.\nTo obtain \\({}^B\\bm{T}_A\\), it is necessary to compute \\({}^B\\bm{R}_A\\) and \\({}^B\\bm{P}_{O_A}\\) from the known \\({}^A\\bm{R}_B\\) and \\({}^A\\bm{P}_{O_B}\\), then\n\\begin{equation*} {}^B\\bm{T}_A = \\left[ \\begin{array}{ccc|c} \u0026amp; \u0026amp; \u0026amp; \\\\\\\n\u0026amp; {}^B\\bm{R}_A \u0026amp; \u0026amp; {}^B\\bm{P}_{O_A} \\\\\\\n\u0026amp; \u0026amp; \u0026amp; \\\\\\\n\\hline 0 \u0026amp; 0 \u0026amp; 0 \u0026amp; 1 \\\\\\\n\\end{array} \\right] \\end{equation*}\nMoreover\n\\begin{align*} {}^B\\bm{R}_A \u0026amp;= {}^A\\bm{R}_B^T \\\\\\\n{}^B\\bm{P}_{O_A} \u0026amp;= {}^B\\bm{R}_A {}^A\\bm{P}_{O_A} = - {}^B\\bm{R}_A {}^A\\bm{P}_{O_B} \\\\\\\n\u0026amp;= -{}^A\\bm{R}_B^T {}^A\\bm{P}_{O_B} \\end{align*}\nHence, the inverse of the transformation matrix can be obtain by\n\\begin{equation} {}^B\\bm{T}_A = {}^A\\bm{T}_B^{-1} = \\left[ \\begin{array}{ccc|c} \u0026amp; \u0026amp; \u0026amp; \\\\\\\n\u0026amp; {}^A\\bm{R}_B^T \u0026amp; \u0026amp; -{}^A \\bm{R}_B^T {}^A\\bm{P}_{O_B} \\\\\\\n\u0026amp; \u0026amp; \u0026amp; \\\\\\\n\\hline 0 \u0026amp; 0 \u0026amp; 0 \u0026amp; 1 \\\\\\\n\\end{array} \\right] \\end{equation}\nKinematics \nIntroduction Kinematic analysis refers to the study of the geometry of motion of a robot, without considering the forces an torques that cause the motion. In this analysis, the relation between the geometrical parameters of the manipulator with the final motion of the moving platform is derived and analyzed.\n A parallel robot is a mechanism with a number of closed kinematic chains, and its moving platform is linked to the base by several independent kinematic chains. Parallel robots for which the number of kinematic chains is equal to the number of degrees-of-freedom of the moving platform are called fully parallel robots.\nIf in addition to this condition, if the type and number of joints at each limb, and the number and location of the actuated joints are identical in all the limbs, such a parallel robot is called symmetric.\nThere are three main cases for fully parallel manipulators. Planar robots with two translation and one rotational degree-of-freedom in the plane. Spatial orientation manipulators with three rotational degrees-of-freedom in space. And a general spatial robot with three translational and three rotational degrees-of-freedom in space.\nIt is known that unlike serial manipulators, inverse kinematic analysis of parallel robots is usually simple and straightforward. In most cases, limb variable may be computed independently using the given pose of the moving platform, and the solution in most cases even for redundant manipulators is uniquely determined. However, forward kinematics of parallel manipulators is generally very complicated, and its solution usually involves systems of nonlinear equations, which are highly coupled and in general have no closed form and unique solution.\nLoop Closure Method A typical parallel manipulator consists of two main bodies. Body \\(A\\) is arbitrary designated as fixed and is called the base, while body \\(B\\) is designated to be movable and is called the moving platform.\nThese two bodies are coupled via \\(n\\) limbs, each attached to points \\(A_i\\) and \\(B_i\\) and called fixed and moving attachment points of the limb \\(i\\).\nAt the displacement level, the forward kinematic problem permits the determination of the actual location or pose of the moving platform relative to the base from a set of joint-position readouts.\nAt the velocity level, the forward kinematic problem refers to the determination of the translational and angular velocities of the moving platform relative to the base, from a set of joint-velocity readouts and for a known configuration.\nTo describe the motion of the moving platform relative to the base, frame \\(\\{\\bm{A}\\}\\) is attached to body \\(A\\) and frame \\(\\{\\bm{B}\\}\\) to body \\(B\\). The pose of the moving platform relative to the base is thus defined by:\n A position vector \\(\\bm{p}\\) which denotes the position vector of the origin of \\(\\{\\bm{B}\\}\\) with respect to frame \\(\\{\\bm{A}\\}\\) A \\(3\\times3\\) rotation matrix \\(R\\) which denotes the rotation of \\(\\{\\bm{B}\\}\\) with respect to \\(\\{\\bm{A}\\}\\) Each limb of a parallel manipulator defines a kinematic loop passing through the origins of frames \\(\\{\\bm{A}\\}\\) and \\(\\{\\bm{B}\\}\\), and through the two limb attachment points \\(A_i\\) and \\(B_i\\).\nAt the displacement level, the closure of each kinematic loop can be express in the vector form as \\[ \\vec{AB} = \\vec{AA_i} + \\vec{A_iB_i} - \\vec{BB_i} \\quad \\text{for } i = 1,2,\\dots,n \\] in which \\(\\vec{AA_i}\\) and \\(\\vec{BB_i}\\) can be easily obtained from the geometry of the attachment points in the base and in the moving platform.\nLet us defined \\(\\bm{a}_i = \\vec{AA_i}\\) in the fixed frame \\(\\{\\bm{A}\\}\\), and \\(\\bm{b}_i = \\vec{BB_i}\\) in the moving frame \\(\\{\\bm{B}\\}\\). Furthermore, \\(\\bm{q}_i = \\vec{A_iB_i}\\) is defined as the limb variable, which indicated the geometry of the limb.\n The loop closure can be written as the unknown pose variables \\(\\bm{p}\\) and \\(\\bm{R}\\), the position vectors describing the known geometry of the base and of the moving platform, \\(\\bm{a}_i\\) and \\(\\bm{b}_i\\), and the limb vector \\(\\bm{q}_i\\)\n\\begin{equation} \\bm{p} = \\bm{a}_i + \\bm{q}_i - \\bm{R} \\bm{b}_i \\quad \\text{for } i=1,2,\\dots,n \\end{equation}\n For an inverse kinematic problem, it is assumed that the moving platform position \\(\\bm{p}\\) and orientation \\(\\bm{R}\\) are given and the problem is to solve the active limb variables. This analysis is usually straightforward and results in unique solution for the limb variables.\nHowever, the inverse solution is not straightforward, and usually numerical methods are used for forward kinematic solution.\nKinematic Analysis of a Stewart-Gough Platform Mechanism Description One frame \\(\\{\\bm{A}\\}\\) is attached to the fixed base and frame \\(\\{\\bm{B}\\}\\) is attached to the moving platform at points \\(O_A\\) and \\(O_B\\) respectively.\nThe number of actuators is equal to the degrees-of-freedom of the manipulator and hence the manipulator is fully parallel.\n Since all the limbs are connected to the moving platform and to the base by spherical joints, no twisting torque can be transmitted and the force acting on each limb is directed along the longitudinal axis of the limb.\n Geometry of the Manipulator The position of the attachment points on the fixed base are denoted by the vectors \\(\\bm{a}_i\\) and the position of moving attachment points are denoted by the vectors \\(\\bm{b}_i\\). The geometry of each limb is described by its length \\(l_i\\) and its direction is denoted by a unit vector \\(\\hat{\\bm{s}}_i\\).\n The position of the point \\(O_B\\) of the moving platform is described by the position vector \\({}^A\\bm{P} = [p_x\\ p_y\\ p_z]^T\\) and orientation of the moving platform is described by the rotation matrix \\({}^A\\bm{R}_B\\) which can by represented by the components of the unit vectors \\(\\hat{\\bm{u}}\\), \\(\\hat{\\bm{v}}\\), \\(\\hat{\\bm{z}}\\) as follows:\n\\begin{equation} ^A\\bm{R}_B = \\begin{bmatrix} u_x \u0026amp; v_x \u0026amp; w_x \\\\\\\nu_y \u0026amp; v_y \u0026amp; w_y \\\\\\\nu_z \u0026amp; v_z \u0026amp; w_z \\\\\\\n\\end{bmatrix} \\end{equation}\n\n Figure 6: Geometry of a Stewart-Gough platform\n The geometry of the manipulator is shown Figure fig:stewart_schematic.\nInverse Kinematics For inverse kinematic analysis, it is assumed that the position \\({}^A\\bm{P}\\) and orientation of the moving platform \\({}^A\\bm{R}_B\\) are given and the problem is to obtain the joint variables \\(\\bm{L} = \\left[ l_1, l_2, l_3, l_4, l_5, l_6 \\right]^T\\).\n From the geometry of the manipulator, one can write:\n\\begin{equation} {}^A \\bm{a}_i + l_i {}^A \\hat{\\bm{s}}_i = {}^A\\bm{P} + {}^A\\bm{b}_i \\end{equation}\nThen, we can find \\(l_i\\) given \\({}^A\\bm{P}\\) and \\({}^A\\bm{R}_B\\):\n\\begin{equation} \\begin{aligned} l_i = \u0026amp;\\Big[ {}^A\\bm{P}^T {}^A\\bm{P} + {}^B\\bm{b}_i^T {}^B\\bm{b}_i + {}^A\\bm{a}_i^T {}^A\\bm{a}_i - 2 {}^A\\bm{P}^T {}^A\\bm{a}_i + \\dots\\\\\\\n\u0026amp;2 {}^A\\bm{P}^T \\left[{}^A\\bm{R}_B {}^B\\bm{b}_i\\right] - 2 \\left[{}^A\\bm{R}_B {}^B\\bm{b}_i\\right]^T {}^A\\bm{a}_i \\Big]^{1/2} \\end{aligned} \\end{equation}\nIf the position and orientation of the platform lie in the feasible workspace, the solution is unique. Otherwise, the solution gives complex numbers.\nForward Kinematics In forward kinematic analysis, it is assumed that the vector of limb lengths \\(\\bm{L}\\) is given and the problem is to find the position \\({}^A\\bm{P}\\) and the orientation \\({}^A\\bm{R}_B\\).\n The size of the problem depends of the representation used for orientation (rotation matrix, Euler angles, \u0026hellip;).\nThe forward kinematic problem is then to solve many highly nonlinear equations that are extremely difficult to solve.\nThe complexity of the problem depends widely on the manipulator architecture and geometry.\nJacobian: Velocities and Static Forces \nIntroduction The Jacobian matrix not only reveals the relation between the joint variable velocities of a parallel manipulator to the moving platform linear and angular velocities, it also constructs the transformation needed to find the actuator forces from the forces and moments acting on the moving platform.\n For specific configurations, local degeneracy can occur and leads to:\n An instantaneous change in the degrees-of-freedom of the system and hence a loss of controllability An important degradation of the natural stiffness that may lead to very high joint forces or torques Therefore, it is very important to identify singular configurations at the design stage to improve the performance.\nAngular and Linear Velocities To determine the absolute linear velocity of a point, the derivative must be calculated relative to a fixed frame. Differentiation of a position vector with respect to a moving frame results in a relative velocity. Therefore, it is necessary to define the arithmetics to transform the relative velocities to the absolute ones.\nAngular Velocity of a Rigid Body Angular velocity is an attribute of a rigid body that describes the rotational motion of the frame \\(\\{\\bm{B}\\}\\) that is attached to the rigid body.\n The angular velocity vector \\(\\bm{\\Omega}\\) describes the instantaneous rotation of frame \\(\\{\\bm{B}\\}\\) with respect to the fixed frame \\(\\{\\bm{A}\\}\\). The direction of \\(\\bm{\\Omega}\\) indicates the instantaneous axis of rotation and its magnitude indicates the speed of rotation.\n The angular velocity vector is related to the screw formalism by equation eq:angular_velocity_vector.\n\\begin{equation} \\tcmbox{\\bm{\\Omega} \\triangleq \\dot{\\theta} \\hat{\\bm{s}}} \\end{equation}\nThe angular velocity can be expressed in any frame. For example \\({}^A\\bm{\\Omega}\\) denotes the angular velocity of the rigid body expressed in the frame \\(\\{\\bm{A}\\}\\) and we have:\n\\begin{equation} \\begin{aligned} ^A \\bm{\\Omega} \u0026amp;= \\Omega_x \\hat{\\bm{x}} + \\Omega_y \\hat{\\bm{y}} + \\Omega_z \\hat{\\bm{z}} \\\\\\\n\u0026amp;= \\dot{\\theta}\\left( s_x \\hat{\\bm{x}} + s_y \\hat{\\bm{y}} + s_z \\hat{\\bm{z}} \\right) \\end{aligned} \\end{equation}\nin which \\(\\Omega_x\\), \\(\\Omega_y\\) and \\(\\Omega_z\\) are the three components of angular velocity of a rigid body expressed in frame \\(\\{\\bm{A}\\}\\).\nLinear Velocity of a Point Linear velocity of a point P can be easily determined by the time derivative of the position vector \\(p\\) of that point with respect to a fixed frame:\n\\begin{equation} v_p = \\dot{p} = \\left( \\dv{p}{t} \\right)_{\\text{fix}} \\end{equation}\nIf the variation of the position vector is determined with respect to a moving frame, we obtain the relative velocity:\n\\begin{equation} v_{\\text{rel}} = \\left( \\pdv{p}{t} \\right)_{\\text{mov}} \\end{equation}\nIn classical mechanics, it is shown that the relation between absolute derivative of any vector to its relative derivative is given by:\n\\begin{equation} \\left( \\dv{(\\cdot)}{t} \\right)_{\\text{fix}} = \\left( \\pdv{(\\cdot)}{t} \\right)_{\\text{mov}} + \\bm{\\Omega} \\times (\\cdot) \\end{equation}\nin which \\(\\bm{\\Omega}\\) denotes the angular velocity of the moving frame with respect to the fixed frame.\nThe term \\(\\bm{\\Omega}\\times(\\cdot)\\) can be written in matrix form:\n\\begin{equation} \\tcmbox{\\left( \\dv{(\\cdot)}{t} \\right)_{\\text{fix}} = \\left( \\pdv{(\\cdot)}{t} \\right)_{\\text{mov}} + \\bm{\\Omega}^\\times(\\cdot)} \\end{equation}\nThe matrix \\(\\bm{\\Omega}^\\times\\) denotes a skew-symmetric matrix defined by:\n\\begin{equation} \\tcmbox{\\bm{\\Omega}^\\times = \\begin{bmatrix} 0 \u0026amp; -\\Omega_z \u0026amp; \\Omega_y \\\\\\\n\\Omega_z \u0026amp; 0 \u0026amp; -\\Omega_x \\\\\\\n-\\Omega_y \u0026amp; \\Omega_x \u0026amp; 0 \\end{bmatrix}} \\end{equation}\nNow consider the general motion of a rigid body shown in Figure fig:general_motion, in which a moving frame \\(\\{\\bm{B}\\}\\) is attached to the rigid body and the problem is to find the absolute velocity of point \\(P\\) with respect to a fixed frame \\(\\{\\bm{A}\\}\\).\n\n Figure 7: Instantaneous velocity of a point \\(P\\) with respect to a moving frame \\(\\{\\bm{B}\\}\\)\n The rigid body perform a general motion which is a combination of a translation, denoted by the vector \\({}^A\\bm{P}_{O_B}\\), and an instantaneous rotation. To determine the velocity of point \\(P\\), we start with the relation between absolute and relative position vectors: \\[ ^A\\bm{P} = {}^A\\bm{P}_{O_B} + {}^A\\bm{R}_B {}^B\\bm{P} \\]\nTo derive the velocity of point \\(P\\), we differentiate with respect to time: \\[ {}^A\\bm{v}_P = {}^A\\bm{v}_{O_B} + {}^A\\dot{\\bm{R}}_B{}^B\\bm{P} + {}^A\\bm{R}_B\\underbrace{{}^B\\bm{v}_P}_{=0} \\]\nThe time derivative of the rotation matrix \\({}^A\\dot{\\bm{R}}_B\\) is:\n\\begin{equation} \\tcmbox{{}^A\\dot{\\bm{R}}_B = {}^A\\bm{\\Omega}^\\times \\ {}^A\\bm{R}_B} \\end{equation}\nAnd we finally obtain equation eq:absolute_velocity_formula.\n \\begin{equation} {}^A\\bm{v}_P = {}^A\\bm{v}_{O_B} + {}^A\\bm{\\Omega}^\\times \\ {}^A\\bm{R}_B {}^B\\bm{P} \\end{equation}\n Screw Coordinates Finite rotation of a rigid body can be expressed as a rotation \\(\\theta\\) about a screw axis \\(\\hat{\\bm{s}}\\). Furthermore, it is shown that the angular velocity of a rigid body is also defined as the rate of instantaneous rotation angle \\(\\dot{\\theta}\\) about the same screw axis \\(\\hat{\\bm{s}}\\).\n The most general rigid-body displacement can be produced by a translation along a line followed by a rotation about the same line. Since this displacement is reminiscent of the displacement of a screw, it is called a screw displacement, and the line of axis is called the screw axis.\n Jacobian Matrices of a Parallel Manipulator Let \\(\\bm{q} = \\left[ q_1, q_2, \\ldots, q_m \\right]^T\\) denote the vector of actuated joint coordinates (linear displacement of an actuator prismatic joint or angular rotation of an actuated revolute joint) and \\(\\bm{\\mathcal{X}} = \\left[ x_1, x_2, \\ldots, x_n \\right]^T\\) denote the vector of moving platform motion variables (position or orientation).\n\\(m\\) denotes the number of actuated joints in the manipulator, \\(n\\) denotes the number of degrees-of-freedom of the manipulator.\nGenerally \\(m \\geq n\\), in which for a fully parallel manipulator \\(m=n\\) and for redundant manipulator \\(m\u0026gt;n\\).\n\\(\\bm{q}\\) and \\(\\bm{\\mathcal{X}}\\) are related through a system of nonlinear algebraic equations representing the kinematic constraints imposed by the limbs, which can be generally written as\n\\begin{equation} f(\\bm{q}, \\bm{\\mathcal{X}}) = 0 \\end{equation}\nWe can differentiate this equation with respect to time and obtain:\n\\begin{equation} \\tcmbox{\\bm{J}_x \\dot{\\bm{\\mathcal{X}}} = \\bm{J}_q \\dot{\\bm{q}}} \\end{equation}\nwhere\n\\begin{equation} \\bm{J}_x = \\pdv{f}{\\bm{\\mathcal{X}}} \\quad \\text{and} \\quad \\bm{J}_q = -\\pdv{f}{\\bm{q}} \\end{equation}\n The general Jacobian matrix is defined as:\n\\begin{equation} \\dot{\\bm{q}} = \\bm{J} \\dot{\\bm{\\mathcal{X}}} \\end{equation}\nFrom equation eq:jacobians, we have:\n\\begin{equation} \\bm{J} = {\\bm{J}_q}^{-1} \\bm{J}_x \\end{equation}\n Velocity Loop Closure The velocity loop closures are used for obtaining the Jacobian matrices in a straightforward manner. Velocity loop closures are derived by direct differentiation of kinematic loop closures.\nKinematic loop closures are: \\[ \\bm{p} = \\bm{a}_i + \\bm{d}_i - \\bm{R} \\bm{b}_i \\quad \\text{for}\\ i = 1, \\ldots, m \\]\nwith\n \\(\\bm{p}\\) the position vector of the moving platform w.r.t. frame \\(\\{\\bm{A}\\}\\) \\(\\bm{R}\\) the rotation matrix of the moving platform \\(\\bm{a}_i\\) the position vector of the \\(i\\)\u0026lsquo;th limb of the fixed platform w.r.t. frame \\(\\{\\bm{A}\\}\\) \\(\\bm{b}_i\\) the position vector of the \\(i\\)\u0026lsquo;th limb of the moving platform w.r.t. frame \\(\\{\\bm{B}\\}\\) \\(\\bm{d}_i\\) the limb vector By taking the time derivative, we obtain the following Velocity Loop Closure:\n\\begin{equation} \\tcmbox{\\dot{\\bm{p}} = \\dot{\\bm{d}_i} - \\bm{\\omega} \\times \\bm{R} \\bm{b}_i \\quad \\text{for}\\ i = 1, \\ldots, m} \\end{equation}\nSingularity Analysis of Parallel Manipulators The singularities occur when:\n \\(\\bm{J}_q\\) is rank deficient (Inverse kinematic singularity) \\(\\bm{J}_x\\) is rank deficient (Forward kinematic singularity) Inverse Kinematic Singularity Inverse kinematic singularity happens when \\(\\bm{J}_q\\) (\\(m \\times m\\) matrix) is rank deficient (\\(\\det \\bm{J}_q = 0\\)).\nThe corresponding configurations are located at the boundary of the manipulator workspace or on the internal boundaries between sub-regions of the workspace.\nIn such cases, there exist nonzero vectors \\(\\dot{\\bm{q}}\\) which correspond to a null Cartesian twist vector \\(\\dot{\\bm{\\mathcal{X}}}\\). In other words, infinitesimal motion of the moving platform along certain directions cannot be accomplished. The manipulator looses one or more degrees-of-freedom.\nForward Kinematic Singularity Forward kinematic singularity happens when \\(\\bm{J}_x\\) (\\(m \\times n\\) matrix) is rank deficient (\\(\\det({\\bm{J}_x}^T \\bm{J}_x) = 0\\)). If the manipulator is not redundantly actuated (\\(m=n\\)), then the Jacobian matrix \\(\\bm{J}_x\\) is square and the forward kinematic singularity happens when \\(\\det \\bm{J}_x = 0\\).\nThe degeneracy occur inside the manipulator\u0026rsquo;s Cartesian workspace and corresponds to the set of configurations for which two different branches of forward kinematic problem meet.\nThere exist nonzero cartesian twist vectors \\(\\dot{\\bm{\\mathcal{X}}}\\) that are mapped into a vanishing actuator velocity vector \\(\\dot{\\bm{\\mathcal{q}}}\\).\nThe corresponding configuration will be one in which an infinitesimal motion of the platform is possible even if the actuator are locked. The manipulator gains one or several degrees-of-freedom and its stiffness vanishes in the corresponding direction(s).\nJacobian Analysis of the Stewart-Gough Platform Velocity Loop Closure The input joint rate is denoted by \\(\\dot{\\bm{\\mathcal{L}}} = [ \\dot{l}_1, \\dot{l}_2, \\dot{l}_3, \\dot{l}_4, \\dot{l}_5, \\dot{l}_6 ]^T\\), and the output twist vector is denoted by \\(\\dot{\\bm{\\mathcal{X}}} = [^A\\bm{v}_p, {}^A\\bm{\\omega}]^T\\).\nThe jacobian matrix can be derived by formulating a velocity loop closure equation of each limb. The loop closure equations for each limb are:\n\\begin{equation} {}^A\\bm{P} + {}^A\\bm{R}_B {}^B\\bm{b}_i = l_i {}^A\\hat{\\bm{s}}_i + {}^A\\bm{a}_i \\end{equation}\nBy differentiate this with respect to time:\n\\begin{equation} {}^A\\bm{v}_p + {}^A \\dot{\\bm{R}}_B {}^B\\bm{b}_i = \\dot{l}_i {}^A\\hat{\\bm{s}}_i + l_i {}^A\\dot{\\hat{\\bm{s}}}_i \\end{equation}\nMoreover, we have:\n \\({}^A\\dot{\\bm{R}}_B {}^B\\bm{b}_i = {}^A\\bm{\\omega} \\times {}^A\\bm{R}_B {}^B\\bm{b}_i = {}^A\\bm{\\omega} \\times {}^A\\bm{b}_i\\) in which \\({}^A\\bm{\\omega}\\) denotes the angular velocity of the moving platform expressed in the fixed frame \\(\\{\\bm{A}\\}\\). \\(l_i {}^A\\dot{\\hat{\\bm{s}}}_i = l_i \\left( {}^A\\bm{\\omega}_i \\times \\hat{\\bm{s}}_i \\right)\\) in which \\({}^A\\bm{\\omega}_i\\) is the angular velocity of limb \\(i\\) express in fixed frame \\(\\{\\bm{A}\\}\\). Then, the velocity loop closure eq:loop_closure_limb_diff simplifies to \\[ {}^A\\bm{v}_p + {}^A\\bm{\\omega} \\times {}^A\\bm{b}_i = \\dot{l}_i {}^A\\hat{\\bm{s}}_i + l_i ({}^A\\bm{\\omega}_i \\times \\hat{\\bm{s}}_i) \\]\nBy dot multiply both side of the equation by \\(\\hat{\\bm{s}}_i\\): \\[ \\hat{\\bm{s}}_i {}^A\\bm{v}_p + ({}^A\\bm{b}_i \\times \\hat{\\bm{s}}_i) {}^A\\bm{\\omega} = \\dot{l}_i \\]\nWe then omit the superscript \\(A\\) and we can rearrange the 6 equations into a matrix form\n\\begin{equation} \\tcmbox{\\dot{\\bm{\\mathcal{L}}} = \\bm{J} \\dot{\\bm{\\mathcal{X}}}} \\end{equation}\n \\begin{equation} \\bm{J} = \\begin{bmatrix} {\\hat{\\bm{s}}_1}^T \u0026amp; (\\bm{b}_1 \\times \\hat{\\bm{s}}_1)^T \\\\\\\n{\\hat{\\bm{s}}_2}^T \u0026amp; (\\bm{b}_2 \\times \\hat{\\bm{s}}_2)^T \\\\\\\n{\\hat{\\bm{s}}_3}^T \u0026amp; (\\bm{b}_3 \\times \\hat{\\bm{s}}_3)^T \\\\\\\n{\\hat{\\bm{s}}_4}^T \u0026amp; (\\bm{b}_4 \\times \\hat{\\bm{s}}_4)^T \\\\\\\n{\\hat{\\bm{s}}_5}^T \u0026amp; (\\bm{b}_5 \\times \\hat{\\bm{s}}_5)^T \\\\\\\n{\\hat{\\bm{s}}_6}^T \u0026amp; (\\bm{b}_6 \\times \\hat{\\bm{s}}_6)^T \\end{bmatrix} \\end{equation}\n\\(\\bm{J}\\) then depends only on:\n \\(\\hat{\\bm{s}}_i\\) the orientation of the limbs \\(\\bm{b}_i\\) the position of the joints with respect to \\(O_B\\) and express in \\(\\{\\bm{A}\\}\\). Singularity Analysis It is of primary importance to avoid singularities in a given workspace. To study the singularity configurations of the Stewart-Gough platform, we consider the Jacobian matrix determined with the equation eq:jacobian_formula_stewart.\nFrom equation eq:jacobians, it is clear that for the Stewart-Gough platform, \\(\\bm{J}_q = \\bm{I}\\) and \\(\\bm{J}_x = \\bm{J}\\). Hence the manipulator has no inverse kinematic singularities within the manipulator workspace, but may possess forward kinematic singularity when \\(\\bm{J}\\) becomes rank deficient. This may occur when \\[ \\det \\bm{J} = 0 \\]\nStatic Forces in Parallel Manipulators The relation between the forces/moments applied to the environment at the point of contact and the actuator forces/torques is determined and analyzed in the study of static force analysis.\nIt is assumed that the manipulator is at a static equilibrium, and that the actuator forces required to produce the desired contact forces are determined.\nTwo methods are usually applied: the free-body diagram and the principle of virtual work.\nIn the free-body diagram approach, the actuator forces are determined to produce desired contact forces/moments as well as the internal and interacting forces/torques applied at the limbs. The analysis of such forces is essential in the design of a manipulator to determine the stresses and deflection of each link and joint.\nHowever, if only the actuator forces are desired to be determined, the principle of virtual work is more efficient and computationally less expensive.\nVirtual Work Approach A virtual displacement for a parallel manipulator refers to an infinitesimal change in the general displacement of the moving platform as a result of any arbitrary infinitesimal changes in the joint variables at a given instant of time.\nThe virtual displacement of the joints can be written as \\(\\delta \\bm{q} = [\\delta q_1, \\delta q_2, \\cdots, \\delta q_m]^T\\) and \\(\\delta \\bm{\\mathcal{X}} = [\\delta x, \\delta y, \\delta z, \\delta \\theta_x, \\delta \\theta_y, \\delta \\theta_z ]^T\\) denotes the virtual displacement of a contacting point of the moving platform. \\([\\delta \\theta_x, \\delta \\theta_y, \\delta \\theta_z ]^T = \\delta \\theta \\hat{\\bm{s}}\\) are the orientation variables represented by screw coordinates.\nLet the vector of actuator forces be denoted by \\(\\bm{\\tau} = [\\tau_1, \\tau_2, \\cdots, \\tau_m]^T\\), and the external forces/torque acting on the contact point of the moving platform denoted by a wrench in a screw coordinate as \\(\\bm{\\mathcal{F}} = [\\bm{f}, \\bm{n}]^T\\) in which \\(\\bm{f} = [f_x, f_y, f_z]^T\\) denotes the external forces, and \\(\\bm{n} = [n_x, n_y, n_z]^T\\) denotes the external torque action on the moving platform at the point of contact to the environment.\nWe assume that the frictional forces acting on the joints are negligible, and also that the gravitational forces of the limb links are much smaller than the interacting force of the moving platform to the environment. The principle of virtual work states that the total virtual work, \\(\\delta W\\), done by all actuators and external forces is equal to zero:\n\\begin{equation} \\tcmbox{\\delta W = \\bm{\\tau}^T \\delta \\bm{q} - \\bm{\\mathcal{F}}^T \\delta \\bm{\\mathcal{X}} = 0} \\end{equation}\nFurthermore, from the definition of the Jacobian, the virtual displacements \\(\\delta \\bm{q}\\) and \\(\\delta \\bm{\\mathcal{X}}\\) are related by the Jacobian: \\[ \\delta \\bm{q} = \\bm{J} \\cdot \\delta \\bm{\\mathcal{X}} \\]\nWe then have \\(\\left( \\bm{\\tau}^T \\bm{J} - \\bm{\\mathcal{F}}^T \\right) \\delta \\bm{\\mathcal{X}} = 0\\) that holds for any arbitrary virtual displacement \\(\\delta \\bm{\\mathcal{X}}\\), hence \\[ \\bm{\\tau}^T \\bm{J} - \\bm{\\mathcal{F}}^T = 0 \\]\n We obtain that the Jacobian matrix constructs the transformation needed to find the actuator forces \\(\\bm{\\tau}\\) from the wrench acting on the moving platform \\(\\bm{\\mathcal{F}}\\):\n\\begin{equation} \\bm{\\mathcal{F}} = \\bm{J}^T \\bm{\\tau} \\end{equation}\n Static Forces of the Stewart-Gough Platform As shown in Figure fig:stewart_static_forces, the twist of moving platform is described by a 6D vector \\(\\dot{\\bm{\\mathcal{X}}} = \\left[ {}^A\\bm{v}_P \\ {}^A\\bm{\\omega} \\right]^T\\), in which \\({}^A\\bm{v}_P\\) is the velocity of point \\(O_B\\), and \\({}^A\\bm{\\omega}\\) is the angular velocity of moving platform.\n\n Figure 8: Free-body diagram of forces and moments action on the moving platform and each limb of the Stewart-Gough platform\n Consider an external wrench generated by the manipulator and applied to the environment at the point \\(O_B\\) denoted by \\(\\bm{\\mathcal{F}} = [\\bm{f} \\ \\bm{n}]^T\\).\nIt is assumed that no external forces are applied to the limbs except the actuator forces. Therefore, the static force can be assumed to be along the limb axis \\(\\hat{\\bm{s}}_i\\), and the limb is subject to a tension/compression force \\(f_i\\).\nAt static equilibrium, the summation of all acting forces on the moving platform shall be zero, therefore\n\\begin{equation} -\\bm{f} + \\sum_{i=1}^6 f_i \\hat{\\bm{s}}_i = 0 \\end{equation}\nin which \\(-\\bm{f}\\) if the external force applied to the moving platform from the environment.\nThe summation of moments contributed by all forces acting on the moving platform about \\(O_B\\) is as follows:\n\\begin{equation} -\\bm{n} + \\sum_{i=1}^6 b_i \\times f_i \\hat{\\bm{s}}_i = 0 \\end{equation}\nin which \\(-n\\) is the external moment applied to the moving platform by the environment, and \\(b_i\\) is the position vector from the point \\(O_B\\) to the attached point \\(B_i\\) on the moving platform.\nWriting the two equations together in a matrix form results in\n\\begin{equation} \\begin{bmatrix} \\hat{\\bm{s}}_1 \u0026amp; \\hat{\\bm{s}}_2 \u0026amp; \\cdots \u0026amp; \\hat{\\bm{s}}_6 \\\\\\\n\\bm{b}_1 \\times \\hat{\\bm{s}}_1 \u0026amp; \\bm{b}_2 \\times \\hat{\\bm{s}}_2 \u0026amp; \\cdots \u0026amp; \\bm{b}_6 \\times \\hat{\\bm{s}}_6 \\end{bmatrix} \\cdot \\begin{bmatrix} f_1 \\ f_2 \\ \\vdots \\ f_6 \\end{bmatrix} = \\begin{bmatrix} \\bm{f} \\ \\bm{n} \\end{bmatrix} \\end{equation}\nThere we can recognize the transpose of the Jacobian matrix:\n\\begin{equation} \\tcmbox{\\bm{\\mathcal{F}} = \\bm{J}^T \\bm{\\tau}} \\end{equation}\nin which \\(\\bm{\\tau} = [f_1, f_2, \\cdots, f_6]^T\\) is the vector of actuator forces, and \\(\\bm{\\mathcal{F}} = [\\bm{f}, \\bm{n}]^T\\) is the 6D wrench applied by the manipulator to the environment.\nStiffness Analysis of Parallel Manipulators Here, we focus on the deflections of the manipulator moving platform that are the result of the applied wrench to the environment. The amount of these deflections are a function of the applied wrench as well as the manipulator structural stiffness. Thus, the stiffness of a manipulator has a direct impact on its overall positioning accuracy if the manipulator is in contact with a stiff environment.\nStiffness and Compliance Matrices The relation between the applied actuator force \\(\\tau_i\\) and the corresponding small deflection \\(\\Delta q_i\\) along the applied force axis can be approximated as a linear function:\n\\begin{equation} \\tcmbox{\\tau_i = k_i \\cdot \\Delta q_i} \\end{equation}\nin which \\(k_i\\) denotes the stiffness constant of the actuator.\nRe-writing the equation eq:stiffness_actuator for all limbs in a matrix form result in\n\\begin{equation} \\tcmbox{\\bm{\\tau} = \\mathcal{K} \\cdot \\Delta \\bm{q}} \\end{equation}\nin which \\(\\bm{\\tau}\\) is the vector of actuator forces, and \\(\\Delta \\bm{q}\\) corresponds to the actuator deflections. \\(\\mathcal{K} = \\text{diag}\\left[ k_1 \\ k_2 \\dots k_m \\right]\\) is an \\(m \\times m\\) diagonal matrix composed of the actuator stiffness constants.\nWriting the Jacobian relation given in equation eq:jacobian_disp for infinitesimal deflection read\n\\begin{equation} \\Delta \\bm{q} = \\bm{J} \\cdot \\Delta \\bm{\\mathcal{X}} \\end{equation}\nin which \\(\\Delta \\bm{\\mathcal{X}} = [\\Delta x\\ \\Delta y\\ \\Delta z\\ \\Delta\\theta x\\ \\Delta\\theta y\\ \\Delta\\theta z]\\) is the infinitesimal linear and angular deflection of the moving platform.\nFurthermore, rewriting the Jacobian as the projection of actuator forces to the moving platform eq:jacobian_forces gives\n\\begin{equation} \\bm{\\mathcal{F}} = \\bm{J}^T \\bm{\\tau} \\end{equation}\nHence, by substituting eq:stiffness_matrix_relation and eq:jacobian_disp_inf in eq:jacobian_force_inf, we obtain:\n\\begin{equation} \\tcmbox{\\bm{\\mathcal{F}} = \\underbrace{\\bm{J}^T \\mathcal{K} \\bm{J}}_{\\bm{K}} \\cdot \\Delta \\bm{\\mathcal{X}}} \\end{equation}\nEquation eq:stiffness_jacobian implies that the moving platform output wrench is related to its deflection by the stiffness matrix \\(K\\).\n \\begin{equation} \\bm{K} = \\bm{J}^T \\mathcal{K} \\bm{J} \\end{equation}\n The stiffness matrix has desirable characteristics for analysis:\n It is a symmetric positive definite matrix, however, it is configuration dependent If the manipulator actuators have all the same stiffness constants \\(k\\), the stiffness matrix is reduced to the form \\(\\bm{K} = k \\bm{J}^T \\bm{J}\\) If the stiffness matrix is inversible (\\(\\det( \\bm{J}^T \\bm{J}) \\ne 0\\)), the compliance matrix of the manipulator is defined as\n\\begin{equation} \\tcmbox{\\bm{C} = \\bm{K}^{-1} = (\\bm{J}^T \\mathcal{K} \\bm{J})^{-1}} \\end{equation}\nThe compliance matrix of a manipulator shows the mapping of the moving platform wrench to its deflection by\n\\begin{equation} \\Delta \\bm{\\mathcal{X}} = \\bm{C} \\cdot \\bm{\\mathcal{F}} \\end{equation}\nTransformation Ellipsoid As seen previously, the Jacobian matrix \\(\\bm{J}\\) transforms n-dimensional moving platform velocity vector \\(\\dot{\\bm{\\mathcal{X}}}\\) into m-dimensional actuated joint velocity \\(\\dot{\\bm{q}}\\). Also, the Jacobian transpose \\(\\bm{J}^T\\) maps m-dimensional actuated joint forces \\(\\bm{\\tau}\\) into n-dimensional applied wrench \\(\\bm{\\mathcal{F}}\\).\nOne way to characterize these transformation is to compare the amplitude and direction of the moving platform velocity generated by a unit actuator joint velocity. To achieve this goal, we confine the actuator joint velocity vector on a m-dimensional unit sphere \\[ \\dot{\\bm{q}}^T \\dot{\\bm{q}} = 1 \\] and compare the resulting moving platform velocity in n-dimensional space: \\[ \\dot{\\bm{\\mathcal{X}}}^T \\bm{J}^T \\bm{J} \\dot{\\bm{\\mathcal{X}}} = 1 \\]\nSimilarly, we can confine the exerted moving platform wrench \\(\\bm{\\mathcal{F}}^T \\bm{\\mathcal{F}} = 1\\) and compare the required actuator forces: \\(\\bm{\\tau}^T \\bm{J} \\bm{J}^T \\bm{\\tau} = 1\\).\nConsider the case of fully parallel manipulators. Then \\(\\bm{J}\\bm{J}^T\\) and \\(\\bm{J}^T\\bm{J}\\) transformations are represented by \\(n \\times n\\) matrices. Geometrically, these transformations represent a hyper-ellipsoid in n-dimensional space, whose principal axes are the eigenvectors of \\(\\bm{J}^T\\bm{J}\\) and \\(\\bm{J}\\bm{J}^T\\) respectively. Furthermore, the lengths of the principal axes are equal to the reciprocals of the square roots of the eigenvalues of \\(\\bm{J}\\bm{J}^T\\) and \\(\\bm{J}^T\\bm{J}\\), which are also equal to the reciprocals of the singular values of \\(\\bm{J}\\).\nThe shape of this hyper-ellipsoid in space indicates the characteristics of the transformation. As this hyper-ellipsoid is closer to a hyper-sphere, the transformation becomes more uniform in different directions. Since Jacobian matrix is configuration dependent, the shape of the hyper-ellipsoid is also configuration dependent, and as the moving platform moves from one pose to the other, the shape of the hyper-ellipsoid changes accordingly.\nA measure of the dexterity of the manipulator is the reciprocal of the Jacobian matrix condition number defined as:\n\\begin{equation} \\frac{1}{\\kappa} = \\frac{\\sigma_{\\text{min}}}{\\sigma_{\\text{max}}} \\end{equation}\nin which \\(\\sigma_{\\text{min}}\\) and \\(\\sigma_{\\text{max}}\\) are the smallest and the largest singular values of the Jacobian matrix.\nStiffness Analysis of the Stewart-Gough Platform In this section, we restrict our analysis to a 3-6 structure (Figure fig:stewart36) in which there exist six distinct attachment points \\(A_i\\) on the fixed base and three moving attachment point \\(B_i\\).\n\n Figure 9: Schematic of a 3-6 Stewart-Gough platform\n Denote the vector of actuated joint forces by \\(\\bm{\\tau} = [f_1 \\ f_2 \\ f_3 \\ f_4 \\ f_5 \\ f_6 ]\\), and the corresponding vector of infinitesimal displacements of actuated limbs denoted by \\(\\Delta \\bm{L} = [\\Delta l_1 \\ \\Delta l_2 \\ \\Delta l_3 \\ \\Delta l_4 \\ \\Delta l_5 \\ \\Delta l_6 ]\\). The relation between \\(\\Delta \\bm{L}\\) and \\(\\bm{\\tau}\\) is described by a diagonal \\(6 \\times 6\\) matrix \\(\\mathcal{K}\\): \\[ \\bm{\\tau} = \\mathcal{K} \\cdot \\Delta \\bm{L} \\]\nAlso, from the definition of the Jacobian, we have: \\[ \\Delta \\bm{L} = \\bm{J} \\cdot \\Delta \\bm{\\mathcal{X}} \\] in which \\(\\Delta \\bm{\\mathcal{X}} = [\\Delta_x \\ \\Delta_y \\ \\Delta_z \\ \\Delta \\theta_x \\ \\Delta \\theta_y \\ \\Delta \\theta_z ]\\) is the vector of infinitesimal linear and angular motions of the moving platform.\nAlso, the vector of the moving platform output wrench denoted by \\(\\bm{F} = [f_x \\ f_y \\ f_z \\ n_x \\ n_y \\ n_z ]\\) is related to the vector of actuated joint forces \\(\\bm{\\tau}\\) by: \\[ \\bm{F} = \\bm{J}^T \\cdot \\bm{\\tau} \\]\nBy substitution, we obtain: \\[ \\bm{\\mathcal{F}} = \\bm{K} \\cdot \\Delta \\bm{\\mathcal{X}} \\] in which \\[ \\bm{K} = \\bm{J}^T \\mathcal{K} \\bm{J} \\] where \\(K\\) is called the stiffness matrix of the Stewart-Gough manipulator.\nFor a given configuration of the moving platform, the eigenvalue of the stiffness matrix represents the stiffness of the manipulator in the corresponding eigenvector direction. Furthermore, the reciprocal of the stiffness matrix condition number may be used to represent the dexterity of the manipulator.\nThe maximum stiffness of the manipulator can be analyzed by the maximum singular value of the Jacobian matrix. The largest axis of the stiffness transformation hyper-ellipsoid is given by this value at each configuration.\nDynamics \nIntroduction The dynamic analysis of parallel manipulators presents an inherent complexity due to their closed-loop structure. Several approaches have been proposed.\nTraditional Newton-Euler formulation is used for dynamic analysis of general parallel manipulators. In this formulation, the equation of motion of each limb and the moving platform must be derived, which inevitably leads to a large number of equations and less computational efficiency. On the other hand, all the reaction forces can be computed, which is very useful in the design of a parallel manipulator.\nThe Lagrangian formulation eliminates all the unwanted reaction forces at the outset, and therefore, is quite efficient. However, because of the constraints imposed by the closed-loop structure, deriving explicit equations of motions in terms of a set of generalized coordinates becomes a prohibitive task.\nA third approach is to use the principle of virtual work, in which the computation of the constraint forces are bypassed. In this method, inertial forces and moments are computed using linear and angular accelerations of the bodies. Then, the whole manipulator is considered to be in static equilibrium by using the d\u0026rsquo;Alembert\u0026rsquo;s principle, and the principle of virtual work is applied to derive the input forces and torques.\nDifferent objectives require different forms of formulations, there are three key issues pursued to derive dynamic formulation of parallel manipulators:\n Calculation of internal forces either active or passive for the design process of the manipulator Study on dynamical properties of the manipulator for controller design Utilization of dynamic specifications in an inverse dynamics controller or any model-based control topology The first item is the main advantage of the Newton-Euler formulation, the second and third items are the benefits of using the Lagrange or virtual work approaches.\nThe dynamic equations in an explicit form can be written as:\n\\begin{equation} \\tcmbox{\\bm{M}(\\bm{\\mathcal{X}}) \\ddot{\\bm{\\mathcal{X}}} + \\bm{C}(\\bm{\\mathcal{X}}, \\dot{\\bm{\\mathcal{X}}}) \\dot{\\bm{\\mathcal{X}}} + \\bm{G}(\\bm{\\mathcal{X}}) = \\bm{\\mathcal{F}}} \\end{equation}\nin which:\n \\(\\bm{\\mathcal{X}}\\) is a vector of the generalized coordinates \\(\\bm{M}(\\bm{\\mathcal{X}})\\) denotes the system mass matrix \\(\\bm{C}(\\bm{X},\\dot{\\bm{X}})\\) denotes the Coriolis and centrifugal matrix \\(\\bm{G}(\\bm{X})\\) denotes the gravity vector \\(\\bm{\\mathcal{F}}\\) denotes the generalized force Deriving explicit dynamic equations for parallel manipulators is a very prohibitive task because of the closed-loop nature of the manipulator.\nDynamics of the Rigid Bodies Acceleration of Rigid Bodies The acceleration analysis consists of studying the variations of linear velocity of a point and angular velocity of a rigid body with respect to time.\n Direct differentiation of these vectors with respect to time in a fixed frame leads to linear velocity of a point and angular velocity of a rigid body, respectively. Note that, to determine the absolute linear velocity of a point, the derivative must be calculated relative to a fixed frame. In the study of robotic manipulators, usually multiple moving frames are defined to carefully determine the motion of the moving platform. Therefore, it is necessary to define the required arithmetics to transform the relative accelerations into absolute ones.\nAngular Acceleration of a Rigid Body To define angular acceleration of a rigid body, consider a moving frame \\(\\{\\bm{B}\\}\\) attached to the rigid body, and the motion analyzed with respect to a fixed frame. Angular acceleration is an attribute of a rigid body and describes the variation of angular velocity of frame \\(\\{\\bm{B}\\}\\) with respect to time.\n Angular acceleration vector, denoted by the symbol \\(\\dot{\\bm{\\Omega}}\\), describes the instantaneous change of the angular velocity of frame \\(\\{\\bm{B}\\}\\), denoted by \\(\\bm{\\Omega}\\), with respect to the fixed frame \\(\\{\\bm{A}\\}\\):\n\\begin{equation} \\begin{aligned} \\dot{\\bm{\\Omega}} = \\frac{d \\bm{\\Omega}}{dt} \u0026amp;= \\ddot{\\theta} \\hat{\\bm{s}} + \\dot{\\theta} \\dot{\\hat{\\bm{s}}} \\\\\\\n\u0026amp;= \\ddot{\\theta} \\hat{\\bm{s}} + \\dot{\\theta} (\\bm{\\Omega} \\times \\hat{\\bm{s}}) \\\\\\\n\u0026amp;= \\ddot{\\theta} \\hat{\\bm{s}} \\end{aligned} \\end{equation}\nwhere \\(\\{\\theta, \\hat{\\bm{s}}\\}\\) are the screw parameters representing the rotation of the rigid body.\n As shown by eq:angular_acceleration, the angular acceleration of the rigid body is also along the screw axis \\(\\hat{\\bm{s}}\\) with a magnitude equal to \\(\\ddot{\\theta}\\).\nLinear Acceleration of a Point Linear acceleration of a point \\(P\\) can be easily determined by time derivative of the velocity vector \\(\\bm{v}_P\\) of that point with respect to a fixed frame:\n\\begin{equation} \\bm{a}_p = \\dot{\\bm{v}}_p = \\left( \\frac{d\\bm{v}_p}{dt} \\right)_\\text{fix} \\end{equation}\nNote that this is correct only if the derivative is taken with respect to a fixed frame.\nNow consider the general motion of a rigid body, in which a moving frame \\(\\{\\bm{B}\\}\\) is attached to the rigid body and the problem is to find the absolute acceleration of point \\(P\\) with respect to the fixed frame \\(\\{\\bm{A}\\}\\). The rigid body performs a general motion, which is a combination of a translation, denoted by the velocity vector \\({}^A\\bm{v}_{O_B}\\), and an instantaneous angular rotation denoted by \\(\\bm{\\Omega}\\) (see Figure fig:general_motion). To determine acceleration of point \\(P\\), we start with the relation between absolute and relative velocities of point \\(P\\):\n\\begin{equation} {}^A\\bm{v}_P = {}^A\\bm{v}_{O_B} + {}^A\\bm{R}_B{}^B\\bm{v}_P + {}^A\\bm{\\Omega}^\\times {}^A\\bm{R}_B {}^B\\bm{P} \\end{equation}\nIn order to derive acceleration of point \\(P\\), we differentiate both sides with respect to time and we obtain\n\\begin{equation} \\begin{split} {}^A\\bm{a}_p\\ \u0026amp;= {}^A\\bm{a}_{O_B} \\quad \\text{(linear acc. of } \\{\\bm{B}\\} \\text{)} \\\\\\\n\u0026amp;+ {}^A\\bm{R}_B{}^B\\bm{a}_p \\quad \\text{(relative acc. of } P \\text{ w.r.t. } \\{\\bm{B}\\} \\text{)} \\\\\\\n\u0026amp;+ {}^A\\dot{\\bm{\\Omega}}^\\times {}^A\\bm{R}_B {}^B\\bm{P} \\quad \\text{(angular acceleration of } \\{\\bm{B}\\} \\text{)} \\\\\\\n\u0026amp;+ {}^A\\bm{\\Omega}^\\times ({}^A\\bm{\\Omega}^\\times {}^A\\bm{R}_B {}^B\\bm{P}) \\quad \\text{(centrifugal)} \\\\\\\n\u0026amp;+ 2{}^A\\bm{\\Omega}^\\times {}^A\\bm{R}_B {}^B\\bm{v}_P \\quad \\text{(Coriolis)} \\end{split} \\end{equation}\nFor the case where \\(P\\) is a point embedded in the rigid body, \\({}^B\\bm{v}_P = 0\\) and \\({}^B\\bm{a}_P = 0\\) and we obtain:\n\\begin{equation} \\begin{split} {}^A\\bm{a}_P = {}^A\\bm{a}_{O_B} \u0026amp;+ {}^A\\dot{\\bm{\\Omega}}^\\times {}^A\\bm{R}_B {}^B\\bm{P} \\\\\\\n\u0026amp;+ {}^A\\bm{\\Omega}^\\times ({}^A\\bm{\\Omega}^\\times {}^A\\bm{R}_B {}^B\\bm{P}) \\end{split} \\end{equation}\nMass Properties In this section, the properties of mass, namely center of mass, moments of inertia and its characteristics and the required transformations are described.\n\n Figure 10: Mass properties of a rigid body\n Center of Mass Consider a reference frame \\(\\{\\bm{A}\\}\\) in which the mass distribution of a material body is measured, and let \\(\\bm{p}\\) denote the position vector of a differential mass \\(\\rho dV\\) with respect to a reference frame.\nThe center of mass of a rigid body is defined as the point \\(C\\) which satisfied the following condition\n\\begin{equation} \\bm{p}_c = \\frac{1}{m} \\int_V \\bm{p} \\rho dV \\end{equation}\nin which the mass of the material body \\(\\{\\bm{B}\\}\\) with density \\(\\rho\\) and volume \\(V\\) is defined as\n\\begin{equation} m = \\int_V \\rho dV \\end{equation}\nMoments of Inertia As opposed to the mass, which introduces inertia to linear accelerations, moment of inertia is the property of mass which introduces inertia to angular accelerations. Basically, for rotational motion, the distribution of mass with respect to the axis of rotation introduces resistance to the angular acceleration.\nMoments of inertia \\(\\bm{I}\\) about \\(\\bm{A}\\) is defined by the second moment of the mass with respect to a reference frame of rotation as:\n\\begin{equation} {}^A\\bm{I} = \\begin{bmatrix} I_{XX} \u0026amp; I_{XY} \u0026amp; I_{XZ} \\\\\\\nI_{YX} \u0026amp; I_{YY} \u0026amp; I_{YZ} \\\\\\\nI_{ZX} \u0026amp; I_{ZY} \u0026amp; I_{ZZ} \\end{bmatrix} \\end{equation}\nin which\n\\begin{equation*} \\begin{aligned} I_{XX} \u0026amp;= \\int_V (y^2 + z^2) \\rho dV, \\quad I_{XY} = I_{YX} = -\\int_V xy \\rho dV \\\\\\\nI_{YY} \u0026amp;= \\int_V (x^2 + z^2) \\rho dV, \\quad I_{YZ} = I_{ZY} = -\\int_V yz \\rho dV \\\\\\\nI_{ZZ} \u0026amp;= \\int_V (x^2 + y^2) \\rho dV, \\quad I_{XZ} = I_{ZX} = -\\int_V xz \\rho dV \\end{aligned} \\end{equation*}\nPrincipal Axes As seen in equation eq:moment_inertia, the inertia matrix elements are a function of mass distribution of the rigid body with respect to the frame \\(\\{\\bm{A}\\}\\). Hence, it is possible to find orientations of frame \\(\\{\\bm{A}\\}\\) in which the product of inertia terms vanish and inertia matrix becomes diagonal:\n\\begin{equation} {}^A\\bm{I} = \\begin{bmatrix} I_{XX} \u0026amp; 0 \u0026amp; 0 \\\\\\\n0 \u0026amp; I_{YY} \u0026amp; 0 \\\\\\\n0 \u0026amp; 0 \u0026amp; I_{ZZ} \\end{bmatrix} \\end{equation}\nSuch axes are called the principal axes of inertia, and diagonal terms are called the principal moments of inertia, which represent the maximum, minimum and intermediate values of the moments of inertia for a particular chosen origin \\(\\{\\bm{A}\\}\\).\nIt can be shown that the principal moments of inertial and principal axes are invariant parameters and can be determined from an eigen value decomposition of the inertia matrix in any configuration of the reference frame \\(\\{\\bm{A}\\}\\).\nInertia Matrix Transformations The moment of inertia is usually given for frames passing through the center of mass of the rigid body. The inertia matrix changes under change of the reference frame.\nConsider frame \\(\\{\\bm{C}\\}\\) parallel to \\(\\{\\bm{A}\\}\\) and attached to the center of mass of a rigid body and let \\(\\bm{p}_c = [x_c, y_c, z_c]^T\\) denote the vector of the position of the center of mass with respect to frame \\(\\{\\bm{A}\\}\\). The relation between the inertia matrix about \\(A\\) and that about \\(C\\) is given by the following relation:\n\\begin{equation} \\tcmbox{{}^A\\bm{I} = {}^C\\bm{I} + m(\\bm{p}_c^T \\bm{p}_c \\bm{I}_{3 \\times 3} - \\bm{p}_c \\bm{p}_c^T)} \\end{equation}\nin which \\(m\\) denotes the mass of the rigid body and \\(\\bm{I}_{3 \\times 3}\\) denotes the identity matrix.\nOn the other hand, if the reference frame \\(\\{B\\}\\) has pure rotation with respect to the frame attached to the center of mass \\(\\{A\\}\\):\n\\begin{equation} {}^A\\bm{I} = {}^A\\bm{R}_C {}^C\\bm{I} {}^A\\bm{R}_C^T \\end{equation}\nMomentum and Kinetic Energy Linear Momentum Linear momentum of a material body, shown in Figure fig:angular_momentum_rigid_body, with respect to a reference frame \\(\\{\\bm{A}\\}\\) is defined as\n\\begin{equation} {}^A\\bm{G} = \\int_V \\frac{d\\bm{p}}{dt} \\rho dV \\end{equation}\nFor any mass element \\(\\rho dV\\), the position vector \\(\\bm{p}\\) can be written as \\[ p = p_c + r \\]\nAnd because \\(\\int_V r \\rho dV = 0\\), we have by substitution \\[ {}^A\\bm{G} = \\frac{d\\bm{p}_c}{dt} \\int_V \\rho dV \\] and thus\n\\begin{equation} \\tcmbox{{}^A\\bm{G} = m \\cdot {}^A\\bm{v}_C} \\end{equation}\nin which \\({}^A\\bm{v}_C\\) denotes the velocity of the center of mass with respect to the frame \\(\\{\\bm{A}\\}\\).\nThis result implies that the total linear momentum of differential masses is equal to the linear momentum of a point mass \\(m\\) located at the center of mass. This highlights the important of the center of mass in dynamic formulation of rigid bodies.\n\n Figure 11: The components of the angular momentum of a rigid body about \\(A\\)\n Angular Momentum Consider the solid body represented in Figure fig:angular_momentum_rigid_body. Angular momentum of the differential masses \\(\\rho dV\\) about a reference point \\(A\\), expressed in the reference frame \\(\\{\\bm{A}\\}\\) is defined as \\[ {}^A\\bm{H} = \\int_V \\left(\\bm{p} \\times \\frac{d\\bm{p}}{dt} \\right) \\rho dV \\] in which \\(d\\bm{p}/dt\\) denotes the velocity of differential mass with respect to the reference frame \\(\\{\\bm{A}\\}\\).\nBy substituting \\(\\bm{p} = \\bm{p}_c + \\bm{r}\\) in the previous equations, be obtain: \\[ {}^A\\bm{H} = \\bm{p}_c \\times m \\bm{v}_c + \\int_V \\bm{r} \\times (\\bm{\\Omega} \\times \\bm{r}) \\rho dV \\]\nTherefore, angular momentum of the rigid body about point \\(A\\) is reduced to\n\\begin{equation} \\tcmbox{{}^A\\bm{H} = \\bm{p}_c \\times \\bm{G}_c + {}^C\\bm{H}} \\end{equation}\nin which \\[ {}^C\\bm{H} = \\int_V \\bm{r} \\times (\\bm{\\Omega} \\times \\bm{r}) \\rho dV = {}^C\\bm{I} \\cdot \\bm{\\Omega} \\]\nEquation eq:angular_momentum reveals that angular momentum of a rigid body about a point \\(A\\) can be written as \\(\\bm{p}_c \\times \\bm{G}_c\\), which is the contribution of linear momentum of the rigid body about point \\(A\\), and \\({}^C\\bm{H}\\) which is the angular momentum of the rigid body about the center of mass.\nThis also highlights the important of the center of mass in the dynamic analysis of rigid bodies. If the center of mass is taken as the reference point, the relation describing angular momentum eq:angular_momentum is very analogous to that of linear momentum eq:linear_momentum.\nKinetic Energy The Kinetic energy of a rigid body is defined as\n\\begin{equation} \\tcmbox{\\bm{K} = \\frac{1}{2} \\int_V \\bm{v} \\cdot \\bm{v} \\rho dV} \\end{equation}\nThe velocity of a differential mass \\(\\rho dV\\) can be represented by linear velocity of the center of mass and angular velocity of the rigid body as \\[ \\bm{v} = \\bm{v}_p + \\bm{\\Omega} \\times \\bm{r} \\]\nBy substitution, the kinetic energy of the rigid body may be obtained by:\n\\begin{equation} \\tcmbox{\\bm{K} = \\frac{1}{2} \\bm{v}_c \\times \\bm{G}_c + \\frac{1}{2} \\bm{\\Omega} \\cdot {}^C\\bm{H}} \\end{equation}\nin which \\(\\bm{G}_C\\) is the linear momentum of the rigid body and \\({}^C\\bm{H}\\) is the angular momentum of the rigid body about the center of mass.\nThis equation reveals that kinetic energy of a moving body can be represented as the kinetic energy of a point mass located as the center of mass, in addition to the kinetic energy of a body rotating about the center of mass.\nNewton-Euler Laws The Newton and Euler laws can be written for three different cases where the angular motion:\n is about a fixed point in space is represented about the center of mass is represented about an arbitrary moving point in space We only examine the case in which all rotations are represented about the center of mass.\nConsider a rigid body under general motion, that is, a combination of translation and rotation.\n The Newton\u0026rsquo;s law relates the change of linear momentum of the rigid body to the resulting external forces applied to it \\[ \\sum \\bm{f}_\\text{ext} = \\frac{d\\bm{G}_c}{dt} \\]\n For the case of a constant mass rigid body, this law is reduced to \\[ \\sum \\bm{f}_\\text{ext} = m \\frac{d\\bm{v}_c}{dt} = m \\bm{a}_c \\] in which \\(\\bm{a}_c\\) is the linear acceleration of the center of mass.\n The Euler\u0026rsquo;s law relates the change of angular momentum of a rigid body about the center of mass, to the summation of all external moments applied to the rigid body about center of mass \\[ \\sum {}^c\\bm{n}_\\text{ext} = \\frac{d}{dt}({}^c\\bm{H}) \\]\n For the case of a constant mass rigid body, this law is reduced to \\[ \\sum {}^c\\bm{n}_\\text{ext} = \\frac{d}{dt}({}^c\\bm{I} \\bm{\\Omega}) = {}^c\\bm{I} \\dot{\\bm{\\Omega}} + \\bm{\\Omega} \\times ({}^c\\bm{I} \\bm{\\Omega}) \\] in which \\(\\sum {}^c\\bm{n}_\\text{ext}\\) is the summation of all external moments applied to the rigid body about the center of mass, \\({}^c\\bm{I}\\) is the moment of inertia about the center of mass, and \\(\\bm{\\Omega}\\) is the angular velocity of the rigid body.\nNewton-Euler Formulation The most popular approach used in robotics to derive the dynamic equation of motion of a parallel manipulator is the Newton-Euler formulation.\nIn the Newton-Euler formulation, the free-body diagrams of all the limbs and moving platform are considered and the Newton Euler laws are applied to each isolated body. To apply the laws to each body, it is necessary to derive linear acceleration of links, center of mass, as well as angular acceleration of the links. Hence, acceleration analysis would be performed on all the links of the manipulator and the moving platform.\nFurthermore, all the external forces and moments applied to the links and to the moving platform must be carefully determined. Gravitational forces acting on the center of masses, frictional forces and moments acting on the joints, and any possible disturbance force or moment applied to the links and to the moving platform would be identified. The most important external forces or moments applied on the manipulator are the one applied by the actuators, denoted by \\(\\bm{\\tau} = [\\tau_{1}, \\tau_{2}, \\dots, \\tau_{m}]^{T}\\). The forces and moments shall be derived from the set of Newton-Euler laws, which are written separately for each link and the moving platform.\nFinally, by elimination of these constraints forces and moments on the Newton-Euler equations written for the moving platform, the dynamic equations relating the actuator forces and moments \\(\\bm{\\tau}\\) to the motion variables of the moving platform \\(\\bm{\\mathcal{X}}\\), \\(\\dot{\\bm{\\mathcal{X}}}\\) and \\(\\ddot{\\bm{\\mathcal{X}}}\\) are derived.\nDynamic Formulation of the Stewart-Gough Platform Acceleration Analysis In acceleration analysis, it is intended to derive expressions for linear and angular acceleration of the limbs, namely \\(\\ddot{l}_{i}\\) and \\(\\dot{\\bm{\\omega}}_{i}\\) as a function of the moving platform acceleration \\(\\ddot{\\bm{\\mathcal{X}}} = [\\dot{\\bm{v}}_{p}, \\dot{\\bm{\\omega}}]^{T}\\). To obtain such a relation, let us rewrite the velocity loop closure:\n\\begin{equation} \\bm{v}_{p} + \\bm{\\omega} \\times \\bm{b}_{i} = \\dot{l}_{i} \\hat{\\bm{s}}_{i} + l_{i}(\\bm{\\omega}_{i} \\times \\hat{\\bm{s}}_{i}) \\end{equation}\nSince there is no actuation torque about \\(\\hat{\\bm{s}}_{i}\\), the limb angular velocity and acceleration vectors (\\(\\bm{\\omega}_i\\) and \\(\\dot{\\bm{\\omega}}_i\\)) are normal to \\(\\hat{\\bm{s}}_{i}\\) provided that the following assumption are considered for the platform:\n both end joints of the limb are spherical the limbs are symmetric with respect to their axes the effects of friction in spherical joints are neglected Considering these assumptions, it can be concluded that the limbs cannot spin about their axes: \\(\\bm{\\omega}_{i} \\cdot \\hat{\\bm{s}}_{i} = 0\\) and \\((\\hat{\\bm{s}}_i \\times (\\bm{\\omega}_i \\times \\hat{\\bm{s}}_i)) = \\bm{\\omega}_i\\).\nTo obtain the angular velocity of the limbs \\(\\bm{\\omega}_{i}\\), we cross multiply \\(\\hat{\\bm{s}}_{i}\\) to both sides of the previous equation:\n\\begin{equation} \\bm{\\omega}_{i} = \\frac{1}{l_i} ( \\hat{\\bm{s}}_i \\times \\bm{v}_{b_i} ) \\end{equation}\nWith \\(\\bm{v}_{b_{i}}\\) an intermediate variable corresponding to the velocity of point \\(\\bm{b}_{i}\\):\n\\begin{equation} \\bm{v}_{b_{i}} = \\bm{v}_{p} + \\bm{\\omega} \\times \\bm{b}_{i} \\end{equation}\nAs illustrated in Figure fig:free_body_diagram_stewart, the piston-cylinder structure of the limbs is decomposed into two separate parts, the masses of which are denoted by \\(m_{i_1}\\) and \\(m_{i_2}\\). The position vector of these two center of masses can be determined by the following equations:\n\\begin{align} \\bm{p}_{i_1} \u0026amp;= \\bm{a}_{i} + c_{i_1} \\hat{\\bm{s}}_{i} \\\\\\\n\\bm{p}_{i_2} \u0026amp;= \\bm{a}_{i} + ( l_i - c_{i_2}) \\hat{\\bm{s}}_{i} \\end{align}\n\n Figure 12: Free-body diagram of the limbs and the moving platform of a general Stewart-Gough manipulator\n By differentiating the previous equations and doing some manipulations, we obtain:\n\\begin{align} \\ddot{l}_i \u0026amp;= \\bm{a}_{b_i} \\times \\hat{\\bm{s}}_i + l_i (\\bm{\\omega_i} \\cdot \\bm{\\omega_i}) \\\\\\\n\\dot{\\bm{\\omega}}_i \u0026amp;= \\frac{1}{l_i} (\\hat{\\bm{s}}_i \\times \\bm{a}_{b_i} - 2 \\dot{l}_i \\bm{\\omega}_i) \\\\\\\n\\bm{a}_{i_1} \u0026amp;= c_{i_1} ( \\dot{\\bm{\\omega}}_i \\times \\hat{\\bm{s}}_{i} + \\bm{\\omega}_i \\times (\\bm{\\omega}_i \\times \\hat{\\bm{s}}_i)) \\\\\\\n\\bm{a}_{i_2} \u0026amp;= ( l_i - c_{i_2}) (\\dot{\\bm{\\omega}}_i \\times \\hat{\\bm{s}}_{i} - (\\bm{\\omega}_i \\cdot \\bm{\\omega}_i) \\hat{\\bm{s}}_i) + 2 \\dot{l}_i (\\bm{\\omega}_i \\times \\hat{\\bm{s}}_i) + \\ddot{l}_i \\hat{\\bm{s}}_i \\end{align}\nwith\n\\begin{equation} \\bm{a}_{b_i} = \\bm{a}_p + \\dot{\\bm{\\omega}} \\times \\bm{b}_i + \\bm{\\omega} \\times (\\bm{\\omega} \\times \\bm{b}_i) \\end{equation}\nDynamic Formulation of the Limbs To derive the dynamic formulation of the Stewart-Gough platform, the manipulator is decomposed into a moving platform and six identical limbs. We assume that each limb consists of two parts, the cylinder and the piston, where the velocities and the accelerations of their centers of masses are determined. We also assume that the centers of masses of the cylinder and the piston are located at a distance of \\(c_{i_1}\\) and \\(c_{i_2}\\) above their foot points, and their masses are denoted by \\(m_{i_1}\\) and \\(m_{i_2}\\). Moreover, consider that the pistons are symmetric about their axes, and their centers of masses lie at their midlengths.\nThe free-body diagrams of the limbs and the moving platforms is given in Figure fig:free_body_diagram_stewart. The reaction forces at fixed points \\(A_i\\) are denoted by \\(\\bm{f}_{a_i}\\), the internal force at moving points \\(B_i\\) are dentoed by \\(\\bm{f}_{b_i}\\), and the internal forces and moments between cylinders and pistons are denoted by \\(\\bm{f}_{c_i}\\) and \\(\\bm{M_{c_i}}\\) respectively.\nAssume that the only existing external disturbance wrench is applied on the moving platform and is denoted by \\(\\bm{\\mathcal{F}}_d = [\\bm{F}_d, \\bm{n}_d]^T\\).\n \\begin{equation} \\begin{aligned} \\bm{f}_{b_i} \u0026amp;= \\frac{1}{l_i}(I_{xx_i} + l_i^2 m_{c_e}) \\hat{\\bm{s}}_i \\times \\dot{\\bm{\\omega}}_i \\\\\\\n\u0026amp;\\quad + \\frac{2}{l_i} m_{i_2} c_{i_2} \\dot{l}_i \\hat{\\bm{s}}_i \\times \\bm{\\omega}_i \\\\\\\n\u0026amp;\\quad - m_{g_e} \\hat{\\bm{s}}_i \\times (\\hat{\\bm{s}}_i \\times \\bm{g}) \\end{aligned} \\end{equation}\nin which \\(m_{c_e}\\) is defined as\n\\begin{equation} m_{c_e} = \\frac{1}{l_i^2} \\left( m_{i_1} c_{i_1}^2 + m_{i_2} c_{i_2}^2 \\right) \\end{equation}\n Dynamic Formulation of the Moving Platform Assume that the moving platform center of mass is located at the center point \\(P\\) and it has a mass \\(m\\) and moment of inertia \\({}^A\\bm{I}_{P}\\). Furthermore, consider that gravitational force and external disturbance wrench are applied on the moving platform, \\(\\bm{\\mathcal{F}}_d = [\\bm{F}_d, \\bm{n}_d]^T\\) as depicted in Figure fig:free_body_diagram_stewart.\nThe Newton-Euler formulation of the moving platform is as follows:\n\\begin{align} \\sum \\bm{F}_{\\text{ext}} \u0026amp;= \\sum_{i=1}^6 \\bm{f}_{b_i} + m \\bm{g} + \\bm{F}_{d} = m \\bm{a}_p \\\\\\\n\\sum {}^p\\bm{n}_{\\text{ext}} \u0026amp;= \\bm{n}_d + \\sum_{i=1}^6 \\bm{b}_i \\times \\bm{f}_{b_i} \\nonumber \\\\\\\n\u0026amp; = {}^{A}\\bm{I}_{P} \\dot{\\bm{\\omega}} + \\bm{\\omega} \\times {}^{A}\\bm{I}_{P} \\bm{\\omega} \\end{align}\nin which \\({}^A\\bm{I}_P\\) is considered in the fixed frame \\(\\{\\bm{A}\\}\\) and can be calculated by:\n\\begin{equation} {}^A\\bm{I}_P = {}^A\\bm{R}_B {}^B\\bm{I}_P {}^A\\bm{R}_B^T \\end{equation}\nThese equations can be rewritten in an implicit form as\n \\begin{align} \u0026amp; m(\\bm{a}_p - \\bm{g}) - \\bm{F}_d - \\sum_{i=1}^{6} \\bm{f}_{b_i} = \\bm{0} \\label{eq:dyn_form_implicit_trans}\\\\\\\n\u0026amp; {}^A\\bm{I}_P \\dot{\\bm{\\omega}} + \\bm{\\omega} \\times {}^A\\bm{I}_P\\bm{\\omega} - \\bm{n}_d - \\sum_{i=1}^{6} \\bm{b}_{i} \\times \\bm{f}_{b_i} = \\bm{0} \\label{eq:dyn_form_implicit_rot} \\end{align}\n These two equations are the governing dynamic formulation of the Stewart-Gough platform, in which \\(\\bm{\\mathcal{F}}_d = [\\bm{F}_{d}, \\bm{n}_{d}]^T\\) denotes the disturbance wrench exerted on the moving plateform.\nThey can be viewed in an implicit vector form of\n\\begin{equation} \\bm{f}(\\bm{\\mathcal{X}}, \\dot{\\bm{\\mathcal{X}}}, \\ddot{\\bm{\\mathcal{X}}}, \\bm{\\mathcal{F}}_d, \\bm{\\tau}) = \\bm{0} \\end{equation}\nin which \\(\\bm{\\mathcal{X}} = [\\bm{x}_P, \\bm{\\theta}]^T\\) is the motion variable of the moving platform consisting of the linear position of point \\(P\\) and the moving platform orientation represented by screw coordinates.\nClosed-Form Dynamics While dynamic formulation in the form of Equation eq:dynamic_formulation_implicit can be used to simulate inverse dynamics of the Stewart-Gough platform, its implicit nature makes it unpleasant for the dynamic analysis and control.\nClosed-Form Dynamics of the Limbs To derive a closed-form dynamic formulation for the Stewart-Gough platform as\n\\begin{equation} \\bm{M}(\\bm{\\mathcal{X}})\\ddot{\\bm{\\mathcal{X}}} + \\bm{C}(\\bm{\\mathcal{X}}, \\dot{\\bm{\\mathcal{X}}})\\dot{\\bm{\\mathcal{X}}} + \\bm{G}(\\bm{\\mathcal{X}}) = \\bm{\\mathcal{F}} \\end{equation}\nfirst consider an intermediate generalized coordinate \\(x_i\\), which is in fact the position of point \\(b_i\\). This generalized coordinate is used to harmonize the limb and the moving platform dynamic formulation and to derive an closed-form structure for the whole manipulator.\nNow, manipulate each limb dynamic equations to convert them into the closed form. Let us first introduce some relations to substitute kinematic parameters like \\(\\dot{\\bm{\\omega}}_i\\), \\(\\ddot{\\bm{\\omega}}_i\\), \\(\\ddot{l}_i\\) with the intermediate generalized coordinate \\(x_i\\) and its time derivatives.\nAfter some manipulations, we obtain the following closed form equation:\n\\begin{equation} \\bm{M}_i \\ddot{\\bm{x}}_i + \\bm{C}_i \\dot{\\bm{x}}_i + \\bm{G}_i = \\bm{F}_i \\end{equation}\nthe corresponding mass matrix \\(\\bm{M}_i\\), the Coriolis matrix \\(\\bm{C}_i\\), and the gravity vector \\(\\bm{G}_i\\) can be simplified into the following form:\n\\begin{align} \\bm{M}_i \u0026amp;= m_{i_2}\\hat{\\bm{s}}_i \\hat{\\bm{s}}_i^T - \\frac{1}{l_i^2} I_{xx_i} \\hat{\\bm{s}}_{i \\times}^2 \\\\\\\n\\bm{C}_i \u0026amp;= -\\frac{2}{l_i} m_{c_o}\\dot{l}_i \\hat{\\bm{s}}_{i\\times}^2 - \\frac{1}{l_i^2} m_{i_2} c_{i_2} \\hat{\\bm{s}}_i \\dot{\\bm{x}}_i^T \\hat{\\bm{s}}_{i \\times}^2 \\\\\\\n\\bm{G}_i \u0026amp;= \\big( m_{g_e} \\hat{\\bm{s}}_{i\\times}^2 - m_{i_2} \\hat{\\bm{s}}_i \\hat{\\bm{s}}_i^T \\big) \\bm{g} \\\\\\\n\\bm{F}_i \u0026amp;= -\\bm{f}_{b_i} + \\tau_i \\hat{\\bm{s}}_i \\end{align}\nin which\n\\begin{align} m_{c_e} \u0026amp;= \\frac{1}{l_i^2} (m_{i_1} c_{i_1}^2 + m_{i_2} c_{i_2}^2) \\\\\\\nm_{c_o} \u0026amp;= \\frac{1}{l_i} m_{i_2} c_{i_2} - \\frac{1}{l_i^2} (I_{xx_i} + l_i^2 m_{c_e}) \\\\\\\nm_{g_e} \u0026amp;= \\frac{1}{l_i} (m_{i_1} c_{i_1} + m_{i_2}(l_i - c_{i_2})) \\end{align}\nClosed-Form Dynamics of the Moving Platform In this section, the dynamic equations of the moving platform are transformed in the following closed-form formulation\n\\begin{equation} \\bm{M}_{p}\\ddot{\\bm{\\mathcal{X}}} + \\bm{C}_{p}\\dot{\\bm{\\mathcal{X}}} + \\bm{G}_{p} = \\bm{\\mathcal{F}}_{p} \\end{equation}\nin which \\(\\bm{\\mathcal{X}}\\) consists of six coordinates: the first three \\(\\bm{x}_p\\) represent linear motion of the moving platform, and the last three \\(\\bm{\\theta}\\) its angular motion. It is preferable to use the screw coordinates for representing the angular motion as its derivative is also a vector representing angular velocity:\n\\begin{equation} \\tcmbox{\\bm{\\mathcal{X}} = \\begin{bmatrix}\\bm{x}_p \\ \\bm{\\theta}\\end{bmatrix}; \\quad \\dot{\\bm{\\mathcal{X}}} = \\begin{bmatrix}\\bm{v}_p \\ \\bm{\\omega}\\end{bmatrix}; \\quad \\ddot{\\bm{\\mathcal{X}}} = \\begin{bmatrix}\\bm{a}_p \\ \\dot{\\bm{\\omega}}\\end{bmatrix}} \\end{equation}\nEquations eq:dyn_form_implicit_trans and eq:dyn_form_implicit_rot can be simply converted into a closed form of Equation eq:close_form_dynamics_platform with the following terms:\n\\begin{equation} \\begin{aligned} \u0026amp;\\bm{M}_p = \\begin{bmatrix} m\\bm{I}_{3 \\times 3} \u0026amp; \\bm{O}_{3\\times 3} \\ \\bm{O}_{3\\times 3} \u0026amp; {}^A \\bm{I}_p \\end{bmatrix}_{6\\times 6}; \\bm{C}_p = \\begin{bmatrix} \\bm{O}_{3\\times 3} \u0026amp; \\bm{O}_{3\\times 3} \\ \\bm{O}_{3\\times 3} \u0026amp; \\omega_{\\times} {}^A\\bm{I}_p \\end{bmatrix}_{6 \\times 6} \\\\\\\n\u0026amp;\\bm{G}_p = \\begin{bmatrix}-m\\bm{g} \\ \\bm{O}_{3\\times 1}\\end{bmatrix}_{6 \\times 1}; \\bm{\\mathcal{F}}_p = \\begin{bmatrix} \\bm{F}_d + \\sum \\bm{f}_{b_i} \\ \\bm{n}_d + \\sum \\bm{b}_{i \\times} \\bm{f}_{b_i} \\end{bmatrix}_{6\\times 1} \\end{aligned} \\end{equation}\nClosed-Form Dynamics of the Stewart-Gough Manipulator To derive the closed-form dynamic formulation for the whole manipulator, a transformation is required to map the intermediate generalized coordinates \\(x_i\\) into the principal generalized coordinates \\(\\bm{\\mathcal{X}}\\).\nUsing such a transformation, and by adding the resulting equations of the limbs and the moving platform, the internal forces \\(\\bm{f}_{b_i}\\) can be eliminated, and closed-form dynamic formulation for the whole manipulator can be derived.\nTo generate such a transformation define a Jacobian matrix \\(\\bm{J}_i\\) relating the intermediate coordinates to that of the principal generalized coordinate:\n\\begin{equation} \\dot{\\bm{x}}_i = \\bm{J}_i \\dot{\\bm{\\mathcal{X}}} \\end{equation}\nin which\n\\begin{equation} \\bm{J}_i = \\begin{bmatrix} \\bm{I}_{3 \\times 3} \u0026amp; -\\bm{b}_{i \\times} \\end{bmatrix} \\end{equation}\n\\begin{equation} \\bm{M}_{li} \\ddot{\\bm{x}}_i + \\bm{C}_{li} + \\dot{\\bm{x}}_i + \\bm{G}_{li} = \\bm{\\mathcal{F}}_{li} \\end{equation}\nin which\n\\begin{equation} \\begin{aligned} \\bm{M}_{li} = \\bm{J}_i^T \\bm{M}_i \\bm{J}_i; \\quad \u0026amp; \\bm{C}_{li} = J_i^T \\bm{M}_i \\dot{\\bm{J}}_i + \\bm{J}_i^T \\bm{C}_i \\bm{J}_i \\\\\\\n\\bm{G}_{li} = \\bm{J}_i^T G_i; \\quad \u0026amp; \\bm{\\mathcal{F}}_{li} = \\bm{J}_i^T \\bm{F}_i \\end{aligned} \\end{equation}\n \\begin{equation} \\begin{aligned} \\bm{M}(\\bm{\\mathcal{X}}) \u0026amp;= \\bm{M}_p + \\sum_{i=1}^6 \\bm{M}_{li} \\\\\\\n\\bm{C}(\\bm{\\mathcal{X}}, \\dot{\\bm{\\mathcal{X}}}) \u0026amp;= \\bm{C}_p + \\sum_{i=1}^6 \\bm{C}_{li} \\\\\\\n\\bm{G}(\\bm{\\mathcal{X}}) \u0026amp;= \\bm{G}_p + \\sum_{i=1}^6 \\bm{G}_{li} \\\\\\\n\\bm{\\mathcal{F}}(\\bm{\\mathcal{X}}) \u0026amp;= \\bm{\\mathcal{F}}_d + \\sum_{i=1}^6 \\bm{\\mathcal{F}}_{\\tau_i} \\end{aligned} \\end{equation}\n Forward Dynamics Simulations As shown in Figure fig:stewart_forward_dynamics, it is assumed that actuator forces and external disturbance wrench applied to the manipulator are given and the resulting trajectory of the moving platform is to be determined.\n\n Figure 13: Flowchart of forward dynamics implementation sequence\n The closed-form dynamic formulation of the Stewart-Gough platform corresponds to the set of equations given in eq:closed_form_dynamic_stewart_wanted, whose terms are given in eq:close_form_dynamics_stewart_terms.\nInverse Dynamics Simulation In inverse dynamics simulations, it is assumed that the trajectory of the manipulator is given, and the actuator forces required to generate such trajectories are to be determined.\nAs illustrated in Figure fig:stewart_inverse_dynamics, inverse dynamic formulation is implemented in the following sequence. The first step is trajectory generation for the manipulator moving platform. Many different algorithms are developed for a smooth trajectory generation. For such a trajectory, \\(\\bm{\\mathcal{X}}_{d}(t)\\) and the time derivatives \\(\\dot{\\bm{\\mathcal{X}}}_{d}(t)\\), \\(\\ddot{\\bm{\\mathcal{X}}}_{d}(t)\\) are known.\nThe next step is to solve the inverse kinematics of the manipulator and to find the limbs\u0026rsquo; linear and angular positions, velocity and acceleration as a function of the manipulator trajectory. The manipulator Jacobian matrix \\(\\bm{J}\\) is also calculated in this step.\nNext, the dynamic matrices given in the closed-form formulations of the limbs and the moving platform are calculated using equations eq:closed_form_intermediate_parameters and eq:close_form_dynamics_stewart_terms, respectively.\nTo combine the corresponding matrices, an to generate the whole manipulator dynamics, it is necessary to find intermediate Jacobian matrices \\(\\bm{J}_i\\), given in eq:jacobian_intermediate, and then compute compatible matrices for the limbs given in eq:closed_form_stewart_manipulator. Now that all the terms required to computed to actuator forces required to generate such a trajectory is computed, let us define \\(\\bm{\\mathcal{F}}\\) as the resulting Cartesian wrench applied to the moving platform. This wrench can be calculated from the summation of all inertial and external forces excluding the actuator torques \\(\\bm{\\tau}\\) in the closed-form dynamic formulation eq:closed_form_dynamic_stewart_wanted.\nBy this definition, \\(\\bm{\\mathcal{F}}\\) can be viewed as the projector of the actuator forces acting on the manipulator, mapped to the Cartesian space. Since there is no redundancy in actuation in the Stewart-Gough manipulator, the Jacobian matrix \\(\\bm{J}\\), squared and actuator forces can be uniquely determined from this wrench, by \\(\\bm{\\tau} = \\bm{J}^{-T} \\bm{\\mathcal{F}}\\), provided \\(\\bm{J}\\) is non-singular. Therefore, actuator forces \\(\\bm{\\tau}\\) are computed in the simulation from\n\\begin{equation} \\bm{\\tau} = \\bm{J}^{-T} \\left( \\bm{M}(\\bm{\\mathcal{X}})\\ddot{\\bm{\\mathcal{X}}} + \\bm{C}(\\bm{\\mathcal{X}}, \\dot{\\bm{\\mathcal{X}}})\\dot{\\bm{\\mathcal{X}}} + \\bm{G}(\\bm{\\mathcal{X}}) - \\bm{\\mathcal{F}}_d \\right) \\end{equation}\n\n Figure 14: Flowchart of inverse dynamics implementation sequence\n Virtual Work Formulation Lagrange Formulation \\begin{equation} K(\\bm{\\mathcal{X}}, \\dot{\\bm{\\mathcal{X}}}) = \\frac{1}{2} \\dot{\\bm{\\mathcal{X}}}^T \\bm{M}(\\bm{\\mathcal{X}}) \\dot{\\bm{\\mathcal{X}}} \\end{equation}\n\\begin{equation} \\bm{G}(\\bm{\\mathcal{X}}) = \\frac{\\partial P(\\bm{\\mathcal{X}})}{\\partial \\bm{\\mathcal{X}}} \\end{equation}\n\\begin{equation} \\bm{C}(\\bm{\\mathcal{X}}, \\dot{\\bm{\\mathcal{X}}}) = \\frac{1}{2} (\\dot{\\bm{M}} + \\bm{U}^T - \\bm{U}) \\end{equation}\nMotion Control \nIntroduction Parallel robots are designed for two different types of applications.\nIn the first type, the moving platform of the robot accurately follows a desired position and orientation path in a specific time frame, while no interacting forces need to be applied to the environment.\nThe second type of application include situations where the robot moving platform is in contact with a stiff environment (e.g. precision machining). In such application, the contact force describe the state of interaction more effectively than the position and orientation of the moving platform. The problem of force control can be described as to derive the actuator forces for such a manipulator required to generate a prescribed desired wrench (force and torque) at the manipulator moving platform, while the manipulator is performing its motion.\nAlthough a multiple degrees-of-freedom robotic manipulator can usually be represented by a MIMO and nonlinear model, many industrial controllers for such robots consist of a number of linear controller designed to control individual joint motions. One of the reasons why such decentralization can perform well in practice is the use of large gear reductions in robot actuators, which significantly reduces the coupling and non linear behavior of robot dynamics.\nHowever, using advanced techniques in nonlinear and MIMO control permits to overcome limitations of the SISO approach.\nController Topology \n In motion control of parallel manipulator, it is assumed that the controller computes the required actuator forces or torques to cause the robot motion to follow a desired position and orientation trajectory.\n Let us use the motion variables as the generalized coordinate of the moving platform defined by \\(\\bm{\\mathcal{X}} = [\\bm{x}_P, \\bm{\\theta}]^T\\), in which the linear motion is represented by \\(\\bm{x}_p = [x_p, y_p, z_p]^T\\), while the moving platform orientation is represented by screw coordinates \\(\\bm{\\theta} = \\theta[s_x, s_y, s_z]^T = [\\theta_x, \\theta_y, \\theta_z]^T\\).\nConsider the general closed-form dynamics formulation of a parallel robot\n\\begin{equation} \\tcmbox{\\bm{M}(\\bm{\\mathcal{X}})\\ddot{\\bm{\\mathcal{X}}} + \\bm{C}(\\bm{\\mathcal{X}}, \\dot{\\bm{\\mathcal{X}}})\\dot{\\bm{\\mathcal{X}}} + \\bm{G}(\\bm{\\mathcal{X}}) = \\bm{\\mathcal{F}}} \\end{equation}\nwhere\n \\(\\bm{M}(\\bm{\\mathcal{X}})\\) denotes the mass matrix \\(\\bm{C}(\\bm{\\mathcal{X}}, \\dot{\\bm{\\mathcal{X}}})\\) denotes the Coriolis and centrifugal matrix \\(\\bm{G}(\\bm{\\mathcal{X}})\\) denotes the gravity vector \\(\\bm{\\mathcal{F}}\\) denotes the generalized forces applied to the moving platform center of mass The generalized forces can be decomposed as follow \\[ \\bm{\\mathcal{F}} = \\bm{J}^T \\bm{\\tau} + \\bm{\\mathcal{F}}_d \\] with\n \\(\\bm{J}\\) is the Jacobian \\(\\bm{\\tau}\\) are the actuator forces \\(\\bm{\\mathcal{F}}_d\\) are any external wrenches Control topology is referred to the structure of the control system used to compute the actuator forces/torques from the measurements, and the required pre and post processing.\n For motion control of a manipulator, the controller has to compute the actuator force/torques required to cause the motion of the moving platform according to the desired trajectory. In general, the desired motion of the moving platform may be represented by the desired generalized coordinate of the manipulator, denoted by \\(\\bm{\\mathcal{X}}_d\\).\nTo perform such motion in closed loop, it is necessary to measure the output motion \\(\\bm{\\mathcal{X}}\\) of the manipulator by an instrumentation system. Such instrumentation usually consists of two subsystems: the first subsystem may use accurate accelerometers, or global positioning systems to calculate the position of a point on the moving platform; and a second subsystem may use inertial or laser gyros to determine orientation of the moving platform.\nFigure fig:general_topology_motion_feedback shows the general topology of a motion controller using direct measurement of the motion variable \\(\\bm{\\mathcal{X}}\\), as feedback in the closed-loop system. In such a structure, the measured position and orientation of the manipulator is compared to its desired value to generate the motion error vector \\(\\bm{e}_\\mathcal{X}\\). The controller uses this error information to generate suitable commands for the actuators to minimize the tracking error.\n\n Figure 15: The general topology of motion feedback control: motion variable \\(\\bm{\\mathcal{X}}\\) is measured\n However, it is usually much easier to measure the active joint variable rather than measuring the final position and orientation of the moving platform. The relation between the joint variable \\(\\bm{q}\\) and motion variable of the moving platform \\(\\bm{\\mathcal{X}}\\) is dealt with the forward and inverse kinematics. The relation between the differential motion variables \\(\\dot{\\bm{q}}\\) and \\(\\dot{\\bm{\\mathcal{X}}}\\) is studied through the Jacobian analysis.\nIt is then possible to use the forward kinematic analysis to calculate \\(\\bm{\\mathcal{X}}\\) from the measured joint variables \\(\\bm{q}\\), and one may use the control topology depicted in Figure fig:general_topology_motion_feedback_bis to implement such a controller.\n\n Figure 16: The general topology of motion feedback control: the active joint variable \\(\\bm{q}\\) is measured\n In this topology, the forward kinematic analysis of the manipulator has to be performed to implement the feedback loop. As described earlier, this is a complex task for parallel manipulators. It is even more complex when a solution has to be found in real time.\nHowever, as shown herein before, the inverse kinematic analysis of parallel manipulators is much easier to carry out. To overcome the implementation problem of the control topology in Figure fig:general_topology_motion_feedback_bis, another control topology is usually implemented for parallel manipulators.\nIn this topology, depicted in Figure fig:general_topology_motion_feedback_ter, the desired motion trajectory of the robot \\(\\bm{\\mathcal{X}}_d\\) is used in an inverse kinematic analysis to find the corresponding desired values for joint variable \\(\\bm{q}_d\\). Hence, the controller is designed based on the joint space error \\(\\bm{e}_q\\).\n\n Figure 17: The general topology of motion feedback control: the active joint variable \\(\\bm{q}\\) is measured, and the inverse kinematic analysis is used\n Therefore, the structure and characteristics of the controller in this topology is totally different from that given in the first two topologies.\nThe input and output of the controller depicted in Figure fig:general_topology_motion_feedback_ter are both in the joint space. However, this is not the case in the previous topologies where the input to the controller is the motion error in task space, while its output is in the joint space.\nFor the topology in Figure fig:general_topology_motion_feedback_ter, independent controllers for each joint may be suitable.\nTo generate a direct input to output relation in the task space, consider the topology depicted in Figure fig:general_topology_motion_feedback_quater. A force distribution block is added which maps the generated wrench in the task space \\(\\bm{\\mathcal{F}}\\), to its corresponding actuator forces/torque \\(\\bm{\\tau}\\).\n\n Figure 18: The general topology of motion feedback control in task space: the motion variable \\(\\bm{\\mathcal{X}}\\) is measured, and the controller output generates wrench in task space\n For a fully parallel manipulator such as the Stewart-Gough platform, this mapping can be constructed from the Jacobian transpose of the manipulator: \\[ \\bm{\\mathcal{F}} = \\bm{J}^T \\bm{\\tau}; \\quad \\bm{\\tau} = \\bm{J}^{-T} \\bm{\\mathcal{F}} \\]\nMotion Control in Task Space \nDecentralized PD Control In the control structure in Figure fig:decentralized_pd_control_task_space, a number of linear PD controllers are used in a feedback structure on each error component. The decentralized controller consists of six disjoint linear controllers acting on each error component \\(\\bm{e}_x = [e_x,\\ e_y,\\ e_z,\\ e_{\\theta_x},\\ e_{\\theta_y},\\ e_{\\theta_z}]\\). The PD controller is denoted by \\(\\bm{K}_d s + \\bm{K}_p\\), in which \\(\\bm{K}_d\\) and \\(\\bm{K}_p\\) are \\(6 \\times 6\\) diagonal matrices denoting the derivative and proportional controller gains for each error term.\n\n Figure 19: Decentralized PD controller implemented in task space\n Hence, by this structure, each tracking error component is treated separately. The output of the controller is denoted by \\(\\bm{\\mathcal{F}} = [F_x\\ F_y\\ F_z\\ \\tau_x\\ \\tau_y\\ \\tau_z]\\).\nIn practice, the calculated output wrench is transformed into actuator forces through the force distribution block. This mapping is implemented through inverse of the manipulator Jacobian transpose by \\(\\bm{\\tau} = \\bm{J}^{-T} \\bm{\\mathcal{F}}\\).\nDifferent alternatives of linear controllers can be used instead of the PD controller used in this structure, however PD controller is the simplest form which can preserve the manipulator stability while providing suitable tracking performance.\nThe proposed decentralized PD controller is very simple in structure and therefore easily implementable. The design of such a controller needs no detailed information on the manipulator dynamics. The controller gains are generally tuned experimentally based on physical realization of the controller by trial and error.\nFeed Forward Control A feedforward wrench denoted by \\(\\bm{\\mathcal{F}}_{ff}\\) may be added to the decentralized PD controller structure as depicted in Figure fig:feedforward_control_task_space. This term is generated from the dynamic model of the manipulator in the task space, represented in a closed form by the following equation: \\[ \\bm{\\mathcal{F}}_{ff} = \\bm{\\hat{M}}(\\bm{\\mathcal{X}}_d)\\ddot{\\bm{\\mathcal{X}}}_d + \\bm{\\hat{C}}(\\bm{\\mathcal{X}}_d, \\dot{\\bm{\\mathcal{X}}}_d)\\dot{\\bm{\\mathcal{X}}}_d + \\bm{\\hat{G}}(\\bm{\\mathcal{X}}_d) \\]\n\n Figure 20: Feed forward wrench added to the decentralized PD controller in task space\n The desired trajectory in task space \\(\\bm{\\mathcal{X}}_d\\), and its derivatives \\(\\dot{\\bm{\\mathcal{X}}}_d\\), \\(\\ddot{\\bm{\\mathcal{X}}}_d\\) are the required inputs for the feedforward block. This term is called feedforward since no online information of the output motion trajectory \\(\\bm{\\mathcal{X}}\\) is needed for its computation.\nIn order to generate this term, dynamic formulation of the robots and its kinematic and dynamic parameters are needed. In practice, exact knowledge of dynamic matrices are not available, and therefore, estimate of these matrices are used in practice, denoted by \\(\\hat{\\bm{M}}\\), \\(\\hat{\\bm{C}}\\) and \\(\\hat{\\bm{G}}\\).\nThe information required to generate the feedforward wrench \\(\\bm{\\mathcal{F}}_{ff}\\) is usually available beforehand and can be derived offline. The closed-loop dynamic formulation for the manipulator becomes:\n\\begin{equation} \\begin{aligned} \\bm{M}(\\bm{\\mathcal{X}})\\ddot{\\bm{\\mathcal{X}}} \u0026amp;+ \\bm{C}(\\bm{\\mathcal{X}}, \\dot{\\bm{\\mathcal{X}}})\\dot{\\bm{\\mathcal{X}}} + \\bm{G}(\\bm{\\mathcal{X}}) \\\\\\\n\u0026amp;= \\bm{\\mathcal{F}} + \\bm{\\mathcal{F}}_d \\\\\\\n\u0026amp;= \\bm{\\mathcal{F}}_{pd} + \\bm{\\mathcal{F}}_{ff} + \\bm{\\mathcal{F}}_d \\\\\\\n\u0026amp;= \\bm{K}_d \\dot{\\bm{e}}_x + \\bm{K}_p \\bm{e}_x + \\bm{\\mathcal{F}}_{ff} + \\bm{\\hat{M}}\\ddot{\\bm{\\mathcal{X}}}_d + \\bm{\\hat{C}}\\dot{\\bm{\\mathcal{X}}}_d + \\bm{\\hat{G}} \\end{aligned} \\end{equation}\nIf the knowledge of the dynamic matrices is complete, we may assume that \\(\\hat{\\bm{M}} = \\bm{M}\\), \\(\\hat{\\bm{C}} = \\bm{C}\\) and \\(\\hat{\\bm{G}} = \\bm{G}\\). Furthermore, if we consider that the controller performs well such that \\(\\bm{\\mathcal{X}}(t) \\simeq \\bm{\\mathcal{X}}_d(t)\\) and \\(\\dot{\\bm{\\mathcal{X}}}(t) \\simeq \\dot{\\bm{\\mathcal{X}}}_d(t)\\), the simplified closed-loop dynamics become:\n\\begin{equation} \\begin{aligned} \\bm{M} (\\ddot{\\bm{\\mathcal{X}}}_d - \\ddot{\\bm{\\mathcal{X}}}) + \\bm{K}_d \\dot{\\bm{e}}_x + \\bm{K}_p \\bm{e}_x + \\bm{\\mathcal{F}}_d \u0026amp;= 0 \\\\\\\n\\bm{M} \\ddot{\\bm{e}}_x + \\bm{K}_d \\dot{\\bm{e}}_x + \\bm{K}_p \\bm{e}_x + \\bm{\\mathcal{F}}_d \u0026amp;= 0 \\end{aligned} \\end{equation}\nThis equation implies that, if the mentioned assumptions hold, the error dynamics satisfies a set of second-order system in the presence of disturbance. By choosing appropriate gains for PD controller, the transient and steady-state performance of tracking error can be designed so as to satisfy the application requirements.\nNote that except the mass matrix, the error dynamic terms are all configuration independent, and therefore, it is much easier to tune the PD controller gains to work well within the whole workspace of the robot.\nHowever, this method faces a number of limitations in practice. The most important limitation of this control technique is the stringent assumption of a complete knowledge requirement of the dynamic matrices. In practice, derivation of these matrices is a prohibitive task.\nFinally, because of the dependency of the mass matrix to the configuration of the robot, the error dynamics are not completely decoupled. This means that correction in one error component may be considered as a disturbance effect to the other components. To overcome these limitations, inverse dynamic approach is given in the following section.\nInverse Dynamics Control In inverse dynamics control (IDC), nonlinear dynamics of the model is used to add a corrective term to the decentralized PD controller. By this means, nonlinear and coupling behavior of the robotic manipulator is significantly attenuated, and therefore, the performance of linear controller is greatly improved.\n General structure of IDC applied to a parallel manipulator is depicted in Figure fig:inverse_dynamics_control_task_space. A corrective wrench \\(\\bm{\\mathcal{F}}_{fl}\\) is added in a feedback structure to the closed-loop system, which is calculated from the Coriolis and centrifugal matrix and gravity vector of the manipulator dynamic formulation.\nFurthermore, mass matrix is added in the forward path in addition to the desired trajectory acceleration \\(\\ddot{\\bm{\\mathcal{X}}}_d\\).\nAs for the feedforward control, the dynamics and kinematic parameters of the robot are needed, and in practice estimates of these matrices are used.\n\n Figure 21: General configuration of inverse dynamics control implemented in task space\n The controller output wrench applied to the manipulator may be derived as follows:\n\\begin{subequations} \\begin{align} \\bm{\\mathcal{F}} \u0026amp;= \\hat{\\bm{M}}(\\bm{\\mathcal{X}}) \\bm{a} + \\bm{\\mathcal{F}}_{fl} \\\\\\\n\u0026amp;= \\hat{\\bm{M}}(\\bm{\\mathcal{X}}) \\bm{a} + \\hat{\\bm{C}}(\\bm{\\mathcal{X}}, \\dot{\\bm{\\mathcal{X}}}) \\dot{\\bm{\\mathcal{X}}} + \\hat{\\bm{G}}(\\bm{\\mathcal{X}}) \\\\\\\n\\bm{a} \u0026amp;= \\ddot{\\bm{\\mathcal{X}}}_d + \\bm{K}_d \\dot{\\bm{e}}_x + \\bm{K}_p \\bm{e}_x \\end{align} \\end{subequations}\nThe closed-loop dynamic formulation for the manipulator becomes:\n\\begin{equation} \\begin{aligned} \\bm{M}(\\bm{\\mathcal{X}})\\ddot{\\bm{\\mathcal{X}}} \u0026amp;+ \\bm{C}(\\bm{\\mathcal{X}}, \\dot{\\bm{\\mathcal{X}}})\\dot{\\bm{\\mathcal{X}}} + \\bm{G}(\\bm{\\mathcal{X}}) \\\\\\\n\u0026amp;= \\bm{\\mathcal{F}} + \\bm{\\mathcal{F}}_d \\\\\\\n\u0026amp;= \\hat{\\bm{M}}(\\bm{\\mathcal{X}}) \\left(\\ddot{\\bm{\\mathcal{X}}}_d + \\bm{K}_d \\dot{\\bm{e}}_x + \\bm{K}_p \\bm{e}_x \\right) \\\\\\\n\u0026amp;\\quad + \\hat{\\bm{C}}(\\bm{\\mathcal{X}}, \\dot{\\bm{\\mathcal{X}}})\\dot{\\bm{\\mathcal{X}}} + \\hat{\\bm{G}}(\\bm{\\mathcal{X}}) + \\bm{\\mathcal{F}}_d \\\\\\\n\\end{aligned} \\end{equation}\nIf the knowledge of the dynamic matrices is complete, the closed-loop dynamic formulation simplifies to:\n\\begin{equation} \\hat{\\bm{M}}(\\bm{\\mathcal{X}}) \\left(\\ddot{\\bm{e}}_d + \\bm{K}_d \\dot{\\bm{e}}_x + \\bm{K}_p \\bm{e}_x \\right) + \\bm{\\mathcal{F}}_d = 0 \\end{equation}\nThis control technique is very popular in practice because of the fact that this technique can significantly linearize and decouple dynamic formulation of the closed-loop error dynamics. Furthermore, the error dynamic terms are all configuration independent, and therefore, it is much easier to tune the PD controller gains for suitable performance in the whole workspace of the robot.\nHowever, note that for a good performance, and accurate model of the system is required, and the overall procedure is not robust to modeling uncertainty. Furthermore, this technique is computationally intensive in terms of the online computations needed to carry out the closed-loop control structure.\nPartial Linearization IDC Inverse dynamics control has several features making it very attractive in practice. However, to apply this method, complete knowledge of the dynamic formulation matrices is required. This requirement has the main drawbacks that the dynamic formulation of the parallel manipulator is a complicated step to be carried out.\nTo implement all the terms in IDC structure, not only the structure and components of such matrices must be carefully determined, but also the kinematics and inertial parameters of the robot are needed to be identified and calibrated. This step requires the use of high-precision calibration equipment which are not usually accessible. Finally, if all the terms and parameters are well known, implementation of full inverse dynamic linearization is computationally intensive.\nThese are the reasons why, in practice, IDC control is extended to different forms where the above-mentioned stringent requirements are reduced.\nTo develop the simplest possible implementable IDC, let us recall dynamic formulation complexities:\n the manipulator mass matrix \\(\\bm{M}(\\bm{\\mathcal{X}})\\) is derived from kinetic energy of the manipulator (Eq. eq:kinetic_energy) the gravity vector \\(\\bm{G}(\\bm{\\mathcal{X}})\\) is derived from potential energy (Eq. eq:gravity_vectory) the Coriolis and centrifugal matrix \\(\\bm{C}(\\bm{\\mathcal{X}}, \\dot{\\bm{\\mathcal{X}}})\\) is derived from Eq. eq:gravity_vectory The computation of the Coriolis and centrifugal matrix is more intensive than that of the mass matrix. Gravity vector is more easily computable.\nHowever, it is shown that certain properties hold for mass matrix, gravity vector and Coriolis and centrifugal matrix, which might be directly used in the control techniques developed for parallel manipulators. One of the most important properties of dynamic matrices is the skew-symmetric property of the matrix \\(\\dot{\\bm{M}} - 2 \\bm{C}\\) .\nConsider dynamic formulation of parallel robot given in Eq. eq:closed_form_dynamic_formulation, in which the skew-symmetric property of dynamic matrices is satisfied. The simplest form of IDC control effort \\(\\bm{\\mathcal{F}}\\) consists of: \\[ \\bm{\\mathcal{F}} = \\bm{\\mathcal{F}}_{pd} + \\bm{\\mathcal{F}}_{fl} \\] in which the first term \\(\\bm{\\mathcal{F}}_{pd}\\) is generated by the simplified PD form on the motion error: \\[ \\bm{\\mathcal{F}}_{pd} = \\bm{K}_d \\dot{\\bm{e}}_x + \\bm{K}_p + \\bm{e}_x \\]\nThe second term \\(\\bm{\\mathcal{F}}_{fl}\\) is considered to be only the gravity vector of the manipulator \\(\\bm{G}(\\bm{\\mathcal{X}})\\), at any configuration, and the computationally intensive Coriolis and centrifugal term is not used: \\[ \\bm{\\mathcal{F}}_{fl} = \\bm{G}(\\bm{\\mathcal{X}}) \\]\nNote that for an appreciable tracking performance with no static error at steady state, it is required to have complete knowledge of only the gravity term. By this means, computations required in this control technique are significantly less than that of the general IDC.\nDespite the simple structure of such a controller, the resulting control technique is very well performed, especially at steady state. We can show that this control topology achieves asymptotic tracking for a constant desired trajectory motion, that is, \\(\\dot{\\bm{\\mathcal{X}}}_d = 0\\).\nThis reveals the fact that even if the mass matrix and Coriolis and centrifugal matrix are not used in the feedback, and the closed-loop dynamics is not completely linearized, the PD control structure with gravity compensation can still lead to asymptotic tracking. However, to suitable transient performance, more information of the system dynamics must be used in the linearization technique given in IDC.\nRobust and Adaptative Control Inverse dynamics control faces the stringent requirement that for a good performance, an accurate model of the system is required, and the overall procedure is not robust to modeling uncertainty. Furthermore, this technique is computationally intensive in terms of online computation needed to carry out the closed-loop control structure. The proposed modified inverse dynamics control, while being beneficial in terms of computational cost, is not suitable in terms of a closed-loop transient performance.\nAnother approach to modify IDC is to consider a complete linearization, but assume that complete knowledge of dynamic formulation matrices is not available. To compensate for the lack of knowledge, two advanced control methods, namely robust and adaptive control are proposed:\n In the robust approach, a fixed controller is designed to satisfy the control objectives for the worst possible case of modeling uncertainty and disturbance wrenches. In the adaptive approach, the estimates of dynamic formulation matrices are updated such that the difference between the true values of these matrices to their estimates converges to zero. A global understanding of the trade-offs involved in each method is needed to employ either of them in practice.\nRobust Inverse Dynamics Control Various sources of uncertainties such as unmodelled dynamics, unknown parameters, calibration error, unknown disturbance wrenches, and varying payloads may exist, and are not seen in dynamic model of the manipulator.\nTo consider these modeling uncertainty in the closed-loop performance of the manipulator, recall the general closed-form dynamic formulation of the manipulator given in Eq. eq:closed_form_dynamic_formulation, and modify the inverse dynamics control input \\(\\bm{\\mathcal{F}}\\) as\n\\begin{align*} \\bm{\\mathcal{F}} \u0026amp;= \\hat{\\bm{M}}(\\bm{\\mathcal{X}}) \\bm{a}_r + \\hat{\\bm{C}}(\\bm{\\mathcal{X}}, \\dot{\\bm{\\mathcal{X}}}) \\dot{\\bm{\\mathcal{X}}} + \\hat{\\bm{G}}(\\bm{\\mathcal{X}})\\\\\\\n\\bm{a}_r \u0026amp;= \\ddot{\\bm{\\mathcal{X}}}_d + \\bm{K}_d \\dot{\\bm{e}}_x + \\bm{K}_p \\bm{e}_x + \\bm{\\delta}_a \\end{align*}\nin which \\(\\bm{a}_r\\) is the robustified control input.\nComparing this equation to the usual IDC, a robustifying term \\(\\bm{\\delta}_a\\) is added to compensate for modeling uncertainties.\nNote that, as defined earlier, the notation \\(\\hat{(.)}\\) represents the estimated value of \\((.)\\) and \\(\\tilde{(.)}\\) is defined as the error mismatch between the estimated value and the true value as \\(\\tilde{(.)} = \\hat{(.)}- (.)\\).\nIn a similar manner \\(\\tilde{(.)}\\) notation may be applied to the motion variables as \\[ \\tilde{\\bm{\\mathcal{X}}} = \\bm{\\mathcal{X}} - \\bm{\\mathcal{X}}_d = - \\bm{e}_x \\]\nThe closed-loop dynamic formulation of the manipulator can be written as: \\[ \\ddot{\\bm{\\mathcal{X}}} = \\bm{a}_r + \\bm{\\eta}(\\bm{\\mathcal{X}}, \\dot{\\bm{\\mathcal{X}}}, \\bm{a}_r) \\] in which \\[ \\bm{\\eta} = \\bm{M}^{-1} \\left( \\tilde{\\bm{M}} \\bm{a}_r + \\tilde{\\bm{C}} \\dot{\\bm{\\mathcal{X}}} + \\tilde{\\bm{G}} \\right) \\] is a measure of modeling uncertainty.\n\n Figure 22: General configuration of robust inverse dynamics control implemented in the task space\n Adaptive Inverse Dynamics Control \n Figure 23: General configuration of adaptative inverse dynamics control implemented in task space\n Motion Control in Joint Space Although the motion control schemes developed in section sec:control_task_space are very effective for tracking performance, they suffer from an implementation constraint that the motion variable \\(\\bm{\\mathcal{X}}\\) must be measured in practice.\nIf this measurement is available without any doubt, such topologies are among the best routines to be implemented in practice. However, as explained in Section sec:control_topology, in many practical situations measurement of the motion variable \\(\\bm{\\mathcal{X}}\\) is difficult or expensive, and usually just the active joint variables \\(\\bm{q}\\) are measured. In such cases, the controllers developed in the joint space may be recommended for practical implementation.\nTo generate a direct input to output relation in the joint space, consider the topology depicted in Figure fig:general_topology_motion_feedback_bis. In this topology, the controller input is the joint variable error vector \\(\\bm{e}_q = \\bm{q}_d - \\bm{q}\\), and the controller output is directly the actuator force vector \\(\\bm{\\tau}\\), and hence there exists a one-to-one correspondence between the controller input to its output.\nThe general form of dynamic formulation of parallel robot is usually given in the task space. For motion control in joint space, we need to transform the dynamic formulation in the joint space, by which the actuator forces \\(\\bm{\\tau}\\) are directly related to the active joint variables \\(\\bm{q}\\).\nDynamic Formation in the Joint Space The relation between the task space variables to their counterparts in the joint space can be derived by forward and inverse kinematics relations. Although both analyses involve solution to a set of non-linear equations, for parallel manipulators, inverse kinematic solution proves to be much easier to obtain than that of forward kinematic solution.\nThis relation in differential kinematics is much simpler and can be completely determined by the Jacobian matrix: \\[ \\tcmbox{\\dot{\\bm{q}} = \\bm{J} \\dot{\\bm{\\mathcal{X}}} \\Longrightarrow \\dot{\\bm{\\mathcal{X}}} = \\bm{J}^{-1} \\dot{\\bm{q}}} \\]\nThe acceleration variables are then: \\[ \\ddot{\\bm{q}} = \\dot{\\bm{J}} \\dot{\\bm{\\mathcal{X}}} + \\bm{J} \\ddot{\\mathcal{X}} \\Longrightarrow \\ddot{X} = \\bm{J}^{-1} \\ddot{\\bm{q}} - \\bm{J}^{-1} \\dot{\\bm{J}} \\dot{\\bm{\\mathcal{X}}} \\]\nFurthermore, the relation between the actuator force vector \\(\\bm{\\tau}\\) to the corresponding task space wrench is given by: \\[ \\tcmbox{\\bm{\\mathcal{F}} = \\bm{J}^T \\bm{\\tau} \\Longrightarrow \\bm{\\tau} = \\bm{J}^{-T} \\bm{\\mathcal{F}}} \\]\nSubstituting \\(\\dot{\\bm{\\mathcal{X}}}\\) and \\(\\ddot{\\bm{\\mathcal{X}}}\\) from the above equations into the dynamic formulation of the parallel robot gives:\n\\begin{equation*} \\begin{aligned} \u0026amp; \\left( \\bm{J}^{-T} \\bm{M} \\bm{J}^{-1} \\right) \\ddot{\\bm{q}} \\\\\\\n\u0026amp; \\quad + \\bm{J}^{-T} \\left( \\bm{C} - \\bm{M} \\bm{J}^{-1} \\dot{\\bm{J}} \\right) \\bm{J}^{-1} \\dot{\\bm{q}} \\\\\\\n\u0026amp; \\quad + \\bm{J}^{-T} \\bm{G} + \\bm{J}^{-T} \\bm{\\mathcal{F}}_d = \\bm{\\tau} \\end{aligned} \\end{equation*}\n \\begin{equation} \\bm{M}_q \\ddot{\\bm{q}} + \\bm{C}_q \\dot{\\bm{q}} + \\bm{G}_q + \\bm{\\tau}_d = \\bm{\\tau} \\label{eq:dynamics_joint_space} \\end{equation}\nwith:\n\\begin{subequations} \\begin{align} \\bm{M}_q =\u0026amp; \\bm{J}^{-T} \\bm{M} \\bm{J}^{-1} \\\\\\\n\\bm{D}_q =\u0026amp; \\bm{J}^{-T} \\left( \\bm{C} - \\bm{M} \\bm{J}^{-1} \\dot{\\bm{J}} \\right) \\bm{J}^{-1} \\\\\\\n\\bm{G}_q =\u0026amp; \\bm{J}^{-T} \\bm{G} \\\\\\\n\\bm{\\tau}_q =\u0026amp; \\bm{J}^{-T} \\bm{\\mathcal{F}}_d \\end{align} \\end{subequations}\n Equation eq:dynamics_joint_space represents the closed form dynamic formulation of a general parallel robot in the joint space.\nNote that the dynamic matrices are not explicitly represented in terms of the joint variable vector \\(\\bm{q}\\). In fact, to fully derive these matrices, the Jacobian matrices must be computed and are generally derived as a function of the motion variables \\(\\bm{\\mathcal{X}}\\). Furthermore, the main dynamic matrices are all functions of the motion variable \\(\\bm{\\mathcal{X}}\\). Hence, in practice, to find the dynamic matrices represented in the joint space, forward kinematics should be solved to find the motion variable \\(\\bm{\\mathcal{X}}\\) for any given joint motion vector \\(\\bm{q}\\).\nSince in parallel robots the forward kinematic analysis is computationally intensive, there exist inherent difficulties in finding the dynamic matrices in the joint space as an explicit function of \\(\\bm{q}\\). In this case it is possible to solve forward kinematics in an online manner, it is recommended to use the control topology depicted in fig:general_topology_motion_feedback_bis, and implement control law design in the task space.\nHowever, one implementable alternative to calculate the dynamic matrices represented in the joint space is to use the desired motion trajectory \\(\\bm{\\mathcal{X}}_d\\) instead of the true value of motion vector \\(\\bm{\\mathcal{X}}\\) in the calculations. This approximation significantly reduces the computational cost, with the penalty of having mismatch between the estimated values of these matrices to their true values.\nDecentralized PD Control The first control strategy introduced in the joint space consists of the simplest form of feedback control in such manipulators. In this control structure, depicted in Figure fig:decentralized_pd_control_joint_space, a number of PD controllers are used in a feedback structure on each error component.\nThe PD controller is denoted by \\(\\bm{K}_d s + \\bm{K}_p\\), where \\(\\bm{K}_d\\) and \\(\\bm{K}_p\\) are \\(n \\times n\\) diagonal matrices denoting the derivative and proportional controller gains, respectively.\n\n Figure 24: Decentralized PD controller implemented in joint space\n By this structure, each tracking error component is treated separately by its disjoint PD controller. The proposed decentralized PD controller is very simple in structure, and therefore very easy to be implemented on the manipulator. The design of such a controller needs no detailed information on the manipulator dynamic formulation and parameters. However, the tracking performance of such a controller is relatively poor, and static tracking errors might be unavoidable. Also, the performance of the closed-loop system is configuration dependent.\nIn practice, the gains are tuned experimentally and obtained as a trade-off between transient behavior and steady-state errors at different configurations. As the dynamics of the system in the joint space is configuration dependent, finding suitable controller gains to result in required performance in all configurations is a difficult task.\nThe performance of the controller to attenuate measurement noise and external disturbance wrenches are also poor in practice. To remedy these shortcomings, some modifications have been proposed to this structure and further described.\nFeedforward Control The tracking performance of the simple PD controller implemented in the joint space is usually not sufficient at different configurations. To improve the tracking performance, a feedforward actuator force denoted by \\(\\bm{\\tau}_{ff}\\) may be added to the structure of the controller as depicted in Figure fig:feedforward_pd_control_joint_space.\n\n Figure 25: Feed forward actuator force added to the decentralized PD controller in joint space\n The feedforward term is generated from the dynamic formulation of the manipulator. The desired trajectory in the task space \\(\\bm{\\mathcal{X}}_d\\) and its derivatives \\(\\dot{\\bm{\\mathcal{X}}}_d\\), \\(\\ddot{\\bm{\\mathcal{X}}}_d\\) are thus required.\nIn practice, exact knowledge of dynamic matrices are not available, and therefore, estimates of these matrices are used in this derivation denoted by \\(\\hat{\\bm{M}}\\), \\(\\hat{\\bm{C}}\\) and \\(\\hat{\\bm{G}}\\).\nThe information required to generate the feedforward actuator force \\(\\bm{\\tau}_{ff}\\) is usually available beforehand, and in such a case, the feedforward term corresponding to a given trajectory can be determined off-line, while the computation of the decentralized feedback term would be executed online.\nIf complete information of the dynamic matrices is available, and if we assume that the system is performing well, meaning that \\(\\bm{\\mathcal{X}}(t) \\simeq \\bm{\\mathcal{X}}_d(t)\\) and \\(\\dot{\\bm{\\mathcal{X}}}(t) \\simeq \\dot{\\bm{\\mathcal{X}}}_d(t)\\), we can write the closed loop dynamics as follow: \\[ \\bm{M}_q \\ddot{\\bm{e}}_q + \\bm{K}_d \\dot{\\bm{e}}_q + \\bm{K}_p \\bm{e}_q = \\bm{\\tau}_d \\]\nThe error dynamics satisfy a set of second-order differential equations in the presence of disturbance. Therefore, by choosing appropriate gains of the PD controller, the transient and steady-state performance of the tracking error can be suitably designed.\nNote that except for the mass matrix, the error dynamics terms are all configuration independent, and therefore, it is much easier to tune the PD controller gains to work well in the whole workspace of the robot in such a structure.\nHowever, this method suffers from a number of limitations in practice. The most important limitation is the stringent assumption of the complete information requirement of dynamics matrices. Furthermore, even is all the assumption hold, because of the configuration dependence of the mass matrix, the error dynamics is still not completely decoupled. This means that correction in one component may be considered as a disturbance effect to the other components. To overcome these limitations, the inverse dynamic approach has been developed and is given in the following section.\nInverse Dynamics Control As seen in the previous section, the tracking performance of a decentralized PD controller implemented in the joint space is not uniform at different configurations. To compensate for such effects, a feedforward torque is added to the structure of the controller, by which the shortcomings of the decentralized controller is partially remedied. However, the closed-loop performance still faces a number of limitations, which cannot be completely remedied because of the inherent conditions on feedforward structure of that proposed controller. To overcome these limitations, in this section, a control technique based on inverse dynamic feedback of the manipulator in the joint space is presented.\n In the inverse dynamics control (IDC) strategy, the nonlinear dynamics of the model is used to add a corrective term to the decentralized PD controller. By this means, the nonlinear and coupling characteristics of robotic manipulator is significantly attenuated, and therefore, the performance of linear controller is significantly improved.\n The general structure of inverse dynamics control applied to a parallel manipulator in the joint space is depicted in Figure fig:inverse_dynamics_control_joint_space.\nA corrective torque \\(\\bm{\\tau}_{fl}\\) is added in a feedback structure to the closed-loop system, which is calculated from the Coriolis and Centrifugal matrix, and the gravity vector of the manipulator dynamic formulation in the joint space. Furthermore, the mass matrix is acting in the forward path, in addition to the desired trajectory acceleration \\(\\ddot{\\bm{q}}_q\\). Note that to generate this term, the dynamic formulation of the robot, and its kinematic and dynamic parameters are needed. In practice, exact knowledge of dynamic matrices are not available, and there estimates are used.\n\n Figure 26: General configuration of inverse dynamics control implemented in joint space\n The controller output torque applied to the manipulator may be calculated by:\n\\begin{subequations} \\begin{align} \\bm{\\tau} \u0026amp;= \\hat{\\bm{M}}_q \\bm{a}_q + \\bm{\\tau}_{fl} \\\\\\\n\\bm{\\tau}_{fl} \u0026amp;= \\hat{\\bm{C}}_q \\dot{\\bm{q}} + \\hat{\\bm{G}}_q \\\\\\\n\\bm{a}_q \u0026amp;= \\ddot{\\bm{q}}_d + \\bm{K}_d \\dot{\\bm{e}}_q + \\bm{K}_p \\bm{e}_q \\end{align} \\end{subequations}\nIf the knowledge of dynamic matrices is complete, the closed-loop dynamic formulation is simplified to: \\[ \\hat{\\bm{M}}_q \\left( \\ddot{\\bm{e}}_q + \\bm{K}_d \\dot{\\bm{e}}_q + \\bm{K}_p \\bm{e}_q \\right) + \\bm{\\tau}_d = 0 \\]\nThis equation implies that if there exist complete knowledge of the dynamic matrices, the tracking error dynamic equation satisfies a set of second-order systems in the presence of disturbance. Consider the case where no disturbance wrench is applied to the manipulator, as the mass matrix \\(\\bm{M}_q\\) is positive definite at all non-singular configurations, it can be inverted, and the error dynamics simplifies to: \\[ \\ddot{\\bm{e}}_q + \\bm{K}_d \\dot{\\bm{e}}_q + \\bm{K}_p \\bm{e}_q = 0 \\]\nThis control technique is very popular in practice because of the fact that it can significantly linearize and decouple the dynamic formulation of the closed-loop system for error dynamics components. Furthermore, the error dynamic terms are all configuration independent, and therefore, it is much easier to tune the PD controller gains to perform well in the whole workspace of the robot.\nHowever, note that for a good performance, an accurate model of the system is required, and the overall procedure is not robust to model uncertainties.\nSummary of Motion Control Techniques In this section, a number of control techniques have been developed for parallel robots. Based on the dynamic formulation given in Section sec:dynamics, many model-based control techniques have been developed for implementation in the task space as well as in the joint space. These control techniques are presented from the simplest form of decentralized PD control to more advanced robust and adaptive inverse dynamics control.\nA summary of these techniques is given below.\nDynamic Formulations The dynamic formulation of a parallel robot may be directly represented as a function of motion variable \\(\\bm{\\mathcal{X}}\\) in the task space as follows:\n\\begin{equation*} \\bm{M}(\\bm{\\mathcal{X}})\\ddot{\\bm{\\mathcal{X}}} + \\bm{C}(\\bm{\\mathcal{X}}, \\dot{\\bm{\\mathcal{X}}})\\dot{\\bm{\\mathcal{X}}} + \\bm{G}(\\bm{\\mathcal{X}}) = \\bm{\\mathcal{F}} + \\bm{\\mathcal{F}}_d \\end{equation*}\nThe dynamic formulation may be represented as a function of actuator motion variable \\(\\bm{q}\\) as\n\\begin{equation*} \\bm{M}_q \\ddot{\\bm{q}} + \\bm{C}_q \\dot{\\bm{q}} + \\bm{G}_q = \\bm{\\tau} + \\bm{\\tau}_d \\end{equation*}\nin which these two formulations are closely related to each other by the following relations:\n\\begin{equation*} \\begin{aligned} \\bm{M}_q \u0026amp;= \\bm{J}^{-T} \\bm{M} \\bm{J}^{-1} \\\\\\\n\\bm{C}_q \u0026amp;= \\bm{J}^{-T} \\left( \\bm{C} - \\bm{M}\\bm{J}^{-1}\\dot{\\bm{J}} \\right) \\bm{J}^{-1} \\\\\\\n\\bm{D}_q \u0026amp;= \\bm{J}^{-T} \\bm{G} \\\\\\\n\\bm{\\tau}_q \u0026amp;= \\bm{J}^{-T} \\bm{\\mathcal{F}} \\end{aligned} \\end{equation*}\nDecentralized PD Control The simplest controller for a parallel robot can be considered as a decentralized PD controller being implemented individually on each error component. If such a structure is implemented in the task space, the control effort is calculated by\n\\begin{equation*} \\bm{\\mathcal{F}} = \\bm{K}_d \\dot{\\bm{e}}_x + \\bm{K}_p \\bm{e}_x \\end{equation*}\nand the actuator effort can be generally determined through a force distribution scheme.\nFor a completely parallel manipulator, the actuator forces can be generated by \\(\\bm{\\tau} = \\bm{J}^{-T} \\bm{\\mathcal{F}}\\) at non-singular configurations.\nDecentralized PD control can be directly implemented in the joint space by the following equation:\n\\begin{equation*} \\bm{\\tau} = \\bm{K}_d \\dot{\\bm{e}}_q + \\bm{K}_p \\bm{e}_q \\end{equation*}\nFeed Forward Control The reduce the performance limitations of simple PD control, the control effort may be enforced with a feed forward wrench given by\n\\begin{equation*} \\bm{\\mathcal{F}} = \\bm{\\mathcal{F}}_{pd} + \\bm{\\mathcal{F}}_{ff} \\end{equation*}\nin which\n\\begin{equation*} \\begin{aligned} \\bm{\\mathcal{F}}_{ff} \u0026amp;= \\bm{K}_d \\dot{\\bm{e}}_x + \\bm{K}_p \\bm{e}_x \\\\\\\n\u0026amp;+ \\hat{\\bm{M}}(\\bm{\\mathcal{X}}_d)\\ddot{\\bm{\\mathcal{X}}}_d + \\hat{\\bm{C}}(\\bm{\\mathcal{X}}_d, \\dot{\\bm{\\mathcal{X}}}_d)\\dot{\\bm{\\mathcal{X}}}_d + \\hat{\\bm{G}}(\\bm{\\mathcal{X}}_d) \\end{aligned} \\end{equation*}\nwhere \\(\\hat{\\bm{M}}\\), \\(\\hat{\\bm{C}}\\) and \\(\\hat{\\bm{G}}\\) are estimation of the dynamic matrices.\nThis controller can be implemented in joint space as follows\n\\begin{equation*} \\begin{aligned} \\bm{\\tau} \u0026amp;= \\bm{\\tau}_{pd} + \\bm{\\tau}_{ff} \\\\\\\n\u0026amp;= \\bm{K}_d \\dot{\\bm{e}}_q + \\bm{K}_p \\bm{e}_q + \\bm{J}^{-T} \\bm{\\mathcal{F}}_{ff} \\end{aligned} \\end{equation*}\nInverse Dynamics Control In the inverse dynamics control, the nonlinear dynamics of the model is used to add a corrective term to the decentralized PD controller. If such a structure is implemented in the task space, the control effort is calculated by\n\\begin{equation*} \\begin{aligned} \\bm{\\mathcal{F}} \u0026amp;= \\hat{\\bm{M}}(\\bm{\\mathcal{X}})\\bm{a} + \\hat{\\bm{C}}(\\bm{\\mathcal{X}}, \\dot{\\bm{\\mathcal{X}}})\\dot{\\bm{\\mathcal{X}}} + \\hat{\\bm{G}}(\\bm{\\mathcal{X}}) \\\\\\\n\\bm{a} \u0026amp;= \\ddot{\\bm{\\mathcal{X}}}_d + \\bm{K}_d \\dot{\\bm{e}}_x + \\bm{K}_p \\bm{e}_x \\end{aligned} \\end{equation*}\nIn general, the tracking error dynamics can be represented by\n\\begin{equation*} \\ddot{\\bm{e}}_x + \\bm{K}_d \\dot{\\bm{e}}_x + \\bm{K}_p \\bm{e}_x + \\hat{\\bm{M}}^{-1} \\left[ \\tilde{\\bm{M}} \\ddot{\\bm{\\mathcal{X}}} + \\tilde{\\bm{C}} \\dot{\\bm{\\mathcal{X}}} + \\tilde{\\bm{G}} + \\bm{\\mathcal{F}}_d \\right] = 0 \\end{equation*}\nThis controller can be implemented in the joint space as follows:\n\\begin{equation*} \\begin{aligned} \\bm{\\tau} \u0026amp;= \\hat{\\bm{M}}_q \\bm{a}_q + \\hat{\\bm{C}}_q \\dot{\\bm{q}} + \\hat{\\bm{G}}_q \\\\\\\n\\bm{a}_q \u0026amp;= \\ddot{\\bm{q}}_d + \\bm{K}_d \\dot{\\bm{e}}_q + \\bm{K}_p \\bm{e}_q \\end{aligned} \\end{equation*}\nby which the tracking error dynamics is summarized as\n\\begin{equation*} \\ddot{\\bm{e}}_q + \\bm{K}_d \\dot{\\bm{e}}_q + \\bm{K}_p \\bm{e}_q + \\hat{\\bm{M}}_{q}^{-1} \\left[ \\tilde{\\bm{M}}_q \\ddot{\\bm{q}} + \\tilde{\\bm{C}}_q \\dot{\\bm{q}} + \\tilde{\\bm{G}}_q + \\bm{\\mathcal{\\tau}}_d \\right] = 0 \\end{equation*}\nPartial Linearization IDC To reduce the computational cost of the inverse dynamic control, it is possible to use partial linearization of dynamic formulation, just by gravity compensation, while keeping asymptotic tracking stability of the closed-loop system. In which a case, the control input wrench in the task space is simplified to\n\\begin{equation*} \\bm{\\mathcal{F}} = \\bm{K}_d \\dot{\\bm{e}}_x + \\bm{K}_p \\bm{e}_x + \\hat{\\bm{G}}(\\bm{\\mathcal{X}}) \\end{equation*}\nThe following Lyapunov function may be used to analyze the stability of tracking dynamics of the closed-loop system:\n\\begin{equation*} \\dot{V} = \\dot{\\bm{\\mathcal{X}}}^T \\bm{M} \\ddot{\\bm{\\mathcal{X}}} + \\frac{1}{2} \\dot{\\bm{\\mathcal{X}}}^T \\dot{\\bm{M}} \\dot{\\bm{\\mathcal{X}}} + \\bm{e}_x^T \\bm{K}_p \\bm{e}_x \\end{equation*}\nStability analysis of the closed-loop system in this case reveals the fact that this simplified version of inverse dynamics control can lead to asymptotic tracking for constant desired trajectories.\nRobust Inverse Dynamics Control To accommodate modeling uncertainties in inverse dynamic control, the following robust control scheme in the task space is developed:\n\\begin{equation*} \\begin{aligned} \\bm{\\mathcal{F}} \u0026amp;= \\hat{\\bm{M}}(\\bm{\\mathcal{X}}) \\bm{a}_r + \\hat{\\bm{C}}(\\bm{\\mathcal{X}}, \\dot{\\bm{\\mathcal{X}}})\\dot{\\bm{\\mathcal{X}}} + \\hat{\\bm{G}}(\\bm{\\mathcal{X}}) \\\\\\\n\\bm{a}_r \u0026amp;= \\ddot{\\bm{\\mathcal{X}}}_d + \\bm{K}_d \\dot{\\bm{e}}_x + \\bm{K}_p \\bm{e}_x + \\bm{\\delta}_a \\end{aligned} \\end{equation*}\nin which the robustifying corrective term \\(\\bm{\\delta}_a\\) is found through a Lyapunov stability analysis of tracking error dynamics. The tracking error dynamics can be represented by the following linear and nonlinear components:\n\\begin{equation*} \\bm{A} = \\begin{bmatrix} \\bm{0} \u0026amp; \\bm{I} \\\\\\\n-\\bm{K}_p \u0026amp; -\\bm{K}_d \\end{bmatrix}, \\quad \\bm{B} = \\begin{bmatrix} \\bm{0} \\ \\bm{I} \\end{bmatrix} \\end{equation*}\nThe corrective term \\(\\bm{\\delta}_a\\) can be found as\n\\begin{equation*} \\bm{\\delta}_a = \\left\\{ \\begin{matrix} - \\rho \\frac{v}{\\|v\\|} \u0026amp; \\text{if} \\|v\\| \u0026gt; \\epsilon \\\\\\\n- \\rho \\frac{v}{\\epsilon} \u0026amp; \\text{if} \\|v\\| \\le \\epsilon \\end{matrix} \\right. \\end{equation*}\nin which \\(v\\) is defined by \\(v = \\bm{B}^T \\bm{P} \\bm{\\epsilon}\\), where \\(\\bm{P}\\) is the solution to the matrix Lyapunov equation and \\(\\epsilon\\) is a smoothing threshold. It is shown that by adding this corrective term to the regular inverse dynamics control, the closed-loop system achieves uniform ultimate bounded tracking errors.\nAdaptive Inverse Dynamics Control In the adaptive version of the inverse dynamics control, full feedback linearization is considered through adaptive update of dynamic formulation matrices. The error dynamics in this case is\n\\begin{equation*} \\dot{\\bm{\\epsilon}} = \\bm{A} \\bm{\\epsilon} + \\bm{B} \\bm{\\Phi} \\tilde{\\bm{\\theta}} \\end{equation*}\nin which\n\\begin{equation*} \\begin{aligned} \\bm{A} \u0026amp;= \\begin{bmatrix} \\bm{0} \u0026amp; \\bm{I} \\ -bm{K}_p \u0026amp; -\\bm{K}_d \\end{bmatrix}, \\quad \\bm{B} = \\begin{bmatrix} \\bm{0} \\ \\bm{I} \\end{bmatrix} \\\\\\\n\\bm{\\Phi} \u0026amp;= \\hat{\\bm{M}}^{-1} \\bm{\\Upsilon}(\\bm{\\mathcal{X}}, \\dot{\\bm{\\mathcal{X}}}, \\ddot{\\bm{\\mathcal{X}}}) \\end{aligned} \\end{equation*}\nBased on the Lyapunov stability analysis, by using the following Lyapunov function\n\\begin{equation*} V = \\bm{\\epsilon}^T \\bm{P} \\bm{\\epsilon} + \\tilde{\\bm{\\theta}}^T \\bm{\\Gamma} \\bm{\\theta} \\end{equation*}\nthe following parameter adaptation law is derived for updates\n\\begin{equation*} \\dot{\\hat{\\bm{\\theta}}} = - \\bm{\\Gamma}^{-1} \\bm{\\Phi}^T \\bm{B}^T \\bm{P} \\bm{\\epsilon} \\end{equation*}\nBy this means, the closed-loop system achieves asymptotic tracking performance, while the parameter estimation errors remain bounded.\nMotion Control of the Stewart-Gough Platform Control in the Task space For the Stewart-Gough platform, the motion variable in the task space is a six-dimensional vector \\[ \\bm{\\mathcal{X}} = \\begin{bmatrix} \\bm{x}_p \\ \\bm{\\theta} \\end{bmatrix} \\] with:\n \\(\\bm{x}_p = [x_p\\ y_p\\ z_p]^T\\) is the position vector of the motion platform center of mass \\(\\bm{\\theta} = \\theta [s_x\\ s_y\\ s_z]^T = [\\theta_x\\ \\theta_y\\ \\theta_z]^T\\) is the moving platform orientation expressed by screw coordinates Therefore, the tracking error is defined as \\(\\bm{e} = [e_x\\ e_y\\ e_z\\ e_{\\theta_x}\\ e_{\\theta_y}\\ e_{\\theta_z}]^T\\).\nThe decentralized controller consists of six disjoint proportional derivative controllers acting on each error component and is denoted by \\(\\bm{K}_d s + \\bm{K}_p\\).\nThe output of the controller is denoted by \\(\\bm{\\mathcal{F}} = [F_x\\ F_y\\ F_z\\ \\tau_x\\ \\tau_y\\ \\tau_z]^T\\). Note that since the output of the controller is defined in the task space, each wrench component directly manipulates the corresponding tracking error component, and therefore, the overall tracking performance of the manipulator is suitable is high controller gains are used.\nIn practice, the calculated output wrench is transformed into actuator forces through the force distribution block corresponding to the inverse of Jacobian transpose.\nControl in the Joint space The joint variable \\(\\bm{q}(t)\\) is a six-dimensional vector consisting of the limb lengths denoted by \\(\\bm{q} = [l_1\\ l_2\\ l_3\\ l_4\\ l_5\\ l_6]^T\\). Therefore, the tracking error is defined as \\(\\bm{e}_q = \\bm{q}_d - \\bm{q}\\), in which is the desired motion variable in the joint space \\(\\bm{q}_d\\) is determined by the solution of inverse kinematics, and \\(\\bm{q}\\) is given by direct measurement of the limb lengths.\nThe decentralized controller, therefore, consists of six disjoint PD controllers acting on each error component. The output of the controller directly generates the actuator torques denoted by \\(\\tau\\).\nIn simulation, it is observe that the orientation error significantly increase in the joint space control scheme. The main reason is that the controller gains directly penalize the position error of the limb lengths, and not the orientation errors, and therefore, there is no direct controller action to be suitably tuned to reduce the orientation error.\nComparing the closed-loop performance of the PD controllers designed in the joint space to those designed in the task space, it can be concluded that tuning of the PD gains for a suitable performance is much easier in task space designs. Furthermore, a very small error signature in the joint space may be accumulated to produce relatively larger tracking errors in the task space. Hence, it is recommended to design and implement controllers in the task space, if the required motion variables can be directly measured or the forward kinematic solution can be calculated in an online routine.\nForce Control \nIntroduction In many applications, it may occur that the robot moving platform is in contact with a stiff environment and specific interacting wrench is required. In such applications, the contact wrench describes the state of interaction more effectively than the position and orientation of the moving platform.\n The problem of force control can be described as to derive the actuator forces required to generate a prescribed desired wrench at the manipulator moving platform, when the manipulator is carrying out its desired motion.\n This problem and its extents are treated in the force control algorithms described in this chapter. A force control strategy is one that modifies position trajectories based on the sensed wrench, or force-motion relations.\nIf a pure motion control scheme is used for manipulator, in case it contacts an environment, the robot does not sense the presence of the environment, and its driving forces become harshly high to reduce the tracking errors. In such a case, the robot may break the object it is in contact or will break its internal structure. Additional sensors should be included in the manipulator in order for it to be able to feel the interaction and to control the interacting forces. Different wrench sensors are developed for such applications, and it is possible to use joint torque or link force measurement units to determine the projection of the interacting forces in the joint space.\nThe use of wrench sensors either in the task space or in the joint space open horizons to use different force control topologies for the manipulators. Using such sensors does not imply that regular motion sensors used in motion control schemes are not necessary. The use of motion sensors and the usual corresponding control topologies are usually necessary, since the motion of the manipulator is one of the outputs to be controlled. Depending on the type and configuration of the wrench sensors, different force control topologies are developed.\nController Topology For a force control scheme, the desired interacting wrench of the moving platform and the environment may be of interest. This quantity may be denoted by \\(\\bm{\\mathcal{F}}_d\\), which has the same dimension and structure of the manipulator wrench \\(\\bm{\\mathcal{F}}\\). To carry out such a control task in a closed-loop structure, it is necessary to measure the output wrench of the manipulator through an instrumentation system.\nAlthough there are many commercial six-degrees-of-freedom wrench sensors available in the market, they are usually more expensive than single joint force measurement units. Another alternative for force measurement is direct measurement of the actuator forces. Many commercial linear actuators are available in the market in which embedded force measurement is considered in their design. Therefore, it might be preferable in some applications to use direct actuator force measurements to carry out the feedback control.\nCascade Control In a general force control scheme, the prime objective is tracking of the interacting wrench between the moving platform and the environment. However, note that the motion control of the robot when the robot is in interaction with the environment is also another less-important objective and when the contact of the robot moving platform is released, motion control becomes the prime objective.\n To follow two objectives with different properties in one control system, usually a hierarchy of two feedback loops is used in practice. This kind of control topology is called cascade control, which is used when there are several measurements and one prime control variable. Cascade control is implemented by nesting the control loops, as shown in Figure fig:cascade_control. The output control loop is called the primary loop, while the inner loop is called the secondary loop and is used to fulfill a secondary objective in the closed-loop system.\n \n Figure 27: Block diagram of a closed-loop system with cascade control\n The measured variables are here the motion and interacting wrench that may be measured in the task space or in the joint space, and therefore, different control topologies may be advised for each set of measurement variables.\nTo improve the performance of the control system for a particular objective, it is important to choose the right variables for internal and external feedback loops, and to design suitable controllers for each feedback system. Although these differ in different topologies described in the following sections, some general rules are applied to design a well performing cascade control system.\nA general idea in cascade control design is the ideal case, in which the inner loop is designed so tight that the secondary (inner) loop behaves as a perfect servo, and responds very quickly to the internal control command. This idea is effectively used in many applications, wherein a nearly-perfect actuator to respond to the requested commands is designed by using an inner control feedback.\n The design criteria for the inner loop is to have a high control gain such that the time response of the secondary variable is at least 5 times more than that of the primary variable, and such that it can overcome the effect of disturbances and unmodelled dynamics in the internal feedback structure.\n It is also necessary to have a well-defined relation between the primary and secondary variables, to have harmony in the objectives followed in the primary and secondary loops.\nForce Feedback in Outer Loop Consider the force control schemes, in which force tracking is the prime objective. In such a case, it is advised that the outer loop of cascade control structure is constructed by wrench feedback, while the inner loop is based on position feedback. Since different types of measurement units may be used in parallel robots, different control topologies may be constructed to implement such a cascade structure.\nConsider first the cascade control topology shown in Figure fig:taghira13_cascade_force_outer_loop in which the measured variables are both in the task space. The inner loop is constructed by position feedback while the outer loop is based on force feedback. As seen in Figure fig:taghira13_cascade_force_outer_loop, the force controller block is fed to the motion controller, and this might be seen as the generated desired motion trajectory for the inner loop.\nThe output of motion controller is also designed in the task space, and to convert it to implementable actuator force \\(\\bm{\\tau}\\), the force distribution block is considered in this topology.\n\n Figure 28: Cascade topology of force feedback control: position in inner loop and force in outer loop. Moving platform wrench \\(\\bm{\\mathcal{F}}\\) and motion variable \\(\\bm{\\mathcal{X}}\\) are measured in the task space\n Other alternatives for force control topology may be suggested based on the variations of position and force measurements. If the force is measured in the joint space, the topology suggested in Figure fig:taghira13_cascade_force_outer_loop_tau can be used. In this topology, the measured actuator force vector \\(\\bm{\\tau}\\) is mapped into its corresponding wrench in the task space by the Jacobian transpose mapping \\(\\bm{\\mathcal{F}} = \\bm{J}^T \\bm{\\tau}\\).\n\n Figure 29: Cascade topology of force feedback control: position in inner loop and force in outer loop. Actuator forces \\(\\bm{\\tau}\\) and motion variable \\(\\bm{\\mathcal{X}}\\) are measured\n Consider the case where the force and motion variables are both measured in the joint space. Figure fig:taghira13_cascade_force_outer_loop_tau_q suggests the force control topology in the joint space, in which the inner loop is based on measured motion variable in the joint space, and the outer loop uses the measured actuator force vector. In this topology, it is advised that the force controller is designed in the task space, and the Jacobian transpose mapping is used to project the measured actuator force vector into its corresponding wrench in the task space. However, as the inner loop is constructed in the joint space, the desired motion variable \\(\\bm{\\mathcal{X}}_d\\) is mapped into joint space using inverse kinematic solution.\nTherefore, the structure and characteristics of the position controller in this topology is totally different from that given in the first two topologies.\n\n Figure 30: Cascade topology of force feedback control: position in inner loop and force in outer loop. Actuator forces \\(\\bm{\\tau}\\) and joint motion variable \\(\\bm{q}\\) are measured in the joint space\n Force Feedback in Inner Loop Consider the force control scheme in which the motion-force relation is the prime objective. In such a case, force tracking is not the primary objective, and it is advised that the outer loop of cascade control structure consists of a motion control feedback.\nSince different type of measurement units may be used in parallel robots, different control topologies may be constructed to implement such cascade controllers.\nFigure fig:taghira13_cascade_force_inner_loop_F illustrates the cascade control topology for the system in which the measured variables are both in the task space (\\(\\bm{\\mathcal{F}}\\) and \\(\\bm{\\mathcal{X}}\\)). The inner loop is loop is constructed by force feedback while the outer loop is based on position feedback. By this means, when the manipulator is not in contact with a stiff environment, position tracking is guaranteed through the primary controller. However, when there is interacting wrench \\(\\bm{\\mathcal{F}}_e\\) applied to the moving platform, this structure controls the force-motion relation. This configuration may be seen as if the outer loop generates a desired force trajectory for the inner loop.\n\n Figure 31: Cascade topology of force feedback control: force in inner loop and position in outer loop. Moving platform wrench \\(\\bm{\\mathcal{F}}\\) and motion variable \\(\\bm{\\mathcal{X}}\\) are measured in the task space\n Other alternatives for control topology may be suggested based on the variations of position and force measurements. If the force is measured in the joint space, control topology shown in Figure fig:taghira13_cascade_force_inner_loop_tau can be used. In such case, the Jacobian transpose is used to map the actuator force to its corresponding wrench in the task space.\n\n Figure 32: Cascade topology of force feedback control: force in inner loop and position in outer loop. Actuator forces \\(\\bm{\\tau}\\) and motion variable \\(\\bm{\\mathcal{X}}\\) are measured\n If the force and motion variables are both measured in the joint space, the control topology shown in Figure fig:taghira13_cascade_force_inner_loop_tau_q is suggested. The inner loop is based on the measured actuator force vector in the joint space \\(\\bm{\\tau}\\), and the outer loop is based on the measured actuated joint position vector \\(\\bm{q}\\). In this topology, the desired motion in the task space is mapped into the joint space using inverse kinematic solution, and both the position and force feedback controllers are designed in the joint space. Thus, independent controllers for each joint may be suitable for this topology.\n\n Figure 33: Cascade topology of force feedback control: force in inner loop and position in outer loop. Actuator forces \\(\\bm{\\tau}\\) and joint motion variable \\(\\bm{q}\\) are measured in the joint space\n Stiffness Control Single-Degree-of-Freedom Stiffness Control General Stiffness Control Stiffness Contorl of the Stewart-Gough Platform Direct Force Control \n Figure 34: Direct force control scheme, force feedback in the outer loop and motion feedback in the inner loop\n Impedance Control For the stiffness control and direct force control schemes, it is observed that when the manipulator-moving platform is in contact with a stiff environment, the motion variable \\(\\bm{\\mathcal{X}}\\) and the interacting force variable \\(\\bm{\\mathcal{F}}\\) are two dynamically dependent quantities.\nIn stiffness control, it is aimed to adjust the static relation between these two quantities. In this scheme, no force measurement is required, however, careful design on the desired motion trajectory and PD controller gains is needed to tune the stiffness property of the interaction at steady stage.\nIn force control schemes, on the other hand, the force tracking is the prime objective, and force measurement is a stringent requirement to implement such schemes.\nThe main reason that the motion and force variables are not being gable to be controlled independently is that for an n-degrees-of-freedom manipulator, only n-independent control inputs are available, and therefore, only n-independent variables can be controlled, while the force and motion quantities count to \\(2n\\) independent variables.\n The key idea behind impedance control schemes, is to tune the dynamic relation between the force and the motion variables, and not a hierarchy of tracking objectives in force and in position variables. In this scheme, contrary to stiffness control schemes, both force and position variables are measured and used in the control structure.\n The definition of mechanical impedance is given in an analogy of the well-known electrical impedance definition as the relationship between the effort and flow variables. Since this relation can be well determined in the frequency domain, the dynamical relation of force and motion variable may be represented by mechanical impedance. Impedance control schemes provide control topology to tune the mechanical impedance of a system to a desired value. By this means, the force and the motion variables are not controlled independently, or in a hierarchy, but their dynamic relation represented by mechanical impedance is suitably controlled.\nImpedance Impedance was first defined in electrical networks as the measure of the opposition that an electrical circuit presents to the passage of a current when a voltage is applied. To generalize the impedance definition to other disciplines, voltage is generalized to the effort and current is generalized to the flow.\nImpedance is a complex function defined as the ratio of the Laplace transform of the effort to the Laplace transform of the flow.\nImpedance is usually denoted by \\(\\bm{Z}(s)\\) and it may be represented by writing its magnitude and phase in the form of \\(\\abs{\\bm{Z}(s)}\\) and \\(\\angle{\\bm{Z}(s)}\\). The magnitude of the complex impedance \\(\\abs{\\bm{Z}}\\) is the ratio of the effort amplitude to that of the flow, while the phase \\(\\angle{\\bm{Z}}\\) is the phase shift by which the flow is ahead of the effort.\n Mechanical Impedance is defined as the ratio of the Laplace transform of the mechanical effort to the Laplace transform of the mechanical flow:\n\\begin{equation} \\bm{Z}(s) = \\frac{\\bm{F}(s)}{\\bm{v}(s)} \\end{equation}\nin which effort in mechanical systems is represented by force \\(\\bm{F}\\) and flow is represented by velocity \\(\\bm{v}\\).\n Note that this definition is given for a single-degree-of-freedom motion system. The motion can be generalized to angular motion, in which the effort is represented by torque, while the flow is represented by angular velocity. Furthermore, the impedance may be generalized to multiple-degrees-of-freedom system, in which for a general spatial motion effort is represented by a wrench \\(\\bm{\\mathcal{F}}\\), while flow is represented by motion twist \\(\\dot{\\bm{\\mathcal{X}}}\\).\nNevertheless, note that Laplace transform is only applicable for linear time invariant systems, and for a parallel manipulator the dynamic formulation of which is nonlinear, the concept of mechanical impedance may be extended to the differential equation relating the mechanical wrench \\(\\bm{\\mathcal{F}}\\) to motion twist \\(\\dot{\\bm{\\mathcal{X}}}\\).\n Consider an RLC circuit depicted in Figure fig:taghirad13_impedance_control_rlc. The differential equation relating voltage \\(v\\) to the current \\(i\\) is given by \\[ v = L\\frac{di}{dt} + Ri + \\int_0^t \\frac{1}{C} i(\\tau)d\\tau \\] in which \\(L\\) denote the inductance, \\(R\\) the resistance and \\(C\\) the capacitance.\nThe impedance of the system may be found from the Laplace transform of the above equation:\n\\begin{equation} Z(s) = \\frac{v(s)}{i(s)} = Ls + R + \\frac{1}{Cs} \\label{eq:rlc_impedance} \\end{equation}\n Consider the mass-spring-damper system depicted in Figure fig:taghirad13_impedance_control_rlc. The governing dynamic formulation for this system is given by \\[ m \\ddot{x} + c \\dot{x} + k x = f \\] in which \\(m\\) denote the body mass, \\(c\\) the damper viscous coefficient and \\(k\\) the spring stiffness.\nThe impedance of the system may be found from the Laplace transform of the above equation:\n\\begin{equation} Z(s) = \\frac{f(s)}{v(s)} = ms + c + \\frac{k}{s} \\label{eq:mass_spring_damper_impedance} \\end{equation}\n \n Figure 35: Analogy of electrical impedance in (a) an electrical RLC circuit to (b) a mechanical mass-spring-damper system\n As inferred from the above two examples, although the physical nature of the system may differ from each other, they may be represented by similar impedances. From this analogy, a terminology for impedance is introduced.\n An impedance \\(\\bm{Z}(s)\\) is called\n Inductive if \\(\\abs{\\bm{Z}(0)} = 0\\) Resistive if \\(\\abs{\\bm{Z}(0)} = R\\) Capacitive if \\(\\lim_{s\\to 0} \\abs{\\bm{K}(s)} = \\infty\\) Hence, for the mechanical system represented in Figure fig:taghirad13_impedance_control_rlc:\n mass represents inductive impedance viscous friction represents resistive impedance spring stiffness represents capacitive impedance The environments that a robot interacts with may be represented by these classified impedance components. A very stiff environment may be represented by high-capacitive impedance models, whereas an environment with high structural damping may be represented by high-resitive impedance.\nImpedance Control Concept The key idea behind impedance control schemes is to tune the dynamic relation between force and motion variables. Impedance control schemes provide control topology to tune the mechanical impedance of a system toward a desired impedance.\nA desired impedance could be adjusted by desired inductive, resistive and capacitive impedances, which forms a desired linear impedance for the closed-loop system as follows: \\[ \\bm{Z}_d(s) = \\bm{M}_d s + \\bm{C}_d + \\frac{1}{s} \\bm{K}_d \\] where \\(\\bm{Z}_d\\) denotes the desired impedance of the closed-loop system, which is composed of the desired inductive impedance \\(\\bm{M}_d\\), desired resistive impedance \\(\\bm{C}_d\\) and desired capacitive impedance \\(\\bm{K}_d\\). Impedance control structures may be used to tune the closed-loop impedance of the system suitably to follow such a desired impedance.\nImpedance Control Structure Consider a parallel robot with multiple-degrees-of-freedom interacting with a stiff environment. In such a case, the motion of the robot end effector is represented by the motion vector \\(\\bm{\\mathcal{X}}\\), and the interacting wrench applied to the robot end effector is denoted by \\(\\bm{\\mathcal{F}}_e\\). It is considered that the interacting wrench is measured in the task space and is used in the inner force feedback loop. Furthermore, it is considered that the motion variable \\(\\bm{\\mathcal{X}}\\) is measured and is used in the outer feedback loop.\nIn the impedance control scheme, regulation of the motion-force dynamic relation is the prime objective, and since force tracking is not the primary objective, it is advised to used a cascade control structure with motion control feedback in the outer loop and force feedback in the inner loop.\nTherefore, when the manipulator is not in contact with a stiff environment, position tracking is guaranteed by a primary controller. However, when there is an interacting wrench \\(\\bm{\\mathcal{F}}_e\\) applied to the moving platform, this structure may be designed to control the force-motion dynamic relation.\nAs a possible impedance control scheme, consider the closed-loop system depicted in Figure fig:taghira13_impedance_control, in which the position feedback is considered in the outer loop, while force feedback is used in the inner loop. This structure is advised when a desired impedance relation between the force and motion variables is required that consists of desired inductive, resistive, and capacitive impedances. As shown in Figure fig:taghira13_impedance_control, the motion-tracking error is directly determined from motion measurement by \\(\\bm{e}_x = \\bm{\\mathcal{X}}_d - \\bm{\\mathcal{X}}\\) in the outer loop and the motion controller is designed to satisfy the required impedance.\nMoreover, direct force-tracking objective is not assigned in this control scheme, and therefore the desired force trajectory \\(\\bm{\\mathcal{F}}_d\\) is absent in this scheme. However, an auxiliary force trajectory \\(\\bm{\\mathcal{F}}_a\\) is generated from the motion control law and is used as the reference for the force tracking. By this means, no prescribed force trajectory is tracked, while the motion control scheme would advise a force trajectory for the robot to ensure the desired impedance regulation.\n\n Figure 36: Impedance control scheme; motion feedback in the outer loop and force feedback in the inner loop\n The required wrench \\(\\bm{\\mathcal{F}}\\) in the impedance control scheme, is based on inverse dynamics control and consists of three main parts. In the inner loop, the force control scheme is based on a feedback linearization part in addition to a mass matrix adjustment, while in the outer loop usually a linear motion controller is considered based on the desired impedance requirements.\nAlthough many different impedance structures may be considered as the basis of the control law, in Figure fig:taghira13_impedance_control, a linear impedance relation between the force and motion variables is generated that consists of desired inductive \\(\\bm{M}_d\\), resistive \\(\\bm{C}_d\\) and capacitive impedances \\(\\bm{K}_d\\).\nAccording to Figure fig:taghira13_impedance_control, the controller output wrench \\(\\bm{\\mathcal{F}}\\), applied to the manipulator may be formulated as \\[ \\bm{\\mathcal{F}} = \\hat{\\bm{M}} \\bm{M}_d^{-1} \\bm{e}_F + \\bm{\\mathcal{F}}_{fl} \\] with:\n\\begin{align*} \\bm{e}_F \u0026amp;= \\bm{\\mathcal{F}}_a - \\bm{\\mathcal{F}}_m \\\\\\\n\\bm{\\mathcal{F}}_a \u0026amp;= \\bm{M}_d \\ddot{\\bm{\\mathcal{X}}}_{d} + \\bm{C}_{d} \\dot{\\bm{e}}_{x} + \\bm{K}_{d} \\bm{e}_{x} \\end{align*}\n\\(\\bm{M}_d\\) denotes the desired inductive impedance, \\(\\bm{C}_d\\) the desired resistive impedance and \\(\\bm{K}_d\\) is desired capacitive impedance matrices.\nThe feedback linearizing term is given by: \\[ \\bm{\\mathcal{F}}_{fl} = \\hat{\\bm{C}}(\\bm{\\mathcal{X}}, \\dot{\\bm{\\mathcal{X}}}) \\dot{\\bm{\\mathcal{X}}} + \\hat{\\bm{G}}(\\bm{\\mathcal{X}}) + \\bm{\\mathcal{F}}_m \\]\nIf the information on the dynamic matrices is complete, and if the force measurements are noise free (\\(\\bm{\\mathcal{F}}_m = \\bm{\\mathcal{F}}_e\\)), the closed-loop dynamic formulation simplifies to: \\[ \\bm{M}_d \\ddot{\\bm{e}}_x + \\bm{C}_d \\dot{\\bm{e}}_x + \\bm{K}_d \\bm{e}_x = \\bm{\\mathcal{F}}_e \\]\nAnd thus the closed-loop error dynamic equation satisfies a set of second-order systems with the desired impedance coefficients in relation to the interacting force. In other words, the control structure guarantees that the force and motion relation follows a desired impedance. Therefore, by choosing appropriate impedance matrices, the transient performance of the force-motion relation can be shaped so as to have a fast but stable interaction. By this means, what is controlled is the dynamic relation between the force and motion variables, and not directly the position. However, if the robot is moving freely in space and has no interaction with the environment, \\(\\bm{\\mathcal{F}}_e = 0\\), the closed-loop system will provide a suitable motion tracking thanks to the motion controller in the outer loop.\nThe impedance control scheme is very popular in practice, wherein tuning the force and motion relation in a robot manipulator interacting with a stiff environment is the prime objective. However, note that for a good performance, an accurate model of the system is required, and the obtained force and motion dynamics are not robust to modeling uncertainty.\nBibliography Taghirad, H., Parallel robots : mechanics and control (2013), Boca Raton, FL: CRC Press. ↩\n","permalink":"/book/taghirad13_paral/","tags":null,"title":"Parallel robots : mechanics and control"},{"categories":null,"contents":" Tags Multivariable Control, Positioning Stations Reference (Hans Butler, 2011) Author(s) Butler, H. Year 2011 Bibliography Butler, H., Position control in lithographic equipment, IEEE Control Systems, 31(5), 28–47 (2011). http://dx.doi.org/10.1109/mcs.2011.941882 ↩\n","permalink":"/paper/butler11_posit_contr_lithog_equip/","tags":null,"title":"Position control in lithographic equipment"},{"categories":null,"contents":" Tags Inertial Sensors Reviews of position sensors (Collette {\\it et al.}, 2012) Fleming, A. J., A review of nanometer resolution position sensors: operation and performance (Andrew Fleming, 2013) (Notes) Relative Position Sensors \nTable 1: Characteristics of relative measurement sensors collette11_review Technology Frequency Resolution Range T Range LVDT DC-200 Hz 10 nm rms 1-10 mm -50,100 °C Eddy current 5 kHz 0.1-100 nm rms 0.5-55 mm -50,100 °C Capacitive DC-100 kHz 0.05-50 nm rms 50 nm - 1 cm -40,100 °C Interferometer 300 kHz 0.1 nm rms 10 cm -250,100 °C Encoder DC-1 MHz 1 nm rms 7-27 mm 0,40 °C Bragg Fibers DC-150 Hz 0.3 nm rms 3.5 cm -30,80 °C \nTable 2: Summary of position sensor characteristics. The dynamic range (DNR) and resolution are approximations based on a full-scale range of \\(100 \\mu m\\) and a first order bandwidth of \\(1 kHz\\) fleming13_review_nanom_resol_posit_sensor Sensor Type Range DNR Resolution Max. BW Accuracy Metal foil \\(10-500 \\mu m\\) 230 ppm 23 nm 1-10 kHz 1% FSR Piezoresistive \\(1-500 \\mu m\\) 5 ppm 0.5 nm \u0026gt;100 kHz 1% FSR Capacitive \\(10 \\mu m\\) to \\(10 mm\\) 24 ppm 2.4 nm 100 kHz 0.1% FSR Electrothermal \\(10 \\mu m\\) to \\(1 mm\\) 100 ppm 10 nm 10 kHz 1% FSR Eddy current \\(100 \\mu m\\) to \\(80 mm\\) 10 ppm 1 nm 40 kHz 0.1% FSR LVDT \\(0.5-500 mm\\) 10 ppm 5 nm 1 kHz 0.25% FSR Interferometer Meters 0.5 nm \u0026gt;100kHz 1 ppm FSR Encoder Meters 6 nm \u0026gt;100kHz 5 ppm FSR Strain Gauge Capacitive Sensor Description:\n http://www.lionprecision.com/tech-library/technotes/cap-0020-sensor-theory.html https://www.lionprecision.com/comparing-capacitive-and-eddy-current-sensors Micro Sense link Micro-Epsilon link PI link Unipulse link Lion-Precision link Inductive Sensor (Eddy Current) Micro-Epsilon link Lion Precision link Inductive Sensor (LVDT) Micro-Epsilon link Keyence link Interferometers Attocube link Zygo link Smaract link Qutools link Renishaw link Sios link Keysight link Table 3: Characteristics of Environmental Units Temperature (\\(\\pm\\ ^oC\\)) Pressure (\\(\\pm\\ hPa\\)) Humidity \\(\\pm\\% RH\\) Wavelength Accuracy (\\(\\pm\\ \\text{ppm}\\)) Attocube 0.1 1 2 0.5 Renishaw 0.2 1 6 1 Picoscale 0.2 2 2 1 (Yoon-Soo Jang \u0026amp; Seung-Woo Kim, 2017)\n\n Figure 1: Expected precision of interferometer as a function of measured distance\n Fiber Optic Displacement Sensor Unipulse link Bibliography Collette, C., Janssens, S., Mokrani, B., Fueyo-Roza, L., Artoos, K., Esposito, M., Fernandez-Carmona, P., …, Comparison of new absolute displacement sensors, In , International Conference on Noise and Vibration Engineering (ISMA) (pp. ) (2012). : . ↩\nFleming, A. J., A review of nanometer resolution position sensors: operation and performance, Sensors and Actuators A: Physical, 190(nil), 106–126 (2013). http://dx.doi.org/10.1016/j.sna.2012.10.016 ↩\nCollette, C., Artoos, K., Guinchard, M., Janssens, S., Carmona Fernandez, P., \u0026amp; Hauviller, C., Review of sensors for low frequency seismic vibration measurement (2011). ↩\nJang, Y., \u0026amp; Kim, S., Compensation of the refractive index of air in laser interferometer for distance measurement: a review, International Journal of Precision Engineering and Manufacturing, 18(12), 1881–1890 (2017). http://dx.doi.org/10.1007/s12541-017-0217-y ↩\nBacklinks Measurement technologies for precision positioning A review of nanometer resolution position sensors: operation and performance ","permalink":"/zettels/position_sensors/","tags":null,"title":"Position Sensors"},{"categories":null,"contents":"Tags :\n\u0026lt;./biblio/references.bib\u0026gt;\nBacklinks Interferometric characterization of rotation stages for x-ray nanotomography Position control in lithographic equipment An instrument for 3d x-ray nano-imaging ","permalink":"/zettels/positioning_stations/","tags":null,"title":"Positioning Stations"},{"categories":null,"contents":"Tags :\n\u0026lt;./biblio/references.bib\u0026gt;\nBacklinks Design for precision: current status and trends Basics of precision engineering - 1st edition ","permalink":"/zettels/precision_engineering/","tags":null,"title":"Precision Engineering"},{"categories":null,"contents":"Tags :\n\u0026lt;./biblio/references.bib\u0026gt;\nBacklinks Modal testing: theory, practice and application The art of electronics - third edition Vibration Control of Active Structures - Fourth Edition Parallel robots : mechanics and control The design of high performance mechatronics - 2nd revised edition Multivariable feedback control: analysis and design ","permalink":"/zettels/reference_books/","tags":null,"title":"Reference Books"},{"categories":null,"contents":" Tags Vibration Isolation Reference (Christophe Collette {\\it et al.}, 2011) Author(s) Collette, C., Janssens, S., \u0026amp; Artoos, K. Year 2011 Background and Motivations Passive Isolation Tradeoffs \\[ X(s) = \\underbrace{\\frac{cs + k}{ms^2 + cs + k}}_{T_{wx}(s)} W(s) + \\underbrace{\\frac{1}{ms^2 + cs + k}}_{T_{Fx}(s)} F(s) \\]\n \\(T_{wx}(s)\\) is called the transmissibility of the isolator. It characterize the way seismic vibrations \\(w\\) are transmitted to the equipment. \\(T_{Fx}(s)\\) is called the compliance. It characterize the capacity of disturbing forces \\(F\\) to create motion \\(x\\) of the equipment. In order to minimize the vibrations of a sensitive equipment, a general objective to design a good isolator is to minimize both \\(\\abs{T_{wx}}\\) and \\(\\abs{T_{Fx}}\\) in the frequency range of interest.\nTo decrease the amplitude of the overshoot at the resonance frequency, damping can be increased. The price to pay is degradation of the isolation at high frequency (the roll off becomes \\(-1\\) instead of \\(-2\\)).\nFirst Trade-off: Trade-off between damping and isolation.\nTo improve the transmissibility, the resonance frequency can be decreased. However, the systems becomes more sensitive to external force \\(F\\) applied on the equipment.\nSecond trade-off: Trade-off between isolation and robustness to external force\nActive Isolation We apply a feedback control. The general expression of the force delivered by the actuator is \\(f = g_a \\ddot{x} + g_v \\dot{x} + g_p x\\). \\(g_a\\), \\(g_v\\) and \\(g_p\\) are constant gains.\n\nTable 1: Active isolation techniques Feedback Signal Effect Applications Acceleration Add virtual mass Few Velocity Add virtual dashpot connected to the sky Sky-Hook Damping Position Add virtual spring connected to the sky Sky-Hook Spring Practical Realizations Sensor Limitations Conclusions \n Figure 1: Comparison of Active Vibration Isolation Strategies\n Bibliography Collette, C., Janssens, S., \u0026amp; Artoos, K., Review of active vibration isolation strategies, Recent Patents on Mechanical Engineeringe, 4(3), 212–219 (2011). http://dx.doi.org/10.2174/2212797611104030212 ↩\n","permalink":"/paper/collette11_review_activ_vibrat_isolat_strat/","tags":null,"title":"Review of active vibration isolation strategies"},{"categories":null,"contents":"This file exists solely to respond to /search URL with the related search layout template.\nNo content shown here is rendered, all content is based in the template layouts/page/search.html\nSetting a very low sitemap priority will tell search engines this is not important content.\nThis implementation uses Fusejs, jquery and mark.js\nInitial setup Search depends on additional output content type of JSON in config.toml ``` [outputs] home = [\u0026ldquo;HTML\u0026rdquo;, \u0026ldquo;JSON\u0026rdquo;] ```\nSearching additional fileds To search additional fields defined in front matter, you must add it in 2 places.\nEdit layouts/_default/index.JSON This exposes the values in /index.json i.e. add category ``` \u0026hellip; \u0026ldquo;contents\u0026rdquo;:{{ .Content | plainify | jsonify }} {{ if .Params.tags }}, \u0026ldquo;tags\u0026rdquo;:{{ .Params.tags | jsonify }}{{end}}, \u0026ldquo;categories\u0026rdquo; : {{ .Params.categories | jsonify }}, \u0026hellip; ```\nEdit fuse.js options to Search static/js/search.js ``` keys: [ \u0026ldquo;title\u0026rdquo;, \u0026ldquo;contents\u0026rdquo;, \u0026ldquo;tags\u0026rdquo;, \u0026ldquo;categories\u0026rdquo; ] ```\n","permalink":"/search/","tags":null,"title":"Search Results"},{"categories":null,"contents":"Tags :\n\u0026lt;./biblio/references.bib\u0026gt;\nBacklinks Sensor fusion for active vibration isolation in precision equipment Vibration control of flexible structures using fusion of inertial sensors and hyper-stable actuator-sensor pairs Sensor fusion methods for high performance active vibration isolation systems Nanopositioning system with force feedback for high-performance tracking and vibration control Nanopositioning with multiple sensors: a case study in data storage ","permalink":"/zettels/sensor_fusion/","tags":null,"title":"Sensor Fusion"},{"categories":null,"contents":" Tags Sensor Fusion, Vibration Isolation Reference (Tjepkema {\\it et al.}, 2012) Author(s) Tjepkema, D., Dijk, J. v., \u0026amp; Soemers, H. Year 2012 Relative motion Control Control law: \\(f = -G(x-w)\\)\n\\[ \\frac{x}{w} = \\frac{k+G}{ms^2 + k+G} \\] \\[ \\frac{x}{F} = \\frac{1}{ms^2 + k+G} \\]\nForce Control Control law: \\(f = -G F_a = -G \\left(f-k(x-w)\\right)\\)\n\\[ \\frac{x}{w} = \\frac{k}{(1+G)ms^2 + k} \\] \\[ \\frac{x}{F} = \\frac{1+G}{(1+G)ms^2 + k} \\]\nInertial Control Control law: \\(f = -Gx\\)\n\\[ \\frac{x}{w} = \\frac{k}{ms^2 + k+G} \\] \\[ \\frac{x}{F} = \\frac{1}{ms^2 + k+G} \\]\nDesign constraints and control bandwidth Heavier sensor =\u0026gt; lower noise but it is harder to maintain collocation with the actuator =\u0026gt; that limits the bandwidth. There is a compromise between sensor noise and the influence of the sensor size on the system\u0026rsquo;s design and on the control bandwidth.\nBibliography Tjepkema, D., Dijk, J. v., \u0026amp; Soemers, H., Sensor fusion for active vibration isolation in precision equipment, Journal of Sound and Vibration, 331(4), 735–749 (2012). http://dx.doi.org/10.1016/j.jsv.2011.09.022 ↩\n","permalink":"/paper/tjepkema12_sensor_fusion_activ_vibrat_isolat_precis_equip/","tags":null,"title":"Sensor fusion for active vibration isolation in precision equipment"},{"categories":null,"contents":" Tags Sensor Fusion, Vibration Isolation Reference (Collette \u0026amp; Matichard, 2015) Author(s) Collette, C., \u0026amp; Matichard, F. Year 2015 In order to have good stability margins, it is common practice to collocate sensors and actuators. This ensures alternating poles and zeros along the imaginary axis. Then, each phase lag introduced by the poles is compensed by phase leag introduced by the zeroes. This guarantees stability and such system is referred to as hyperstable.\nIn this paper, we study and compare different sensor fusion methods combining inertial sensors at low frequency with sensors adding stability at high frequency. The stability margins of the controller can be significantly increased with no or little effect on the low-frequency active isolation, provided that the two following conditions are fulfilled:\n the high frequency sensor and the actuator are dual there exists a bandwidth where we can superimpose the open loop transfer functions obtained with the two sensors. Bibliography Collette, C., \u0026amp; Matichard, F., Sensor fusion methods for high performance active vibration isolation systems, Journal of Sound and Vibration, 342(nil), 1–21 (2015). http://dx.doi.org/10.1016/j.jsv.2015.01.006 ↩\n","permalink":"/paper/collette15_sensor_fusion_method_high_perfor/","tags":null,"title":"Sensor fusion methods for high performance active vibration isolation systems"},{"categories":null,"contents":" Tags Stewart Platforms, Vibration Isolation, Cubic Architecture Reference (Hauge \u0026amp; Campbell, 2004) Author(s) Hauge, G., \u0026amp; Campbell, M. Year 2004 Discusses:\n Choice of sensors and control architecture Predictability and limitations of the system dynamics Two-Sensor control architecture Vibration isolation using a Stewart platform Experimental comparison of Force sensor and Inertial Sensor and associated control architecture for vibration isolation \n Figure 1: Hexapod for active vibration isolation\n Stewart platform (Figure 1):\n Low corner frequency Large actuator stroke (\\(\\pm5mm\\)) Sensors in each strut (Figure 2): three-axis load cell base and payload geophone in parallel with the struts LVDT \n Figure 2: Strut\n Force sensors typically work well because they are not as sensitive to payload and base dynamics, but are limited in performance by a low-frequency zero pair resulting from the cross-axial stiffness.\n Performance Objective (frequency domain metric):\n The transmissibility should be close to 1 between 0-1.5Hz \\(-3dB \u0026lt; |T(\\omega)| \u0026lt; 3db\\) The transmissibility should be below -20dB in the 5-20Hz range \\(|T(\\omega)| \u0026lt; -20db\\) With \\(|T(\\omega)|\\) is the Frobenius norm of the transmissibility matrix and is used to obtain a scalar performance metric.\nChallenge:\n small frequency separation between the two requirements Robustness:\n minimization of the transmissibility amplification (Bode\u0026rsquo;s \u0026ldquo;pop\u0026rdquo;) outside the performance region Model:\n single strut axis as the cubic Stewart platform can be decomposed into 6 single-axis systems \n Figure 3: Strut model\n Zero Pair when using a Force Sensor:\n The frequency of the zero pair corresponds to the resonance frequency of the payload mass and the \u0026ldquo;parasitic\u0026rdquo; stiffness (sum of the cross-axial, suspension, wiring stiffnesses) This zero pair is usually not predictable nor repeatable In this Stewart platform, this zero pair uncertainty is due to the internal wiring of the struts Control:\n Single-axis controllers =\u0026gt; combine them into a full six-axis controller =\u0026gt; evaluate the full controller in terms of stability and robustness Sensitivity weighted LQG controller (SWLQG) =\u0026gt; address robustness in flexible dynamic systems Three type of controller: Force feedback (cell-based) Inertial feedback (geophone-based) Combined force/velocity feedback (load cell/geophone based) The use of multivariable and robust control on the full 6x6 hexapod does not improve performance over single-axis designs.\n \nTable 1: Typical characteristics of sensors used for isolation in hexapod systems Load cell Geophone Type Relative Inertial Relationship with voice coil Collocated and Dual Non-Collocated and non-Dual Open loop transfer function (+) Alternating poles/zeros (-) Large phase drop Limitation from low-frequency zero pair (-) Yes (+) No Sensitive to payload/base dynamics (+) No (-) Yes Best frequency range High (low-freq zero limitation) Low (high-freq toll-off limitation) Ability of a sensor-actuator pair to improve performance: General system with input \\(u\\), performance \\(z\\), output \\(y\\) disturbance \\(u\\).\nGiven a sensor \\(u\\) and actuator \\(y\\) and a controller \\(u = -K(s) y\\), the closed loop disturbance to performance transfer function can be written as:\n\\[ \\left[ \\frac{z}{w} \\right]_\\text{CL} = \\frac{G(s)_{zw} + K(G(s)_{zw} G(s)_{yu} - G(s)_{zu} G(s)_{yw})}{1 + K G(s)_{yu}} \\]\nIn order to obtain a significant performance improvement is to use a high gain controller, provided the term \\(G(s)_{zw} + K(G(s)_{zw} G(s)_{yu} - G(s)_{zu} G(s)_{yw})\\) is small.\nWe can compare the transfer function from \\(w\\) to \\(z\\) with and without a high gain controller. And we find that for \\(u\\) and \\(y\\) to be an acceptable pair for high gain control: \\[ \\left| \\frac{G(j\\omega)_{zw} G(j\\omega)_{yu} - G(j\\omega)_{zu} G(j\\omega)_{yw}}{K G(j\\omega)_{yu}} \\right| \\ll |G_{zw}(j\\omega)| \\]\nControllers:\nForce feedback:\n Performance limited by the low frequency zero-pair It is desirable to separate the zero-pair and first most are separated by at least a decade in frequency This can be achieve by reducing the cross-axis stiffness If the low frequency zero pair is inverted, robustness is lost Thus, the force feedback controller should be designed to have combined performance and robustness at frequencies at least a decade above the zero pair The presented controller as a high pass filter at to reduce the gain below the zero-pair, a lag at low frequency to improve phase margin, and a low pass filter for roll off Inertial feedback:\n Non-Collocated =\u0026gt; multiple phase drops that limit the bandwidth of the controller Good performance, but the transmissibility \u0026ldquo;pops\u0026rdquo; due to low phase margin and thus this indicates robustness problems Combined force/velocity feedback:\n Use the low frequency performance advantages of geophone sensor with the high robustness advantages of the load cell sensor A Single-Input-Multiple-Outputs (SIMO) controller is found using LQG The performance requirements are met Good robustness \n Figure 4: Experimental open loop (solid) and closed loop six-axis transmissibility using the geophone only controller (dotted), and combined geophone/load cell controller (dashed)\n Bibliography Hauge, G., \u0026amp; Campbell, M., Sensors and control of a space-based six-axis vibration isolation system, Journal of Sound and Vibration, 269(3-5), 913–931 (2004). http://dx.doi.org/10.1016/s0022-460x(03)00206-2 ↩\n","permalink":"/paper/hauge04_sensor_contr_space_based_six/","tags":null,"title":"Sensors and control of a space-based six-axis vibration isolation system"},{"categories":null,"contents":" Tags Stewart Platforms, Vibration Isolation Reference (Xiaochun Li {\\it et al.}, 2001) Author(s) Li, X., Hamann, J. C., \u0026amp; McInroy, J. E. Year 2001 if the hexapod is designed such that the payload mass/inertia matrix (\\(M_x\\)) and \\(J^T J\\) are diagonal, the dynamics from \\(u\\) to \\(y\\) are decoupled. Bibliography Li, X., Hamann, J. C., \u0026amp; McInroy, J. E., Simultaneous vibration isolation and pointing control of flexure jointed hexapods, In , Smart Structures and Materials 2001: Smart Structures and Integrated Systems (pp. ) (2001). : . ↩\n","permalink":"/paper/li01_simul_vibrat_isolat_point_contr/","tags":null,"title":"Simultaneous vibration isolation and pointing control of flexure jointed hexapods"},{"categories":null,"contents":" Tags Stewart Platforms, Vibration Isolation, Cubic Architecture, Flexible Joints, Multivariable Control Reference @phdthesis{li01_simul_fault_vibrat_isolat_point, author = {Li, Xiaochun}, school = {University of Wyoming}, title = {Simultaneous, Fault-tolerant Vibration Isolation and Pointing Control of Flexure Jointed Hexapods}, year = 2001, tags = {parallel robot}, } Author(s) Li, X. Year 2001 Introduction Stewart Platform:\n Cubic (mutually orthogonal) Flexure Joints =\u0026gt; eliminate friction and backlash but add complexity to the dynamics \n Figure 1: Flexure jointed Stewart platform used for analysis and control\n Goal:\n Precise pointing in two axes (sub micro-radians) simultaneously, providing both passive and active vibration isolation in six axes Jacobian Analysis: \\[ \\delta \\mathcal{L} = J \\delta \\mathcal{X} \\] The origin of \\(\\{P\\}\\) is taken as the center of mass of the payload.\nDecoupling: If we refine the (force) inputs and (displacement) outputs as shown in Figure 2 or in Figure 3, we obtain a decoupled plant provided that:\n the payload mass/inertia matrix must be diagonal (the CoM is coincident with the origin of frame \\(\\{P\\}\\)) the geometry of the hexapod and the attachment of the payload to the hexapod must be carefully chosen For instance, if the hexapod has a mutually orthogonal geometry (cubic configuration), the payload\u0026rsquo;s center of mass must coincide with the center of the cube formed by the orthogonal struts.\n \n Figure 2: Decoupling the dynamics of the Stewart Platform using the Jacobians\n \n Figure 3: Decoupling the dynamics of the Stewart Platform using the Jacobians\n Simultaneous Vibration Isolation and Pointing Control Basic idea:\n acceleration feedback is used to provide high-frequency vibration isolation cartesian pointing feedback can be used to provide low-frequency pointing The compensation is divided in frequency because:\n pointing sensors often have low bandwidth acceleration sensors often have a poor low frequency response The control bandwidth is divided as follows:\n low-frequency disturbances as attenuated and tracking is accomplished by feedback from low bandwidth pointing sensors mid-frequency disturbances are attenuated by feedback from band-pass sensors like accelerometer or load cells high-frequency disturbances are attenuated by passive isolation techniques Vibration Isolation The system is decoupled into six independent SISO subsystems using the architecture shown in Figure 4.\n\n Figure 4: Figure caption\n One of the subsystem plant transfer function is shown in Figure 4\n\n Figure 5: Plant transfer function of one of the SISO subsystem for Vibration Control\n Each compensator is designed using simple loop-shaping techniques.\nThe unity control bandwidth of the isolation loop is designed to be from 5Hz to 50Hz.\n Despite a reasonably good match between the modeled and the measured transfer functions, the model based decoupling algorithm does not produce the expected decoupling. Only about 20 dB separation is achieve between the diagonal and off-diagonal responses.\n Pointing Control A block diagram of the pointing control system is shown in Figure 6.\n\n Figure 6: Figure caption\n The plant is decoupled into two independent SISO subsystems. The compensators are design with inverse-dynamics methods.\nThe unity control bandwidth of the pointing loop is designed to be from 0Hz to 20Hz.\nA feedforward control is added as shown in Figure 7.\n\n Figure 7: Feedforward control\n Simultaneous Control The simultaneous vibration isolation and pointing control is approached in two ways:\n design and implement the vibration isolation control first, identify the pointing plant when the isolation loops are closed, then implement the pointing compensators the reverse design order Figure 8 shows a parallel control structure where \\(G_1(s)\\) is the dynamics from input force to output strut length.\n\n Figure 8: A parallel scheme\n The transfer function matrix for the pointing loop after the vibration isolation is closed is still decoupled. The same happens when closing the pointing loop first and looking at the transfer function matrix of the vibration isolation.\nThe effect of the isolation loop on the pointing loop is large around the natural frequency of the plant as shown in Figure 9.\n\n Figure 9: \\(\\theta_x/\\theta_{x_d}\\) transfer function with the isolation loop closed (simulation)\n The effect of pointing control on the isolation plant has not much effect.\n The interaction between loops may affect the transfer functions of the first closed loop, and thus affect its relative stability.\n The dynamic interaction effect:\n only happens in the unity bandwidth of the loop transmission of the first closed loop. affect the closed loop transmission of the loop first closed (see Figures 10 and 11) As shown in Figure 10, the peak resonance of the pointing loop increase after the isolation loop is closed. The resonances happen at both crossovers of the isolation loop (15Hz and 50Hz) and they may show of loss of robustness.\n\n Figure 10: Closed-loop transfer functions \\(\\theta_y/\\theta_{y_d}\\) of the pointing loop before and after the vibration isolation loop is closed\n The same happens when first closing the vibration isolation loop and after the pointing loop (Figure 11). The first peak resonance of the vibration isolation loop at 15Hz is increased when closing the pointing loop.\n\n Figure 11: Closed-loop transfer functions of the vibration isolation loop before and after the pointing control loop is closed\n The isolation loop adds a second resonance peak at its high-frequency crossover in the pointing closed-loop transfer function, which may cause instability. Thus, it is recommended to design and implement the isolation control system first, and then identify the pointing plant with the isolation loop closed.\n Experimental results Two hexapods are stacked (Figure 12):\n the bottom hexapod is used to generate disturbances matching candidate applications the top hexapod provide simultaneous vibration isolation and pointing control \n Figure 12: Stacked Hexapods\n Using the vibration isolation control alone, no attenuation is achieved below 1Hz as shown in figure 13.\n\n Figure 13: Vibration isolation control: open-loop (solid) vs. closed-loop (dashed)\n The simultaneous control is of dual use:\n it provide simultaneous pointing and isolation control it can also be used to expand the bandwidth of the isolation control to low frequencies because the pointing loops suppress pointing errors due to both base vibrations and tracking The results of simultaneous control is shown in Figure 14 where the bandwidth of the isolation control is expanded to very low frequency.\n\n Figure 14: Simultaneous control: open-loop (solid) vs. closed-loop (dashed)\n Future research areas Proposed future research areas include:\n Include base dynamics in the control: The base dynamics is here neglected since the movements of the base are very small. The base dynamics could be measured by mounting accelerometers at the bottom of each strut or by using force sensors. It then could be included in the feedforward path. Robust control and MIMO design New decoupling method: The proposed decoupling algorithm do not produce the expected decoupling, despite a reasonably good match between the modeled and the measured transfer functions. Incomplete decoupling increases the difficulty in designing the controller. New decoupling methods are needed. These methods must be static in order to be implemented practically on precision hexapods Identification: Many advanced control methods require a more accurate model or identified plant. A closed-loop identification method is propose to solve some problems with the current identification methods used. Other possible sensors: Many sensors can be used to expand the utility of the Stewart platform: 3-axis load cells to investigate the Coriolis and centripetal terms and new decoupling methods LVDT to provide differential position of the hexapod payload with respect to the base Geophones to provide payload and base velocity information Bibliography Li, X., Simultaneous, fault-tolerant vibration isolation and pointing control of flexure jointed hexapods (Doctoral dissertation) (2001). University of Wyoming, . ↩\n","permalink":"/paper/li01_simul_fault_vibrat_isolat_point/","tags":null,"title":"Simultaneous, fault-tolerant vibration isolation and pointing control of flexure jointed hexapods"},{"categories":null,"contents":" Tags Stewart Platforms, Vibration Isolation Reference (Zhen Zhang {\\it et al.}, 2011) Author(s) Zhang, Z., Liu, J., Mao, J., Guo, Y., \u0026amp; Ma, Y. Year 2011 Non-cubic stewart platform Flexible joints Magnetostrictive actuators Strong coupled motions along different axes Non-cubic architecture =\u0026gt; permits to have larger workspace which was required Structure parameters (radius of plates, length of struts) are determined by optimization of the condition number of the Jacobian matrix Accelerometers for active isolation Adaptive FIR filters for active isolation control \n Figure 1: Prototype of the non-cubic stewart platform\n Bibliography Zhang, Z., Liu, J., Mao, J., Guo, Y., \u0026amp; Ma, Y., Six dof active vibration control using stewart platform with non-cubic configuration, In , 2011 6th IEEE Conference on Industrial Electronics and Applications (pp. ) (2011). : . ↩\n","permalink":"/paper/zhang11_six_dof/","tags":null,"title":"Six dof active vibration control using stewart platform with non-cubic configuration"},{"categories":null,"contents":"Tags :\n\u0026lt;./biblio/references.bib\u0026gt;\nBacklinks Six dof active vibration control using stewart platform with non-cubic configuration Decentralized vibration control of a voice coil motor-based stewart parallel mechanism: simulation and experiments Dynamic modeling and decoupled control of a flexible stewart platform for vibration isolation Parallel robots : mechanics and control Investigation on active vibration isolation of a stewart platform with piezoelectric actuators Identification and decoupling control of flexure jointed hexapods The stewart platform manipulator: a review Modeling and control of vibration in mechanical systems Studies on stewart platform manipulator: a review Nanometre-cutting machine using a stewart-platform parallel mechanism An intelligent control system for multiple degree-of-freedom vibration isolation Active isolation and damping of vibrations via stewart platform Sensors and control of a space-based six-axis vibration isolation system Dynamic modeling and experimental analyses of stewart platform with flexible hinges Simultaneous, fault-tolerant vibration isolation and pointing control of flexure jointed hexapods A new isotropic and decoupled 6-dof parallel manipulator Simultaneous vibration isolation and pointing control of flexure jointed hexapods A six-axis single-stage active vibration isolator based on stewart platform Vibration Control of Active Structures - Fourth Edition A soft 6-axis active vibration isolator ","permalink":"/zettels/stewart_platforms/","tags":null,"title":"Stewart Platforms"},{"categories":null,"contents":" Tags Stewart Platforms Reference (Mohd Furqan {\\it et al.}, 2017) Author(s) Furqan, M., Suhaib, M., \u0026amp; Ahmad, N. Year 2017 Lots of references.\nBibliography Furqan, M., Suhaib, M., \u0026amp; Ahmad, N., Studies on stewart platform manipulator: a review, Journal of Mechanical Science and Technology, 31(9), 4459–4470 (2017). http://dx.doi.org/10.1007/s12206-017-0846-1 ↩\n","permalink":"/paper/furqan17_studies_stewar_platf_manip/","tags":null,"title":"Studies on stewart platform manipulator: a review"},{"categories":null,"contents":"Tags :\n\u0026lt;./biblio/references.bib\u0026gt;\nBacklinks Modal testing: theory, practice and application ","permalink":"/zettels/system_identification/","tags":null,"title":"System Identification"},{"categories":null,"contents":" This is a quote!\n 1 2 a = 2; figure; This is an important part of the text.\n See Eq. eq:test1 and eq:test2.\n\\begin{equation} a = 1 \\end{equation}\n\\begin{equation} a = 2 \\label{eq:test2} \\end{equation}\nAlso look at 1 \\eqref{eq:test2}.\nSome text.\nSome text.\nSome text.\nSome text.\nSome text.\nSome text.\nSome text.\nSome text.\nSome text.\nSome text.\nSome text.\nSome text.\nSome text.\nSome text.\nSome text.\nSome text.\nSome text.\nSome text.\nSome text.\nSome text.\nSome text.\nSome text.\nSome text.\nSome text.\nSome text.\nSome text.\nSome text.\nSome text.\nSome text.\nSome text.\nSome text.\nSome text.\nSome text.\nSome text.\nSome text.\nSome text.\n","permalink":"/zettels/test/","tags":null,"title":"Test File"},{"categories":null,"contents":" Tags Reference Books, Electronics Reference (Horowitz, 2015) Author(s) Horowitz, P. Year 2015 Bibliography Horowitz, P., The art of electronics - third edition (2015), New York, NY, USA: Cambridge University Press. ↩\n","permalink":"/book/horowitz15_art_of_elect_third_edition/","tags":null,"title":"The art of electronics - third edition"},{"categories":null,"contents":" Tags Reference Books Reference (Schmidt {\\it et al.}, 2014) Author(s) Schmidt, R. M., Schitter, G., \u0026amp; Rankers, A. Year 2014 Section 2.2 Mechanics\n The core of a mechatronic system is its mechanical construction and in spite of many decade of excellent designs, optimizing the mechanical structure in strength, mass and endurance, the mechanical behavior will always remain the limiting factor of the performance of any mechatronic system.\n Section 2.2.2 Force and Motion\n Statics deals with the stress levels that are present in the mechanical system when (quasi-)static forces are exerted on it. It analyses the linear and non-linear strain effects that are caused by elastic and plastic deformation under these stress levels.\nDynamics deals with the behaviour of the mechanical system under changing forces, while often the effects are linearised and limited to strain levels well below any irreversible plastic deformation. One should however be aware that another non-destructive source of non-linearity is found in a tried important field of mechanics, called kinematics. The relation between angles and positions is often non-linear in such a mechanism, because of the changing angles, and controlling these often requires special precautions to overcome the inherent non-linearities by linearisation around actual position and adapting the optimal settings of the controller to each position.\n \n Figure 1: Stabiliby condition and robustness of a feedback controlled system. The desired shape of these curves guide the control design by optimising the lvels and sloppes of the amplitude Bode-plot at low and high frequencies for suppression of the disturbances and of the base Bode-plot in the cross-over frequency region. This is called loop shaping design\n Section 4.3.3\n On might say that a high value of the unity-gain crossover frequency and corresponding high-frequency bandwidth limit is rather an unwanted side-effect of the required high loop-gain at lower frequencies, than a target for the design of a control system as such.\n Section 9.3: Mass Dilemma\n A reduced mass requires improved system dynamics that enable a higher control bandwidth to compensate for the increase sensitivity for external vibrations.\n Bibliography Schmidt, R. M., Schitter, G., \u0026amp; Rankers, A., The design of high performance mechatronics - 2nd revised edition (2014), : Ios Press. ↩\n","permalink":"/book/schmidt14_desig_high_perfor_mechat_revis_edition/","tags":null,"title":"The design of high performance mechatronics - 2nd revised edition"},{"categories":null,"contents":" Tags Stewart Platforms Reference (Bhaskar Dasgupta \u0026amp; Mruthyunjaya, 2000) Author(s) Dasgupta, B., \u0026amp; Mruthyunjaya, T. Year 2000 \nTable 1: Parallel VS serial manipulators Advantages Disadvantages Serial Manoeuverability Poor precision Large workspace Bends under high load Vibrate at high speed Parallel High stiffness Small workspace Good dynamic performances Precise positioning The generalized Stewart platforms consists of two rigid bodies (referred to as the base and the platoform) connected through six extensible legs, each with sherical joints at both ends.\nBibliography Dasgupta, B., \u0026amp; Mruthyunjaya, T., The stewart platform manipulator: a review, Mechanism and Machine Theory, 35(1), 15–40 (2000). http://dx.doi.org/10.1016/s0094-114x(99)00006-3 ↩\n","permalink":"/paper/dasgupta00_stewar_platf_manip/","tags":null,"title":"The stewart platform manipulator: a review"},{"categories":null,"contents":" Tags Vibration Isolation, Reference Books, Stewart Platforms, HAC-HAC Reference (Andre Preumont, 2018) Author(s) Preumont, A. Year 2018 Introduction Active Versus Passive Active structure may be cheaper or lighter than passive structures of comparable performances; or they may offer performances that no passive structure could offer.\nActive is not always better, and a control systems cannot compensate for a bad design. Active solution should be considered only after all other passive means have been exhausted.\nFeedback control can compensate for external disturbances only in a limited frequency range (the bandwidth), the disturbances are actually amplified by the control system outside this frequency band.\nVibration Suppression Vibration reduction can be achieved in many different ways:\n stiffening: consists of shifting the resonance frequency of the structure beyond the frequency band of excitation damping: consists of reducing the resonance peaks by dissipating the vibration energy isolation: consists of preventing the propagation of disturbances to sensitive parts of the system The design of an active control system involves many issues such as how to configurate the sensors and actuators, how to secure stability and robustness. The power requirements will often determine the size of the actuators and the cost of the project.\nSmart Materials and Structures An active structure consists of a structure provided with a set of actuators and sensors coupled by a controller. If the bandwidth of the controller includes some vibration modes of the structure, its dynamic response must be considered.\nIf the set of actuators and sensors are located at discrete points of the structure, they can be treated separately. However, for smart structures, the actuators and sensors are often distributed and have a high degree of integration inside the structure, which makes a separate modelling impossible.\nSome smart materials are:\n Shape Memory Alloys (SMA): recoverable strain of \\(\\SI{5}{\\percent}\\) induced by temperature. They can be used at low frequency and for low precision applications Piezoelectric materials: recoverable strain of \\(\\SI{0.1}{\\percent}\\) under electric field. They can be used as actuators as well as sensors. Two main classes: ceramics and polymers. Piezopolymers are used mostly as sensors as they require high voltage. The best-known piezoceramic is the Lead-Zirconate-Titanate (PZT). Magnetostrictive materials: recoverable strain of \\(\\SI{0.15}{\\percent}\\) under magnetic field Magneto-Rheological fluids (MR): consists of viscous fluids containing micronsized particules of magnetic material. When the fluid is subjected to a magnetic field, the particules create colunmar structures requiring a minimum shear stress to initiate the flow. Control Strategies There are two radically different approached to disturbance rejection: feedback and feedforward.\nFeedback \n Figure 1: Principle of feedback control\n The principle of feedback is represented on figure fig:classical_feedback_small. The output \\(y\\) of the system is compared to the reference signal \\(r\\), and the error signal \\(\\epsilon = r-y\\) is passed into a compensator \\(K(s)\\) and applied to the system \\(G(s)\\), \\(d\\) is the disturbance. The design problem consists of finding the appropriate compensator \\(K(s)\\) such that the closed-loop system is stable and behaves in the appropriate manner.\nIn the control of lightly damped structures, feedback control is used for two distinct and complementary purposes: active damping and model-based feedback.\nActive Damping:\n The objective of active damping is to reduce the effect of resonant peaks on the response of the structure. From \\(\\frac{y}{d} = \\frac{1}{1 + GK}\\), this requires \\(GK \\gg 1\\) near the resonances It can be generally be achieved without a model of the structure, with guaranteed stability, provided that the actuator and sensor are collocated and have perfect dynamics. Model based feedback: The objective is to control a variable \\(y\\) to a desired value \\(r\\) in spite of the external disturbances \\(d\\).\n From \\(\\frac{y}{r} = \\frac{GK}{1 + GK}\\) we see that this requires large values of \\(GK\\) in the frequency range where \\(y\\approx r\\) (bandwidth) The bandwidth \\(\\omega_c\\) is limited by the accuracy of the model The disturbance rejection within the bandwidth of the control system is always compensated by an amplification of the disturbances outside the bandwidth When implemented digitally, the sampling frequency \\(\\omega_s\\) must always be two orders of magnitude larger than \\(\\omega_c\\) to preseve reasonably the behavior of the continuous system Feedforward \n Figure 2: Principle of feedforward control\n The method relies on the availability of a reference signal correlated to the primary disturbance. The idea is to produce a second disturbance such that is cancels the effect of the primary disturbance at the location of the sensor error. Its principle is explained in figure 2.\nThe filter coefficients are adapted in such a way that the error signal at one or several critical points is minimized.\nThere is no guarantee that the global response is reduced at other locations. This method is therefor considered as a local one. Because it is less sensitive to phase lag than feedback, it can be used at higher frequencies (\\(\\omega_c \\approx \\omega_s/10\\)).\nThe table 1 summarizes the main features of the two approaches.\n\nTable 1: Advantages and Disadvantages of some types of control Advantages Disadvantages Active Damping - Simple to implement - Effective only near resonance - Does not required accurate model - Guaranteed stability (collocated) Model Based - Global method - Requires accurate model - Attenuate all disturbance within bandwidth - Limited bandwidth - Spillover - Amplification of disturbances outside bandwidth Feedforward Adaptive filtering - No model is necessary - Error signal required - Robust to change in plant transfer function - Local method: may amplify vibration elsewhere - More effective for narrowband disturbance - Large amount of real-time computation The Various Steps of the Design \n Figure 3: The various steps of the design\n The various steps of the design of a controlled structure are shown in figure 3.\nThe starting point is:\n Mechanical system Performance objectives Specification of the disturbances Then the open loop performances can be evaluated:\n The need for active control can be assessed The needed bandwidth can be roughly specified The next step consist of selecting the proper type and location of sensors and actuators:\n The controllability and Observability are important concepts A model of the structure is developped:\n FEM or identification Model reduction to limit the DoF If the dynamics of the sensors and actuators may significantly affect the behavior of the system, they must be included in the model before the controller design.\nPlant Description, Error and Control Budget From the block diagram of the control system (figure fig:general_plant):\n\\begin{align*} y \u0026amp;= (I - G_{yu}H)^{-1} G_{yw} w\\\\\\\nz \u0026amp;= T_{zw} w = [G_{zw} + G_{zu}H(I - G_{yu}H)^{-1} G_{yw}] w \\end{align*}\n\n Figure 4: Block diagram of the control System\n The frequency content of the disturbance \\(w\\) is usually described by its power spectral density \\(\\Phi_w (\\omega)\\) which describes the frequency distribution of the meas-square value.\n \\[\\sigma_w = \\sqrt{\\int_0^\\infty \\Phi_w(\\omega) d\\omega}\\]\n Even more interesting for the design is the Cumulative Mean Square response defined by the integral of the PSD in the frequency range \\([\\omega, \\infty[\\).\n \\[\\sigma_z^2(\\omega) = \\int_\\omega^\\infty \\Phi_z(\\nu) d\\nu = \\int_\\omega^\\infty |T_{zw}|^2 \\Phi_w(\\nu) d\\nu \\]\n It is a monotonously decreasing function of frequency and describes the contribution of all frequencies above \\(\\omega\\) to the mean-square value of \\(z\\). \\(\\sigma_z(0)\\) is then the global RMS response.\nA typical plot of \\(\\sigma_z(\\omega)\\) is shown figure fig:cas_plot. It is useful to identify the critical modes in a design, at which the effort should be targeted.\nThe diagram can also be used to assess the control laws and compare different actuator and sensor configuration.\n\n Figure 5: Error budget distribution in OL and CL for increasing gains\n Pseudo-inverse Under-actuated System Consider the linear system of equation: \\[w = J v\\] With:\n \\(w\\) a vector with \\(m\\) components (measurements) \\(v\\) a vector with \\(n\\) components (inputs) We assume \\(m\u0026gt;n\\) (under-actuated) We seek the pseudo-inverse of \\(J\\) such that \\(v = J^+ w\\)\nThe columns of \\(J\\) are the influence function of the actuators. If the columns of \\(J\\) are independant, the Jacobian is full rang (\\(r=n\\)) and the Moore-Penrose pseudo inverse is: \\[J^+ = (J^T J)^{-1} J^T\\]\nOver-actuated System If there are more actuator than sensor (\\(m\u0026lt;n\\)), we obtain: \\[J^+ = J^T(J J^T)^{-1}\\]\nNote that the Singular Value Decomposition offers a practical way to compute the pseudo-inverse, both for \\(m\u0026gt;n\\) and \\(n\u0026gt;m\\).\nSingular Value Decomposition The Singular Value Decomposition (SVD) is a generalization of the eigenvalue decomposition of a rectangular matrix: \\[ J = U \\Sigma V^T = \\sum_{i=1}^r \\sigma_i u_i v_i^T \\] With:\n \\(U\\) and \\(V\\) orthogonal matrices. The columns \\(u_i\\) and \\(v_i\\) of \\(U\\) and \\(V\\) are the eigenvectors of the square matrices \\(JJ^T\\) and \\(J^TJ\\) respectively \\(\\Sigma\\) a rectangular diagonal matrix of dimension \\(m \\times n\\) containing the square root of the common non-zero eigenvalues of \\(JJ^T\\) and \\(J^TJ\\) \\(r\\) is the number of non-zero singular values of \\(J\\) The pseudo-inverse of \\(J\\) is: \\[ J^+ = V\\Sigma^+U^T = \\sum_{i=1}^r \\frac{1}{\\sigma_i} v_i u_i^T \\]\nThe conditioning of the Jacobian is measured by the condition number: \\[ c(J) = \\frac{\\sigma_{max}}{\\sigma_{min}} \\]\nWhen \\(c(J)\\) becomes large, the most straightforward way to handle the ill-conditioning is to truncate the smallest singular value out of the sum. This will have usually little impact of the fitting error while reducing considerably the actuator inputs \\(v\\).\nSome Concepts in Structural Dynamics Equation of Motion of a Discrete System The general form of the equation of motion governing the dynamic equilibrium between the external, elastic, inertia and damping forces acting on a discrete, flexible structure with a finite number \\(n\\) of degrees of freedom is\n \\begin{equation} M \\ddot{x} + C \\dot{x} + K x = f \\end{equation}\nWith:\n \\(x\\) is the vector of generalized displacements (translations and rotations) \\(f\\) is the vector of generalized forces (point forces and torques) \\(M\\), \\(C\\) and \\(K\\) are respectively the mass, damping and stiffness matrices; they are symmetric and semi-positive definite The damping matrix \\(C\\) represents the various dissipation mechanisms in the structure, which are usually poorly known. One of the popular hypotheses is the Rayleigh damping.\n \\begin{equation} C = \\alpha M + \\beta K \\end{equation}\n \\(\\alpha\\) and \\(\\beta\\) are selected to fit the structure under consideration.\nVibration Modes Consider the free response of an undamped system of order \\(n\\): \\[ M\\ddot{x} + K x = 0 \\]\nIf one tries a solution of the form \\(x = \\phi_i e^{j\\omega_i t}\\), \\(\\phi_i\\) and \\(\\omega_i\\) must statisfy the eigenvalue problem \\[ (K - \\omega_i^2 M)\\phi_i = 0 \\] with:\n \\(\\omega_i\\): the natural frequency \\(\\phi_i\\): the corresponding mode shape The number of mode shapes is equal to the number of degrees of freedom \\(n\\).\nThe mode shapes are orthogonal with respect to the stiffness and mass matrices:\n\\begin{align} \\phi_i^T M \\phi_j \u0026amp;= \\mu_i \\delta_{ij} \\\\\\\n\\phi_i^T K \\phi_j \u0026amp;= \\mu_i \\omega_i^2 \\delta_{ij} \\end{align}\nWith \\(\\mu_i\\) the modal mass (also called the generalized mass) of mode \\(i\\).\nModal Decomposition Structure Without Rigid Body Modes Let perform a change of variable from physical coordinates \\(x\\) to modal coordinates \\(z\\).\n \\begin{equation} x = \\Phi z \\end{equation}\nWith:\n \\(\\Phi = [\\phi_1, \\phi_2, \u0026hellip;, \\phi_n]\\) the matrix of the mode shapes \\(z\\) the vector of modal amplitudes The dynamic equation of the system becomes: \\[ M \\Phi \\ddot{z} + C \\Phi \\dot{z} + K \\Phi z = f \\]\nIf we left multiply the equation by \\(\\Phi^T\\) and we use the orthogonalily relationships: \\[ diag(\\mu_i) \\ddot{z} + \\Phi^T C \\Phi + diag(\\mu_i \\omega_i^2) z = \\Phi^T f \\]\nIf \\(\\Phi^T C \\Phi\\) is diagonal, the damping is said classical or normal. In this case: \\[ \\Phi^T C \\Phi = diag(2 \\xi_i \\mu_i \\omega_i) \\]\nOne can verify that the Rayleigh damping \\eqref{eq:rayleigh_damping} complies with this condition with modal damping ratios \\(\\xi_i = \\frac{1}{2} ( \\frac{\\alpha}{\\omega_i} + \\beta\\omega_i )\\).\nAnd we obtain decoupled modal equations \\eqref{eq:modal_eom}.\n \\begin{equation} \\ddot{z} + 2 \\xi \\Omega \\dot{z} + \\Omega^2 z = z^{-1} \\Phi^T f \\end{equation}\nwith:\n \\(\\xi = diag(\\xi_i)\\) \\(\\Omega = diag(\\omega_i)\\) \\(\\mu = diag(\\mu_i)\\) Typical values of the modal damping ratio are summarized on table tab:damping_ratio.\n\nTable 2: Typical Damping ratio Damping Ratio Application \\(\\xi \\simeq 0.001 - 0.005\\) Space structures \\(\\xi \\simeq 0.01 - 0.02\\) Mechanical engineering \\(\\xi \\simeq 0.05\\) Civil engineering \\(\\xi \\simeq 0.2\\) When ground is involved The assumption of classical damping is often justified for light damping, but it is questionable when the damping is large.\nIf one accepts the assumption of classical damping, the only difference between equation \\eqref{eq:general_eom} and \\eqref{eq:modal_eom} lies in the change of coordinates. However, in physical coordinates, the number of degrees of freedom is usually very large. If a structure is excited in by a band limited excitation, its response is dominated by the modes whose natural frequencies are inside the bandwidth of the excitation and the equation \\eqref{eq:modal_eom} can often be restricted to theses modes. Therefore, the number of degrees of freedom contribution effectively to the response is reduced drastically in modal coordinates.\nDynamic Flexibility Matrix If we consider the steady-state response of equation \\eqref{eq:general_eom} to harmonic excitation \\(f=F e^{j\\omega t}\\), the response is also harmonic \\(x = Xe^{j\\omega t}\\). The amplitude of \\(F\\) and \\(X\\) is related by: \\[ X = G(\\omega) F \\]\nWhere \\(G(\\omega)\\) is called the Dynamic flexibility Matrix: \\[ G(\\omega) = (-\\omega^2 M + j\\omega C + K)^{-1} F \\]\nFrom the modal expansion of the dynamic flexibility matrix can be obtained by coordinate transformation \\(x = \\phi z\\) and we obtain:\n\\begin{equation} G(\\omega) = \\sum_{i=1}^n \\frac{\\phi_i \\phi_i^T}{\\mu_i \\omega_i^2} D_i(\\omega) \\end{equation}\nWith:\n \\(D_i(\\omega)\\) is the dynamic amplification factor of mode \\(i\\) given by \\begin{equation} D_i(\\omega) = \\frac{1}{1 - \\omega^2/\\omega_i^2 + 2 j \\xi_i \\omega/\\omega_i} \\end{equation}\n\n Figure 6: Fourier spectrum of the excitation \\(F\\) and dynamic amplitification \\(D_i\\) of mode \\(i\\) and \\(k\\) such that \\(\\omega_i \u0026lt; \\omega_b\\) and \\(\\omega_k \\gg \\omega_b\\)\n If the excitation has a limited bandwidth \\(\\omega_b\\), the contribution of the high frequency modes \\(\\omega_k \\gg \\omega_b\\) can be evaluated by assuming \\(D_k(\\omega) \\approx 1\\) (as shown on figure fig:neglected_modes).\nAnd \\(G(\\omega)\\) can be rewritten on terms of the low frequency modes only: \\[ G(\\omega) \\approx \\sum_{i=1}^m \\frac{\\phi_i \\phi_i^T}{\\mu_i \\omega_i^2} D_i(\\omega) + R \\]\nThe quasi-static correction of the high frequency modes \\(R\\) is called the residual mode. This introduces a feedthrough component in the transfer matrix.\nStructure with Rigid Body Modes Collocated Control System A collocated control system is a control system where:\n the actuator and the sensor are attached to the same degree of freedom they are dual: the product of the actuator signal and the sensor signal represents the energy exchange between the structure and the control system \nTable 3: Examples of dual actuators and sensors Actuator Sensor Force Translation Torque Rotation The open-loop FRF of a collocated system corresponds to a diagonal component of the dynamic flexibility matrix.\nIf we assumes that the collocated system is undamped and is attached to the DoF \\(k\\), the open-loop FRF is purely real: \\[ G_{kk}(\\omega) = \\sum_{i=1}^m \\frac{\\phi_i^2(k)}{\\mu_i (\\omega_i^2 - \\omega^2)} + R_{kk} \\]\n\\(G_{kk}\\) is a monotonously increasing function of \\(\\omega\\) (figure fig:collocated_control_frf).\n\n Figure 7: Open-Loop FRF of an undamped structure with collocated actuator/sensor pair\n The amplitude of the FRF goes from \\(-\\infty\\) at the resonance frequencies \\(\\omega_i\\) to \\(+\\infty\\) at the next resonance frequency \\(\\omega_{i+1}\\). Therefore, in every interval, there is a frequency \\(z_i\\) such that \\(\\omega_i \u0026lt; z_i \u0026lt; \\omega_{i+1}\\) where the amplitude of the FRF vanishes. The frequencies \\(z_i\\) are called anti-resonances.\n Undamped collocated control systems have alternating poles and zeros on the imaginary axis. For lightly damped structure, the poles and zeros are just moved a little bit in the left-half plane, but they are still interlacing.\n If the undamped structure is excited harmonically by the actuator at the frequency of the transmission zero \\(z_i\\), the amplitude of the response of the collocated sensor vanishes. That means that the structure oscillates at the frequency \\(z_i\\) according to the mode shape shown in dotted line figure fig:collocated_zero.\n\n Figure 8: Structure with collocated actuator and sensor\n The frequency of the transmission zero \\(z_i\\) and the mode shape associated are the natural frequency and the mode shape of the system obtained by constraining the d.o.f. on which the control systems acts.\nThe open-loop zeros are asymptotic values of the closed-loop poles when the feedback gain goes to infinity.\nThe open-loop poles are independant of the actuator and sensor configuration while the open-loop zeros do depend on it.\n By looking at figure fig:collocated_control_frf, we see that neglecting the residual mode in the modelling amounts to translating the FRF diagram vertically. That produces a shift in the location of the transmission zeros to the right.\n\n Figure 9: Bode plot of a lighly damped structure with collocated actuator and sensor\n The open-loop transfer function of a lighly damped structure with a collocated actuator/sensor pair can be written:\n\\begin{equation} G(s) = G_0 \\frac{\\Pi_i(s^2/z_i^2 + 2 \\xi_i s/z_i + 1)}{\\Pi_j(s^2/\\omega_j^2 + 2 \\xi_j s /\\omega_j + 1)} \\end{equation}\nThe corresponding Bode plot is represented in figure 9. Every imaginary pole at \\(\\pm j\\omega_i\\) introduces a \\(\\SI{180}{\\degree}\\) phase lag and every imaginary zero at \\(\\pm jz_i\\) introduces a phase lead of \\(\\SI{180}{\\degree}\\). In this way, the phase diagram is always contained between \\(\\SI{0}{\\degree}\\) and \\(\\SI{-180}{\\degree}\\) as a consequence of the interlacing property.\nElectromagnetic and Piezoelectric Transducers Introduction Transducers are critical in active structures technology. In many applications, the actuators are the most critical part of the system; however, the sensors become very important in precision engineering where submicron amplitudes must be detected.\nTwo broad categories of actuators can be distinguish:\n grounded actuator: react on a fixed support. They include torque motors, force motors (shakers), tendons structure borne actuator: includes jets, reaction wheels, proof-mass actuators, piezo strips, \u0026hellip; Voice Coil Transducer A voice coil transducer is an energy transformer which converts electrical power into mechanical power and vice versa.\nThe system consists of (see figure fig:voice_coil_schematic):\n A permanent magnet which produces a uniform flux density \\(B\\) normal to the gap A coil which is free to move axially \n Figure 10: Physical principle of a voice coil transducer\n We note:\n \\(v\\) the velocity of the coil \\(f\\) the external force acting to maintain the coil in equilibrium againt the electromagnetic forces \\(e\\) the voltage difference across the coil \\(i\\) the current into the coil Faraday\u0026rsquo;s law:\n\\begin{equation} e = 2\\pi n r B v = T v \\end{equation}\nWith \\(T = 2\\pi n r B\\) is the transducer constant.\nLorentz force law:\n\\begin{equation} f = -i 2\\pi n r B = - T i \\end{equation}\n The total power delivered to the moving coil transducer is equal to the sum of the electric power and the mechanical power: \\[ ei + fv = 0 \\]\nThus, at any time, there is an equilibrium between the electrical power absorbed by the device and the mechanical power delivered.\nProof-Mass Actuator A reaction mass \\(m\\) is conected to the support structure by a spring \\(k\\) , and damper \\(c\\) and a force actuator \\(f = T i\\) (figure fig:proof_mass_actuator).\n\n Figure 11: Proof-mass actuator\n If we apply the second law of Newton on the mass: \\[ m\\ddot{x} + c\\dot{x} + kx = f = Ti \\]\nIn the Laplace domain: \\[ x = \\frac{Ti}{ms^2 + cs + k} \\]\nThe total force applied on the support is: \\[ F = -f + cs + k = -m s^2 x = \\frac{-ms^2Ti}{ms^2 + cs + k} \\]\nThe transfer function between the total force and the current \\(i\\) applied to the coil is :\n \\begin{equation} \\frac{F}{i} = \\frac{-s^2 T}{s^2 + 2\\xi_p \\omega_p s + \\omega_p^2} \\end{equation}\nwith:\n \\(T\\) is the transducer constant \\(\\omega_p = \\frac{k}{m}\\) is the natural frequency of the spring-mass system \\(\\xi_p\\) is the damping ratio Above some critical frequency \\(\\omega_c \\approx 2\\omega_p\\), the proof-mass actuator can be regarded as an ideal force generator (figure fig:proof_mass_tf).\n\n Figure 12: Bode plot \\(F/i\\) of the proof-mass actuator\n Geophone The geophone is a transducer which behaves like an absolute velocity sensor above some cutoff frequency. The voltage \\(e\\) of the coil is used as the sensor output.\nIf \\(x_0\\) is the displacement of the support and if the voice coil is open (\\(i=0\\)), the governing equations are:\n\\begin{align*} m\\ddot{x} + c(\\dot{x}-\\dot{x_0}) + k(x-x_0) \u0026amp;= 0\\\\\\\nT(\\dot{x}-\\dot{x_0}) \u0026amp;= e \\end{align*}\nBy using the two equations, we obtain:\n\\begin{equation} \\frac{e}{\\dot{x_0}} = \\frac{-s^2 T}{s^2 + 2\\xi_p\\omega_p s + \\omega_p^2} \\end{equation}\nAbove the corner frequency, the gain of the geophone is equal to the transducer constant \\(T\\).\n\n Figure 13: Model of a geophone based on a voice coil transducer\n Designing geophones with very low corner frequency is in general difficult. Active geophones where the frequency is lowered electronically may constitute a good alternative option.\nGeneral Electromechanical Transducer The consitutive behavior of a wide class of electromechanical transducers can be modelled as in figure fig:electro_mechanical_transducer.\n\n Figure 14: Electrical analog representation of an electromechanical transducer\n In Laplace form the constitutive equations read:\n\\begin{align} e \u0026amp; = Z_e i + T_{em} v \\label{eq:gen_trans_e} \\\\\\\nf \u0026amp; = T_{em} i + Z_m v \\label{eq:gen_trans_f} \\end{align}\nWith:\n \\(e\\) is the Laplace transform of the input voltage across the electrical terminals \\(i\\) is the input current \\(f\\) is the force applied to the mechanical terminals \\(v\\) is the velocity of the mechanical part \\(Z_e\\) is the blocked electrical impedance (for \\(v=0\\)) \\(T_{em}\\) is the transduction coefficient representing the electromotive force (in \\(\\si{\\volt\\second\\per\\meter}\\)) \\(T_{me}\\) is the transduction coefficient representing the force acting on the mechanical terminals to balance the electromagnetic force induced per unit current input (in \\(\\si{\\newton\\per\\ampere}\\)) \\(Z_m\\) is the mechanical impedance measured when \\(i=0\\) Equation \\eqref{eq:gen_trans_e} shows that the voltage across the electrical terminals of any electromechanical transducer is the sum of a contribution proportional to the current applied and a contribution proportional to the velocity of the mechanical terminals. Thus, if \\(Z_ei\\) can be measured and substracted from \\(e\\), a signal proportional to the velocity is obtained.\nTo do so, the bridge circuit as shown on figure fig:bridge_circuit can be used.\nWe can show that\n\\begin{equation} V_4 - V_2 = \\frac{-Z_b T_{em}}{Z_e + Z_b} v \\end{equation}\nwhich is indeed a linear function of the velocity \\(v\\) at the mechanical terminals.\n\n Figure 15: Bridge circuit for self-sensing actuation\n Smart Materials Smart materials have the ability to respond significantly to stimuli of different physical nature. Figure fig:smart_materials lists various effects that are observed in materials in response to various inputs.\n\n Figure 16: Stimulus response relations indicating various effects in materials. The smart materials corresponds to the non-diagonal cells\n Piezoelectric Transducer Piezoelectric materials exhibits two effects described below.\n Ability to generate an electrical charge in proportion to an external applied force.\n An electric filed parallel to the direction of polarization induces an expansion of the material.\n The most popular piezoelectric materials are Lead-Zirconate-Titanate (PZT) which is a ceramic, and Polyvinylidene fluoride (PVDF) which is a polymer.\nWe here consider a transducer made of one-dimensional piezoelectric material.\n \\begin{subequations} \\begin{align} D \u0026amp; = \\epsilon^T E + d_{33} T\\\\\\\nS \u0026amp; = d_{33} E + s^E T \\end{align} \\end{subequations}\nWith:\n \\(D\\) is the electric displacement \\([C/m^2]\\) \\(E\\) is the electric field \\([V/m]\\) \\(T\\) is the stress \\([N/m^2]\\) \\(S\\) is the strain \\(\\epsilon^T\\) is the dielectric constant under constant stress \\(s^E\\) is the compliance when the eletric field is constant (inverse of Young modulus) \\(d_{33}\\) is the piezoelectric constant \\([m/V]\\) or \\([C/N]\\) in the poling direction of the material (convention) Constitutive Relations of a Discrete Transducer The set of equations \\eqref{eq:piezo_eq} can be written in a matrix form:\n\\begin{equation} \\begin{bmatrix}D\\S\\end{bmatrix} \\begin{bmatrix} \\epsilon^T \u0026amp; d_{33}\\\\\\\nd_{33} \u0026amp; s^E \\end{bmatrix} \\begin{bmatrix}E\\T\\end{bmatrix} \\end{equation}\nWhere \\((E, T)\\) are the independent variables and \\((D, S)\\) are the dependent variable.\nIf \\((E, S)\\) are taken as independant variables:\n\\begin{equation} \\begin{bmatrix}D\\T\\end{bmatrix} \\begin{bmatrix} \\epsilon^T(1-k^2) \u0026amp; e_{33}\\\\\\\n-e_{33} \u0026amp; c^E \\end{bmatrix} \\begin{bmatrix}E\\S\\end{bmatrix} \\end{equation}\nWith:\n \\(c^E = \\frac{1}{s^E}\\) is the Young modulus under short circuited electrodes (\\(E = 0\\)) in \\([N/m^2]\\) \\(e_{33} = \\frac{d_{33}}{s^E}\\) is the constant relating the electric displacement to the strain for short-circuited electrodes \\([C/m^2]\\) \\begin{equation} k^2 = \\frac{{d_{33}}^2}{s^E \\epsilon^T} = \\frac{{e_{33}}^2}{c^E \\epsilon^T} \\end{equation}\n\\(k\\) is called the electromechanical coupling factor of the material. It measures the efficiency of the conversion of the mechanical energy into electrical energy, and vice versa.\n If one assumes that all the electrical and mechanical quantities are uniformly distributed in a linear transducer formed by a stack (see figure fig:piezo_stack) of \\(n\\) disks of thickness \\(t\\) and cross section \\(A\\), the global constitutive equations of the transducer are obtained by integrating \\eqref{eq:piezo_eq_matrix_bis} over the volume of the transducer:\n\\begin{equation} \\begin{bmatrix}Q\\\\Delta\\end{bmatrix} \\begin{bmatrix} C \u0026amp; nd_{33}\\\\\\\nnd_{33} \u0026amp; 1/K_a \\end{bmatrix} \\begin{bmatrix}V\\f\\end{bmatrix} \\end{equation}\nwhere\n \\(Q = n A D\\) is the total electric charge on the electrodes of the transducer \\(\\Delta = S l\\) is the total extension (\\(l = nt\\) is the length of the transducer) \\(f = AT\\) is the total force \\(V\\) is the voltage applied between the electrodes of the transducer \\(C = \\epsilon^T A n^2/l\\) is the capacitance of the transducer with no external load (\\(f = 0\\)) \\(K_a = A/s^El\\) is the stiffness with short-circuited electrodes (\\(V = 0\\)) \n Figure 17: Piezoelectric linear transducer\n Equation \\eqref{eq:piezo_stack_eq} can be inverted to obtain\n\\begin{equation} \\begin{bmatrix}V\\f\\end{bmatrix} \\frac{K_a}{C(1-k^2)} \\begin{bmatrix} 1/K_a \u0026amp; -nd_{33}\\\\\\\n-nd_{33} \u0026amp; C \\end{bmatrix} \\begin{bmatrix}Q\\\\Delta\\end{bmatrix} \\end{equation}\nEnergy Stored in the Piezoelectric Transducer Let us write the total stored electromechanical energy of a discrete piezoelectric transducer as shown on figure fig:piezo_discrete.\nThe total power delivered to the transducer is the sum of electric power \\(V i\\) and the mechanical power \\(f \\dot{\\Delta}\\). The net work of the transducer is\n\\begin{equation} dW = V i dt + f \\dot{\\Delta} dt = V dQ + f d\\Delta \\end{equation}\n\n Figure 18: Discrete Piezoelectric Transducer\n By integrating equation \\eqref{eq:piezo_work} and using the constitutive equations \\eqref{eq:piezo_stack_eq_inv}, we obtain the analytical expression of the stored electromechanical energy for the discrete transducer:\n\\begin{equation} W_e(\\Delta, Q) = \\frac{Q^2}{2 C (1 - k^2)} - \\frac{n d_{33} K_a}{C(1-k^2)} Q\\Delta + \\frac{K_a}{1-k^2}\\frac{\\Delta^2}{2} \\end{equation}\n The first term is the electrical energy stored in the capacitance \\(C(1-k^2)\\) (corresponding to fixed geometry \\(\\Delta = 0\\)) The second term is the piezoelectric energy The third term is the elastic strain energy stored in a spring stiffness \\(K_a/(1-k^2)\\) (corresponding to open electrodes \\(Q=0\\)) The constitutive equations can be recovered by differentiate the stored energy: \\[ f = \\frac{\\partial W_e}{\\partial \\Delta}, \\quad V = \\frac{\\partial W_e}{\\partial Q} \\]\nInterpretation of \\(k^2\\) Consider a piezoelectric transducer subjected to the following mechanical cycle: first, it is loaded with a force \\(F\\) with short-circuited electrodes; the resulting extension is \\(\\Delta_1 = F/K_a\\) where \\(K_a = A/(s^El)\\) is the stiffness with short-circuited electrodes. The energy stored in the system is: \\[ W_1 = \\int_0^{\\Delta_1} f dx = \\int_0^{\\Delta_1} K_a x dx = \\frac{F^2}{2 K_a} \\]\nAt this point, the electrodes are open and the transducer is unloaded according to a path of slope \\(K_a/(1-k^2)\\), the resulting extension is \\(\\Delta_2 = \\frac{F(1-k^2)}{K_a}\\). The energy recovered is \\[ W_1 = \\int_0^{\\Delta_2} f dx = \\frac{F \\Delta_2}{2} = \\frac{F^2(1-k^2)}{2 K_a} \\]\nThe ratio between the remaining stored energy and the initial stored energy is \\[ \\frac{W_1 - W_2}{W_1} = k^2 \\]\nAdmittance of the Piezoelectric Transducer Consider the system of figure fig:piezo_stack_admittance, where the piezoelectric transducer is assumed massless and is connected to a mass \\(M\\). The force acting on the mass is negative of that acting on the transducer, \\(f = -M \\ddot{x}\\).\n\n Figure 19: Elementary dynamical model of the piezoelectric transducer\n From the constitutive equations, one finds\n\\begin{equation} \\frac{I}{V} = s C (1-k^2) \\frac{s^2 + z^2}{s^2 + p^2} \\end{equation}\nwhere the poles and zeros are respectively \\[ p^2 = \\frac{K_a}{M},\\quad z^2 = \\frac{K_a/(1-k^2)}{M} \\]\nAnd one can see that\n\\begin{equation} \\frac{z^2 - p^2}{z^2} = k^2 \\end{equation}\nEquation \\eqref{eq:distance_p_z} constitutes a practical way to determine the electromechanical coupling factor from the poles and zeros of the admittance measurement (figure fig:piezo_admittance_curve).\n\n Figure 20: Typical admittance FRF of the transducer\n Piezoelectric Beam, Plate and Truss Piezoelectric Material Constitutive Relations Coenergy Density Function Hamilton\u0026rsquo;s Principle Piezoelectric Beam Actuator Hamilton\u0026rsquo;s Principle Piezoelectric Loads Laminar Sensor Current and Charge Amplifiers Distributed Sensor Output Charge Amplifier Dynamics Spatial Modal Filters Modal Actuator Modal Sensor Active Beam with Collocated Actuator/Sensor Frequency Response Function Pole-Zero Pattern Modal Truncation Admittance of a Beam with a Piezoelectric Patch Piezoelectric Laminate Two-Dimensional Constitutive Equations Kirchhoff Theory Stiffness Matrix of a Multilayer Elastic Laminate Multilayer Laminate with a Piezoelectric Layer Equivalent Piezoelectric Loads Sensor Output Beam Model Versus Plate Model Additional Remarks Active Truss Open-Loop Transfer Function Admittance Function Finite Element Formulation Problems References Passive Damping with Piezoelectric Transducers Introduction Resistive Shunting Inductive Shunting Equal Peak Design Robustness of the Equal Peak Design Switched Shunt Equivalent Damping Ratio Collocated Versus Non-collocated Control Pole-Zero Flipping The Root Locus shows, in a graphical form, the evolution of the poles of the closed-loop system as a function of the scalar gain \\(g\\) applied to the compensator. The Root Locus is the locus of the solution \\(s\\) of the closed loop characteristic equation \\(1 + gG(s)H(s) = 0\\) when \\(g\\) goes from zero to infinity.\n If the open-loop transfer function is written \\[ G(s)H(s) = k \\frac{\\Pi_{i=1}^{m} (s - z_i)}{\\Pi_{i=1}^{n} (s - p_i)} \\] The locus goes from the poles \\(p_i\\) (for \\(g=0\\)) to the zeros \\(z_i\\) (as \\(g \\rightarrow \\infty\\)).\nThe Two-Mass Problem Collocated Control Non-collocated Control Notch Filter Effect of Pole-Zero Flipping on the Bode Plots Nearly Collocated Control System Non-collocated Control Systems The Role of Damping Active Damping with Collocated System Introduction The role of active damping is to increase the negative real parts of system poles wile maintaining the natural frequencies essentially unchanged.\nActive damping requires relatively little control effort; this is why it is also called Low Authority Control (LAC). Other control strategies which fully relocate the closed loop poles are called High Autority Control (HAC).\nLead Control \\[H(s) = g \\frac{s+z}{z+p} \\quad p \\gg z \\]\nIt produces a phase lead in the frequency band between \\(z\\) and \\(p\\), bringing active damping to all the modes belonging to \\(z \u0026lt; \\omega_i \u0026lt; p\\).\nThe closed-loop poles start at the open-llop poles for \\(g=0\\) and go to the open-loop zeros for \\(g\\rightarrow\\infty\\).\nThe controller does not have any roll-off, but the roll-off of the structure is enough to guarantee gain stability at high frequency.\nDirect Velocity Feedback (DVF) This is a particular case of the Lead controller as \\(z\\rightarrow 0\\) and \\(p\\rightarrow\\infty\\).\nStructure: \\[M \\ddot{x} + K x = b u\\]\nOutput is a velocity sensor: \\[y = b^T \\dot{x}\\]\nControl: \\[u = -g y\\]\nPositive Position Feedback (PPF) Sometimes the plant does not have a roll-off of \\(-40dB/\\text{decade}\\), then we can use a second-order PPF: \\[H(s) = \\frac{-g}{s^2 + 2 \\xi_f \\omega_f s + {\\omega_f}^2}\\]\nIntegral Force Feedback (IFF) Duality Between the Lead and the IFF Controllers Root Locus of a Single Mode Open-Loop Poles and Zeros Actuator and Sensor Dynamics Decentralized Control with Collocated Pairs Cross talk Force Actuator and Displacement Sensor Displacement Actuator and Force Sensor Proof of Equation (7.18)–(7.32) Vibration Isolation Introduction Relaxation Isolator Electromagnetic Realization Active Isolation Sky-Hook Damper Integral Force Feedback Flexible Body Free-Free Beam with Isolator Payload Isolation in Spacecraft Interaction Isolator/Attitude Control Gough–Stewart Platform Six-Axis Isolator Relaxation Isolator Integral Force Feedback Spherical Joints, Modal Spread Active Versus Passive Car Suspension State Space Approach Introduction State Space Description Single Degree of Freedom Oscillator Flexible Structure Inverted Pendulum System Transfer Function Poles and Zeros Pole Placement by State Feedback Example: Oscillator Linear Quadratic Regulator Symmetric Root Locus Inverted Pendulum Observer Design Kalman Filter Inverted Pendulum Reduced-Order Observer Oscillator Inverted Pendulum Separation Principle Transfer Function of the Compensator The Two-Mass Problem Analysis and Synthesis in the Frequency Domain Gain and Phase Margins Nyquist Criterion Cauchy\u0026rsquo;s Principle Nyquist Stability Criterion Nichols Chart Feedback Specification for SISO Systems Sensitivity Tracking Error Performance Specification Unstructured Uncertainty Robust Performance and Robust Stability Bode Gain–Phase Relationships The Bode Ideal Cutoff Non-minimum Phase Systems Usual Compensators System Type Lead Compensator PI Compensator Lag Compensator PID Compensator Multivariable Systems Performance Specification Small Gain Theorem Stability Robustness Tests Residual Dynamics Optimal Control Introduction Quadratic Integral Deterministic LQR Stochastic Response to a White Noise Remark Stochastic LQR Asymptotic Behavior of the Closed Loop Prescribed Degree of Stability Gain and Phase Margins of the LQR Full State Observer Covariance of the Reconstruction Error Kalman Filter (KF) Linear Quadratic Gaussian (LQG) Duality Spillover Spillover Reduction Loop Transfer Recovery (LTR) Integral Control with State Feedback Frequency Shaping Weakness of LQG:\n use frequency independant cost function use noise statistics with uniform distribution To overcome the weakness =\u0026gt; frequency shaping either by:\n considering a frequency dependant cost function using colored noise statistics Frequency-Shaped Cost Functionals Noise Model Controllability and Observability Introduction Definitions Controllability and Observability Matrices Examples Cart with Two Inverted Pendulums Double Inverted Pendulum Two d.o.f. Oscillator State Transformation Control Canonical Form Left and Right Eigenvectors Diagonal Form PBH Test Residues Example Sensitivity Controllability and Observability Gramians Internally Balanced Coordinates Model Reduction Transfer Equivalent Realization Internally Balanced Realization Example Stability Introduction Phase Portrait Linear Systems Routh\u0026ndash;Hurwitz Criterion Lyapunov\u0026rsquo;s Direct Method Introductory Example Stability Theorem Asymptotic Stability Theorem Lasalle\u0026rsquo;s Theorem Geometric Interpretation Instability Theorem Lyapunov Functions for Linear Systems Lyapunov\u0026rsquo;s Indirect Method An Application to Controller Design Energy Absorbing Controls Applications Digital Implementation Sampling, Aliasing, and Prefiltering Zero-Order Hold, Computational Delay Quantization Discretization of a Continuous Controller Active Damping of a Truss Structure Actuator Placement Implementation, Experimental Results Active Damping Generic Interface Active Damping Experiment Pointing and Position Control Active Damping of a Plate Control Design Active Damping of a Stiff Beam System Design The HAC/LAC Strategy In active structures for precision engineering applications, the control system is used to reduce the effect of transient and steady-state disturbances on the controlled variables. Active damping is very effective in reducing the settling time of transient disturbances and the effect of steady state disturbances near the resonance frequencies of the system; however, away from the resonances, the active damping is completely ineffective and leaves the closed-loop response essentially unchanged. Such low-gain controllers are often called Low Authority Controllers (LAC), because they modify the poles of the system only slightly.\nTo attenuate wide-band disturbances, the controller needs larger gains, in order to cause more substantial modifications to the poles of the open-loop system; this is the reason why they are often called High Authority Controllers (HAC). Their design requires a model of the structure, and there is usually a trade-off between the conflicting requirements of performance-bandwidth and stability in the face of parametric uncertainty and unmodelled dynamics.\nWhen collocated actuator/sensor pairs can be used, stability can be achieved using positivity concepts, but in many situations, collocated pairs are not feasible for HAC.\nThe HAC/LAC approach consist of combining the two approached in a dual-loop control as shown in Figure fig:hac_lac_control. The inner loop uses a set of collocated actuator/sensor pairs for decentralized active damping with guaranteed stability ; the outer loop consists of a non-collocated HAC based on a model of the actively damped structure. This approach has the following advantages:\n The active damping extends outside the bandwidth of the HAC and reduces the settling time of the modes which are outsite the bandwidth The active damping makes it easier to gain-stabilize the modes outside the bandwidth of the output loop (improved gain margin) The larger damping of the modes within the controller bandwidth makes them more robust to the parmetric uncertainty (improved phase margin) \n Figure 21: Principle of the dual-loop HAC/LAC control\n Wide-Band Position Control Compensator Design Results Vibroacoustics: Volume Displacement Sensors QWSIS Sensor Discrete Array Sensor Spatial Aliasing Distributed Sensor Tendon Control of Cable Structures Introduction Tendon Control of Strings and Cables Active Damping Strategy Basic Experiment Linear Theory of Decentralized Active Damping Guyed Truss Experiment Microprecision Interferometer Testbed Free-Floating Truss Experiment Application to Cable-Stayed Bridges Laboratory Experiment Control of Parametric Resonance Large Scale Experiment Application to Suspension Bridges Footbridge Laboratory Experiment Active Control of Large Telescopes: Adaptive Optics Introduction Wavefront Sensor Zernike Modes Fried Length, Seeing Kolmogorov Turbulence Model Strehl Ratio Power Spectral Density of the Zernike Modes Deformable Mirror for Adaptive Optics Stoney Formula Stroke Versus Natural Frequency Feedback Control of an AO Mirror Quasi-static Control Control of the Mirror Based on the Jacobian Control of Zernike Modes Dynamic Response of the AO Mirror Dynamic Model of the Mirror Control-Structure Interaction Passive Damping Active Damping Miscellaneous Segmented AO Mirror Initial Curvature of the AO Mirror Active Control of Large Telescopes: Active Optics Introduction Monolithic Primary Mirror Segmented Primary Mirror SVD Controller Loop Shaping of the SVD Controller Dynamics of a Segmented Mirror Control-Structure Interaction SISO System MIMO System Spillover Alleviation Scaling Rules Static Deflection Under Gravity First Resonance Frequency Control Bandwidth Adaptive Thin Shell Space Reflectors Introduction Adaptive Plates Versus Adaptive Shells Adaptive Spherical Shell Quasi-static Control: Hierarchical Approach Petal Configuration MATS Demonstrator Manufacturing of the Demonstrator Semi-active Control Introduction Magneto-Rheological Fluids MR Devices Semi-active Suspension Semi-active Devices Narrow-Band Disturbance Quarter-Car Semi-active Suspension Problems Bibliography Preumont, A., Vibration control of active structures - fourth edition (2018), : Springer International Publishing. ↩\n","permalink":"/book/preumont18_vibrat_contr_activ_struc_fourt_edition/","tags":null,"title":"Vibration Control of Active Structures - Fourth Edition"},{"categories":null,"contents":" Tags Vibration Isolation, Sensor Fusion Reference (Collette \u0026amp; Matichard, 2014) Author(s) Collette, C., \u0026amp; Matichard, F. Year 2014 Introduction Sensor fusion is used to combine the benefits of different types of sensors:\n Relative sensor for DC positioning capability at low frequency Inertial sensors for isolation at high frequency Force sensor / collocated sensor to improve the robustness Different types of sensors In this paper, three types of sensors are used. Their advantages and disadvantages are summarized table 1.\n Several types of sensors can be used for the feedback control of vibration isolation systems:\n Feedback control based on relative motion sensors (inductive, capactive, ferromagnetic sensors\u0026hellip;) typically permits to servo-position a system or platform relative to a reference (e.g. floor or support base), but does not provide isolation from the ground motion. Feedback control based on force sensors typically lowers the effective natural frequency, and therefore increases the isolation, but sacrifices the systems compliance in doing so. Feedback control based on inertial sensors (geophones, seismometers, accelerometers\u0026hellip;) improves not only the vibration isolation but also the compliance. Inertial sensors are, however, AC coupled and noisy at low frequencies. \nTable 1: Types of sensors Sensors Advantages Disadvantages Relative motion Servo-position No isolation from gorund motion Force sensors Improve isolation Increase compliance Inertial sensors Improve isolation and compliance AC couple and noisy at high frequency Inertial Control and sensor fusion configurations For a simple 1DoF model, two fusion-sensor configuration are studied. The results are summarized Table 2.\n\nTable 2: Sensor fusion configurations Low freq. sensor High freq. sensor Transmissibility Compliance Trade-off Inertial Force sensor Unchanged Degraded Sensor noise filtering / compliance degradation Inertial Relative sensor Degraded Unchanged Isolation in the bandwidth / amplification outside Flexible structure Flexibility is added between the inertial sensor and the actuator. Now the sensor and actuator are not collocated anymore and the system is unstable because there is no zero between the two poles. We use sensor fusion to obtain stability at high frequency.\nInertial and small accelerometer The idea is to use a small accelerometer which is easier to locate near the actuator at high frequency. However, it is important to verify that the noise introduced by the accelerometer does not degrades too much the isolation performance.\nInertial and force sensor Here the advantage is that the deformation mode is almost not present in the open-loop transfer function. This simplifies the loop shaping of the controller.\nInertial and relative sensor The relative sensor introduces coupling between both side of the actuator which induces degradation of the isolation at high frequency. However, the compliance remains unchanged at high frequency.\nConclusion Fusion of inertial instruments with sensors collocated with the actuator permits to increase the feedback control bandwidth of active isolation systems.\nThree types of sensors have been considered for the high frequency part of the fusion:\n The fusion with a relative sensor improves the stability but compromises the transmissibility. It can be of interested for stiff suspension where high frequency isolation can be sacrified to improve stability. The fusion with an accelerometre is used to increase the loop gain. However, as the accelerometer is not dual with the actuator, there is no guaranty stability when the isolation stage is mounted on a flexible support. The fusion with a force sensor can be used to increase the loop gain with little effect on the compliance and passive isolation, provided that the blend is possible and that no active damping of flexible modes is required. Bibliography Collette, C., \u0026amp; Matichard, F., Vibration control of flexible structures using fusion of inertial sensors and hyper-stable actuator-sensor pairs, In , International Conference on Noise and Vibration Engineering (ISMA2014) (pp. ) (2014). : . ↩\n","permalink":"/paper/collette14_vibrat/","tags":null,"title":"Vibration control of flexible structures using fusion of inertial sensors and hyper-stable actuator-sensor pairs"},{"categories":null,"contents":"Tags :\n\u0026lt;./biblio/references.bib\u0026gt;\nBacklinks Six dof active vibration control using stewart platform with non-cubic configuration Dynamic modeling and decoupled control of a flexible stewart platform for vibration isolation Investigation on active vibration isolation of a stewart platform with piezoelectric actuators Review of active vibration isolation strategies Vibration control of flexible structures using fusion of inertial sensors and hyper-stable actuator-sensor pairs Sensor fusion methods for high performance active vibration isolation systems Modeling and control of vibration in mechanical systems An intelligent control system for multiple degree-of-freedom vibration isolation Active isolation and damping of vibrations via stewart platform Sensors and control of a space-based six-axis vibration isolation system Comparison and classification of high-precision actuators based on stiffness influencing vibration isolation Simultaneous, fault-tolerant vibration isolation and pointing control of flexure jointed hexapods Simultaneous vibration isolation and pointing control of flexure jointed hexapods An exploration of active hard mount vibration isolation for precision equipment Force feedback versus acceleration feedback in active vibration isolation A six-axis single-stage active vibration isolator based on stewart platform Vibration Control of Active Structures - Fourth Edition A soft 6-axis active vibration isolator Sensor fusion for active vibration isolation in precision equipment ","permalink":"/zettels/vibration_isolation/","tags":null,"title":"Vibration Isolation"}] \ No newline at end of file diff --git a/public/index.xml b/public/index.xml new file mode 100644 index 0000000..5138f9b --- /dev/null +++ b/public/index.xml @@ -0,0 +1,867 @@ + + + + My digital brain + / + Recent content on My digital brain + Hugo -- gohugo.io + en + + + + + + A new isotropic and decoupled 6-dof parallel manipulator + /paper/legnani12_new_isotr_decoup_paral_manip/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /paper/legnani12_new_isotr_decoup_paral_manip/ + Tags Stewart Platforms Reference (Legnani {\it et al.}, 2012) Author(s) Legnani, G., Fassi, I., Giberti, H., Cinquemani, S., &amp; Tosi, D. Year 2012 Concepts of isotropy and decoupling for parallel manipulators isotropy: the kinetostatic properties (same applicable force, same possible velocity, same stiffness) are identical in all directions (e.g. cubic configuration for Stewart platform) decoupling: each DoF of the end effector can be controlled by a single actuator (not the case for the Stewart platform) Example of generated isotropic manipulator (not decoupled). + + + + A review of nanometer resolution position sensors: operation and performance + /paper/fleming13_review_nanom_resol_posit_sensor/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /paper/fleming13_review_nanom_resol_posit_sensor/ + Tags Position Sensors Reference (Andrew Fleming, 2013) Author(s) Fleming, A. J. Year 2013 Define concise performance metric and provide expressions for errors sources (non-linearity, drift, noise) Review current position sensor technologies and compare their performance Sensor Characteristics Calibration and nonlinearity Usually quoted as a percentage of the fill-scale range (FSR): +\begin{equation} \text{mapping error (%)} = \pm 100 \frac{\max{}|e_m(v)|}{\text{FSR}} \end{equation} +With \(e_m(v)\) is the mapping error. + + + + A six-axis single-stage active vibration isolator based on stewart platform + /paper/preumont07_six_axis_singl_stage_activ/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /paper/preumont07_six_axis_singl_stage_activ/ + Tags Vibration Isolation, Stewart Platforms, Flexible Joints Reference (Preumont {\it et al.}, 2007) Author(s) Preumont, A., Horodinca, M., Romanescu, I., Marneffe, B. d., Avraam, M., Deraemaeker, A., Bossens, F., … Year 2007 Summary: + Cubic Stewart platform (Figure 3) Provides uniform control capability Uniform stiffness in all directions minimizes the cross-coupling among actuators and sensors of different legs Flexible joints (Figure 2) Piezoelectric force sensors Voice coil actuators Decentralized feedback control approach for vibration isolation Effect of parasitic stiffness of the flexible joints on the IFF performance (Figure 1) The Stewart platform has 6 suspension modes at different frequencies. + + + + A soft 6-axis active vibration isolator + /paper/spanos95_soft_activ_vibrat_isolat/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /paper/spanos95_soft_activ_vibrat_isolat/ + Tags Stewart Platforms, Vibration Isolation Reference (Spanos {\it et al.}, 1995) Author(s) Spanos, J., Rahman, Z., &amp; Blackwood, G. Year 1995 Stewart Platform (Figure 1): + Voice Coil Flexible joints (cross-blades) Force Sensors Cubic Configuration + Figure 1: Stewart Platform + Total mass of the paylaod: 30kg Center of gravity is 9cm above the geometry center of the mount (cube&rsquo;s center?). +Limitation of the Decentralized Force Feedback: + + + + A survey of control issues in nanopositioning + /paper/devasia07_survey_contr_issues_nanop/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /paper/devasia07_survey_contr_issues_nanop/ + Tags : + Reference (Devasia {\it et al.}, 2007) Author(s) Devasia, S., Eleftheriou, E., &amp; Moheimani, S. R. Year 2007 Talks about Scanning Tunneling Microscope (STM) and Scanning Probe Microscope (SPM) Piezoelectric actuators: Creep, Hysteresis, Vibrations, Modeling errors Interesting analysis about Bandwidth-Precision-Range tradeoffs Control approaches for piezoelectric actuators: feedforward, Feedback, Iterative, Sensorless controls + Figure 1: Tradeoffs between bandwidth, precision and range + Bibliography Devasia, S. + + + + Active Damping + /zettels/active_damping/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /zettels/active_damping/ + Tags : +&lt;./biblio/references.bib&gt; +Backlinks Active isolation and damping of vibrations via stewart platform Active damping based on decoupled collocated control + + + + Active damping based on decoupled collocated control + /paper/holterman05_activ_dampin_based_decoup_colloc_contr/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /paper/holterman05_activ_dampin_based_decoup_colloc_contr/ + Tags Active Damping Reference (Holterman &amp; deVries, 2005) Author(s) Holterman, J., &amp; deVries, T. Year 2005 Bibliography Holterman, J., &amp; deVries, T., Active damping based on decoupled collocated control, IEEE/ASME Transactions on Mechatronics, 10(2), 135–145 (2005). http://dx.doi.org/10.1109/tmech.2005.844702 ↩ + + + + Active isolation and damping of vibrations via stewart platform + /paper/hanieh03_activ_stewar/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /paper/hanieh03_activ_stewar/ + Tags Stewart Platforms, Vibration Isolation, Active Damping Reference @phdthesis{hanieh03_activ_stewar, author = {Hanieh, Ahmed Abu}, school = {Universit{'e} Libre de Bruxelles, Brussels, Belgium}, title = {Active isolation and damping of vibrations via Stewart platform}, year = 2003, tags = {parallel robot}, } Author(s) Hanieh, A. A. Year 2003 Bibliography Hanieh, A. A., Active isolation and damping of vibrations via stewart platform (Doctoral dissertation) (2003). Universit{'e} Libre de Bruxelles, Brussels, Belgium, . + + + + Active structural vibration control: a review + /paper/alkhatib03_activ_struc_vibrat_contr/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /paper/alkhatib03_activ_struc_vibrat_contr/ + Tags : + Reference (Rabih Alkhatib &amp; Golnaraghi, 2003) Author(s) Alkhatib, R., &amp; Golnaraghi, M. F. Year 2003 Process of designing an active vibration control system Analyze the structure to be controled Obtain an idealized mathematical model with FEM or experimental modal analysis Reduce the model order is necessary Analyze the resulting model: dynamics properties, types of disturbances, &hellip; Quantify sensors and actuators requirements. Decide on their types and location Analyze the impact of the sensors and actuators on the overall dynamic characteristics Specify performance criteria and stability tradeoffs Device of the type of control algorythm to be employed and design a controller to meet the specifications Simulate the resulting controlled system on a computer If the controller does not meet the requirements, adjust the specifications or modify the type of controller Choose hardware and software and integrate the components on a pilot plant Formulate experiments and perform system identification and model updating Implement controller and carry out system test to evaluate the performance Feedback control Active damping The objective is to reduce the resonance peaks of the closed loop transfer function. + + + + Actuators + /zettels/actuators/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /zettels/actuators/ + Tags : +How to choose the correct actuator for my application? For vibration isolation: + In (Shingo Ito &amp; Georg Schitter, 2016), the effect of the actuator stiffness on the attainable vibration isolation is studied (Notes) Piezoelectric Suppliers Links Cedrat link PI link Piezo System link Noliac link A model of a multi-layer monolithic piezoelectric stack actuator is described in (Fleming, 2010) (Notes). + + + + Advanced motion control for precision mechatronics: control, identification, and learning of complex systems + /paper/oomen18_advan_motion_contr_precis_mechat/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /paper/oomen18_advan_motion_contr_precis_mechat/ + Tags Motion Control Reference (Tom Oomen, 2018) Author(s) Oomen, T. Year 2018 + Figure 1: Envisaged developments in motion systems. In traditional motion systems, the control bandwidth takes place in the rigid-body region. In the next generation systemes, flexible dynamics are foreseen to occur within the control bandwidth. + Bibliography Oomen, T., Advanced motion control for precision mechatronics: control, identification, and learning of complex systems, IEEJ Journal of Industry Applications, 7(2), 127–140 (2018). + + + + Advances in internal model control technique: a review and future prospects + /paper/saxena12_advan_inter_model_contr_techn/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /paper/saxena12_advan_inter_model_contr_techn/ + Tags Complementary Filters Reference (Sahaj Saxena &amp; YogeshV Hote, 2012) Author(s) Saxena, S., &amp; Hote, Y. Year 2012 Proposed Filter \(F(s)\) \begin{align*} F(s) &amp;= \frac{1}{(\lambda s + 1)^n} \\\ +F(s) &amp;= \frac{n \lambda + 1}{(\lambda s + 1)^n} \end{align*} +Internal Model Control Central concept in IMC: control can be acheive only if the control system involves, either implicitly or explicitly, some representation of the process to be controlled. + + + + An exploration of active hard mount vibration isolation for precision equipment + /paper/poel10_explor_activ_hard_mount_vibrat/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /paper/poel10_explor_activ_hard_mount_vibrat/ + Tags Vibration Isolation Reference @phdthesis{poel10_explor_activ_hard_mount_vibrat, author = {van der Poel, Gerrit Wijnand}, doi = {10.3990/1.9789036530163}, isbn = {978-90-365-3016-3}, school = {University of Twente}, title = {An Exploration of Active Hard Mount Vibration Isolation for Precision Equipment}, url = {https://doi.org/10.3990/1.9789036530163}, year = 2010, year = 2010, tags = {parallel robot}, } Author(s) van der Poel, G. W. Year 2010 Bibliography van der Poel, G. W., An exploration of active hard mount vibration isolation for precision equipment (Doctoral dissertation) (2010). + + + + An instrument for 3d x-ray nano-imaging + /paper/holler12_instr_x_ray_nano_imagin/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /paper/holler12_instr_x_ray_nano_imagin/ + Tags Nano Active Stabilization System, Positioning Stations Reference (Holler {\it et al.}, 2012) Author(s) Holler, M., Raabe, J., Diaz, A., Guizar-Sicairos, M., Quitmann, C., Menzel, A., &amp; Bunk, O. Year 2012 Instrument similar to the NASS. Obtain position stability of 10nm (standard deviation). + + Figure 1: Schematic of the tomography setup + Limited resolution due to instrumentation: The resolution of ptychographic tomography remains above 100nm due to instabilities and drifts of the scanning systems. + + + + An intelligent control system for multiple degree-of-freedom vibration isolation + /paper/geng95_intel_contr_system_multip_degree/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /paper/geng95_intel_contr_system_multip_degree/ + Tags Stewart Platforms, Vibration Isolation Reference (Jason Geng {\it et al.}, 1995) Author(s) Geng, Z. J., Pan, G. G., Haynes, L. S., Wada, B. K., &amp; Garba, J. A. Year 1995 + Figure 1: Local force feedback and adaptive acceleration feedback for active isolation + Bibliography Geng, Z. J., Pan, G. G., Haynes, L. S., Wada, B. K., &amp; Garba, J. A., An intelligent control system for multiple degree-of-freedom vibration isolation, Journal of Intelligent Material Systems and Structures, 6(6), 787–800 (1995). + + + + Automated markerless full field hard x-ray microscopic tomography at sub-50 nm 3-dimension spatial resolution + /paper/wang12_autom_marker_full_field_hard/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /paper/wang12_autom_marker_full_field_hard/ + Tags Nano Active Stabilization System Reference (Jun Wang {\it et al.}, 2012) Author(s) Wang, J., Chen, Y. K., Yuan, Q., Tkachuk, A., Erdonmez, C., Hornberger, B., &amp; Feser, M. Year 2012 Introduction of Markers: That limits the type of samples that is studied +There is a need for markerless nano-tomography =&gt; the key requirement is the precision and stability of the positioning stages. +Passive rotational run-out error system: It uses calibrated metrology disc and capacitive sensors + + + + Basics of precision engineering - 1st edition + /book/leach18_basic_precis_engin_edition/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /book/leach18_basic_precis_engin_edition/ + Tags Precision Engineering Reference (Richard Leach &amp; Stuart Smith, 2018) Author(s) Leach, R., &amp; Smith, S. T. Year 2018 Bibliography Leach, R., &amp; Smith, S. T., Basics of precision engineering - 1st edition (2018), : CRC Press. ↩ + + + + Comparison and classification of high-precision actuators based on stiffness influencing vibration isolation + /paper/ito16_compar_class_high_precis_actuat/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /paper/ito16_compar_class_high_precis_actuat/ + Tags Vibration Isolation, Actuators Reference (Shingo Ito &amp; Georg Schitter, 2016) Author(s) Ito, S., &amp; Schitter, G. Year 2016 Classification of high-precision actuators Table 1: Zero/Low and High stiffness actuators Categories Pros Cons Zero stiffness No vibration transmission Large and Heavy Low stiffness High vibration isolation Typically for low load High Stiffness High control bandwidth High vibration transmission Time Delay of Piezoelectric Electronics In this paper, the piezoelectric actuator/electronics adds a time delay which is much higher than the time delay added by the voice coil/electronics. + + + + Complementary Filters + /zettels/complementary_filters/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /zettels/complementary_filters/ + Tags : +&lt;./biblio/references.bib&gt; +Backlinks Advances in internal model control technique: a review and future prospects + + + + Control Bootcamp + /websites/control_bootcamp/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /websites/control_bootcamp/ + Tags : +https://www.youtube.com/playlist?list=PLMrJAkhIeNNR20Mz-VpzgfQs5zrYi085m +Overview Linear Systems Stability and Eigenvalues Linearizing Around a Fixed Point Controllability Controllability, Reachability, and Eigenvalue Placement Controllability and the Discrete-Time Impulse Response Degrees of Controllability and Gramians Controllability and the PBH Test Cayley-Hamilton Theorem Reachability and Controllability with Cayley-Hamilton Inverted Pendulum on a Cart Eigenvalue Placement for the Inverted Pendulum on a Cart Linear Quadratic Regulator (LQR) Control for the Inverted Pendulum on a Cart Motivation for Full-State Estimation Observability Full-State Estimation Kalman Filter Observability Example in Matlab Observability Example in Matlab (Part 2) Kalman Filter Example in Matlab Linear Quadratic Gaussian (LQG) LQG Example in Matlab Introduction to Robust Control Three Equivalent Representations of Linear Systems Example Frequency Response (Bode Plot) for Spring-Mass-Damper Laplace Transforms and the Transfer Function Benefits of Feedback on Cruise Control Example Benefits of Feedback on Cruise Control Example (Part 2) Cruise Control Example with Proportional-Integral (PI) control Sensitivity and Complementary Sensitivity Sensitivity and Complementary Sensitivity (Part 2) Loop shaping Loop Shaping Example for Cruise Control Sensitivity and Robustness Limitations on Robustness Cautionary Tale About Inverting the Plant Dynamics Control systems with non-minimum phase dynamics &lt;. + + + + Control of spacecraft and aircraft + /paper/bryson93_contr_spacec_aircr/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /paper/bryson93_contr_spacec_aircr/ + Tags HAC-HAC Reference (Bryson, 1993) Author(s) Bryson, A. E. Year 1993 9.2.3 Roll-Off Filters Synthesizing control logic using only one vibration mode means we are consciously neglecting the higher-order vibration modes. When doing this, it is a good idea to insert &ldquo;roll-off&rdquo; into the control logic, so that the loop-transfer gain decreases rapidly with frequency beyond the control bandwidth. This reduces the possibility of destabilizing the unmodelled higher frequency dynamics (&quot;spillover&quot;). + + + + Cubic Architecture + /zettels/cubic_architecture/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /zettels/cubic_architecture/ + Tags : +&lt;./biblio/references.bib&gt; +Backlinks Sensors and control of a space-based six-axis vibration isolation system Dynamic modeling and decoupled control of a flexible stewart platform for vibration isolation Simultaneous, fault-tolerant vibration isolation and pointing control of flexure jointed hexapods + + + + Data-Driven Dynamical Systems with Machine Learning + /websites/data_driven_dynamical_systems_with_machine_learning/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /websites/data_driven_dynamical_systems_with_machine_learning/ + Tags : +Data-Driven Control Overview Challenges With modern control (LQR, LQG, H-Infinity), we work with linear system (or linearized systems) and we develop a control law that minimize some cost function. +Challenging systems where modern control is not efficient: + Non-linear systems System with unknown dynamics High dimensional systems Limited measurements or control inputs For these kinds of systems, data-driven control seems to be a good alternative. +What is control? + + + + Decentralized vibration control of a voice coil motor-based stewart parallel mechanism: simulation and experiments + /paper/tang18_decen_vibrat_contr_voice_coil/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /paper/tang18_decen_vibrat_contr_voice_coil/ + Tags Stewart Platforms Reference (Jie Tang {\it et al.}, 2018) Author(s) Tang, J., Cao, D., &amp; Yu, T. Year 2018 Bibliography Tang, J., Cao, D., &amp; Yu, T., Decentralized vibration control of a voice coil motor-based stewart parallel mechanism: simulation and experiments, Proceedings of the Institution of Mechanical Engineers, Part C: Journal of Mechanical Engineering Science, 233(1), 132–145 (2018). http://dx.doi.org/10.1177/0954406218756941 ↩ + + + + Design for precision: current status and trends + /paper/schellekens98_desig_precis/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /paper/schellekens98_desig_precis/ + Tags Precision Engineering Reference (Schellekens {\it et al.}, 1998) Author(s) Schellekens, P., Rosielle, N., Vermeulen, H., Vermeulen, M., Wetzels, S., &amp; Pril, W. Year 1998 Bibliography Schellekens, P., Rosielle, N., Vermeulen, H., Vermeulen, M., Wetzels, S., &amp; Pril, W., Design for precision: current status and trends, Cirp Annals, (2), 557–586 (1998). http://dx.doi.org/10.1016/s0007-8506(07)63243-0 ↩ + + + + Design, modeling and control of nanopositioning systems + /book/fleming14_desig_model_contr_nanop_system/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /book/fleming14_desig_model_contr_nanop_system/ + Tags : + Reference (Andrew Fleming &amp; Kam Leang, 2014) Author(s) Fleming, A. J., &amp; Leang, K. K. Year 2014 Bibliography Fleming, A. J., &amp; Leang, K. K., Design, modeling and control of nanopositioning systems (2014), : Springer International Publishing. ↩ + + + + Dynamic modeling and decoupled control of a flexible stewart platform for vibration isolation + /paper/yang19_dynam_model_decoup_contr_flexib/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /paper/yang19_dynam_model_decoup_contr_flexib/ + Tags Stewart Platforms, Vibration Isolation, Flexible Joints, Cubic Architecture Reference (Yang {\it et al.}, 2019) Author(s) Yang, X., Wu, H., Chen, B., Kang, S., &amp; Cheng, S. Year 2019 Discusses: + flexible-rigid model of Stewart platform the impact of joint stiffness is compensated using a displacement sensor and a force sensor then the MIMO system is decoupled in modal space and 6 SISO controllers are applied for vibration isolation using force sensors The joint stiffness impose a limitation on the control performance using force sensors as it adds a zero at low frequency in the dynamics. + + + + Dynamic modeling and experimental analyses of stewart platform with flexible hinges + /paper/jiao18_dynam_model_exper_analy_stewar/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /paper/jiao18_dynam_model_exper_analy_stewar/ + Tags Stewart Platforms, Flexible Joints Reference (Jian Jiao {\it et al.}, 2018) Author(s) Jiao, J., Wu, Y., Yu, K., &amp; Zhao, R. Year 2018 Bibliography Jiao, J., Wu, Y., Yu, K., &amp; Zhao, R., Dynamic modeling and experimental analyses of stewart platform with flexible hinges, Journal of Vibration and Control, 25(1), 151–171 (2018). http://dx.doi.org/10.1177/1077546318772474 ↩ + + + + Electronics + /zettels/electronics/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /zettels/electronics/ + Tags : +&lt;./biblio/references.bib&gt; +Backlinks The art of electronics - third edition + + + + Estimating the resolution of nanopositioning systems from frequency domain data + /paper/fleming12_estim/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /paper/fleming12_estim/ + Tags : + Reference (Andrew Fleming, 2012) Author(s) Fleming, A. J. Year 2012 Bibliography Fleming, A. J., Estimating the resolution of nanopositioning systems from frequency domain data, In , 2012 IEEE International Conference on Robotics and Automation (pp. ) (2012). : . ↩ + + + + Flexible Joints + /zettels/flexible_joints/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /zettels/flexible_joints/ + Tags : +&lt;./biblio/references.bib&gt; +Backlinks A six-axis single-stage active vibration isolator based on stewart platform Nanometre-cutting machine using a stewart-platform parallel mechanism Dynamic modeling and experimental analyses of stewart platform with flexible hinges Dynamic modeling and decoupled control of a flexible stewart platform for vibration isolation Simultaneous, fault-tolerant vibration isolation and pointing control of flexure jointed hexapods Investigation on active vibration isolation of a stewart platform with piezoelectric actuators Identification and decoupling control of flexure jointed hexapods + + + + Force feedback versus acceleration feedback in active vibration isolation + /paper/preumont02_force_feedb_versus_accel_feedb/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /paper/preumont02_force_feedb_versus_accel_feedb/ + Tags Vibration Isolation Reference (Preumont {\it et al.}, 2002) Author(s) Preumont, A., A. Francois, Bossens, F., &amp; Abu-Hanieh, A. Year 2002 Summary: + Compares the force feedback and acceleration feedback for active damping The use of a force sensor always give alternating poles and zeros in the open-loop transfer function between for force actuator and the force sensor which guarantees the stability of the closed loop Acceleration feedback produces alternating poles and zeros only when the flexible structure is stiff compared to the isolation system The force applied to a rigid body is proportional to its acceleration, thus sensing the total interface force gives a measured of the absolute acceleration of the solid body. + + + + Force Sensors + /zettels/force_sensors/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /zettels/force_sensors/ + Tags : +Suppliers PCB link Dynamics and Noise of a piezoelectric force sensor An analysis the dynamics and noise of a piezoelectric force sensor is done in (Fleming, 2010) (Notes). +Bibliography Fleming, A., Nanopositioning system with force feedback for high-performance tracking and vibration control, IEEE/ASME Transactions on Mechatronics, 15(3), 433–447 (2010). http://dx.doi.org/10.1109/tmech.2009.2028422 ↩ + + + + Fundamental principles of engineering nanometrology + /book/leach14_fundam_princ_engin_nanom/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /book/leach14_fundam_princ_engin_nanom/ + Tags Metrology Reference (Richard Leach, 2014) Author(s) Leach, R. Year 2014 Measurement of angles Unit: + radian for plane angle steradian for solid angle \(1 rad \approx 55.3deg\) +Instrument principles: + subdivision: index tacle, angular gratings, polygons, &hellip; ratio of two lengths: angular interferometers, sin cars, small angle generators, &hellip; autocollimators with a flat mirror Sources of error in displacement interferometry Two error sources: + error sources that are proportional to the displacement being measured \(L\): cumulative errors error sources that are independent of the displacement being measured: non-cumulative errors Thermal expansion of the metrology frame Deadpath length Deadpath length, \(d\), is defined as the difference in distance in air between the reference and measurement reflectors and the beam splitter when the interferometer measurement is initiated. + + + + Guidelines for the selection of weighting functions for h-infinity control + /paper/bibel92_guidel_h/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /paper/bibel92_guidel_h/ + Tags H Infinity Control Reference (Bibel &amp; Malyevac, 1992) Author(s) Bibel, J. E., &amp; Malyevac, D. S. Year 1992 Properties of feedback control + Figure 1: Control System Diagram + From the figure 1, we have: +\begin{align*} y(s) &amp;= T(s) r(s) + S(s) d(s) - T(s) n(s)\\\ +e(s) &amp;= S(s) r(s) - S(s) d(s) - S(s) n(s)\\\ +u(s) &amp;= S(s)K(s) r(s) - S(s)K(s) d(s) - S(s)K(s) n(s) \end{align*} + + + + H Infinity Control + /zettels/h_infinity_control/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /zettels/h_infinity_control/ + Tags : +Nice Citations From Rosenbrock, H. H. (1974). Computer-Aided Control System Design, Academic Press, New York: + Solutions are constrained by so many requirements that it is virtually impossible to list them all. The designer finds himself threading a maze of such requirements, attempting to reconcile conflicting demands of cost, performance, easy maintenance, and so on. A good design usually has strong aesthetic appeal to those who are competent in the subject. + + + + HAC-HAC + /zettels/hac_hac/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /zettels/hac_hac/ + Tags : +High-Authority Control/Low-Authority Control +From (Andre Preumont, 2018): + The HAC/LAC approach consist of combining the two approached in a dual-loop control as shown in Figure 1. The inner loop uses a set of collocated actuator/sensor pairs for decentralized active damping with guaranteed stability ; the outer loop consists of a non-collocated HAC based on a model of the actively damped structure. This approach has the following advantages: + The active damping extends outside the bandwidth of the HAC and reduces the settling time of the modes which are outsite the bandwidth The active damping makes it easier to gain-stabilize the modes outside the bandwidth of the output loop (improved gain margin) The larger damping of the modes within the controller bandwidth makes them more robust to the parmetric uncertainty (improved phase margin) + + + + Identification and decoupling control of flexure jointed hexapods + /paper/chen00_ident_decoup_contr_flexur_joint_hexap/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /paper/chen00_ident_decoup_contr_flexur_joint_hexap/ + Tags Stewart Platforms, Flexible Joints Reference (Yixin Chen &amp; McInroy, 2000) Author(s) Chen, Y., &amp; McInroy, J. Year 2000 Bibliography Chen, Y., &amp; McInroy, J., Identification and decoupling control of flexure jointed hexapods, In , Proceedings 2000 ICRA. Millennium Conference. IEEE International Conference on Robotics and Automation. Symposia Proceedings (Cat. No.00CH37065) (pp. ) (2000). : . ↩ + + + + Implementation challenges for multivariable control: what you did not learn in school! + /paper/garg07_implem_chall_multiv_contr/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /paper/garg07_implem_chall_multiv_contr/ + Tags Multivariable Control Reference (Sanjay Garg, 2007) Author(s) Garg, S. Year 2007 Discusses: + When to use multivariable control and when not to? Two major issues with implementing multivariable control: gain scheduling and integrator wind up protection Inline simple gain and phase margin measured for SISO, &ldquo;robustness&rdquo; determination of multivariable control requires complex analyses using singular value techniques and Monte Carlo simulations. + When to use multivariable control: + + + + Inertial Sensors + /zettels/inertial_sensors/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /zettels/inertial_sensors/ + Tags Position Sensors Reviews (Collette {\it et al.}, 2012) Accelerometers Micromega Dynamics link MMF link PCB link Wireless Accelerometers + https://micromega-dynamics.com/products/recovib/miniature-vibration-recorder/ + Figure 1: Characteristics of commercially available accelerometers (Collette {it et al.}, 2011) + Geophones Sercel link Wilcoxon link + + + + Interferometric characterization of rotation stages for x-ray nanotomography + /paper/stankevic17_inter_charac_rotat_stages_x_ray_nanot/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /paper/stankevic17_inter_charac_rotat_stages_x_ray_nanot/ + Tags Nano Active Stabilization System, Positioning Stations Reference (Tomas Stankevic {\it et al.}, 2017) Author(s) Stankevic, T., Engblom, C., Langlois, F., Alves, F., Lestrade, A., Jobert, N., Cauchon, G., … Year 2017 Similar Station than the NASS Similar Metrology with fiber based interferometers and cylindrical reference mirror + Figure 1: Positioning Station + Thermal expansion: Stabilized down to \(5mK/h\) using passive water flow through the baseplate below the sample stage and in the interferometry reference frame. + + + + Investigation on active vibration isolation of a stewart platform with piezoelectric actuators + /paper/wang16_inves_activ_vibrat_isolat_stewar/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /paper/wang16_inves_activ_vibrat_isolat_stewar/ + Tags Stewart Platforms, Vibration Isolation, Flexible Joints Reference (Wang {\it et al.}, 2016) Author(s) Wang, C., Xie, X., Chen, Y., &amp; Zhang, Z. Year 2016 Model of the Stewart platform: + Struts are treated as flexible beams Payload and the base are treated as flexible plates The FRF synthesis method permits to derive FRFs of the Stewart platform The model is compared with a Finite Element model and is shown to give the same results. + + + + Measurement technologies for precision positioning + /paper/gao15_measur_techn_precis_posit/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /paper/gao15_measur_techn_precis_posit/ + Tags Position Sensors Reference (Gao {\it et al.}, 2015) Author(s) Gao, W., Kim, S., Bosse, H., Haitjema, H., Chen, Y., Lu, X., Knapp, W., … Year 2015 Bibliography Gao, W., Kim, S., Bosse, H., Haitjema, H., Chen, Y., Lu, X., Knapp, W., …, Measurement technologies for precision positioning, CIRP Annals, 64(2), 773–796 (2015). http://dx.doi.org/10.1016/j.cirp.2015.05.009 ↩ + + + + Metrology + /zettels/metrology/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /zettels/metrology/ + Tags : +&lt;./biblio/references.bib&gt; +Backlinks Fundamental principles of engineering nanometrology + + + + Modal testing: theory, practice and application + /book/ewins00_modal/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /book/ewins00_modal/ + Tags System Identification, Reference Books Reference (Ewins, 2000) Author(s) Ewins, D. Year 2000 Overview Introduction to Modal Testing The major objectives of modal testing are: + Determining the nature and extent of vibration response levels in operation Verifying theoretical models and predictions of the vibrations Measurement of the essential materials properties under dynamic loading, such as damping capacity, friction and fatigue endurance For many applications, vibrations is directly related to performance and it is important that the vibration levels are anticipated and brought under satisfactory control. + + + + Modeling and control of vibration in mechanical systems + /book/du10_model_contr_vibrat_mechan_system/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /book/du10_model_contr_vibrat_mechan_system/ + Tags Stewart Platforms, Vibration Isolation Reference (Chunling Du &amp; Lihua Xie, 2010) Author(s) Du, C., &amp; Xie, L. Year 2010 Read Chapter 1 and 3. +Bibliography Du, C., &amp; Xie, L., Modeling and control of vibration in mechanical systems (2010), : CRC Press. ↩ + + + + Motion Control + /zettels/motion_control/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /zettels/motion_control/ + Tags : +&lt;./biblio/references.bib&gt; +Backlinks Advanced motion control for precision mechatronics: control, identification, and learning of complex systems + + + + Multi-stage actuation systems and control + /book/du19_multi_actuat_system_contr/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /book/du19_multi_actuat_system_contr/ + Tags : + Reference (Chunling Du &amp; Chee Khiang Pang, 2019) Author(s) Du, C., &amp; Pang, C. K. Year 2019 Mechanical Actuation Systems Introduction When high bandwidth, high position accuracy and long stroke are required simultaneously: dual-stage systems composed of a coarse (or primary) actuator and a fine actuator working together are used. +Popular choices for coarse actuator are: + DC motor Voice coil motor (VCM) Permanent magnet stepper motor Permanent magnet linear synchronous motor As fine actuators, most of the time piezoelectric actuator are used. + + + + Multivariable Control + /zettels/multivariable_control/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /zettels/multivariable_control/ + Tags : +&lt;./biblio/references.bib&gt; +Backlinks Position control in lithographic equipment Implementation challenges for multivariable control: what you did not learn in school! Simultaneous, fault-tolerant vibration isolation and pointing control of flexure jointed hexapods Multivariable control systems: an engineering approach Multivariable feedback control: analysis and design + + + + Multivariable control systems: an engineering approach + /book/albertos04_multiv_contr_system/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /book/albertos04_multiv_contr_system/ + Tags Multivariable Control Reference (Albertos &amp; Antonio, 2004) Author(s) Albertos, P., &amp; Antonio, S. Year 2004 Bibliography Albertos, P., &amp; Antonio, S., Multivariable control systems: an engineering approach (2004), : Springer-Verlag. ↩ + + + + Multivariable feedback control: analysis and design + /book/skogestad07_multiv_feedb_contr/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /book/skogestad07_multiv_feedb_contr/ + Tags Reference Books, Multivariable Control Reference (Skogestad &amp; Postlethwaite, 2007) Author(s) Skogestad, S., &amp; Postlethwaite, I. Year 2007 \( % H Infini \newcommand{\hinf}{\mathcal{H}_\infty} % H 2 \newcommand{\htwo}{\mathcal{H}_2} % Omega \newcommand{\w}{\omega} % H-Infinity Norm \newcommand{\hnorm}[1]{\left\|#1\right\|_{\infty}} % H-2 Norm \newcommand{\normtwo}[1]{\left\|#1\right\|_{2}} % Norm \newcommand{\norm}[1]{\left\|#1\right\|} % Absolute value \newcommand{\abs}[1]{\left\lvert#1\right\lvert} % Maximum for all omega \newcommand{\maxw}{\text{max}_{\omega}} % Maximum singular value \newcommand{\maxsv}{\overline{\sigma}} % Minimum singular value \newcommand{\minsv}{\underline{\sigma}} % Under bar \newcommand{\ubar}[1]{\text{\b{$#1$}}} % Diag keyword \newcommand{\diag}[1]{\text{diag}\{{#1}\}} % Vector \newcommand{\colvec}[1]{\begin{bmatrix}#1\end{bmatrix}} \) \( \newcommand{\tcmbox}[1]{\boxed{#1}} % Simulate SIunitx \newcommand{\SI}[2]{#1\,#2} \newcommand{\ang}[1]{#1^{\circ}} \newcommand{\degree}{^{\circ}} \newcommand{\radian}{\text{rad}} \newcommand{\percent}{\%} \newcommand{\decibel}{\text{dB}} \newcommand{\per}{/} % Bug with subequations \newcommand{\eatLabel}[2]{} \newenvironment{subequations}{\eatLabel}{} \) Introduction + + + + Nano Active Stabilization System + /zettels/nano_active_stabilization_system/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /zettels/nano_active_stabilization_system/ + Tags : +&lt;./biblio/references.bib&gt; +Backlinks Interferometric characterization of rotation stages for x-ray nanotomography Automated markerless full field hard x-ray microscopic tomography at sub-50 nm 3-dimension spatial resolution An instrument for 3d x-ray nano-imaging + + + + Nanometre-cutting machine using a stewart-platform parallel mechanism + /paper/furutani04_nanom_cuttin_machin_using_stewar/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /paper/furutani04_nanom_cuttin_machin_using_stewar/ + Tags Stewart Platforms, Flexible Joints Reference (Katsushi Furutani {\it et al.}, 2004) Author(s) Furutani, K., Suzuki, M., &amp; Kudoh, R. Year 2004 Lever mechanism to amplify the motion of piezoelectric stack actuators Use of flexure joints Eddy current displacement sensors for control (decentralized) Isotropic performance (cubic configuration even if not said so) Possible sources of error: + position error of the link ends in assembly =&gt; simulation of position error and it is not significant Inaccurate modelling of the links insufficient generative force unwanted deformation of the links To minimize the errors, a calibration is done between the required leg length and the wanted platform pose. + + + + Nanopositioning system with force feedback for high-performance tracking and vibration control + /paper/fleming10_nanop_system_with_force_feedb/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /paper/fleming10_nanop_system_with_force_feedb/ + Tags Sensor Fusion, Force Sensors Reference (Fleming, 2010) Author(s) Fleming, A. Year 2010 Summary: + The noise generated by a piezoelectric force sensor is much less than a capacitive sensor Dynamical model of a piezoelectric stack actuator and piezoelectric force sensor Noise of a piezoelectric force sensor IFF with a piezoelectric stack actuator and piezoelectric force sensor A force sensor is used as a displacement sensor below the frequency of the first zero Sensor fusion architecture with a capacitive sensor and a force sensor and using complementary filters Virtual sensor fusion architecture (called low-frequency bypass) Analog implementation of the control strategies to avoid quantization noise, finite resolution and sampling delay Model of a multi-layer monolithic piezoelectric stack actuator + + + + Nanopositioning with multiple sensors: a case study in data storage + /paper/sebastian12_nanop_with_multip_sensor/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /paper/sebastian12_nanop_with_multip_sensor/ + Tags Sensor Fusion Reference (Abu Sebastian &amp; Angeliki Pantazi, 2012) Author(s) Sebastian, A., &amp; Pantazi, A. Year 2012 Bibliography Sebastian, A., &amp; Pantazi, A., Nanopositioning with multiple sensors: a case study in data storage, IEEE Transactions on Control Systems Technology, 20(2), 382–394 (2012). http://dx.doi.org/10.1109/tcst.2011.2177982 ↩ + + + + Parallel robots : mechanics and control + /book/taghirad13_paral/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /book/taghirad13_paral/ + Tags Stewart Platforms, Reference Books Reference (Taghirad, 2013) Author(s) Taghirad, H. Year 2013 Introduction +This book is intended to give some analysis and design tools for the increase number of engineers and researchers who are interested in the design and implementation of parallel robots. A systematic approach is presented to analyze the kinematics, dynamics and control of parallel robots. To define the motion characteristics of such robots, it is necessary to represent 3D motion of the robot moving platform with respect to a fixed coordinate. + + + + Position control in lithographic equipment + /paper/butler11_posit_contr_lithog_equip/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /paper/butler11_posit_contr_lithog_equip/ + Tags Multivariable Control, Positioning Stations Reference (Hans Butler, 2011) Author(s) Butler, H. Year 2011 Bibliography Butler, H., Position control in lithographic equipment, IEEE Control Systems, 31(5), 28–47 (2011). http://dx.doi.org/10.1109/mcs.2011.941882 ↩ + + + + Position Sensors + /zettels/position_sensors/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /zettels/position_sensors/ + Tags Inertial Sensors Reviews of position sensors (Collette {\it et al.}, 2012) Fleming, A. J., A review of nanometer resolution position sensors: operation and performance (Andrew Fleming, 2013) (Notes) Relative Position Sensors +Table 1: Characteristics of relative measurement sensors collette11_review Technology Frequency Resolution Range T Range LVDT DC-200 Hz 10 nm rms 1-10 mm -50,100 °C Eddy current 5 kHz 0. + + + + Positioning Stations + /zettels/positioning_stations/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /zettels/positioning_stations/ + Tags : +&lt;./biblio/references.bib&gt; +Backlinks Interferometric characterization of rotation stages for x-ray nanotomography Position control in lithographic equipment An instrument for 3d x-ray nano-imaging + + + + Precision Engineering + /zettels/precision_engineering/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /zettels/precision_engineering/ + Tags : +&lt;./biblio/references.bib&gt; +Backlinks Design for precision: current status and trends Basics of precision engineering - 1st edition + + + + Reference Books + /zettels/reference_books/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /zettels/reference_books/ + Tags : +&lt;./biblio/references.bib&gt; +Backlinks Modal testing: theory, practice and application The art of electronics - third edition Vibration Control of Active Structures - Fourth Edition Parallel robots : mechanics and control The design of high performance mechatronics - 2nd revised edition Multivariable feedback control: analysis and design + + + + Review of active vibration isolation strategies + /paper/collette11_review_activ_vibrat_isolat_strat/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /paper/collette11_review_activ_vibrat_isolat_strat/ + Tags Vibration Isolation Reference (Christophe Collette {\it et al.}, 2011) Author(s) Collette, C., Janssens, S., &amp; Artoos, K. Year 2011 Background and Motivations Passive Isolation Tradeoffs \[ X(s) = \underbrace{\frac{cs + k}{ms^2 + cs + k}}_{T_{wx}(s)} W(s) + \underbrace{\frac{1}{ms^2 + cs + k}}_{T_{Fx}(s)} F(s) \] + \(T_{wx}(s)\) is called the transmissibility of the isolator. It characterize the way seismic vibrations \(w\) are transmitted to the equipment. \(T_{Fx}(s)\) is called the compliance. + + + + Search Results + /search/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /search/ + This file exists solely to respond to /search URL with the related search layout template. +No content shown here is rendered, all content is based in the template layouts/page/search.html +Setting a very low sitemap priority will tell search engines this is not important content. +This implementation uses Fusejs, jquery and mark.js +Initial setup Search depends on additional output content type of JSON in config.toml ``` [outputs] home = [&ldquo;HTML&rdquo;, &ldquo;JSON&rdquo;] ``` + + + + Sensor Fusion + /zettels/sensor_fusion/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /zettels/sensor_fusion/ + Tags : +&lt;./biblio/references.bib&gt; +Backlinks Sensor fusion for active vibration isolation in precision equipment Vibration control of flexible structures using fusion of inertial sensors and hyper-stable actuator-sensor pairs Sensor fusion methods for high performance active vibration isolation systems Nanopositioning system with force feedback for high-performance tracking and vibration control Nanopositioning with multiple sensors: a case study in data storage + + + + Sensor fusion for active vibration isolation in precision equipment + /paper/tjepkema12_sensor_fusion_activ_vibrat_isolat_precis_equip/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /paper/tjepkema12_sensor_fusion_activ_vibrat_isolat_precis_equip/ + Tags Sensor Fusion, Vibration Isolation Reference (Tjepkema {\it et al.}, 2012) Author(s) Tjepkema, D., Dijk, J. v., &amp; Soemers, H. Year 2012 Relative motion Control Control law: \(f = -G(x-w)\) +\[ \frac{x}{w} = \frac{k+G}{ms^2 + k+G} \] \[ \frac{x}{F} = \frac{1}{ms^2 + k+G} \] +Force Control Control law: \(f = -G F_a = -G \left(f-k(x-w)\right)\) +\[ \frac{x}{w} = \frac{k}{(1+G)ms^2 + k} \] \[ \frac{x}{F} = \frac{1+G}{(1+G)ms^2 + k} \] + + + + Sensor fusion methods for high performance active vibration isolation systems + /paper/collette15_sensor_fusion_method_high_perfor/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /paper/collette15_sensor_fusion_method_high_perfor/ + Tags Sensor Fusion, Vibration Isolation Reference (Collette &amp; Matichard, 2015) Author(s) Collette, C., &amp; Matichard, F. Year 2015 In order to have good stability margins, it is common practice to collocate sensors and actuators. This ensures alternating poles and zeros along the imaginary axis. Then, each phase lag introduced by the poles is compensed by phase leag introduced by the zeroes. This guarantees stability and such system is referred to as hyperstable. + + + + Sensors and control of a space-based six-axis vibration isolation system + /paper/hauge04_sensor_contr_space_based_six/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /paper/hauge04_sensor_contr_space_based_six/ + Tags Stewart Platforms, Vibration Isolation, Cubic Architecture Reference (Hauge &amp; Campbell, 2004) Author(s) Hauge, G., &amp; Campbell, M. Year 2004 Discusses: + Choice of sensors and control architecture Predictability and limitations of the system dynamics Two-Sensor control architecture Vibration isolation using a Stewart platform Experimental comparison of Force sensor and Inertial Sensor and associated control architecture for vibration isolation + Figure 1: Hexapod for active vibration isolation + + + + Simultaneous vibration isolation and pointing control of flexure jointed hexapods + /paper/li01_simul_vibrat_isolat_point_contr/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /paper/li01_simul_vibrat_isolat_point_contr/ + Tags Stewart Platforms, Vibration Isolation Reference (Xiaochun Li {\it et al.}, 2001) Author(s) Li, X., Hamann, J. C., &amp; McInroy, J. E. Year 2001 if the hexapod is designed such that the payload mass/inertia matrix (\(M_x\)) and \(J^T J\) are diagonal, the dynamics from \(u\) to \(y\) are decoupled. Bibliography Li, X., Hamann, J. C., &amp; McInroy, J. E., Simultaneous vibration isolation and pointing control of flexure jointed hexapods, In , Smart Structures and Materials 2001: Smart Structures and Integrated Systems (pp. + + + + Simultaneous, fault-tolerant vibration isolation and pointing control of flexure jointed hexapods + /paper/li01_simul_fault_vibrat_isolat_point/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /paper/li01_simul_fault_vibrat_isolat_point/ + Tags Stewart Platforms, Vibration Isolation, Cubic Architecture, Flexible Joints, Multivariable Control Reference @phdthesis{li01_simul_fault_vibrat_isolat_point, author = {Li, Xiaochun}, school = {University of Wyoming}, title = {Simultaneous, Fault-tolerant Vibration Isolation and Pointing Control of Flexure Jointed Hexapods}, year = 2001, tags = {parallel robot}, } Author(s) Li, X. Year 2001 Introduction Stewart Platform: + Cubic (mutually orthogonal) Flexure Joints =&gt; eliminate friction and backlash but add complexity to the dynamics + + + + Six dof active vibration control using stewart platform with non-cubic configuration + /paper/zhang11_six_dof/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /paper/zhang11_six_dof/ + Tags Stewart Platforms, Vibration Isolation Reference (Zhen Zhang {\it et al.}, 2011) Author(s) Zhang, Z., Liu, J., Mao, J., Guo, Y., &amp; Ma, Y. Year 2011 Non-cubic stewart platform Flexible joints Magnetostrictive actuators Strong coupled motions along different axes Non-cubic architecture =&gt; permits to have larger workspace which was required Structure parameters (radius of plates, length of struts) are determined by optimization of the condition number of the Jacobian matrix Accelerometers for active isolation Adaptive FIR filters for active isolation control + + + + Stewart Platforms + /zettels/stewart_platforms/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /zettels/stewart_platforms/ + Tags : +&lt;./biblio/references.bib&gt; +Backlinks Six dof active vibration control using stewart platform with non-cubic configuration Decentralized vibration control of a voice coil motor-based stewart parallel mechanism: simulation and experiments Dynamic modeling and decoupled control of a flexible stewart platform for vibration isolation Parallel robots : mechanics and control Investigation on active vibration isolation of a stewart platform with piezoelectric actuators Identification and decoupling control of flexure jointed hexapods The stewart platform manipulator: a review Modeling and control of vibration in mechanical systems Studies on stewart platform manipulator: a review Nanometre-cutting machine using a stewart-platform parallel mechanism An intelligent control system for multiple degree-of-freedom vibration isolation Active isolation and damping of vibrations via stewart platform Sensors and control of a space-based six-axis vibration isolation system Dynamic modeling and experimental analyses of stewart platform with flexible hinges Simultaneous, fault-tolerant vibration isolation and pointing control of flexure jointed hexapods A new isotropic and decoupled 6-dof parallel manipulator Simultaneous vibration isolation and pointing control of flexure jointed hexapods A six-axis single-stage active vibration isolator based on stewart platform Vibration Control of Active Structures - Fourth Edition A soft 6-axis active vibration isolator + + + + Studies on stewart platform manipulator: a review + /paper/furqan17_studies_stewar_platf_manip/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /paper/furqan17_studies_stewar_platf_manip/ + Tags Stewart Platforms Reference (Mohd Furqan {\it et al.}, 2017) Author(s) Furqan, M., Suhaib, M., &amp; Ahmad, N. Year 2017 Lots of references. +Bibliography Furqan, M., Suhaib, M., &amp; Ahmad, N., Studies on stewart platform manipulator: a review, Journal of Mechanical Science and Technology, 31(9), 4459–4470 (2017). http://dx.doi.org/10.1007/s12206-017-0846-1 ↩ + + + + System Identification + /zettels/system_identification/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /zettels/system_identification/ + Tags : +&lt;./biblio/references.bib&gt; +Backlinks Modal testing: theory, practice and application + + + + Test File + /zettels/test/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /zettels/test/ + This is a quote! + 1 2 a = 2; figure; This is an important part of the text. + See Eq. eq:test1 and eq:test2. +\begin{equation} a = 1 \end{equation} +\begin{equation} a = 2 \label{eq:test2} \end{equation} +Also look at 1 \eqref{eq:test2}. +Some text. +Some text. +Some text. +Some text. +Some text. +Some text. +Some text. +Some text. +Some text. +Some text. +Some text. +Some text. + + + + The art of electronics - third edition + /book/horowitz15_art_of_elect_third_edition/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /book/horowitz15_art_of_elect_third_edition/ + Tags Reference Books, Electronics Reference (Horowitz, 2015) Author(s) Horowitz, P. Year 2015 Bibliography Horowitz, P., The art of electronics - third edition (2015), New York, NY, USA: Cambridge University Press. ↩ + + + + The design of high performance mechatronics - 2nd revised edition + /book/schmidt14_desig_high_perfor_mechat_revis_edition/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /book/schmidt14_desig_high_perfor_mechat_revis_edition/ + Tags Reference Books Reference (Schmidt {\it et al.}, 2014) Author(s) Schmidt, R. M., Schitter, G., &amp; Rankers, A. Year 2014 Section 2.2 Mechanics + The core of a mechatronic system is its mechanical construction and in spite of many decade of excellent designs, optimizing the mechanical structure in strength, mass and endurance, the mechanical behavior will always remain the limiting factor of the performance of any mechatronic system. + + + + The stewart platform manipulator: a review + /paper/dasgupta00_stewar_platf_manip/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /paper/dasgupta00_stewar_platf_manip/ + Tags Stewart Platforms Reference (Bhaskar Dasgupta &amp; Mruthyunjaya, 2000) Author(s) Dasgupta, B., &amp; Mruthyunjaya, T. Year 2000 +Table 1: Parallel VS serial manipulators Advantages Disadvantages Serial Manoeuverability Poor precision Large workspace Bends under high load Vibrate at high speed Parallel High stiffness Small workspace Good dynamic performances Precise positioning The generalized Stewart platforms consists of two rigid bodies (referred to as the base and the platoform) connected through six extensible legs, each with sherical joints at both ends. + + + + Vibration Control of Active Structures - Fourth Edition + /book/preumont18_vibrat_contr_activ_struc_fourt_edition/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /book/preumont18_vibrat_contr_activ_struc_fourt_edition/ + Tags Vibration Isolation, Reference Books, Stewart Platforms, HAC-HAC Reference (Andre Preumont, 2018) Author(s) Preumont, A. Year 2018 Introduction Active Versus Passive Active structure may be cheaper or lighter than passive structures of comparable performances; or they may offer performances that no passive structure could offer. +Active is not always better, and a control systems cannot compensate for a bad design. Active solution should be considered only after all other passive means have been exhausted. + + + + Vibration control of flexible structures using fusion of inertial sensors and hyper-stable actuator-sensor pairs + /paper/collette14_vibrat/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /paper/collette14_vibrat/ + Tags Vibration Isolation, Sensor Fusion Reference (Collette &amp; Matichard, 2014) Author(s) Collette, C., &amp; Matichard, F. Year 2014 Introduction Sensor fusion is used to combine the benefits of different types of sensors: + Relative sensor for DC positioning capability at low frequency Inertial sensors for isolation at high frequency Force sensor / collocated sensor to improve the robustness Different types of sensors In this paper, three types of sensors are used. + + + + Vibration Isolation + /zettels/vibration_isolation/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /zettels/vibration_isolation/ + Tags : +&lt;./biblio/references.bib&gt; +Backlinks Six dof active vibration control using stewart platform with non-cubic configuration Dynamic modeling and decoupled control of a flexible stewart platform for vibration isolation Investigation on active vibration isolation of a stewart platform with piezoelectric actuators Review of active vibration isolation strategies Vibration control of flexible structures using fusion of inertial sensors and hyper-stable actuator-sensor pairs Sensor fusion methods for high performance active vibration isolation systems Modeling and control of vibration in mechanical systems An intelligent control system for multiple degree-of-freedom vibration isolation Active isolation and damping of vibrations via stewart platform Sensors and control of a space-based six-axis vibration isolation system Comparison and classification of high-precision actuators based on stiffness influencing vibration isolation Simultaneous, fault-tolerant vibration isolation and pointing control of flexure jointed hexapods Simultaneous vibration isolation and pointing control of flexure jointed hexapods An exploration of active hard mount vibration isolation for precision equipment Force feedback versus acceleration feedback in active vibration isolation A six-axis single-stage active vibration isolator based on stewart platform Vibration Control of Active Structures - Fourth Edition A soft 6-axis active vibration isolator Sensor fusion for active vibration isolation in precision equipment + + + + \ No newline at end of file diff --git a/public/js/main.4bada4f824623eea2eb7cfd5cf8c1d99c3dd797297e7e8cbc59a41da450bb334.js b/public/js/main.4bada4f824623eea2eb7cfd5cf8c1d99c3dd797297e7e8cbc59a41da450bb334.js new file mode 100644 index 0000000..15e4fe4 --- /dev/null +++ b/public/js/main.4bada4f824623eea2eb7cfd5cf8c1d99c3dd797297e7e8cbc59a41da450bb334.js @@ -0,0 +1,283 @@ +'use strict'; + +const Even = {}; + +Even.backToTop = function() { + const $backToTop = $('#back-to-top'); + + $(window).scroll(function() { + if ($(window).scrollTop() > 100) { + $backToTop.fadeIn(1000); + } else { + $backToTop.fadeOut(1000); + } + }); + + $backToTop.click(function() { + $('body,html').animate({scrollTop: 0}); + }); +}; + +Even.mobileNavbar = function() { + const $mobileNav = $('#mobile-navbar'); + const $mobileNavIcon = $('.mobile-navbar-icon'); + const slideout = new Slideout({ + 'panel': document.getElementById('mobile-panel'), + 'menu': document.getElementById('mobile-menu'), + 'padding': 180, + 'tolerance': 70, + }); + slideout.disableTouch(); + + $mobileNavIcon.click(function() { + slideout.toggle(); + }); + + slideout.on('beforeopen', function() { + $mobileNav.addClass('fixed-open'); + $mobileNavIcon.addClass('icon-click').removeClass('icon-out'); + }); + + slideout.on('beforeclose', function() { + $mobileNav.removeClass('fixed-open'); + $mobileNavIcon.addClass('icon-out').removeClass('icon-click'); + }); + + $('#mobile-panel').on('touchend', function() { + slideout.isOpen() && $mobileNavIcon.click(); + }); +}; + +Even._initToc = function() { + const SPACING = 20; + const $toc = $('.post-toc'); + const $footer = $('.post-footer'); + + if ($toc.length) { + const minScrollTop = $toc.offset().top - SPACING; + const maxScrollTop = $footer.offset().top - $toc.height() - SPACING; + + const tocState = { + start: { + 'position': 'absolute', + 'top': minScrollTop, + }, + process: { + 'position': 'fixed', + 'top': SPACING, + }, + end: { + 'position': 'absolute', + 'top': maxScrollTop, + }, + }; + + $(window).scroll(function() { + const scrollTop = $(window).scrollTop(); + + if (scrollTop < minScrollTop) { + $toc.css(tocState.start); + } else if (scrollTop > maxScrollTop) { + $toc.css(tocState.end); + } else { + $toc.css(tocState.process); + } + }); + } + + const HEADERFIX = 30; + const $toclink = $('.toc-link'); + const $headerlink = $('.headerlink'); + const $tocLinkLis = $('.post-toc-content li'); + + const headerlinkTop = $.map($headerlink, function(link) { + return $(link).offset().top; + }); + + const headerLinksOffsetForSearch = $.map(headerlinkTop, function(offset) { + return offset - HEADERFIX; + }); + + const searchActiveTocIndex = function(array, target) { + for (let i = 0; i < array.length - 1; i++) { + if (target > array[i] && target <= array[i + 1]) return i; + } + if (target > array[array.length - 1]) return array.length - 1; + return -1; + }; + + $(window).scroll(function() { + const scrollTop = $(window).scrollTop(); + const activeTocIndex = searchActiveTocIndex(headerLinksOffsetForSearch, scrollTop); + + $($toclink).removeClass('active'); + $($tocLinkLis).removeClass('has-active'); + + if (activeTocIndex !== -1) { + $($toclink[activeTocIndex]).addClass('active'); + let ancestor = $toclink[activeTocIndex].parentNode; + while (ancestor.tagName !== 'NAV') { + $(ancestor).addClass('has-active'); + ancestor = ancestor.parentNode.parentNode; + } + } + }); +}; + +Even.highlight = function() { + const blocks = document.querySelectorAll('pre code'); + for (let i = 0; i < blocks.length; i++) { + const block = blocks[i]; + const rootElement = block.parentElement; + const lineCodes = block.innerHTML.split(/\n/); + if (lineCodes[lineCodes.length - 1] === '') lineCodes.pop(); + const lineLength = lineCodes.length; + + let codeLineHtml = ''; + for (let i = 0; i < lineLength; i++) { + codeLineHtml += `
${i + 1}
`; + } + + let codeHtml = ''; + for (let i = 0; i < lineLength; i++) { + codeHtml += `
${lineCodes[i]}
`; + } + + block.className += ' highlight'; + const figure = document.createElement('figure'); + figure.className = block.className; + figure.innerHTML = `
${codeLineHtml}
${codeHtml}
`; + + rootElement.parentElement.replaceChild(figure, rootElement); + } +}; + +Even.chroma = function() { + const blocks = document.querySelectorAll('.highlight > .chroma'); + for (let i = 0; i < blocks.length; i++) { + const block = blocks[i]; + const afterHighLight = block.querySelector('pre.chroma > code[data-lang]'); + const lang = afterHighLight ? afterHighLight.className : ''; + block.className += ' ' + lang; + } +}; + +Even.toc = function() { + const tocContainer = document.getElementById('post-toc'); + if (tocContainer !== null) { + const toc = document.getElementById('TableOfContents'); + if (toc === null) { + // toc = true, but there are no headings + tocContainer.parentNode.removeChild(tocContainer); + } else { + this._refactorToc(toc); + this._linkToc(); + this._initToc(); + } + } +}; + +Even._refactorToc = function(toc) { + // when headings do not start with `h1` + const oldTocList = toc.children[0]; + let newTocList = oldTocList; + let temp; + while (newTocList.children.length === 1 + && (temp = newTocList.children[0].children[0]).tagName === 'UL') { + newTocList = temp; + } + + if (newTocList !== oldTocList) toc.replaceChild(newTocList, oldTocList); +}; + +Even._linkToc = function() { + const links = document.querySelectorAll('#TableOfContents a:first-child'); + for (let i = 0; i < links.length; i++) links[i].className += ' toc-link'; + + for (let num = 1; num <= 6; num++) { + const headers = document.querySelectorAll('.post-content>h' + num); + for (let i = 0; i < headers.length; i++) { + const header = headers[i]; + header.innerHTML = `${header.innerHTML}`; + } + } +}; + +Even.flowchart = function() { + if (!window.flowchart) return; + + const blocks = document.querySelectorAll('pre code.language-flowchart, pre code.language-flow'); + for (let i = 0; i < blocks.length; i++) { + if (!window.hljs && i % 2 === 0) continue; + + const block = blocks[i]; + const rootElement = window.hljs + ? block.parentElement + : block.parentElement.parentElement.parentElement.parentElement.parentElement.parentElement.parentElement; + + const container = document.createElement('div'); + const id = `js-flowchart-diagrams-${i}`; + container.id = id; + container.className = 'align-center'; + rootElement.parentElement.replaceChild(container, rootElement); + + const diagram = flowchart.parse(block.childNodes[0].nodeValue); + diagram.drawSVG(id, window.flowchartDiagramsOptions ? window.flowchartDiagramsOptions : {}); + } +}; + +Even.sequence = function() { + if (!window.Diagram) return; + + const blocks = document.querySelectorAll('pre code.language-sequence'); + for (let i = 0; i < blocks.length; i++) { + if (!window.hljs && i % 2 === 0) continue; + + const block = blocks[i]; + const rootElement = window.hljs + ? block.parentElement + : block.parentElement.parentElement.parentElement.parentElement.parentElement.parentElement.parentElement; + + const container = document.createElement('div'); + const id = `js-sequence-diagrams-${i}`; + container.id = id; + container.className = 'align-center'; + rootElement.parentElement.replaceChild(container, rootElement); + + const diagram = Diagram.parse(block.childNodes[0].nodeValue); + diagram.drawSVG(id, window.sequenceDiagramsOptions + ? window.sequenceDiagramsOptions + : {theme: 'simple'}); + } +}; + +Even.responsiveTable = function() { + const tables = document.querySelectorAll('.post-content > table'); + for (let i = 0; i < tables.length; i++) { + const table = tables[i]; + const wrapper = document.createElement('div'); + wrapper.className = 'table-wrapper'; + table.parentElement.replaceChild(wrapper, table); + wrapper.appendChild(table); + } +}; + + +; +$(document).ready(function () { + Even.backToTop(); + Even.mobileNavbar(); + Even.toc(); +}); + +Even.responsiveTable(); +Even.flowchart(); +Even.sequence(); + +if (window.hljs) { + hljs.initHighlighting(); + Even.highlight(); +} else { + Even.chroma(); +} + diff --git a/public/lib/highlight/highlight.pack.js b/public/lib/highlight/highlight.pack.js new file mode 100644 index 0000000..f688617 --- /dev/null +++ b/public/lib/highlight/highlight.pack.js @@ -0,0 +1,2 @@ +/*! highlight.js v9.12.0 | BSD3 License | git.io/hljslicense */ +!function(e){var n="object"==typeof window&&window||"object"==typeof self&&self;"undefined"!=typeof exports?e(exports):n&&(n.hljs=e({}),"function"==typeof define&&define.amd&&define([],function(){return n.hljs}))}(function(e){function n(e){return e.replace(/&/g,"&").replace(//g,">")}function t(e){return e.nodeName.toLowerCase()}function r(e,n){var t=e&&e.exec(n);return t&&0===t.index}function a(e){return k.test(e)}function i(e){var n,t,r,i,o=e.className+" ";if(o+=e.parentNode?e.parentNode.className:"",t=B.exec(o))return w(t[1])?t[1]:"no-highlight";for(o=o.split(/\s+/),n=0,r=o.length;r>n;n++)if(i=o[n],a(i)||w(i))return i}function o(e){var n,t={},r=Array.prototype.slice.call(arguments,1);for(n in e)t[n]=e[n];return r.forEach(function(e){for(n in e)t[n]=e[n]}),t}function u(e){var n=[];return function r(e,a){for(var i=e.firstChild;i;i=i.nextSibling)3===i.nodeType?a+=i.nodeValue.length:1===i.nodeType&&(n.push({event:"start",offset:a,node:i}),a=r(i,a),t(i).match(/br|hr|img|input/)||n.push({event:"stop",offset:a,node:i}));return a}(e,0),n}function c(e,r,a){function i(){return e.length&&r.length?e[0].offset!==r[0].offset?e[0].offset"}function u(e){s+=""}function c(e){("start"===e.event?o:u)(e.node)}for(var l=0,s="",f=[];e.length||r.length;){var g=i();if(s+=n(a.substring(l,g[0].offset)),l=g[0].offset,g===e){f.reverse().forEach(u);do c(g.splice(0,1)[0]),g=i();while(g===e&&g.length&&g[0].offset===l);f.reverse().forEach(o)}else"start"===g[0].event?f.push(g[0].node):f.pop(),c(g.splice(0,1)[0])}return s+n(a.substr(l))}function l(e){return e.v&&!e.cached_variants&&(e.cached_variants=e.v.map(function(n){return o(e,{v:null},n)})),e.cached_variants||e.eW&&[o(e)]||[e]}function s(e){function n(e){return e&&e.source||e}function t(t,r){return new RegExp(n(t),"m"+(e.cI?"i":"")+(r?"g":""))}function r(a,i){if(!a.compiled){if(a.compiled=!0,a.k=a.k||a.bK,a.k){var o={},u=function(n,t){e.cI&&(t=t.toLowerCase()),t.split(" ").forEach(function(e){var t=e.split("|");o[t[0]]=[n,t[1]?Number(t[1]):1]})};"string"==typeof a.k?u("keyword",a.k):x(a.k).forEach(function(e){u(e,a.k[e])}),a.k=o}a.lR=t(a.l||/\w+/,!0),i&&(a.bK&&(a.b="\\b("+a.bK.split(" ").join("|")+")\\b"),a.b||(a.b=/\B|\b/),a.bR=t(a.b),a.e||a.eW||(a.e=/\B|\b/),a.e&&(a.eR=t(a.e)),a.tE=n(a.e)||"",a.eW&&i.tE&&(a.tE+=(a.e?"|":"")+i.tE)),a.i&&(a.iR=t(a.i)),null==a.r&&(a.r=1),a.c||(a.c=[]),a.c=Array.prototype.concat.apply([],a.c.map(function(e){return l("self"===e?a:e)})),a.c.forEach(function(e){r(e,a)}),a.starts&&r(a.starts,i);var c=a.c.map(function(e){return e.bK?"\\.?("+e.b+")\\.?":e.b}).concat([a.tE,a.i]).map(n).filter(Boolean);a.t=c.length?t(c.join("|"),!0):{exec:function(){return null}}}}r(e)}function f(e,t,a,i){function o(e,n){var t,a;for(t=0,a=n.c.length;a>t;t++)if(r(n.c[t].bR,e))return n.c[t]}function u(e,n){if(r(e.eR,n)){for(;e.endsParent&&e.parent;)e=e.parent;return e}return e.eW?u(e.parent,n):void 0}function c(e,n){return!a&&r(n.iR,e)}function l(e,n){var t=N.cI?n[0].toLowerCase():n[0];return e.k.hasOwnProperty(t)&&e.k[t]}function p(e,n,t,r){var a=r?"":I.classPrefix,i='',i+n+o}function h(){var e,t,r,a;if(!E.k)return n(k);for(a="",t=0,E.lR.lastIndex=0,r=E.lR.exec(k);r;)a+=n(k.substring(t,r.index)),e=l(E,r),e?(B+=e[1],a+=p(e[0],n(r[0]))):a+=n(r[0]),t=E.lR.lastIndex,r=E.lR.exec(k);return a+n(k.substr(t))}function d(){var e="string"==typeof E.sL;if(e&&!y[E.sL])return n(k);var t=e?f(E.sL,k,!0,x[E.sL]):g(k,E.sL.length?E.sL:void 0);return E.r>0&&(B+=t.r),e&&(x[E.sL]=t.top),p(t.language,t.value,!1,!0)}function b(){L+=null!=E.sL?d():h(),k=""}function v(e){L+=e.cN?p(e.cN,"",!0):"",E=Object.create(e,{parent:{value:E}})}function m(e,n){if(k+=e,null==n)return b(),0;var t=o(n,E);if(t)return t.skip?k+=n:(t.eB&&(k+=n),b(),t.rB||t.eB||(k=n)),v(t,n),t.rB?0:n.length;var r=u(E,n);if(r){var a=E;a.skip?k+=n:(a.rE||a.eE||(k+=n),b(),a.eE&&(k=n));do E.cN&&(L+=C),E.skip||(B+=E.r),E=E.parent;while(E!==r.parent);return r.starts&&v(r.starts,""),a.rE?0:n.length}if(c(n,E))throw new Error('Illegal lexeme "'+n+'" for mode "'+(E.cN||"")+'"');return k+=n,n.length||1}var N=w(e);if(!N)throw new Error('Unknown language: "'+e+'"');s(N);var R,E=i||N,x={},L="";for(R=E;R!==N;R=R.parent)R.cN&&(L=p(R.cN,"",!0)+L);var k="",B=0;try{for(var M,j,O=0;;){if(E.t.lastIndex=O,M=E.t.exec(t),!M)break;j=m(t.substring(O,M.index),M[0]),O=M.index+j}for(m(t.substr(O)),R=E;R.parent;R=R.parent)R.cN&&(L+=C);return{r:B,value:L,language:e,top:E}}catch(T){if(T.message&&-1!==T.message.indexOf("Illegal"))return{r:0,value:n(t)};throw T}}function g(e,t){t=t||I.languages||x(y);var r={r:0,value:n(e)},a=r;return t.filter(w).forEach(function(n){var t=f(n,e,!1);t.language=n,t.r>a.r&&(a=t),t.r>r.r&&(a=r,r=t)}),a.language&&(r.second_best=a),r}function p(e){return I.tabReplace||I.useBR?e.replace(M,function(e,n){return I.useBR&&"\n"===e?"
":I.tabReplace?n.replace(/\t/g,I.tabReplace):""}):e}function h(e,n,t){var r=n?L[n]:t,a=[e.trim()];return e.match(/\bhljs\b/)||a.push("hljs"),-1===e.indexOf(r)&&a.push(r),a.join(" ").trim()}function d(e){var n,t,r,o,l,s=i(e);a(s)||(I.useBR?(n=document.createElementNS("http://www.w3.org/1999/xhtml","div"),n.innerHTML=e.innerHTML.replace(/\n/g,"").replace(//g,"\n")):n=e,l=n.textContent,r=s?f(s,l,!0):g(l),t=u(n),t.length&&(o=document.createElementNS("http://www.w3.org/1999/xhtml","div"),o.innerHTML=r.value,r.value=c(t,u(o),l)),r.value=p(r.value),e.innerHTML=r.value,e.className=h(e.className,s,r.language),e.result={language:r.language,re:r.r},r.second_best&&(e.second_best={language:r.second_best.language,re:r.second_best.r}))}function b(e){I=o(I,e)}function v(){if(!v.called){v.called=!0;var e=document.querySelectorAll("pre code");E.forEach.call(e,d)}}function m(){addEventListener("DOMContentLoaded",v,!1),addEventListener("load",v,!1)}function N(n,t){var r=y[n]=t(e);r.aliases&&r.aliases.forEach(function(e){L[e]=n})}function R(){return x(y)}function w(e){return e=(e||"").toLowerCase(),y[e]||y[L[e]]}var E=[],x=Object.keys,y={},L={},k=/^(no-?highlight|plain|text)$/i,B=/\blang(?:uage)?-([\w-]+)\b/i,M=/((^(<[^>]+>|\t|)+|(?:\n)))/gm,C="
",I={classPrefix:"hljs-",tabReplace:null,useBR:!1,languages:void 0};return e.highlight=f,e.highlightAuto=g,e.fixMarkup=p,e.highlightBlock=d,e.configure=b,e.initHighlighting=v,e.initHighlightingOnLoad=m,e.registerLanguage=N,e.listLanguages=R,e.getLanguage=w,e.inherit=o,e.IR="[a-zA-Z]\\w*",e.UIR="[a-zA-Z_]\\w*",e.NR="\\b\\d+(\\.\\d+)?",e.CNR="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",e.BNR="\\b(0b[01]+)",e.RSR="!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~",e.BE={b:"\\\\[\\s\\S]",r:0},e.ASM={cN:"string",b:"'",e:"'",i:"\\n",c:[e.BE]},e.QSM={cN:"string",b:'"',e:'"',i:"\\n",c:[e.BE]},e.PWM={b:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/},e.C=function(n,t,r){var a=e.inherit({cN:"comment",b:n,e:t,c:[]},r||{});return a.c.push(e.PWM),a.c.push({cN:"doctag",b:"(?:TODO|FIXME|NOTE|BUG|XXX):",r:0}),a},e.CLCM=e.C("//","$"),e.CBCM=e.C("/\\*","\\*/"),e.HCM=e.C("#","$"),e.NM={cN:"number",b:e.NR,r:0},e.CNM={cN:"number",b:e.CNR,r:0},e.BNM={cN:"number",b:e.BNR,r:0},e.CSSNM={cN:"number",b:e.NR+"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?",r:0},e.RM={cN:"regexp",b:/\//,e:/\/[gimuy]*/,i:/\n/,c:[e.BE,{b:/\[/,e:/\]/,r:0,c:[e.BE]}]},e.TM={cN:"title",b:e.IR,r:0},e.UTM={cN:"title",b:e.UIR,r:0},e.METHOD_GUARD={b:"\\.\\s*"+e.UIR,r:0},e});hljs.registerLanguage("scss",function(e){var t="[a-zA-Z-][a-zA-Z0-9_-]*",i={cN:"variable",b:"(\\$"+t+")\\b"},r={cN:"number",b:"#[0-9A-Fa-f]+"};({cN:"attribute",b:"[A-Z\\_\\.\\-]+",e:":",eE:!0,i:"[^\\s]",starts:{eW:!0,eE:!0,c:[r,e.CSSNM,e.QSM,e.ASM,e.CBCM,{cN:"meta",b:"!important"}]}});return{cI:!0,i:"[=/|']",c:[e.CLCM,e.CBCM,{cN:"selector-id",b:"\\#[A-Za-z0-9_-]+",r:0},{cN:"selector-class",b:"\\.[A-Za-z0-9_-]+",r:0},{cN:"selector-attr",b:"\\[",e:"\\]",i:"$"},{cN:"selector-tag",b:"\\b(a|abbr|acronym|address|area|article|aside|audio|b|base|big|blockquote|body|br|button|canvas|caption|cite|code|col|colgroup|command|datalist|dd|del|details|dfn|div|dl|dt|em|embed|fieldset|figcaption|figure|footer|form|frame|frameset|(h[1-6])|head|header|hgroup|hr|html|i|iframe|img|input|ins|kbd|keygen|label|legend|li|link|map|mark|meta|meter|nav|noframes|noscript|object|ol|optgroup|option|output|p|param|pre|progress|q|rp|rt|ruby|samp|script|section|select|small|span|strike|strong|style|sub|sup|table|tbody|td|textarea|tfoot|th|thead|time|title|tr|tt|ul|var|video)\\b",r:0},{b:":(visited|valid|root|right|required|read-write|read-only|out-range|optional|only-of-type|only-child|nth-of-type|nth-last-of-type|nth-last-child|nth-child|not|link|left|last-of-type|last-child|lang|invalid|indeterminate|in-range|hover|focus|first-of-type|first-line|first-letter|first-child|first|enabled|empty|disabled|default|checked|before|after|active)"},{b:"::(after|before|choices|first-letter|first-line|repeat-index|repeat-item|selection|value)"},i,{cN:"attribute",b:"\\b(z-index|word-wrap|word-spacing|word-break|width|widows|white-space|visibility|vertical-align|unicode-bidi|transition-timing-function|transition-property|transition-duration|transition-delay|transition|transform-style|transform-origin|transform|top|text-underline-position|text-transform|text-shadow|text-rendering|text-overflow|text-indent|text-decoration-style|text-decoration-line|text-decoration-color|text-decoration|text-align-last|text-align|tab-size|table-layout|right|resize|quotes|position|pointer-events|perspective-origin|perspective|page-break-inside|page-break-before|page-break-after|padding-top|padding-right|padding-left|padding-bottom|padding|overflow-y|overflow-x|overflow-wrap|overflow|outline-width|outline-style|outline-offset|outline-color|outline|orphans|order|opacity|object-position|object-fit|normal|none|nav-up|nav-right|nav-left|nav-index|nav-down|min-width|min-height|max-width|max-height|mask|marks|margin-top|margin-right|margin-left|margin-bottom|margin|list-style-type|list-style-position|list-style-image|list-style|line-height|letter-spacing|left|justify-content|initial|inherit|ime-mode|image-orientation|image-resolution|image-rendering|icon|hyphens|height|font-weight|font-variant-ligatures|font-variant|font-style|font-stretch|font-size-adjust|font-size|font-language-override|font-kerning|font-feature-settings|font-family|font|float|flex-wrap|flex-shrink|flex-grow|flex-flow|flex-direction|flex-basis|flex|filter|empty-cells|display|direction|cursor|counter-reset|counter-increment|content|column-width|column-span|column-rule-width|column-rule-style|column-rule-color|column-rule|column-gap|column-fill|column-count|columns|color|clip-path|clip|clear|caption-side|break-inside|break-before|break-after|box-sizing|box-shadow|box-decoration-break|bottom|border-width|border-top-width|border-top-style|border-top-right-radius|border-top-left-radius|border-top-color|border-top|border-style|border-spacing|border-right-width|border-right-style|border-right-color|border-right|border-radius|border-left-width|border-left-style|border-left-color|border-left|border-image-width|border-image-source|border-image-slice|border-image-repeat|border-image-outset|border-image|border-color|border-collapse|border-bottom-width|border-bottom-style|border-bottom-right-radius|border-bottom-left-radius|border-bottom-color|border-bottom|border|background-size|background-repeat|background-position|background-origin|background-image|background-color|background-clip|background-attachment|background-blend-mode|background|backface-visibility|auto|animation-timing-function|animation-play-state|animation-name|animation-iteration-count|animation-fill-mode|animation-duration|animation-direction|animation-delay|animation|align-self|align-items|align-content)\\b",i:"[^\\s]"},{b:"\\b(whitespace|wait|w-resize|visible|vertical-text|vertical-ideographic|uppercase|upper-roman|upper-alpha|underline|transparent|top|thin|thick|text|text-top|text-bottom|tb-rl|table-header-group|table-footer-group|sw-resize|super|strict|static|square|solid|small-caps|separate|se-resize|scroll|s-resize|rtl|row-resize|ridge|right|repeat|repeat-y|repeat-x|relative|progress|pointer|overline|outside|outset|oblique|nowrap|not-allowed|normal|none|nw-resize|no-repeat|no-drop|newspaper|ne-resize|n-resize|move|middle|medium|ltr|lr-tb|lowercase|lower-roman|lower-alpha|loose|list-item|line|line-through|line-edge|lighter|left|keep-all|justify|italic|inter-word|inter-ideograph|inside|inset|inline|inline-block|inherit|inactive|ideograph-space|ideograph-parenthesis|ideograph-numeric|ideograph-alpha|horizontal|hidden|help|hand|groove|fixed|ellipsis|e-resize|double|dotted|distribute|distribute-space|distribute-letter|distribute-all-lines|disc|disabled|default|decimal|dashed|crosshair|collapse|col-resize|circle|char|center|capitalize|break-word|break-all|bottom|both|bolder|bold|block|bidi-override|below|baseline|auto|always|all-scroll|absolute|table|table-cell)\\b"},{b:":",e:";",c:[i,r,e.CSSNM,e.QSM,e.ASM,{cN:"meta",b:"!important"}]},{b:"@",e:"[{;]",k:"mixin include extend for if else each while charset import debug media page content font-face namespace warn",c:[i,e.QSM,e.ASM,r,e.CSSNM,{b:"\\s[A-Za-z0-9_.-]+",r:0}]}]}});hljs.registerLanguage("sql",function(e){var t=e.C("--","$");return{cI:!0,i:/[<>{}*#]/,c:[{bK:"begin end start commit rollback savepoint lock alter create drop rename call delete do handler insert load replace select truncate update set show pragma grant merge describe use explain help declare prepare execute deallocate release unlock purge reset change stop analyze cache flush optimize repair kill install uninstall checksum restore check backup revoke comment",e:/;/,eW:!0,l:/[\w\.]+/,k:{keyword:"abort abs absolute acc acce accep accept access accessed accessible account acos action activate add addtime admin administer advanced advise aes_decrypt aes_encrypt after agent aggregate ali alia alias allocate allow alter always analyze ancillary and any anydata anydataset anyschema anytype apply archive archived archivelog are as asc ascii asin assembly assertion associate asynchronous at atan atn2 attr attri attrib attribu attribut attribute attributes audit authenticated authentication authid authors auto autoallocate autodblink autoextend automatic availability avg backup badfile basicfile before begin beginning benchmark between bfile bfile_base big bigfile bin binary_double binary_float binlog bit_and bit_count bit_length bit_or bit_xor bitmap blob_base block blocksize body both bound buffer_cache buffer_pool build bulk by byte byteordermark bytes cache caching call calling cancel capacity cascade cascaded case cast catalog category ceil ceiling chain change changed char_base char_length character_length characters characterset charindex charset charsetform charsetid check checksum checksum_agg child choose chr chunk class cleanup clear client clob clob_base clone close cluster_id cluster_probability cluster_set clustering coalesce coercibility col collate collation collect colu colum column column_value columns columns_updated comment commit compact compatibility compiled complete composite_limit compound compress compute concat concat_ws concurrent confirm conn connec connect connect_by_iscycle connect_by_isleaf connect_by_root connect_time connection consider consistent constant constraint constraints constructor container content contents context contributors controlfile conv convert convert_tz corr corr_k corr_s corresponding corruption cos cost count count_big counted covar_pop covar_samp cpu_per_call cpu_per_session crc32 create creation critical cross cube cume_dist curdate current current_date current_time current_timestamp current_user cursor curtime customdatum cycle data database databases datafile datafiles datalength date_add date_cache date_format date_sub dateadd datediff datefromparts datename datepart datetime2fromparts day day_to_second dayname dayofmonth dayofweek dayofyear days db_role_change dbtimezone ddl deallocate declare decode decompose decrement decrypt deduplicate def defa defau defaul default defaults deferred defi defin define degrees delayed delegate delete delete_all delimited demand dense_rank depth dequeue des_decrypt des_encrypt des_key_file desc descr descri describ describe descriptor deterministic diagnostics difference dimension direct_load directory disable disable_all disallow disassociate discardfile disconnect diskgroup distinct distinctrow distribute distributed div do document domain dotnet double downgrade drop dumpfile duplicate duration each edition editionable editions element ellipsis else elsif elt empty enable enable_all enclosed encode encoding encrypt end end-exec endian enforced engine engines enqueue enterprise entityescaping eomonth error errors escaped evalname evaluate event eventdata events except exception exceptions exchange exclude excluding execu execut execute exempt exists exit exp expire explain export export_set extended extent external external_1 external_2 externally extract failed failed_login_attempts failover failure far fast feature_set feature_value fetch field fields file file_name_convert filesystem_like_logging final finish first first_value fixed flash_cache flashback floor flush following follows for forall force form forma format found found_rows freelist freelists freepools fresh from from_base64 from_days ftp full function general generated get get_format get_lock getdate getutcdate global global_name globally go goto grant grants greatest group group_concat group_id grouping grouping_id groups gtid_subtract guarantee guard handler hash hashkeys having hea head headi headin heading heap help hex hierarchy high high_priority hosts hour http id ident_current ident_incr ident_seed identified identity idle_time if ifnull ignore iif ilike ilm immediate import in include including increment index indexes indexing indextype indicator indices inet6_aton inet6_ntoa inet_aton inet_ntoa infile initial initialized initially initrans inmemory inner innodb input insert install instance instantiable instr interface interleaved intersect into invalidate invisible is is_free_lock is_ipv4 is_ipv4_compat is_not is_not_null is_used_lock isdate isnull isolation iterate java join json json_exists keep keep_duplicates key keys kill language large last last_day last_insert_id last_value lax lcase lead leading least leaves left len lenght length less level levels library like like2 like4 likec limit lines link list listagg little ln load load_file lob lobs local localtime localtimestamp locate locator lock locked log log10 log2 logfile logfiles logging logical logical_reads_per_call logoff logon logs long loop low low_priority lower lpad lrtrim ltrim main make_set makedate maketime managed management manual map mapping mask master master_pos_wait match matched materialized max maxextents maximize maxinstances maxlen maxlogfiles maxloghistory maxlogmembers maxsize maxtrans md5 measures median medium member memcompress memory merge microsecond mid migration min minextents minimum mining minus minute minvalue missing mod mode model modification modify module monitoring month months mount move movement multiset mutex name name_const names nan national native natural nav nchar nclob nested never new newline next nextval no no_write_to_binlog noarchivelog noaudit nobadfile nocheck nocompress nocopy nocycle nodelay nodiscardfile noentityescaping noguarantee nokeep nologfile nomapping nomaxvalue nominimize nominvalue nomonitoring none noneditionable nonschema noorder nopr nopro noprom nopromp noprompt norely noresetlogs noreverse normal norowdependencies noschemacheck noswitch not nothing notice notrim novalidate now nowait nth_value nullif nulls num numb numbe nvarchar nvarchar2 object ocicoll ocidate ocidatetime ociduration ociinterval ociloblocator ocinumber ociref ocirefcursor ocirowid ocistring ocitype oct octet_length of off offline offset oid oidindex old on online only opaque open operations operator optimal optimize option optionally or oracle oracle_date oradata ord ordaudio orddicom orddoc order ordimage ordinality ordvideo organization orlany orlvary out outer outfile outline output over overflow overriding package pad parallel parallel_enable parameters parent parse partial partition partitions pascal passing password password_grace_time password_lock_time password_reuse_max password_reuse_time password_verify_function patch path patindex pctincrease pctthreshold pctused pctversion percent percent_rank percentile_cont percentile_disc performance period period_add period_diff permanent physical pi pipe pipelined pivot pluggable plugin policy position post_transaction pow power pragma prebuilt precedes preceding precision prediction prediction_cost prediction_details prediction_probability prediction_set prepare present preserve prior priority private private_sga privileges procedural procedure procedure_analyze processlist profiles project prompt protection public publishingservername purge quarter query quick quiesce quota quotename radians raise rand range rank raw read reads readsize rebuild record records recover recovery recursive recycle redo reduced ref reference referenced references referencing refresh regexp_like register regr_avgx regr_avgy regr_count regr_intercept regr_r2 regr_slope regr_sxx regr_sxy reject rekey relational relative relaylog release release_lock relies_on relocate rely rem remainder rename repair repeat replace replicate replication required reset resetlogs resize resource respect restore restricted result result_cache resumable resume retention return returning returns reuse reverse revoke right rlike role roles rollback rolling rollup round row row_count rowdependencies rowid rownum rows rtrim rules safe salt sample save savepoint sb1 sb2 sb4 scan schema schemacheck scn scope scroll sdo_georaster sdo_topo_geometry search sec_to_time second section securefile security seed segment select self sequence sequential serializable server servererror session session_user sessions_per_user set sets settings sha sha1 sha2 share shared shared_pool short show shrink shutdown si_averagecolor si_colorhistogram si_featurelist si_positionalcolor si_stillimage si_texture siblings sid sign sin size size_t sizes skip slave sleep smalldatetimefromparts smallfile snapshot some soname sort soundex source space sparse spfile split sql sql_big_result sql_buffer_result sql_cache sql_calc_found_rows sql_small_result sql_variant_property sqlcode sqldata sqlerror sqlname sqlstate sqrt square standalone standby start starting startup statement static statistics stats_binomial_test stats_crosstab stats_ks_test stats_mode stats_mw_test stats_one_way_anova stats_t_test_ stats_t_test_indep stats_t_test_one stats_t_test_paired stats_wsr_test status std stddev stddev_pop stddev_samp stdev stop storage store stored str str_to_date straight_join strcmp strict string struct stuff style subdate subpartition subpartitions substitutable substr substring subtime subtring_index subtype success sum suspend switch switchoffset switchover sync synchronous synonym sys sys_xmlagg sysasm sysaux sysdate sysdatetimeoffset sysdba sysoper system system_user sysutcdatetime table tables tablespace tan tdo template temporary terminated tertiary_weights test than then thread through tier ties time time_format time_zone timediff timefromparts timeout timestamp timestampadd timestampdiff timezone_abbr timezone_minute timezone_region to to_base64 to_date to_days to_seconds todatetimeoffset trace tracking transaction transactional translate translation treat trigger trigger_nestlevel triggers trim truncate try_cast try_convert try_parse type ub1 ub2 ub4 ucase unarchived unbounded uncompress under undo unhex unicode uniform uninstall union unique unix_timestamp unknown unlimited unlock unpivot unrecoverable unsafe unsigned until untrusted unusable unused update updated upgrade upped upper upsert url urowid usable usage use use_stored_outlines user user_data user_resources users using utc_date utc_timestamp uuid uuid_short validate validate_password_strength validation valist value values var var_samp varcharc vari varia variab variabl variable variables variance varp varraw varrawc varray verify version versions view virtual visible void wait wallet warning warnings week weekday weekofyear wellformed when whene whenev wheneve whenever where while whitespace with within without work wrapped xdb xml xmlagg xmlattributes xmlcast xmlcolattval xmlelement xmlexists xmlforest xmlindex xmlnamespaces xmlpi xmlquery xmlroot xmlschema xmlserialize xmltable xmltype xor year year_to_month years yearweek",literal:"true false null",built_in:"array bigint binary bit blob boolean char character date dec decimal float int int8 integer interval number numeric real record serial serial8 smallint text varchar varying void"},c:[{cN:"string",b:"'",e:"'",c:[e.BE,{b:"''"}]},{cN:"string",b:'"',e:'"',c:[e.BE,{b:'""'}]},{cN:"string",b:"`",e:"`",c:[e.BE]},e.CNM,e.CBCM,t]},e.CBCM,t]}});hljs.registerLanguage("perl",function(e){var t="getpwent getservent quotemeta msgrcv scalar kill dbmclose undef lc ma syswrite tr send umask sysopen shmwrite vec qx utime local oct semctl localtime readpipe do return format read sprintf dbmopen pop getpgrp not getpwnam rewinddir qqfileno qw endprotoent wait sethostent bless s|0 opendir continue each sleep endgrent shutdown dump chomp connect getsockname die socketpair close flock exists index shmgetsub for endpwent redo lstat msgctl setpgrp abs exit select print ref gethostbyaddr unshift fcntl syscall goto getnetbyaddr join gmtime symlink semget splice x|0 getpeername recv log setsockopt cos last reverse gethostbyname getgrnam study formline endhostent times chop length gethostent getnetent pack getprotoent getservbyname rand mkdir pos chmod y|0 substr endnetent printf next open msgsnd readdir use unlink getsockopt getpriority rindex wantarray hex system getservbyport endservent int chr untie rmdir prototype tell listen fork shmread ucfirst setprotoent else sysseek link getgrgid shmctl waitpid unpack getnetbyname reset chdir grep split require caller lcfirst until warn while values shift telldir getpwuid my getprotobynumber delete and sort uc defined srand accept package seekdir getprotobyname semop our rename seek if q|0 chroot sysread setpwent no crypt getc chown sqrt write setnetent setpriority foreach tie sin msgget map stat getlogin unless elsif truncate exec keys glob tied closedirioctl socket readlink eval xor readline binmode setservent eof ord bind alarm pipe atan2 getgrent exp time push setgrent gt lt or ne m|0 break given say state when",r={cN:"subst",b:"[$@]\\{",e:"\\}",k:t},s={b:"->{",e:"}"},n={v:[{b:/\$\d/},{b:/[\$%@](\^\w\b|#\w+(::\w+)*|{\w+}|\w+(::\w*)*)/},{b:/[\$%@][^\s\w{]/,r:0}]},i=[e.BE,r,n],o=[n,e.HCM,e.C("^\\=\\w","\\=cut",{eW:!0}),s,{cN:"string",c:i,v:[{b:"q[qwxr]?\\s*\\(",e:"\\)",r:5},{b:"q[qwxr]?\\s*\\[",e:"\\]",r:5},{b:"q[qwxr]?\\s*\\{",e:"\\}",r:5},{b:"q[qwxr]?\\s*\\|",e:"\\|",r:5},{b:"q[qwxr]?\\s*\\<",e:"\\>",r:5},{b:"qw\\s+q",e:"q",r:5},{b:"'",e:"'",c:[e.BE]},{b:'"',e:'"'},{b:"`",e:"`",c:[e.BE]},{b:"{\\w+}",c:[],r:0},{b:"-?\\w+\\s*\\=\\>",c:[],r:0}]},{cN:"number",b:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",r:0},{b:"(\\/\\/|"+e.RSR+"|\\b(split|return|print|reverse|grep)\\b)\\s*",k:"split return print reverse grep",r:0,c:[e.HCM,{cN:"regexp",b:"(s|tr|y)/(\\\\.|[^/])*/(\\\\.|[^/])*/[a-z]*",r:10},{cN:"regexp",b:"(m|qr)?/",e:"/[a-z]*",c:[e.BE],r:0}]},{cN:"function",bK:"sub",e:"(\\s*\\(.*?\\))?[;{]",eE:!0,r:5,c:[e.TM]},{b:"-\\w\\b",r:0},{b:"^__DATA__$",e:"^__END__$",sL:"mojolicious",c:[{b:"^@@.*",e:"$",cN:"comment"}]}];return r.c=o,s.c=o,{aliases:["pl","pm"],l:/[\w\.]+/,k:t,c:o}});hljs.registerLanguage("ini",function(e){var b={cN:"string",c:[e.BE],v:[{b:"'''",e:"'''",r:10},{b:'"""',e:'"""',r:10},{b:'"',e:'"'},{b:"'",e:"'"}]};return{aliases:["toml"],cI:!0,i:/\S/,c:[e.C(";","$"),e.HCM,{cN:"section",b:/^\s*\[+/,e:/\]+/},{b:/^[a-z0-9\[\]_-]+\s*=\s*/,e:"$",rB:!0,c:[{cN:"attr",b:/[a-z0-9\[\]_-]+/},{b:/=/,eW:!0,r:0,c:[{cN:"literal",b:/\bon|off|true|false|yes|no\b/},{cN:"variable",v:[{b:/\$[\w\d"][\w\d_]*/},{b:/\$\{(.*?)}/}]},b,{cN:"number",b:/([\+\-]+)?[\d]+_[\d_]+/},e.NM]}]}]}});hljs.registerLanguage("diff",function(e){return{aliases:["patch"],c:[{cN:"meta",r:10,v:[{b:/^@@ +\-\d+,\d+ +\+\d+,\d+ +@@$/},{b:/^\*\*\* +\d+,\d+ +\*\*\*\*$/},{b:/^\-\-\- +\d+,\d+ +\-\-\-\-$/}]},{cN:"comment",v:[{b:/Index: /,e:/$/},{b:/={3,}/,e:/$/},{b:/^\-{3}/,e:/$/},{b:/^\*{3} /,e:/$/},{b:/^\+{3}/,e:/$/},{b:/\*{5}/,e:/\*{5}$/}]},{cN:"addition",b:"^\\+",e:"$"},{cN:"deletion",b:"^\\-",e:"$"},{cN:"addition",b:"^\\!",e:"$"}]}});hljs.registerLanguage("erlang",function(e){var r="[a-z'][a-zA-Z0-9_']*",c="("+r+":"+r+"|"+r+")",b={keyword:"after and andalso|10 band begin bnot bor bsl bzr bxor case catch cond div end fun if let not of orelse|10 query receive rem try when xor",literal:"false true"},i=e.C("%","$"),n={cN:"number",b:"\\b(\\d+#[a-fA-F0-9]+|\\d+(\\.\\d+)?([eE][-+]?\\d+)?)",r:0},a={b:"fun\\s+"+r+"/\\d+"},d={b:c+"\\(",e:"\\)",rB:!0,r:0,c:[{b:c,r:0},{b:"\\(",e:"\\)",eW:!0,rE:!0,r:0}]},o={b:"{",e:"}",r:0},t={b:"\\b_([A-Z][A-Za-z0-9_]*)?",r:0},f={b:"[A-Z][a-zA-Z0-9_]*",r:0},l={b:"#"+e.UIR,r:0,rB:!0,c:[{b:"#"+e.UIR,r:0},{b:"{",e:"}",r:0}]},s={bK:"fun receive if try case",e:"end",k:b};s.c=[i,a,e.inherit(e.ASM,{cN:""}),s,d,e.QSM,n,o,t,f,l];var u=[i,a,s,d,e.QSM,n,o,t,f,l];d.c[1].c=u,o.c=u,l.c[1].c=u;var h={cN:"params",b:"\\(",e:"\\)",c:u};return{aliases:["erl"],k:b,i:"(",rB:!0,i:"\\(|#|//|/\\*|\\\\|:|;",c:[h,e.inherit(e.TM,{b:r})],starts:{e:";|\\.",k:b,c:u}},i,{b:"^-",e:"\\.",r:0,eE:!0,rB:!0,l:"-"+e.IR,k:"-module -record -undef -export -ifdef -ifndef -author -copyright -doc -vsn -import -include -include_lib -compile -define -else -endif -file -behaviour -behavior -spec",c:[h]},n,e.QSM,l,t,f,o,{b:/\.$/}]}});hljs.registerLanguage("go",function(e){var t={keyword:"break default func interface select case map struct chan else goto package switch const fallthrough if range type continue for import return var go defer bool byte complex64 complex128 float32 float64 int8 int16 int32 int64 string uint8 uint16 uint32 uint64 int uint uintptr rune",literal:"true false iota nil",built_in:"append cap close complex copy imag len make new panic print println real recover delete"};return{aliases:["golang"],k:t,i:""}]}});hljs.registerLanguage("bash",function(e){var t={cN:"variable",v:[{b:/\$[\w\d#@][\w\d_]*/},{b:/\$\{(.*?)}/}]},s={cN:"string",b:/"/,e:/"/,c:[e.BE,t,{cN:"variable",b:/\$\(/,e:/\)/,c:[e.BE]}]},a={cN:"string",b:/'/,e:/'/};return{aliases:["sh","zsh"],l:/\b-?[a-z\._]+\b/,k:{keyword:"if then else elif fi for while in do done case esac function",literal:"true false",built_in:"break cd continue eval exec exit export getopts hash pwd readonly return shift test times trap umask unset alias bind builtin caller command declare echo enable help let local logout mapfile printf read readarray source type typeset ulimit unalias set shopt autoload bg bindkey bye cap chdir clone comparguments compcall compctl compdescribe compfiles compgroups compquote comptags comptry compvalues dirs disable disown echotc echoti emulate fc fg float functions getcap getln history integer jobs kill limit log noglob popd print pushd pushln rehash sched setcap setopt stat suspend ttyctl unfunction unhash unlimit unsetopt vared wait whence where which zcompile zformat zftp zle zmodload zparseopts zprof zpty zregexparse zsocket zstyle ztcp",_:"-ne -eq -lt -gt -f -d -e -s -l -a"},c:[{cN:"meta",b:/^#![^\n]+sh\s*$/,r:10},{cN:"function",b:/\w[\w\d_]*\s*\(\s*\)\s*\{/,rB:!0,c:[e.inherit(e.TM,{b:/\w[\w\d_]*/})],r:0},e.HCM,s,a,t]}});hljs.registerLanguage("php",function(e){var c={b:"\\$+[a-zA-Z_-ÿ][a-zA-Z0-9_-ÿ]*"},i={cN:"meta",b:/<\?(php)?|\?>/},t={cN:"string",c:[e.BE,i],v:[{b:'b"',e:'"'},{b:"b'",e:"'"},e.inherit(e.ASM,{i:null}),e.inherit(e.QSM,{i:null})]},a={v:[e.BNM,e.CNM]};return{aliases:["php3","php4","php5","php6"],cI:!0,k:"and include_once list abstract global private echo interface as static endswitch array null if endwhile or const for endforeach self var while isset public protected exit foreach throw elseif include __FILE__ empty require_once do xor return parent clone use __CLASS__ __LINE__ else break print eval new catch __METHOD__ case exception default die require __FUNCTION__ enddeclare final try switch continue endfor endif declare unset true false trait goto instanceof insteadof __DIR__ __NAMESPACE__ yield finally",c:[e.HCM,e.C("//","$",{c:[i]}),e.C("/\\*","\\*/",{c:[{cN:"doctag",b:"@[A-Za-z]+"}]}),e.C("__halt_compiler.+?;",!1,{eW:!0,k:"__halt_compiler",l:e.UIR}),{cN:"string",b:/<<<['"]?\w+['"]?$/,e:/^\w+;?$/,c:[e.BE,{cN:"subst",v:[{b:/\$\w+/},{b:/\{\$/,e:/\}/}]}]},i,{cN:"keyword",b:/\$this\b/},c,{b:/(::|->)+[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/},{cN:"function",bK:"function",e:/[;{]/,eE:!0,i:"\\$|\\[|%",c:[e.UTM,{cN:"params",b:"\\(",e:"\\)",c:["self",c,e.CBCM,t,a]}]},{cN:"class",bK:"class interface",e:"{",eE:!0,i:/[:\(\$"]/,c:[{bK:"extends implements"},e.UTM]},{bK:"namespace",e:";",i:/[\.']/,c:[e.UTM]},{bK:"use",e:";",c:[e.UTM]},{b:"=>"},t,a]}});hljs.registerLanguage("swift",function(e){var i={keyword:"__COLUMN__ __FILE__ __FUNCTION__ __LINE__ as as! as? associativity break case catch class continue convenience default defer deinit didSet do dynamic dynamicType else enum extension fallthrough false fileprivate final for func get guard if import in indirect infix init inout internal is lazy left let mutating nil none nonmutating open operator optional override postfix precedence prefix private protocol Protocol public repeat required rethrows return right self Self set static struct subscript super switch throw throws true try try! try? Type typealias unowned var weak where while willSet",literal:"true false nil",built_in:"abs advance alignof alignofValue anyGenerator assert assertionFailure bridgeFromObjectiveC bridgeFromObjectiveCUnconditional bridgeToObjectiveC bridgeToObjectiveCUnconditional c contains count countElements countLeadingZeros debugPrint debugPrintln distance dropFirst dropLast dump encodeBitsAsWords enumerate equal fatalError filter find getBridgedObjectiveCType getVaList indices insertionSort isBridgedToObjectiveC isBridgedVerbatimToObjectiveC isUniquelyReferenced isUniquelyReferencedNonObjC join lazy lexicographicalCompare map max maxElement min minElement numericCast overlaps partition posix precondition preconditionFailure print println quickSort readLine reduce reflect reinterpretCast reverse roundUpToAlignment sizeof sizeofValue sort split startsWith stride strideof strideofValue swap toString transcode underestimateCount unsafeAddressOf unsafeBitCast unsafeDowncast unsafeUnwrap unsafeReflect withExtendedLifetime withObjectAtPlusZero withUnsafePointer withUnsafePointerToObject withUnsafeMutablePointer withUnsafeMutablePointers withUnsafePointer withUnsafePointers withVaList zip"},t={cN:"type",b:"\\b[A-Z][\\wÀ-ʸ']*",r:0},n=e.C("/\\*","\\*/",{c:["self"]}),r={cN:"subst",b:/\\\(/,e:"\\)",k:i,c:[]},a={cN:"number",b:"\\b([\\d_]+(\\.[\\deE_]+)?|0x[a-fA-F0-9_]+(\\.[a-fA-F0-9p_]+)?|0b[01_]+|0o[0-7_]+)\\b",r:0},o=e.inherit(e.QSM,{c:[r,e.BE]});return r.c=[a],{k:i,c:[o,e.CLCM,n,t,a,{cN:"function",bK:"func",e:"{",eE:!0,c:[e.inherit(e.TM,{b:/[A-Za-z$_][0-9A-Za-z$_]*/}),{b://},{cN:"params",b:/\(/,e:/\)/,endsParent:!0,k:i,c:["self",a,o,e.CBCM,{b:":"}],i:/["']/}],i:/\[|%/},{cN:"class",bK:"struct protocol class extension enum",k:i,e:"\\{",eE:!0,c:[e.inherit(e.TM,{b:/[A-Za-z$_][\u00C0-\u02B80-9A-Za-z$_]*/})]},{cN:"meta",b:"(@warn_unused_result|@exported|@lazy|@noescape|@NSCopying|@NSManaged|@objc|@convention|@required|@noreturn|@IBAction|@IBDesignable|@IBInspectable|@IBOutlet|@infix|@prefix|@postfix|@autoclosure|@testable|@available|@nonobjc|@NSApplicationMain|@UIApplicationMain)"},{bK:"import",e:/$/,c:[e.CLCM,n]}]}});hljs.registerLanguage("python",function(e){var r={keyword:"and elif is global as in if from raise for except finally print import pass return exec else break not with class assert yield try while continue del or def lambda async await nonlocal|10 None True False",built_in:"Ellipsis NotImplemented"},b={cN:"meta",b:/^(>>>|\.\.\.) /},c={cN:"subst",b:/\{/,e:/\}/,k:r,i:/#/},a={cN:"string",c:[e.BE],v:[{b:/(u|b)?r?'''/,e:/'''/,c:[b],r:10},{b:/(u|b)?r?"""/,e:/"""/,c:[b],r:10},{b:/(fr|rf|f)'''/,e:/'''/,c:[b,c]},{b:/(fr|rf|f)"""/,e:/"""/,c:[b,c]},{b:/(u|r|ur)'/,e:/'/,r:10},{b:/(u|r|ur)"/,e:/"/,r:10},{b:/(b|br)'/,e:/'/},{b:/(b|br)"/,e:/"/},{b:/(fr|rf|f)'/,e:/'/,c:[c]},{b:/(fr|rf|f)"/,e:/"/,c:[c]},e.ASM,e.QSM]},s={cN:"number",r:0,v:[{b:e.BNR+"[lLjJ]?"},{b:"\\b(0o[0-7]+)[lLjJ]?"},{b:e.CNR+"[lLjJ]?"}]},i={cN:"params",b:/\(/,e:/\)/,c:["self",b,s,a]};return c.c=[a,s,b],{aliases:["py","gyp"],k:r,i:/(<\/|->|\?)|=>/,c:[b,s,a,e.HCM,{v:[{cN:"function",bK:"def"},{cN:"class",bK:"class"}],e:/:/,i:/[${=;\n,]/,c:[e.UTM,i,{b:/->/,eW:!0,k:"None"}]},{cN:"meta",b:/^[\t ]*@/,e:/$/},{b:/\b(print|exec)\(/}]}});hljs.registerLanguage("coffeescript",function(e){var c={keyword:"in if for while finally new do return else break catch instanceof throw try this switch continue typeof delete debugger super yield import export from as default await then unless until loop of by when and or is isnt not",literal:"true false null undefined yes no on off",built_in:"npm require console print module global window document"},n="[A-Za-z$_][0-9A-Za-z$_]*",r={cN:"subst",b:/#\{/,e:/}/,k:c},i=[e.BNM,e.inherit(e.CNM,{starts:{e:"(\\s*/)?",r:0}}),{cN:"string",v:[{b:/'''/,e:/'''/,c:[e.BE]},{b:/'/,e:/'/,c:[e.BE]},{b:/"""/,e:/"""/,c:[e.BE,r]},{b:/"/,e:/"/,c:[e.BE,r]}]},{cN:"regexp",v:[{b:"///",e:"///",c:[r,e.HCM]},{b:"//[gim]*",r:0},{b:/\/(?![ *])(\\\/|.)*?\/[gim]*(?=\W|$)/}]},{b:"@"+n},{sL:"javascript",eB:!0,eE:!0,v:[{b:"```",e:"```"},{b:"`",e:"`"}]}];r.c=i;var s=e.inherit(e.TM,{b:n}),t="(\\(.*\\))?\\s*\\B[-=]>",o={cN:"params",b:"\\([^\\(]",rB:!0,c:[{b:/\(/,e:/\)/,k:c,c:["self"].concat(i)}]};return{aliases:["coffee","cson","iced"],k:c,i:/\/\*/,c:i.concat([e.C("###","###"),e.HCM,{cN:"function",b:"^\\s*"+n+"\\s*=\\s*"+t,e:"[-=]>",rB:!0,c:[s,o]},{b:/[:\(,=]\s*/,r:0,c:[{cN:"function",b:t,e:"[-=]>",rB:!0,c:[o]}]},{cN:"class",bK:"class",e:"$",i:/[:="\[\]]/,c:[{bK:"extends",eW:!0,i:/[:="\[\]]/,c:[s]},s]},{b:n+":",e:":",rB:!0,rE:!0,r:0}])}});hljs.registerLanguage("cpp",function(t){var e={cN:"keyword",b:"\\b[a-z\\d_]*_t\\b"},r={cN:"string",v:[{b:'(u8?|U)?L?"',e:'"',i:"\\n",c:[t.BE]},{b:'(u8?|U)?R"',e:'"',c:[t.BE]},{b:"'\\\\?.",e:"'",i:"."}]},s={cN:"number",v:[{b:"\\b(0b[01']+)"},{b:"(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)(u|U|l|L|ul|UL|f|F|b|B)"},{b:"(-?)(\\b0[xX][a-fA-F0-9']+|(\\b[\\d']+(\\.[\\d']*)?|\\.[\\d']+)([eE][-+]?[\\d']+)?)"}],r:0},i={cN:"meta",b:/#\s*[a-z]+\b/,e:/$/,k:{"meta-keyword":"if else elif endif define undef warning error line pragma ifdef ifndef include"},c:[{b:/\\\n/,r:0},t.inherit(r,{cN:"meta-string"}),{cN:"meta-string",b:/<[^\n>]*>/,e:/$/,i:"\\n"},t.CLCM,t.CBCM]},a=t.IR+"\\s*\\(",c={keyword:"int float while private char catch import module export virtual operator sizeof dynamic_cast|10 typedef const_cast|10 const for static_cast|10 union namespace unsigned long volatile static protected bool template mutable if public friend do goto auto void enum else break extern using asm case typeid short reinterpret_cast|10 default double register explicit signed typename try this switch continue inline delete alignof constexpr decltype noexcept static_assert thread_local restrict _Bool complex _Complex _Imaginary atomic_bool atomic_char atomic_schar atomic_uchar atomic_short atomic_ushort atomic_int atomic_uint atomic_long atomic_ulong atomic_llong atomic_ullong new throw return and or not",built_in:"std string cin cout cerr clog stdin stdout stderr stringstream istringstream ostringstream auto_ptr deque list queue stack vector map set bitset multiset multimap unordered_set unordered_map unordered_multiset unordered_multimap array shared_ptr abort abs acos asin atan2 atan calloc ceil cosh cos exit exp fabs floor fmod fprintf fputs free frexp fscanf isalnum isalpha iscntrl isdigit isgraph islower isprint ispunct isspace isupper isxdigit tolower toupper labs ldexp log10 log malloc realloc memchr memcmp memcpy memset modf pow printf putchar puts scanf sinh sin snprintf sprintf sqrt sscanf strcat strchr strcmp strcpy strcspn strlen strncat strncmp strncpy strpbrk strrchr strspn strstr tanh tan vfprintf vprintf vsprintf endl initializer_list unique_ptr",literal:"true false nullptr NULL"},n=[e,t.CLCM,t.CBCM,s,r];return{aliases:["c","cc","h","c++","h++","hpp"],k:c,i:"",k:c,c:["self",e]},{b:t.IR+"::",k:c},{v:[{b:/=/,e:/;/},{b:/\(/,e:/\)/},{bK:"new throw return else",e:/;/}],k:c,c:n.concat([{b:/\(/,e:/\)/,k:c,c:n.concat(["self"]),r:0}]),r:0},{cN:"function",b:"("+t.IR+"[\\*&\\s]+)+"+a,rB:!0,e:/[{;=]/,eE:!0,k:c,i:/[^\w\s\*&]/,c:[{b:a,rB:!0,c:[t.TM],r:0},{cN:"params",b:/\(/,e:/\)/,k:c,r:0,c:[t.CLCM,t.CBCM,r,s,e]},t.CLCM,t.CBCM,i]},{cN:"class",bK:"class struct",e:/[{;:]/,c:[{b://,c:["self"]},t.TM]}]),exports:{preprocessor:i,strings:r,k:c}}});hljs.registerLanguage("ruby",function(e){var b="[a-zA-Z_]\\w*[!?=]?|[-+~]\\@|<<|>>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~`|]|\\[\\]=?",r={keyword:"and then defined module in return redo if BEGIN retry end for self when next until do begin unless END rescue else break undef not super class case require yield alias while ensure elsif or include attr_reader attr_writer attr_accessor",literal:"true false nil"},c={cN:"doctag",b:"@[A-Za-z]+"},a={b:"#<",e:">"},s=[e.C("#","$",{c:[c]}),e.C("^\\=begin","^\\=end",{c:[c],r:10}),e.C("^__END__","\\n$")],n={cN:"subst",b:"#\\{",e:"}",k:r},t={cN:"string",c:[e.BE,n],v:[{b:/'/,e:/'/},{b:/"/,e:/"/},{b:/`/,e:/`/},{b:"%[qQwWx]?\\(",e:"\\)"},{b:"%[qQwWx]?\\[",e:"\\]"},{b:"%[qQwWx]?{",e:"}"},{b:"%[qQwWx]?<",e:">"},{b:"%[qQwWx]?/",e:"/"},{b:"%[qQwWx]?%",e:"%"},{b:"%[qQwWx]?-",e:"-"},{b:"%[qQwWx]?\\|",e:"\\|"},{b:/\B\?(\\\d{1,3}|\\x[A-Fa-f0-9]{1,2}|\\u[A-Fa-f0-9]{4}|\\?\S)\b/},{b:/<<(-?)\w+$/,e:/^\s*\w+$/}]},i={cN:"params",b:"\\(",e:"\\)",endsParent:!0,k:r},d=[t,a,{cN:"class",bK:"class module",e:"$|;",i:/=/,c:[e.inherit(e.TM,{b:"[A-Za-z_]\\w*(::\\w+)*(\\?|\\!)?"}),{b:"<\\s*",c:[{b:"("+e.IR+"::)?"+e.IR}]}].concat(s)},{cN:"function",bK:"def",e:"$|;",c:[e.inherit(e.TM,{b:b}),i].concat(s)},{b:e.IR+"::"},{cN:"symbol",b:e.UIR+"(\\!|\\?)?:",r:0},{cN:"symbol",b:":(?!\\s)",c:[t,{b:b}],r:0},{cN:"number",b:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",r:0},{b:"(\\$\\W)|((\\$|\\@\\@?)(\\w+))"},{cN:"params",b:/\|/,e:/\|/,k:r},{b:"("+e.RSR+"|unless)\\s*",k:"unless",c:[a,{cN:"regexp",c:[e.BE,n],i:/\n/,v:[{b:"/",e:"/[a-z]*"},{b:"%r{",e:"}[a-z]*"},{b:"%r\\(",e:"\\)[a-z]*"},{b:"%r!",e:"![a-z]*"},{b:"%r\\[",e:"\\][a-z]*"}]}].concat(s),r:0}].concat(s);n.c=d,i.c=d;var l="[>?]>",o="[\\w#]+\\(\\w+\\):\\d+:\\d+>",u="(\\w+-)?\\d+\\.\\d+\\.\\d(p\\d+)?[^>]+>",w=[{b:/^\s*=>/,starts:{e:"$",c:d}},{cN:"meta",b:"^("+l+"|"+o+"|"+u+")",starts:{e:"$",c:d}}];return{aliases:["rb","gemspec","podspec","thor","irb"],k:r,i:/\/\*/,c:s.concat(w).concat(d)}});hljs.registerLanguage("yaml",function(e){var b="true false yes no null",a="^[ \\-]*",r="[a-zA-Z_][\\w\\-]*",t={cN:"attr",v:[{b:a+r+":"},{b:a+'"'+r+'":'},{b:a+"'"+r+"':"}]},c={cN:"template-variable",v:[{b:"{{",e:"}}"},{b:"%{",e:"}"}]},l={cN:"string",r:0,v:[{b:/'/,e:/'/},{b:/"/,e:/"/},{b:/\S+/}],c:[e.BE,c]};return{cI:!0,aliases:["yml","YAML","yaml"],c:[t,{cN:"meta",b:"^---s*$",r:10},{cN:"string",b:"[\\|>] *$",rE:!0,c:l.c,e:t.v[0].b},{b:"<%[%=-]?",e:"[%-]?%>",sL:"ruby",eB:!0,eE:!0,r:0},{cN:"type",b:"!!"+e.UIR},{cN:"meta",b:"&"+e.UIR+"$"},{cN:"meta",b:"\\*"+e.UIR+"$"},{cN:"bullet",b:"^ *-",r:0},e.HCM,{bK:b,k:{literal:b}},e.CNM,l]}});hljs.registerLanguage("haskell",function(e){var i={v:[e.C("--","$"),e.C("{-","-}",{c:["self"]})]},a={cN:"meta",b:"{-#",e:"#-}"},l={cN:"meta",b:"^#",e:"$"},c={cN:"type",b:"\\b[A-Z][\\w']*",r:0},n={b:"\\(",e:"\\)",i:'"',c:[a,l,{cN:"type",b:"\\b[A-Z][\\w]*(\\((\\.\\.|,|\\w+)\\))?"},e.inherit(e.TM,{b:"[_a-z][\\w']*"}),i]},s={b:"{",e:"}",c:n.c};return{aliases:["hs"],k:"let in if then else case of where do module import hiding qualified type data newtype deriving class instance as default infix infixl infixr foreign export ccall stdcall cplusplus jvm dotnet safe unsafe family forall mdo proc rec",c:[{bK:"module",e:"where",k:"module where",c:[n,i],i:"\\W\\.|;"},{b:"\\bimport\\b",e:"$",k:"import qualified as hiding",c:[n,i],i:"\\W\\.|;"},{cN:"class",b:"^(\\s*)?(class|instance)\\b",e:"where",k:"class family instance where",c:[c,n,i]},{cN:"class",b:"\\b(data|(new)?type)\\b",e:"$",k:"data family type newtype deriving",c:[a,c,n,s,i]},{bK:"default",e:"$",c:[c,n,i]},{bK:"infix infixl infixr",e:"$",c:[e.CNM,i]},{b:"\\bforeign\\b",e:"$",k:"foreign import export ccall stdcall cplusplus jvm dotnet safe unsafe",c:[c,e.QSM,i]},{cN:"meta",b:"#!\\/usr\\/bin\\/env runhaskell",e:"$"},a,l,e.QSM,e.CNM,c,e.inherit(e.TM,{b:"^[_a-z][\\w']*"}),i,{b:"->|<-"}]}});hljs.registerLanguage("cs",function(e){var i={keyword:"abstract as base bool break byte case catch char checked const continue decimal default delegate do double enum event explicit extern finally fixed float for foreach goto if implicit in int interface internal is lock long nameof object operator out override params private protected public readonly ref sbyte sealed short sizeof stackalloc static string struct switch this try typeof uint ulong unchecked unsafe ushort using virtual void volatile while add alias ascending async await by descending dynamic equals from get global group into join let on orderby partial remove select set value var where yield",literal:"null false true"},t={cN:"string",b:'@"',e:'"',c:[{b:'""'}]},r=e.inherit(t,{i:/\n/}),a={cN:"subst",b:"{",e:"}",k:i},c=e.inherit(a,{i:/\n/}),n={cN:"string",b:/\$"/,e:'"',i:/\n/,c:[{b:"{{"},{b:"}}"},e.BE,c]},s={cN:"string",b:/\$@"/,e:'"',c:[{b:"{{"},{b:"}}"},{b:'""'},a]},o=e.inherit(s,{i:/\n/,c:[{b:"{{"},{b:"}}"},{b:'""'},c]});a.c=[s,n,t,e.ASM,e.QSM,e.CNM,e.CBCM],c.c=[o,n,r,e.ASM,e.QSM,e.CNM,e.inherit(e.CBCM,{i:/\n/})];var l={v:[s,n,t,e.ASM,e.QSM]},b=e.IR+"(<"+e.IR+"(\\s*,\\s*"+e.IR+")*>)?(\\[\\])?";return{aliases:["csharp"],k:i,i:/::/,c:[e.C("///","$",{rB:!0,c:[{cN:"doctag",v:[{b:"///",r:0},{b:""},{b:""}]}]}),e.CLCM,e.CBCM,{cN:"meta",b:"#",e:"$",k:{"meta-keyword":"if else elif endif define undef warning error line region endregion pragma checksum"}},l,e.CNM,{bK:"class interface",e:/[{;=]/,i:/[^\s:]/,c:[e.TM,e.CLCM,e.CBCM]},{bK:"namespace",e:/[{;=]/,i:/[^\s:]/,c:[e.inherit(e.TM,{b:"[a-zA-Z](\\.?\\w)*"}),e.CLCM,e.CBCM]},{cN:"meta",b:"^\\s*\\[",eB:!0,e:"\\]",eE:!0,c:[{cN:"meta-string",b:/"/,e:/"/}]},{bK:"new return throw await else",r:0},{cN:"function",b:"("+b+"\\s+)+"+e.IR+"\\s*\\(",rB:!0,e:/[{;=]/,eE:!0,k:i,c:[{b:e.IR+"\\s*\\(",rB:!0,c:[e.TM],r:0},{cN:"params",b:/\(/,e:/\)/,eB:!0,eE:!0,k:i,r:0,c:[l,e.CNM,e.CBCM]},e.CLCM,e.CBCM]}]}});hljs.registerLanguage("lisp",function(b){var e="[a-zA-Z_\\-\\+\\*\\/\\<\\=\\>\\&\\#][a-zA-Z0-9_\\-\\+\\*\\/\\<\\=\\>\\&\\#!]*",c="\\|[^]*?\\|",r="(\\-|\\+)?\\d+(\\.\\d+|\\/\\d+)?((d|e|f|l|s|D|E|F|L|S)(\\+|\\-)?\\d+)?",a={cN:"meta",b:"^#!",e:"$"},l={cN:"literal",b:"\\b(t{1}|nil)\\b"},n={cN:"number",v:[{b:r,r:0},{b:"#(b|B)[0-1]+(/[0-1]+)?"},{b:"#(o|O)[0-7]+(/[0-7]+)?"},{b:"#(x|X)[0-9a-fA-F]+(/[0-9a-fA-F]+)?"},{b:"#(c|C)\\("+r+" +"+r,e:"\\)"}]},i=b.inherit(b.QSM,{i:null}),t=b.C(";","$",{r:0}),s={b:"\\*",e:"\\*"},u={cN:"symbol",b:"[:&]"+e},d={b:e,r:0},f={b:c},m={b:"\\(",e:"\\)",c:["self",l,i,n,d]},o={c:[n,i,s,u,m,d],v:[{b:"['`]\\(",e:"\\)"},{b:"\\(quote ",e:"\\)",k:{name:"quote"}},{b:"'"+c}]},v={v:[{b:"'"+e},{b:"#'"+e+"(::"+e+")*"}]},N={b:"\\(\\s*",e:"\\)"},A={eW:!0,r:0};return N.c=[{cN:"name",v:[{b:e},{b:c}]},A],A.c=[o,v,N,l,n,i,t,s,u,f,d],{i:/\S/,c:[n,a,l,i,t,o,v,N,d]}});hljs.registerLanguage("shell",function(s){return{aliases:["console"],c:[{cN:"meta",b:"^\\s{0,3}[\\w\\d\\[\\]()@-]*[>%$#]",starts:{e:"$",sL:"bash"}}]}});hljs.registerLanguage("typescript",function(e){var r={keyword:"in if for while finally var new function do return void else break catch instanceof with throw case default try this switch continue typeof delete let yield const class public private protected get set super static implements enum export import declare type namespace abstract as from extends async await",literal:"true false null undefined NaN Infinity",built_in:"eval isFinite isNaN parseFloat parseInt decodeURI decodeURIComponent encodeURI encodeURIComponent escape unescape Object Function Boolean Error EvalError InternalError RangeError ReferenceError StopIteration SyntaxError TypeError URIError Number Math Date String RegExp Array Float32Array Float64Array Int16Array Int32Array Int8Array Uint16Array Uint32Array Uint8Array Uint8ClampedArray ArrayBuffer DataView JSON Intl arguments require module console window document any number boolean string void Promise"};return{aliases:["ts"],k:r,c:[{cN:"meta",b:/^\s*['"]use strict['"]/},e.ASM,e.QSM,{cN:"string",b:"`",e:"`",c:[e.BE,{cN:"subst",b:"\\$\\{",e:"\\}"}]},e.CLCM,e.CBCM,{cN:"number",v:[{b:"\\b(0[bB][01]+)"},{b:"\\b(0[oO][0-7]+)"},{b:e.CNR}],r:0},{b:"("+e.RSR+"|\\b(case|return|throw)\\b)\\s*",k:"return throw case",c:[e.CLCM,e.CBCM,e.RM,{cN:"function",b:"(\\(.*?\\)|"+e.IR+")\\s*=>",rB:!0,e:"\\s*=>",c:[{cN:"params",v:[{b:e.IR},{b:/\(\s*\)/},{b:/\(/,e:/\)/,eB:!0,eE:!0,k:r,c:["self",e.CLCM,e.CBCM]}]}]}],r:0},{cN:"function",b:"function",e:/[\{;]/,eE:!0,k:r,c:["self",e.inherit(e.TM,{b:/[A-Za-z$_][0-9A-Za-z$_]*/}),{cN:"params",b:/\(/,e:/\)/,eB:!0,eE:!0,k:r,c:[e.CLCM,e.CBCM],i:/["'\(]/}],i:/%/,r:0},{bK:"constructor",e:/\{/,eE:!0,c:["self",{cN:"params",b:/\(/,e:/\)/,eB:!0,eE:!0,k:r,c:[e.CLCM,e.CBCM],i:/["'\(]/}]},{b:/module\./,k:{built_in:"module"},r:0},{bK:"module",e:/\{/,eE:!0},{bK:"interface",e:/\{/,eE:!0,k:"interface extends"},{b:/\$[(.]/},{b:"\\."+e.IR,r:0},{cN:"meta",b:"@[A-Za-z]+"}]}});hljs.registerLanguage("less",function(e){var r="[\\w-]+",t="("+r+"|@{"+r+"})",a=[],c=[],s=function(e){return{cN:"string",b:"~?"+e+".*?"+e}},b=function(e,r,t){return{cN:e,b:r,r:t}},n={b:"\\(",e:"\\)",c:c,r:0};c.push(e.CLCM,e.CBCM,s("'"),s('"'),e.CSSNM,{b:"(url|data-uri)\\(",starts:{cN:"string",e:"[\\)\\n]",eE:!0}},b("number","#[0-9A-Fa-f]+\\b"),n,b("variable","@@?"+r,10),b("variable","@{"+r+"}"),b("built_in","~?`[^`]*?`"),{cN:"attribute",b:r+"\\s*:",e:":",rB:!0,eE:!0},{cN:"meta",b:"!important"});var i=c.concat({b:"{",e:"}",c:a}),o={bK:"when",eW:!0,c:[{bK:"and not"}].concat(c)},u={b:t+"\\s*:",rB:!0,e:"[;}]",r:0,c:[{cN:"attribute",b:t,e:":",eE:!0,starts:{eW:!0,i:"[<=$]",r:0,c:c}}]},l={cN:"keyword",b:"@(import|media|charset|font-face|(-[a-z]+-)?keyframes|supports|document|namespace|page|viewport|host)\\b",starts:{e:"[;{}]",rE:!0,c:c,r:0}},C={cN:"variable",v:[{b:"@"+r+"\\s*:",r:15},{b:"@"+r}],starts:{e:"[;}]",rE:!0,c:i}},p={v:[{b:"[\\.#:&\\[>]",e:"[;{}]"},{b:t,e:"{"}],rB:!0,rE:!0,i:"[<='$\"]",r:0,c:[e.CLCM,e.CBCM,o,b("keyword","all\\b"),b("variable","@{"+r+"}"),b("selector-tag",t+"%?",0),b("selector-id","#"+t),b("selector-class","\\."+t,0),b("selector-tag","&",0),{cN:"selector-attr",b:"\\[",e:"\\]"},{cN:"selector-pseudo",b:/:(:)?[a-zA-Z0-9\_\-\+\(\)"'.]+/},{b:"\\(",e:"\\)",c:i},{b:"!important"}]};return a.push(e.CLCM,e.CBCM,l,C,u,p),{cI:!0,i:"[=>'/<($\"]",c:a}});hljs.registerLanguage("css",function(e){var c="[a-zA-Z-][a-zA-Z0-9_-]*",t={b:/[A-Z\_\.\-]+\s*:/,rB:!0,e:";",eW:!0,c:[{cN:"attribute",b:/\S/,e:":",eE:!0,starts:{eW:!0,eE:!0,c:[{b:/[\w-]+\(/,rB:!0,c:[{cN:"built_in",b:/[\w-]+/},{b:/\(/,e:/\)/,c:[e.ASM,e.QSM]}]},e.CSSNM,e.QSM,e.ASM,e.CBCM,{cN:"number",b:"#[0-9A-Fa-f]+"},{cN:"meta",b:"!important"}]}}]};return{cI:!0,i:/[=\/|'\$]/,c:[e.CBCM,{cN:"selector-id",b:/#[A-Za-z0-9_-]+/},{cN:"selector-class",b:/\.[A-Za-z0-9_-]+/},{cN:"selector-attr",b:/\[/,e:/\]/,i:"$"},{cN:"selector-pseudo",b:/:(:)?[a-zA-Z0-9\_\-\+\(\)"'.]+/},{b:"@(font-face|page)",l:"[a-z-]+",k:"font-face page"},{b:"@",e:"[{;]",i:/:/,c:[{cN:"keyword",b:/\w+/},{b:/\s/,eW:!0,eE:!0,r:0,c:[e.ASM,e.QSM,e.CSSNM]}]},{cN:"selector-tag",b:c,r:0},{b:"{",e:"}",i:/\S/,c:[e.CBCM,t]}]}});hljs.registerLanguage("nginx",function(e){var r={cN:"variable",v:[{b:/\$\d+/},{b:/\$\{/,e:/}/},{b:"[\\$\\@]"+e.UIR}]},b={eW:!0,l:"[a-z/_]+",k:{literal:"on off yes no true false none blocked debug info notice warn error crit select break last permanent redirect kqueue rtsig epoll poll /dev/poll"},r:0,i:"=>",c:[e.HCM,{cN:"string",c:[e.BE,r],v:[{b:/"/,e:/"/},{b:/'/,e:/'/}]},{b:"([a-z]+):/",e:"\\s",eW:!0,eE:!0,c:[r]},{cN:"regexp",c:[e.BE,r],v:[{b:"\\s\\^",e:"\\s|{|;",rE:!0},{b:"~\\*?\\s+",e:"\\s|{|;",rE:!0},{b:"\\*(\\.[a-z\\-]+)+"},{b:"([a-z\\-]+\\.)+\\*"}]},{cN:"number",b:"\\b\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}(:\\d{1,5})?\\b"},{cN:"number",b:"\\b\\d+[kKmMgGdshdwy]*\\b",r:0},r]};return{aliases:["nginxconf"],c:[e.HCM,{b:e.UIR+"\\s+{",rB:!0,e:"{",c:[{cN:"section",b:e.UIR}],r:0},{b:e.UIR+"\\s",e:";|{",rB:!0,c:[{cN:"attribute",b:e.UIR,starts:b}],r:0}],i:"[^\\s\\}]"}});hljs.registerLanguage("groovy",function(e){return{k:{literal:"true false null",keyword:"byte short char int long boolean float double void def as in assert trait super this abstract static volatile transient public private protected synchronized final class interface enum if else for while switch case break default continue throw throws try catch finally implements extends new import package return instanceof"},c:[e.C("/\\*\\*","\\*/",{r:0,c:[{b:/\w+@/,r:0},{cN:"doctag",b:"@[A-Za-z]+"}]}),e.CLCM,e.CBCM,{cN:"string",b:'"""',e:'"""'},{cN:"string",b:"'''",e:"'''"},{cN:"string",b:"\\$/",e:"/\\$",r:10},e.ASM,{cN:"regexp",b:/~?\/[^\/\n]+\//,c:[e.BE]},e.QSM,{cN:"meta",b:"^#!/usr/bin/env",e:"$",i:"\n"},e.BNM,{cN:"class",bK:"class interface trait enum",e:"{",i:":",c:[{bK:"extends implements"},e.UTM]},e.CNM,{cN:"meta",b:"@[A-Za-z]+"},{cN:"string",b:/[^\?]{0}[A-Za-z0-9_$]+ *:/},{b:/\?/,e:/\:/},{cN:"symbol",b:"^\\s*[A-Za-z0-9_$]+:",r:0}],i:/#|<\//}});hljs.registerLanguage("makefile",function(e){var i={cN:"variable",v:[{b:"\\$\\("+e.UIR+"\\)",c:[e.BE]},{b:/\$[@%)?",r="false synchronized int abstract float private char boolean static null if const for true while long strictfp finally protected import native final void enum else break transient catch instanceof byte super volatile case assert short package default double public try this switch continue throws protected public private module requires exports do",s="\\b(0[bB]([01]+[01_]+[01]+|[01]+)|0[xX]([a-fA-F0-9]+[a-fA-F0-9_]+[a-fA-F0-9]+|[a-fA-F0-9]+)|(([\\d]+[\\d_]+[\\d]+|[\\d]+)(\\.([\\d]+[\\d_]+[\\d]+|[\\d]+))?|\\.([\\d]+[\\d_]+[\\d]+|[\\d]+))([eE][-+]?\\d+)?)[lLfF]?",c={cN:"number",b:s,r:0};return{aliases:["jsp"],k:r,i:/<\/|#/,c:[e.C("/\\*\\*","\\*/",{r:0,c:[{b:/\w+@/,r:0},{cN:"doctag",b:"@[A-Za-z]+"}]}),e.CLCM,e.CBCM,e.ASM,e.QSM,{cN:"class",bK:"class interface",e:/[{;=]/,eE:!0,k:"class interface",i:/[:"\[\]]/,c:[{bK:"extends implements"},e.UTM]},{bK:"new throw return else",r:0},{cN:"function",b:"("+t+"\\s+)+"+e.UIR+"\\s*\\(",rB:!0,e:/[{;=]/,eE:!0,k:r,c:[{b:e.UIR+"\\s*\\(",rB:!0,r:0,c:[e.UTM]},{cN:"params",b:/\(/,e:/\)/,k:r,r:0,c:[e.ASM,e.QSM,e.CNM,e.CBCM]},e.CLCM,e.CBCM]},c,{cN:"meta",b:"@[A-Za-z]+"}]}});hljs.registerLanguage("http",function(e){var t="HTTP/[0-9\\.]+";return{aliases:["https"],i:"\\S",c:[{b:"^"+t,e:"$",c:[{cN:"number",b:"\\b\\d{3}\\b"}]},{b:"^[A-Z]+ (.*?) "+t+"$",rB:!0,e:"$",c:[{cN:"string",b:" ",e:" ",eB:!0,eE:!0},{b:t},{cN:"keyword",b:"[A-Z]+"}]},{cN:"attribute",b:"^\\w",e:": ",eE:!0,i:"\\n|\\s|=",starts:{e:"$",r:0}},{b:"\\n\\n",starts:{sL:[],eW:!0}}]}});hljs.registerLanguage("objectivec",function(e){var t={cN:"built_in",b:"\\b(AV|CA|CF|CG|CI|CL|CM|CN|CT|MK|MP|MTK|MTL|NS|SCN|SK|UI|WK|XC)\\w+"},_={keyword:"int float while char export sizeof typedef const struct for union unsigned long volatile static bool mutable if do return goto void enum else break extern asm case short default double register explicit signed typename this switch continue wchar_t inline readonly assign readwrite self @synchronized id typeof nonatomic super unichar IBOutlet IBAction strong weak copy in out inout bycopy byref oneway __strong __weak __block __autoreleasing @private @protected @public @try @property @end @throw @catch @finally @autoreleasepool @synthesize @dynamic @selector @optional @required @encode @package @import @defs @compatibility_alias __bridge __bridge_transfer __bridge_retained __bridge_retain __covariant __contravariant __kindof _Nonnull _Nullable _Null_unspecified __FUNCTION__ __PRETTY_FUNCTION__ __attribute__ getter setter retain unsafe_unretained nonnull nullable null_unspecified null_resettable class instancetype NS_DESIGNATED_INITIALIZER NS_UNAVAILABLE NS_REQUIRES_SUPER NS_RETURNS_INNER_POINTER NS_INLINE NS_AVAILABLE NS_DEPRECATED NS_ENUM NS_OPTIONS NS_SWIFT_UNAVAILABLE NS_ASSUME_NONNULL_BEGIN NS_ASSUME_NONNULL_END NS_REFINED_FOR_SWIFT NS_SWIFT_NAME NS_SWIFT_NOTHROW NS_DURING NS_HANDLER NS_ENDHANDLER NS_VALUERETURN NS_VOIDRETURN",literal:"false true FALSE TRUE nil YES NO NULL",built_in:"BOOL dispatch_once_t dispatch_queue_t dispatch_sync dispatch_async dispatch_once"},i=/[a-zA-Z@][a-zA-Z0-9_]*/,n="@interface @class @protocol @implementation";return{aliases:["mm","objc","obj-c"],k:_,l:i,i:""}]}]},{cN:"class",b:"("+n.split(" ").join("|")+")\\b",e:"({|$)",eE:!0,k:n,l:i,c:[e.UTM]},{b:"\\."+e.UIR,r:0}]}});hljs.registerLanguage("javascript",function(e){var r="[A-Za-z$_][0-9A-Za-z$_]*",t={keyword:"in of if for while finally var new function do return void else break catch instanceof with throw case default try this switch continue typeof delete let yield const export super debugger as async await static import from as",literal:"true false null undefined NaN Infinity",built_in:"eval isFinite isNaN parseFloat parseInt decodeURI decodeURIComponent encodeURI encodeURIComponent escape unescape Object Function Boolean Error EvalError InternalError RangeError ReferenceError StopIteration SyntaxError TypeError URIError Number Math Date String RegExp Array Float32Array Float64Array Int16Array Int32Array Int8Array Uint16Array Uint32Array Uint8Array Uint8ClampedArray ArrayBuffer DataView JSON Intl arguments require module console window document Symbol Set Map WeakSet WeakMap Proxy Reflect Promise"},a={cN:"number",v:[{b:"\\b(0[bB][01]+)"},{b:"\\b(0[oO][0-7]+)"},{b:e.CNR}],r:0},n={cN:"subst",b:"\\$\\{",e:"\\}",k:t,c:[]},c={cN:"string",b:"`",e:"`",c:[e.BE,n]};n.c=[e.ASM,e.QSM,c,a,e.RM];var s=n.c.concat([e.CBCM,e.CLCM]);return{aliases:["js","jsx"],k:t,c:[{cN:"meta",r:10,b:/^\s*['"]use (strict|asm)['"]/},{cN:"meta",b:/^#!/,e:/$/},e.ASM,e.QSM,c,e.CLCM,e.CBCM,a,{b:/[{,]\s*/,r:0,c:[{b:r+"\\s*:",rB:!0,r:0,c:[{cN:"attr",b:r,r:0}]}]},{b:"("+e.RSR+"|\\b(case|return|throw)\\b)\\s*",k:"return throw case",c:[e.CLCM,e.CBCM,e.RM,{cN:"function",b:"(\\(.*?\\)|"+r+")\\s*=>",rB:!0,e:"\\s*=>",c:[{cN:"params",v:[{b:r},{b:/\(\s*\)/},{b:/\(/,e:/\)/,eB:!0,eE:!0,k:t,c:s}]}]},{b://,sL:"xml",c:[{b:/<\w+\s*\/>/,skip:!0},{b:/<\w+/,e:/(\/\w+|\w+\/)>/,skip:!0,c:[{b:/<\w+\s*\/>/,skip:!0},"self"]}]}],r:0},{cN:"function",bK:"function",e:/\{/,eE:!0,c:[e.inherit(e.TM,{b:r}),{cN:"params",b:/\(/,e:/\)/,eB:!0,eE:!0,c:s}],i:/\[|%/},{b:/\$[(.]/},e.METHOD_GUARD,{cN:"class",bK:"class",e:/[{;=]/,eE:!0,i:/[:"\[\]]/,c:[{bK:"extends"},e.UTM]},{bK:"constructor",e:/\{/,eE:!0}],i:/#(?!!)/}});hljs.registerLanguage("lua",function(e){var t="\\[=*\\[",a="\\]=*\\]",r={b:t,e:a,c:["self"]},n=[e.C("--(?!"+t+")","$"),e.C("--"+t,a,{c:[r],r:10})];return{l:e.UIR,k:{literal:"true false nil",keyword:"and break do else elseif end for goto if in local not or repeat return then until while",built_in:"_G _ENV _VERSION __index __newindex __mode __call __metatable __tostring __len __gc __add __sub __mul __div __mod __pow __concat __unm __eq __lt __le assert collectgarbage dofile error getfenv getmetatable ipairs load loadfile loadstringmodule next pairs pcall print rawequal rawget rawset require select setfenvsetmetatable tonumber tostring type unpack xpcall arg selfcoroutine resume yield status wrap create running debug getupvalue debug sethook getmetatable gethook setmetatable setlocal traceback setfenv getinfo setupvalue getlocal getregistry getfenv io lines write close flush open output type read stderr stdin input stdout popen tmpfile math log max acos huge ldexp pi cos tanh pow deg tan cosh sinh random randomseed frexp ceil floor rad abs sqrt modf asin min mod fmod log10 atan2 exp sin atan os exit setlocale date getenv difftime remove time clock tmpname rename execute package preload loadlib loaded loaders cpath config path seeall string sub upper len gfind rep find match char dump gmatch reverse byte format gsub lower table setn insert getn foreachi maxn foreach concat sort remove"},c:n.concat([{cN:"function",bK:"function",e:"\\)",c:[e.inherit(e.TM,{b:"([_a-zA-Z]\\w*\\.)*([_a-zA-Z]\\w*:)?[_a-zA-Z]\\w*"}),{cN:"params",b:"\\(",eW:!0,c:n}].concat(n)},e.CNM,e.ASM,e.QSM,{cN:"string",b:t,e:a,c:[r],r:5}])}});hljs.registerLanguage("apache",function(e){var r={cN:"number",b:"[\\$%]\\d+"};return{aliases:["apacheconf"],cI:!0,c:[e.HCM,{cN:"section",b:""},{cN:"attribute",b:/\w+/,r:0,k:{nomarkup:"order deny allow setenv rewriterule rewriteengine rewritecond documentroot sethandler errordocument loadmodule options header listen serverroot servername"},starts:{e:/$/,r:0,k:{literal:"on off all"},c:[{cN:"meta",b:"\\s\\[",e:"\\]$"},{cN:"variable",b:"[\\$%]\\{",e:"\\}",c:["self",r]},r,e.QSM]}}],i:/\S/}});hljs.registerLanguage("xml",function(s){var e="[A-Za-z0-9\\._:-]+",t={eW:!0,i:/`]+/}]}]}]};return{aliases:["html","xhtml","rss","atom","xjb","xsd","xsl","plist"],cI:!0,c:[{cN:"meta",b:"",r:10,c:[{b:"\\[",e:"\\]"}]},s.C("",{r:10}),{b:"<\\!\\[CDATA\\[",e:"\\]\\]>",r:10},{b:/<\?(php)?/,e:/\?>/,sL:"php",c:[{b:"/\\*",e:"\\*/",skip:!0}]},{cN:"tag",b:"|$)",e:">",k:{name:"style"},c:[t],starts:{e:"",rE:!0,sL:["css","xml"]}},{cN:"tag",b:"|$)",e:">",k:{name:"script"},c:[t],starts:{e:"",rE:!0,sL:["actionscript","javascript","handlebars","xml"]}},{cN:"meta",v:[{b:/<\?xml/,e:/\?>/,r:10},{b:/<\?\w+/,e:/\?>/}]},{cN:"tag",b:"",c:[{cN:"name",b:/[^\/><\s]+/,r:0},t]}]}});hljs.registerLanguage("markdown",function(e){return{aliases:["md","mkdown","mkd"],c:[{cN:"section",v:[{b:"^#{1,6}",e:"$"},{b:"^.+?\\n[=-]{2,}$"}]},{b:"<",e:">",sL:"xml",r:0},{cN:"bullet",b:"^([*+-]|(\\d+\\.))\\s+"},{cN:"strong",b:"[*_]{2}.+?[*_]{2}"},{cN:"emphasis",v:[{b:"\\*.+?\\*"},{b:"_.+?_",r:0}]},{cN:"quote",b:"^>\\s+",e:"$"},{cN:"code",v:[{b:"^```w*s*$",e:"^```s*$"},{b:"`.+?`"},{b:"^( {4}| )",e:"$",r:0}]},{b:"^[-\\*]{3,}",e:"$"},{b:"\\[.+?\\][\\(\\[].*?[\\)\\]]",rB:!0,c:[{cN:"string",b:"\\[",e:"\\]",eB:!0,rE:!0,r:0},{cN:"link",b:"\\]\\(",e:"\\)",eB:!0,eE:!0},{cN:"symbol",b:"\\]\\[",e:"\\]",eB:!0,eE:!0}],r:10},{b:/^\[[^\n]+\]:/,rB:!0,c:[{cN:"symbol",b:/\[/,e:/\]/,eB:!0,eE:!0},{cN:"link",b:/:\s*/,e:/$/,eB:!0}]}]}});hljs.registerLanguage("scala",function(e){var t={cN:"meta",b:"@[A-Za-z]+"},a={cN:"subst",v:[{b:"\\$[A-Za-z0-9_]+"},{b:"\\${",e:"}"}]},r={cN:"string",v:[{b:'"',e:'"',i:"\\n",c:[e.BE]},{b:'"""',e:'"""',r:10},{b:'[a-z]+"',e:'"',i:"\\n",c:[e.BE,a]},{cN:"string",b:'[a-z]+"""',e:'"""',c:[a],r:10}]},c={cN:"symbol",b:"'\\w[\\w\\d_]*(?!')"},i={cN:"type",b:"\\b[A-Z][A-Za-z0-9_]*",r:0},s={cN:"title",b:/[^0-9\n\t "'(),.`{}\[\]:;][^\n\t "'(),.`{}\[\]:;]+|[^0-9\n\t "'(),.`{}\[\]:;=]/,r:0},n={cN:"class",bK:"class object trait type",e:/[:={\[\n;]/,eE:!0,c:[{bK:"extends with",r:10},{b:/\[/,e:/\]/,eB:!0,eE:!0,r:0,c:[i]},{cN:"params",b:/\(/,e:/\)/,eB:!0,eE:!0,r:0,c:[i]},s]},l={cN:"function",bK:"def",e:/[:={\[(\n;]/,eE:!0,c:[s]};return{k:{literal:"true false null",keyword:"type yield lazy override def with val var sealed abstract private trait object if forSome for while throw finally protected extends import final return else break new catch super class case package default try this match continue throws implicit"},c:[e.CLCM,e.CBCM,r,c,i,l,n,e.CNM,t]}});hljs.registerLanguage("matlab",function(e){var a=[e.CNM,{cN:"string",b:"'",e:"'",c:[e.BE,{b:"''"}]}],s={r:0,c:[{b:/'['\.]*/}]};return{k:{keyword:"break case catch classdef continue else elseif end enumerated events for function global if methods otherwise parfor persistent properties return spmd switch try while",built_in:"sin sind sinh asin asind asinh cos cosd cosh acos acosd acosh tan tand tanh atan atand atan2 atanh sec secd sech asec asecd asech csc cscd csch acsc acscd acsch cot cotd coth acot acotd acoth hypot exp expm1 log log1p log10 log2 pow2 realpow reallog realsqrt sqrt nthroot nextpow2 abs angle complex conj imag real unwrap isreal cplxpair fix floor ceil round mod rem sign airy besselj bessely besselh besseli besselk beta betainc betaln ellipj ellipke erf erfc erfcx erfinv expint gamma gammainc gammaln psi legendre cross dot factor isprime primes gcd lcm rat rats perms nchoosek factorial cart2sph cart2pol pol2cart sph2cart hsv2rgb rgb2hsv zeros ones eye repmat rand randn linspace logspace freqspace meshgrid accumarray size length ndims numel disp isempty isequal isequalwithequalnans cat reshape diag blkdiag tril triu fliplr flipud flipdim rot90 find sub2ind ind2sub bsxfun ndgrid permute ipermute shiftdim circshift squeeze isscalar isvector ans eps realmax realmin pi i inf nan isnan isinf isfinite j why compan gallery hadamard hankel hilb invhilb magic pascal rosser toeplitz vander wilkinson"},i:'(//|"|#|/\\*|\\s+/\\w+)',c:[{cN:"function",bK:"function",e:"$",c:[e.UTM,{cN:"params",v:[{b:"\\(",e:"\\)"},{b:"\\[",e:"\\]"}]}]},{b:/[a-zA-Z_][a-zA-Z_0-9]*'['\.]*/,rB:!0,r:0,c:[{b:/[a-zA-Z_][a-zA-Z_0-9]*/,r:0},s.c[0]]},{b:"\\[",e:"\\]",c:a,r:0,starts:s},{b:"\\{",e:/}/,c:a,r:0,starts:s},{b:/\)/,r:0,starts:s},e.C("^\\s*\\%\\{\\s*$","^\\s*\\%\\}\\s*$"),e.C("\\%","$")].concat(a)}});hljs.registerLanguage("json",function(e){var i={literal:"true false null"},n=[e.QSM,e.CNM],r={e:",",eW:!0,eE:!0,c:n,k:i},t={b:"{",e:"}",c:[{cN:"attr",b:/"/,e:/"/,c:[e.BE],i:"\\n"},e.inherit(r,{b:/:/})],i:"\\S"},c={b:"\\[",e:"\\]",c:[e.inherit(r)],i:"\\S"};return n.splice(n.length,0,t,c),{c:n,k:i,i:"\\S"}});hljs.registerLanguage("kotlin",function(e){var t={keyword:"abstract as val var vararg get set class object open private protected public noinline crossinline dynamic final enum if else do while for when throw try catch finally import package is in fun override companion reified inline lateinit initinterface annotation data sealed internal infix operator out by constructor super trait volatile transient native default",built_in:"Byte Short Char Int Long Boolean Float Double Void Unit Nothing",literal:"true false null"},r={cN:"keyword",b:/\b(break|continue|return|this)\b/,starts:{c:[{cN:"symbol",b:/@\w+/}]}},i={cN:"symbol",b:e.UIR+"@"},n={cN:"subst",b:"\\${",e:"}",c:[e.ASM,e.CNM]},a={cN:"variable",b:"\\$"+e.UIR},c={cN:"string",v:[{b:'"""',e:'"""',c:[a,n]},{b:"'",e:"'",i:/\n/,c:[e.BE]},{b:'"',e:'"',i:/\n/,c:[e.BE,a,n]}]},s={cN:"meta",b:"@(?:file|property|field|get|set|receiver|param|setparam|delegate)\\s*:(?:\\s*"+e.UIR+")?"},o={cN:"meta",b:"@"+e.UIR,c:[{b:/\(/,e:/\)/,c:[e.inherit(c,{cN:"meta-string"})]}]};return{k:t,c:[e.C("/\\*\\*","\\*/",{r:0,c:[{cN:"doctag",b:"@[A-Za-z]+"}]}),e.CLCM,e.CBCM,r,i,s,o,{cN:"function",bK:"fun",e:"[(]|$",rB:!0,eE:!0,k:t,i:/fun\s+(<.*>)?[^\s\(]+(\s+[^\s\(]+)\s*=/,r:5,c:[{b:e.UIR+"\\s*\\(",rB:!0,r:0,c:[e.UTM]},{cN:"type",b://,k:"reified",r:0},{cN:"params",b:/\(/,e:/\)/,endsParent:!0,k:t,r:0,c:[{b:/:/,e:/[=,\/]/,eW:!0,c:[{cN:"type",b:e.UIR},e.CLCM,e.CBCM],r:0},e.CLCM,e.CBCM,s,o,c,e.CNM]},e.CBCM]},{cN:"class",bK:"class interface trait",e:/[:\{(]|$/,eE:!0,i:"extends implements",c:[{bK:"public protected internal private constructor"},e.UTM,{cN:"type",b://,eB:!0,eE:!0,r:0},{cN:"type",b:/[,:]\s*/,e:/[<\(,]|$/,eB:!0,rE:!0},s,o]},c,{cN:"meta",b:"^#!/usr/bin/env",e:"$",i:"\n"},e.CNM]}}); \ No newline at end of file diff --git a/public/lib/jquery/jquery-3.2.1.min.js b/public/lib/jquery/jquery-3.2.1.min.js new file mode 100644 index 0000000..644d35e --- /dev/null +++ b/public/lib/jquery/jquery-3.2.1.min.js @@ -0,0 +1,4 @@ +/*! jQuery v3.2.1 | (c) JS Foundation and other contributors | jquery.org/license */ +!function(a,b){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){"use strict";var c=[],d=a.document,e=Object.getPrototypeOf,f=c.slice,g=c.concat,h=c.push,i=c.indexOf,j={},k=j.toString,l=j.hasOwnProperty,m=l.toString,n=m.call(Object),o={};function p(a,b){b=b||d;var c=b.createElement("script");c.text=a,b.head.appendChild(c).parentNode.removeChild(c)}var q="3.2.1",r=function(a,b){return new r.fn.init(a,b)},s=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,t=/^-ms-/,u=/-([a-z])/g,v=function(a,b){return b.toUpperCase()};r.fn=r.prototype={jquery:q,constructor:r,length:0,toArray:function(){return f.call(this)},get:function(a){return null==a?f.call(this):a<0?this[a+this.length]:this[a]},pushStack:function(a){var b=r.merge(this.constructor(),a);return b.prevObject=this,b},each:function(a){return r.each(this,a)},map:function(a){return this.pushStack(r.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(f.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(a<0?b:0);return this.pushStack(c>=0&&c0&&b-1 in a)}var x=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ha(),z=ha(),A=ha(),B=function(a,b){return a===b&&(l=!0),0},C={}.hasOwnProperty,D=[],E=D.pop,F=D.push,G=D.push,H=D.slice,I=function(a,b){for(var c=0,d=a.length;c+~]|"+K+")"+K+"*"),S=new RegExp("="+K+"*([^\\]'\"]*?)"+K+"*\\]","g"),T=new RegExp(N),U=new RegExp("^"+L+"$"),V={ID:new RegExp("^#("+L+")"),CLASS:new RegExp("^\\.("+L+")"),TAG:new RegExp("^("+L+"|[*])"),ATTR:new RegExp("^"+M),PSEUDO:new RegExp("^"+N),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+K+"*(even|odd|(([+-]|)(\\d*)n|)"+K+"*(?:([+-]|)"+K+"*(\\d+)|))"+K+"*\\)|)","i"),bool:new RegExp("^(?:"+J+")$","i"),needsContext:new RegExp("^"+K+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+K+"*((?:-\\d)?\\d*)"+K+"*\\)|)(?=[^-]|$)","i")},W=/^(?:input|select|textarea|button)$/i,X=/^h\d$/i,Y=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,$=/[+~]/,_=new RegExp("\\\\([\\da-f]{1,6}"+K+"?|("+K+")|.)","ig"),aa=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:d<0?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},ba=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ca=function(a,b){return b?"\0"===a?"\ufffd":a.slice(0,-1)+"\\"+a.charCodeAt(a.length-1).toString(16)+" ":"\\"+a},da=function(){m()},ea=ta(function(a){return a.disabled===!0&&("form"in a||"label"in a)},{dir:"parentNode",next:"legend"});try{G.apply(D=H.call(v.childNodes),v.childNodes),D[v.childNodes.length].nodeType}catch(fa){G={apply:D.length?function(a,b){F.apply(a,H.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function ga(a,b,d,e){var f,h,j,k,l,o,r,s=b&&b.ownerDocument,w=b?b.nodeType:9;if(d=d||[],"string"!=typeof a||!a||1!==w&&9!==w&&11!==w)return d;if(!e&&((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,p)){if(11!==w&&(l=Z.exec(a)))if(f=l[1]){if(9===w){if(!(j=b.getElementById(f)))return d;if(j.id===f)return d.push(j),d}else if(s&&(j=s.getElementById(f))&&t(b,j)&&j.id===f)return d.push(j),d}else{if(l[2])return G.apply(d,b.getElementsByTagName(a)),d;if((f=l[3])&&c.getElementsByClassName&&b.getElementsByClassName)return G.apply(d,b.getElementsByClassName(f)),d}if(c.qsa&&!A[a+" "]&&(!q||!q.test(a))){if(1!==w)s=b,r=a;else if("object"!==b.nodeName.toLowerCase()){(k=b.getAttribute("id"))?k=k.replace(ba,ca):b.setAttribute("id",k=u),o=g(a),h=o.length;while(h--)o[h]="#"+k+" "+sa(o[h]);r=o.join(","),s=$.test(a)&&qa(b.parentNode)||b}if(r)try{return G.apply(d,s.querySelectorAll(r)),d}catch(x){}finally{k===u&&b.removeAttribute("id")}}}return i(a.replace(P,"$1"),b,d,e)}function ha(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ia(a){return a[u]=!0,a}function ja(a){var b=n.createElement("fieldset");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ka(a,b){var c=a.split("|"),e=c.length;while(e--)d.attrHandle[c[e]]=b}function la(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&a.sourceIndex-b.sourceIndex;if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function na(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function oa(a){return function(b){return"form"in b?b.parentNode&&b.disabled===!1?"label"in b?"label"in b.parentNode?b.parentNode.disabled===a:b.disabled===a:b.isDisabled===a||b.isDisabled!==!a&&ea(b)===a:b.disabled===a:"label"in b&&b.disabled===a}}function pa(a){return ia(function(b){return b=+b,ia(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function qa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=ga.support={},f=ga.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return!!b&&"HTML"!==b.nodeName},m=ga.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=n.documentElement,p=!f(n),v!==n&&(e=n.defaultView)&&e.top!==e&&(e.addEventListener?e.addEventListener("unload",da,!1):e.attachEvent&&e.attachEvent("onunload",da)),c.attributes=ja(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ja(function(a){return a.appendChild(n.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Y.test(n.getElementsByClassName),c.getById=ja(function(a){return o.appendChild(a).id=u,!n.getElementsByName||!n.getElementsByName(u).length}),c.getById?(d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){return a.getAttribute("id")===b}},d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c?[c]:[]}}):(d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}},d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c,d,e,f=b.getElementById(a);if(f){if(c=f.getAttributeNode("id"),c&&c.value===a)return[f];e=b.getElementsByName(a),d=0;while(f=e[d++])if(c=f.getAttributeNode("id"),c&&c.value===a)return[f]}return[]}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){if("undefined"!=typeof b.getElementsByClassName&&p)return b.getElementsByClassName(a)},r=[],q=[],(c.qsa=Y.test(n.querySelectorAll))&&(ja(function(a){o.appendChild(a).innerHTML="",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+K+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+K+"*(?:value|"+J+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ja(function(a){a.innerHTML="";var b=n.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+K+"*[*^$|!~]?="),2!==a.querySelectorAll(":enabled").length&&q.push(":enabled",":disabled"),o.appendChild(a).disabled=!0,2!==a.querySelectorAll(":disabled").length&&q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=Y.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ja(function(a){c.disconnectedMatch=s.call(a,"*"),s.call(a,"[s!='']:x"),r.push("!=",N)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=Y.test(o.compareDocumentPosition),t=b||Y.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===n||a.ownerDocument===v&&t(v,a)?-1:b===n||b.ownerDocument===v&&t(v,b)?1:k?I(k,a)-I(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,g=[a],h=[b];if(!e||!f)return a===n?-1:b===n?1:e?-1:f?1:k?I(k,a)-I(k,b):0;if(e===f)return la(a,b);c=a;while(c=c.parentNode)g.unshift(c);c=b;while(c=c.parentNode)h.unshift(c);while(g[d]===h[d])d++;return d?la(g[d],h[d]):g[d]===v?-1:h[d]===v?1:0},n):n},ga.matches=function(a,b){return ga(a,null,null,b)},ga.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(S,"='$1']"),c.matchesSelector&&p&&!A[b+" "]&&(!r||!r.test(b))&&(!q||!q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return ga(b,n,null,[a]).length>0},ga.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},ga.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&C.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},ga.escape=function(a){return(a+"").replace(ba,ca)},ga.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},ga.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=ga.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=ga.selectors={cacheLength:50,createPseudo:ia,match:V,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(_,aa),a[3]=(a[3]||a[4]||a[5]||"").replace(_,aa),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||ga.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&ga.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return V.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&T.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(_,aa).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+K+")"+a+"("+K+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=ga.attr(d,a);return null==e?"!="===b:!b||(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(O," ")+" ").indexOf(c)>-1:"|="===b&&(e===c||e.slice(0,c.length+1)===c+"-"))}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h,t=!1;if(q){if(f){while(p){m=b;while(m=m[p])if(h?m.nodeName.toLowerCase()===r:1===m.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){m=q,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n&&j[2],m=n&&q.childNodes[n];while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if(1===m.nodeType&&++t&&m===b){k[a]=[w,n,t];break}}else if(s&&(m=b,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n),t===!1)while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if((h?m.nodeName.toLowerCase()===r:1===m.nodeType)&&++t&&(s&&(l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),k[a]=[w,t]),m===b))break;return t-=e,t===d||t%d===0&&t/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||ga.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ia(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=I(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ia(function(a){var b=[],c=[],d=h(a.replace(P,"$1"));return d[u]?ia(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ia(function(a){return function(b){return ga(a,b).length>0}}),contains:ia(function(a){return a=a.replace(_,aa),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ia(function(a){return U.test(a||"")||ga.error("unsupported lang: "+a),a=a.replace(_,aa).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:oa(!1),disabled:oa(!0),checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return X.test(a.nodeName)},input:function(a){return W.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:pa(function(){return[0]}),last:pa(function(a,b){return[b-1]}),eq:pa(function(a,b,c){return[c<0?c+b:c]}),even:pa(function(a,b){for(var c=0;c=0;)a.push(d);return a}),gt:pa(function(a,b,c){for(var d=c<0?c+b:c;++d1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function va(a,b,c){for(var d=0,e=b.length;d-1&&(f[j]=!(g[j]=l))}}else r=wa(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):G.apply(g,r)})}function ya(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=ta(function(a){return a===b},h,!0),l=ta(function(a){return I(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];i1&&ua(m),i>1&&sa(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(P,"$1"),c,i0,e=a.length>0,f=function(f,g,h,i,k){var l,o,q,r=0,s="0",t=f&&[],u=[],v=j,x=f||e&&d.find.TAG("*",k),y=w+=null==v?1:Math.random()||.1,z=x.length;for(k&&(j=g===n||g||k);s!==z&&null!=(l=x[s]);s++){if(e&&l){o=0,g||l.ownerDocument===n||(m(l),h=!p);while(q=a[o++])if(q(l,g||n,h)){i.push(l);break}k&&(w=y)}c&&((l=!q&&l)&&r--,f&&t.push(l))}if(r+=s,c&&s!==r){o=0;while(q=b[o++])q(t,u,g,h);if(f){if(r>0)while(s--)t[s]||u[s]||(u[s]=E.call(i));u=wa(u)}G.apply(i,u),k&&!f&&u.length>0&&r+b.length>1&&ga.uniqueSort(i)}return k&&(w=y,j=v),t};return c?ia(f):f}return h=ga.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=ya(b[c]),f[u]?d.push(f):e.push(f);f=A(a,za(e,d)),f.selector=a}return f},i=ga.select=function(a,b,c,e){var f,i,j,k,l,m="function"==typeof a&&a,n=!e&&g(a=m.selector||a);if(c=c||[],1===n.length){if(i=n[0]=n[0].slice(0),i.length>2&&"ID"===(j=i[0]).type&&9===b.nodeType&&p&&d.relative[i[1].type]){if(b=(d.find.ID(j.matches[0].replace(_,aa),b)||[])[0],!b)return c;m&&(b=b.parentNode),a=a.slice(i.shift().value.length)}f=V.needsContext.test(a)?0:i.length;while(f--){if(j=i[f],d.relative[k=j.type])break;if((l=d.find[k])&&(e=l(j.matches[0].replace(_,aa),$.test(i[0].type)&&qa(b.parentNode)||b))){if(i.splice(f,1),a=e.length&&sa(i),!a)return G.apply(c,e),c;break}}}return(m||h(a,n))(e,b,!p,c,!b||$.test(a)&&qa(b.parentNode)||b),c},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ja(function(a){return 1&a.compareDocumentPosition(n.createElement("fieldset"))}),ja(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||ka("type|href|height|width",function(a,b,c){if(!c)return a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ja(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ka("value",function(a,b,c){if(!c&&"input"===a.nodeName.toLowerCase())return a.defaultValue}),ja(function(a){return null==a.getAttribute("disabled")})||ka(J,function(a,b,c){var d;if(!c)return a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),ga}(a);r.find=x,r.expr=x.selectors,r.expr[":"]=r.expr.pseudos,r.uniqueSort=r.unique=x.uniqueSort,r.text=x.getText,r.isXMLDoc=x.isXML,r.contains=x.contains,r.escapeSelector=x.escape;var y=function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&r(a).is(c))break;d.push(a)}return d},z=function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c},A=r.expr.match.needsContext;function B(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()}var C=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i,D=/^.[^:#\[\.,]*$/;function E(a,b,c){return r.isFunction(b)?r.grep(a,function(a,d){return!!b.call(a,d,a)!==c}):b.nodeType?r.grep(a,function(a){return a===b!==c}):"string"!=typeof b?r.grep(a,function(a){return i.call(b,a)>-1!==c}):D.test(b)?r.filter(b,a,c):(b=r.filter(b,a),r.grep(a,function(a){return i.call(b,a)>-1!==c&&1===a.nodeType}))}r.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?r.find.matchesSelector(d,a)?[d]:[]:r.find.matches(a,r.grep(b,function(a){return 1===a.nodeType}))},r.fn.extend({find:function(a){var b,c,d=this.length,e=this;if("string"!=typeof a)return this.pushStack(r(a).filter(function(){for(b=0;b1?r.uniqueSort(c):c},filter:function(a){return this.pushStack(E(this,a||[],!1))},not:function(a){return this.pushStack(E(this,a||[],!0))},is:function(a){return!!E(this,"string"==typeof a&&A.test(a)?r(a):a||[],!1).length}});var F,G=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,H=r.fn.init=function(a,b,c){var e,f;if(!a)return this;if(c=c||F,"string"==typeof a){if(e="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:G.exec(a),!e||!e[1]&&b)return!b||b.jquery?(b||c).find(a):this.constructor(b).find(a);if(e[1]){if(b=b instanceof r?b[0]:b,r.merge(this,r.parseHTML(e[1],b&&b.nodeType?b.ownerDocument||b:d,!0)),C.test(e[1])&&r.isPlainObject(b))for(e in b)r.isFunction(this[e])?this[e](b[e]):this.attr(e,b[e]);return this}return f=d.getElementById(e[2]),f&&(this[0]=f,this.length=1),this}return a.nodeType?(this[0]=a,this.length=1,this):r.isFunction(a)?void 0!==c.ready?c.ready(a):a(r):r.makeArray(a,this)};H.prototype=r.fn,F=r(d);var I=/^(?:parents|prev(?:Until|All))/,J={children:!0,contents:!0,next:!0,prev:!0};r.fn.extend({has:function(a){var b=r(a,this),c=b.length;return this.filter(function(){for(var a=0;a-1:1===c.nodeType&&r.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?r.uniqueSort(f):f)},index:function(a){return a?"string"==typeof a?i.call(r(a),this[0]):i.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(r.uniqueSort(r.merge(this.get(),r(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function K(a,b){while((a=a[b])&&1!==a.nodeType);return a}r.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return y(a,"parentNode")},parentsUntil:function(a,b,c){return y(a,"parentNode",c)},next:function(a){return K(a,"nextSibling")},prev:function(a){return K(a,"previousSibling")},nextAll:function(a){return y(a,"nextSibling")},prevAll:function(a){return y(a,"previousSibling")},nextUntil:function(a,b,c){return y(a,"nextSibling",c)},prevUntil:function(a,b,c){return y(a,"previousSibling",c)},siblings:function(a){return z((a.parentNode||{}).firstChild,a)},children:function(a){return z(a.firstChild)},contents:function(a){return B(a,"iframe")?a.contentDocument:(B(a,"template")&&(a=a.content||a),r.merge([],a.childNodes))}},function(a,b){r.fn[a]=function(c,d){var e=r.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=r.filter(d,e)),this.length>1&&(J[a]||r.uniqueSort(e),I.test(a)&&e.reverse()),this.pushStack(e)}});var L=/[^\x20\t\r\n\f]+/g;function M(a){var b={};return r.each(a.match(L)||[],function(a,c){b[c]=!0}),b}r.Callbacks=function(a){a="string"==typeof a?M(a):r.extend({},a);var b,c,d,e,f=[],g=[],h=-1,i=function(){for(e=e||a.once,d=b=!0;g.length;h=-1){c=g.shift();while(++h-1)f.splice(c,1),c<=h&&h--}),this},has:function(a){return a?r.inArray(a,f)>-1:f.length>0},empty:function(){return f&&(f=[]),this},disable:function(){return e=g=[],f=c="",this},disabled:function(){return!f},lock:function(){return e=g=[],c||b||(f=c=""),this},locked:function(){return!!e},fireWith:function(a,c){return e||(c=c||[],c=[a,c.slice?c.slice():c],g.push(c),b||i()),this},fire:function(){return j.fireWith(this,arguments),this},fired:function(){return!!d}};return j};function N(a){return a}function O(a){throw a}function P(a,b,c,d){var e;try{a&&r.isFunction(e=a.promise)?e.call(a).done(b).fail(c):a&&r.isFunction(e=a.then)?e.call(a,b,c):b.apply(void 0,[a].slice(d))}catch(a){c.apply(void 0,[a])}}r.extend({Deferred:function(b){var c=[["notify","progress",r.Callbacks("memory"),r.Callbacks("memory"),2],["resolve","done",r.Callbacks("once memory"),r.Callbacks("once memory"),0,"resolved"],["reject","fail",r.Callbacks("once memory"),r.Callbacks("once memory"),1,"rejected"]],d="pending",e={state:function(){return d},always:function(){return f.done(arguments).fail(arguments),this},"catch":function(a){return e.then(null,a)},pipe:function(){var a=arguments;return r.Deferred(function(b){r.each(c,function(c,d){var e=r.isFunction(a[d[4]])&&a[d[4]];f[d[1]](function(){var a=e&&e.apply(this,arguments);a&&r.isFunction(a.promise)?a.promise().progress(b.notify).done(b.resolve).fail(b.reject):b[d[0]+"With"](this,e?[a]:arguments)})}),a=null}).promise()},then:function(b,d,e){var f=0;function g(b,c,d,e){return function(){var h=this,i=arguments,j=function(){var a,j;if(!(b=f&&(d!==O&&(h=void 0,i=[a]),c.rejectWith(h,i))}};b?k():(r.Deferred.getStackHook&&(k.stackTrace=r.Deferred.getStackHook()),a.setTimeout(k))}}return r.Deferred(function(a){c[0][3].add(g(0,a,r.isFunction(e)?e:N,a.notifyWith)),c[1][3].add(g(0,a,r.isFunction(b)?b:N)),c[2][3].add(g(0,a,r.isFunction(d)?d:O))}).promise()},promise:function(a){return null!=a?r.extend(a,e):e}},f={};return r.each(c,function(a,b){var g=b[2],h=b[5];e[b[1]]=g.add,h&&g.add(function(){d=h},c[3-a][2].disable,c[0][2].lock),g.add(b[3].fire),f[b[0]]=function(){return f[b[0]+"With"](this===f?void 0:this,arguments),this},f[b[0]+"With"]=g.fireWith}),e.promise(f),b&&b.call(f,f),f},when:function(a){var b=arguments.length,c=b,d=Array(c),e=f.call(arguments),g=r.Deferred(),h=function(a){return function(c){d[a]=this,e[a]=arguments.length>1?f.call(arguments):c,--b||g.resolveWith(d,e)}};if(b<=1&&(P(a,g.done(h(c)).resolve,g.reject,!b),"pending"===g.state()||r.isFunction(e[c]&&e[c].then)))return g.then();while(c--)P(e[c],h(c),g.reject);return g.promise()}});var Q=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;r.Deferred.exceptionHook=function(b,c){a.console&&a.console.warn&&b&&Q.test(b.name)&&a.console.warn("jQuery.Deferred exception: "+b.message,b.stack,c)},r.readyException=function(b){a.setTimeout(function(){throw b})};var R=r.Deferred();r.fn.ready=function(a){return R.then(a)["catch"](function(a){r.readyException(a)}),this},r.extend({isReady:!1,readyWait:1,ready:function(a){(a===!0?--r.readyWait:r.isReady)||(r.isReady=!0,a!==!0&&--r.readyWait>0||R.resolveWith(d,[r]))}}),r.ready.then=R.then;function S(){d.removeEventListener("DOMContentLoaded",S), +a.removeEventListener("load",S),r.ready()}"complete"===d.readyState||"loading"!==d.readyState&&!d.documentElement.doScroll?a.setTimeout(r.ready):(d.addEventListener("DOMContentLoaded",S),a.addEventListener("load",S));var T=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===r.type(c)){e=!0;for(h in c)T(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,r.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(r(a),c)})),b))for(;h1,null,!0)},removeData:function(a){return this.each(function(){X.remove(this,a)})}}),r.extend({queue:function(a,b,c){var d;if(a)return b=(b||"fx")+"queue",d=W.get(a,b),c&&(!d||Array.isArray(c)?d=W.access(a,b,r.makeArray(c)):d.push(c)),d||[]},dequeue:function(a,b){b=b||"fx";var c=r.queue(a,b),d=c.length,e=c.shift(),f=r._queueHooks(a,b),g=function(){r.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return W.get(a,c)||W.access(a,c,{empty:r.Callbacks("once memory").add(function(){W.remove(a,[b+"queue",c])})})}}),r.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length\x20\t\r\n\f]+)/i,la=/^$|\/(?:java|ecma)script/i,ma={option:[1,""],thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};ma.optgroup=ma.option,ma.tbody=ma.tfoot=ma.colgroup=ma.caption=ma.thead,ma.th=ma.td;function na(a,b){var c;return c="undefined"!=typeof a.getElementsByTagName?a.getElementsByTagName(b||"*"):"undefined"!=typeof a.querySelectorAll?a.querySelectorAll(b||"*"):[],void 0===b||b&&B(a,b)?r.merge([a],c):c}function oa(a,b){for(var c=0,d=a.length;c-1)e&&e.push(f);else if(j=r.contains(f.ownerDocument,f),g=na(l.appendChild(f),"script"),j&&oa(g),c){k=0;while(f=g[k++])la.test(f.type||"")&&c.push(f)}return l}!function(){var a=d.createDocumentFragment(),b=a.appendChild(d.createElement("div")),c=d.createElement("input");c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),b.appendChild(c),o.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,b.innerHTML="",o.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var ra=d.documentElement,sa=/^key/,ta=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,ua=/^([^.]*)(?:\.(.+)|)/;function va(){return!0}function wa(){return!1}function xa(){try{return d.activeElement}catch(a){}}function ya(a,b,c,d,e,f){var g,h;if("object"==typeof b){"string"!=typeof c&&(d=d||c,c=void 0);for(h in b)ya(a,h,c,d,b[h],f);return a}if(null==d&&null==e?(e=c,d=c=void 0):null==e&&("string"==typeof c?(e=d,d=void 0):(e=d,d=c,c=void 0)),e===!1)e=wa;else if(!e)return a;return 1===f&&(g=e,e=function(a){return r().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=r.guid++)),a.each(function(){r.event.add(this,b,e,d,c)})}r.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=W.get(a);if(q){c.handler&&(f=c,c=f.handler,e=f.selector),e&&r.find.matchesSelector(ra,e),c.guid||(c.guid=r.guid++),(i=q.events)||(i=q.events={}),(g=q.handle)||(g=q.handle=function(b){return"undefined"!=typeof r&&r.event.triggered!==b.type?r.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(L)||[""],j=b.length;while(j--)h=ua.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n&&(l=r.event.special[n]||{},n=(e?l.delegateType:l.bindType)||n,l=r.event.special[n]||{},k=r.extend({type:n,origType:p,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&r.expr.match.needsContext.test(e),namespace:o.join(".")},f),(m=i[n])||(m=i[n]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,o,g)!==!1||a.addEventListener&&a.addEventListener(n,g)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),r.event.global[n]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=W.hasData(a)&&W.get(a);if(q&&(i=q.events)){b=(b||"").match(L)||[""],j=b.length;while(j--)if(h=ua.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n){l=r.event.special[n]||{},n=(d?l.delegateType:l.bindType)||n,m=i[n]||[],h=h[2]&&new RegExp("(^|\\.)"+o.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;while(f--)k=m[f],!e&&p!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,o,q.handle)!==!1||r.removeEvent(a,n,q.handle),delete i[n])}else for(n in i)r.event.remove(a,n+b[j],c,d,!0);r.isEmptyObject(i)&&W.remove(a,"handle events")}},dispatch:function(a){var b=r.event.fix(a),c,d,e,f,g,h,i=new Array(arguments.length),j=(W.get(this,"events")||{})[b.type]||[],k=r.event.special[b.type]||{};for(i[0]=b,c=1;c=1))for(;j!==this;j=j.parentNode||this)if(1===j.nodeType&&("click"!==a.type||j.disabled!==!0)){for(f=[],g={},c=0;c-1:r.find(e,this,null,[j]).length),g[e]&&f.push(d);f.length&&h.push({elem:j,handlers:f})}return j=this,i\x20\t\r\n\f]*)[^>]*)\/>/gi,Aa=/\s*$/g;function Ea(a,b){return B(a,"table")&&B(11!==b.nodeType?b:b.firstChild,"tr")?r(">tbody",a)[0]||a:a}function Fa(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function Ga(a){var b=Ca.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function Ha(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(W.hasData(a)&&(f=W.access(a),g=W.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;c1&&"string"==typeof q&&!o.checkClone&&Ba.test(q))return a.each(function(e){var f=a.eq(e);s&&(b[0]=q.call(this,e,f.html())),Ja(f,b,c,d)});if(m&&(e=qa(b,a[0].ownerDocument,!1,a,d),f=e.firstChild,1===e.childNodes.length&&(e=f),f||d)){for(h=r.map(na(e,"script"),Fa),i=h.length;l")},clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=r.contains(a.ownerDocument,a);if(!(o.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||r.isXMLDoc(a)))for(g=na(h),f=na(a),d=0,e=f.length;d0&&oa(g,!i&&na(a,"script")),h},cleanData:function(a){for(var b,c,d,e=r.event.special,f=0;void 0!==(c=a[f]);f++)if(U(c)){if(b=c[W.expando]){if(b.events)for(d in b.events)e[d]?r.event.remove(c,d):r.removeEvent(c,d,b.handle);c[W.expando]=void 0}c[X.expando]&&(c[X.expando]=void 0)}}}),r.fn.extend({detach:function(a){return Ka(this,a,!0)},remove:function(a){return Ka(this,a)},text:function(a){return T(this,function(a){return void 0===a?r.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=a)})},null,a,arguments.length)},append:function(){return Ja(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ea(this,a);b.appendChild(a)}})},prepend:function(){return Ja(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ea(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return Ja(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return Ja(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(r.cleanData(na(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null!=a&&a,b=null==b?a:b,this.map(function(){return r.clone(this,a,b)})},html:function(a){return T(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if("string"==typeof a&&!Aa.test(a)&&!ma[(ka.exec(a)||["",""])[1].toLowerCase()]){a=r.htmlPrefilter(a);try{for(;c1)}});function _a(a,b,c,d,e){return new _a.prototype.init(a,b,c,d,e)}r.Tween=_a,_a.prototype={constructor:_a,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||r.easing._default,this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(r.cssNumber[c]?"":"px")},cur:function(){var a=_a.propHooks[this.prop];return a&&a.get?a.get(this):_a.propHooks._default.get(this)},run:function(a){var b,c=_a.propHooks[this.prop];return this.options.duration?this.pos=b=r.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):this.pos=b=a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):_a.propHooks._default.set(this),this}},_a.prototype.init.prototype=_a.prototype,_a.propHooks={_default:{get:function(a){var b;return 1!==a.elem.nodeType||null!=a.elem[a.prop]&&null==a.elem.style[a.prop]?a.elem[a.prop]:(b=r.css(a.elem,a.prop,""),b&&"auto"!==b?b:0)},set:function(a){r.fx.step[a.prop]?r.fx.step[a.prop](a):1!==a.elem.nodeType||null==a.elem.style[r.cssProps[a.prop]]&&!r.cssHooks[a.prop]?a.elem[a.prop]=a.now:r.style(a.elem,a.prop,a.now+a.unit)}}},_a.propHooks.scrollTop=_a.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},r.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2},_default:"swing"},r.fx=_a.prototype.init,r.fx.step={};var ab,bb,cb=/^(?:toggle|show|hide)$/,db=/queueHooks$/;function eb(){bb&&(d.hidden===!1&&a.requestAnimationFrame?a.requestAnimationFrame(eb):a.setTimeout(eb,r.fx.interval),r.fx.tick())}function fb(){return a.setTimeout(function(){ab=void 0}),ab=r.now()}function gb(a,b){var c,d=0,e={height:a};for(b=b?1:0;d<4;d+=2-b)c=ca[d],e["margin"+c]=e["padding"+c]=a;return b&&(e.opacity=e.width=a),e}function hb(a,b,c){for(var d,e=(kb.tweeners[b]||[]).concat(kb.tweeners["*"]),f=0,g=e.length;f1)},removeAttr:function(a){return this.each(function(){r.removeAttr(this,a)})}}),r.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return"undefined"==typeof a.getAttribute?r.prop(a,b,c):(1===f&&r.isXMLDoc(a)||(e=r.attrHooks[b.toLowerCase()]||(r.expr.match.bool.test(b)?lb:void 0)),void 0!==c?null===c?void r.removeAttr(a,b):e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:(a.setAttribute(b,c+""),c):e&&"get"in e&&null!==(d=e.get(a,b))?d:(d=r.find.attr(a,b), +null==d?void 0:d))},attrHooks:{type:{set:function(a,b){if(!o.radioValue&&"radio"===b&&B(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}},removeAttr:function(a,b){var c,d=0,e=b&&b.match(L);if(e&&1===a.nodeType)while(c=e[d++])a.removeAttribute(c)}}),lb={set:function(a,b,c){return b===!1?r.removeAttr(a,c):a.setAttribute(c,c),c}},r.each(r.expr.match.bool.source.match(/\w+/g),function(a,b){var c=mb[b]||r.find.attr;mb[b]=function(a,b,d){var e,f,g=b.toLowerCase();return d||(f=mb[g],mb[g]=e,e=null!=c(a,b,d)?g:null,mb[g]=f),e}});var nb=/^(?:input|select|textarea|button)$/i,ob=/^(?:a|area)$/i;r.fn.extend({prop:function(a,b){return T(this,r.prop,a,b,arguments.length>1)},removeProp:function(a){return this.each(function(){delete this[r.propFix[a]||a]})}}),r.extend({prop:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return 1===f&&r.isXMLDoc(a)||(b=r.propFix[b]||b,e=r.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){var b=r.find.attr(a,"tabindex");return b?parseInt(b,10):nb.test(a.nodeName)||ob.test(a.nodeName)&&a.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),o.optSelected||(r.propHooks.selected={get:function(a){var b=a.parentNode;return b&&b.parentNode&&b.parentNode.selectedIndex,null},set:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex)}}),r.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){r.propFix[this.toLowerCase()]=this});function pb(a){var b=a.match(L)||[];return b.join(" ")}function qb(a){return a.getAttribute&&a.getAttribute("class")||""}r.fn.extend({addClass:function(a){var b,c,d,e,f,g,h,i=0;if(r.isFunction(a))return this.each(function(b){r(this).addClass(a.call(this,b,qb(this)))});if("string"==typeof a&&a){b=a.match(L)||[];while(c=this[i++])if(e=qb(c),d=1===c.nodeType&&" "+pb(e)+" "){g=0;while(f=b[g++])d.indexOf(" "+f+" ")<0&&(d+=f+" ");h=pb(d),e!==h&&c.setAttribute("class",h)}}return this},removeClass:function(a){var b,c,d,e,f,g,h,i=0;if(r.isFunction(a))return this.each(function(b){r(this).removeClass(a.call(this,b,qb(this)))});if(!arguments.length)return this.attr("class","");if("string"==typeof a&&a){b=a.match(L)||[];while(c=this[i++])if(e=qb(c),d=1===c.nodeType&&" "+pb(e)+" "){g=0;while(f=b[g++])while(d.indexOf(" "+f+" ")>-1)d=d.replace(" "+f+" "," ");h=pb(d),e!==h&&c.setAttribute("class",h)}}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):r.isFunction(a)?this.each(function(c){r(this).toggleClass(a.call(this,c,qb(this),b),b)}):this.each(function(){var b,d,e,f;if("string"===c){d=0,e=r(this),f=a.match(L)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else void 0!==a&&"boolean"!==c||(b=qb(this),b&&W.set(this,"__className__",b),this.setAttribute&&this.setAttribute("class",b||a===!1?"":W.get(this,"__className__")||""))})},hasClass:function(a){var b,c,d=0;b=" "+a+" ";while(c=this[d++])if(1===c.nodeType&&(" "+pb(qb(c))+" ").indexOf(b)>-1)return!0;return!1}});var rb=/\r/g;r.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=r.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,r(this).val()):a,null==e?e="":"number"==typeof e?e+="":Array.isArray(e)&&(e=r.map(e,function(a){return null==a?"":a+""})),b=r.valHooks[this.type]||r.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=r.valHooks[e.type]||r.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(rb,""):null==c?"":c)}}}),r.extend({valHooks:{option:{get:function(a){var b=r.find.attr(a,"value");return null!=b?b:pb(r.text(a))}},select:{get:function(a){var b,c,d,e=a.options,f=a.selectedIndex,g="select-one"===a.type,h=g?null:[],i=g?f+1:e.length;for(d=f<0?i:g?f:0;d-1)&&(c=!0);return c||(a.selectedIndex=-1),f}}}}),r.each(["radio","checkbox"],function(){r.valHooks[this]={set:function(a,b){if(Array.isArray(b))return a.checked=r.inArray(r(a).val(),b)>-1}},o.checkOn||(r.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})});var sb=/^(?:focusinfocus|focusoutblur)$/;r.extend(r.event,{trigger:function(b,c,e,f){var g,h,i,j,k,m,n,o=[e||d],p=l.call(b,"type")?b.type:b,q=l.call(b,"namespace")?b.namespace.split("."):[];if(h=i=e=e||d,3!==e.nodeType&&8!==e.nodeType&&!sb.test(p+r.event.triggered)&&(p.indexOf(".")>-1&&(q=p.split("."),p=q.shift(),q.sort()),k=p.indexOf(":")<0&&"on"+p,b=b[r.expando]?b:new r.Event(p,"object"==typeof b&&b),b.isTrigger=f?2:3,b.namespace=q.join("."),b.rnamespace=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=e),c=null==c?[b]:r.makeArray(c,[b]),n=r.event.special[p]||{},f||!n.trigger||n.trigger.apply(e,c)!==!1)){if(!f&&!n.noBubble&&!r.isWindow(e)){for(j=n.delegateType||p,sb.test(j+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),i=h;i===(e.ownerDocument||d)&&o.push(i.defaultView||i.parentWindow||a)}g=0;while((h=o[g++])&&!b.isPropagationStopped())b.type=g>1?j:n.bindType||p,m=(W.get(h,"events")||{})[b.type]&&W.get(h,"handle"),m&&m.apply(h,c),m=k&&h[k],m&&m.apply&&U(h)&&(b.result=m.apply(h,c),b.result===!1&&b.preventDefault());return b.type=p,f||b.isDefaultPrevented()||n._default&&n._default.apply(o.pop(),c)!==!1||!U(e)||k&&r.isFunction(e[p])&&!r.isWindow(e)&&(i=e[k],i&&(e[k]=null),r.event.triggered=p,e[p](),r.event.triggered=void 0,i&&(e[k]=i)),b.result}},simulate:function(a,b,c){var d=r.extend(new r.Event,c,{type:a,isSimulated:!0});r.event.trigger(d,null,b)}}),r.fn.extend({trigger:function(a,b){return this.each(function(){r.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];if(c)return r.event.trigger(a,b,c,!0)}}),r.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(a,b){r.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),r.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}}),o.focusin="onfocusin"in a,o.focusin||r.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){r.event.simulate(b,a.target,r.event.fix(a))};r.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=W.access(d,b);e||d.addEventListener(a,c,!0),W.access(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=W.access(d,b)-1;e?W.access(d,b,e):(d.removeEventListener(a,c,!0),W.remove(d,b))}}});var tb=a.location,ub=r.now(),vb=/\?/;r.parseXML=function(b){var c;if(!b||"string"!=typeof b)return null;try{c=(new a.DOMParser).parseFromString(b,"text/xml")}catch(d){c=void 0}return c&&!c.getElementsByTagName("parsererror").length||r.error("Invalid XML: "+b),c};var wb=/\[\]$/,xb=/\r?\n/g,yb=/^(?:submit|button|image|reset|file)$/i,zb=/^(?:input|select|textarea|keygen)/i;function Ab(a,b,c,d){var e;if(Array.isArray(b))r.each(b,function(b,e){c||wb.test(a)?d(a,e):Ab(a+"["+("object"==typeof e&&null!=e?b:"")+"]",e,c,d)});else if(c||"object"!==r.type(b))d(a,b);else for(e in b)Ab(a+"["+e+"]",b[e],c,d)}r.param=function(a,b){var c,d=[],e=function(a,b){var c=r.isFunction(b)?b():b;d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(null==c?"":c)};if(Array.isArray(a)||a.jquery&&!r.isPlainObject(a))r.each(a,function(){e(this.name,this.value)});else for(c in a)Ab(c,a[c],b,e);return d.join("&")},r.fn.extend({serialize:function(){return r.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=r.prop(this,"elements");return a?r.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!r(this).is(":disabled")&&zb.test(this.nodeName)&&!yb.test(a)&&(this.checked||!ja.test(a))}).map(function(a,b){var c=r(this).val();return null==c?null:Array.isArray(c)?r.map(c,function(a){return{name:b.name,value:a.replace(xb,"\r\n")}}):{name:b.name,value:c.replace(xb,"\r\n")}}).get()}});var Bb=/%20/g,Cb=/#.*$/,Db=/([?&])_=[^&]*/,Eb=/^(.*?):[ \t]*([^\r\n]*)$/gm,Fb=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Gb=/^(?:GET|HEAD)$/,Hb=/^\/\//,Ib={},Jb={},Kb="*/".concat("*"),Lb=d.createElement("a");Lb.href=tb.href;function Mb(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(L)||[];if(r.isFunction(c))while(d=f[e++])"+"===d[0]?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function Nb(a,b,c,d){var e={},f=a===Jb;function g(h){var i;return e[h]=!0,r.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function Ob(a,b){var c,d,e=r.ajaxSettings.flatOptions||{};for(c in b)void 0!==b[c]&&((e[c]?a:d||(d={}))[c]=b[c]);return d&&r.extend(!0,a,d),a}function Pb(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===d&&(d=a.mimeType||b.getResponseHeader("Content-Type"));if(d)for(e in h)if(h[e]&&h[e].test(d)){i.unshift(e);break}if(i[0]in c)f=i[0];else{for(e in c){if(!i[0]||a.converters[e+" "+i[0]]){f=e;break}g||(g=e)}f=f||g}if(f)return f!==i[0]&&i.unshift(f),c[f]}function Qb(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}r.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:tb.href,type:"GET",isLocal:Fb.test(tb.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Kb,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":r.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?Ob(Ob(a,r.ajaxSettings),b):Ob(r.ajaxSettings,a)},ajaxPrefilter:Mb(Ib),ajaxTransport:Mb(Jb),ajax:function(b,c){"object"==typeof b&&(c=b,b=void 0),c=c||{};var e,f,g,h,i,j,k,l,m,n,o=r.ajaxSetup({},c),p=o.context||o,q=o.context&&(p.nodeType||p.jquery)?r(p):r.event,s=r.Deferred(),t=r.Callbacks("once memory"),u=o.statusCode||{},v={},w={},x="canceled",y={readyState:0,getResponseHeader:function(a){var b;if(k){if(!h){h={};while(b=Eb.exec(g))h[b[1].toLowerCase()]=b[2]}b=h[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return k?g:null},setRequestHeader:function(a,b){return null==k&&(a=w[a.toLowerCase()]=w[a.toLowerCase()]||a,v[a]=b),this},overrideMimeType:function(a){return null==k&&(o.mimeType=a),this},statusCode:function(a){var b;if(a)if(k)y.always(a[y.status]);else for(b in a)u[b]=[u[b],a[b]];return this},abort:function(a){var b=a||x;return e&&e.abort(b),A(0,b),this}};if(s.promise(y),o.url=((b||o.url||tb.href)+"").replace(Hb,tb.protocol+"//"),o.type=c.method||c.type||o.method||o.type,o.dataTypes=(o.dataType||"*").toLowerCase().match(L)||[""],null==o.crossDomain){j=d.createElement("a");try{j.href=o.url,j.href=j.href,o.crossDomain=Lb.protocol+"//"+Lb.host!=j.protocol+"//"+j.host}catch(z){o.crossDomain=!0}}if(o.data&&o.processData&&"string"!=typeof o.data&&(o.data=r.param(o.data,o.traditional)),Nb(Ib,o,c,y),k)return y;l=r.event&&o.global,l&&0===r.active++&&r.event.trigger("ajaxStart"),o.type=o.type.toUpperCase(),o.hasContent=!Gb.test(o.type),f=o.url.replace(Cb,""),o.hasContent?o.data&&o.processData&&0===(o.contentType||"").indexOf("application/x-www-form-urlencoded")&&(o.data=o.data.replace(Bb,"+")):(n=o.url.slice(f.length),o.data&&(f+=(vb.test(f)?"&":"?")+o.data,delete o.data),o.cache===!1&&(f=f.replace(Db,"$1"),n=(vb.test(f)?"&":"?")+"_="+ub++ +n),o.url=f+n),o.ifModified&&(r.lastModified[f]&&y.setRequestHeader("If-Modified-Since",r.lastModified[f]),r.etag[f]&&y.setRequestHeader("If-None-Match",r.etag[f])),(o.data&&o.hasContent&&o.contentType!==!1||c.contentType)&&y.setRequestHeader("Content-Type",o.contentType),y.setRequestHeader("Accept",o.dataTypes[0]&&o.accepts[o.dataTypes[0]]?o.accepts[o.dataTypes[0]]+("*"!==o.dataTypes[0]?", "+Kb+"; q=0.01":""):o.accepts["*"]);for(m in o.headers)y.setRequestHeader(m,o.headers[m]);if(o.beforeSend&&(o.beforeSend.call(p,y,o)===!1||k))return y.abort();if(x="abort",t.add(o.complete),y.done(o.success),y.fail(o.error),e=Nb(Jb,o,c,y)){if(y.readyState=1,l&&q.trigger("ajaxSend",[y,o]),k)return y;o.async&&o.timeout>0&&(i=a.setTimeout(function(){y.abort("timeout")},o.timeout));try{k=!1,e.send(v,A)}catch(z){if(k)throw z;A(-1,z)}}else A(-1,"No Transport");function A(b,c,d,h){var j,m,n,v,w,x=c;k||(k=!0,i&&a.clearTimeout(i),e=void 0,g=h||"",y.readyState=b>0?4:0,j=b>=200&&b<300||304===b,d&&(v=Pb(o,y,d)),v=Qb(o,v,y,j),j?(o.ifModified&&(w=y.getResponseHeader("Last-Modified"),w&&(r.lastModified[f]=w),w=y.getResponseHeader("etag"),w&&(r.etag[f]=w)),204===b||"HEAD"===o.type?x="nocontent":304===b?x="notmodified":(x=v.state,m=v.data,n=v.error,j=!n)):(n=x,!b&&x||(x="error",b<0&&(b=0))),y.status=b,y.statusText=(c||x)+"",j?s.resolveWith(p,[m,x,y]):s.rejectWith(p,[y,x,n]),y.statusCode(u),u=void 0,l&&q.trigger(j?"ajaxSuccess":"ajaxError",[y,o,j?m:n]),t.fireWith(p,[y,x]),l&&(q.trigger("ajaxComplete",[y,o]),--r.active||r.event.trigger("ajaxStop")))}return y},getJSON:function(a,b,c){return r.get(a,b,c,"json")},getScript:function(a,b){return r.get(a,void 0,b,"script")}}),r.each(["get","post"],function(a,b){r[b]=function(a,c,d,e){return r.isFunction(c)&&(e=e||d,d=c,c=void 0),r.ajax(r.extend({url:a,type:b,dataType:e,data:c,success:d},r.isPlainObject(a)&&a))}}),r._evalUrl=function(a){return r.ajax({url:a,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,"throws":!0})},r.fn.extend({wrapAll:function(a){var b;return this[0]&&(r.isFunction(a)&&(a=a.call(this[0])),b=r(a,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstElementChild)a=a.firstElementChild;return a}).append(this)),this},wrapInner:function(a){return r.isFunction(a)?this.each(function(b){r(this).wrapInner(a.call(this,b))}):this.each(function(){var b=r(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=r.isFunction(a);return this.each(function(c){r(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(a){return this.parent(a).not("body").each(function(){r(this).replaceWith(this.childNodes)}),this}}),r.expr.pseudos.hidden=function(a){return!r.expr.pseudos.visible(a)},r.expr.pseudos.visible=function(a){return!!(a.offsetWidth||a.offsetHeight||a.getClientRects().length)},r.ajaxSettings.xhr=function(){try{return new a.XMLHttpRequest}catch(b){}};var Rb={0:200,1223:204},Sb=r.ajaxSettings.xhr();o.cors=!!Sb&&"withCredentials"in Sb,o.ajax=Sb=!!Sb,r.ajaxTransport(function(b){var c,d;if(o.cors||Sb&&!b.crossDomain)return{send:function(e,f){var g,h=b.xhr();if(h.open(b.type,b.url,b.async,b.username,b.password),b.xhrFields)for(g in b.xhrFields)h[g]=b.xhrFields[g];b.mimeType&&h.overrideMimeType&&h.overrideMimeType(b.mimeType),b.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest");for(g in e)h.setRequestHeader(g,e[g]);c=function(a){return function(){c&&(c=d=h.onload=h.onerror=h.onabort=h.onreadystatechange=null,"abort"===a?h.abort():"error"===a?"number"!=typeof h.status?f(0,"error"):f(h.status,h.statusText):f(Rb[h.status]||h.status,h.statusText,"text"!==(h.responseType||"text")||"string"!=typeof h.responseText?{binary:h.response}:{text:h.responseText},h.getAllResponseHeaders()))}},h.onload=c(),d=h.onerror=c("error"),void 0!==h.onabort?h.onabort=d:h.onreadystatechange=function(){4===h.readyState&&a.setTimeout(function(){c&&d()})},c=c("abort");try{h.send(b.hasContent&&b.data||null)}catch(i){if(c)throw i}},abort:function(){c&&c()}}}),r.ajaxPrefilter(function(a){a.crossDomain&&(a.contents.script=!1)}),r.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(a){return r.globalEval(a),a}}}),r.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET")}),r.ajaxTransport("script",function(a){if(a.crossDomain){var b,c;return{send:function(e,f){b=r(" + + + + + + + + + + + + + + + + + + + diff --git a/public/paper/bibel92_guidel_h/index.html b/public/paper/bibel92_guidel_h/index.html new file mode 100644 index 0000000..6639f5a --- /dev/null +++ b/public/paper/bibel92_guidel_h/index.html @@ -0,0 +1,352 @@ + + + + + + Guidelines for the selection of weighting functions for h-infinity control - My digital brain + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+
+ +
+ + +
+
+
+
+ +
+

Guidelines for the selection of weighting functions for h-infinity control

+
+ +
+

Contents

+
+ +
+
+
+
+
Tags
+
H Infinity Control
+
Reference
+
(Bibel & Malyevac, 1992)
+
Author(s)
+
Bibel, J. E., & Malyevac, D. S.
+
Year
+
1992
+
+

Properties of feedback control

+

+
+ Figure 1: Control System Diagram
+

Figure 1: Control System Diagram

+
+
+ +

From the figure 1, we have:

+

\begin{align*} +y(s) &= T(s) r(s) + S(s) d(s) - T(s) n(s)\\\
+e(s) &= S(s) r(s) - S(s) d(s) - S(s) n(s)\\\
+u(s) &= S(s)K(s) r(s) - S(s)K(s) d(s) - S(s)K(s) n(s) +\end{align*}

+

With the following definitions

+
    +
  • \(L(s) = G(s)K(s)\) is the loop transfer matrix
  • +
  • \(S(s) = [I+G(s)K(s)]^{-1}\) is the Sensitivity function matrix
  • +
  • \(T(s) = [I+G(s)K(s)]^{-1}G(s)K(s)\) is the Transmissibility function matrix
  • +
+
+
+

\[ S(s) + T(s) = 1 \]

+
+
+
+
    +
  • Command following: \(S=0\) and \(T=1\) => large gains
  • +
  • Disturbance rejection: \(S=0\) => large gains
  • +
  • Sensor noise attenuation: \(T\) small where the noise is concentrated
  • +
  • Control Sensitivity minimization: \(K S\) small
  • +
  • Robustness to modeling errors: \(T\) small in the frequency range of the expected model undertainties
  • +
+
+

SISO tradeoff

+

We want \(S\) small for command following and disturbance rejection. +We want \(T\) small to remain insensitive to sensor noise and modeling errors and to reduce control sensitivity.

+

However we cannot keep both \(S\) and \(T\) small as \(S(s)+T(s)=1\).

+

We must determine some tradeoff between the sensitivity and the complementary sensitivity functions.

+

Usually, reference signals and disturbances occur at low frequencies, while noise and modeling errors are concentrated at high frequencies. The tradeoff, in a SISO sense, is to make \(|S(j\omega)|\) small as low frequencies and \(|T(j\omega)|\) small at high frequencies.

+

\(H_\infty\) and weighting functions

+
+
+

\(\mathcal{H}_\infty\) control is a design technique with a state-space computation solution that utilizes frequency-dependent weighting functions to tune the controller’s performance and robustness characteristics.

+
+

+
+ Figure 2: \(\mathcal{H}_\infty\) control framework
+

Figure 2: \(\mathcal{H}_\infty\) control framework

+
+
+ +

New design framework (figure 2): \(P(s)\) is the generalized plant transfer function matrix:

+
    +
  • \(w\): exogenous inputs
  • +
  • \(z\): regulated performance output
  • +
  • \(u\): control inputs
  • +
  • \(y\): measured output variables
  • +
+

The plant \(P\) has two inputs and two outputs, it can be decomposed into four sub-transfer function matrices: +\[P = \begin{bmatrix}P_{11} & P_{12} \ P_{21} & P_{22} \end{bmatrix}\]

+

Lower Linear Fractional Transformation

+

The transformation from the input \(w\) to the output \(z\), \(T_{zw}\) is called the Lower Linear Fractional Transformation \(F_l (P, K)\).

+
+
+

\[T_{zw} = F_l (P, K) = P_{11} + P_{12}K (I-P_{22})^{-1} P_{21}\]

+
+

The \(H_\infty\) control problem is to find a controller that minimizes \(\| T_{zw} \|_\infty\) over the space of all realizable controllers \(K(s)\) that stabilize the closed-loop system.

+

Weights for inputs/outputs signals

+

Since \(S\) and \(T\) cannot be minimized together at all frequency, weights are introduced to shape the solutions. Not only can \(S\) and \(T\) be weighted, but other regulated performance variables and inputs (figure 3).

+

+
+ Figure 3: Input and Output weights in \(\mathcal{H}_\infty\) framework
+

Figure 3: Input and Output weights in \(\mathcal{H}_\infty\) framework

+
+
+ +

The weights on the input and output variables are selected to reflect the spatial and frequency dependence of the respective signals and performance specifications.

+

These inputs and output weighting functions are defined as rational, stable and minimum-phase transfer function (no poles or zero in the right half plane).

+

General Guidelines for Weight Selection: \(W_S\)

+

\(W_S\) is selected to reflect the desired performance characteristics. +The sensitivity function \(S\) should have low gain at low frequency for good tracking performance and high gain at high frequencies to limit overshoot. +We have to select \(W_S\) such that \({W_S}^-1\) reflects the desired shape of \(S\).

+
+
+
    +
  • Low frequency gain: set to the inverse of the desired steady state tracking error
  • +
  • High frequency gain: set to limit overshoot (\(0.1\) to \(0.5\) is a good compromise between overshoot and response speed)
  • +
  • Crossover frequency: chosen to limit the maximum closed-loop time constant (\(\omega_c \approx 1/\tau\))
  • +
+
+

General Guidelines for Weight Selection: \(W_T\)

+

We want \(T\) near unity for good tracking of reference and near zero for noise suppresion.

+
+
+

A high pass weight is usualy used on \(T\) because the noise energy is mostly concentrated at high frequencies. It should have the following characteristics:

+
    +
  • The crossover frequency is chosen to limit the closed-loop bandwidth
  • +
  • The high frequency gain is set high to proide sensor noise rejection and high frequency gain attenuation
  • +
+
+

When using both \(W_S\) and \(W_T\), it is important to make sure that the magnitude of theise weights at the crossover frequency is less that one to not violate \(S+T=1\).

+

Unmodeled dynamics weighting function

+

Another method of limiting the controller bandwidth and providing high frequency gain attenuation is to use a high pass weight on an unmodeled dynamics uncertainty block that may be added from the plant input to the plant output (figure 4).

+

+
+ Figure 4: Unmodeled dynamics model
+

Figure 4: Unmodeled dynamics model

+
+
+ +

The weight is chosen to cover the expected worst case magnitude of the unmodeled dynamics. A typical unmodeled dynamics weighting function is shown figure 5.

+

+
+ Figure 5: Example of unmodeled dynamics weight
+

Figure 5: Example of unmodeled dynamics weight

+
+
+ +

Inputs and Output weighting function

+

It is possible to weight the control input and actuator rate. +This is used to prevent actuator saturation and limit amplification of sensor noise signals on the control input signal.

+

Typically actuator input weights are constant over frequency and set at the inverse of the saturation limit.

+

Order of the weighting functions

+

The order of the optimal controller is equal to the order of the nominal plant model plus the order of the weights. The complexity of the controller is increase as the order of the weights increases.

+

The order of the weights should be kept reasonably low to reduce the order of th resulting optimal compensator and avoid potential convergence problems in the DK interactions.

+

Bibliography

+

Bibel, J. E., & Malyevac, D. S., Guidelines for the selection of weighting functions for h-infinity control (1992).

+ +
+ + +
+
+
+
+ +
+ + + + +
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + diff --git a/public/paper/bryson93_contr_spacec_aircr/index.html b/public/paper/bryson93_contr_spacec_aircr/index.html new file mode 100644 index 0000000..787b458 --- /dev/null +++ b/public/paper/bryson93_contr_spacec_aircr/index.html @@ -0,0 +1,242 @@ + + + + + + Control of spacecraft and aircraft - My digital brain + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+
+ +
+ + +
+
+
+
+ +
+

Control of spacecraft and aircraft

+
+ +
+

Contents

+
+ +
+
+
+
+
Tags
+
HAC-HAC
+
Reference
+
(Bryson, 1993)
+
Author(s)
+
Bryson, A. E.
+
Year
+
1993
+
+

9.2.3 Roll-Off Filters

+
+

Synthesizing control logic using only one vibration mode means we are consciously neglecting the higher-order vibration modes. +When doing this, it is a good idea to insert “roll-off” into the control logic, so that the loop-transfer gain decreases rapidly with frequency beyond the control bandwidth. +This reduces the possibility of destabilizing the unmodelled higher frequency dynamics ("spillover").

+
+

9.5 Robust Compensator Synthesis

+
+

LQG synthesis using feedback of estimated states will produce almost the same good response as LQR […] for systems with control system bandwidths that are well below the frequency of the first vibration mode. +However, it may not be true for systems with higher control system bandwidths, even when one or more vibration modes are included in the control design model.

+
+ +
+

If a rate sensor is co-located with an actuator on a flexible body, and its signal is fed back to the actuator, all vibration modes are stabilized. +If a rate sensor is not co-located with an actuator on a flexible body, ans its signal is fed back to the actuator, some vibration modes are stabilized and others are destabilized, depending on the location of the sensor relative to the actuator.

+
+

9.5.2 Low-Authority Control/High-Authority Control

+
+

Figure fig:bryson93_hac_lac shows the concept of Low-Authority Control/High-Authority Control (LAC/HAC) is the s-plane. +LAC uses a co-located rate sensor to add damping to all the vibratory modes (but not the rigid-body mode). +HAC uses a separated displacement sensor to stabilize the rigid body mode, which slightly decreases the damping of the vibratory modes but not enough to produce instability (called “spillover”)

+
+

+
+ Figure 1: HAC-LAC control concept
+

Figure 1: HAC-LAC control concept

+
+
+ +
+

LAC/HAC is usually insensitive to small deviation of the plant dynamics away from the design values, that is, it is robust to plant parameter changes.

+
+

Bibliography

+

Bryson, A. E., Control of spacecraft and aircraft (1993), : Princeton university press Princeton, New Jersey.

+ +
+ + +
+
+
+
+ +
+ + + + +
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + diff --git a/public/paper/butler11_posit_contr_lithog_equip/index.html b/public/paper/butler11_posit_contr_lithog_equip/index.html new file mode 100644 index 0000000..1172326 --- /dev/null +++ b/public/paper/butler11_posit_contr_lithog_equip/index.html @@ -0,0 +1,203 @@ + + + + + + Position control in lithographic equipment - My digital brain + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+
+ +
+ + +
+
+
+
+ +
+

Position control in lithographic equipment

+
+ +
+

Contents

+
+ +
+
+
+
+
Tags
+
Multivariable Control, Positioning Stations
+
Reference
+
(Hans Butler, 2011)
+
Author(s)
+
Butler, H.
+
Year
+
2011
+
+

Bibliography

+

Butler, H., Position control in lithographic equipment, IEEE Control Systems, 31(5), 28–47 (2011). http://dx.doi.org/10.1109/mcs.2011.941882

+ +
+ + +
+
+
+
+ +
+ + + + +
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + diff --git a/public/paper/chen00_ident_decoup_contr_flexur_joint_hexap/index.html b/public/paper/chen00_ident_decoup_contr_flexur_joint_hexap/index.html new file mode 100644 index 0000000..50987dc --- /dev/null +++ b/public/paper/chen00_ident_decoup_contr_flexur_joint_hexap/index.html @@ -0,0 +1,205 @@ + + + + + + Identification and decoupling control of flexure jointed hexapods - My digital brain + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+
+ +
+ + +
+
+
+
+ +
+

Identification and decoupling control of flexure jointed hexapods

+
+ +
+

Contents

+
+ +
+
+
+
+
Tags
+
Stewart Platforms, Flexible Joints
+
Reference
+
(Yixin Chen & McInroy, 2000)
+
Author(s)
+
Chen, Y., & McInroy, J.
+
Year
+
2000
+
+

Bibliography

+

Chen, Y., & McInroy, J., Identification and decoupling control of flexure jointed hexapods, In , Proceedings 2000 ICRA. Millennium Conference. IEEE International Conference on Robotics and Automation. Symposia Proceedings (Cat. No.00CH37065) (pp. ) (2000). : .

+ +
+ + +
+
+
+
+ +
+ + + + +
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + diff --git a/public/paper/collette11_review_activ_vibrat_isolat_strat/index.html b/public/paper/collette11_review_activ_vibrat_isolat_strat/index.html new file mode 100644 index 0000000..0664c0f --- /dev/null +++ b/public/paper/collette11_review_activ_vibrat_isolat_strat/index.html @@ -0,0 +1,278 @@ + + + + + + Review of active vibration isolation strategies - My digital brain + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+
+ +
+ + +
+
+
+
+ +
+

Review of active vibration isolation strategies

+
+ +
+

Contents

+
+ +
+
+
+
+
Tags
+
Vibration Isolation
+
Reference
+
(Christophe Collette {\it et al.}, 2011)
+
Author(s)
+
Collette, C., Janssens, S., & Artoos, K.
+
Year
+
2011
+
+

Background and Motivations

+

Passive Isolation Tradeoffs

+
+
+

\[ X(s) = \underbrace{\frac{cs + k}{ms^2 + cs + k}}_{T_{wx}(s)} W(s) + \underbrace{\frac{1}{ms^2 + cs + k}}_{T_{Fx}(s)} F(s) \]

+
+
    +
  • \(T_{wx}(s)\) is called the transmissibility of the isolator. It characterize the way seismic vibrations \(w\) are transmitted to the equipment.
  • +
  • \(T_{Fx}(s)\) is called the compliance. It characterize the capacity of disturbing forces \(F\) to create motion \(x\) of the equipment.
  • +
+

In order to minimize the vibrations of a sensitive equipment, a general objective to design a good isolator is to minimize both \(\abs{T_{wx}}\) and \(\abs{T_{Fx}}\) in the frequency range of interest.

+

To decrease the amplitude of the overshoot at the resonance frequency, damping can be increased. +The price to pay is degradation of the isolation at high frequency (the roll off becomes \(-1\) instead of \(-2\)).

+

First Trade-off: Trade-off between damping and isolation.

+

To improve the transmissibility, the resonance frequency can be decreased. +However, the systems becomes more sensitive to external force \(F\) applied on the equipment.

+

Second trade-off: Trade-off between isolation and robustness to external force

+

Active Isolation

+

We apply a feedback control. +The general expression of the force delivered by the actuator is \(f = g_a \ddot{x} + g_v \dot{x} + g_p x\). \(g_a\), \(g_v\) and \(g_p\) are constant gains.

+

+
+ Table 1: + Active isolation techniques +
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Feedback SignalEffectApplications
AccelerationAdd virtual massFew
VelocityAdd virtual dashpot connected to the skySky-Hook Damping
PositionAdd virtual spring connected to the skySky-Hook Spring
+

Practical Realizations

+

Sensor Limitations

+

Conclusions

+

+
+ Figure 1: Comparison of Active Vibration Isolation Strategies
+

Figure 1: Comparison of Active Vibration Isolation Strategies

+
+
+ +

Bibliography

+

Collette, C., Janssens, S., & Artoos, K., Review of active vibration isolation strategies, Recent Patents on Mechanical Engineeringe, 4(3), 212–219 (2011). http://dx.doi.org/10.2174/2212797611104030212

+ +
+ + +
+
+
+
+ +
+ + + + +
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + diff --git a/public/paper/collette14_vibrat/index.html b/public/paper/collette14_vibrat/index.html new file mode 100644 index 0000000..bf16734 --- /dev/null +++ b/public/paper/collette14_vibrat/index.html @@ -0,0 +1,317 @@ + + + + + + Vibration control of flexible structures using fusion of inertial sensors and hyper-stable actuator-sensor pairs - My digital brain + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+
+ +
+ + +
+
+
+
+ +
+

Vibration control of flexible structures using fusion of inertial sensors and hyper-stable actuator-sensor pairs

+
+ +
+

Contents

+
+ +
+
+
+
+
Tags
+
Vibration Isolation, Sensor Fusion
+
Reference
+
(Collette & Matichard, 2014)
+
Author(s)
+
Collette, C., & Matichard, F.
+
Year
+
2014
+
+

Introduction

+

Sensor fusion is used to combine the benefits of different types of sensors:

+
    +
  • Relative sensor for DC positioning capability at low frequency
  • +
  • Inertial sensors for isolation at high frequency
  • +
  • Force sensor / collocated sensor to improve the robustness
  • +
+

Different types of sensors

+

In this paper, three types of sensors are used. Their advantages and disadvantages are summarized table 1.

+
+

Several types of sensors can be used for the feedback control of vibration isolation systems:

+
    +
  • Feedback control based on relative motion sensors (inductive, capactive, ferromagnetic sensors…) typically permits to servo-position a system or platform relative to a reference (e.g. floor or support base), but does not provide isolation from the ground motion.
  • +
  • Feedback control based on force sensors typically lowers the effective natural frequency, and therefore increases the isolation, but sacrifices the systems compliance in doing so.
  • +
  • Feedback control based on inertial sensors (geophones, seismometers, accelerometers…) improves not only the vibration isolation but also the compliance. Inertial sensors are, however, AC coupled and noisy at low frequencies.
  • +
+
+

+
+ Table 1: + Types of sensors +
+ + + + + + + + + + + + + + + + + + + + + + + + + +
SensorsAdvantagesDisadvantages
Relative motionServo-positionNo isolation from gorund motion
Force sensorsImprove isolationIncrease compliance
Inertial sensorsImprove isolation and complianceAC couple and noisy at high frequency
+

Inertial Control and sensor fusion configurations

+

For a simple 1DoF model, two fusion-sensor configuration are studied. The results are summarized Table 2.

+

+
+ Table 2: + Sensor fusion configurations +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Low freq. sensorHigh freq. sensorTransmissibilityComplianceTrade-off
InertialForce sensorUnchangedDegradedSensor noise filtering / compliance degradation
InertialRelative sensorDegradedUnchangedIsolation in the bandwidth / amplification outside
+

Flexible structure

+

Flexibility is added between the inertial sensor and the actuator. +Now the sensor and actuator are not collocated anymore and the system is unstable because there is no zero between the two poles. +We use sensor fusion to obtain stability at high frequency.

+

Inertial and small accelerometer

+

The idea is to use a small accelerometer which is easier to locate near the actuator at high frequency. +However, it is important to verify that the noise introduced by the accelerometer does not degrades too much the isolation performance.

+

Inertial and force sensor

+

Here the advantage is that the deformation mode is almost not present in the open-loop transfer function. +This simplifies the loop shaping of the controller.

+

Inertial and relative sensor

+

The relative sensor introduces coupling between both side of the actuator which induces degradation of the isolation at high frequency. However, the compliance remains unchanged at high frequency.

+

Conclusion

+

Fusion of inertial instruments with sensors collocated with the actuator permits to increase the feedback control bandwidth of active isolation systems.

+

Three types of sensors have been considered for the high frequency part of the fusion:

+
    +
  • The fusion with a relative sensor improves the stability but compromises the transmissibility. It can be of interested for stiff suspension where high frequency isolation can be sacrified to improve stability.
  • +
  • The fusion with an accelerometre is used to increase the loop gain. However, as the accelerometer is not dual with the actuator, there is no guaranty stability when the isolation stage is mounted on a flexible support.
  • +
  • The fusion with a force sensor can be used to increase the loop gain with little effect on the compliance and passive isolation, provided that the blend is possible and that no active damping of flexible modes is required.
  • +
+

Bibliography

+

Collette, C., & Matichard, F., Vibration control of flexible structures using fusion of inertial sensors and hyper-stable actuator-sensor pairs, In , International Conference on Noise and Vibration Engineering (ISMA2014) (pp. ) (2014). : .

+ +
+ + +
+
+
+
+ +
+ + + + +
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + diff --git a/public/paper/collette15_sensor_fusion_method_high_perfor/index.html b/public/paper/collette15_sensor_fusion_method_high_perfor/index.html new file mode 100644 index 0000000..1dce473 --- /dev/null +++ b/public/paper/collette15_sensor_fusion_method_high_perfor/index.html @@ -0,0 +1,210 @@ + + + + + + Sensor fusion methods for high performance active vibration isolation systems - My digital brain + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+
+ +
+ + +
+
+
+
+ +
+

Sensor fusion methods for high performance active vibration isolation systems

+
+ +
+

Contents

+
+ +
+
+
+
+
Tags
+
Sensor Fusion, Vibration Isolation
+
Reference
+
(Collette & Matichard, 2015)
+
Author(s)
+
Collette, C., & Matichard, F.
+
Year
+
2015
+
+

In order to have good stability margins, it is common practice to collocate sensors and actuators. This ensures alternating poles and zeros along the imaginary axis. Then, each phase lag introduced by the poles is compensed by phase leag introduced by the zeroes. This guarantees stability and such system is referred to as hyperstable.

+

In this paper, we study and compare different sensor fusion methods combining inertial sensors at low frequency with sensors adding stability at high frequency. +The stability margins of the controller can be significantly increased with no or little effect on the low-frequency active isolation, provided that the two following conditions are fulfilled:

+
    +
  • the high frequency sensor and the actuator are dual
  • +
  • there exists a bandwidth where we can superimpose the open loop transfer functions obtained with the two sensors.
  • +
+

Bibliography

+

Collette, C., & Matichard, F., Sensor fusion methods for high performance active vibration isolation systems, Journal of Sound and Vibration, 342(nil), 1–21 (2015). http://dx.doi.org/10.1016/j.jsv.2015.01.006

+ +
+ + +
+
+
+
+ +
+ + + + +
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + diff --git a/public/paper/dasgupta00_stewar_platf_manip/index.html b/public/paper/dasgupta00_stewar_platf_manip/index.html new file mode 100644 index 0000000..460758b --- /dev/null +++ b/public/paper/dasgupta00_stewar_platf_manip/index.html @@ -0,0 +1,251 @@ + + + + + + The stewart platform manipulator: a review - My digital brain + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+
+ +
+ + +
+
+
+
+ +
+

The stewart platform manipulator: a review

+
+ +
+

Contents

+
+ +
+
+
+
+
Tags
+
Stewart Platforms
+
Reference
+
(Bhaskar Dasgupta & Mruthyunjaya, 2000)
+
Author(s)
+
Dasgupta, B., & Mruthyunjaya, T.
+
Year
+
2000
+
+

+
+ Table 1: + Parallel VS serial manipulators +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
AdvantagesDisadvantages
SerialManoeuverabilityPoor precision
Large workspaceBends under high load
Vibrate at high speed
ParallelHigh stiffnessSmall workspace
Good dynamic performances
Precise positioning
+

The generalized Stewart platforms consists of two rigid bodies (referred to as the base and the platoform) connected through six extensible legs, each with sherical joints at both ends.

+

Bibliography

+

Dasgupta, B., & Mruthyunjaya, T., The stewart platform manipulator: a review, Mechanism and Machine Theory, 35(1), 15–40 (2000). http://dx.doi.org/10.1016/s0094-114x(99)00006-3

+ +
+ + +
+
+
+
+ +
+ + + + +
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + diff --git a/public/paper/devasia07_survey_contr_issues_nanop/index.html b/public/paper/devasia07_survey_contr_issues_nanop/index.html new file mode 100644 index 0000000..2ec3ded --- /dev/null +++ b/public/paper/devasia07_survey_contr_issues_nanop/index.html @@ -0,0 +1,220 @@ + + + + + + A survey of control issues in nanopositioning - My digital brain + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+
+ +
+ + +
+
+
+
+ +
+

A survey of control issues in nanopositioning

+
+ +
+

Contents

+
+ +
+
+
+

Tags +:

+
+
Reference
+
(Devasia {\it et al.}, 2007)
+
Author(s)
+
Devasia, S., Eleftheriou, E., & Moheimani, S. R.
+
Year
+
2007
+
+
    +
  • Talks about Scanning Tunneling Microscope (STM) and Scanning Probe Microscope (SPM)
  • +
  • Piezoelectric actuators: Creep, Hysteresis, Vibrations, Modeling errors
  • +
  • Interesting analysis about Bandwidth-Precision-Range tradeoffs
  • +
  • Control approaches for piezoelectric actuators: feedforward, Feedback, Iterative, Sensorless controls
  • +
+

+
+ Figure 1: Tradeoffs between bandwidth, precision and range
+

Figure 1: Tradeoffs between bandwidth, precision and range

+
+
+ +

Bibliography

+

Devasia, S., Eleftheriou, E., & Moheimani, S. R., A survey of control issues in nanopositioning, IEEE Transactions on Control Systems Technology, 15(5), 802–823 (2007).

+ +
+ + +
+
+
+
+ +
+ + + + +
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + diff --git a/public/paper/fleming10_nanop_system_with_force_feedb/index.html b/public/paper/fleming10_nanop_system_with_force_feedb/index.html new file mode 100644 index 0000000..241a9a1 --- /dev/null +++ b/public/paper/fleming10_nanop_system_with_force_feedb/index.html @@ -0,0 +1,309 @@ + + + + + + Nanopositioning system with force feedback for high-performance tracking and vibration control - My digital brain + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+
+ +
+ + +
+
+
+
+ +
+

Nanopositioning system with force feedback for high-performance tracking and vibration control

+
+ +
+

Contents

+
+ +
+
+
+
+
Tags
+
Sensor Fusion, Force Sensors
+
Reference
+
(Fleming, 2010)
+
Author(s)
+
Fleming, A.
+
Year
+
2010
+
+

Summary:

+
    +
  • The noise generated by a piezoelectric force sensor is much less than a capacitive sensor
  • +
  • Dynamical model of a piezoelectric stack actuator and piezoelectric force sensor
  • +
  • Noise of a piezoelectric force sensor
  • +
  • IFF with a piezoelectric stack actuator and piezoelectric force sensor
  • +
  • A force sensor is used as a displacement sensor below the frequency of the first zero
  • +
  • Sensor fusion architecture with a capacitive sensor and a force sensor and using complementary filters
  • +
  • Virtual sensor fusion architecture (called low-frequency bypass)
  • +
  • Analog implementation of the control strategies to avoid quantization noise, finite resolution and sampling delay
  • +
+

Model of a multi-layer monolithic piezoelectric stack actuator

+

+
+ Figure 1: Schematic of a multi-layer monolithic piezoelectric stack actuator model
+

Figure 1: Schematic of a multi-layer monolithic piezoelectric stack actuator model

+
+
+ +

The actuator experiences an internal stress in response to an applied voltage. +This stress is represented by the voltage dependent force \(F_a\) and is related to free displacement by +\[ \Delta L = \frac{F_a}{k_a} \]

+
    +
  • \(\Delta L\) is the change in actuator length in [m]
  • +
  • \(k_a\) is the actuator stiffness in [N/m]
  • +
+

The developed force \(F_a\) is related to the applied voltage by: +\[ \Delta L = d_{33} n V_a \]

+
    +
  • \(d_{33}\) is the piezoelectric strain constant in [m/V]
  • +
  • \(n\) is the number of layers
  • +
  • \(V_a\) is the applied voltage in [V]
  • +
+

Combining the two equations, we obtain: +\[ F_a = d_{33} n k_a V_a \]

+

The ratio of the developed force to applied voltage is \(d_{33} n k_a\) in [N/V]. +We denote this constant by \(g_a\) and: +\[ F_a = g_a V_a, \quad g_a = d_{33} n k_a \]

+

Dynamics of a piezoelectric force sensor

+

Piezoelectric force sensors provide a high sensitivity and bandwidth with low noise at high frequencies.

+

If a single wafer of piezoelectric material is sandwiched between the actuator and platform: +\[ D = d_{33} T \]

+
    +
  • \(D\) is the amount of generated charge per unit area in \([C/m^2]\)
  • +
  • \(T\) is the stress in \([N/m^2]\)
  • +
  • \(d_{33}\) is the piezoelectric strain constant in \([m/V] = [C/N]\)
  • +
+

The generated charge is then +\[ q = d_{33} F_s \]

+

If an n-layer piezoelectric transducer is used as a force sensor, the generated charge is then: +\[ q = n d_{33} F_s \]

+
+

We can use a charge amplifier to measure the force \(F_s\).

+
+ Figure 2: Electrical model of a piezoelectric force sensor is shown in gray. Developed charge \(q\) is proportional to the strain and hence the force experienced by the sensor. Op-amp charge amplifier produces an output voltage \(V_s\) equal to \(-q/C_s\)
+

Figure 2: Electrical model of a piezoelectric force sensor is shown in gray. Developed charge \(q\) is proportional to the strain and hence the force experienced by the sensor. Op-amp charge amplifier produces an output voltage \(V_s\) equal to \(-q/C_s\)

+
+
+ +

The output voltage \(V_s\) is equal to +\[ V_s = -\frac{q}{C_s} = -\frac{n d_{33}F_s}{C_s} \] +that is, the scaling between the force and voltage is \(-\frac{n d_{33}F_s}{C_s}\ [V/N]\) .

+
+

We can also use a voltage amplifier. +In that case, the generated charge is deposited on the transducer’s internal capacitance.

+

The open-circuit voltage of a piezoelectric force sensor is: +\[ V_s = \frac{n d_{33} F_s}{C} \]

+
    +
  • \(C\) is the transducer capacitance defined by \(C = n \epsilon_T A / h\) in [F] +
      +
    • \(A\) is the area in \([m^2]\)
    • +
    • \(h\) is the layer thickness in [m]
    • +
    • \(\epsilon_T\) is the dielectric permittivity under a constant stress in \([F/m]\)
    • +
    +
  • +
+

We obtain +\[ V_s = g_s F_s, \quad g_s = \frac{n d_{33}}{C} \]

+

Noise of a piezoelectric force sensor

+

As piezoelectric sensors have a capacitive source impedance, the sensor noise density \(N_{V_s}(\omega)\) is primarily due to current noise \(i_n\) reacting the capacitive source impedance: +\[ N_{V_s}(\omega) = i_n \frac{1}{C \omega} \]

+
    +
  • \(N_{V_s}\) is the measured noise in \(V/\sqrt{\text{Hz}}\)
  • +
  • \(i_n\) is the current noise in \(A/\sqrt{\text{Hz}}\)
  • +
  • \(C\) is the capacitance of the piezoelectric in \(F\)
  • +
+

The current noise density of a general purpose LM833 FET-input op-amp is \(0.5\ pA/\sqrt{\text{Hz}}\). +The capacitance of a piezoelectric stack is typically between \(1 \mu F\) and \(100 \mu F\).

+

Bibliography

+

Fleming, A., Nanopositioning system with force feedback for high-performance tracking and vibration control, IEEE/ASME Transactions on Mechatronics, 15(3), 433–447 (2010). http://dx.doi.org/10.1109/tmech.2009.2028422

+ + + +
+ + +
+
+
+
+ +
+ + + + +
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + diff --git a/public/paper/fleming12_estim/index.html b/public/paper/fleming12_estim/index.html new file mode 100644 index 0000000..10214a9 --- /dev/null +++ b/public/paper/fleming12_estim/index.html @@ -0,0 +1,205 @@ + + + + + + Estimating the resolution of nanopositioning systems from frequency domain data - My digital brain + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+
+ +
+ + +
+
+
+
+ +
+

Estimating the resolution of nanopositioning systems from frequency domain data

+
+ +
+

Contents

+
+ +
+
+
+

Tags +:

+
+
Reference
+
(Andrew Fleming, 2012)
+
Author(s)
+
Fleming, A. J.
+
Year
+
2012
+
+

Bibliography

+

Fleming, A. J., Estimating the resolution of nanopositioning systems from frequency domain data, In , 2012 IEEE International Conference on Robotics and Automation (pp. ) (2012). : .

+ +
+ + +
+
+
+
+ +
+ + + + +
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + diff --git a/public/paper/fleming13_review_nanom_resol_posit_sensor/index.html b/public/paper/fleming13_review_nanom_resol_posit_sensor/index.html new file mode 100644 index 0000000..571da12 --- /dev/null +++ b/public/paper/fleming13_review_nanom_resol_posit_sensor/index.html @@ -0,0 +1,409 @@ + + + + + + A review of nanometer resolution position sensors: operation and performance - My digital brain + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+
+ +
+ + +
+
+
+
+ +
+

A review of nanometer resolution position sensors: operation and performance

+
+ +
+

Contents

+
+ +
+
+
+
+
Tags
+
Position Sensors
+
Reference
+
(Andrew Fleming, 2013)
+
Author(s)
+
Fleming, A. J.
+
Year
+
2013
+
+
    +
  • Define concise performance metric and provide expressions for errors sources (non-linearity, drift, noise)
  • +
  • Review current position sensor technologies and compare their performance
  • +
+

Sensor Characteristics

+

Calibration and nonlinearity

+

Usually quoted as a percentage of the fill-scale range (FSR):

+

\begin{equation} +\text{mapping error (%)} = \pm 100 \frac{\max{}|e_m(v)|}{\text{FSR}} +\end{equation}

+

With \(e_m(v)\) is the mapping error.

+

+
+ Figure 1: The actual position versus the output voltage of a position sensor. The calibration function \(f_{cal}(v)\) is an approximation of the sensor mapping function \(f_a(v)\) where \(v\) is the voltage resulting from a displacement \(x\). \(e_m(v)\) is the residual error.
+

Figure 1: The actual position versus the output voltage of a position sensor. The calibration function \(f_{cal}(v)\) is an approximation of the sensor mapping function \(f_a(v)\) where \(v\) is the voltage resulting from a displacement \(x\). \(e_m(v)\) is the residual error.

+
+
+ +

Drift and Stability

+

If the shape of the mapping function actually varies with time, the maximum error due to drift must be evaluated by finding the worst-case mapping error.

+

+
+ Figure 2: The worst case range of a linear mapping function \(f_a(v)\) for a given error in sensitivity and offset.
+

Figure 2: The worst case range of a linear mapping function \(f_a(v)\) for a given error in sensitivity and offset.

+
+
+ +

Bandwidth

+

The bandwidth of a position sensor is the frequency at which the magnitude of the transfer function \(P(s) = v(s)/x(s)\) drops by \(3,dB\).

+

Although the bandwidth specification is useful for predicting the resolution of sensor, it reveals very little about the measurement errors caused by sensor dynamics.

+

The frequency domain position error is

+

\begin{equation} +\begin{aligned} +e_{bw}(s) &= x(s) - v(s) \\\
+&= x(s) (1 - P(s)) +\end{aligned} +\end{equation}

+

If the actual position is a sinewave of peak amplitude \(A = \text{FSR}/2\):

+

\begin{equation} +\begin{aligned} +e_{bw} &= \pm \frac{\text{FSR}}{2} |1 - P(s)| \\\
+&\approx \pm A n \frac{f}{f_c} +\end{aligned} +\end{equation}

+

with \(n\) is the low pass filter order corresponding to the sensor dynamics and \(f_c\) is the measurement bandwidth.

+

Thus, the sensor bandwidth must be significantly higher than the operating frequency if dynamic errors are to be avoided.

+

Noise

+

In addition to the actual position signal, all sensors produce some additive measurement noise. +In many types of sensor, the majority of noise arises from the thermal noise in resistors and the voltage and current noise in conditioning circuit transistors. +These noise processes can usually be approximated by a Gaussian random process.

+

A Gaussian random process is usually described by its autocorrelation function or its Power Spectral Density.

+

The autocorrelation function of a random process \(\mathcal{X}\) is

+

\begin{equation} +R_{\mathcal{X}}(\tau) = E[\mathcal{X}(t)\mathcal{X}(t + \tau)] +\end{equation}

+

where \(E\) is the expected value operator.

+

The variance of the process is equal to \(R_\mathcal{X}(0)\) and is the expected value of the varying part squared:

+

\begin{equation} +\text{Var} \mathcal{X} = E \left[ (\mathcal{X} - E[\mathcal{X}])^2 \right] +\end{equation}

+

The standard deviation \(\sigma\) is the square root of the variance:

+

\begin{equation} +\sigma_\mathcal{X} = \sqrt{\text{Var} \mathcal{X}} +\end{equation}

+

The standard deviation is also the Root Mean Square (RMS) value of a zero-mean random process.

+

The Power Spectral Density \(S_\mathcal{X}(f)\) of a random process represents the distribution of power (or variance) across frequency \(f\).

+

For example, if the random process under consideration was measured in volts, the power spectral density would have the units of \(V^2/\text{Hz}\).

+

The Power Spectral Density can be obtained from the autocorrelation function from the Wiener-Khinchin relation:

+

\begin{equation} +S_{\mathcal{X}} = 2 \mathcal{F}\{ R_\mathcal{X}(\tau) \} = 2 \int_{-\infty}^{\infty} R_\mathcal{X}(\tau) e^{-2j\pi f \tau} d\tau +\end{equation}

+

If the power Spectral Density is known, the variance of the generating process can be found from the area under the curve:

+

\begin{equation} +\sigma_\mathcal{X}^2 = E[\mathcal{X}^2(t)] = R_\mathcal{X}(0) = \int_0^\infty S_\mathcal{X}(f) df +\end{equation}

+

Rather than plotting the frequency distribution of power, it is often convenient to plot the frequency distribution of the standard deviation, which is referred to as the spectral density. +It is related to the power spectral density by a square root:

+

\begin{equation} +\text{spectral density} = \sqrt{S_\mathcal{X}(f)} +\end{equation}

+

The units of \(\sqrt{S_\mathcal{X}(f)}\) are \(\text{units}/\sqrt{Hz}\).

+

The spectral density if preferred in the electronics literature as the RMS value of a noise process can be determined directly from the noise density and effective bandwidth.

+

Resolution

+

The random noise of a position sensor causes an uncertainty in the measured position. +If the distance between two measured locations is smaller than the uncertainty, it is possible to mistake one point for the other.

+

To characterize the resolution, we use the probability that the measured value is within a certain error bound.

+

If the measurement noise is approximately Gaussian, the resolution can be quantified by the standard deviation \(\sigma\) (RMS value).

+

The empirical rule states that there is a \(99.7%\) probability that a sample of a Gaussian random process lie within \(\pm 3 \sigma\). +This if we define the resolution as \(\delta = 6 \sigma\), we will referred to as the \(6\sigma\text{-resolution}\).

+

Another important parameter that must be specified when quoting resolution is the sensor bandwidth. +There is usually a trade-off between bandwidth and resolution (figure 3).

+

+
+ Figure 3: The resolution versus banwidth of a position sensor.
+

Figure 3: The resolution versus banwidth of a position sensor.

+
+
+ +

Many type of sensor have a limited full-scale-range (FSR) and tend to have an approximated proportional relationship between the resolution and range. +As a result, it is convenient to consider the ratio of resolution to the FSR, or equivalently, the dynamic range (DNR). +A convenient method for reporting this ratio is in parts-per-million (ppm):

+

\begin{equation} +\text{DNR}_{\text{ppm}} = 10^6 \frac{\text{full scale range}}{6\sigma\text{-resolution}} +\end{equation}

+

Comparison and summary

+

+
+ Table 1: + Summary of position sensor characteristics. The dynamic range (DNR) and resolution are approximations based on a full-scale range of \(100\,\mu m\) and a first order bandwidth of \(1\,kHz\) +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Sensor TypeRangeDNRResolutionMax. BWAccuracy
Metal foil\(10-500,\mu m\)230 ppm23 nm1-10 kHz1% FSR
Piezoresistive\(1-500,\mu m\)5 ppm0.5 nm>100 kHz1% FSR
Capacitive\(10,\mu m\) to \(10,mm\)24 ppm2.4 nm100 kHz0.1% FSR
Electrothermal\(10,\mu m\) to \(1,mm\)100 ppm10 nm10 kHz1% FSR
Eddy current\(100,\mu m\) to \(80,mm\)10 ppm1 nm40 kHz0.1% FSR
LVDT\(0.5-500,mm\)10 ppm5 nm1 kHz0.25% FSR
InterferometerMeters0.5 nm>100kHz1 ppm FSR
EncoderMeters6 nm>100kHz5 ppm FSR
+

Bibliography

+

Fleming, A. J., A review of nanometer resolution position sensors: operation and performance, Sensors and Actuators A: Physical, 190(nil), 106–126 (2013). http://dx.doi.org/10.1016/j.sna.2012.10.016

+ +
+ + +
+
+
+
+ +
+ + + + +
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + diff --git a/public/paper/furqan17_studies_stewar_platf_manip/index.html b/public/paper/furqan17_studies_stewar_platf_manip/index.html new file mode 100644 index 0000000..87f3f6f --- /dev/null +++ b/public/paper/furqan17_studies_stewar_platf_manip/index.html @@ -0,0 +1,205 @@ + + + + + + Studies on stewart platform manipulator: a review - My digital brain + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+
+ +
+ + +
+
+
+
+ +
+

Studies on stewart platform manipulator: a review

+
+ +
+

Contents

+
+ +
+
+
+
+
Tags
+
Stewart Platforms
+
Reference
+
(Mohd Furqan {\it et al.}, 2017)
+
Author(s)
+
Furqan, M., Suhaib, M., & Ahmad, N.
+
Year
+
2017
+
+

Lots of references.

+

Bibliography

+

Furqan, M., Suhaib, M., & Ahmad, N., Studies on stewart platform manipulator: a review, Journal of Mechanical Science and Technology, 31(9), 4459–4470 (2017). http://dx.doi.org/10.1007/s12206-017-0846-1

+ +
+ + +
+
+
+
+ +
+ + + + +
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + diff --git a/public/paper/furutani04_nanom_cuttin_machin_using_stewar/index.html b/public/paper/furutani04_nanom_cuttin_machin_using_stewar/index.html new file mode 100644 index 0000000..6787686 --- /dev/null +++ b/public/paper/furutani04_nanom_cuttin_machin_using_stewar/index.html @@ -0,0 +1,225 @@ + + + + + + Nanometre-cutting machine using a stewart-platform parallel mechanism - My digital brain + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+
+ +
+ + +
+
+
+
+ +
+

Nanometre-cutting machine using a stewart-platform parallel mechanism

+
+ +
+

Contents

+
+ +
+
+
+
+
Tags
+
Stewart Platforms, Flexible Joints
+
Reference
+
(Katsushi Furutani {\it et al.}, 2004)
+
Author(s)
+
Furutani, K., Suzuki, M., & Kudoh, R.
+
Year
+
2004
+
+
    +
  • Lever mechanism to amplify the motion of piezoelectric stack actuators
  • +
  • Use of flexure joints
  • +
  • Eddy current displacement sensors for control (decentralized)
  • +
+
+ +
+ +
    +
  • Isotropic performance (cubic configuration even if not said so)
  • +
+

Possible sources of error:

+
    +
  • position error of the link ends in assembly => simulation of position error and it is not significant
  • +
  • Inaccurate modelling of the links
  • +
  • insufficient generative force
  • +
  • unwanted deformation of the links
  • +
+

To minimize the errors, a calibration is done between the required leg length and the wanted platform pose. +Then, it is fitted with 4th order polynomial and included in the control architecture.

+

Bibliography

+

Furutani, K., Suzuki, M., & Kudoh, R., Nanometre-cutting machine using a stewart-platform parallel mechanism, Measurement Science and Technology, 15(2), 467–474 (2004). http://dx.doi.org/10.1088/0957-0233/15/2/022

+ +
+ + +
+
+
+
+ +
+ + + + +
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + diff --git a/public/paper/gao15_measur_techn_precis_posit/index.html b/public/paper/gao15_measur_techn_precis_posit/index.html new file mode 100644 index 0000000..ae2120d --- /dev/null +++ b/public/paper/gao15_measur_techn_precis_posit/index.html @@ -0,0 +1,203 @@ + + + + + + Measurement technologies for precision positioning - My digital brain + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+
+ +
+ + +
+
+
+
+ +
+

Measurement technologies for precision positioning

+
+ +
+

Contents

+
+ +
+
+
+
+
Tags
+
Position Sensors
+
Reference
+
(Gao {\it et al.}, 2015)
+
Author(s)
+
Gao, W., Kim, S., Bosse, H., Haitjema, H., Chen, Y., Lu, X., Knapp, W., …
+
Year
+
2015
+
+

Bibliography

+

Gao, W., Kim, S., Bosse, H., Haitjema, H., Chen, Y., Lu, X., Knapp, W., …, Measurement technologies for precision positioning, CIRP Annals, 64(2), 773–796 (2015). http://dx.doi.org/10.1016/j.cirp.2015.05.009

+ +
+ + +
+
+
+
+ +
+ + + + +
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + diff --git a/public/paper/garg07_implem_chall_multiv_contr/index.html b/public/paper/garg07_implem_chall_multiv_contr/index.html new file mode 100644 index 0000000..26f91b7 --- /dev/null +++ b/public/paper/garg07_implem_chall_multiv_contr/index.html @@ -0,0 +1,225 @@ + + + + + + Implementation challenges for multivariable control: what you did not learn in school! - My digital brain + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+
+ +
+ + +
+
+
+
+ +
+

Implementation challenges for multivariable control: what you did not learn in school!

+
+ +
+

Contents

+
+ +
+
+
+
+
Tags
+
Multivariable Control
+
Reference
+
(Sanjay Garg, 2007)
+
Author(s)
+
Garg, S.
+
Year
+
2007
+
+

Discusses:

+
    +
  • When to use multivariable control and when not to?
  • +
  • Two major issues with implementing multivariable control: gain scheduling and integrator wind up protection
  • +
+
+

Inline simple gain and phase margin measured for SISO, “robustness” determination of multivariable control requires complex analyses using singular value techniques and Monte Carlo simulations.

+
+

When to use multivariable control:

+
    +
  • System has high input/output coupling and not much separation between loop bandwidth
  • +
  • System is complex with large number of states
  • +
  • When sequential SISO loop closure will not meet performance requirements
  • +
+

Importance of having a mechanism to limit the control rate in the synthesis process. +The control rate should be weighted appropriately in order to not saturate the system and stay in the linearity regime.

+
    +
  • importance of scaling the plant prior to synthesis and also replacing pure integrators with slow poles
  • +
+

Bibliography

+

Garg, S., Implementation challenges for multivariable control: what you did not learn in school!, In , AIAA Guidance, Navigation and Control Conference and Exhibit (pp. ) (2007). : .

+ +
+ + +
+
+
+
+ +
+ + + + +
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + diff --git a/public/paper/geng95_intel_contr_system_multip_degree/index.html b/public/paper/geng95_intel_contr_system_multip_degree/index.html new file mode 100644 index 0000000..729c5b1 --- /dev/null +++ b/public/paper/geng95_intel_contr_system_multip_degree/index.html @@ -0,0 +1,213 @@ + + + + + + An intelligent control system for multiple degree-of-freedom vibration isolation - My digital brain + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+
+ +
+ + +
+
+
+
+ +
+

An intelligent control system for multiple degree-of-freedom vibration isolation

+
+ +
+

Contents

+
+ +
+
+
+
+
Tags
+
Stewart Platforms, Vibration Isolation
+
Reference
+
(Jason Geng {\it et al.}, 1995)
+
Author(s)
+
Geng, Z. J., Pan, G. G., Haynes, L. S., Wada, B. K., & Garba, J. A.
+
Year
+
1995
+
+

+
+ Figure 1: Local force feedback and adaptive acceleration feedback for active isolation
+

Figure 1: Local force feedback and adaptive acceleration feedback for active isolation

+
+
+ +

Bibliography

+

Geng, Z. J., Pan, G. G., Haynes, L. S., Wada, B. K., & Garba, J. A., An intelligent control system for multiple degree-of-freedom vibration isolation, Journal of Intelligent Material Systems and Structures, 6(6), 787–800 (1995). http://dx.doi.org/10.1177/1045389x9500600607

+ +
+ + +
+
+
+
+ +
+ + + + +
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + diff --git a/public/paper/hanieh03_activ_stewar/index.html b/public/paper/hanieh03_activ_stewar/index.html new file mode 100644 index 0000000..62791e9 --- /dev/null +++ b/public/paper/hanieh03_activ_stewar/index.html @@ -0,0 +1,217 @@ + + + + + + Active isolation and damping of vibrations via stewart platform - My digital brain + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+
+ +
+ + +
+
+
+
+ +
+

Active isolation and damping of vibrations via stewart platform

+
+ +
+

Contents

+
+ +
+
+
+
+
Tags
+
Stewart Platforms, Vibration Isolation, Active Damping
+
Reference
+
@phdthesis{hanieh03_activ_stewar, +author = {Hanieh, Ahmed Abu}, +school = {Universit{'e} Libre de Bruxelles, Brussels, Belgium}, +title = {Active isolation and damping of vibrations via Stewart +platform}, +year = 2003, +tags = {parallel robot}, +}
+
Author(s)
+
Hanieh, A. A.
+
Year
+
2003
+
+

Bibliography

+

Hanieh, A. A., Active isolation and damping of vibrations via stewart platform (Doctoral dissertation) (2003). Universit{'e} Libre de Bruxelles, Brussels, Belgium, .

+ +
+ + +
+
+
+
+ +
+ + + + +
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + diff --git a/public/paper/hauge04_sensor_contr_space_based_six/index.html b/public/paper/hauge04_sensor_contr_space_based_six/index.html new file mode 100644 index 0000000..80a152a --- /dev/null +++ b/public/paper/hauge04_sensor_contr_space_based_six/index.html @@ -0,0 +1,377 @@ + + + + + + Sensors and control of a space-based six-axis vibration isolation system - My digital brain + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+
+ +
+ + +
+
+
+
+ +
+

Sensors and control of a space-based six-axis vibration isolation system

+
+ +
+

Contents

+
+ +
+
+
+
+
Tags
+
Stewart Platforms, Vibration Isolation, Cubic Architecture
+
Reference
+
(Hauge & Campbell, 2004)
+
Author(s)
+
Hauge, G., & Campbell, M.
+
Year
+
2004
+
+

Discusses:

+
    +
  • Choice of sensors and control architecture
  • +
  • Predictability and limitations of the system dynamics
  • +
  • Two-Sensor control architecture
  • +
  • Vibration isolation using a Stewart platform
  • +
  • Experimental comparison of Force sensor and Inertial Sensor and associated control architecture for vibration isolation
  • +
+

+
+ Figure 1: Hexapod for active vibration isolation
+

Figure 1: Hexapod for active vibration isolation

+
+
+ +

Stewart platform (Figure 1):

+
    +
  • Low corner frequency
  • +
  • Large actuator stroke (\(\pm5mm\))
  • +
  • Sensors in each strut (Figure 2): +
      +
    • three-axis load cell
    • +
    • base and payload geophone in parallel with the struts
    • +
    • LVDT
    • +
    +
  • +
+

+
+ Figure 2: Strut
+

Figure 2: Strut

+
+
+ +
+

Force sensors typically work well because they are not as sensitive to payload and base dynamics, but are limited in performance by a low-frequency zero pair resulting from the cross-axial stiffness.

+
+

Performance Objective (frequency domain metric):

+
    +
  • The transmissibility should be close to 1 between 0-1.5Hz +\(-3dB < |T(\omega)| < 3db\)
  • +
  • The transmissibility should be below -20dB in the 5-20Hz range +\(|T(\omega)| < -20db\)
  • +
+

With \(|T(\omega)|\) is the Frobenius norm of the transmissibility matrix and is used to obtain a scalar performance metric.

+

Challenge:

+
    +
  • small frequency separation between the two requirements
  • +
+

Robustness:

+
    +
  • minimization of the transmissibility amplification (Bode’s “pop”) outside the performance region
  • +
+

Model:

+
    +
  • single strut axis as the cubic Stewart platform can be decomposed into 6 single-axis systems
  • +
+

+
+ Figure 3: Strut model
+

Figure 3: Strut model

+
+
+ +

Zero Pair when using a Force Sensor:

+
    +
  • The frequency of the zero pair corresponds to the resonance frequency of the payload mass and the “parasitic” stiffness (sum of the cross-axial, suspension, wiring stiffnesses)
  • +
  • This zero pair is usually not predictable nor repeatable
  • +
  • In this Stewart platform, this zero pair uncertainty is due to the internal wiring of the struts
  • +
+

Control:

+
    +
  • Single-axis controllers => combine them into a full six-axis controller => evaluate the full controller in terms of stability and robustness
  • +
  • Sensitivity weighted LQG controller (SWLQG) => address robustness in flexible dynamic systems
  • +
  • Three type of controller: +
      +
    • Force feedback (cell-based)
    • +
    • Inertial feedback (geophone-based)
    • +
    • Combined force/velocity feedback (load cell/geophone based)
    • +
    +
  • +
+
+

The use of multivariable and robust control on the full 6x6 hexapod does not improve performance over single-axis designs.

+
+

+
+ Table 1: + Typical characteristics of sensors used for isolation in hexapod systems +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Load cellGeophone
TypeRelativeInertial
Relationship with voice coilCollocated and DualNon-Collocated and non-Dual
Open loop transfer function(+) Alternating poles/zeros(-) Large phase drop
Limitation from low-frequency zero pair(-) Yes(+) No
Sensitive to payload/base dynamics(+) No(-) Yes
Best frequency rangeHigh (low-freq zero limitation)Low (high-freq toll-off limitation)
+

Ability of a sensor-actuator pair to improve performance: +General system with input \(u\), performance \(z\), output \(y\) disturbance \(u\).

+

Given a sensor \(u\) and actuator \(y\) and a controller \(u = -K(s) y\), the closed loop disturbance to performance transfer function can be written as:

+

\[ \left[ \frac{z}{w} \right]_\text{CL} = \frac{G(s)_{zw} + K(G(s)_{zw} G(s)_{yu} - G(s)_{zu} G(s)_{yw})}{1 + K G(s)_{yu}} \]

+

In order to obtain a significant performance improvement is to use a high gain controller, provided the term \(G(s)_{zw} + K(G(s)_{zw} G(s)_{yu} - G(s)_{zu} G(s)_{yw})\) is small.

+

We can compare the transfer function from \(w\) to \(z\) with and without a high gain controller. +And we find that for \(u\) and \(y\) to be an acceptable pair for high gain control: +\[ \left| \frac{G(j\omega)_{zw} G(j\omega)_{yu} - G(j\omega)_{zu} G(j\omega)_{yw}}{K G(j\omega)_{yu}} \right| \ll |G_{zw}(j\omega)| \]

+

Controllers:

+

Force feedback:

+
    +
  • Performance limited by the low frequency zero-pair
  • +
  • It is desirable to separate the zero-pair and first most are separated by at least a decade in frequency
  • +
  • This can be achieve by reducing the cross-axis stiffness
  • +
  • If the low frequency zero pair is inverted, robustness is lost
  • +
  • Thus, the force feedback controller should be designed to have combined performance and robustness at frequencies at least a decade above the zero pair
  • +
  • The presented controller as a high pass filter at to reduce the gain below the zero-pair, a lag at low frequency to improve phase margin, and a low pass filter for roll off
  • +
+

Inertial feedback:

+
    +
  • Non-Collocated => multiple phase drops that limit the bandwidth of the controller
  • +
  • Good performance, but the transmissibility “pops” due to low phase margin and thus this indicates robustness problems
  • +
+

Combined force/velocity feedback:

+
    +
  • Use the low frequency performance advantages of geophone sensor with the high robustness advantages of the load cell sensor
  • +
  • A Single-Input-Multiple-Outputs (SIMO) controller is found using LQG
  • +
  • The performance requirements are met
  • +
  • Good robustness
  • +
+

+
+ Figure 4: Experimental open loop (solid) and closed loop six-axis transmissibility using the geophone only controller (dotted), and combined geophone/load cell controller (dashed)
+

Figure 4: Experimental open loop (solid) and closed loop six-axis transmissibility using the geophone only controller (dotted), and combined geophone/load cell controller (dashed)

+
+
+ +

Bibliography

+

Hauge, G., & Campbell, M., Sensors and control of a space-based six-axis vibration isolation system, Journal of Sound and Vibration, 269(3-5), 913–931 (2004). http://dx.doi.org/10.1016/s0022-460x(03)00206-2

+ +
+ + +
+
+
+
+ +
+ + + + +
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + diff --git a/public/paper/holler12_instr_x_ray_nano_imagin/index.html b/public/paper/holler12_instr_x_ray_nano_imagin/index.html new file mode 100644 index 0000000..d227482 --- /dev/null +++ b/public/paper/holler12_instr_x_ray_nano_imagin/index.html @@ -0,0 +1,241 @@ + + + + + + An instrument for 3d x-ray nano-imaging - My digital brain + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+
+ +
+ + +
+
+
+
+ +
+

An instrument for 3d x-ray nano-imaging

+
+ +
+

Contents

+
+ +
+
+
+
+
Tags
+
Nano Active Stabilization System, Positioning Stations
+
Reference
+
(Holler {\it et al.}, 2012)
+
Author(s)
+
Holler, M., Raabe, J., Diaz, A., Guizar-Sicairos, M., Quitmann, C., Menzel, A., & Bunk, O.
+
Year
+
2012
+
+

Instrument similar to the NASS. +Obtain position stability of 10nm (standard deviation).

+

+
+ Figure 1: Schematic of the tomography setup
+

Figure 1: Schematic of the tomography setup

+
+
+ +
    +
  • +

    Limited resolution due to instrumentation: +The resolution of ptychographic tomography remains above 100nm due to instabilities and drifts of the scanning systems.

    +
  • +
  • +

    Need of a Metrology System:

    +
    +

    To achieve positioning accuracy and stability in the nanometer range, one cannot rely on the position encoders built into individual positioning stages. +A precise exteroceptive measurement of the relative position of the optical elements with respect to the sample is mandatory. +Thus, thermal drifts and parasitic motions can be measured and compensated for.

    +
    +
  • +
  • +

    Interferometer System Concept: +The sample is aligned with the X-ray with the XYZ piezo stage. +As a result, the metrology sphere will be usually off center with respect to the rotation axis of the spindle. +That implies that the laser will not propagate back to the interferometer at all rotation angles. +A position sensitive detector (PSD) is used, it provides a measurement of the position of the sphere in the plane perpendicular to the laser. +The interferometer is positionned on top of a translation stage. The PSD information is used to close the loop so that the interferometer follows the displacement of the metrology sphere.

    +
  • +
  • +

    Feedback Loop: Using the signals from the 2 interferometers, the loop is closed to compensate low frequency vibrations and thermal drifts.

    +
  • +
+

Bibliography

+

Holler, M., Raabe, J., Diaz, A., Guizar-Sicairos, M., Quitmann, C., Menzel, A., & Bunk, O., An instrument for 3d x-ray nano-imaging, Review of Scientific Instruments, 83(7), 073703 (2012). http://dx.doi.org/10.1063/1.4737624

+ +
+ + +
+
+
+
+ +
+ + + + +
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + diff --git a/public/paper/holterman05_activ_dampin_based_decoup_colloc_contr/index.html b/public/paper/holterman05_activ_dampin_based_decoup_colloc_contr/index.html new file mode 100644 index 0000000..a130d04 --- /dev/null +++ b/public/paper/holterman05_activ_dampin_based_decoup_colloc_contr/index.html @@ -0,0 +1,203 @@ + + + + + + Active damping based on decoupled collocated control - My digital brain + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+
+ +
+ + +
+
+
+
+ +
+

Active damping based on decoupled collocated control

+
+ +
+

Contents

+
+ +
+
+
+
+
Tags
+
Active Damping
+
Reference
+
(Holterman & deVries, 2005)
+
Author(s)
+
Holterman, J., & deVries, T.
+
Year
+
2005
+
+

Bibliography

+

Holterman, J., & deVries, T., Active damping based on decoupled collocated control, IEEE/ASME Transactions on Mechatronics, 10(2), 135–145 (2005). http://dx.doi.org/10.1109/tmech.2005.844702

+ +
+ + +
+
+
+
+ +
+ + + + +
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + diff --git a/public/paper/index.html b/public/paper/index.html new file mode 100644 index 0000000..b8d87c7 --- /dev/null +++ b/public/paper/index.html @@ -0,0 +1,398 @@ + + + + + + Archive - My digital brain + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+
+ +
+ + +
+
+
+ +
+ + + A new isotropic and decoupled 6-dof parallel manipulator + + +
+ + + A review of nanometer resolution position sensors: operation and performance + + +
+ + + A six-axis single-stage active vibration isolator based on stewart platform + + +
+ + + A soft 6-axis active vibration isolator + + +
+ + + A survey of control issues in nanopositioning + + +
+ + + Active damping based on decoupled collocated control + + +
+ + + Active isolation and damping of vibrations via stewart platform + + +
+ + + Active structural vibration control: a review + + +
+ + + Advanced motion control for precision mechatronics: control, identification, and learning of complex systems + + +
+ + + Advances in internal model control technique: a review and future prospects + + +
+ + + An exploration of active hard mount vibration isolation for precision equipment + + +
+ + + An instrument for 3d x-ray nano-imaging + + +
+ + + An intelligent control system for multiple degree-of-freedom vibration isolation + + +
+ + + Automated markerless full field hard x-ray microscopic tomography at sub-50 nm 3-dimension spatial resolution + + +
+ + + Comparison and classification of high-precision actuators based on stiffness influencing vibration isolation + + +
+ + + Control of spacecraft and aircraft + + +
+ + + Decentralized vibration control of a voice coil motor-based stewart parallel mechanism: simulation and experiments + + +
+ + + Design for precision: current status and trends + + +
+ + + Dynamic modeling and decoupled control of a flexible stewart platform for vibration isolation + + +
+ + + Dynamic modeling and experimental analyses of stewart platform with flexible hinges + + +
+ + + Estimating the resolution of nanopositioning systems from frequency domain data + + +
+ + + Force feedback versus acceleration feedback in active vibration isolation + + +
+ + + Guidelines for the selection of weighting functions for h-infinity control + + +
+ + + Identification and decoupling control of flexure jointed hexapods + + +
+ + + Implementation challenges for multivariable control: what you did not learn in school! + + +
+ + + Interferometric characterization of rotation stages for x-ray nanotomography + + +
+ + + Investigation on active vibration isolation of a stewart platform with piezoelectric actuators + + +
+ + + Measurement technologies for precision positioning + + +
+ + + Nanometre-cutting machine using a stewart-platform parallel mechanism + + +
+ + + Nanopositioning system with force feedback for high-performance tracking and vibration control + + +
+ + + Nanopositioning with multiple sensors: a case study in data storage + + +
+ + + Position control in lithographic equipment + + +
+ + + Review of active vibration isolation strategies + + +
+ + + Sensor fusion for active vibration isolation in precision equipment + + +
+ + + Sensor fusion methods for high performance active vibration isolation systems + + +
+ + + Sensors and control of a space-based six-axis vibration isolation system + + +
+ + + Simultaneous vibration isolation and pointing control of flexure jointed hexapods + + +
+ + + Simultaneous, fault-tolerant vibration isolation and pointing control of flexure jointed hexapods + + +
+ + + Six dof active vibration control using stewart platform with non-cubic configuration + + +
+ + + Studies on stewart platform manipulator: a review + + +
+ + + The stewart platform manipulator: a review + + +
+ + + Vibration control of flexible structures using fusion of inertial sensors and hyper-stable actuator-sensor pairs + + +
+
+
+
+ +
+ + + + +
+ +
+ +
+
+ + + + + + + + + + + + + + + + + diff --git a/public/paper/index.xml b/public/paper/index.xml new file mode 100644 index 0000000..766b183 --- /dev/null +++ b/public/paper/index.xml @@ -0,0 +1,439 @@ + + + + Papers on My digital brain + /paper/ + Recent content in Papers on My digital brain + Hugo -- gohugo.io + en + + + + + + A new isotropic and decoupled 6-dof parallel manipulator + /paper/legnani12_new_isotr_decoup_paral_manip/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /paper/legnani12_new_isotr_decoup_paral_manip/ + Tags Stewart Platforms Reference (Legnani {\it et al.}, 2012) Author(s) Legnani, G., Fassi, I., Giberti, H., Cinquemani, S., &amp; Tosi, D. Year 2012 Concepts of isotropy and decoupling for parallel manipulators isotropy: the kinetostatic properties (same applicable force, same possible velocity, same stiffness) are identical in all directions (e.g. cubic configuration for Stewart platform) decoupling: each DoF of the end effector can be controlled by a single actuator (not the case for the Stewart platform) Example of generated isotropic manipulator (not decoupled). + + + + A review of nanometer resolution position sensors: operation and performance + /paper/fleming13_review_nanom_resol_posit_sensor/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /paper/fleming13_review_nanom_resol_posit_sensor/ + Tags Position Sensors Reference (Andrew Fleming, 2013) Author(s) Fleming, A. J. Year 2013 Define concise performance metric and provide expressions for errors sources (non-linearity, drift, noise) Review current position sensor technologies and compare their performance Sensor Characteristics Calibration and nonlinearity Usually quoted as a percentage of the fill-scale range (FSR): +\begin{equation} \text{mapping error (%)} = \pm 100 \frac{\max{}|e_m(v)|}{\text{FSR}} \end{equation} +With \(e_m(v)\) is the mapping error. + + + + A six-axis single-stage active vibration isolator based on stewart platform + /paper/preumont07_six_axis_singl_stage_activ/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /paper/preumont07_six_axis_singl_stage_activ/ + Tags Vibration Isolation, Stewart Platforms, Flexible Joints Reference (Preumont {\it et al.}, 2007) Author(s) Preumont, A., Horodinca, M., Romanescu, I., Marneffe, B. d., Avraam, M., Deraemaeker, A., Bossens, F., … Year 2007 Summary: + Cubic Stewart platform (Figure 3) Provides uniform control capability Uniform stiffness in all directions minimizes the cross-coupling among actuators and sensors of different legs Flexible joints (Figure 2) Piezoelectric force sensors Voice coil actuators Decentralized feedback control approach for vibration isolation Effect of parasitic stiffness of the flexible joints on the IFF performance (Figure 1) The Stewart platform has 6 suspension modes at different frequencies. + + + + A soft 6-axis active vibration isolator + /paper/spanos95_soft_activ_vibrat_isolat/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /paper/spanos95_soft_activ_vibrat_isolat/ + Tags Stewart Platforms, Vibration Isolation Reference (Spanos {\it et al.}, 1995) Author(s) Spanos, J., Rahman, Z., &amp; Blackwood, G. Year 1995 Stewart Platform (Figure 1): + Voice Coil Flexible joints (cross-blades) Force Sensors Cubic Configuration + Figure 1: Stewart Platform + Total mass of the paylaod: 30kg Center of gravity is 9cm above the geometry center of the mount (cube&rsquo;s center?). +Limitation of the Decentralized Force Feedback: + + + + A survey of control issues in nanopositioning + /paper/devasia07_survey_contr_issues_nanop/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /paper/devasia07_survey_contr_issues_nanop/ + Tags : + Reference (Devasia {\it et al.}, 2007) Author(s) Devasia, S., Eleftheriou, E., &amp; Moheimani, S. R. Year 2007 Talks about Scanning Tunneling Microscope (STM) and Scanning Probe Microscope (SPM) Piezoelectric actuators: Creep, Hysteresis, Vibrations, Modeling errors Interesting analysis about Bandwidth-Precision-Range tradeoffs Control approaches for piezoelectric actuators: feedforward, Feedback, Iterative, Sensorless controls + Figure 1: Tradeoffs between bandwidth, precision and range + Bibliography Devasia, S. + + + + Active damping based on decoupled collocated control + /paper/holterman05_activ_dampin_based_decoup_colloc_contr/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /paper/holterman05_activ_dampin_based_decoup_colloc_contr/ + Tags Active Damping Reference (Holterman &amp; deVries, 2005) Author(s) Holterman, J., &amp; deVries, T. Year 2005 Bibliography Holterman, J., &amp; deVries, T., Active damping based on decoupled collocated control, IEEE/ASME Transactions on Mechatronics, 10(2), 135–145 (2005). http://dx.doi.org/10.1109/tmech.2005.844702 ↩ + + + + Active isolation and damping of vibrations via stewart platform + /paper/hanieh03_activ_stewar/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /paper/hanieh03_activ_stewar/ + Tags Stewart Platforms, Vibration Isolation, Active Damping Reference @phdthesis{hanieh03_activ_stewar, author = {Hanieh, Ahmed Abu}, school = {Universit{'e} Libre de Bruxelles, Brussels, Belgium}, title = {Active isolation and damping of vibrations via Stewart platform}, year = 2003, tags = {parallel robot}, } Author(s) Hanieh, A. A. Year 2003 Bibliography Hanieh, A. A., Active isolation and damping of vibrations via stewart platform (Doctoral dissertation) (2003). Universit{'e} Libre de Bruxelles, Brussels, Belgium, . + + + + Active structural vibration control: a review + /paper/alkhatib03_activ_struc_vibrat_contr/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /paper/alkhatib03_activ_struc_vibrat_contr/ + Tags : + Reference (Rabih Alkhatib &amp; Golnaraghi, 2003) Author(s) Alkhatib, R., &amp; Golnaraghi, M. F. Year 2003 Process of designing an active vibration control system Analyze the structure to be controled Obtain an idealized mathematical model with FEM or experimental modal analysis Reduce the model order is necessary Analyze the resulting model: dynamics properties, types of disturbances, &hellip; Quantify sensors and actuators requirements. Decide on their types and location Analyze the impact of the sensors and actuators on the overall dynamic characteristics Specify performance criteria and stability tradeoffs Device of the type of control algorythm to be employed and design a controller to meet the specifications Simulate the resulting controlled system on a computer If the controller does not meet the requirements, adjust the specifications or modify the type of controller Choose hardware and software and integrate the components on a pilot plant Formulate experiments and perform system identification and model updating Implement controller and carry out system test to evaluate the performance Feedback control Active damping The objective is to reduce the resonance peaks of the closed loop transfer function. + + + + Advanced motion control for precision mechatronics: control, identification, and learning of complex systems + /paper/oomen18_advan_motion_contr_precis_mechat/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /paper/oomen18_advan_motion_contr_precis_mechat/ + Tags Motion Control Reference (Tom Oomen, 2018) Author(s) Oomen, T. Year 2018 + Figure 1: Envisaged developments in motion systems. In traditional motion systems, the control bandwidth takes place in the rigid-body region. In the next generation systemes, flexible dynamics are foreseen to occur within the control bandwidth. + Bibliography Oomen, T., Advanced motion control for precision mechatronics: control, identification, and learning of complex systems, IEEJ Journal of Industry Applications, 7(2), 127–140 (2018). + + + + Advances in internal model control technique: a review and future prospects + /paper/saxena12_advan_inter_model_contr_techn/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /paper/saxena12_advan_inter_model_contr_techn/ + Tags Complementary Filters Reference (Sahaj Saxena &amp; YogeshV Hote, 2012) Author(s) Saxena, S., &amp; Hote, Y. Year 2012 Proposed Filter \(F(s)\) \begin{align*} F(s) &amp;= \frac{1}{(\lambda s + 1)^n} \\\ +F(s) &amp;= \frac{n \lambda + 1}{(\lambda s + 1)^n} \end{align*} +Internal Model Control Central concept in IMC: control can be acheive only if the control system involves, either implicitly or explicitly, some representation of the process to be controlled. + + + + An exploration of active hard mount vibration isolation for precision equipment + /paper/poel10_explor_activ_hard_mount_vibrat/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /paper/poel10_explor_activ_hard_mount_vibrat/ + Tags Vibration Isolation Reference @phdthesis{poel10_explor_activ_hard_mount_vibrat, author = {van der Poel, Gerrit Wijnand}, doi = {10.3990/1.9789036530163}, isbn = {978-90-365-3016-3}, school = {University of Twente}, title = {An Exploration of Active Hard Mount Vibration Isolation for Precision Equipment}, url = {https://doi.org/10.3990/1.9789036530163}, year = 2010, year = 2010, tags = {parallel robot}, } Author(s) van der Poel, G. W. Year 2010 Bibliography van der Poel, G. W., An exploration of active hard mount vibration isolation for precision equipment (Doctoral dissertation) (2010). + + + + An instrument for 3d x-ray nano-imaging + /paper/holler12_instr_x_ray_nano_imagin/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /paper/holler12_instr_x_ray_nano_imagin/ + Tags Nano Active Stabilization System, Positioning Stations Reference (Holler {\it et al.}, 2012) Author(s) Holler, M., Raabe, J., Diaz, A., Guizar-Sicairos, M., Quitmann, C., Menzel, A., &amp; Bunk, O. Year 2012 Instrument similar to the NASS. Obtain position stability of 10nm (standard deviation). + + Figure 1: Schematic of the tomography setup + Limited resolution due to instrumentation: The resolution of ptychographic tomography remains above 100nm due to instabilities and drifts of the scanning systems. + + + + An intelligent control system for multiple degree-of-freedom vibration isolation + /paper/geng95_intel_contr_system_multip_degree/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /paper/geng95_intel_contr_system_multip_degree/ + Tags Stewart Platforms, Vibration Isolation Reference (Jason Geng {\it et al.}, 1995) Author(s) Geng, Z. J., Pan, G. G., Haynes, L. S., Wada, B. K., &amp; Garba, J. A. Year 1995 + Figure 1: Local force feedback and adaptive acceleration feedback for active isolation + Bibliography Geng, Z. J., Pan, G. G., Haynes, L. S., Wada, B. K., &amp; Garba, J. A., An intelligent control system for multiple degree-of-freedom vibration isolation, Journal of Intelligent Material Systems and Structures, 6(6), 787–800 (1995). + + + + Automated markerless full field hard x-ray microscopic tomography at sub-50 nm 3-dimension spatial resolution + /paper/wang12_autom_marker_full_field_hard/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /paper/wang12_autom_marker_full_field_hard/ + Tags Nano Active Stabilization System Reference (Jun Wang {\it et al.}, 2012) Author(s) Wang, J., Chen, Y. K., Yuan, Q., Tkachuk, A., Erdonmez, C., Hornberger, B., &amp; Feser, M. Year 2012 Introduction of Markers: That limits the type of samples that is studied +There is a need for markerless nano-tomography =&gt; the key requirement is the precision and stability of the positioning stages. +Passive rotational run-out error system: It uses calibrated metrology disc and capacitive sensors + + + + Comparison and classification of high-precision actuators based on stiffness influencing vibration isolation + /paper/ito16_compar_class_high_precis_actuat/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /paper/ito16_compar_class_high_precis_actuat/ + Tags Vibration Isolation, Actuators Reference (Shingo Ito &amp; Georg Schitter, 2016) Author(s) Ito, S., &amp; Schitter, G. Year 2016 Classification of high-precision actuators Table 1: Zero/Low and High stiffness actuators Categories Pros Cons Zero stiffness No vibration transmission Large and Heavy Low stiffness High vibration isolation Typically for low load High Stiffness High control bandwidth High vibration transmission Time Delay of Piezoelectric Electronics In this paper, the piezoelectric actuator/electronics adds a time delay which is much higher than the time delay added by the voice coil/electronics. + + + + Control of spacecraft and aircraft + /paper/bryson93_contr_spacec_aircr/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /paper/bryson93_contr_spacec_aircr/ + Tags HAC-HAC Reference (Bryson, 1993) Author(s) Bryson, A. E. Year 1993 9.2.3 Roll-Off Filters Synthesizing control logic using only one vibration mode means we are consciously neglecting the higher-order vibration modes. When doing this, it is a good idea to insert &ldquo;roll-off&rdquo; into the control logic, so that the loop-transfer gain decreases rapidly with frequency beyond the control bandwidth. This reduces the possibility of destabilizing the unmodelled higher frequency dynamics (&quot;spillover&quot;). + + + + Decentralized vibration control of a voice coil motor-based stewart parallel mechanism: simulation and experiments + /paper/tang18_decen_vibrat_contr_voice_coil/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /paper/tang18_decen_vibrat_contr_voice_coil/ + Tags Stewart Platforms Reference (Jie Tang {\it et al.}, 2018) Author(s) Tang, J., Cao, D., &amp; Yu, T. Year 2018 Bibliography Tang, J., Cao, D., &amp; Yu, T., Decentralized vibration control of a voice coil motor-based stewart parallel mechanism: simulation and experiments, Proceedings of the Institution of Mechanical Engineers, Part C: Journal of Mechanical Engineering Science, 233(1), 132–145 (2018). http://dx.doi.org/10.1177/0954406218756941 ↩ + + + + Design for precision: current status and trends + /paper/schellekens98_desig_precis/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /paper/schellekens98_desig_precis/ + Tags Precision Engineering Reference (Schellekens {\it et al.}, 1998) Author(s) Schellekens, P., Rosielle, N., Vermeulen, H., Vermeulen, M., Wetzels, S., &amp; Pril, W. Year 1998 Bibliography Schellekens, P., Rosielle, N., Vermeulen, H., Vermeulen, M., Wetzels, S., &amp; Pril, W., Design for precision: current status and trends, Cirp Annals, (2), 557–586 (1998). http://dx.doi.org/10.1016/s0007-8506(07)63243-0 ↩ + + + + Dynamic modeling and decoupled control of a flexible stewart platform for vibration isolation + /paper/yang19_dynam_model_decoup_contr_flexib/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /paper/yang19_dynam_model_decoup_contr_flexib/ + Tags Stewart Platforms, Vibration Isolation, Flexible Joints, Cubic Architecture Reference (Yang {\it et al.}, 2019) Author(s) Yang, X., Wu, H., Chen, B., Kang, S., &amp; Cheng, S. Year 2019 Discusses: + flexible-rigid model of Stewart platform the impact of joint stiffness is compensated using a displacement sensor and a force sensor then the MIMO system is decoupled in modal space and 6 SISO controllers are applied for vibration isolation using force sensors The joint stiffness impose a limitation on the control performance using force sensors as it adds a zero at low frequency in the dynamics. + + + + Dynamic modeling and experimental analyses of stewart platform with flexible hinges + /paper/jiao18_dynam_model_exper_analy_stewar/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /paper/jiao18_dynam_model_exper_analy_stewar/ + Tags Stewart Platforms, Flexible Joints Reference (Jian Jiao {\it et al.}, 2018) Author(s) Jiao, J., Wu, Y., Yu, K., &amp; Zhao, R. Year 2018 Bibliography Jiao, J., Wu, Y., Yu, K., &amp; Zhao, R., Dynamic modeling and experimental analyses of stewart platform with flexible hinges, Journal of Vibration and Control, 25(1), 151–171 (2018). http://dx.doi.org/10.1177/1077546318772474 ↩ + + + + Estimating the resolution of nanopositioning systems from frequency domain data + /paper/fleming12_estim/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /paper/fleming12_estim/ + Tags : + Reference (Andrew Fleming, 2012) Author(s) Fleming, A. J. Year 2012 Bibliography Fleming, A. J., Estimating the resolution of nanopositioning systems from frequency domain data, In , 2012 IEEE International Conference on Robotics and Automation (pp. ) (2012). : . ↩ + + + + Force feedback versus acceleration feedback in active vibration isolation + /paper/preumont02_force_feedb_versus_accel_feedb/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /paper/preumont02_force_feedb_versus_accel_feedb/ + Tags Vibration Isolation Reference (Preumont {\it et al.}, 2002) Author(s) Preumont, A., A. Francois, Bossens, F., &amp; Abu-Hanieh, A. Year 2002 Summary: + Compares the force feedback and acceleration feedback for active damping The use of a force sensor always give alternating poles and zeros in the open-loop transfer function between for force actuator and the force sensor which guarantees the stability of the closed loop Acceleration feedback produces alternating poles and zeros only when the flexible structure is stiff compared to the isolation system The force applied to a rigid body is proportional to its acceleration, thus sensing the total interface force gives a measured of the absolute acceleration of the solid body. + + + + Guidelines for the selection of weighting functions for h-infinity control + /paper/bibel92_guidel_h/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /paper/bibel92_guidel_h/ + Tags H Infinity Control Reference (Bibel &amp; Malyevac, 1992) Author(s) Bibel, J. E., &amp; Malyevac, D. S. Year 1992 Properties of feedback control + Figure 1: Control System Diagram + From the figure 1, we have: +\begin{align*} y(s) &amp;= T(s) r(s) + S(s) d(s) - T(s) n(s)\\\ +e(s) &amp;= S(s) r(s) - S(s) d(s) - S(s) n(s)\\\ +u(s) &amp;= S(s)K(s) r(s) - S(s)K(s) d(s) - S(s)K(s) n(s) \end{align*} + + + + Identification and decoupling control of flexure jointed hexapods + /paper/chen00_ident_decoup_contr_flexur_joint_hexap/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /paper/chen00_ident_decoup_contr_flexur_joint_hexap/ + Tags Stewart Platforms, Flexible Joints Reference (Yixin Chen &amp; McInroy, 2000) Author(s) Chen, Y., &amp; McInroy, J. Year 2000 Bibliography Chen, Y., &amp; McInroy, J., Identification and decoupling control of flexure jointed hexapods, In , Proceedings 2000 ICRA. Millennium Conference. IEEE International Conference on Robotics and Automation. Symposia Proceedings (Cat. No.00CH37065) (pp. ) (2000). : . ↩ + + + + Implementation challenges for multivariable control: what you did not learn in school! + /paper/garg07_implem_chall_multiv_contr/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /paper/garg07_implem_chall_multiv_contr/ + Tags Multivariable Control Reference (Sanjay Garg, 2007) Author(s) Garg, S. Year 2007 Discusses: + When to use multivariable control and when not to? Two major issues with implementing multivariable control: gain scheduling and integrator wind up protection Inline simple gain and phase margin measured for SISO, &ldquo;robustness&rdquo; determination of multivariable control requires complex analyses using singular value techniques and Monte Carlo simulations. + When to use multivariable control: + + + + Interferometric characterization of rotation stages for x-ray nanotomography + /paper/stankevic17_inter_charac_rotat_stages_x_ray_nanot/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /paper/stankevic17_inter_charac_rotat_stages_x_ray_nanot/ + Tags Nano Active Stabilization System, Positioning Stations Reference (Tomas Stankevic {\it et al.}, 2017) Author(s) Stankevic, T., Engblom, C., Langlois, F., Alves, F., Lestrade, A., Jobert, N., Cauchon, G., … Year 2017 Similar Station than the NASS Similar Metrology with fiber based interferometers and cylindrical reference mirror + Figure 1: Positioning Station + Thermal expansion: Stabilized down to \(5mK/h\) using passive water flow through the baseplate below the sample stage and in the interferometry reference frame. + + + + Investigation on active vibration isolation of a stewart platform with piezoelectric actuators + /paper/wang16_inves_activ_vibrat_isolat_stewar/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /paper/wang16_inves_activ_vibrat_isolat_stewar/ + Tags Stewart Platforms, Vibration Isolation, Flexible Joints Reference (Wang {\it et al.}, 2016) Author(s) Wang, C., Xie, X., Chen, Y., &amp; Zhang, Z. Year 2016 Model of the Stewart platform: + Struts are treated as flexible beams Payload and the base are treated as flexible plates The FRF synthesis method permits to derive FRFs of the Stewart platform The model is compared with a Finite Element model and is shown to give the same results. + + + + Measurement technologies for precision positioning + /paper/gao15_measur_techn_precis_posit/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /paper/gao15_measur_techn_precis_posit/ + Tags Position Sensors Reference (Gao {\it et al.}, 2015) Author(s) Gao, W., Kim, S., Bosse, H., Haitjema, H., Chen, Y., Lu, X., Knapp, W., … Year 2015 Bibliography Gao, W., Kim, S., Bosse, H., Haitjema, H., Chen, Y., Lu, X., Knapp, W., …, Measurement technologies for precision positioning, CIRP Annals, 64(2), 773–796 (2015). http://dx.doi.org/10.1016/j.cirp.2015.05.009 ↩ + + + + Nanometre-cutting machine using a stewart-platform parallel mechanism + /paper/furutani04_nanom_cuttin_machin_using_stewar/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /paper/furutani04_nanom_cuttin_machin_using_stewar/ + Tags Stewart Platforms, Flexible Joints Reference (Katsushi Furutani {\it et al.}, 2004) Author(s) Furutani, K., Suzuki, M., &amp; Kudoh, R. Year 2004 Lever mechanism to amplify the motion of piezoelectric stack actuators Use of flexure joints Eddy current displacement sensors for control (decentralized) Isotropic performance (cubic configuration even if not said so) Possible sources of error: + position error of the link ends in assembly =&gt; simulation of position error and it is not significant Inaccurate modelling of the links insufficient generative force unwanted deformation of the links To minimize the errors, a calibration is done between the required leg length and the wanted platform pose. + + + + Nanopositioning system with force feedback for high-performance tracking and vibration control + /paper/fleming10_nanop_system_with_force_feedb/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /paper/fleming10_nanop_system_with_force_feedb/ + Tags Sensor Fusion, Force Sensors Reference (Fleming, 2010) Author(s) Fleming, A. Year 2010 Summary: + The noise generated by a piezoelectric force sensor is much less than a capacitive sensor Dynamical model of a piezoelectric stack actuator and piezoelectric force sensor Noise of a piezoelectric force sensor IFF with a piezoelectric stack actuator and piezoelectric force sensor A force sensor is used as a displacement sensor below the frequency of the first zero Sensor fusion architecture with a capacitive sensor and a force sensor and using complementary filters Virtual sensor fusion architecture (called low-frequency bypass) Analog implementation of the control strategies to avoid quantization noise, finite resolution and sampling delay Model of a multi-layer monolithic piezoelectric stack actuator + + + + Nanopositioning with multiple sensors: a case study in data storage + /paper/sebastian12_nanop_with_multip_sensor/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /paper/sebastian12_nanop_with_multip_sensor/ + Tags Sensor Fusion Reference (Abu Sebastian &amp; Angeliki Pantazi, 2012) Author(s) Sebastian, A., &amp; Pantazi, A. Year 2012 Bibliography Sebastian, A., &amp; Pantazi, A., Nanopositioning with multiple sensors: a case study in data storage, IEEE Transactions on Control Systems Technology, 20(2), 382–394 (2012). http://dx.doi.org/10.1109/tcst.2011.2177982 ↩ + + + + Position control in lithographic equipment + /paper/butler11_posit_contr_lithog_equip/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /paper/butler11_posit_contr_lithog_equip/ + Tags Multivariable Control, Positioning Stations Reference (Hans Butler, 2011) Author(s) Butler, H. Year 2011 Bibliography Butler, H., Position control in lithographic equipment, IEEE Control Systems, 31(5), 28–47 (2011). http://dx.doi.org/10.1109/mcs.2011.941882 ↩ + + + + Review of active vibration isolation strategies + /paper/collette11_review_activ_vibrat_isolat_strat/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /paper/collette11_review_activ_vibrat_isolat_strat/ + Tags Vibration Isolation Reference (Christophe Collette {\it et al.}, 2011) Author(s) Collette, C., Janssens, S., &amp; Artoos, K. Year 2011 Background and Motivations Passive Isolation Tradeoffs \[ X(s) = \underbrace{\frac{cs + k}{ms^2 + cs + k}}_{T_{wx}(s)} W(s) + \underbrace{\frac{1}{ms^2 + cs + k}}_{T_{Fx}(s)} F(s) \] + \(T_{wx}(s)\) is called the transmissibility of the isolator. It characterize the way seismic vibrations \(w\) are transmitted to the equipment. \(T_{Fx}(s)\) is called the compliance. + + + + Sensor fusion for active vibration isolation in precision equipment + /paper/tjepkema12_sensor_fusion_activ_vibrat_isolat_precis_equip/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /paper/tjepkema12_sensor_fusion_activ_vibrat_isolat_precis_equip/ + Tags Sensor Fusion, Vibration Isolation Reference (Tjepkema {\it et al.}, 2012) Author(s) Tjepkema, D., Dijk, J. v., &amp; Soemers, H. Year 2012 Relative motion Control Control law: \(f = -G(x-w)\) +\[ \frac{x}{w} = \frac{k+G}{ms^2 + k+G} \] \[ \frac{x}{F} = \frac{1}{ms^2 + k+G} \] +Force Control Control law: \(f = -G F_a = -G \left(f-k(x-w)\right)\) +\[ \frac{x}{w} = \frac{k}{(1+G)ms^2 + k} \] \[ \frac{x}{F} = \frac{1+G}{(1+G)ms^2 + k} \] + + + + Sensor fusion methods for high performance active vibration isolation systems + /paper/collette15_sensor_fusion_method_high_perfor/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /paper/collette15_sensor_fusion_method_high_perfor/ + Tags Sensor Fusion, Vibration Isolation Reference (Collette &amp; Matichard, 2015) Author(s) Collette, C., &amp; Matichard, F. Year 2015 In order to have good stability margins, it is common practice to collocate sensors and actuators. This ensures alternating poles and zeros along the imaginary axis. Then, each phase lag introduced by the poles is compensed by phase leag introduced by the zeroes. This guarantees stability and such system is referred to as hyperstable. + + + + Sensors and control of a space-based six-axis vibration isolation system + /paper/hauge04_sensor_contr_space_based_six/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /paper/hauge04_sensor_contr_space_based_six/ + Tags Stewart Platforms, Vibration Isolation, Cubic Architecture Reference (Hauge &amp; Campbell, 2004) Author(s) Hauge, G., &amp; Campbell, M. Year 2004 Discusses: + Choice of sensors and control architecture Predictability and limitations of the system dynamics Two-Sensor control architecture Vibration isolation using a Stewart platform Experimental comparison of Force sensor and Inertial Sensor and associated control architecture for vibration isolation + Figure 1: Hexapod for active vibration isolation + + + + Simultaneous vibration isolation and pointing control of flexure jointed hexapods + /paper/li01_simul_vibrat_isolat_point_contr/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /paper/li01_simul_vibrat_isolat_point_contr/ + Tags Stewart Platforms, Vibration Isolation Reference (Xiaochun Li {\it et al.}, 2001) Author(s) Li, X., Hamann, J. C., &amp; McInroy, J. E. Year 2001 if the hexapod is designed such that the payload mass/inertia matrix (\(M_x\)) and \(J^T J\) are diagonal, the dynamics from \(u\) to \(y\) are decoupled. Bibliography Li, X., Hamann, J. C., &amp; McInroy, J. E., Simultaneous vibration isolation and pointing control of flexure jointed hexapods, In , Smart Structures and Materials 2001: Smart Structures and Integrated Systems (pp. + + + + Simultaneous, fault-tolerant vibration isolation and pointing control of flexure jointed hexapods + /paper/li01_simul_fault_vibrat_isolat_point/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /paper/li01_simul_fault_vibrat_isolat_point/ + Tags Stewart Platforms, Vibration Isolation, Cubic Architecture, Flexible Joints, Multivariable Control Reference @phdthesis{li01_simul_fault_vibrat_isolat_point, author = {Li, Xiaochun}, school = {University of Wyoming}, title = {Simultaneous, Fault-tolerant Vibration Isolation and Pointing Control of Flexure Jointed Hexapods}, year = 2001, tags = {parallel robot}, } Author(s) Li, X. Year 2001 Introduction Stewart Platform: + Cubic (mutually orthogonal) Flexure Joints =&gt; eliminate friction and backlash but add complexity to the dynamics + + + + Six dof active vibration control using stewart platform with non-cubic configuration + /paper/zhang11_six_dof/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /paper/zhang11_six_dof/ + Tags Stewart Platforms, Vibration Isolation Reference (Zhen Zhang {\it et al.}, 2011) Author(s) Zhang, Z., Liu, J., Mao, J., Guo, Y., &amp; Ma, Y. Year 2011 Non-cubic stewart platform Flexible joints Magnetostrictive actuators Strong coupled motions along different axes Non-cubic architecture =&gt; permits to have larger workspace which was required Structure parameters (radius of plates, length of struts) are determined by optimization of the condition number of the Jacobian matrix Accelerometers for active isolation Adaptive FIR filters for active isolation control + + + + Studies on stewart platform manipulator: a review + /paper/furqan17_studies_stewar_platf_manip/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /paper/furqan17_studies_stewar_platf_manip/ + Tags Stewart Platforms Reference (Mohd Furqan {\it et al.}, 2017) Author(s) Furqan, M., Suhaib, M., &amp; Ahmad, N. Year 2017 Lots of references. +Bibliography Furqan, M., Suhaib, M., &amp; Ahmad, N., Studies on stewart platform manipulator: a review, Journal of Mechanical Science and Technology, 31(9), 4459–4470 (2017). http://dx.doi.org/10.1007/s12206-017-0846-1 ↩ + + + + The stewart platform manipulator: a review + /paper/dasgupta00_stewar_platf_manip/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /paper/dasgupta00_stewar_platf_manip/ + Tags Stewart Platforms Reference (Bhaskar Dasgupta &amp; Mruthyunjaya, 2000) Author(s) Dasgupta, B., &amp; Mruthyunjaya, T. Year 2000 +Table 1: Parallel VS serial manipulators Advantages Disadvantages Serial Manoeuverability Poor precision Large workspace Bends under high load Vibrate at high speed Parallel High stiffness Small workspace Good dynamic performances Precise positioning The generalized Stewart platforms consists of two rigid bodies (referred to as the base and the platoform) connected through six extensible legs, each with sherical joints at both ends. + + + + Vibration control of flexible structures using fusion of inertial sensors and hyper-stable actuator-sensor pairs + /paper/collette14_vibrat/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /paper/collette14_vibrat/ + Tags Vibration Isolation, Sensor Fusion Reference (Collette &amp; Matichard, 2014) Author(s) Collette, C., &amp; Matichard, F. Year 2014 Introduction Sensor fusion is used to combine the benefits of different types of sensors: + Relative sensor for DC positioning capability at low frequency Inertial sensors for isolation at high frequency Force sensor / collocated sensor to improve the robustness Different types of sensors In this paper, three types of sensors are used. + + + + \ No newline at end of file diff --git a/public/paper/ito16_compar_class_high_precis_actuat/index.html b/public/paper/ito16_compar_class_high_precis_actuat/index.html new file mode 100644 index 0000000..d5592a3 --- /dev/null +++ b/public/paper/ito16_compar_class_high_precis_actuat/index.html @@ -0,0 +1,284 @@ + + + + + + Comparison and classification of high-precision actuators based on stiffness influencing vibration isolation - My digital brain + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+
+ +
+ + +
+
+
+
+ +
+

Comparison and classification of high-precision actuators based on stiffness influencing vibration isolation

+
+ +
+

Contents

+
+ +
+
+
+
+
Tags
+
Vibration Isolation, Actuators
+
Reference
+
(Shingo Ito & Georg Schitter, 2016)
+
Author(s)
+
Ito, S., & Schitter, G.
+
Year
+
2016
+
+

Classification of high-precision actuators

+
+ Table 1: + Zero/Low and High stiffness actuators +
+ + + + + + + + + + + + + + + + + + + + + + + + + +
CategoriesProsCons
Zero stiffnessNo vibration transmissionLarge and Heavy
Low stiffnessHigh vibration isolationTypically for low load
High StiffnessHigh control bandwidthHigh vibration transmission
+

Time Delay of Piezoelectric Electronics

+

In this paper, the piezoelectric actuator/electronics adds a time delay which is much higher than the time delay added by the voice coil/electronics.

+

Definition of low-stiffness and high-stiffness actuator

+
    +
  • Low Stiffness actuator is defined as the ones where the transmissibility stays below 0dB at all frequency
  • +
  • High Stiffness actuator is defined as the ones where the transmissibility goes above 0dB at some frequency
  • +
+

+
+ Figure 1: Definition of low-stiffness and high-stiffness actuator
+

Figure 1: Definition of low-stiffness and high-stiffness actuator

+
+
+ +

Low-Stiffness / High-Stiffness characteristics

+
    +
  • The low stiffness actuators achieve smooth transition from active isolation to passive isolation.
  • +
  • The high stiffness actuators can have a gap between the passive and active isolation vibration where the vibrations are amplified in a certain frequency band.
  • +
+

Controller Design

+

+
+ Figure 2: Obtained transmissibility
+

Figure 2: Obtained transmissibility

+
+
+ +

Discussion

+

The stiffness requirement for low-stiffness actuators can be rephrased in the frequency domain as: “the cross-over frequency of the sensitivity function of the feedback system must be larger than \(\sqrt{2} \omega_r\) with \(\omega_r\) is the resonant frequency of the uncontrolled system”.

+

In practice, this is difficult to achieve with piezoelectric actuators as their first resonant frequency \(\omega_r\) is too close to other resonant frequencies to ensure close-loop stability. +In contrast, the frequency band between the first and the other resonances of Lorentz actuators can be broad by design making them more suitable to construct a low-stiffness actuators.

+

Bibliography

+

Ito, S., & Schitter, G., Comparison and classification of high-precision actuators based on stiffness influencing vibration isolation, IEEE/ASME Transactions on Mechatronics, 21(2), 1169–1178 (2016). http://dx.doi.org/10.1109/tmech.2015.2478658

+ + + +
+ + +
+
+
+
+ +
+ + + + +
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + diff --git a/public/paper/jiao18_dynam_model_exper_analy_stewar/index.html b/public/paper/jiao18_dynam_model_exper_analy_stewar/index.html new file mode 100644 index 0000000..8d10487 --- /dev/null +++ b/public/paper/jiao18_dynam_model_exper_analy_stewar/index.html @@ -0,0 +1,203 @@ + + + + + + Dynamic modeling and experimental analyses of stewart platform with flexible hinges - My digital brain + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+
+ +
+ + +
+
+
+
+ +
+

Dynamic modeling and experimental analyses of stewart platform with flexible hinges

+
+ +
+

Contents

+
+ +
+
+
+
+
Tags
+
Stewart Platforms, Flexible Joints
+
Reference
+
(Jian Jiao {\it et al.}, 2018)
+
Author(s)
+
Jiao, J., Wu, Y., Yu, K., & Zhao, R.
+
Year
+
2018
+
+

Bibliography

+

Jiao, J., Wu, Y., Yu, K., & Zhao, R., Dynamic modeling and experimental analyses of stewart platform with flexible hinges, Journal of Vibration and Control, 25(1), 151–171 (2018). http://dx.doi.org/10.1177/1077546318772474

+ +
+ + +
+
+
+
+ +
+ + + + +
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + diff --git a/public/paper/legnani12_new_isotr_decoup_paral_manip/index.html b/public/paper/legnani12_new_isotr_decoup_paral_manip/index.html new file mode 100644 index 0000000..89ff116 --- /dev/null +++ b/public/paper/legnani12_new_isotr_decoup_paral_manip/index.html @@ -0,0 +1,221 @@ + + + + + + A new isotropic and decoupled 6-dof parallel manipulator - My digital brain + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+
+ +
+ + +
+
+
+
+ +
+

A new isotropic and decoupled 6-dof parallel manipulator

+
+ +
+

Contents

+
+ +
+
+
+
+
Tags
+
Stewart Platforms
+
Reference
+
(Legnani {\it et al.}, 2012)
+
Author(s)
+
Legnani, G., Fassi, I., Giberti, H., Cinquemani, S., & Tosi, D.
+
Year
+
2012
+
+
    +
  • Concepts of isotropy and decoupling for parallel manipulators
  • +
  • isotropy: the kinetostatic properties (same applicable force, same possible velocity, same stiffness) are identical in all directions (e.g. cubic configuration for Stewart platform)
  • +
  • decoupling: each DoF of the end effector can be controlled by a single actuator (not the case for the Stewart platform)
  • +
+

Example of generated isotropic manipulator (not decoupled).

+

+
+ Figure 1: Location of the leg axes using an isotropy generator
+

Figure 1: Location of the leg axes using an isotropy generator

+
+
+ +

+
+ Figure 2: Isotropic configuration
+

Figure 2: Isotropic configuration

+
+
+ +

Bibliography

+

Legnani, G., Fassi, I., Giberti, H., Cinquemani, S., & Tosi, D., A new isotropic and decoupled 6-dof parallel manipulator, Mechanism and Machine Theory, 58(nil), 64–81 (2012). http://dx.doi.org/10.1016/j.mechmachtheory.2012.07.008

+ +
+ + +
+
+
+
+ +
+ + + + +
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + diff --git a/public/paper/li01_simul_fault_vibrat_isolat_point/index.html b/public/paper/li01_simul_fault_vibrat_isolat_point/index.html new file mode 100644 index 0000000..9a49a6e --- /dev/null +++ b/public/paper/li01_simul_fault_vibrat_isolat_point/index.html @@ -0,0 +1,462 @@ + + + + + + Simultaneous, fault-tolerant vibration isolation and pointing control of flexure jointed hexapods - My digital brain + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+
+ +
+ + +
+
+
+
+ +
+

Simultaneous, fault-tolerant vibration isolation and pointing control of flexure jointed hexapods

+
+ +
+

Contents

+
+ +
+
+
+
+
Tags
+
Stewart Platforms, Vibration Isolation, Cubic Architecture, Flexible Joints, Multivariable Control
+
Reference
+
@phdthesis{li01_simul_fault_vibrat_isolat_point, +author = {Li, Xiaochun}, +school = {University of Wyoming}, +title = {Simultaneous, Fault-tolerant Vibration Isolation and +Pointing Control of Flexure Jointed Hexapods}, +year = 2001, +tags = {parallel robot}, +}
+
Author(s)
+
Li, X.
+
Year
+
2001
+
+

Introduction

+

Stewart Platform:

+
    +
  • Cubic (mutually orthogonal)
  • +
  • Flexure Joints => eliminate friction and backlash but add complexity to the dynamics
  • +
+

+
+ Figure 1: Flexure jointed Stewart platform used for analysis and control
+

Figure 1: Flexure jointed Stewart platform used for analysis and control

+
+
+ +

Goal:

+
    +
  • Precise pointing in two axes (sub micro-radians)
  • +
  • simultaneously, providing both passive and active vibration isolation in six axes
  • +
+

Jacobian Analysis: +\[ \delta \mathcal{L} = J \delta \mathcal{X} \] +The origin of \(\{P\}\) is taken as the center of mass of the payload.

+

Decoupling: +If we refine the (force) inputs and (displacement) outputs as shown in Figure 2 or in Figure 3, we obtain a decoupled plant provided that:

+
    +
  1. the payload mass/inertia matrix must be diagonal (the CoM is coincident with the origin of frame \(\{P\}\))
  2. +
  3. the geometry of the hexapod and the attachment of the payload to the hexapod must be carefully chosen
  4. +
+
+

For instance, if the hexapod has a mutually orthogonal geometry (cubic configuration), the payload’s center of mass must coincide with the center of the cube formed by the orthogonal struts.

+
+

+
+ Figure 2: Decoupling the dynamics of the Stewart Platform using the Jacobians
+

Figure 2: Decoupling the dynamics of the Stewart Platform using the Jacobians

+
+
+ +

+
+ Figure 3: Decoupling the dynamics of the Stewart Platform using the Jacobians
+

Figure 3: Decoupling the dynamics of the Stewart Platform using the Jacobians

+
+
+ +

Simultaneous Vibration Isolation and Pointing Control

+

Basic idea:

+
    +
  • acceleration feedback is used to provide high-frequency vibration isolation
  • +
  • cartesian pointing feedback can be used to provide low-frequency pointing
  • +
+

The compensation is divided in frequency because:

+
    +
  • pointing sensors often have low bandwidth
  • +
  • acceleration sensors often have a poor low frequency response
  • +
+

The control bandwidth is divided as follows:

+
    +
  • low-frequency disturbances as attenuated and tracking is accomplished by feedback from low bandwidth pointing sensors
  • +
  • mid-frequency disturbances are attenuated by feedback from band-pass sensors like accelerometer or load cells
  • +
  • high-frequency disturbances are attenuated by passive isolation techniques
  • +
+

Vibration Isolation

+

The system is decoupled into six independent SISO subsystems using the architecture shown in Figure 4.

+

+
+ Figure 4: Figure caption
+

Figure 4: Figure caption

+
+
+ +

One of the subsystem plant transfer function is shown in Figure 4

+

+
+ Figure 5: Plant transfer function of one of the SISO subsystem for Vibration Control
+

Figure 5: Plant transfer function of one of the SISO subsystem for Vibration Control

+
+
+ +

Each compensator is designed using simple loop-shaping techniques.

+

The unity control bandwidth of the isolation loop is designed to be from 5Hz to 50Hz.

+
+

Despite a reasonably good match between the modeled and the measured transfer functions, the model based decoupling algorithm does not produce the expected decoupling. +Only about 20 dB separation is achieve between the diagonal and off-diagonal responses.

+
+

Pointing Control

+

A block diagram of the pointing control system is shown in Figure 6.

+

+
+ Figure 6: Figure caption
+

Figure 6: Figure caption

+
+
+ +

The plant is decoupled into two independent SISO subsystems. +The compensators are design with inverse-dynamics methods.

+

The unity control bandwidth of the pointing loop is designed to be from 0Hz to 20Hz.

+

A feedforward control is added as shown in Figure 7.

+

+
+ Figure 7: Feedforward control
+

Figure 7: Feedforward control

+
+
+ +

Simultaneous Control

+

The simultaneous vibration isolation and pointing control is approached in two ways:

+
    +
  1. design and implement the vibration isolation control first, identify the pointing plant when the isolation loops are closed, then implement the pointing compensators
  2. +
  3. the reverse design order
  4. +
+

Figure 8 shows a parallel control structure where \(G_1(s)\) is the dynamics from input force to output strut length.

+

+
+ Figure 8: A parallel scheme
+

Figure 8: A parallel scheme

+
+
+ +

The transfer function matrix for the pointing loop after the vibration isolation is closed is still decoupled. The same happens when closing the pointing loop first and looking at the transfer function matrix of the vibration isolation.

+

The effect of the isolation loop on the pointing loop is large around the natural frequency of the plant as shown in Figure 9.

+

+
+ Figure 9: \(\theta_x/\theta_{x_d}\) transfer function with the isolation loop closed (simulation)
+

Figure 9: \(\theta_x/\theta_{x_d}\) transfer function with the isolation loop closed (simulation)

+
+
+ +

The effect of pointing control on the isolation plant has not much effect.

+
+

The interaction between loops may affect the transfer functions of the first closed loop, and thus affect its relative stability.

+
+

The dynamic interaction effect:

+
    +
  • only happens in the unity bandwidth of the loop transmission of the first closed loop.
  • +
  • affect the closed loop transmission of the loop first closed (see Figures 10 and 11)
  • +
+

As shown in Figure 10, the peak resonance of the pointing loop increase after the isolation loop is closed. +The resonances happen at both crossovers of the isolation loop (15Hz and 50Hz) and they may show of loss of robustness.

+

+
+ Figure 10: Closed-loop transfer functions \(\theta_y/\theta_{y_d}\) of the pointing loop before and after the vibration isolation loop is closed
+

Figure 10: Closed-loop transfer functions \(\theta_y/\theta_{y_d}\) of the pointing loop before and after the vibration isolation loop is closed

+
+
+ +

The same happens when first closing the vibration isolation loop and after the pointing loop (Figure 11). +The first peak resonance of the vibration isolation loop at 15Hz is increased when closing the pointing loop.

+

+
+ Figure 11: Closed-loop transfer functions of the vibration isolation loop before and after the pointing control loop is closed
+

Figure 11: Closed-loop transfer functions of the vibration isolation loop before and after the pointing control loop is closed

+
+
+ +
+

The isolation loop adds a second resonance peak at its high-frequency crossover in the pointing closed-loop transfer function, which may cause instability. +Thus, it is recommended to design and implement the isolation control system first, and then identify the pointing plant with the isolation loop closed.

+
+

Experimental results

+

Two hexapods are stacked (Figure 12):

+
    +
  • the bottom hexapod is used to generate disturbances matching candidate applications
  • +
  • the top hexapod provide simultaneous vibration isolation and pointing control
  • +
+

+
+ Figure 12: Stacked Hexapods
+

Figure 12: Stacked Hexapods

+
+
+ +

Using the vibration isolation control alone, no attenuation is achieved below 1Hz as shown in figure 13.

+

+
+ Figure 13: Vibration isolation control: open-loop (solid) vs. closed-loop (dashed)
+

Figure 13: Vibration isolation control: open-loop (solid) vs. closed-loop (dashed)

+
+
+ +

The simultaneous control is of dual use:

+
    +
  • it provide simultaneous pointing and isolation control
  • +
  • it can also be used to expand the bandwidth of the isolation control to low frequencies because the pointing loops suppress pointing errors due to both base vibrations and tracking
  • +
+

The results of simultaneous control is shown in Figure 14 where the bandwidth of the isolation control is expanded to very low frequency.

+

+
+ Figure 14: Simultaneous control: open-loop (solid) vs. closed-loop (dashed)
+

Figure 14: Simultaneous control: open-loop (solid) vs. closed-loop (dashed)

+
+
+ +

Future research areas

+

Proposed future research areas include:

+
    +
  • Include base dynamics in the control: +The base dynamics is here neglected since the movements of the base are very small. +The base dynamics could be measured by mounting accelerometers at the bottom of each strut or by using force sensors. +It then could be included in the feedforward path.
  • +
  • Robust control and MIMO design
  • +
  • New decoupling method: +The proposed decoupling algorithm do not produce the expected decoupling, despite a reasonably good match between the modeled and the measured transfer functions. +Incomplete decoupling increases the difficulty in designing the controller. +New decoupling methods are needed. +These methods must be static in order to be implemented practically on precision hexapods
  • +
  • Identification: +Many advanced control methods require a more accurate model or identified plant. +A closed-loop identification method is propose to solve some problems with the current identification methods used.
  • +
  • Other possible sensors: +Many sensors can be used to expand the utility of the Stewart platform: +
      +
    • 3-axis load cells to investigate the Coriolis and centripetal terms and new decoupling methods
    • +
    • LVDT to provide differential position of the hexapod payload with respect to the base
    • +
    • Geophones to provide payload and base velocity information
    • +
    +
  • +
+

Bibliography

+

Li, X., Simultaneous, fault-tolerant vibration isolation and pointing control of flexure jointed hexapods (Doctoral dissertation) (2001). University of Wyoming, .

+ +
+ + +
+
+
+
+ +
+ + + + +
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + diff --git a/public/paper/li01_simul_vibrat_isolat_point_contr/index.html b/public/paper/li01_simul_vibrat_isolat_point_contr/index.html new file mode 100644 index 0000000..575cc8a --- /dev/null +++ b/public/paper/li01_simul_vibrat_isolat_point_contr/index.html @@ -0,0 +1,207 @@ + + + + + + Simultaneous vibration isolation and pointing control of flexure jointed hexapods - My digital brain + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+
+ +
+ + +
+
+
+
+ +
+

Simultaneous vibration isolation and pointing control of flexure jointed hexapods

+
+ +
+

Contents

+
+ +
+
+
+
+
Tags
+
Stewart Platforms, Vibration Isolation
+
Reference
+
(Xiaochun Li {\it et al.}, 2001)
+
Author(s)
+
Li, X., Hamann, J. C., & McInroy, J. E.
+
Year
+
2001
+
+
    +
  • if the hexapod is designed such that the payload mass/inertia matrix (\(M_x\)) and \(J^T J\) are diagonal, the dynamics from \(u\) to \(y\) are decoupled.
  • +
+

Bibliography

+

Li, X., Hamann, J. C., & McInroy, J. E., Simultaneous vibration isolation and pointing control of flexure jointed hexapods, In , Smart Structures and Materials 2001: Smart Structures and Integrated Systems (pp. ) (2001). : .

+ +
+ + +
+
+
+
+ +
+ + + + +
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + diff --git a/public/paper/oomen18_advan_motion_contr_precis_mechat/index.html b/public/paper/oomen18_advan_motion_contr_precis_mechat/index.html new file mode 100644 index 0000000..fa710ce --- /dev/null +++ b/public/paper/oomen18_advan_motion_contr_precis_mechat/index.html @@ -0,0 +1,213 @@ + + + + + + Advanced motion control for precision mechatronics: control, identification, and learning of complex systems - My digital brain + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+
+ +
+ + +
+
+
+
+ +
+

Advanced motion control for precision mechatronics: control, identification, and learning of complex systems

+
+ +
+

Contents

+
+ +
+
+
+
+
Tags
+
Motion Control
+
Reference
+
(Tom Oomen, 2018)
+
Author(s)
+
Oomen, T.
+
Year
+
2018
+
+

+
+ Figure 1: Envisaged developments in motion systems. In traditional motion systems, the control bandwidth takes place in the rigid-body region. In the next generation systemes, flexible dynamics are foreseen to occur within the control bandwidth.
+

Figure 1: Envisaged developments in motion systems. In traditional motion systems, the control bandwidth takes place in the rigid-body region. In the next generation systemes, flexible dynamics are foreseen to occur within the control bandwidth.

+
+
+ +

Bibliography

+

Oomen, T., Advanced motion control for precision mechatronics: control, identification, and learning of complex systems, IEEJ Journal of Industry Applications, 7(2), 127–140 (2018). http://dx.doi.org/10.1541/ieejjia.7.127

+ +
+ + +
+
+
+
+ +
+ + + + +
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + diff --git a/public/paper/poel10_explor_activ_hard_mount_vibrat/index.html b/public/paper/poel10_explor_activ_hard_mount_vibrat/index.html new file mode 100644 index 0000000..46081ee --- /dev/null +++ b/public/paper/poel10_explor_activ_hard_mount_vibrat/index.html @@ -0,0 +1,225 @@ + + + + + + An exploration of active hard mount vibration isolation for precision equipment - My digital brain + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+
+ +
+ + +
+
+
+
+ +
+

An exploration of active hard mount vibration isolation for precision equipment

+
+ +
+

Contents

+
+ +
+
+
+
+
Tags
+
Vibration Isolation
+
Reference
+
@phdthesis{poel10_explor_activ_hard_mount_vibrat, +author = {van der Poel, Gerrit Wijnand}, +doi = {10.3990/1.9789036530163}, +isbn = {978-90-365-3016-3}, +school = {University of Twente}, +title = {An Exploration of Active Hard Mount Vibration Isolation for +Precision Equipment}, +url = {https://doi.org/10.3990/1.9789036530163}, +year = 2010, +year = 2010, +tags = {parallel robot}, +}
+
Author(s)
+
van der Poel, G. W.
+
Year
+
2010
+
+

Bibliography

+

van der Poel, G. W., An exploration of active hard mount vibration isolation for precision equipment (Doctoral dissertation) (2010). University of Twente, .

+ +
+ + +
+
+
+
+ +
+ + + + +
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + diff --git a/public/paper/preumont02_force_feedb_versus_accel_feedb/index.html b/public/paper/preumont02_force_feedb_versus_accel_feedb/index.html new file mode 100644 index 0000000..aac9e93 --- /dev/null +++ b/public/paper/preumont02_force_feedb_versus_accel_feedb/index.html @@ -0,0 +1,241 @@ + + + + + + Force feedback versus acceleration feedback in active vibration isolation - My digital brain + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+
+ +
+ + +
+
+
+
+ +
+

Force feedback versus acceleration feedback in active vibration isolation

+
+ +
+

Contents

+
+ +
+
+
+
+
Tags
+
Vibration Isolation
+
Reference
+
(Preumont {\it et al.}, 2002)
+
Author(s)
+
Preumont, A., A. Francois, Bossens, F., & Abu-Hanieh, A.
+
Year
+
2002
+
+

Summary:

+
    +
  • Compares the force feedback and acceleration feedback for active damping
  • +
  • The use of a force sensor always give alternating poles and zeros in the open-loop transfer function between for force actuator and the force sensor which guarantees the stability of the closed loop
  • +
  • Acceleration feedback produces alternating poles and zeros only when the flexible structure is stiff compared to the isolation system
  • +
+

The force applied to a rigid body is proportional to its acceleration, thus sensing the total interface force gives a measured of the absolute acceleration of the solid body. +Thus force feedback and acceleration feedback are equivalent for solid bodies. +When there is a flexible payload, the two sensing options are not longer equivalent.

+
    +
  • For light payload (Figure 1), the acceleration feedback gives larger damping on the higher mode.
  • +
  • For heavy payload (Figure 2), the acceleration feedback do not give alternating poles and zeros and thus for high control gains, the system becomes unstable
  • +
+

+
+ Figure 1: Root locus for light flexible payload, (a) Force feedback, (b) acceleration feedback
+

Figure 1: Root locus for light flexible payload, (a) Force feedback, (b) acceleration feedback

+
+
+ +

+
+ Figure 2: Root locus for heavy flexible payload, (a) Force feedback, (b) acceleration feedback
+

Figure 2: Root locus for heavy flexible payload, (a) Force feedback, (b) acceleration feedback

+
+
+ +

Guaranteed stability of the force feedback:

+
+

If two arbitrary flexible, undamped structures are connected with a single-axis soft isolator with force feedback, the poles and zeros of the open-loop transfer function from the force actuator to the force sensor alternate on the imaginary axis.

+
+

The same is true for the transfer function from the force actuator to the relative displacement of the actuator.

+
+

According to physical interpretation of the zeros, they represent the resonances of the subsystem constrained by the sensor and the actuator.

+
+

Bibliography

+

Preumont, A., A. Fran\ccois, Bossens, F., & Abu-Hanieh, A., Force feedback versus acceleration feedback in active vibration isolation, Journal of Sound and Vibration, 257(4), 605–613 (2002). http://dx.doi.org/10.1006/jsvi.2002.5047

+ +
+ + +
+
+
+
+ +
+ + + + +
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + diff --git a/public/paper/preumont07_six_axis_singl_stage_activ/index.html b/public/paper/preumont07_six_axis_singl_stage_activ/index.html new file mode 100644 index 0000000..c3e353c --- /dev/null +++ b/public/paper/preumont07_six_axis_singl_stage_activ/index.html @@ -0,0 +1,248 @@ + + + + + + A six-axis single-stage active vibration isolator based on stewart platform - My digital brain + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+
+ +
+ + +
+
+
+
+ +
+

A six-axis single-stage active vibration isolator based on stewart platform

+
+ +
+

Contents

+
+ +
+
+
+
+
Tags
+
Vibration Isolation, Stewart Platforms, Flexible Joints
+
Reference
+
(Preumont {\it et al.}, 2007)
+
Author(s)
+
Preumont, A., Horodinca, M., Romanescu, I., Marneffe, B. d., Avraam, M., Deraemaeker, A., Bossens, F., …
+
Year
+
2007
+
+

Summary:

+
    +
  • Cubic Stewart platform (Figure 3) +
      +
    • Provides uniform control capability
    • +
    • Uniform stiffness in all directions
    • +
    • minimizes the cross-coupling among actuators and sensors of different legs
    • +
    +
  • +
  • Flexible joints (Figure 2)
  • +
  • Piezoelectric force sensors
  • +
  • Voice coil actuators
  • +
  • Decentralized feedback control approach for vibration isolation
  • +
  • Effect of parasitic stiffness of the flexible joints on the IFF performance (Figure 1)
  • +
  • The Stewart platform has 6 suspension modes at different frequencies. +Thus the gain of the IFF controller cannot be optimal for all the modes. +It is better if all the modes of the platform are near to each other.
  • +
  • Discusses the design of the legs in order to maximize the natural frequency of the local modes.
  • +
  • To estimate the isolation performance of the Stewart platform, a scalar indicator is defined as the Frobenius norm of the transmissibility matrix
  • +
+

+
+ Figure 1: Root locus with IFF with no parasitic stiffness and with parasitic stiffness
+

Figure 1: Root locus with IFF with no parasitic stiffness and with parasitic stiffness

+
+
+ +

+
+ Figure 2: Flexible joints used for the Stewart platform
+

Figure 2: Flexible joints used for the Stewart platform

+
+
+ +

+
+ Figure 3: Stewart platform
+

Figure 3: Stewart platform

+
+
+ +

Bibliography

+

Preumont, A., Horodinca, M., Romanescu, I., Marneffe, B. d., Avraam, M., Deraemaeker, A., Bossens, F., …, A six-axis single-stage active vibration isolator based on stewart platform, Journal of Sound and Vibration, 300(3-5), 644–661 (2007). http://dx.doi.org/10.1016/j.jsv.2006.07.050

+ +
+ + +
+
+
+
+ +
+ + + + +
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + diff --git a/public/paper/saxena12_advan_inter_model_contr_techn/index.html b/public/paper/saxena12_advan_inter_model_contr_techn/index.html new file mode 100644 index 0000000..a46fd71 --- /dev/null +++ b/public/paper/saxena12_advan_inter_model_contr_techn/index.html @@ -0,0 +1,265 @@ + + + + + + Advances in internal model control technique: a review and future prospects - My digital brain + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+
+ +
+ + +
+
+
+
+ +
+

Advances in internal model control technique: a review and future prospects

+
+ +
+

Contents

+
+ +
+
+
+
+
Tags
+
Complementary Filters
+
Reference
+
(Sahaj Saxena & YogeshV Hote, 2012)
+
Author(s)
+
Saxena, S., & Hote, Y.
+
Year
+
2012
+
+

Proposed Filter \(F(s)\)

+

\begin{align*} +F(s) &= \frac{1}{(\lambda s + 1)^n} \\\
+F(s) &= \frac{n \lambda + 1}{(\lambda s + 1)^n} +\end{align*}

+

Internal Model Control

+

Central concept in IMC: control can be acheive only if the control system involves, either implicitly or explicitly, some representation of the process to be controlled.

+

Basic IMC structure

+

IMC can be considered as a special case of classical feedback structure with plant \(G(s)\) and controller \(C(s)\).

+

The plan model \(G_M(s)\) is added and substracted into the feedback path of feedback controller.

+

The structure can then be modified and we obtain a new controller \(Q(s)\).

+

IMC is related to the classical controller through:

+

\begin{align*} +Q(s) = \frac{C(s)}{1+G_M(s)C(s)} \\\
+C(s) = \frac{Q(s)}{1-G_M(s)Q(s)} +\end{align*}

+

Internal model control system is characterized by a control device consisting of the controller \(Q(s)\) and a predictive model \(G_M(s)\) of the process (internal model). +The internal model loop uses the difference between the outputs of the process \(G(s)\) to be controlled and the internal model. +This difference \(E(s)\) represents the effect of disturbance and mismatch of the model.

+

Features of IMC Structure

+

Three properties:

+
    +
  • Dual stability: assume that, if the plant model is perfect (\(G_M(s) = G(s)\)) and disturbance is absent, the system becomes open-loop and the closed-loop stability is characterized by the stability of \(G(s)\) and \(Q(s)\)
  • +
  • Perfect control: assume that, if the controller is equal to the model inverse (\(Q(s) = G_M^{-1}\)) and \(G(s) = G_M(s)\) with \(G(s)\) stable, then the system is perfectly controlled.
  • +
  • Zero Offset: assume that, if the steady state gain of the controller is equal to the inverse of model gain, then offset free control is obtained for constant step of ramp type inputs and disturbances. As expected, the equivalent classical controller leads to integral action.
  • +
+

Issues:

+
    +
  • the plant model is never perfect
  • +
  • inverting the model can cause instability
  • +
  • control signal may have large magnitude
  • +
+

Design procedure for IMC Compensator

+
    +
  1. factorize the plant model as \(G_M(s) = G_{M-}(s)G_{M+}(s)\) where \(G_{M-}(s)\) is invertible and minimum phase and \(G_{M+}(s)\) is non-invertible and contains all non-minimum phase elements (delays, RHP zeros). Then, the controller is the inverse of the invertible portion of the plant model: \(Q_1(s) = G_{M-}^{-1}(s)\).
  2. +
  3. Filter selection: to make the controller proper and robust against the plant-model mismatch, a low pass filter of the form \(F(s) = \frac{n \lambda}{(\lambda s + 1)^n}\) is augmented with the inverted model \(Q_1(s)\): \(Q(s) = Q_1(s) F(s)\). \(\lambda\) is a tuning parameter which has an inverse relationship with the speed of closed loop response, \(n\) is selected such that \(Q(s)\) becomes proper.
  4. +
+

Issues in IMC

+

Filter selection and tuning guidelines

+

Some advantages and future prospects

+

Conclusion

+

The interesting feature regarding IMC is that the design scheme is identical to the open-loop control design procedure and the implementation of IMC results in a feedback system, thereby copying the disturbances and parameter uncertainties, while open-loop control is not.

+

Bibliography

+

Saxena, S., & Hote, Y., Advances in internal model control technique: a review and future prospects, IETE Technical Review, 29(6), 461 (2012). http://dx.doi.org/10.4103/0256-4602.105001

+ +
+ + +
+
+
+
+ +
+ + + + +
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + diff --git a/public/paper/schellekens98_desig_precis/index.html b/public/paper/schellekens98_desig_precis/index.html new file mode 100644 index 0000000..b01d998 --- /dev/null +++ b/public/paper/schellekens98_desig_precis/index.html @@ -0,0 +1,203 @@ + + + + + + Design for precision: current status and trends - My digital brain + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+
+ +
+ + +
+
+
+
+ +
+

Design for precision: current status and trends

+
+ +
+

Contents

+
+ +
+
+
+
+
Tags
+
Precision Engineering
+
Reference
+
(Schellekens {\it et al.}, 1998)
+
Author(s)
+
Schellekens, P., Rosielle, N., Vermeulen, H., Vermeulen, M., Wetzels, S., & Pril, W.
+
Year
+
1998
+
+

Bibliography

+

Schellekens, P., Rosielle, N., Vermeulen, H., Vermeulen, M., Wetzels, S., & Pril, W., Design for precision: current status and trends, Cirp Annals, (2), 557–586 (1998). http://dx.doi.org/10.1016/s0007-8506(07)63243-0

+ +
+ + +
+
+
+
+ +
+ + + + +
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + diff --git a/public/paper/sebastian12_nanop_with_multip_sensor/index.html b/public/paper/sebastian12_nanop_with_multip_sensor/index.html new file mode 100644 index 0000000..686d94e --- /dev/null +++ b/public/paper/sebastian12_nanop_with_multip_sensor/index.html @@ -0,0 +1,203 @@ + + + + + + Nanopositioning with multiple sensors: a case study in data storage - My digital brain + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+
+ +
+ + +
+
+
+
+ +
+

Nanopositioning with multiple sensors: a case study in data storage

+
+ +
+

Contents

+
+ +
+
+
+
+
Tags
+
Sensor Fusion
+
Reference
+
(Abu Sebastian & Angeliki Pantazi, 2012)
+
Author(s)
+
Sebastian, A., & Pantazi, A.
+
Year
+
2012
+
+

Bibliography

+

Sebastian, A., & Pantazi, A., Nanopositioning with multiple sensors: a case study in data storage, IEEE Transactions on Control Systems Technology, 20(2), 382–394 (2012). http://dx.doi.org/10.1109/tcst.2011.2177982

+ +
+ + +
+
+
+
+ +
+ + + + +
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + diff --git a/public/paper/spanos95_soft_activ_vibrat_isolat/index.html b/public/paper/spanos95_soft_activ_vibrat_isolat/index.html new file mode 100644 index 0000000..d268642 --- /dev/null +++ b/public/paper/spanos95_soft_activ_vibrat_isolat/index.html @@ -0,0 +1,259 @@ + + + + + + A soft 6-axis active vibration isolator - My digital brain + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+
+ +
+ + +
+
+
+
+ +
+

A soft 6-axis active vibration isolator

+
+ +
+

Contents

+
+ +
+
+
+
+
Tags
+
Stewart Platforms, Vibration Isolation
+
Reference
+
(Spanos {\it et al.}, 1995)
+
Author(s)
+
Spanos, J., Rahman, Z., & Blackwood, G.
+
Year
+
1995
+
+

Stewart Platform (Figure 1):

+
    +
  • Voice Coil
  • +
  • Flexible joints (cross-blades)
  • +
  • Force Sensors
  • +
  • Cubic Configuration
  • +
+

+
+ Figure 1: Stewart Platform
+

Figure 1: Stewart Platform

+
+
+ +

Total mass of the paylaod: 30kg +Center of gravity is 9cm above the geometry center of the mount (cube’s center?).

+

Limitation of the Decentralized Force Feedback:

+
    +
  • high frequency pole due to internal resonances of the struts
  • +
  • low frequency zero due to the rotational stiffness of the flexible joints
  • +
+

After redesign of the struts:

+
    +
  • high frequency pole at 4.7kHz
  • +
  • low frequency zero at 2.6Hz but non-minimum phase (not explained). +Small viscous damping material in the cross blade flexures made the zero minimum phase again.
  • +
+

+
+ Figure 2: Experimentally measured transfer function from voice coil drive voltage to collocated load cell output voltage
+

Figure 2: Experimentally measured transfer function from voice coil drive voltage to collocated load cell output voltage

+
+
+ +

The controller used consisted of:

+
    +
  • second order low pass filter to gain stabilize the plant at high frequencies and provide steep roll-off
  • +
  • first order lead filter to provide adequate phase margin at the high frequency crossover
  • +
  • first order lag filter to provide adequate phase margin at the low frequency crossover
  • +
  • a first order high pass filter to attenuate the excess gain resulting from the low frequency zero
  • +
+

The results in terms of transmissibility are shown in Figure 3.

+

+
+ Figure 3: Experimentally measured Frobenius norm of the 6-axis transmissibility
+

Figure 3: Experimentally measured Frobenius norm of the 6-axis transmissibility

+
+
+ +

Bibliography

+

Spanos, J., Rahman, Z., & Blackwood, G., A soft 6-axis active vibration isolator, In , Proceedings of 1995 American Control Conference - ACC'95 (pp. ) (1995). : .

+ +
+ + +
+
+
+
+ +
+ + + + +
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + diff --git a/public/paper/stankevic17_inter_charac_rotat_stages_x_ray_nanot/index.html b/public/paper/stankevic17_inter_charac_rotat_stages_x_ray_nanot/index.html new file mode 100644 index 0000000..50728eb --- /dev/null +++ b/public/paper/stankevic17_inter_charac_rotat_stages_x_ray_nanot/index.html @@ -0,0 +1,224 @@ + + + + + + Interferometric characterization of rotation stages for x-ray nanotomography - My digital brain + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+
+ +
+ + +
+
+
+
+ +
+

Interferometric characterization of rotation stages for x-ray nanotomography

+
+ +
+

Contents

+
+ +
+
+
+
+
Tags
+
Nano Active Stabilization System, Positioning Stations
+
Reference
+
(Tomas Stankevic {\it et al.}, 2017)
+
Author(s)
+
Stankevic, T., Engblom, C., Langlois, F., Alves, F., Lestrade, A., Jobert, N., Cauchon, G., …
+
Year
+
2017
+
+
    +
  • Similar Station than the NASS
  • +
  • Similar Metrology with fiber based interferometers and cylindrical reference mirror
  • +
+

+
+ Figure 1: Positioning Station
+

Figure 1: Positioning Station

+
+
+ +
    +
  • Thermal expansion: Stabilized down to \(5mK/h\) using passive water flow through the baseplate below the sample stage and in the interferometry reference frame.
  • +
  • Controller: Two Independant PID loops
  • +
  • Repeatable errors => feedforward (Look Up Table)
  • +
  • Non-repeatable errors => feedback
  • +
  • Result: 40nm runout error
  • +
+

Bibliography

+

Stankevic, T., Engblom, C., Langlois, F., Alves, F., Lestrade, A., Jobert, N., Cauchon, G., …, Interferometric characterization of rotation stages for x-ray nanotomography, Review of Scientific Instruments, 88(5), 053703 (2017). http://dx.doi.org/10.1063/1.4983405

+ +
+ + +
+
+
+
+ +
+ + + + +
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + diff --git a/public/paper/tang18_decen_vibrat_contr_voice_coil/index.html b/public/paper/tang18_decen_vibrat_contr_voice_coil/index.html new file mode 100644 index 0000000..0d36af6 --- /dev/null +++ b/public/paper/tang18_decen_vibrat_contr_voice_coil/index.html @@ -0,0 +1,204 @@ + + + + + + Decentralized vibration control of a voice coil motor-based stewart parallel mechanism: simulation and experiments - My digital brain + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+
+ +
+ + +
+
+
+
+ +
+

Decentralized vibration control of a voice coil motor-based stewart parallel mechanism: simulation and experiments

+
+ +
+

Contents

+
+ +
+
+
+
+
Tags
+
Stewart Platforms
+
Reference
+
(Jie Tang {\it et al.}, 2018)
+
Author(s)
+
Tang, J., Cao, D., & Yu, T.
+
Year
+
2018
+
+

Bibliography

+

Tang, J., Cao, D., & Yu, T., Decentralized vibration control of a voice coil motor-based stewart parallel mechanism: simulation and experiments, Proceedings of the Institution of Mechanical Engineers, Part C: Journal of Mechanical Engineering Science, 233(1), 132–145 (2018). http://dx.doi.org/10.1177/0954406218756941

+ +
+ + +
+
+
+
+ +
+ + + + +
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + diff --git a/public/paper/tjepkema12_sensor_fusion_activ_vibrat_isolat_precis_equip/index.html b/public/paper/tjepkema12_sensor_fusion_activ_vibrat_isolat_precis_equip/index.html new file mode 100644 index 0000000..efa4cb8 --- /dev/null +++ b/public/paper/tjepkema12_sensor_fusion_activ_vibrat_isolat_precis_equip/index.html @@ -0,0 +1,228 @@ + + + + + + Sensor fusion for active vibration isolation in precision equipment - My digital brain + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+
+ +
+ + +
+
+
+
+ +
+

Sensor fusion for active vibration isolation in precision equipment

+
+ +
+

Contents

+
+ +
+
+
+
+
Tags
+
Sensor Fusion, Vibration Isolation
+
Reference
+
(Tjepkema {\it et al.}, 2012)
+
Author(s)
+
Tjepkema, D., Dijk, J. v., & Soemers, H.
+
Year
+
2012
+
+

Relative motion Control

+

Control law: \(f = -G(x-w)\)

+

\[ \frac{x}{w} = \frac{k+G}{ms^2 + k+G} \] +\[ \frac{x}{F} = \frac{1}{ms^2 + k+G} \]

+

Force Control

+

Control law: \(f = -G F_a = -G \left(f-k(x-w)\right)\)

+

\[ \frac{x}{w} = \frac{k}{(1+G)ms^2 + k} \] +\[ \frac{x}{F} = \frac{1+G}{(1+G)ms^2 + k} \]

+

Inertial Control

+

Control law: \(f = -Gx\)

+

\[ \frac{x}{w} = \frac{k}{ms^2 + k+G} \] +\[ \frac{x}{F} = \frac{1}{ms^2 + k+G} \]

+

Design constraints and control bandwidth

+

Heavier sensor => lower noise but it is harder to maintain collocation with the actuator => that limits the bandwidth. +There is a compromise between sensor noise and the influence of the sensor size on the system’s design and on the control bandwidth.

+

Bibliography

+

Tjepkema, D., Dijk, J. v., & Soemers, H., Sensor fusion for active vibration isolation in precision equipment, Journal of Sound and Vibration, 331(4), 735–749 (2012). http://dx.doi.org/10.1016/j.jsv.2011.09.022

+ +
+ + +
+
+
+
+ +
+ + + + +
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + diff --git a/public/paper/wang12_autom_marker_full_field_hard/index.html b/public/paper/wang12_autom_marker_full_field_hard/index.html new file mode 100644 index 0000000..cea36a6 --- /dev/null +++ b/public/paper/wang12_autom_marker_full_field_hard/index.html @@ -0,0 +1,211 @@ + + + + + + Automated markerless full field hard x-ray microscopic tomography at sub-50 nm 3-dimension spatial resolution - My digital brain + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+
+ +
+ + +
+
+
+
+ +
+

Automated markerless full field hard x-ray microscopic tomography at sub-50 nm 3-dimension spatial resolution

+
+ +
+

Contents

+
+ +
+
+
+
+
Tags
+
Nano Active Stabilization System
+
Reference
+
(Jun Wang {\it et al.}, 2012)
+
Author(s)
+
Wang, J., Chen, Y. K., Yuan, Q., Tkachuk, A., Erdonmez, C., Hornberger, B., & Feser, M.
+
Year
+
2012
+
+

Introduction of Markers: +That limits the type of samples that is studied

+

There is a need for markerless nano-tomography +=> the key requirement is the precision and stability of the positioning stages.

+

Passive rotational run-out error system: +It uses calibrated metrology disc and capacitive sensors

+

Bibliography

+

Wang, J., Chen, Y. K., Yuan, Q., Tkachuk, A., Erdonmez, C., Hornberger, B., & Feser, M., Automated markerless full field hard x-ray microscopic tomography at sub-50 nm 3-dimension spatial resolution, Applied Physics Letters, 100(14), 143107 (2012). http://dx.doi.org/10.1063/1.3701579

+ +
+ + +
+
+
+
+ +
+ + + + +
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + diff --git a/public/paper/wang16_inves_activ_vibrat_isolat_stewar/index.html b/public/paper/wang16_inves_activ_vibrat_isolat_stewar/index.html new file mode 100644 index 0000000..765b53a --- /dev/null +++ b/public/paper/wang16_inves_activ_vibrat_isolat_stewar/index.html @@ -0,0 +1,248 @@ + + + + + + Investigation on active vibration isolation of a stewart platform with piezoelectric actuators - My digital brain + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+
+ +
+ + +
+
+
+
+ +
+

Investigation on active vibration isolation of a stewart platform with piezoelectric actuators

+
+ +
+

Contents

+
+ +
+
+
+
+
Tags
+
Stewart Platforms, Vibration Isolation, Flexible Joints
+
Reference
+
(Wang {\it et al.}, 2016)
+
Author(s)
+
Wang, C., Xie, X., Chen, Y., & Zhang, Z.
+
Year
+
2016
+
+

Model of the Stewart platform:

+
    +
  • Struts are treated as flexible beams
  • +
  • Payload and the base are treated as flexible plates
  • +
  • The FRF synthesis method permits to derive FRFs of the Stewart platform
  • +
+

The model is compared with a Finite Element model and is shown to give the same results. +The proposed model is thus effective.

+

+
+ Figure 1: Stewart Platform
+

Figure 1: Stewart Platform

+
+
+ +

Control: +Combines:

+
    +
  • the FxLMS-based adaptive inverse control => suppress transmission of periodic vibrations
  • +
  • direct feedback of integrated forces => dampen vibration of inherent modes and thus reduce random vibrations
  • +
+

Force Feedback (Figure 2).

+
    +
  • the force sensor is mounted between the base and the strut
  • +
+

+
+ Figure 2: Feedback of integrated forces in the platform
+

Figure 2: Feedback of integrated forces in the platform

+
+
+ +

Sorts of HAC-LAC control:

+
    +
  • LAC: Decentralized integral force feedback
  • +
  • HAC: Inertial control using accelerometers. Use of the Jacobian to decouple the motion and then Fx-LMS based adaptive control is used
  • +
+

Experimental validation:

+
    +
  • All 6 transfer function from actuator force to force sensors are almost the same (gain offset)
  • +
  • Effectiveness of control methods are shown
  • +
+

Bibliography

+

Wang, C., Xie, X., Chen, Y., & Zhang, Z., Investigation on active vibration isolation of a stewart platform with piezoelectric actuators, Journal of Sound and Vibration, 383(), 1–19 (2016). http://dx.doi.org/10.1016/j.jsv.2016.07.021

+ +
+ + +
+
+
+
+ +
+ + + + +
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + diff --git a/public/paper/yang19_dynam_model_decoup_contr_flexib/index.html b/public/paper/yang19_dynam_model_decoup_contr_flexib/index.html new file mode 100644 index 0000000..aff79d9 --- /dev/null +++ b/public/paper/yang19_dynam_model_decoup_contr_flexib/index.html @@ -0,0 +1,340 @@ + + + + + + Dynamic modeling and decoupled control of a flexible stewart platform for vibration isolation - My digital brain + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+
+ +
+ + +
+
+
+
+ +
+

Dynamic modeling and decoupled control of a flexible stewart platform for vibration isolation

+
+ +
+

Contents

+
+ +
+
+
+
+
Tags
+
Stewart Platforms, Vibration Isolation, Flexible Joints, Cubic Architecture
+
Reference
+
(Yang {\it et al.}, 2019)
+
Author(s)
+
Yang, X., Wu, H., Chen, B., Kang, S., & Cheng, S.
+
Year
+
2019
+
+

Discusses:

+
    +
  • flexible-rigid model of Stewart platform
  • +
  • the impact of joint stiffness is compensated using a displacement sensor and a force sensor
  • +
  • then the MIMO system is decoupled in modal space and 6 SISO controllers are applied for vibration isolation using force sensors
  • +
+

The joint stiffness impose a limitation on the control performance using force sensors as it adds a zero at low frequency in the dynamics. +Thus, this stiffness is taken into account in the dynamics and compensated for.

+

Stewart platform (Figure 1):

+
    +
  • piezoelectric actuators
  • +
  • flexible joints (Figure 2)
  • +
  • force sensors (used for vibration isolation)
  • +
  • displacement sensors (used to decouple the dynamics)
  • +
  • cubic (even though not said explicitly)
  • +
+

+
+ Figure 1: Stewart Platform
+

Figure 1: Stewart Platform

+
+
+ +

+
+ Figure 2: Flexible Joints
+

Figure 2: Flexible Joints

+
+
+ +

The stiffness of the flexible joints (Figure 2) are computed with an FEM model and shown in Table 1.

+

+
+ Table 1: + Stiffness of flexible joints obtained by FEM +
+ + + + + + + + + + + + + + + + + + + + + +
\(k_{\theta u},\ k_{\psi u}\)\(72 Nm/rad\)
\(k_{\theta s}\)\(51 Nm/rad\)
\(k_{\psi s}\)\(62 Nm/rad\)
\(k_{\gamma s}\)\(64 Nm/rad\)
+

Dynamics: +If the bending and torsional stiffness of the flexible joints are neglected: +\[ M \ddot{x} + C \dot{x} + K x = J^T f \]

+
    +
  • \(M\) is the mass matrix
  • +
  • \(C\) is the damping matrix
  • +
  • \(K\) is the stiffness matrix
  • +
  • \(x\) is the generalized coordinates, representing the displacement and orientation of the payload plate
  • +
  • \(f\) is the actuator forces
  • +
  • \(J\) is the Jacobian matrix
  • +
+

In this paper, the parasitic bending stiffness of the flexible joints are considered: +\[ M \ddot{x} + C \dot{x} + (K + K_e) x = J^T f \] +where \(K_e\) is the stiffness matrix induced by the parasitic stiffness of the flexible joints.

+

Analytical expression for \(K_e\) are derived in the paper.

+

Controller Design: +There is a strong coupling between the input forces and the state variables in the task space. +The traditional modal decoupled control strategy cannot work with the flexible Stewart platform because it is impossible to achieve simultaneous diagonalization of the mass, damped and stiffness matrices.

+

To make the six-dof system decoupled into six single-dof isolators, a controller based on the leg’s force and position feedback is designed.

+
+

The idea is to synthesize the control force that can compensate the parasitic bending and torsional torques of the flexible joints and simultaneously achieve diagonalization of the matrices \(M\), \(C\) and \(K\)

+
+

The force measured by the force sensors are: +\[ y = f - k J x - c J \dot{x} \] +The displacements measured by the position sensors are: +\[ z = [\Delta l_1\ \dots\ \Delta l_6]^T \]

+

Let’s apply the feedback control based on both the force sensor and the position sensor: +\[ f = -H(s) y + (1 + H(s)) K_{el} z \] +where \(K_{el} = J^{-T} K_e J^T\) is the stiffness matrix of the flexible joints expressed in joint space.

+

We thus obtain: +\[ f = \frac{H(s)}{1 + H(s)} (k J x + c J \dot{x}) + J^{-T} K_e x \]

+

If we substitute \(f\) in the dynamic equation, we obtain that the parasitic stiffness effect of the flexible joints has been compensated by the actuation forces and the system can now be decoupled in modal space \(x = \Phi u\). +\(\Phi\) is the modal matrix selected such that \(\Phi^T M \Phi = I_6\) and \(k \Phi^T J^T J \Phi = \text{diag}(\omega_1^2\ \dots\ \omega_6^2)\): +\[ s^2 + \frac{1}{1 + H(s)} \frac{c \omega_i^2}{k} s + \frac{1}{1 + H(s)} \omega_i^2 = 0, \quad i = 1,\ \dots,\ 6 \]

+

The six-dof system is now transformed into a six one-dof system where \(H(s)\) can be designed for control purpose.

+

In order to apply this control strategy:

+
    +
  • A force sensor and displacement sensor are need in each strut
  • +
  • The joint stiffness has to be known
  • +
  • The jacobian has to be computed
  • +
  • No information about modal matrix is needed
  • +
+

The block diagram of the control strategy is represented in Figure 3.

+

+
+ Figure 3: Control Architecture used
+

Figure 3: Control Architecture used

+
+
+ +

\(H(s)\) is designed as a proportional plus integral compensator: +\[ H(s) = k_p + k_i/s \]

+

Substituting \(H(s)\) in the equation of motion gives that:

+
    +
  • an increase of \(k_i\) increase the damping and thus suppress the resonance peaks
  • +
  • an increase of \(k_p\) lowers the resonance frequency and thus the bandwidth of vibration isolation is examped
  • +
+

Experimental Validation: +An external Shaker is used to excite the base and accelerometers are located on the base and mobile platforms to measure their motion. +The results are shown in Figure 4. +In theory, the vibration performance can be improved, however in practice, increasing the gain causes saturation of the piezoelectric actuators and then the instability occurs.

+

+
+ Figure 4: Frequency response of the acceleration ratio between the paylaod and excitation (Transmissibility)
+

Figure 4: Frequency response of the acceleration ratio between the paylaod and excitation (Transmissibility)

+
+
+ +
+

A model-based controller is then designed based on the leg’s force and position feedback. +The position feedback compensates the effect of parasitic bending and torsional stiffness of the flexible joints. +The force feedback makes the six-DOF MIMO system decoupled into six SISO subsystems in modal space, where the control gains can be designed and analyzed more effectively and conveniently. +The proportional and integral gains in the sub-controller are used to separately regulate the vibration isolation bandwidth and active damping simultaneously for the six vibration modes.

+
+

Bibliography

+

Yang, X., Wu, H., Chen, B., Kang, S., & Cheng, S., Dynamic modeling and decoupled control of a flexible stewart platform for vibration isolation, Journal of Sound and Vibration, 439(), 398–412 (2019). http://dx.doi.org/10.1016/j.jsv.2018.10.007

+ +
+ + +
+
+
+
+ +
+ + + + +
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + diff --git a/public/paper/zhang11_six_dof/index.html b/public/paper/zhang11_six_dof/index.html new file mode 100644 index 0000000..5fb3300 --- /dev/null +++ b/public/paper/zhang11_six_dof/index.html @@ -0,0 +1,222 @@ + + + + + + Six dof active vibration control using stewart platform with non-cubic configuration - My digital brain + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+
+ +
+ + +
+
+
+
+ +
+

Six dof active vibration control using stewart platform with non-cubic configuration

+
+ +
+

Contents

+
+ +
+
+
+
+
Tags
+
Stewart Platforms, Vibration Isolation
+
Reference
+
(Zhen Zhang {\it et al.}, 2011)
+
Author(s)
+
Zhang, Z., Liu, J., Mao, J., Guo, Y., & Ma, Y.
+
Year
+
2011
+
+
    +
  • Non-cubic stewart platform
  • +
  • Flexible joints
  • +
  • Magnetostrictive actuators
  • +
  • Strong coupled motions along different axes
  • +
  • Non-cubic architecture => permits to have larger workspace which was required
  • +
  • Structure parameters (radius of plates, length of struts) are determined by optimization of the condition number of the Jacobian matrix
  • +
  • Accelerometers for active isolation
  • +
  • Adaptive FIR filters for active isolation control
  • +
+

+
+ Figure 1: Prototype of the non-cubic stewart platform
+

Figure 1: Prototype of the non-cubic stewart platform

+
+
+ +

Bibliography

+

Zhang, Z., Liu, J., Mao, J., Guo, Y., & Ma, Y., Six dof active vibration control using stewart platform with non-cubic configuration, In , 2011 6th IEEE Conference on Industrial Electronics and Applications (pp. ) (2011). : .

+ +
+ + +
+
+
+
+ +
+ + + + +
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + diff --git a/public/robots.txt b/public/robots.txt new file mode 100644 index 0000000..1ac6a8d --- /dev/null +++ b/public/robots.txt @@ -0,0 +1,2 @@ +User-agent: * +Sitemap: /sitemap.xml diff --git a/public/sass/main.min.47a894bd6354cc46903f62433747958dc936e1c95c28a76ac80319bca9708ed1.css b/public/sass/main.min.47a894bd6354cc46903f62433747958dc936e1c95c28a76ac80319bca9708ed1.css new file mode 100644 index 0000000..0df6659 --- /dev/null +++ b/public/sass/main.min.47a894bd6354cc46903f62433747958dc936e1c95c28a76ac80319bca9708ed1.css @@ -0,0 +1 @@ +@charset "UTF-8";@font-face{font-family:chancery;src:url(../fonts/chancery/apple-chancery-webfont.eot);src:local("Apple Chancery"),url(../fonts/chancery/apple-chancery-webfont.eot?#iefix)format("embedded-opentype"),url(../fonts/chancery/apple-chancery-webfont.woff2)format("woff2"),url(../fonts/chancery/apple-chancery-webfont.woff)format("woff"),url(../fonts/chancery/apple-chancery-webfont.ttf)format("truetype"),url(../fonts/chancery/apple-chancery-webfont.svg#apple-chancery)format("svg");font-weight:lighter;font-style:normal}.post .post-content a.reference-link{font-weight:700;font-style:italic;font-color:#34495e;color:#34495e}.post .post-content a.reference-link:hover{border-bottom-color:#c05b4d #f8f5ec}.post .post-content a.bibtex-entry:target{background-color:#ffa}/*!normalize.css v3.0.2 | MIT License | git.io/normalize*/html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{font-size:2em;margin:.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}html{font-size:16px;box-sizing:border-box}body{padding:0;margin:0;font-family:source sans pro,helvetica neue,Arial,sans-serif;font-weight:400;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;line-height:1.5;color:#34495e;background:#fefefe;scroll-behavior:smooth;border-top:3px solid #c05b4d}@media screen and (max-width:800px){body{border-top:0}}::selection{background:#c05b4d;color:#fff}img{max-width:100%;height:auto;display:inline-block;vertical-align:middle}a{color:#34495e;text-decoration:none}h1{font-size:26px;font-family:Athelas,STHeiti,Microsoft Yahei,serif}h2{font-size:24px;font-family:Athelas,STHeiti,Microsoft Yahei,serif}h3{font-size:20px;font-family:Athelas,STHeiti,Microsoft Yahei,serif}h4{font-size:16px;font-family:Athelas,STHeiti,Microsoft Yahei,serif}h5{font-size:14px;font-family:Athelas,STHeiti,Microsoft Yahei,serif}h6{font-size:14px;font-family:Athelas,STHeiti,Microsoft Yahei,serif}.container{margin:0 auto;width:800px}@media screen and (max-width:800px){.container{width:100%;box-shadow:-1px -5px 5px #cacaca}}.content-wrapper{padding:0 20px}.video-container{position:relative;padding-bottom:56.25%;padding-top:25px;height:0}.video-container iframe{position:absolute;top:0;left:0;width:100%;height:100%}@font-face{font-family:iconfont;src:url(../fonts/iconfont/iconfont.eot);src:url(../fonts/iconfont/iconfont.eot#iefix)format("embedded-opentype"),url(../fonts/iconfont/iconfont.woff)format("woff"),url(../fonts/iconfont/iconfont.ttf)format("truetype"),url(../fonts/iconfont/iconfont.svg#iconfont)format("svg")}.iconfont{font-family:iconfont!important;speak:none;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-text-stroke-width:.2px;cursor:pointer;letter-spacing:0;font-feature-settings:"liga";font-variant-ligatures:discretionary-ligatures;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.icon-bilibili:before{content:"\e900";font-size:.9em;position:relative;top:-4px}.icon-instagram:before{font-size:.95em;content:"\e611";position:relative;top:1px}.icon-douban:before{content:"\e610";position:relative;top:2px}.icon-tumblr:before{content:"\e69f";font-size:.85em;position:relative;top:-2px}.icon-linkedin:before{content:"\e60d";position:relative;top:-2px}.icon-twitter:before{content:"\e600"}.icon-weibo:before{content:"\e602";position:relative;top:2px}.icon-stack-overflow:before{content:"\e902";font-size:.85em;position:relative;top:-4px}.icon-email:before{content:"\e605";position:relative;top:-2px}.icon-facebook:before{content:"\e601";font-size:.95em;position:relative;top:-2px}.icon-gitlab:before{content:"\e901";font-size:.9em;position:relative;top:-4px}.icon-github:before{content:"\e606";position:relative;top:-1px}.icon-rss:before{content:"\e604"}.icon-google:before{content:"\e609";position:relative;top:2px}.icon-zhihu:before{content:"\e607";font-size:.9em}.icon-pocket:before{content:"\e856";position:relative;top:2px}.icon-heart:before{content:"\e608"}.icon-right:before{content:"\e60a"}.icon-left:before{content:"\e60b"}.icon-up:before{content:"\e60c"}.icon-close:before{content:"\e60f"}.icon-link:before{content:"\e909"}.header{padding:20px}.header:before,.header:after{content:" ";display:table}.header:after{clear:both}.header .logo-wrapper{float:left}.header .logo-wrapper .logo{font-size:48px;font-family:chancery,cursive,LiSu,sans-serif}@media screen and (max-width:800px){.header .logo-wrapper{display:none}}.header .site-navbar{float:right}.header .site-navbar .menu{display:inline-block;position:relative;padding-left:0;padding-right:25px;font-family:Athelas,STHeiti,Microsoft Yahei,serif}.header .site-navbar .menu .menu-item{display:inline-block;display:inline-block;vertical-align:middle;transform:translateZ(0);backface-visibility:hidden;box-shadow:0 0 1px transparent;position:relative;overflow:hidden}.header .site-navbar .menu .menu-item+.menu-item{margin-left:10px}.header .site-navbar .menu .menu-item:before{content:'';position:absolute;z-index:-1;height:2px;bottom:0;left:51%;right:51%;background:#c05b4d;transition-duration:.2s;transition-property:right,left;transition-timing-function:ease-out}.header .site-navbar .menu .menu-item.active:before,.header .site-navbar .menu .menu-item:active:before,.header .site-navbar .menu .menu-item:focus:before,.header .site-navbar .menu .menu-item:hover:before{right:0;left:0}.header .site-navbar .menu .menu-item-link{font-size:18px}@media screen and (max-width:800px){.header .site-navbar{display:none}}@media screen and (max-width:800px){.header{padding:50px 0 0;text-align:center}}.posts{margin-bottom:20px;border-bottom:1px solid #e6e6e6}.post{padding:1.5em 0}.post+.post{border-top:1px solid #e6e6e6}.post .post-header{margin-bottom:20px}.post .post-header .post-title{margin:0;font-size:27px;font-weight:400;font-family:Athelas,STHeiti,Microsoft Yahei,serif}.post .post-header .post-link{display:inline-block;vertical-align:middle;transform:translateZ(0);backface-visibility:hidden;box-shadow:0 0 1px transparent;position:relative;overflow:hidden}.post .post-header .post-link:before{content:'';position:absolute;z-index:-1;height:2px;bottom:0;left:51%;right:51%;background:#c05b4d;transition-duration:.2s;transition-property:right,left;transition-timing-function:ease-out}.post .post-header .post-link.active:before,.post .post-header .post-link:active:before,.post .post-header .post-link:focus:before,.post .post-header .post-link:hover:before{right:0;left:0}.post .post-header .post-meta{font-size:14px;color:#8a8a8a}.post .post-header .post-meta .post-time{font-size:15px}.post .post-header .post-meta .post-category{display:inline}.post .post-header .post-meta .post-category a{color:inherit}.post .post-header .post-meta .post-category a::before{content:'·'}.post .post-header .post-meta .post-category a:hover{color:#c05b4d}.post .post-header .post-meta .more-meta::before{content:'·'}.post .post-toc{position:absolute;width:200px;margin-left:785px;padding:10px;font-family:Athelas,STHeiti,Microsoft Yahei,serif;border-radius:5px;background:rgba(248,245,236,.6);box-shadow:1px 1px 2px rgba(0,0,0,.125);word-wrap:break-word;box-sizing:border-box}.post .post-toc .post-toc-title{margin:0 10px;font-size:20px;font-weight:400;text-transform:uppercase}.post .post-toc .post-toc-content{font-size:15px}.post .post-toc .post-toc-content.always-active ul{display:block}.post .post-toc .post-toc-content>nav>ul{margin:10px 0}.post .post-toc .post-toc-content ul{padding-left:20px;list-style:square}.post .post-toc .post-toc-content ul ul{padding-left:15px;display:none}.post .post-toc .post-toc-content ul .has-active>ul{display:block}.post .post-toc .post-toc-content .toc-link.active{color:#c05b4d}@media screen and (max-width:1185px){.post .post-toc{display:none}}.post .post-content{word-wrap:break-word}.post .post-content h1{font-weight:400;font-family:Athelas,STHeiti,Microsoft Yahei,serif}.post .post-content h1 .anchor{float:left;line-height:1;margin-left:-20px;padding-right:4px}.post .post-content h1 .anchor:hover{border-bottom:initial}.post .post-content h1 .anchor .icon-link{visibility:hidden;font-size:16px}.post .post-content h1 .anchor .icon-link:before{vertical-align:middle}.post .post-content h1:hover .icon-link{visibility:visible}.post .post-content h2{font-weight:400;font-family:Athelas,STHeiti,Microsoft Yahei,serif}.post .post-content h2 .anchor{float:left;line-height:1;margin-left:-20px;padding-right:4px}.post .post-content h2 .anchor:hover{border-bottom:initial}.post .post-content h2 .anchor .icon-link{visibility:hidden;font-size:16px}.post .post-content h2 .anchor .icon-link:before{vertical-align:middle}.post .post-content h2:hover .icon-link{visibility:visible}.post .post-content h3{font-weight:400;font-family:Athelas,STHeiti,Microsoft Yahei,serif}.post .post-content h3 .anchor{float:left;line-height:1;margin-left:-20px;padding-right:4px}.post .post-content h3 .anchor:hover{border-bottom:initial}.post .post-content h3 .anchor .icon-link{visibility:hidden;font-size:16px}.post .post-content h3 .anchor .icon-link:before{vertical-align:middle}.post .post-content h3:hover .icon-link{visibility:visible}.post .post-content h4{font-weight:400;font-family:Athelas,STHeiti,Microsoft Yahei,serif}.post .post-content h4 .anchor{float:left;line-height:1;margin-left:-20px;padding-right:4px}.post .post-content h4 .anchor:hover{border-bottom:initial}.post .post-content h4 .anchor .icon-link{visibility:hidden;font-size:16px}.post .post-content h4 .anchor .icon-link:before{vertical-align:middle}.post .post-content h4:hover .icon-link{visibility:visible}.post .post-content h5{font-weight:400;font-family:Athelas,STHeiti,Microsoft Yahei,serif}.post .post-content h5 .anchor{float:left;line-height:1;margin-left:-20px;padding-right:4px}.post .post-content h5 .anchor:hover{border-bottom:initial}.post .post-content h5 .anchor .icon-link{visibility:hidden;font-size:16px}.post .post-content h5 .anchor .icon-link:before{vertical-align:middle}.post .post-content h5:hover .icon-link{visibility:visible}.post .post-content h6{font-weight:400;font-family:Athelas,STHeiti,Microsoft Yahei,serif}.post .post-content h6 .anchor{float:left;line-height:1;margin-left:-20px;padding-right:4px}.post .post-content h6 .anchor:hover{border-bottom:initial}.post .post-content h6 .anchor .icon-link{visibility:hidden;font-size:16px}.post .post-content h6 .anchor .icon-link:before{vertical-align:middle}.post .post-content h6:hover .icon-link{visibility:visible}.post .post-content a{color:#c05b4d;word-break:break-all}.post .post-content a:hover{border-bottom:1px solid #c05b4d}.post .post-content blockquote{margin:2em 0;padding:10px 20px;position:relative;color:rgba(52,73,94,.8);background-color:rgba(192,91,77,.05);border-left:3px solid rgba(192,91,77,.3);box-shadow:1px 1px 2px rgba(0,0,0,.125)}.post .post-content blockquote p{margin:0}.post .post-content img{display:inline-block;max-width:100%}.post .post-content .table-wrapper{overflow-x:auto}.post .post-content .table-wrapper>table{max-width:100%;margin:10px 0;border-spacing:0;box-shadow:2px 2px 3px rgba(0,0,0,.125)}.post .post-content .table-wrapper>table thead{background:#f8f5ec}.post .post-content .table-wrapper>table th,.post .post-content .table-wrapper>table td{padding:5px 15px;border:1px double #f4efe1}.post .post-content .table-wrapper>table tr:hover{background-color:#f8f5ec}.post .post-content code,.post .post-content pre{padding:7px;font-size:.9em;font-family:Consolas,Monaco,Menlo,dejavu sans mono,bitstream vera sans mono,courier new,monospace;background:#f8f5ec}.post .post-content code{padding:3px 5px;border-radius:4px;color:#c7254e}.post .post-content figure.highlight{margin:1em 0;border-radius:5px;overflow-x:auto;box-shadow:1px 1px 2px rgba(0,0,0,.125);position:relative}.post .post-content figure.highlight table{position:relative}.post .post-content figure.highlight table::after{position:absolute;top:0;right:0;left:0;padding:2px 7px;font-size:.9em;font-weight:700;color:#b1b1b1;background:#f4efe1;content:'Code'}.post .post-content figure.highlight.language-bash>table::after{content:"Bash"}.post .post-content figure.highlight.language-c>table::after{content:"C"}.post .post-content figure.highlight.language-cs>table::after{content:"C#"}.post .post-content figure.highlight.language-cpp>table::after{content:"C++"}.post .post-content figure.highlight.language-css>table::after{content:"CSS"}.post .post-content figure.highlight.language-coffeescript>table::after{content:"CoffeeScript"}.post .post-content figure.highlight.language-html>table::after{content:"HTML"}.post .post-content figure.highlight.language-xml>table::after{content:"XML"}.post .post-content figure.highlight.language-http>table::after{content:"HTTP"}.post .post-content figure.highlight.language-json>table::after{content:"JSON"}.post .post-content figure.highlight.language-java>table::after{content:"Java"}.post .post-content figure.highlight.language-js>table::after{content:"JavaScript"}.post .post-content figure.highlight.language-javascript>table::after{content:"JavaScript"}.post .post-content figure.highlight.language-makefile>table::after{content:"Makefile"}.post .post-content figure.highlight.language-markdown>table::after{content:"Markdown"}.post .post-content figure.highlight.language-objectivec>table::after{content:"Objective-C"}.post .post-content figure.highlight.language-php>table::after{content:"PHP"}.post .post-content figure.highlight.language-perl>table::after{content:"Perl"}.post .post-content figure.highlight.language-python>table::after{content:"Python"}.post .post-content figure.highlight.language-ruby>table::after{content:"Ruby"}.post .post-content figure.highlight.language-sql>table::after{content:"SQL"}.post .post-content figure.highlight.language-shell>table::after{content:"Shell"}.post .post-content figure.highlight.language-erlang>table::after{content:"Erlang"}.post .post-content figure.highlight.language-go>table::after{content:"Go"}.post .post-content figure.highlight.language-go-html-template>table::after{content:"Go HTML Template"}.post .post-content figure.highlight.language-groovy>table::after{content:"Groovy"}.post .post-content figure.highlight.language-haskell>table::after{content:"Haskell"}.post .post-content figure.highlight.language-kotlin>table::after{content:"Kotlin"}.post .post-content figure.highlight.language-clojure>table::after{content:"Clojure"}.post .post-content figure.highlight.language-less>table::after{content:"Less"}.post .post-content figure.highlight.language-lisp>table::after{content:"Lisp"}.post .post-content figure.highlight.language-lua>table::after{content:"Lua"}.post .post-content figure.highlight.language-matlab>table::after{content:"Matlab"}.post .post-content figure.highlight.language-rust>table::after{content:"Rust"}.post .post-content figure.highlight.language-scss>table::after{content:"Scss"}.post .post-content figure.highlight.language-scala>table::after{content:"Scala"}.post .post-content figure.highlight.language-swift>table::after{content:"Swift"}.post .post-content figure.highlight.language-typescript>table::after{content:"TypeScript"}.post .post-content figure.highlight.language-yml>table::after{content:"YAML"}.post .post-content figure.highlight.language-yaml>table::after{content:"YAML"}.post .post-content figure.highlight.language-toml>table::after{content:"TOML"}.post .post-content figure.highlight.language-diff>table::after{content:"Diff"}.post .post-content figure.highlight .code pre{margin:0;padding:30px 10px 10px}.post .post-content figure.highlight .gutter{width:10px;color:#cacaca}.post .post-content figure.highlight .gutter pre{margin:0;padding:30px 7px 10px}.post .post-content figure.highlight .line{height:1em}.post .post-content figure.highlight table,.post .post-content figure.highlight tr,.post .post-content figure.highlight td{margin:0;padding:0;width:100%;border-collapse:collapse}.post .post-content figure.highlight .code .hljs-comment,.post .post-content figure.highlight .code .hljs-quote{color:#93a1a1}.post .post-content figure.highlight .code .hljs-keyword,.post .post-content figure.highlight .code .hljs-selector-tag,.post .post-content figure.highlight .code .hljs-addition{color:#859900}.post .post-content figure.highlight .code .hljs-number,.post .post-content figure.highlight .code .hljs-string,.post .post-content figure.highlight .code .hljs-meta .hljs-meta-string,.post .post-content figure.highlight .code .hljs-literal,.post .post-content figure.highlight .code .hljs-doctag,.post .post-content figure.highlight .code .hljs-regexp{color:#2aa198}.post .post-content figure.highlight .code .hljs-title,.post .post-content figure.highlight .code .hljs-section,.post .post-content figure.highlight .code .hljs-name,.post .post-content figure.highlight .code .hljs-selector-id,.post .post-content figure.highlight .code .hljs-selector-class{color:#268bd2}.post .post-content figure.highlight .code .hljs-attribute,.post .post-content figure.highlight .code .hljs-attr,.post .post-content figure.highlight .code .hljs-variable,.post .post-content figure.highlight .code .hljs-template-variable,.post .post-content figure.highlight .code .hljs-class .hljs-title,.post .post-content figure.highlight .code .hljs-type{color:#b58900}.post .post-content figure.highlight .code .hljs-symbol,.post .post-content figure.highlight .code .hljs-bullet,.post .post-content figure.highlight .code .hljs-subst,.post .post-content figure.highlight .code .hljs-meta,.post .post-content figure.highlight .code .hljs-meta .hljs-keyword,.post .post-content figure.highlight .code .hljs-selector-attr,.post .post-content figure.highlight .code .hljs-selector-pseudo,.post .post-content figure.highlight .code .hljs-link{color:#cb4b16}.post .post-content figure.highlight .code .hljs-built_in,.post .post-content figure.highlight .code .hljs-deletion{color:#dc322f}.post .post-content figure.highlight .code .hljs-formula{background:#eee8d5}.post .post-content figure.highlight .code .hljs-emphasis{font-style:italic}.post .post-content figure.highlight .code .hljs-strong{font-weight:700}.post .post-content .highlight>.chroma{margin:1em 0;border-radius:5px;overflow-x:auto;box-shadow:1px 1px 2px rgba(0,0,0,.125);position:relative;background:#f8f5ec}.post .post-content .highlight>.chroma code{padding:0}.post .post-content .highlight>.chroma table{position:relative}.post .post-content .highlight>.chroma table::after{position:absolute;top:0;right:0;left:0;padding:2px 7px;font-size:.9em;font-weight:700;color:#b1b1b1;background:#f4efe1;content:'Code'}.post .post-content .highlight>.chroma.language-bash>table::after{content:"Bash"}.post .post-content .highlight>.chroma.language-c>table::after{content:"C"}.post .post-content .highlight>.chroma.language-cs>table::after{content:"C#"}.post .post-content .highlight>.chroma.language-cpp>table::after{content:"C++"}.post .post-content .highlight>.chroma.language-css>table::after{content:"CSS"}.post .post-content .highlight>.chroma.language-coffeescript>table::after{content:"CoffeeScript"}.post .post-content .highlight>.chroma.language-html>table::after{content:"HTML"}.post .post-content .highlight>.chroma.language-xml>table::after{content:"XML"}.post .post-content .highlight>.chroma.language-http>table::after{content:"HTTP"}.post .post-content .highlight>.chroma.language-json>table::after{content:"JSON"}.post .post-content .highlight>.chroma.language-java>table::after{content:"Java"}.post .post-content .highlight>.chroma.language-js>table::after{content:"JavaScript"}.post .post-content .highlight>.chroma.language-javascript>table::after{content:"JavaScript"}.post .post-content .highlight>.chroma.language-makefile>table::after{content:"Makefile"}.post .post-content .highlight>.chroma.language-markdown>table::after{content:"Markdown"}.post .post-content .highlight>.chroma.language-objectivec>table::after{content:"Objective-C"}.post .post-content .highlight>.chroma.language-php>table::after{content:"PHP"}.post .post-content .highlight>.chroma.language-perl>table::after{content:"Perl"}.post .post-content .highlight>.chroma.language-python>table::after{content:"Python"}.post .post-content .highlight>.chroma.language-ruby>table::after{content:"Ruby"}.post .post-content .highlight>.chroma.language-sql>table::after{content:"SQL"}.post .post-content .highlight>.chroma.language-shell>table::after{content:"Shell"}.post .post-content .highlight>.chroma.language-erlang>table::after{content:"Erlang"}.post .post-content .highlight>.chroma.language-go>table::after{content:"Go"}.post .post-content .highlight>.chroma.language-go-html-template>table::after{content:"Go HTML Template"}.post .post-content .highlight>.chroma.language-groovy>table::after{content:"Groovy"}.post .post-content .highlight>.chroma.language-haskell>table::after{content:"Haskell"}.post .post-content .highlight>.chroma.language-kotlin>table::after{content:"Kotlin"}.post .post-content .highlight>.chroma.language-clojure>table::after{content:"Clojure"}.post .post-content .highlight>.chroma.language-less>table::after{content:"Less"}.post .post-content .highlight>.chroma.language-lisp>table::after{content:"Lisp"}.post .post-content .highlight>.chroma.language-lua>table::after{content:"Lua"}.post .post-content .highlight>.chroma.language-matlab>table::after{content:"Matlab"}.post .post-content .highlight>.chroma.language-rust>table::after{content:"Rust"}.post .post-content .highlight>.chroma.language-scss>table::after{content:"Scss"}.post .post-content .highlight>.chroma.language-scala>table::after{content:"Scala"}.post .post-content .highlight>.chroma.language-swift>table::after{content:"Swift"}.post .post-content .highlight>.chroma.language-typescript>table::after{content:"TypeScript"}.post .post-content .highlight>.chroma.language-yml>table::after{content:"YAML"}.post .post-content .highlight>.chroma.language-yaml>table::after{content:"YAML"}.post .post-content .highlight>.chroma.language-toml>table::after{content:"TOML"}.post .post-content .highlight>.chroma.language-diff>table::after{content:"Diff"}.post .post-content .highlight>.chroma .lntd{line-height:1em}.post .post-content .highlight>.chroma .lntd:first-child{width:10px}.post .post-content .highlight>.chroma .lntd:first-child pre{margin:0;padding:30px 7px 10px}.post .post-content .highlight>.chroma .lntd:last-child{vertical-align:top}.post .post-content .highlight>.chroma .lntd:last-child pre{margin:0;padding:30px 10px 10px}.post .post-content .highlight>.chroma table,.post .post-content .highlight>.chroma tr,.post .post-content .highlight>.chroma td{margin:0;padding:0;width:100%;border-collapse:collapse}.post .post-content .highlight>.chroma .lnt{color:#cacaca}.post .post-content .highlight>.chroma .hl{display:block;width:100%;background-color:#ffc}.post .post-content .highlight>.chroma .k{color:#859900}.post .post-content .highlight>.chroma .kc{color:#859900;font-weight:700}.post .post-content .highlight>.chroma .kd{color:#859900}.post .post-content .highlight>.chroma .kn{color:#dc322f;font-weight:700}.post .post-content .highlight>.chroma .kp{color:#859900}.post .post-content .highlight>.chroma .kr{color:#859900}.post .post-content .highlight>.chroma .kt{color:#859900;font-weight:700}.post .post-content .highlight>.chroma .n{color:#268bd2}.post .post-content .highlight>.chroma .na{color:#268bd2}.post .post-content .highlight>.chroma .nb{color:#cb4b16}.post .post-content .highlight>.chroma .bp{color:#268bd2}.post .post-content .highlight>.chroma .nc{color:#cb4b16}.post .post-content .highlight>.chroma .no{color:#268bd2}.post .post-content .highlight>.chroma .nd{color:#268bd2}.post .post-content .highlight>.chroma .ni{color:#268bd2}.post .post-content .highlight>.chroma .ne{color:#268bd2}.post .post-content .highlight>.chroma .nf{color:#268bd2}.post .post-content .highlight>.chroma .fm{color:#268bd2}.post .post-content .highlight>.chroma .nl{color:#268bd2}.post .post-content .highlight>.chroma .nn{color:#268bd2}.post .post-content .highlight>.chroma .nx{color:#268bd2}.post .post-content .highlight>.chroma .py{color:#268bd2}.post .post-content .highlight>.chroma .nt{color:#268bd2;font-weight:700}.post .post-content .highlight>.chroma .nv{color:#268bd2}.post .post-content .highlight>.chroma .vc{color:#268bd2}.post .post-content .highlight>.chroma .vg{color:#268bd2}.post .post-content .highlight>.chroma .vi{color:#268bd2}.post .post-content .highlight>.chroma .vm{color:#268bd2}.post .post-content .highlight>.chroma .l{color:#2aa198}.post .post-content .highlight>.chroma .ld{color:#2aa198}.post .post-content .highlight>.chroma .s{color:#2aa198}.post .post-content .highlight>.chroma .sa{color:#2aa198}.post .post-content .highlight>.chroma .sb{color:#2aa198}.post .post-content .highlight>.chroma .sc{color:#2aa198}.post .post-content .highlight>.chroma .dl{color:#2aa198}.post .post-content .highlight>.chroma .sd{color:#2aa198}.post .post-content .highlight>.chroma .s2{color:#2aa198}.post .post-content .highlight>.chroma .se{color:#2aa198}.post .post-content .highlight>.chroma .sh{color:#2aa198}.post .post-content .highlight>.chroma .si{color:#2aa198}.post .post-content .highlight>.chroma .sx{color:#2aa198}.post .post-content .highlight>.chroma .sr{color:#2aa198}.post .post-content .highlight>.chroma .s1{color:#2aa198}.post .post-content .highlight>.chroma .ss{color:#2aa198}.post .post-content .highlight>.chroma .m{color:#2aa198;font-weight:700}.post .post-content .highlight>.chroma .mb{color:#2aa198;font-weight:700}.post .post-content .highlight>.chroma .mf{color:#2aa198;font-weight:700}.post .post-content .highlight>.chroma .mh{color:#2aa198;font-weight:700}.post .post-content .highlight>.chroma .mi{color:#2aa198;font-weight:700}.post .post-content .highlight>.chroma .il{color:#2aa198;font-weight:700}.post .post-content .highlight>.chroma .mo{color:#2aa198;font-weight:700}.post .post-content .highlight>.chroma .ow{color:#859900}.post .post-content .highlight>.chroma .c{color:#93a1a1;font-style:italic}.post .post-content .highlight>.chroma .ch{color:#93a1a1;font-style:italic}.post .post-content .highlight>.chroma .cm{color:#93a1a1;font-style:italic}.post .post-content .highlight>.chroma .c1{color:#93a1a1;font-style:italic}.post .post-content .highlight>.chroma .cs{color:#93a1a1;font-style:italic}.post .post-content .highlight>.chroma .cp{color:#93a1a1;font-style:italic}.post .post-content .highlight>.chroma .cpf{color:#93a1a1;font-style:italic}.post .post-content .highlight>.chroma .g{color:#d33682}.post .post-content .highlight>.chroma .gd{color:#b58900}.post .post-content .highlight>.chroma .ge{color:#d33682}.post .post-content .highlight>.chroma .gr{color:#d33682}.post .post-content .highlight>.chroma .gh{color:#d33682}.post .post-content .highlight>.chroma .gi{color:#859900}.post .post-content .highlight>.chroma .go{color:#d33682}.post .post-content .highlight>.chroma .gp{color:#d33682}.post .post-content .highlight>.chroma .gs{color:#d33682}.post .post-content .highlight>.chroma .gu{color:#d33682}.post .post-content .highlight>.chroma .gt{color:#d33682}.post .post-content .post-summary{margin-bottom:1em}.post .post-content .read-more .read-more-link{color:#c05b4d;font-size:1.1em;font-family:Athelas,STHeiti,Microsoft Yahei,serif}.post .post-content .read-more .read-more-link:hover{border-bottom:1px solid #c05b4d}.post .post-content kbd{display:inline-block;padding:.25em;background-color:#fafafa;border:1px solid #dbdbdb;border-bottom-color:#b5b5b5;border-radius:3px;box-shadow:inset 0 -1px 0 #b5b5b5;font-size:.8em;line-height:1.25;font-family:sfmono-regular,liberation mono,roboto mono,Menlo,Monaco,Consolas,courier new,Courier,monospace;color:#4a4a4a}.post .post-content dl dt::after{content:':'}.post .post-content figure.center{text-align:center}.post .post-content figure.right{text-align:right}.post .post-content figure.left{text-align:left}.post .post-content figure figcaption h4{color:#b5b5b5;font-size:.9rem}.post .post-content hr{margin:1rem 0;position:relative;border-top:2px dashed #c05b4d;border-bottom:none}.post .post-content .footnote-ref>a{font-weight:700;margin-left:3px}.post .post-content .footnote-ref>a:before{content:"["}.post .post-content .footnote-ref>a:after{content:"]"}.post .post-content .task-list{list-style:none;padding-left:1.5rem}.post .post-content .align-center{text-align:center}.post .post-content .align-right{text-align:right}.post .post-content .align-left{text-align:left}.post .post-content .MJXc-display{overflow-x:auto;overflow-y:hidden;padding-right:1px}.post .post-copyright{margin-top:20px;padding-top:10px;border-top:1px dashed #e6e6e6}.post .post-copyright .copyright-item{margin:5px 0}.post .post-copyright .copyright-item a{color:#c05b4d;word-wrap:break-word}.post .post-copyright .copyright-item a:hover{border-bottom:1px solid #c05b4d}.post .post-copyright .copyright-item .item-title{display:inline-block;min-width:5rem;margin-right:.5rem;text-align:right}.post .post-copyright .copyright-item .item-title:after{content:" :"}.post .post-footer{margin-top:20px;border-top:1px solid #e6e6e6;font-family:Athelas,STHeiti,Microsoft Yahei,serif}.post .post-footer .post-tags{padding:15px 0}.post .post-footer .post-tags a{margin-right:5px;color:#c05b4d;word-break:break-all}.post .post-footer .post-tags a::before{content:'#'}.post .post-footer .post-nav{margin:1em 0}.post .post-footer .post-nav:before,.post .post-footer .post-nav:after{content:" ";display:table}.post .post-footer .post-nav:after{clear:both}.post .post-footer .post-nav .prev,.post .post-footer .post-nav .next{font-weight:600;font-size:18px;font-family:Athelas,STHeiti,Microsoft Yahei,serif;transition-property:transform;transition-timing-function:ease-out;transition-duration:.3s}.post .post-footer .post-nav .prev{float:left}.post .post-footer .post-nav .prev:hover{color:#c05b4d;transform:translateX(-4px)}.post .post-footer .post-nav .next{float:right}.post .post-footer .post-nav .next:hover{color:#c05b4d;transform:translateX(4px)}.post .post-footer .post-nav .nav-mobile{display:none}@media screen and (max-width:800px){.post .post-footer .post-nav .nav-default{display:none}.post .post-footer .post-nav .nav-mobile{display:inline}}.pagination{margin:2em 0}.pagination:before,.pagination:after{content:" ";display:table}.pagination:after{clear:both}.pagination .prev,.pagination .next{font-weight:600;font-size:20px;font-family:Athelas,STHeiti,Microsoft Yahei,serif;transition-property:transform;transition-timing-function:ease-out;transition-duration:.3s}.pagination .prev{float:left}.pagination .prev:hover{color:#c05b4d;transform:translateX(-4px)}.pagination .next{float:right}.pagination .next:hover{color:#c05b4d;transform:translateX(4px)}.footer{margin-top:2em}.footer .social-links{text-align:center}.footer .social-links .iconfont{font-size:30px}.footer .social-links .iconfont+.iconfont{margin-left:10px}.footer .social-links .iconfont:hover{color:#c05b4d}.footer .copyright{margin:10px 0;color:#8a8a8a;text-align:center;font-family:Athelas,STHeiti,Microsoft Yahei,serif}.footer .copyright .hexo-link,.footer .copyright .theme-link{color:#c05b4d}.footer .copyright .copyright-year{display:block}.footer .copyright .copyright-year .heart{font-size:14px}.archive{margin:2em 0;max-width:550px}.archive .archive-title{font-family:Athelas,STHeiti,Microsoft Yahei,serif}.archive .archive-title.tag,.archive .archive-title.category{margin:15px 0}.archive .archive-title .archive-name{margin:0;display:inline-block;font-weight:400;font-size:30px;line-height:32px}.archive .archive-title .archive-post-counter{color:#8a8a8a}.archive .collection-title{font-family:Athelas,STHeiti,Microsoft Yahei,serif}.archive .collection-title .archive-year{margin:15px 0;font-weight:400;font-size:28px;line-height:30px}.archive .archive-post{padding:3px 20px;border-left:1px solid #cacaca}.archive .archive-post .archive-post-time{margin-right:10px;color:#8a8a8a}.archive .archive-post .archive-post-title .archive-post-link{color:#c05b4d}.archive .archive-post::first-child{margin-top:10px}.archive .archive-post:hover{border-left:3px solid #c05b4d;transition:.2s ease-out;transform:translateX(4px)}.archive .archive-post:hover .archive-post-time{color:#717171}.archive .archive-post:hover .archive-post-title .archive-post-link{color:#a14639}@media screen and (max-width:800px){.archive{margin-left:auto;margin-right:auto}.archive .archive-title .archive-name{font-size:26px}.archive .collection-title .archive-year{margin:10px 0;font-size:24px}.archive .archive-post{padding:5px 10px}.archive .archive-post .archive-post-time{font-size:13px;display:block}}.terms{margin:2em 0 3em;text-align:center;font-family:Athelas,STHeiti,Microsoft Yahei,serif}.terms .terms-title{display:inline-block;font-size:18px;color:#c05b4d;border-bottom:2px solid #c05b4d}.terms .terms-tags{margin:10px 0}.terms .terms-tags .terms-link{display:inline-block;position:relative;margin:5px 10px;word-wrap:break-word;transition-duration:.2s;transition-property:transform;transition-timing-function:ease-out}.terms .terms-tags .terms-link .terms-count{display:inline-block;position:relative;top:-8px;right:-2px;color:#c05b4d;font-size:12px}.terms .terms-tags .terms-link:active,.terms .terms-tags .terms-link:focus,.terms .terms-tags .terms-link:hover{color:#c05b4d;transform:scale(1.1)}.slideout-menu{position:fixed;top:0;left:0;bottom:0;width:180px;min-height:100vh;overflow-y:hidden;-webkit-overflow-scrolling:touch;z-index:0;display:none}.slideout-panel{position:relative;z-index:1;background-color:#fefefe;min-height:100vh}.slideout-open,.slideout-open body,.slideout-open .slideout-panel{overflow:hidden}.slideout-open .slideout-menu{display:block}.mobile-navbar{display:none;position:fixed;top:0;left:0;width:100%;height:50px;background:#fefefe;box-shadow:0 2px 2px #cacaca;text-align:center;transition:transform 300ms ease;z-index:99}.mobile-navbar.fixed-open{transform:translate3d(180px,0px,0px)}.mobile-navbar .mobile-header-logo{display:inline-block;margin-right:50px}.mobile-navbar .mobile-header-logo .logo{font-size:22px;line-height:50px;font-family:chancery,cursive,LiSu,sans-serif}.mobile-navbar .mobile-navbar-icon{color:#c05b4d;height:50px;width:50px;font-size:24px;text-align:center;float:left;position:relative;transition:background .5s}@keyframes clickfirst{0%{transform:translateY(6px)rotate(0deg)}100%{transform:translateY(0)rotate(45deg)}}@keyframes clickmid{0%{opacity:1}100%{opacity:0}}@keyframes clicklast{0%{transform:translateY(-6px)rotate(0deg)}100%{transform:translateY(0)rotate(-45deg)}}@keyframes outfirst{0%{transform:translateY(0)rotate(-45deg)}100%{transform:translateY(-6px)rotate(0deg)}}@keyframes outmid{0%{opacity:0}100%{opacity:1}}@keyframes outlast{0%{transform:translateY(0)rotate(45deg)}100%{transform:translateY(6px)rotate(0deg)}}.mobile-navbar .mobile-navbar-icon span{position:absolute;left:15px;top:25px;left:calc((100% - 20px)/2);top:calc((100% - 1px)/2);width:20px;height:1px;background-color:#c05b4d}.mobile-navbar .mobile-navbar-icon span:nth-child(1){transform:translateY(6px)rotate(0deg)}.mobile-navbar .mobile-navbar-icon span:nth-child(3){transform:translateY(-6px)rotate(0deg)}.mobile-navbar .mobile-navbar-icon.icon-click span:nth-child(1){animation-duration:.5s;animation-fill-mode:both;animation-name:clickfirst}.mobile-navbar .mobile-navbar-icon.icon-click span:nth-child(2){animation-duration:.2s;animation-fill-mode:both;animation-name:clickmid}.mobile-navbar .mobile-navbar-icon.icon-click span:nth-child(3){animation-duration:.5s;animation-fill-mode:both;animation-name:clicklast}.mobile-navbar .mobile-navbar-icon.icon-out span:nth-child(1){animation-duration:.5s;animation-fill-mode:both;animation-name:outfirst}.mobile-navbar .mobile-navbar-icon.icon-out span:nth-child(2){animation-duration:.2s;animation-fill-mode:both;animation-name:outmid}.mobile-navbar .mobile-navbar-icon.icon-out span:nth-child(3){animation-duration:.5s;animation-fill-mode:both;animation-name:outlast}.mobile-menu{background-color:rgba(248,245,236,.5)}.mobile-menu .mobile-menu-list{position:relative;list-style:none;margin-top:50px;padding:0;border-top:1px solid #f8f5ec}.mobile-menu .mobile-menu-list .mobile-menu-item{padding:10px 30px;border-bottom:1px solid #f8f5ec}.mobile-menu .mobile-menu-list a{font-size:18px;font-family:Athelas,STHeiti,Microsoft Yahei,serif}.mobile-menu .mobile-menu-list a:hover{color:#c05b4d}@media screen and (max-width:800px){.mobile-navbar{display:block}}.back-to-top{display:none;position:fixed;right:20px;bottom:20px;transition-property:transform;transition-timing-function:ease-out;transition-duration:.3s;z-index:10}.back-to-top:hover{transform:translateY(-5px)}@media screen and (max-width:800px){.back-to-top{display:none!important}}#search-results mark{background-color:#c05b4d}.not-found{text-align:center}.not-found .error-emoji{color:#363636;font-size:3rem}.not-found .error-text{color:#797979;font-size:1.25rem}.not-found .error-link{margin-top:2rem}.not-found .error-link a{color:#c05b4d} \ No newline at end of file diff --git a/public/sass/main.min.b66aec177f21b809a7d8b8a0de4454558b3f3cfcb28a151e820757f148c14a35.css b/public/sass/main.min.b66aec177f21b809a7d8b8a0de4454558b3f3cfcb28a151e820757f148c14a35.css new file mode 100644 index 0000000..656bc6f --- /dev/null +++ b/public/sass/main.min.b66aec177f21b809a7d8b8a0de4454558b3f3cfcb28a151e820757f148c14a35.css @@ -0,0 +1 @@ +@charset "UTF-8";@font-face{font-family:chancery;src:url(../fonts/chancery/apple-chancery-webfont.eot);src:local("Apple Chancery"),url(../fonts/chancery/apple-chancery-webfont.eot?#iefix)format("embedded-opentype"),url(../fonts/chancery/apple-chancery-webfont.woff2)format("woff2"),url(../fonts/chancery/apple-chancery-webfont.woff)format("woff"),url(../fonts/chancery/apple-chancery-webfont.ttf)format("truetype"),url(../fonts/chancery/apple-chancery-webfont.svg#apple-chancery)format("svg");font-weight:lighter;font-style:normal}.post .post-content a.reference-link{font-weight:700;font-style:italic;font-color:#34495e;color:#34495e}.post .post-content a.reference-link:hover{border-bottom-color:#c05b4d #f8f5ec}.post .post-content a.bibtex-entry:target{background-color:#ffa}/*!normalize.css v3.0.2 | MIT License | git.io/normalize*/html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{font-size:2em;margin:.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}html{font-size:16px;box-sizing:border-box}body{padding:0;margin:0;font-family:source sans pro,helvetica neue,Arial,sans-serif;font-weight:400;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;line-height:1.5;color:#34495e;background:#fefefe;scroll-behavior:smooth;border-top:3px solid #c05b4d}@media screen and (max-width:800px){body{border-top:0}}::selection{background:#c05b4d;color:#fff}img{max-width:100%;height:auto;display:inline-block;vertical-align:middle}a{color:#34495e;text-decoration:none}h1{font-size:26px;font-family:Athelas,STHeiti,Microsoft Yahei,serif}h2{font-size:24px;font-family:Athelas,STHeiti,Microsoft Yahei,serif}h3{font-size:20px;font-family:Athelas,STHeiti,Microsoft Yahei,serif}h4{font-size:16px;font-family:Athelas,STHeiti,Microsoft Yahei,serif}h5{font-size:14px;font-family:Athelas,STHeiti,Microsoft Yahei,serif}h6{font-size:14px;font-family:Athelas,STHeiti,Microsoft Yahei,serif}.container{margin:0 auto;width:800px}@media screen and (max-width:800px){.container{width:100%;box-shadow:-1px -5px 5px #cacaca}}.content-wrapper{padding:0 20px}.video-container{position:relative;padding-bottom:56.25%;padding-top:25px;height:0}.video-container iframe{position:absolute;top:0;left:0;width:100%;height:100%}@font-face{font-family:iconfont;src:url(../fonts/iconfont/iconfont.eot);src:url(../fonts/iconfont/iconfont.eot#iefix)format("embedded-opentype"),url(../fonts/iconfont/iconfont.woff)format("woff"),url(../fonts/iconfont/iconfont.ttf)format("truetype"),url(../fonts/iconfont/iconfont.svg#iconfont)format("svg")}.iconfont{font-family:iconfont!important;speak:none;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-text-stroke-width:.2px;cursor:pointer;letter-spacing:0;font-feature-settings:"liga";font-variant-ligatures:discretionary-ligatures;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.icon-bilibili:before{content:"\e900";font-size:.9em;position:relative;top:-4px}.icon-instagram:before{font-size:.95em;content:"\e611";position:relative;top:1px}.icon-douban:before{content:"\e610";position:relative;top:2px}.icon-tumblr:before{content:"\e69f";font-size:.85em;position:relative;top:-2px}.icon-linkedin:before{content:"\e60d";position:relative;top:-2px}.icon-twitter:before{content:"\e600"}.icon-weibo:before{content:"\e602";position:relative;top:2px}.icon-stack-overflow:before{content:"\e902";font-size:.85em;position:relative;top:-4px}.icon-email:before{content:"\e605";position:relative;top:-2px}.icon-facebook:before{content:"\e601";font-size:.95em;position:relative;top:-2px}.icon-gitlab:before{content:"\e901";font-size:.9em;position:relative;top:-4px}.icon-github:before{content:"\e606";position:relative;top:-1px}.icon-rss:before{content:"\e604"}.icon-google:before{content:"\e609";position:relative;top:2px}.icon-zhihu:before{content:"\e607";font-size:.9em}.icon-pocket:before{content:"\e856";position:relative;top:2px}.icon-heart:before{content:"\e608"}.icon-right:before{content:"\e60a"}.icon-left:before{content:"\e60b"}.icon-up:before{content:"\e60c"}.icon-close:before{content:"\e60f"}.icon-link:before{content:"\e909"}.header{padding:20px}.header:before,.header:after{content:" ";display:table}.header:after{clear:both}.header .logo-wrapper{float:left}.header .logo-wrapper .logo{font-size:48px;font-family:chancery,cursive,LiSu,sans-serif}@media screen and (max-width:800px){.header .logo-wrapper{display:none}}.header .site-navbar{float:right}.header .site-navbar .menu{display:inline-block;position:relative;padding-left:0;padding-right:25px;font-family:Athelas,STHeiti,Microsoft Yahei,serif}.header .site-navbar .menu .menu-item{display:inline-block;display:inline-block;vertical-align:middle;transform:translateZ(0);backface-visibility:hidden;box-shadow:0 0 1px transparent;position:relative;overflow:hidden}.header .site-navbar .menu .menu-item+.menu-item{margin-left:10px}.header .site-navbar .menu .menu-item:before{content:'';position:absolute;z-index:-1;height:2px;bottom:0;left:51%;right:51%;background:#c05b4d;transition-duration:.2s;transition-property:right,left;transition-timing-function:ease-out}.header .site-navbar .menu .menu-item.active:before,.header .site-navbar .menu .menu-item:active:before,.header .site-navbar .menu .menu-item:focus:before,.header .site-navbar .menu .menu-item:hover:before{right:0;left:0}.header .site-navbar .menu .menu-item-link{font-size:18px}@media screen and (max-width:800px){.header .site-navbar{display:none}}@media screen and (max-width:800px){.header{padding:50px 0 0;text-align:center}}.posts{margin-bottom:20px;border-bottom:1px solid #e6e6e6}.post{padding:1.5em 0}.post+.post{border-top:1px solid #e6e6e6}.post .post-header{margin-bottom:20px}.post .post-header .post-title{margin:0;font-size:27px;font-weight:400;font-family:Athelas,STHeiti,Microsoft Yahei,serif}.post .post-header .post-link{display:inline-block;vertical-align:middle;transform:translateZ(0);backface-visibility:hidden;box-shadow:0 0 1px transparent;position:relative;overflow:hidden}.post .post-header .post-link:before{content:'';position:absolute;z-index:-1;height:2px;bottom:0;left:51%;right:51%;background:#c05b4d;transition-duration:.2s;transition-property:right,left;transition-timing-function:ease-out}.post .post-header .post-link.active:before,.post .post-header .post-link:active:before,.post .post-header .post-link:focus:before,.post .post-header .post-link:hover:before{right:0;left:0}.post .post-header .post-meta{font-size:14px;color:#8a8a8a}.post .post-header .post-meta .post-time{font-size:15px}.post .post-header .post-meta .post-category{display:inline}.post .post-header .post-meta .post-category a{color:inherit}.post .post-header .post-meta .post-category a::before{content:'·'}.post .post-header .post-meta .post-category a:hover{color:#c05b4d}.post .post-header .post-meta .more-meta::before{content:'·'}.post .post-toc{position:absolute;width:200px;margin-left:785px;padding:10px;font-family:Athelas,STHeiti,Microsoft Yahei,serif;border-radius:5px;background:rgba(248,245,236,.6);box-shadow:1px 1px 2px rgba(0,0,0,.125);word-wrap:break-word;box-sizing:border-box}.post .post-toc .post-toc-title{margin:0 10px;font-size:20px;font-weight:400;text-transform:uppercase}.post .post-toc .post-toc-content{font-size:15px}.post .post-toc .post-toc-content.always-active ul{display:block}.post .post-toc .post-toc-content>nav>ul{margin:10px 0}.post .post-toc .post-toc-content ul{padding-left:20px;list-style:square}.post .post-toc .post-toc-content ul ul{padding-left:15px;display:none}.post .post-toc .post-toc-content ul .has-active>ul{display:block}.post .post-toc .post-toc-content .toc-link.active{color:#c05b4d}@media screen and (max-width:1185px){.post .post-toc{display:none}}.post .post-content{word-wrap:break-word}.post .post-content h1{font-weight:400;font-family:Athelas,STHeiti,Microsoft Yahei,serif}.post .post-content h1 .anchor{float:left;line-height:1;margin-left:-20px;padding-right:4px}.post .post-content h1 .anchor:hover{border-bottom:initial}.post .post-content h1 .anchor .icon-link{visibility:hidden;font-size:16px}.post .post-content h1 .anchor .icon-link:before{vertical-align:middle}.post .post-content h1:hover .icon-link{visibility:visible}.post .post-content h2{font-weight:400;font-family:Athelas,STHeiti,Microsoft Yahei,serif}.post .post-content h2 .anchor{float:left;line-height:1;margin-left:-20px;padding-right:4px}.post .post-content h2 .anchor:hover{border-bottom:initial}.post .post-content h2 .anchor .icon-link{visibility:hidden;font-size:16px}.post .post-content h2 .anchor .icon-link:before{vertical-align:middle}.post .post-content h2:hover .icon-link{visibility:visible}.post .post-content h3{font-weight:400;font-family:Athelas,STHeiti,Microsoft Yahei,serif}.post .post-content h3 .anchor{float:left;line-height:1;margin-left:-20px;padding-right:4px}.post .post-content h3 .anchor:hover{border-bottom:initial}.post .post-content h3 .anchor .icon-link{visibility:hidden;font-size:16px}.post .post-content h3 .anchor .icon-link:before{vertical-align:middle}.post .post-content h3:hover .icon-link{visibility:visible}.post .post-content h4{font-weight:400;font-family:Athelas,STHeiti,Microsoft Yahei,serif}.post .post-content h4 .anchor{float:left;line-height:1;margin-left:-20px;padding-right:4px}.post .post-content h4 .anchor:hover{border-bottom:initial}.post .post-content h4 .anchor .icon-link{visibility:hidden;font-size:16px}.post .post-content h4 .anchor .icon-link:before{vertical-align:middle}.post .post-content h4:hover .icon-link{visibility:visible}.post .post-content h5{font-weight:400;font-family:Athelas,STHeiti,Microsoft Yahei,serif}.post .post-content h5 .anchor{float:left;line-height:1;margin-left:-20px;padding-right:4px}.post .post-content h5 .anchor:hover{border-bottom:initial}.post .post-content h5 .anchor .icon-link{visibility:hidden;font-size:16px}.post .post-content h5 .anchor .icon-link:before{vertical-align:middle}.post .post-content h5:hover .icon-link{visibility:visible}.post .post-content h6{font-weight:400;font-family:Athelas,STHeiti,Microsoft Yahei,serif}.post .post-content h6 .anchor{float:left;line-height:1;margin-left:-20px;padding-right:4px}.post .post-content h6 .anchor:hover{border-bottom:initial}.post .post-content h6 .anchor .icon-link{visibility:hidden;font-size:16px}.post .post-content h6 .anchor .icon-link:before{vertical-align:middle}.post .post-content h6:hover .icon-link{visibility:visible}.post .post-content a{color:#c05b4d;word-break:break-all}.post .post-content a:hover{border-bottom:1px solid #c05b4d}.post .post-content blockquote{margin:2em 0;padding:10px 20px;position:relative;color:rgba(52,73,94,.8);background-color:rgba(192,91,77,.05);border-left:3px solid rgba(192,91,77,.3);box-shadow:1px 1px 2px rgba(0,0,0,.125)}.post .post-content blockquote p{margin:0}.post .post-content img{display:inline-block;max-width:100%}.post .post-content .table-wrapper{overflow-x:auto}.post .post-content .table-wrapper>table{max-width:100%;margin:10px 0;border-spacing:0;box-shadow:2px 2px 3px rgba(0,0,0,.125)}.post .post-content .table-wrapper>table thead{background:#f8f5ec}.post .post-content .table-wrapper>table th,.post .post-content .table-wrapper>table td{padding:5px 15px;border:1px double #f4efe1}.post .post-content .table-wrapper>table tr:hover{background-color:#f8f5ec}.post .post-content code,.post .post-content pre{padding:7px;font-size:.9em;font-family:Consolas,Monaco,Menlo,dejavu sans mono,bitstream vera sans mono,courier new,monospace;background:#f8f5ec}.post .post-content code{padding:3px 5px;border-radius:4px;color:#c7254e}.post .post-content figure.highlight{margin:1em 0;border-radius:5px;overflow-x:auto;box-shadow:1px 1px 2px rgba(0,0,0,.125);position:relative}.post .post-content figure.highlight table{position:relative}.post .post-content figure.highlight table::after{position:absolute;top:0;right:0;left:0;padding:2px 7px;font-size:.9em;font-weight:700;color:#b1b1b1;background:#f4efe1;content:'Code'}.post .post-content figure.highlight.language-bash>table::after{content:"Bash"}.post .post-content figure.highlight.language-c>table::after{content:"C"}.post .post-content figure.highlight.language-cs>table::after{content:"C#"}.post .post-content figure.highlight.language-cpp>table::after{content:"C++"}.post .post-content figure.highlight.language-css>table::after{content:"CSS"}.post .post-content figure.highlight.language-coffeescript>table::after{content:"CoffeeScript"}.post .post-content figure.highlight.language-html>table::after{content:"HTML"}.post .post-content figure.highlight.language-xml>table::after{content:"XML"}.post .post-content figure.highlight.language-http>table::after{content:"HTTP"}.post .post-content figure.highlight.language-json>table::after{content:"JSON"}.post .post-content figure.highlight.language-java>table::after{content:"Java"}.post .post-content figure.highlight.language-js>table::after{content:"JavaScript"}.post .post-content figure.highlight.language-javascript>table::after{content:"JavaScript"}.post .post-content figure.highlight.language-makefile>table::after{content:"Makefile"}.post .post-content figure.highlight.language-markdown>table::after{content:"Markdown"}.post .post-content figure.highlight.language-objectivec>table::after{content:"Objective-C"}.post .post-content figure.highlight.language-php>table::after{content:"PHP"}.post .post-content figure.highlight.language-perl>table::after{content:"Perl"}.post .post-content figure.highlight.language-python>table::after{content:"Python"}.post .post-content figure.highlight.language-ruby>table::after{content:"Ruby"}.post .post-content figure.highlight.language-sql>table::after{content:"SQL"}.post .post-content figure.highlight.language-shell>table::after{content:"Shell"}.post .post-content figure.highlight.language-erlang>table::after{content:"Erlang"}.post .post-content figure.highlight.language-go>table::after{content:"Go"}.post .post-content figure.highlight.language-go-html-template>table::after{content:"Go HTML Template"}.post .post-content figure.highlight.language-groovy>table::after{content:"Groovy"}.post .post-content figure.highlight.language-haskell>table::after{content:"Haskell"}.post .post-content figure.highlight.language-kotlin>table::after{content:"Kotlin"}.post .post-content figure.highlight.language-clojure>table::after{content:"Clojure"}.post .post-content figure.highlight.language-less>table::after{content:"Less"}.post .post-content figure.highlight.language-lisp>table::after{content:"Lisp"}.post .post-content figure.highlight.language-lua>table::after{content:"Lua"}.post .post-content figure.highlight.language-matlab>table::after{content:"Matlab"}.post .post-content figure.highlight.language-rust>table::after{content:"Rust"}.post .post-content figure.highlight.language-scss>table::after{content:"Scss"}.post .post-content figure.highlight.language-scala>table::after{content:"Scala"}.post .post-content figure.highlight.language-swift>table::after{content:"Swift"}.post .post-content figure.highlight.language-typescript>table::after{content:"TypeScript"}.post .post-content figure.highlight.language-yml>table::after{content:"YAML"}.post .post-content figure.highlight.language-yaml>table::after{content:"YAML"}.post .post-content figure.highlight.language-toml>table::after{content:"TOML"}.post .post-content figure.highlight.language-diff>table::after{content:"Diff"}.post .post-content figure.highlight .code pre{margin:0;padding:30px 10px 10px}.post .post-content figure.highlight .gutter{width:10px;color:#cacaca}.post .post-content figure.highlight .gutter pre{margin:0;padding:30px 7px 10px}.post .post-content figure.highlight .line{height:1em}.post .post-content figure.highlight table,.post .post-content figure.highlight tr,.post .post-content figure.highlight td{margin:0;padding:0;width:100%;border-collapse:collapse}.post .post-content figure.highlight .code .hljs-comment,.post .post-content figure.highlight .code .hljs-quote{color:#93a1a1}.post .post-content figure.highlight .code .hljs-keyword,.post .post-content figure.highlight .code .hljs-selector-tag,.post .post-content figure.highlight .code .hljs-addition{color:#859900}.post .post-content figure.highlight .code .hljs-number,.post .post-content figure.highlight .code .hljs-string,.post .post-content figure.highlight .code .hljs-meta .hljs-meta-string,.post .post-content figure.highlight .code .hljs-literal,.post .post-content figure.highlight .code .hljs-doctag,.post .post-content figure.highlight .code .hljs-regexp{color:#2aa198}.post .post-content figure.highlight .code .hljs-title,.post .post-content figure.highlight .code .hljs-section,.post .post-content figure.highlight .code .hljs-name,.post .post-content figure.highlight .code .hljs-selector-id,.post .post-content figure.highlight .code .hljs-selector-class{color:#268bd2}.post .post-content figure.highlight .code .hljs-attribute,.post .post-content figure.highlight .code .hljs-attr,.post .post-content figure.highlight .code .hljs-variable,.post .post-content figure.highlight .code .hljs-template-variable,.post .post-content figure.highlight .code .hljs-class .hljs-title,.post .post-content figure.highlight .code .hljs-type{color:#b58900}.post .post-content figure.highlight .code .hljs-symbol,.post .post-content figure.highlight .code .hljs-bullet,.post .post-content figure.highlight .code .hljs-subst,.post .post-content figure.highlight .code .hljs-meta,.post .post-content figure.highlight .code .hljs-meta .hljs-keyword,.post .post-content figure.highlight .code .hljs-selector-attr,.post .post-content figure.highlight .code .hljs-selector-pseudo,.post .post-content figure.highlight .code .hljs-link{color:#cb4b16}.post .post-content figure.highlight .code .hljs-built_in,.post .post-content figure.highlight .code .hljs-deletion{color:#dc322f}.post .post-content figure.highlight .code .hljs-formula{background:#eee8d5}.post .post-content figure.highlight .code .hljs-emphasis{font-style:italic}.post .post-content figure.highlight .code .hljs-strong{font-weight:700}.post .post-content .highlight>.chroma{margin:1em 0;border-radius:5px;overflow-x:auto;box-shadow:1px 1px 2px rgba(0,0,0,.125);position:relative;background:#f8f5ec}.post .post-content .highlight>.chroma code{padding:0}.post .post-content .highlight>.chroma table{position:relative}.post .post-content .highlight>.chroma table::after{position:absolute;top:0;right:0;left:0;padding:2px 7px;font-size:.9em;font-weight:700;color:#b1b1b1;background:#f4efe1;content:'Code'}.post .post-content .highlight>.chroma.language-bash>table::after{content:"Bash"}.post .post-content .highlight>.chroma.language-c>table::after{content:"C"}.post .post-content .highlight>.chroma.language-cs>table::after{content:"C#"}.post .post-content .highlight>.chroma.language-cpp>table::after{content:"C++"}.post .post-content .highlight>.chroma.language-css>table::after{content:"CSS"}.post .post-content .highlight>.chroma.language-coffeescript>table::after{content:"CoffeeScript"}.post .post-content .highlight>.chroma.language-html>table::after{content:"HTML"}.post .post-content .highlight>.chroma.language-xml>table::after{content:"XML"}.post .post-content .highlight>.chroma.language-http>table::after{content:"HTTP"}.post .post-content .highlight>.chroma.language-json>table::after{content:"JSON"}.post .post-content .highlight>.chroma.language-java>table::after{content:"Java"}.post .post-content .highlight>.chroma.language-js>table::after{content:"JavaScript"}.post .post-content .highlight>.chroma.language-javascript>table::after{content:"JavaScript"}.post .post-content .highlight>.chroma.language-makefile>table::after{content:"Makefile"}.post .post-content .highlight>.chroma.language-markdown>table::after{content:"Markdown"}.post .post-content .highlight>.chroma.language-objectivec>table::after{content:"Objective-C"}.post .post-content .highlight>.chroma.language-php>table::after{content:"PHP"}.post .post-content .highlight>.chroma.language-perl>table::after{content:"Perl"}.post .post-content .highlight>.chroma.language-python>table::after{content:"Python"}.post .post-content .highlight>.chroma.language-ruby>table::after{content:"Ruby"}.post .post-content .highlight>.chroma.language-sql>table::after{content:"SQL"}.post .post-content .highlight>.chroma.language-shell>table::after{content:"Shell"}.post .post-content .highlight>.chroma.language-erlang>table::after{content:"Erlang"}.post .post-content .highlight>.chroma.language-go>table::after{content:"Go"}.post .post-content .highlight>.chroma.language-go-html-template>table::after{content:"Go HTML Template"}.post .post-content .highlight>.chroma.language-groovy>table::after{content:"Groovy"}.post .post-content .highlight>.chroma.language-haskell>table::after{content:"Haskell"}.post .post-content .highlight>.chroma.language-kotlin>table::after{content:"Kotlin"}.post .post-content .highlight>.chroma.language-clojure>table::after{content:"Clojure"}.post .post-content .highlight>.chroma.language-less>table::after{content:"Less"}.post .post-content .highlight>.chroma.language-lisp>table::after{content:"Lisp"}.post .post-content .highlight>.chroma.language-lua>table::after{content:"Lua"}.post .post-content .highlight>.chroma.language-matlab>table::after{content:"Matlab"}.post .post-content .highlight>.chroma.language-rust>table::after{content:"Rust"}.post .post-content .highlight>.chroma.language-scss>table::after{content:"Scss"}.post .post-content .highlight>.chroma.language-scala>table::after{content:"Scala"}.post .post-content .highlight>.chroma.language-swift>table::after{content:"Swift"}.post .post-content .highlight>.chroma.language-typescript>table::after{content:"TypeScript"}.post .post-content .highlight>.chroma.language-yml>table::after{content:"YAML"}.post .post-content .highlight>.chroma.language-yaml>table::after{content:"YAML"}.post .post-content .highlight>.chroma.language-toml>table::after{content:"TOML"}.post .post-content .highlight>.chroma.language-diff>table::after{content:"Diff"}.post .post-content .highlight>.chroma .lntd{line-height:1em}.post .post-content .highlight>.chroma .lntd:first-child{width:10px}.post .post-content .highlight>.chroma .lntd:first-child pre{margin:0;padding:30px 7px 10px}.post .post-content .highlight>.chroma .lntd:last-child{vertical-align:top}.post .post-content .highlight>.chroma .lntd:last-child pre{margin:0;padding:30px 10px 10px}.post .post-content .highlight>.chroma table,.post .post-content .highlight>.chroma tr,.post .post-content .highlight>.chroma td{margin:0;padding:0;width:100%;border-collapse:collapse}.post .post-content .highlight>.chroma .lnt{color:#cacaca}.post .post-content .highlight>.chroma .hl{display:block;width:100%;background-color:#ffc}.post .post-content .highlight>.chroma .k{color:#859900}.post .post-content .highlight>.chroma .kc{color:#859900;font-weight:700}.post .post-content .highlight>.chroma .kd{color:#859900}.post .post-content .highlight>.chroma .kn{color:#dc322f;font-weight:700}.post .post-content .highlight>.chroma .kp{color:#859900}.post .post-content .highlight>.chroma .kr{color:#859900}.post .post-content .highlight>.chroma .kt{color:#859900;font-weight:700}.post .post-content .highlight>.chroma .n{color:#268bd2}.post .post-content .highlight>.chroma .na{color:#268bd2}.post .post-content .highlight>.chroma .nb{color:#cb4b16}.post .post-content .highlight>.chroma .bp{color:#268bd2}.post .post-content .highlight>.chroma .nc{color:#cb4b16}.post .post-content .highlight>.chroma .no{color:#268bd2}.post .post-content .highlight>.chroma .nd{color:#268bd2}.post .post-content .highlight>.chroma .ni{color:#268bd2}.post .post-content .highlight>.chroma .ne{color:#268bd2}.post .post-content .highlight>.chroma .nf{color:#268bd2}.post .post-content .highlight>.chroma .fm{color:#268bd2}.post .post-content .highlight>.chroma .nl{color:#268bd2}.post .post-content .highlight>.chroma .nn{color:#268bd2}.post .post-content .highlight>.chroma .nx{color:#268bd2}.post .post-content .highlight>.chroma .py{color:#268bd2}.post .post-content .highlight>.chroma .nt{color:#268bd2;font-weight:700}.post .post-content .highlight>.chroma .nv{color:#268bd2}.post .post-content .highlight>.chroma .vc{color:#268bd2}.post .post-content .highlight>.chroma .vg{color:#268bd2}.post .post-content .highlight>.chroma .vi{color:#268bd2}.post .post-content .highlight>.chroma .vm{color:#268bd2}.post .post-content .highlight>.chroma .l{color:#2aa198}.post .post-content .highlight>.chroma .ld{color:#2aa198}.post .post-content .highlight>.chroma .s{color:#2aa198}.post .post-content .highlight>.chroma .sa{color:#2aa198}.post .post-content .highlight>.chroma .sb{color:#2aa198}.post .post-content .highlight>.chroma .sc{color:#2aa198}.post .post-content .highlight>.chroma .dl{color:#2aa198}.post .post-content .highlight>.chroma .sd{color:#2aa198}.post .post-content .highlight>.chroma .s2{color:#2aa198}.post .post-content .highlight>.chroma .se{color:#2aa198}.post .post-content .highlight>.chroma .sh{color:#2aa198}.post .post-content .highlight>.chroma .si{color:#2aa198}.post .post-content .highlight>.chroma .sx{color:#2aa198}.post .post-content .highlight>.chroma .sr{color:#2aa198}.post .post-content .highlight>.chroma .s1{color:#2aa198}.post .post-content .highlight>.chroma .ss{color:#2aa198}.post .post-content .highlight>.chroma .m{color:#2aa198;font-weight:700}.post .post-content .highlight>.chroma .mb{color:#2aa198;font-weight:700}.post .post-content .highlight>.chroma .mf{color:#2aa198;font-weight:700}.post .post-content .highlight>.chroma .mh{color:#2aa198;font-weight:700}.post .post-content .highlight>.chroma .mi{color:#2aa198;font-weight:700}.post .post-content .highlight>.chroma .il{color:#2aa198;font-weight:700}.post .post-content .highlight>.chroma .mo{color:#2aa198;font-weight:700}.post .post-content .highlight>.chroma .ow{color:#859900}.post .post-content .highlight>.chroma .c{color:#93a1a1;font-style:italic}.post .post-content .highlight>.chroma .ch{color:#93a1a1;font-style:italic}.post .post-content .highlight>.chroma .cm{color:#93a1a1;font-style:italic}.post .post-content .highlight>.chroma .c1{color:#93a1a1;font-style:italic}.post .post-content .highlight>.chroma .cs{color:#93a1a1;font-style:italic}.post .post-content .highlight>.chroma .cp{color:#93a1a1;font-style:italic}.post .post-content .highlight>.chroma .cpf{color:#93a1a1;font-style:italic}.post .post-content .highlight>.chroma .g{color:#d33682}.post .post-content .highlight>.chroma .gd{color:#b58900}.post .post-content .highlight>.chroma .ge{color:#d33682}.post .post-content .highlight>.chroma .gr{color:#d33682}.post .post-content .highlight>.chroma .gh{color:#d33682}.post .post-content .highlight>.chroma .gi{color:#859900}.post .post-content .highlight>.chroma .go{color:#d33682}.post .post-content .highlight>.chroma .gp{color:#d33682}.post .post-content .highlight>.chroma .gs{color:#d33682}.post .post-content .highlight>.chroma .gu{color:#d33682}.post .post-content .highlight>.chroma .gt{color:#d33682}.post .post-content .post-summary{margin-bottom:1em}.post .post-content .read-more .read-more-link{color:#c05b4d;font-size:1.1em;font-family:Athelas,STHeiti,Microsoft Yahei,serif}.post .post-content .read-more .read-more-link:hover{border-bottom:1px solid #c05b4d}.post .post-content kbd{display:inline-block;padding:.25em;background-color:#fafafa;border:1px solid #dbdbdb;border-bottom-color:#b5b5b5;border-radius:3px;box-shadow:inset 0 -1px 0 #b5b5b5;font-size:.8em;line-height:1.25;font-family:sfmono-regular,liberation mono,roboto mono,Menlo,Monaco,Consolas,courier new,Courier,monospace;color:#4a4a4a}.post .post-content dl dt::after{content:':'}.post .post-content figure.center{text-align:center}.post .post-content figure.right{text-align:right}.post .post-content figure.left{text-align:left}.post .post-content figure figcaption h4{color:#b5b5b5;font-size:.9rem}.post .post-content hr{margin:1rem 0;position:relative;border-top:2px dashed #c05b4d;border-bottom:none}.post .post-content .footnote-ref>a{font-weight:700;margin-left:3px}.post .post-content .footnote-ref>a:before{content:"["}.post .post-content .footnote-ref>a:after{content:"]"}.post .post-content .task-list{list-style:none;padding-left:1.5rem}.post .post-content .align-center{text-align:center}.post .post-content .align-right{text-align:right}.post .post-content .align-left{text-align:left}.post .post-content .MJXc-display{overflow-x:auto;overflow-y:hidden;padding-right:1px}.post .post-copyright{margin-top:20px;padding-top:10px;border-top:1px dashed #e6e6e6}.post .post-copyright .copyright-item{margin:5px 0}.post .post-copyright .copyright-item a{color:#c05b4d;word-wrap:break-word}.post .post-copyright .copyright-item a:hover{border-bottom:1px solid #c05b4d}.post .post-copyright .copyright-item .item-title{display:inline-block;min-width:5rem;margin-right:.5rem;text-align:right}.post .post-copyright .copyright-item .item-title:after{content:" :"}.post .post-footer{margin-top:20px;border-top:1px solid #e6e6e6;font-family:Athelas,STHeiti,Microsoft Yahei,serif}.post .post-footer .post-tags{padding:15px 0}.post .post-footer .post-tags a{margin-right:5px;color:#c05b4d;word-break:break-all}.post .post-footer .post-tags a::before{content:'#'}.post .post-footer .post-nav{margin:1em 0}.post .post-footer .post-nav:before,.post .post-footer .post-nav:after{content:" ";display:table}.post .post-footer .post-nav:after{clear:both}.post .post-footer .post-nav .prev,.post .post-footer .post-nav .next{font-weight:600;font-size:18px;font-family:Athelas,STHeiti,Microsoft Yahei,serif;transition-property:transform;transition-timing-function:ease-out;transition-duration:.3s}.post .post-footer .post-nav .prev{float:left}.post .post-footer .post-nav .prev:hover{color:#c05b4d;transform:translateX(-4px)}.post .post-footer .post-nav .next{float:right}.post .post-footer .post-nav .next:hover{color:#c05b4d;transform:translateX(4px)}.post .post-footer .post-nav .nav-mobile{display:none}@media screen and (max-width:800px){.post .post-footer .post-nav .nav-default{display:none}.post .post-footer .post-nav .nav-mobile{display:inline}}.pagination{margin:2em 0}.pagination:before,.pagination:after{content:" ";display:table}.pagination:after{clear:both}.pagination .prev,.pagination .next{font-weight:600;font-size:20px;font-family:Athelas,STHeiti,Microsoft Yahei,serif;transition-property:transform;transition-timing-function:ease-out;transition-duration:.3s}.pagination .prev{float:left}.pagination .prev:hover{color:#c05b4d;transform:translateX(-4px)}.pagination .next{float:right}.pagination .next:hover{color:#c05b4d;transform:translateX(4px)}.footer{margin-top:2em}.footer .social-links{text-align:center}.footer .social-links .iconfont{font-size:30px}.footer .social-links .iconfont+.iconfont{margin-left:10px}.footer .social-links .iconfont:hover{color:#c05b4d}.footer .copyright{margin:10px 0;color:#8a8a8a;text-align:center;font-family:Athelas,STHeiti,Microsoft Yahei,serif}.footer .copyright .hexo-link,.footer .copyright .theme-link{color:#c05b4d}.footer .copyright .copyright-year{display:block}.footer .copyright .copyright-year .heart{font-size:14px}.archive{margin:2em 0;max-width:550px}.archive .archive-title{font-family:Athelas,STHeiti,Microsoft Yahei,serif}.archive .archive-title.tag,.archive .archive-title.category{margin:15px 0}.archive .archive-title .archive-name{margin:0;display:inline-block;font-weight:400;font-size:30px;line-height:32px}.archive .archive-title .archive-post-counter{color:#8a8a8a}.archive .collection-title{font-family:Athelas,STHeiti,Microsoft Yahei,serif}.archive .collection-title .archive-year{margin:15px 0;font-weight:400;font-size:28px;line-height:30px}.archive .archive-post{padding:3px 20px;border-left:1px solid #cacaca}.archive .archive-post .archive-post-time{margin-right:10px;color:#8a8a8a}.archive .archive-post .archive-post-title .archive-post-link{color:#c05b4d}.archive .archive-post::first-child{margin-top:10px}.archive .archive-post:hover{border-left:3px solid #c05b4d;transition:.2s ease-out;transform:translateX(4px)}.archive .archive-post:hover .archive-post-time{color:#717171}.archive .archive-post:hover .archive-post-title .archive-post-link{color:#a14639}@media screen and (max-width:800px){.archive{margin-left:auto;margin-right:auto}.archive .archive-title .archive-name{font-size:26px}.archive .collection-title .archive-year{margin:10px 0;font-size:24px}.archive .archive-post{padding:5px 10px}.archive .archive-post .archive-post-time{font-size:13px;display:block}}.terms{margin:2em 0 3em;text-align:center;font-family:Athelas,STHeiti,Microsoft Yahei,serif}.terms .terms-title{display:inline-block;font-size:18px;color:#c05b4d;border-bottom:2px solid #c05b4d}.terms .terms-tags{margin:10px 0}.terms .terms-tags .terms-link{display:inline-block;position:relative;margin:5px 10px;word-wrap:break-word;transition-duration:.2s;transition-property:transform;transition-timing-function:ease-out}.terms .terms-tags .terms-link .terms-count{display:inline-block;position:relative;top:-8px;right:-2px;color:#c05b4d;font-size:12px}.terms .terms-tags .terms-link:active,.terms .terms-tags .terms-link:focus,.terms .terms-tags .terms-link:hover{color:#c05b4d;transform:scale(1.1)}.slideout-menu{position:fixed;top:0;left:0;bottom:0;width:180px;min-height:100vh;overflow-y:hidden;-webkit-overflow-scrolling:touch;z-index:0;display:none}.slideout-panel{position:relative;z-index:1;background-color:#fefefe;min-height:100vh}.slideout-open,.slideout-open body,.slideout-open .slideout-panel{overflow:hidden}.slideout-open .slideout-menu{display:block}.mobile-navbar{display:none;position:fixed;top:0;left:0;width:100%;height:50px;background:#fefefe;box-shadow:0 2px 2px #cacaca;text-align:center;transition:transform 300ms ease;z-index:99}.mobile-navbar.fixed-open{transform:translate3d(180px,0px,0px)}.mobile-navbar .mobile-header-logo{display:inline-block;margin-right:50px}.mobile-navbar .mobile-header-logo .logo{font-size:22px;line-height:50px;font-family:chancery,cursive,LiSu,sans-serif}.mobile-navbar .mobile-navbar-icon{color:#c05b4d;height:50px;width:50px;font-size:24px;text-align:center;float:left;position:relative;transition:background .5s}@keyframes clickfirst{0%{transform:translateY(6px)rotate(0deg)}100%{transform:translateY(0)rotate(45deg)}}@keyframes clickmid{0%{opacity:1}100%{opacity:0}}@keyframes clicklast{0%{transform:translateY(-6px)rotate(0deg)}100%{transform:translateY(0)rotate(-45deg)}}@keyframes outfirst{0%{transform:translateY(0)rotate(-45deg)}100%{transform:translateY(-6px)rotate(0deg)}}@keyframes outmid{0%{opacity:0}100%{opacity:1}}@keyframes outlast{0%{transform:translateY(0)rotate(45deg)}100%{transform:translateY(6px)rotate(0deg)}}.mobile-navbar .mobile-navbar-icon span{position:absolute;left:15px;top:25px;left:calc((100% - 20px)/2);top:calc((100% - 1px)/2);width:20px;height:1px;background-color:#c05b4d}.mobile-navbar .mobile-navbar-icon span:nth-child(1){transform:translateY(6px)rotate(0deg)}.mobile-navbar .mobile-navbar-icon span:nth-child(3){transform:translateY(-6px)rotate(0deg)}.mobile-navbar .mobile-navbar-icon.icon-click span:nth-child(1){animation-duration:.5s;animation-fill-mode:both;animation-name:clickfirst}.mobile-navbar .mobile-navbar-icon.icon-click span:nth-child(2){animation-duration:.2s;animation-fill-mode:both;animation-name:clickmid}.mobile-navbar .mobile-navbar-icon.icon-click span:nth-child(3){animation-duration:.5s;animation-fill-mode:both;animation-name:clicklast}.mobile-navbar .mobile-navbar-icon.icon-out span:nth-child(1){animation-duration:.5s;animation-fill-mode:both;animation-name:outfirst}.mobile-navbar .mobile-navbar-icon.icon-out span:nth-child(2){animation-duration:.2s;animation-fill-mode:both;animation-name:outmid}.mobile-navbar .mobile-navbar-icon.icon-out span:nth-child(3){animation-duration:.5s;animation-fill-mode:both;animation-name:outlast}.mobile-menu{background-color:rgba(248,245,236,.5)}.mobile-menu .mobile-menu-list{position:relative;list-style:none;margin-top:50px;padding:0;border-top:1px solid #f8f5ec}.mobile-menu .mobile-menu-list .mobile-menu-item{padding:10px 30px;border-bottom:1px solid #f8f5ec}.mobile-menu .mobile-menu-list a{font-size:18px;font-family:Athelas,STHeiti,Microsoft Yahei,serif}.mobile-menu .mobile-menu-list a:hover{color:#c05b4d}@media screen and (max-width:800px){.mobile-navbar{display:block}}.back-to-top{display:none;position:fixed;right:20px;bottom:20px;transition-property:transform;transition-timing-function:ease-out;transition-duration:.3s;z-index:10}.back-to-top:hover{transform:translateY(-5px)}@media screen and (max-width:800px){.back-to-top{display:none!important}}.not-found{text-align:center}.not-found .error-emoji{color:#363636;font-size:3rem}.not-found .error-text{color:#797979;font-size:1.25rem}.not-found .error-link{margin-top:2rem}.not-found .error-link a{color:#c05b4d} \ No newline at end of file diff --git a/public/search/index.html b/public/search/index.html new file mode 100644 index 0000000..7588498 --- /dev/null +++ b/public/search/index.html @@ -0,0 +1,176 @@ + + + + + + Search Results - My digital brain + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+
+ +
+ + +
+
+
+ +
+
+
+ +
+
+

Matching pages

+
+
+
+ + + +
+
+
+ +
+ + + + +
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + diff --git a/public/sitemap.xml b/public/sitemap.xml new file mode 100644 index 0000000..a94aa10 --- /dev/null +++ b/public/sitemap.xml @@ -0,0 +1,550 @@ + + + + + /paper/legnani12_new_isotr_decoup_paral_manip/ + weekly + 0.5 + + + + /paper/fleming13_review_nanom_resol_posit_sensor/ + weekly + 0.5 + + + + /paper/preumont07_six_axis_singl_stage_activ/ + weekly + 0.5 + + + + /paper/spanos95_soft_activ_vibrat_isolat/ + weekly + 0.5 + + + + /paper/devasia07_survey_contr_issues_nanop/ + weekly + 0.5 + + + + /zettels/active_damping/ + weekly + 0.5 + + + + /paper/holterman05_activ_dampin_based_decoup_colloc_contr/ + weekly + 0.5 + + + + /paper/hanieh03_activ_stewar/ + weekly + 0.5 + + + + /paper/alkhatib03_activ_struc_vibrat_contr/ + weekly + 0.5 + + + + /zettels/actuators/ + weekly + 0.5 + + + + /paper/oomen18_advan_motion_contr_precis_mechat/ + weekly + 0.5 + + + + /paper/saxena12_advan_inter_model_contr_techn/ + weekly + 0.5 + + + + /paper/poel10_explor_activ_hard_mount_vibrat/ + weekly + 0.5 + + + + /paper/holler12_instr_x_ray_nano_imagin/ + weekly + 0.5 + + + + /paper/geng95_intel_contr_system_multip_degree/ + weekly + 0.5 + + + + /paper/wang12_autom_marker_full_field_hard/ + weekly + 0.5 + + + + /book/leach18_basic_precis_engin_edition/ + weekly + 0.5 + + + + /book/ + weekly + 0.5 + + + + /categories/cat1/ + weekly + 0.5 + + + + /categories/cat2/ + weekly + 0.5 + + + + /categories/ + weekly + 0.5 + + + + /paper/ito16_compar_class_high_precis_actuat/ + weekly + 0.5 + + + + /zettels/complementary_filters/ + weekly + 0.5 + + + + /websites/control_bootcamp/ + weekly + 0.5 + + + + /paper/bryson93_contr_spacec_aircr/ + weekly + 0.5 + + + + /zettels/cubic_architecture/ + weekly + 0.5 + + + + /websites/data_driven_dynamical_systems_with_machine_learning/ + weekly + 0.5 + + + + /paper/tang18_decen_vibrat_contr_voice_coil/ + weekly + 0.5 + + + + /paper/schellekens98_desig_precis/ + weekly + 0.5 + + + + /book/fleming14_desig_model_contr_nanop_system/ + weekly + 0.5 + + + + /paper/yang19_dynam_model_decoup_contr_flexib/ + weekly + 0.5 + + + + /paper/jiao18_dynam_model_exper_analy_stewar/ + weekly + 0.5 + + + + /zettels/electronics/ + weekly + 0.5 + + + + /paper/fleming12_estim/ + weekly + 0.5 + + + + /zettels/flexible_joints/ + weekly + 0.5 + + + + /paper/preumont02_force_feedb_versus_accel_feedb/ + weekly + 0.5 + + + + /zettels/force_sensors/ + weekly + 0.5 + + + + /book/leach14_fundam_princ_engin_nanom/ + weekly + 0.5 + + + + /paper/bibel92_guidel_h/ + weekly + 0.5 + + + + /zettels/h_infinity_control/ + weekly + 0.5 + + + + /zettels/hac_hac/ + weekly + 0.5 + + + + /paper/chen00_ident_decoup_contr_flexur_joint_hexap/ + weekly + 0.5 + + + + /paper/garg07_implem_chall_multiv_contr/ + weekly + 0.5 + + + + /zettels/inertial_sensors/ + weekly + 0.5 + + + + /paper/stankevic17_inter_charac_rotat_stages_x_ray_nanot/ + weekly + 0.5 + + + + /paper/wang16_inves_activ_vibrat_isolat_stewar/ + weekly + 0.5 + + + + /paper/gao15_measur_techn_precis_posit/ + weekly + 0.5 + + + + /zettels/metrology/ + weekly + 0.5 + + + + /book/ewins00_modal/ + weekly + 0.5 + + + + /book/du10_model_contr_vibrat_mechan_system/ + weekly + 0.5 + + + + /zettels/motion_control/ + weekly + 0.5 + + + + /book/du19_multi_actuat_system_contr/ + weekly + 0.5 + + + + /zettels/multivariable_control/ + weekly + 0.5 + + + + /book/albertos04_multiv_contr_system/ + weekly + 0.5 + + + + /book/skogestad07_multiv_feedb_contr/ + weekly + 0.5 + + + + / + weekly + 0.5 + + + + /zettels/nano_active_stabilization_system/ + weekly + 0.5 + + + + /paper/furutani04_nanom_cuttin_machin_using_stewar/ + weekly + 0.5 + + + + /paper/fleming10_nanop_system_with_force_feedb/ + weekly + 0.5 + + + + /paper/sebastian12_nanop_with_multip_sensor/ + weekly + 0.5 + + + + /paper/ + weekly + 0.5 + + + + /book/taghirad13_paral/ + weekly + 0.5 + + + + /paper/butler11_posit_contr_lithog_equip/ + weekly + 0.5 + + + + /zettels/position_sensors/ + weekly + 0.5 + + + + /zettels/positioning_stations/ + weekly + 0.5 + + + + /zettels/precision_engineering/ + weekly + 0.5 + + + + /zettels/reference_books/ + weekly + 0.5 + + + + /paper/collette11_review_activ_vibrat_isolat_strat/ + weekly + 0.5 + + + + /search/ + weekly + 0.1 + + + + /zettels/sensor_fusion/ + weekly + 0.5 + + + + /paper/tjepkema12_sensor_fusion_activ_vibrat_isolat_precis_equip/ + weekly + 0.5 + + + + /paper/collette15_sensor_fusion_method_high_perfor/ + weekly + 0.5 + + + + /paper/hauge04_sensor_contr_space_based_six/ + weekly + 0.5 + + + + /paper/li01_simul_vibrat_isolat_point_contr/ + weekly + 0.5 + + + + /paper/li01_simul_fault_vibrat_isolat_point/ + weekly + 0.5 + + + + /paper/zhang11_six_dof/ + weekly + 0.5 + + + + /zettels/stewart_platforms/ + weekly + 0.5 + + + + /paper/furqan17_studies_stewar_platf_manip/ + weekly + 0.5 + + + + /zettels/system_identification/ + weekly + 0.5 + + + + /tags/tag1/ + weekly + 0.5 + + + + /tags/tag2/ + weekly + 0.5 + + + + /tags/ + weekly + 0.5 + + + + /zettels/test/ + weekly + 0.5 + + + + /book/horowitz15_art_of_elect_third_edition/ + weekly + 0.5 + + + + /book/schmidt14_desig_high_perfor_mechat_revis_edition/ + weekly + 0.5 + + + + /paper/dasgupta00_stewar_platf_manip/ + weekly + 0.5 + + + + /book/preumont18_vibrat_contr_activ_struc_fourt_edition/ + weekly + 0.5 + + + + /paper/collette14_vibrat/ + weekly + 0.5 + + + + /zettels/vibration_isolation/ + weekly + 0.5 + + + + /websites/ + weekly + 0.5 + + + + /zettels/ + weekly + 0.5 + + + \ No newline at end of file diff --git a/public/sitemap.xsl b/public/sitemap.xsl new file mode 100644 index 0000000..11a52bb --- /dev/null +++ b/public/sitemap.xsl @@ -0,0 +1,115 @@ + + + + + + + XML Sitemap + + + + +
+

XML Sitemap

+

+ This is a sitemap generated by Hugo to allow search engines to discover this blog's content. +

+

+ The xsl style copy from Ghost. +

+ + + + + + + + + + + + + + + + + + + + + +
URL ( total)PrioCh. Freq.Last Modified
+ + + + + + + + + + + + +
+
+ + + +
+
\ No newline at end of file diff --git a/public/tags/index.html b/public/tags/index.html new file mode 100644 index 0000000..b8ba077 --- /dev/null +++ b/public/tags/index.html @@ -0,0 +1,152 @@ + + + + + + Tags - My digital brain + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+
+ +
+ + +
+
+
+
+
+ 2 Tags In Total +
+ +
+
+
+
+ +
+ + + + +
+ +
+ +
+
+ + + + + + + + + + + + + + + + + diff --git a/public/tags/index.xml b/public/tags/index.xml new file mode 100644 index 0000000..3cf8efe --- /dev/null +++ b/public/tags/index.xml @@ -0,0 +1,32 @@ + + + + Tags on My digital brain + /tags/ + Recent content in Tags on My digital brain + Hugo -- gohugo.io + en + + + + + + tag1 + /tags/tag1/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /tags/tag1/ + + + + + tag2 + /tags/tag2/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /tags/tag2/ + + + + + \ No newline at end of file diff --git a/public/tags/tag1/index.html b/public/tags/tag1/index.html new file mode 100644 index 0000000..51ecf11 --- /dev/null +++ b/public/tags/tag1/index.html @@ -0,0 +1,157 @@ + + + + + + tag1 · My digital brain + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+
+ +
+ + +
+
+
+
+
+

tag1

+
+ +
+ + 0001-01-01 + + + + Active structural vibration control: a review + + +
+
+ + +
+
+
+ +
+ + + + +
+ +
+ +
+
+ + + + + + + + + + + + + + + + + diff --git a/public/tags/tag1/index.xml b/public/tags/tag1/index.xml new file mode 100644 index 0000000..18d40b4 --- /dev/null +++ b/public/tags/tag1/index.xml @@ -0,0 +1,24 @@ + + + + tag1 on My digital brain + /tags/tag1/ + Recent content in tag1 on My digital brain + Hugo -- gohugo.io + en + + + + + + Active structural vibration control: a review + /paper/alkhatib03_activ_struc_vibrat_contr/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /paper/alkhatib03_activ_struc_vibrat_contr/ + Tags : + Reference (Rabih Alkhatib &amp; Golnaraghi, 2003) Author(s) Alkhatib, R., &amp; Golnaraghi, M. F. Year 2003 Process of designing an active vibration control system Analyze the structure to be controled Obtain an idealized mathematical model with FEM or experimental modal analysis Reduce the model order is necessary Analyze the resulting model: dynamics properties, types of disturbances, &hellip; Quantify sensors and actuators requirements. Decide on their types and location Analyze the impact of the sensors and actuators on the overall dynamic characteristics Specify performance criteria and stability tradeoffs Device of the type of control algorythm to be employed and design a controller to meet the specifications Simulate the resulting controlled system on a computer If the controller does not meet the requirements, adjust the specifications or modify the type of controller Choose hardware and software and integrate the components on a pilot plant Formulate experiments and perform system identification and model updating Implement controller and carry out system test to evaluate the performance Feedback control Active damping The objective is to reduce the resonance peaks of the closed loop transfer function. + + + + \ No newline at end of file diff --git a/public/tags/tag1/page/1/index.html b/public/tags/tag1/page/1/index.html new file mode 100644 index 0000000..3619d05 --- /dev/null +++ b/public/tags/tag1/page/1/index.html @@ -0,0 +1 @@ +/tags/tag1/ \ No newline at end of file diff --git a/public/tags/tag2/index.html b/public/tags/tag2/index.html new file mode 100644 index 0000000..ff6b2bd --- /dev/null +++ b/public/tags/tag2/index.html @@ -0,0 +1,157 @@ + + + + + + tag2 · My digital brain + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+
+ +
+ + +
+
+
+
+
+

tag2

+
+ +
+ + 0001-01-01 + + + + Active structural vibration control: a review + + +
+
+ + +
+
+
+ +
+ + + + +
+ +
+ +
+
+ + + + + + + + + + + + + + + + + diff --git a/public/tags/tag2/index.xml b/public/tags/tag2/index.xml new file mode 100644 index 0000000..ee82dcf --- /dev/null +++ b/public/tags/tag2/index.xml @@ -0,0 +1,24 @@ + + + + tag2 on My digital brain + /tags/tag2/ + Recent content in tag2 on My digital brain + Hugo -- gohugo.io + en + + + + + + Active structural vibration control: a review + /paper/alkhatib03_activ_struc_vibrat_contr/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /paper/alkhatib03_activ_struc_vibrat_contr/ + Tags : + Reference (Rabih Alkhatib &amp; Golnaraghi, 2003) Author(s) Alkhatib, R., &amp; Golnaraghi, M. F. Year 2003 Process of designing an active vibration control system Analyze the structure to be controled Obtain an idealized mathematical model with FEM or experimental modal analysis Reduce the model order is necessary Analyze the resulting model: dynamics properties, types of disturbances, &hellip; Quantify sensors and actuators requirements. Decide on their types and location Analyze the impact of the sensors and actuators on the overall dynamic characteristics Specify performance criteria and stability tradeoffs Device of the type of control algorythm to be employed and design a controller to meet the specifications Simulate the resulting controlled system on a computer If the controller does not meet the requirements, adjust the specifications or modify the type of controller Choose hardware and software and integrate the components on a pilot plant Formulate experiments and perform system identification and model updating Implement controller and carry out system test to evaluate the performance Feedback control Active damping The objective is to reduce the resonance peaks of the closed loop transfer function. + + + + \ No newline at end of file diff --git a/public/tags/tag2/page/1/index.html b/public/tags/tag2/page/1/index.html new file mode 100644 index 0000000..db2eea6 --- /dev/null +++ b/public/tags/tag2/page/1/index.html @@ -0,0 +1 @@ +/tags/tag2/ \ No newline at end of file diff --git a/public/websites/control_bootcamp/index.html b/public/websites/control_bootcamp/index.html new file mode 100644 index 0000000..33b278d --- /dev/null +++ b/public/websites/control_bootcamp/index.html @@ -0,0 +1,208 @@ + + + + + + Control Bootcamp - My digital brain + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+
+ +
+ + +
+
+
+
+
+

Tags +:

+

https://www.youtube.com/playlist?list=PLMrJAkhIeNNR20Mz-VpzgfQs5zrYi085m

+

Overview

+

Linear Systems

+

Stability and Eigenvalues

+

Linearizing Around a Fixed Point

+

Controllability

+

Controllability, Reachability, and Eigenvalue Placement

+

Controllability and the Discrete-Time Impulse Response

+

Degrees of Controllability and Gramians

+

Controllability and the PBH Test

+

Cayley-Hamilton Theorem

+

Reachability and Controllability with Cayley-Hamilton

+

Inverted Pendulum on a Cart

+

Eigenvalue Placement for the Inverted Pendulum on a Cart

+

Linear Quadratic Regulator (LQR) Control for the Inverted Pendulum on a Cart

+

Motivation for Full-State Estimation

+

Observability

+

Full-State Estimation

+

Kalman Filter

+

Observability Example in Matlab

+

Observability Example in Matlab (Part 2)

+

Kalman Filter Example in Matlab

+

Linear Quadratic Gaussian (LQG)

+

LQG Example in Matlab

+

Introduction to Robust Control

+

Three Equivalent Representations of Linear Systems

+

Example Frequency Response (Bode Plot) for Spring-Mass-Damper

+

Laplace Transforms and the Transfer Function

+

Benefits of Feedback on Cruise Control Example

+

Benefits of Feedback on Cruise Control Example (Part 2)

+

Cruise Control Example with Proportional-Integral (PI) control

+

Sensitivity and Complementary Sensitivity

+

Sensitivity and Complementary Sensitivity (Part 2)

+

Loop shaping

+

Loop Shaping Example for Cruise Control

+

Sensitivity and Robustness

+

Limitations on Robustness

+

Cautionary Tale About Inverting the Plant Dynamics

+

Control systems with non-minimum phase dynamics

+

<./biblio/references.bib>

+ +
+
+
+
+
+ +
+ + + + +
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + diff --git a/public/websites/data_driven_dynamical_systems_with_machine_learning/index.html b/public/websites/data_driven_dynamical_systems_with_machine_learning/index.html new file mode 100644 index 0000000..ad6a473 --- /dev/null +++ b/public/websites/data_driven_dynamical_systems_with_machine_learning/index.html @@ -0,0 +1,238 @@ + + + + + + Data-Driven Dynamical Systems with Machine Learning - My digital brain + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+
+ +
+ + +
+
+
+
+
+

Tags +:

+

Data-Driven Control

+

Overview

+

Challenges

+

With modern control (LQR, LQG, H-Infinity), we work with linear system (or linearized systems) and we develop a control law that minimize some cost function.

+

Challenging systems where modern control is not efficient:

+
    +
  • Non-linear systems
  • +
  • System with unknown dynamics
  • +
  • High dimensional systems
  • +
  • Limited measurements or control inputs
  • +
+

For these kinds of systems, data-driven control seems to be a good alternative.

+

What is control?

+

It’s an optimization constrained by dynamics of the system.

+

The optimization is easy when the system is linear and the cost function is quadratic. +When the system is non-linear or when the cost function is non quadratic, the optimization becomes complicated (non closed form). Then the optimization should be rerun on the fly, which is what is done with MPC (model predictive control).

+

What is Machine-Learning?

+

Machine-learning is powerful non-linear optimization based on data.

+

Outline of this lecture

+
Data Driven Models
+

For the problem of unknown dynamics, we can use data driven models. +The goal is to collect data to generate of model of the system.

+
Machine Learning Control
+

When we use the control inputs, the system changes and the system model might be not valid anymore. +The idea is to use data driven machine learning directly to learn a good controller.

+
Sensor and actuator placement
+

Use powerful optimization techniques from machine learning to learn what are good sensors and actuators.

+

Linear System Identification

+

The Goal of Balanced Model Reduction

+

Change of Variables in Control Systems

+

Change of Variables in Control Systems (Correction)

+

Balancing Example

+

Balancing Transformation

+

Balanced Truncation

+

Balanced Truncation Example

+

Error Bounds for Balanced Truncation

+

Balanced Proper Orthogonal Decomposition

+

BPOD and Output Projection

+

Balanced Truncation and BPOD Example

+

Eigensystem Realization Algorithm

+

ERA and the Discrete-Time Impulse Response

+

Eigensystem Realization Algorithm Procedure

+

Balanced Models with ERA

+

Observer Kalman Filter Identification

+

ERA_OKID Example in Matlab

+

System Identification

+

Full-State Models with Control

+

Regression Models

+

Dynamic Mode Decomposition with Control

+

DMD Control Example

+

Koopman with Control

+

Sparse Nonlinear Models with Control

+

Model Predictive Control

+

Sparse Identification of Nonlinear Dynamics for Model Predictive Control

+

Machine Learning Control

+

Overview

+

Genetic Algorithms

+

Tuning a PID Controller with Genetic Algorithms

+

Tuning a PID Controller with Genetic Algorithms (Part 2)

+

Genetic Programming

+

Genetic Programming Control

+

Extremum Seeking Control

+

Introduction

+

Matlab

+ +

Challenging Example

+

Applications

+

<./biblio/references.bib>

+ +
+
+
+
+
+ +
+ + + + +
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + diff --git a/public/websites/index.html b/public/websites/index.html new file mode 100644 index 0000000..e4ba819 --- /dev/null +++ b/public/websites/index.html @@ -0,0 +1,168 @@ + + + + + + Archive - My digital brain + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+
+ +
+ + +
+
+
+ +
+
+

0001

+
+ +
+ + 01-01 + + + + Data-Driven Dynamical Systems with Machine Learning + + +
+ +
+ + 01-01 + + + + Control Bootcamp + + +
+ + +
+
+
+ +
+ + + + +
+ +
+ +
+
+ + + + + + + + + + + + + + + + + diff --git a/public/websites/index.xml b/public/websites/index.xml new file mode 100644 index 0000000..6fc03c6 --- /dev/null +++ b/public/websites/index.xml @@ -0,0 +1,38 @@ + + + + Websites on My digital brain + /websites/ + Recent content in Websites on My digital brain + Hugo -- gohugo.io + en + + + + + + Control Bootcamp + /websites/control_bootcamp/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /websites/control_bootcamp/ + Tags : +https://www.youtube.com/playlist?list=PLMrJAkhIeNNR20Mz-VpzgfQs5zrYi085m +Overview Linear Systems Stability and Eigenvalues Linearizing Around a Fixed Point Controllability Controllability, Reachability, and Eigenvalue Placement Controllability and the Discrete-Time Impulse Response Degrees of Controllability and Gramians Controllability and the PBH Test Cayley-Hamilton Theorem Reachability and Controllability with Cayley-Hamilton Inverted Pendulum on a Cart Eigenvalue Placement for the Inverted Pendulum on a Cart Linear Quadratic Regulator (LQR) Control for the Inverted Pendulum on a Cart Motivation for Full-State Estimation Observability Full-State Estimation Kalman Filter Observability Example in Matlab Observability Example in Matlab (Part 2) Kalman Filter Example in Matlab Linear Quadratic Gaussian (LQG) LQG Example in Matlab Introduction to Robust Control Three Equivalent Representations of Linear Systems Example Frequency Response (Bode Plot) for Spring-Mass-Damper Laplace Transforms and the Transfer Function Benefits of Feedback on Cruise Control Example Benefits of Feedback on Cruise Control Example (Part 2) Cruise Control Example with Proportional-Integral (PI) control Sensitivity and Complementary Sensitivity Sensitivity and Complementary Sensitivity (Part 2) Loop shaping Loop Shaping Example for Cruise Control Sensitivity and Robustness Limitations on Robustness Cautionary Tale About Inverting the Plant Dynamics Control systems with non-minimum phase dynamics &lt;. + + + + Data-Driven Dynamical Systems with Machine Learning + /websites/data_driven_dynamical_systems_with_machine_learning/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /websites/data_driven_dynamical_systems_with_machine_learning/ + Tags : +Data-Driven Control Overview Challenges With modern control (LQR, LQG, H-Infinity), we work with linear system (or linearized systems) and we develop a control law that minimize some cost function. +Challenging systems where modern control is not efficient: + Non-linear systems System with unknown dynamics High dimensional systems Limited measurements or control inputs For these kinds of systems, data-driven control seems to be a good alternative. +What is control? + + + + \ No newline at end of file diff --git a/public/websites/page/1/index.html b/public/websites/page/1/index.html new file mode 100644 index 0000000..7734251 --- /dev/null +++ b/public/websites/page/1/index.html @@ -0,0 +1 @@ +/websites/ \ No newline at end of file diff --git a/public/zettels/active_damping/index.html b/public/zettels/active_damping/index.html new file mode 100644 index 0000000..58591ca --- /dev/null +++ b/public/zettels/active_damping/index.html @@ -0,0 +1,201 @@ + + + + + + Active Damping - My digital brain + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+
+ +
+ + +
+
+
+ +
+
+
+ +
+ + + + +
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + diff --git a/public/zettels/actuators/index.html b/public/zettels/actuators/index.html new file mode 100644 index 0000000..dd20b6a --- /dev/null +++ b/public/zettels/actuators/index.html @@ -0,0 +1,324 @@ + + + + + + Actuators - My digital brain + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+
+ +
+ + +
+
+
+
+ +
+

Actuators

+
+ +
+

Contents

+
+ +
+
+
+

Tags +:

+

How to choose the correct actuator for my application?

+

For vibration isolation:

+ +

Piezoelectric

+ + + + + + + + + + + + + + + + + + + + + + + + + +
SuppliersLinks
Cedratlink
PIlink
Piezo Systemlink
Noliaclink
+

A model of a multi-layer monolithic piezoelectric stack actuator is described in (Fleming, 2010) (Notes).

+

Voice Coil

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
SuppliersLinks
Geepluslink
Macconlink
TDS PPlink
H2techlink
PBA Systemslink
Celera Motionlink
Beikimcolink
Electromatelink
Magnetic Innovationslink
+

Shaker

+ + + + + + + + + + + + + + + + + + + + + +
SuppliersLinks
BKSVlink
Vibration Researchlink
Sentek Dynamicslink
+

https://www.bksv.com/en/products/shakers-and-exciters/LDS-shaker-systems/permanent-magnet-shakers/V201

+

Brush-less DC Motor

+ +

https://www.electricaltechnology.org/2016/05/bldc-brushless-dc-motor-construction-working-principle.html

+

Bibliography

+

Ito, S., & Schitter, G., Comparison and classification of high-precision actuators based on stiffness influencing vibration isolation, IEEE/ASME Transactions on Mechatronics, 21(2), 1169–1178 (2016). http://dx.doi.org/10.1109/tmech.2015.2478658

+

Fleming, A., Nanopositioning system with force feedback for high-performance tracking and vibration control, IEEE/ASME Transactions on Mechatronics, 15(3), 433–447 (2010). http://dx.doi.org/10.1109/tmech.2009.2028422

+

Yedamale, P., Brushless dc (bldc) motor fundamentals, Microchip Technology Inc, 20(), 3–15 (2003).

+ + + +
+ + +
+
+
+
+ +
+ + + + +
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + diff --git a/public/zettels/complementary_filters/index.html b/public/zettels/complementary_filters/index.html new file mode 100644 index 0000000..cacce78 --- /dev/null +++ b/public/zettels/complementary_filters/index.html @@ -0,0 +1,204 @@ + + + + + + Complementary Filters - My digital brain + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+
+ +
+ + +
+
+
+ +
+
+
+ +
+ + + + +
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + diff --git a/public/zettels/cubic_architecture/index.html b/public/zettels/cubic_architecture/index.html new file mode 100644 index 0000000..d462e24 --- /dev/null +++ b/public/zettels/cubic_architecture/index.html @@ -0,0 +1,206 @@ + + + + + + Cubic Architecture - My digital brain + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+
+ +
+ + +
+ +
+ +
+ + + + +
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + diff --git a/public/zettels/electronics/index.html b/public/zettels/electronics/index.html new file mode 100644 index 0000000..952c00c --- /dev/null +++ b/public/zettels/electronics/index.html @@ -0,0 +1,204 @@ + + + + + + Electronics - My digital brain + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+
+ +
+ + +
+
+
+ +
+
+
+ +
+ + + + +
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + diff --git a/public/zettels/flexible_joints/index.html b/public/zettels/flexible_joints/index.html new file mode 100644 index 0000000..147454f --- /dev/null +++ b/public/zettels/flexible_joints/index.html @@ -0,0 +1,210 @@ + + + + + + Flexible Joints - My digital brain + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/zettels/force_sensors/index.html b/public/zettels/force_sensors/index.html new file mode 100644 index 0000000..6103c2b --- /dev/null +++ b/public/zettels/force_sensors/index.html @@ -0,0 +1,219 @@ + + + + + + Force Sensors - My digital brain + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+
+ +
+ + +
+
+
+
+ +
+

Force Sensors

+
+ +
+

Contents

+
+ +
+
+
+

Tags +:

+

Suppliers

+ + + + + + + + + + + + + +
PCBlink
+

Dynamics and Noise of a piezoelectric force sensor

+

An analysis the dynamics and noise of a piezoelectric force sensor is done in (Fleming, 2010) (Notes).

+

Bibliography

+

Fleming, A., Nanopositioning system with force feedback for high-performance tracking and vibration control, IEEE/ASME Transactions on Mechatronics, 15(3), 433–447 (2010). http://dx.doi.org/10.1109/tmech.2009.2028422

+ +
+ + +
+
+
+
+ +
+ + + + +
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + diff --git a/public/zettels/h_infinity_control/index.html b/public/zettels/h_infinity_control/index.html new file mode 100644 index 0000000..dba3c1a --- /dev/null +++ b/public/zettels/h_infinity_control/index.html @@ -0,0 +1,212 @@ + + + + + + H Infinity Control - My digital brain + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+
+ +
+ + +
+
+
+
+ +
+

H Infinity Control

+
+ +
+

Contents

+
+ +
+
+
+

Tags +:

+

Nice Citations

+

From Rosenbrock, H. H. (1974). Computer-Aided Control System Design, Academic Press, New York:

+
+

Solutions are constrained by so many requirements that it is virtually impossible to list them all. +The designer finds himself threading a maze of such requirements, attempting to reconcile conflicting demands of cost, performance, easy maintenance, and so on. +A good design usually has strong aesthetic appeal to those who are competent in the subject.

+
+

<./biblio/references.bib>

+ + + +
+ + +
+
+
+
+ +
+ + + + +
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + diff --git a/public/zettels/hac_hac/index.html b/public/zettels/hac_hac/index.html new file mode 100644 index 0000000..71d2e03 --- /dev/null +++ b/public/zettels/hac_hac/index.html @@ -0,0 +1,217 @@ + + + + + + HAC-HAC - My digital brain + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+
+ +
+ + +
+
+
+
+ +
+

HAC-HAC

+
+ +
+

Contents

+
+ +
+
+
+

Tags +:

+

High-Authority Control/Low-Authority Control

+

From (Andre Preumont, 2018):

+
+

The HAC/LAC approach consist of combining the two approached in a dual-loop control as shown in Figure 1. The inner loop uses a set of collocated actuator/sensor pairs for decentralized active damping with guaranteed stability ; the outer loop consists of a non-collocated HAC based on a model of the actively damped structure. This approach has the following advantages:

+
    +
  • The active damping extends outside the bandwidth of the HAC and reduces the settling time of the modes which are outsite the bandwidth
  • +
  • The active damping makes it easier to gain-stabilize the modes outside the bandwidth of the output loop (improved gain margin)
  • +
  • The larger damping of the modes within the controller bandwidth makes them more robust to the parmetric uncertainty (improved phase margin)
  • +
+
+

+
+ Figure 1: HAC-LAC Control Architecture
+

Figure 1: HAC-LAC Control Architecture

+
+
+ +

Bibliography

+

Preumont, A., Vibration control of active structures - fourth edition (2018), : Springer International Publishing.

+ +
+ + +
+
+
+
+ +
+ + + + +
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + diff --git a/public/zettels/index.html b/public/zettels/index.html new file mode 100644 index 0000000..e662dca --- /dev/null +++ b/public/zettels/index.html @@ -0,0 +1,284 @@ + + + + + + Archive - My digital brain + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+
+ + + + + + + + + + + + + + + + + + + diff --git a/public/zettels/index.xml b/public/zettels/index.xml new file mode 100644 index 0000000..2e8dea4 --- /dev/null +++ b/public/zettels/index.xml @@ -0,0 +1,284 @@ + + + + Zettels on My digital brain + /zettels/ + Recent content in Zettels on My digital brain + Hugo -- gohugo.io + en + + + + + + Active Damping + /zettels/active_damping/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /zettels/active_damping/ + Tags : +&lt;./biblio/references.bib&gt; +Backlinks Active isolation and damping of vibrations via stewart platform Active damping based on decoupled collocated control + + + + Actuators + /zettels/actuators/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /zettels/actuators/ + Tags : +How to choose the correct actuator for my application? For vibration isolation: + In (Shingo Ito &amp; Georg Schitter, 2016), the effect of the actuator stiffness on the attainable vibration isolation is studied (Notes) Piezoelectric Suppliers Links Cedrat link PI link Piezo System link Noliac link A model of a multi-layer monolithic piezoelectric stack actuator is described in (Fleming, 2010) (Notes). + + + + Complementary Filters + /zettels/complementary_filters/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /zettels/complementary_filters/ + Tags : +&lt;./biblio/references.bib&gt; +Backlinks Advances in internal model control technique: a review and future prospects + + + + Cubic Architecture + /zettels/cubic_architecture/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /zettels/cubic_architecture/ + Tags : +&lt;./biblio/references.bib&gt; +Backlinks Sensors and control of a space-based six-axis vibration isolation system Dynamic modeling and decoupled control of a flexible stewart platform for vibration isolation Simultaneous, fault-tolerant vibration isolation and pointing control of flexure jointed hexapods + + + + Electronics + /zettels/electronics/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /zettels/electronics/ + Tags : +&lt;./biblio/references.bib&gt; +Backlinks The art of electronics - third edition + + + + Flexible Joints + /zettels/flexible_joints/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /zettels/flexible_joints/ + Tags : +&lt;./biblio/references.bib&gt; +Backlinks A six-axis single-stage active vibration isolator based on stewart platform Nanometre-cutting machine using a stewart-platform parallel mechanism Dynamic modeling and experimental analyses of stewart platform with flexible hinges Dynamic modeling and decoupled control of a flexible stewart platform for vibration isolation Simultaneous, fault-tolerant vibration isolation and pointing control of flexure jointed hexapods Investigation on active vibration isolation of a stewart platform with piezoelectric actuators Identification and decoupling control of flexure jointed hexapods + + + + Force Sensors + /zettels/force_sensors/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /zettels/force_sensors/ + Tags : +Suppliers PCB link Dynamics and Noise of a piezoelectric force sensor An analysis the dynamics and noise of a piezoelectric force sensor is done in (Fleming, 2010) (Notes). +Bibliography Fleming, A., Nanopositioning system with force feedback for high-performance tracking and vibration control, IEEE/ASME Transactions on Mechatronics, 15(3), 433–447 (2010). http://dx.doi.org/10.1109/tmech.2009.2028422 ↩ + + + + H Infinity Control + /zettels/h_infinity_control/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /zettels/h_infinity_control/ + Tags : +Nice Citations From Rosenbrock, H. H. (1974). Computer-Aided Control System Design, Academic Press, New York: + Solutions are constrained by so many requirements that it is virtually impossible to list them all. The designer finds himself threading a maze of such requirements, attempting to reconcile conflicting demands of cost, performance, easy maintenance, and so on. A good design usually has strong aesthetic appeal to those who are competent in the subject. + + + + HAC-HAC + /zettels/hac_hac/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /zettels/hac_hac/ + Tags : +High-Authority Control/Low-Authority Control +From (Andre Preumont, 2018): + The HAC/LAC approach consist of combining the two approached in a dual-loop control as shown in Figure 1. The inner loop uses a set of collocated actuator/sensor pairs for decentralized active damping with guaranteed stability ; the outer loop consists of a non-collocated HAC based on a model of the actively damped structure. This approach has the following advantages: + The active damping extends outside the bandwidth of the HAC and reduces the settling time of the modes which are outsite the bandwidth The active damping makes it easier to gain-stabilize the modes outside the bandwidth of the output loop (improved gain margin) The larger damping of the modes within the controller bandwidth makes them more robust to the parmetric uncertainty (improved phase margin) + + + + Inertial Sensors + /zettels/inertial_sensors/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /zettels/inertial_sensors/ + Tags Position Sensors Reviews (Collette {\it et al.}, 2012) Accelerometers Micromega Dynamics link MMF link PCB link Wireless Accelerometers + https://micromega-dynamics.com/products/recovib/miniature-vibration-recorder/ + Figure 1: Characteristics of commercially available accelerometers (Collette {it et al.}, 2011) + Geophones Sercel link Wilcoxon link + + + + Metrology + /zettels/metrology/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /zettels/metrology/ + Tags : +&lt;./biblio/references.bib&gt; +Backlinks Fundamental principles of engineering nanometrology + + + + Motion Control + /zettels/motion_control/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /zettels/motion_control/ + Tags : +&lt;./biblio/references.bib&gt; +Backlinks Advanced motion control for precision mechatronics: control, identification, and learning of complex systems + + + + Multivariable Control + /zettels/multivariable_control/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /zettels/multivariable_control/ + Tags : +&lt;./biblio/references.bib&gt; +Backlinks Position control in lithographic equipment Implementation challenges for multivariable control: what you did not learn in school! Simultaneous, fault-tolerant vibration isolation and pointing control of flexure jointed hexapods Multivariable control systems: an engineering approach Multivariable feedback control: analysis and design + + + + Nano Active Stabilization System + /zettels/nano_active_stabilization_system/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /zettels/nano_active_stabilization_system/ + Tags : +&lt;./biblio/references.bib&gt; +Backlinks Interferometric characterization of rotation stages for x-ray nanotomography Automated markerless full field hard x-ray microscopic tomography at sub-50 nm 3-dimension spatial resolution An instrument for 3d x-ray nano-imaging + + + + Position Sensors + /zettels/position_sensors/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /zettels/position_sensors/ + Tags Inertial Sensors Reviews of position sensors (Collette {\it et al.}, 2012) Fleming, A. J., A review of nanometer resolution position sensors: operation and performance (Andrew Fleming, 2013) (Notes) Relative Position Sensors +Table 1: Characteristics of relative measurement sensors collette11_review Technology Frequency Resolution Range T Range LVDT DC-200 Hz 10 nm rms 1-10 mm -50,100 °C Eddy current 5 kHz 0. + + + + Positioning Stations + /zettels/positioning_stations/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /zettels/positioning_stations/ + Tags : +&lt;./biblio/references.bib&gt; +Backlinks Interferometric characterization of rotation stages for x-ray nanotomography Position control in lithographic equipment An instrument for 3d x-ray nano-imaging + + + + Precision Engineering + /zettels/precision_engineering/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /zettels/precision_engineering/ + Tags : +&lt;./biblio/references.bib&gt; +Backlinks Design for precision: current status and trends Basics of precision engineering - 1st edition + + + + Reference Books + /zettels/reference_books/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /zettels/reference_books/ + Tags : +&lt;./biblio/references.bib&gt; +Backlinks Modal testing: theory, practice and application The art of electronics - third edition Vibration Control of Active Structures - Fourth Edition Parallel robots : mechanics and control The design of high performance mechatronics - 2nd revised edition Multivariable feedback control: analysis and design + + + + Sensor Fusion + /zettels/sensor_fusion/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /zettels/sensor_fusion/ + Tags : +&lt;./biblio/references.bib&gt; +Backlinks Sensor fusion for active vibration isolation in precision equipment Vibration control of flexible structures using fusion of inertial sensors and hyper-stable actuator-sensor pairs Sensor fusion methods for high performance active vibration isolation systems Nanopositioning system with force feedback for high-performance tracking and vibration control Nanopositioning with multiple sensors: a case study in data storage + + + + Stewart Platforms + /zettels/stewart_platforms/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /zettels/stewart_platforms/ + Tags : +&lt;./biblio/references.bib&gt; +Backlinks Six dof active vibration control using stewart platform with non-cubic configuration Decentralized vibration control of a voice coil motor-based stewart parallel mechanism: simulation and experiments Dynamic modeling and decoupled control of a flexible stewart platform for vibration isolation Parallel robots : mechanics and control Investigation on active vibration isolation of a stewart platform with piezoelectric actuators Identification and decoupling control of flexure jointed hexapods The stewart platform manipulator: a review Modeling and control of vibration in mechanical systems Studies on stewart platform manipulator: a review Nanometre-cutting machine using a stewart-platform parallel mechanism An intelligent control system for multiple degree-of-freedom vibration isolation Active isolation and damping of vibrations via stewart platform Sensors and control of a space-based six-axis vibration isolation system Dynamic modeling and experimental analyses of stewart platform with flexible hinges Simultaneous, fault-tolerant vibration isolation and pointing control of flexure jointed hexapods A new isotropic and decoupled 6-dof parallel manipulator Simultaneous vibration isolation and pointing control of flexure jointed hexapods A six-axis single-stage active vibration isolator based on stewart platform Vibration Control of Active Structures - Fourth Edition A soft 6-axis active vibration isolator + + + + System Identification + /zettels/system_identification/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /zettels/system_identification/ + Tags : +&lt;./biblio/references.bib&gt; +Backlinks Modal testing: theory, practice and application + + + + Test File + /zettels/test/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /zettels/test/ + This is a quote! + 1 2 a = 2; figure; This is an important part of the text. + See Eq. eq:test1 and eq:test2. +\begin{equation} a = 1 \end{equation} +\begin{equation} a = 2 \label{eq:test2} \end{equation} +Also look at 1 \eqref{eq:test2}. +Some text. +Some text. +Some text. +Some text. +Some text. +Some text. +Some text. +Some text. +Some text. +Some text. +Some text. +Some text. + + + + Vibration Isolation + /zettels/vibration_isolation/ + Mon, 01 Jan 0001 00:00:00 +0000 + + /zettels/vibration_isolation/ + Tags : +&lt;./biblio/references.bib&gt; +Backlinks Six dof active vibration control using stewart platform with non-cubic configuration Dynamic modeling and decoupled control of a flexible stewart platform for vibration isolation Investigation on active vibration isolation of a stewart platform with piezoelectric actuators Review of active vibration isolation strategies Vibration control of flexible structures using fusion of inertial sensors and hyper-stable actuator-sensor pairs Sensor fusion methods for high performance active vibration isolation systems Modeling and control of vibration in mechanical systems An intelligent control system for multiple degree-of-freedom vibration isolation Active isolation and damping of vibrations via stewart platform Sensors and control of a space-based six-axis vibration isolation system Comparison and classification of high-precision actuators based on stiffness influencing vibration isolation Simultaneous, fault-tolerant vibration isolation and pointing control of flexure jointed hexapods Simultaneous vibration isolation and pointing control of flexure jointed hexapods An exploration of active hard mount vibration isolation for precision equipment Force feedback versus acceleration feedback in active vibration isolation A six-axis single-stage active vibration isolator based on stewart platform Vibration Control of Active Structures - Fourth Edition A soft 6-axis active vibration isolator Sensor fusion for active vibration isolation in precision equipment + + + + \ No newline at end of file diff --git a/public/zettels/inertial_sensors/index.html b/public/zettels/inertial_sensors/index.html new file mode 100644 index 0000000..d820f9f --- /dev/null +++ b/public/zettels/inertial_sensors/index.html @@ -0,0 +1,273 @@ + + + + + + Inertial Sensors - My digital brain + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+
+ +
+ + +
+
+
+
+ +
+

Inertial Sensors

+
+ +
+

Contents

+
+ +
+
+
+
+
Tags
+
Position Sensors
+
+

Reviews

+ +

Accelerometers

+ + + + + + + + + + + + + + + + + + + + + +
Micromega Dynamicslink
MMFlink
PCBlink
+

Wireless Accelerometers

+ +

+
+ Figure 1: Characteristics of commercially available accelerometers (Collette {it et al.}, 2011)
+

Figure 1: Characteristics of commercially available accelerometers (Collette {it et al.}, 2011)

+
+
+ +

Geophones

+ + + + + + + + + + + + + + + + + +
Sercellink
Wilcoxonlink
+

+
+ Figure 2: Characteristics of commercially available geophones (Collette {it et al.}, 2011)
+

Figure 2: Characteristics of commercially available geophones (Collette {it et al.}, 2011)

+
+
+ +

Bibliography

+

Collette, C., Janssens, S., Fernandez-Carmona, P., Artoos, K., Guinchard, M., Hauviller, C., & Preumont, A., Review: inertial sensors for low-frequency seismic vibration measurement, Bulletin of the Seismological Society of America, 102(4), 1289–1300 (2012). http://dx.doi.org/10.1785/0120110223

+

Collette, C., Artoos, K., Guinchard, M., Janssens, S., Carmona Fernandez, P., & Hauviller, C., Review of sensors for low frequency seismic vibration measurement (2011).

+ +
+ + +
+
+
+
+ +
+ + + + +
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + diff --git a/public/zettels/metrology/index.html b/public/zettels/metrology/index.html new file mode 100644 index 0000000..3fcc468 --- /dev/null +++ b/public/zettels/metrology/index.html @@ -0,0 +1,204 @@ + + + + + + Metrology - My digital brain + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+
+ +
+ + +
+
+
+ +
+
+
+ +
+ + + + +
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + diff --git a/public/zettels/motion_control/index.html b/public/zettels/motion_control/index.html new file mode 100644 index 0000000..b6e57bd --- /dev/null +++ b/public/zettels/motion_control/index.html @@ -0,0 +1,204 @@ + + + + + + Motion Control - My digital brain + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+
+ +
+ + +
+
+
+ +
+
+
+ +
+ + + + +
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + diff --git a/public/zettels/multivariable_control/index.html b/public/zettels/multivariable_control/index.html new file mode 100644 index 0000000..c94c617 --- /dev/null +++ b/public/zettels/multivariable_control/index.html @@ -0,0 +1,208 @@ + + + + + + Multivariable Control - My digital brain + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/zettels/nano_active_stabilization_system/index.html b/public/zettels/nano_active_stabilization_system/index.html new file mode 100644 index 0000000..d9dc710 --- /dev/null +++ b/public/zettels/nano_active_stabilization_system/index.html @@ -0,0 +1,206 @@ + + + + + + Nano Active Stabilization System - My digital brain + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+
+ +
+ + +
+ +
+ +
+ + + + +
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + diff --git a/public/zettels/position_sensors/index.html b/public/zettels/position_sensors/index.html new file mode 100644 index 0000000..9324ea4 --- /dev/null +++ b/public/zettels/position_sensors/index.html @@ -0,0 +1,551 @@ + + + + + + Position Sensors - My digital brain + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+
+ +
+ + +
+
+
+
+ +
+

Position Sensors

+
+ +
+

Contents

+
+ +
+
+
+
+
Tags
+
Inertial Sensors
+
+

Reviews of position sensors

+ +

Relative Position Sensors

+

+
+ Table 1: + Characteristics of relative measurement sensors collette11_review +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TechnologyFrequencyResolutionRangeT Range
LVDTDC-200 Hz10 nm rms1-10 mm-50,100 °C
Eddy current5 kHz0.1-100 nm rms0.5-55 mm-50,100 °C
CapacitiveDC-100 kHz0.05-50 nm rms50 nm - 1 cm-40,100 °C
Interferometer300 kHz0.1 nm rms10 cm-250,100 °C
EncoderDC-1 MHz1 nm rms7-27 mm0,40 °C
Bragg FibersDC-150 Hz0.3 nm rms3.5 cm-30,80 °C
+

+
+ Table 2: + Summary of position sensor characteristics. The dynamic range (DNR) and resolution are approximations based on a full-scale range of \(100 \mu m\) and a first order bandwidth of \(1 kHz\) fleming13_review_nanom_resol_posit_sensor +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Sensor TypeRangeDNRResolutionMax. BWAccuracy
Metal foil\(10-500 \mu m\)230 ppm23 nm1-10 kHz1% FSR
Piezoresistive\(1-500 \mu m\)5 ppm0.5 nm>100 kHz1% FSR
Capacitive\(10 \mu m\) to \(10 mm\)24 ppm2.4 nm100 kHz0.1% FSR
Electrothermal\(10 \mu m\) to \(1 mm\)100 ppm10 nm10 kHz1% FSR
Eddy current\(100 \mu m\) to \(80 mm\)10 ppm1 nm40 kHz0.1% FSR
LVDT\(0.5-500 mm\)10 ppm5 nm1 kHz0.25% FSR
InterferometerMeters0.5 nm>100kHz1 ppm FSR
EncoderMeters6 nm>100kHz5 ppm FSR
+

Strain Gauge

+

Capacitive Sensor

+

Description:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Micro Senselink
Micro-Epsilonlink
PIlink
Unipulselink
Lion-Precisionlink
+

Inductive Sensor (Eddy Current)

+ + + + + + + + + + + + + + + + + +
Micro-Epsilonlink
Lion Precisionlink
+

Inductive Sensor (LVDT)

+ + + + + + + + + + + + + + + + + +
Micro-Epsilonlink
Keyencelink
+

Interferometers

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Attocubelink
Zygolink
Smaractlink
Qutoolslink
Renishawlink
Sioslink
Keysightlink
+
+ Table 3: + Characteristics of Environmental Units +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Temperature (\(\pm\ ^oC\))Pressure (\(\pm\ hPa\))Humidity \(\pm\% RH\)Wavelength Accuracy (\(\pm\ \text{ppm}\))
Attocube0.1120.5
Renishaw0.2161
Picoscale0.2221
+

(Yoon-Soo Jang & Seung-Woo Kim, 2017)

+

+
+ Figure 1: Expected precision of interferometer as a function of measured distance
+

Figure 1: Expected precision of interferometer as a function of measured distance

+
+
+ +

Fiber Optic Displacement Sensor

+ + + + + + + + + + + + + +
Unipulselink
+

Bibliography

+

Collette, C., Janssens, S., Mokrani, B., Fueyo-Roza, L., Artoos, K., Esposito, M., Fernandez-Carmona, P., …, Comparison of new absolute displacement sensors, In , International Conference on Noise and Vibration Engineering (ISMA) (pp. ) (2012). : .

+

Fleming, A. J., A review of nanometer resolution position sensors: operation and performance, Sensors and Actuators A: Physical, 190(nil), 106–126 (2013). http://dx.doi.org/10.1016/j.sna.2012.10.016

+

Collette, C., Artoos, K., Guinchard, M., Janssens, S., Carmona Fernandez, P., & Hauviller, C., Review of sensors for low frequency seismic vibration measurement (2011).

+

Jang, Y., & Kim, S., Compensation of the refractive index of air in laser interferometer for distance measurement: a review, International Journal of Precision Engineering and Manufacturing, 18(12), 1881–1890 (2017). http://dx.doi.org/10.1007/s12541-017-0217-y

+ + + +
+ + +
+
+
+
+ +
+ + + + +
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + diff --git a/public/zettels/positioning_stations/index.html b/public/zettels/positioning_stations/index.html new file mode 100644 index 0000000..ef8b2ad --- /dev/null +++ b/public/zettels/positioning_stations/index.html @@ -0,0 +1,206 @@ + + + + + + Positioning Stations - My digital brain + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+
+ +
+ + +
+ +
+ +
+ + + + +
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + diff --git a/public/zettels/precision_engineering/index.html b/public/zettels/precision_engineering/index.html new file mode 100644 index 0000000..236424d --- /dev/null +++ b/public/zettels/precision_engineering/index.html @@ -0,0 +1,205 @@ + + + + + + Precision Engineering - My digital brain + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+
+ +
+ + +
+
+
+ +
+
+
+ +
+ + + + +
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + diff --git a/public/zettels/reference_books/index.html b/public/zettels/reference_books/index.html new file mode 100644 index 0000000..f4491b9 --- /dev/null +++ b/public/zettels/reference_books/index.html @@ -0,0 +1,209 @@ + + + + + + Reference Books - My digital brain + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+
+ +
+ + +
+ +
+ +
+ + + + +
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + diff --git a/public/zettels/sensor_fusion/index.html b/public/zettels/sensor_fusion/index.html new file mode 100644 index 0000000..4f67a3d --- /dev/null +++ b/public/zettels/sensor_fusion/index.html @@ -0,0 +1,208 @@ + + + + + + Sensor Fusion - My digital brain + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/zettels/stewart_platforms/index.html b/public/zettels/stewart_platforms/index.html new file mode 100644 index 0000000..2d9a634 --- /dev/null +++ b/public/zettels/stewart_platforms/index.html @@ -0,0 +1,223 @@ + + + + + + Stewart Platforms - My digital brain + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+
+ +
+ + +
+
+
+
+ +
+

Stewart Platforms

+
+ +
+

Contents

+
+ +
+
+
+

Tags +:

+

<./biblio/references.bib>

+ + + +
+ + +
+
+
+
+ +
+ + + + +
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + diff --git a/public/zettels/system_identification/index.html b/public/zettels/system_identification/index.html new file mode 100644 index 0000000..2559d25 --- /dev/null +++ b/public/zettels/system_identification/index.html @@ -0,0 +1,204 @@ + + + + + + System Identification - My digital brain + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+
+ +
+ + +
+
+
+ +
+
+
+ +
+ + + + +
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + diff --git a/public/zettels/test/index.html b/public/zettels/test/index.html new file mode 100644 index 0000000..0bae28b --- /dev/null +++ b/public/zettels/test/index.html @@ -0,0 +1,269 @@ + + + + + + Test File - My digital brain + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+
+ +
+ + +
+
+
+
+ +
+

Test File

+
+ +
+

Contents

+
+ +
+
+
+
+

This is a quote!

+
+
+ +
+
1
+2
+
+
a = 2;
+figure;
+
+
+
+
+

This is an important part of the text.

+
+

See Eq. eq:test1 and eq:test2.

+

\begin{equation} +a = 1 +\end{equation}

+

\begin{equation} +a = 2 \label{eq:test2} +\end{equation}

+

Also look at 1 \eqref{eq:test2}.

+

Some text.

+

Some text.

+

Some text.

+

Some text.

+

Some text.

+

Some text.

+

Some text.

+

Some text.

+

Some text.

+

Some text.

+

Some text.

+

Some text.

+

Some text.

+

Some text.

+

Some text.

+

Some text.

+

Some text.

+

Some text.

+

Some text.

+

Some text.

+

Some text.

+

Some text.

+

Some text.

+

Some text.

+

Some text.

+

Some text.

+

Some text.

+

Some text.

+

Some text.

+

Some text.

+

Some text.

+

Some text.

+

Some text.

+

Some text.

+

Some text.

+

Some text.

+ +
+ + +
+
+
+
+ +
+ + + + +
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + diff --git a/public/zettels/vibration_isolation/index.html b/public/zettels/vibration_isolation/index.html new file mode 100644 index 0000000..5b0f4ef --- /dev/null +++ b/public/zettels/vibration_isolation/index.html @@ -0,0 +1,218 @@ + + + + + + Vibration Isolation - My digital brain + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + +
+
+ +
+ + +
+
+
+
+ +
+

Vibration Isolation

+
+ +
+

Contents

+
+ +
+
+
+

Tags +:

+

<./biblio/references.bib>

+ + + +
+ + +
+
+
+
+ +
+ + + + +
+ +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + diff --git a/resources/_gen/assets/scss/css/custom.scss_48b060fe05b0a273d182ef83c0605941.content b/resources/_gen/assets/scss/css/custom.scss_48b060fe05b0a273d182ef83c0605941.content new file mode 100644 index 0000000..e69de29 diff --git a/resources/_gen/assets/scss/css/custom.scss_48b060fe05b0a273d182ef83c0605941.json b/resources/_gen/assets/scss/css/custom.scss_48b060fe05b0a273d182ef83c0605941.json new file mode 100644 index 0000000..de94e08 --- /dev/null +++ b/resources/_gen/assets/scss/css/custom.scss_48b060fe05b0a273d182ef83c0605941.json @@ -0,0 +1 @@ +{"Target":"css/custom.min.e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855.css","MediaType":"text/css","Data":{"Integrity":"sha256-47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU="}} \ No newline at end of file diff --git a/resources/_gen/assets/scss/css/main.scss_48b060fe05b0a273d182ef83c0605941.content b/resources/_gen/assets/scss/css/main.scss_48b060fe05b0a273d182ef83c0605941.content new file mode 100644 index 0000000..c712f4e --- /dev/null +++ b/resources/_gen/assets/scss/css/main.scss_48b060fe05b0a273d182ef83c0605941.content @@ -0,0 +1 @@ +@font-face{font-family:Noto Sans;src:url(../fonts/NotoSans-Regular.woff2)format("woff2"),url(../fonts/NotoSans-Regular.woff)format("woff");font-weight:400;font-display:fallback}@font-face{font-family:Noto Sans;src:url(../fonts/NotoSans-Italic.woff2)format("woff2"),url(../fonts/NotoSans-Italic.woff)format("woff");font-weight:400;font-style:italic;font-display:fallback}@font-face{font-family:Noto Serif;src:url(../fonts/NotoSerif-SemiBold.woff2)format("woff2"),url(../fonts/NotoSerif-SemiBold.woff)format("woff");font-weight:600;font-display:fallback}@font-face{font-family:Noto Serif;src:url(../fonts/NotoSerif-Bold.woff2)format("woff2"),url(../fonts/NotoSerif-Bold.woff)format("woff");font-weight:700;font-display:fallback}/*!normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css*/html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0}main{display:block}h1{font-size:2em;margin:.67em 0}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}button,[type=button],[type=reset],[type=submit]{-webkit-appearance:button}button::-moz-focus-inner,[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner{border-style:none;padding:0}button:-moz-focusring,[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}template{display:none}[hidden]{display:none}.chroma{color:#f8f8f2;background-color:#272822}.chroma .err{color:#960050;background-color:#1e0010}.chroma .lntd{vertical-align:top;padding:0;margin:0;border:0}.chroma .lntable{border-spacing:0;padding:0;margin:0;border:0;width:auto;overflow:auto;display:block}.chroma .hl{display:block;width:100%;background-color:#ffc}.chroma .lnt{margin-right:.4em;padding:0 .4em;color:#7f7f7f}.chroma .ln{margin-right:.4em;padding:0 .4em;color:#7f7f7f}.chroma .k{color:#66d9ef}.chroma .kc{color:#66d9ef}.chroma .kd{color:#66d9ef}.chroma .kn{color:#f92672}.chroma .kp{color:#66d9ef}.chroma .kr{color:#66d9ef}.chroma .kt{color:#66d9ef}.chroma .na{color:#a6e22e}.chroma .nc{color:#a6e22e}.chroma .no{color:#66d9ef}.chroma .nd{color:#a6e22e}.chroma .ne{color:#a6e22e}.chroma .nf{color:#a6e22e}.chroma .nx{color:#a6e22e}.chroma .nt{color:#f92672}.chroma .l{color:#ae81ff}.chroma .ld{color:#e6db74}.chroma .s{color:#e6db74}.chroma .sa{color:#e6db74}.chroma .sb{color:#e6db74}.chroma .sc{color:#e6db74}.chroma .dl{color:#e6db74}.chroma .sd{color:#e6db74}.chroma .s2{color:#e6db74}.chroma .se{color:#ae81ff}.chroma .sh{color:#e6db74}.chroma .si{color:#e6db74}.chroma .sx{color:#e6db74}.chroma .sr{color:#e6db74}.chroma .s1{color:#e6db74}.chroma .ss{color:#e6db74}.chroma .m{color:#ae81ff}.chroma .mb{color:#ae81ff}.chroma .mf{color:#ae81ff}.chroma .mh{color:#ae81ff}.chroma .mi{color:#ae81ff}.chroma .il{color:#ae81ff}.chroma .mo{color:#ae81ff}.chroma .o{color:#f92672}.chroma .ow{color:#f92672}.chroma .c{color:#75715e}.chroma .ch{color:#75715e}.chroma .cm{color:#75715e}.chroma .c1{color:#75715e}.chroma .cs{color:#75715e}.chroma .cp{color:#75715e}.chroma .cpf{color:#75715e}.chroma .gd{color:#f92672}.chroma .ge{font-style:italic}.chroma .gi{color:#a6e22e}.chroma .gs{font-weight:700}.chroma .gu{color:#75715e}html,body{height:100%;width:100%;overflow-x:hidden}html{margin:0;line-height:170%;-ms-overflow-style:-ms-autohiding-scrollbar}body{color:#5f5f5f;font-family:noto sans,segoe ui,helvetica neue,Helvetica,Roboto,FreeSans,sans-serif;margin:0;font-size:1.1rem}article p a{text-decoration:underline;text-decoration-skip-ink:auto;color:#5f5f5f}article .post-footer>a{text-decoration:none}h1{font-size:1.9em;padding-top:.2em;margin:.5em 0 .75em;font-family:noto serif,segoe ui,helvetica neue,Helvetica,Roboto,FreeSans,serif;font-weight:600;line-height:1.3em}h2,h3,h4,h5,h6{margin:1.25em 0 .75em;font-family:noto serif,segoe ui,helvetica neue,Helvetica,Roboto,FreeSans,serif;font-weight:600}h2{font-size:1.25em;line-height:1.4em}h2 a{text-decoration:none;position:relative;text-shadow:0 -2px 0 #fff,0 -1px 0 #fff,0 0 0 #fff,2px -2px 0 #fff,2px -1px 0 #fff,2px 0 0 #fff,-2px -2px 0 #fff,-2px -1px 0 #fff,-2px 0 0 #fff,1px -2px 0 #fff,1px -1px 0 #fff,1px 0 0 #fff,-1px -2px 0 #fff,-1px -1px 0 #fff,-1px 0 0 #fff,0 -2px 0 #fff,0 -1px 0 #fff,0 0 0 #fff;box-shadow:0 -1px 0 0 #fff inset,0 -2px 0 0 transparent inset;background-size:1px 1em;position:relative;transition:all .6s cubic-bezier(0.075,0.82,0.165,1)}h2 a:hover{box-shadow:0 -1px 0 0 #fff inset,0 -2px 0 0 #5f5f5f inset;transition:all 1s cubic-bezier(0.075,0.82,0.165,1)}h5,h6{font-weight:700;line-height:1.3em}h4{line-height:1.3em}h3{font-size:1.1em;line-height:1.3em}p{margin:0 0 1em}a{text-decoration:underline;text-decoration-skip-ink:auto;color:#5f5f5f}a,a>svg{transition:.1s cubic-bezier(0.075,0.82,0.165,1)}a:visited{color:#5f5f5f}.color-link{text-decoration:none;color:#63bda2;font-family:noto sans,segoe ui,helvetica neue,Helvetica,Roboto,FreeSans,sans-serif;margin-right:1.5em}.color-link:visited{color:#63bda2}.color-link:hover{color:#359377}.color-link:hover .color-arrow{fill:#359377}.tag{margin-right:.75em;margin-bottom:1em;line-height:1.75em;color:#ababab}.tag:visited{color:#ababab}.tag:hover{color:#898989}time{margin-right:1.5em;color:#ababab}hr{border:0;height:0;border-bottom:1px solid #d2d2d2}ul,ol{margin:1em 0;padding-left:2em}li{line-height:150%}mark{background-color:#ffec5c}blockquote{border-left:4px solid #d2d2d2;padding-left:1.3em;margin-left:0;margin-top:0}blockquote p{margin-bottom:0}cite{font-size:.95em}pre{padding:1em;background-color:#f7f7f7;max-width:100%;overflow:scroll}p code,kbd{font-size:.95rem;background:#f7f7f7;padding:.2em}code,pre,kbd{font-family:Menlo,Monaco,courier new,monospace;font-size:.95rem;line-height:154%}.table-wrapper{overflow-x:auto}table{max-width:100%;border-spacing:0}table thead{background:#f7f7f7}table th,table td{padding:.5em 1em;border:1px double #eee}nav{padding:.25em 1.5em 1em;max-width:100%}.site-title{margin:1.5em 0 1em;text-align:center;line-height:1.7em}.site-title a{font-family:noto serif,segoe ui,helvetica neue,Helvetica,Roboto,FreeSans,serif;font-size:1.5em;text-decoration:none;margin-top:.75em}.nav-menu{display:flex;flex-direction:row;justify-content:center;flex-wrap:wrap}.nav-link{margin-bottom:.5em}.description{font-style:italic;color:#898989;text-align:center;margin-bottom:3.7em;margin-top:-.75em}.content-container{padding:.5em 1.5em 0;margin:0;max-width:100%}.paginator{flex-shrink:0;display:flex;justify-content:space-between;align-items:flex-end;margin-top:1em;padding-bottom:1.5em;align-items:center}.paginator .older{margin-left:1em}.paginator p{font-size:.95rem;margin:0}.paginator a{text-decoration:none;color:#63bda2;font-size:.95rem}.article-content{flex:1 0 auto}.article-figure{margin:0 0 1em}.article-image{max-width:100%;margin:0 0 1em}.canon{width:100%;height:auto}.footnote-ref a{margin-left:.3em}.footnote-ref a::before{content:"["}.footnote-ref a::after{content:"]"}.emojify{font-family:Apple Color Emoji,Segoe UI Emoji,NotoColorEmoji,Segoe UI Symbol,Android Emoji,EmojiSymbols;font-size:1.5rem;vertical-align:middle}.twitter-tweet{font-family:noto sans,segoe ui,helvetica neue,Helvetica,Roboto,FreeSans,sans-serif!important;border-left:4px solid #63bda2!important;color:#5f5f5f!important;font-size:1rem!important;font-style:italic!important;margin-left:0;padding-left:1.3em!important}.twitter-tweet p{font-size:1.1em;font-style:normal;margin-bottom:1em;line-height:155%}.twitter-tweet a{color:#5f5f5f!important;text-decoration:underline!important}.twitter-tweet a:hover,.twitter-tweet a:focus{text-decoration:underline!important}.__h_instagram.card{font-family:noto sans,segoe ui,helvetica neue,Helvetica,Roboto,FreeSans,sans-serif!important;font-size:1.1em!important;border:1px solid #ababab;margin-top:1.2em!important}.kofi-button{margin:.75em 0 .5em}.post-footer{font-size:.95rem;color:#ababab;border-bottom:1px solid #d2d2d2;padding-bottom:1.8em}.hidden{visibility:hidden;border-bottom:0 solid}.page-footer{padding:1.5em 0 2em;font-size:.95rem;color:#ababab}.page-footer a{text-decoration:none;color:#ababab}.footer-divider{color:#d2d2d2;margin-bottom:1.5em}.archives-list{padding-left:0}.archives-list-item{display:flex;margin:.5em 0}.archives-list-item-date{width:60px;margin-right:.25em;color:#ababab}.not-found-title{margin-bottom:0}.footer{visibility:hidden;height:0}.footer-mobile{margin-top:2em;max-width:100%;padding:0 1.5em .75em;overflow:hidden}.footer-mobile .footer-mobile-links{display:flex;justify-content:center}.footer-mobile .divider-bar{color:#ababab;padding:0 .25em}footer{text-align:center}footer .social-icons{margin:0 0 1.25em -.5em}footer .social-icon{padding:.3em .5em;margin:.32em .1em;display:inline-block;height:2em;position:relative}footer .social-icon>svg:hover{fill:#898989}footer a{text-decoration:none;font-size:.95rem;color:#ababab}footer a:visited{color:#ababab}footer a:hover{color:#898989}@media only screen and (min-width:900px){nav{position:fixed;overflow-y:scroll;height:100%;top:0;left:36px;width:240px;padding:0}.site-title{margin:3em 0 1em;text-align:left}.nav-menu{display:flex;flex-direction:column;align-items:flex-start}.nav-link{margin-bottom:.5em}.description{text-align:left;padding:1.55em 0 .5em;border-bottom:none;margin-bottom:1em;margin-top:0}.article-content{margin-top:1.4em}.paginator{padding-bottom:2em}.content-container{max-width:680px;margin-left:310px;padding:0 1.5em 0 0;height:100%;display:flex;flex-direction:column}.content-container h1{font-size:1.9em;border-top:none;padding-top:0;margin-top:1.4em}.post-title{border-top:none;padding-top:0;margin-top:.75em}.page-footer{border-bottom:none}.footer{position:relative;visibility:visible;margin-top:1em;text-align:left}.footer-mobile{visibility:hidden;height:0;padding:0;margin:0;overflow:hidden}.social-icons{width:100%}} \ No newline at end of file diff --git a/resources/_gen/assets/scss/css/main.scss_48b060fe05b0a273d182ef83c0605941.json b/resources/_gen/assets/scss/css/main.scss_48b060fe05b0a273d182ef83c0605941.json new file mode 100644 index 0000000..c13c2ca --- /dev/null +++ b/resources/_gen/assets/scss/css/main.scss_48b060fe05b0a273d182ef83c0605941.json @@ -0,0 +1 @@ +{"Target":"css/main.min.63808615fc62cbc530414bd85d9c94ae4e989425ab018a75e3aab4f6a3fe4d20.css","MediaType":"text/css","Data":{"Integrity":"sha256-Y4CGFfxiy8UwQUvYXZyUrk6YlCWrAYp146q09qP+TSA="}} \ No newline at end of file diff --git a/resources/_gen/assets/scss/sass/main.scss_48b060fe05b0a273d182ef83c0605941.content b/resources/_gen/assets/scss/sass/main.scss_48b060fe05b0a273d182ef83c0605941.content new file mode 100644 index 0000000..672aec2 --- /dev/null +++ b/resources/_gen/assets/scss/sass/main.scss_48b060fe05b0a273d182ef83c0605941.content @@ -0,0 +1 @@ +@charset "UTF-8";@font-face{font-family:chancery;src:url(../fonts/chancery/apple-chancery-webfont.eot);src:local("Apple Chancery"),url(../fonts/chancery/apple-chancery-webfont.eot?#iefix)format("embedded-opentype"),url(../fonts/chancery/apple-chancery-webfont.woff2)format("woff2"),url(../fonts/chancery/apple-chancery-webfont.woff)format("woff"),url(../fonts/chancery/apple-chancery-webfont.ttf)format("truetype"),url(../fonts/chancery/apple-chancery-webfont.svg#apple-chancery)format("svg");font-weight:lighter;font-style:normal}.post .post-content a.reference-link{font-weight:700;font-style:italic;font-color:#34495e;color:#34495e}.post .post-content a.reference-link:hover{border-bottom-color:#c05b4d #f8f5ec}.post .post-content a.bibtex-entry:target{background-color:#ffa}/*!normalize.css v3.0.2 | MIT License | git.io/normalize*/html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{font-size:2em;margin:.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}html{font-size:16px;box-sizing:border-box}body{padding:0;margin:0;font-family:source sans pro,helvetica neue,Arial,sans-serif;font-weight:400;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;line-height:1.5;color:#34495e;background:#fefefe;scroll-behavior:smooth;border-top:3px solid #c05b4d}@media screen and (max-width:800px){body{border-top:0}}::selection{background:#c05b4d;color:#fff}img{max-width:100%;height:auto;display:inline-block;vertical-align:middle}a{color:#34495e;text-decoration:none}h1{font-size:26px;font-family:Athelas,STHeiti,Microsoft Yahei,serif}h2{font-size:24px;font-family:Athelas,STHeiti,Microsoft Yahei,serif}h3{font-size:20px;font-family:Athelas,STHeiti,Microsoft Yahei,serif}h4{font-size:16px;font-family:Athelas,STHeiti,Microsoft Yahei,serif}h5{font-size:14px;font-family:Athelas,STHeiti,Microsoft Yahei,serif}h6{font-size:14px;font-family:Athelas,STHeiti,Microsoft Yahei,serif}.container{margin:0 auto;width:800px}@media screen and (max-width:800px){.container{width:100%;box-shadow:-1px -5px 5px #cacaca}}.content-wrapper{padding:0 20px}.video-container{position:relative;padding-bottom:56.25%;padding-top:25px;height:0}.video-container iframe{position:absolute;top:0;left:0;width:100%;height:100%}@font-face{font-family:iconfont;src:url(../fonts/iconfont/iconfont.eot);src:url(../fonts/iconfont/iconfont.eot#iefix)format("embedded-opentype"),url(../fonts/iconfont/iconfont.woff)format("woff"),url(../fonts/iconfont/iconfont.ttf)format("truetype"),url(../fonts/iconfont/iconfont.svg#iconfont)format("svg")}.iconfont{font-family:iconfont!important;speak:none;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-text-stroke-width:.2px;cursor:pointer;letter-spacing:0;font-feature-settings:"liga";font-variant-ligatures:discretionary-ligatures;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.icon-bilibili:before{content:"\e900";font-size:.9em;position:relative;top:-4px}.icon-instagram:before{font-size:.95em;content:"\e611";position:relative;top:1px}.icon-douban:before{content:"\e610";position:relative;top:2px}.icon-tumblr:before{content:"\e69f";font-size:.85em;position:relative;top:-2px}.icon-linkedin:before{content:"\e60d";position:relative;top:-2px}.icon-twitter:before{content:"\e600"}.icon-weibo:before{content:"\e602";position:relative;top:2px}.icon-stack-overflow:before{content:"\e902";font-size:.85em;position:relative;top:-4px}.icon-email:before{content:"\e605";position:relative;top:-2px}.icon-facebook:before{content:"\e601";font-size:.95em;position:relative;top:-2px}.icon-gitlab:before{content:"\e901";font-size:.9em;position:relative;top:-4px}.icon-github:before{content:"\e606";position:relative;top:-1px}.icon-rss:before{content:"\e604"}.icon-google:before{content:"\e609";position:relative;top:2px}.icon-zhihu:before{content:"\e607";font-size:.9em}.icon-pocket:before{content:"\e856";position:relative;top:2px}.icon-heart:before{content:"\e608"}.icon-right:before{content:"\e60a"}.icon-left:before{content:"\e60b"}.icon-up:before{content:"\e60c"}.icon-close:before{content:"\e60f"}.icon-link:before{content:"\e909"}.header{padding:20px}.header:before,.header:after{content:" ";display:table}.header:after{clear:both}.header .logo-wrapper{float:left}.header .logo-wrapper .logo{font-size:48px;font-family:chancery,cursive,LiSu,sans-serif}@media screen and (max-width:800px){.header .logo-wrapper{display:none}}.header .site-navbar{float:right}.header .site-navbar .menu{display:inline-block;position:relative;padding-left:0;padding-right:25px;font-family:Athelas,STHeiti,Microsoft Yahei,serif}.header .site-navbar .menu .menu-item{display:inline-block;display:inline-block;vertical-align:middle;transform:translateZ(0);backface-visibility:hidden;box-shadow:0 0 1px transparent;position:relative;overflow:hidden}.header .site-navbar .menu .menu-item+.menu-item{margin-left:10px}.header .site-navbar .menu .menu-item:before{content:'';position:absolute;z-index:-1;height:2px;bottom:0;left:51%;right:51%;background:#c05b4d;transition-duration:.2s;transition-property:right,left;transition-timing-function:ease-out}.header .site-navbar .menu .menu-item.active:before,.header .site-navbar .menu .menu-item:active:before,.header .site-navbar .menu .menu-item:focus:before,.header .site-navbar .menu .menu-item:hover:before{right:0;left:0}.header .site-navbar .menu .menu-item-link{font-size:18px}@media screen and (max-width:800px){.header .site-navbar{display:none}}@media screen and (max-width:800px){.header{padding:50px 0 0;text-align:center}}.posts{margin-bottom:20px;border-bottom:1px solid #e6e6e6}.post{padding:1.5em 0}.post+.post{border-top:1px solid #e6e6e6}.post .post-header{margin-bottom:20px}.post .post-header .post-title{margin:0;font-size:27px;font-weight:400;font-family:Athelas,STHeiti,Microsoft Yahei,serif}.post .post-header .post-link{display:inline-block;vertical-align:middle;transform:translateZ(0);backface-visibility:hidden;box-shadow:0 0 1px transparent;position:relative;overflow:hidden}.post .post-header .post-link:before{content:'';position:absolute;z-index:-1;height:2px;bottom:0;left:51%;right:51%;background:#c05b4d;transition-duration:.2s;transition-property:right,left;transition-timing-function:ease-out}.post .post-header .post-link.active:before,.post .post-header .post-link:active:before,.post .post-header .post-link:focus:before,.post .post-header .post-link:hover:before{right:0;left:0}.post .post-header .post-meta{font-size:14px;color:#8a8a8a}.post .post-header .post-meta .post-time{font-size:15px}.post .post-header .post-meta .post-category{display:inline}.post .post-header .post-meta .post-category a{color:inherit}.post .post-header .post-meta .post-category a::before{content:'·'}.post .post-header .post-meta .post-category a:hover{color:#c05b4d}.post .post-header .post-meta .more-meta::before{content:'·'}.post .post-toc{position:absolute;width:200px;margin-left:785px;padding:10px;font-family:Athelas,STHeiti,Microsoft Yahei,serif;border-radius:5px;background:rgba(248,245,236,.6);box-shadow:1px 1px 2px rgba(0,0,0,.125);word-wrap:break-word;box-sizing:border-box}.post .post-toc .post-toc-title{margin:0 10px;font-size:20px;font-weight:400;text-transform:uppercase}.post .post-toc .post-toc-content{font-size:15px}.post .post-toc .post-toc-content.always-active ul{display:block}.post .post-toc .post-toc-content>nav>ul{margin:10px 0}.post .post-toc .post-toc-content ul{padding-left:20px;list-style:square}.post .post-toc .post-toc-content ul ul{padding-left:15px;display:none}.post .post-toc .post-toc-content ul .has-active>ul{display:block}.post .post-toc .post-toc-content .toc-link.active{color:#c05b4d}@media screen and (max-width:1185px){.post .post-toc{display:none}}.post .post-content{word-wrap:break-word}.post .post-content h1{font-weight:400;font-family:Athelas,STHeiti,Microsoft Yahei,serif}.post .post-content h1 .anchor{float:left;line-height:1;margin-left:-20px;padding-right:4px}.post .post-content h1 .anchor:hover{border-bottom:initial}.post .post-content h1 .anchor .icon-link{visibility:hidden;font-size:16px}.post .post-content h1 .anchor .icon-link:before{vertical-align:middle}.post .post-content h1:hover .icon-link{visibility:visible}.post .post-content h2{font-weight:400;font-family:Athelas,STHeiti,Microsoft Yahei,serif}.post .post-content h2 .anchor{float:left;line-height:1;margin-left:-20px;padding-right:4px}.post .post-content h2 .anchor:hover{border-bottom:initial}.post .post-content h2 .anchor .icon-link{visibility:hidden;font-size:16px}.post .post-content h2 .anchor .icon-link:before{vertical-align:middle}.post .post-content h2:hover .icon-link{visibility:visible}.post .post-content h3{font-weight:400;font-family:Athelas,STHeiti,Microsoft Yahei,serif}.post .post-content h3 .anchor{float:left;line-height:1;margin-left:-20px;padding-right:4px}.post .post-content h3 .anchor:hover{border-bottom:initial}.post .post-content h3 .anchor .icon-link{visibility:hidden;font-size:16px}.post .post-content h3 .anchor .icon-link:before{vertical-align:middle}.post .post-content h3:hover .icon-link{visibility:visible}.post .post-content h4{font-weight:400;font-family:Athelas,STHeiti,Microsoft Yahei,serif}.post .post-content h4 .anchor{float:left;line-height:1;margin-left:-20px;padding-right:4px}.post .post-content h4 .anchor:hover{border-bottom:initial}.post .post-content h4 .anchor .icon-link{visibility:hidden;font-size:16px}.post .post-content h4 .anchor .icon-link:before{vertical-align:middle}.post .post-content h4:hover .icon-link{visibility:visible}.post .post-content h5{font-weight:400;font-family:Athelas,STHeiti,Microsoft Yahei,serif}.post .post-content h5 .anchor{float:left;line-height:1;margin-left:-20px;padding-right:4px}.post .post-content h5 .anchor:hover{border-bottom:initial}.post .post-content h5 .anchor .icon-link{visibility:hidden;font-size:16px}.post .post-content h5 .anchor .icon-link:before{vertical-align:middle}.post .post-content h5:hover .icon-link{visibility:visible}.post .post-content h6{font-weight:400;font-family:Athelas,STHeiti,Microsoft Yahei,serif}.post .post-content h6 .anchor{float:left;line-height:1;margin-left:-20px;padding-right:4px}.post .post-content h6 .anchor:hover{border-bottom:initial}.post .post-content h6 .anchor .icon-link{visibility:hidden;font-size:16px}.post .post-content h6 .anchor .icon-link:before{vertical-align:middle}.post .post-content h6:hover .icon-link{visibility:visible}.post .post-content a{color:#c05b4d;word-break:break-all}.post .post-content a:hover{border-bottom:1px solid #c05b4d}.post .post-content blockquote{margin:2em 0;padding:10px 20px;position:relative;color:rgba(52,73,94,.8);background-color:rgba(192,91,77,.05);border-left:3px solid rgba(192,91,77,.3);box-shadow:1px 1px 2px rgba(0,0,0,.125)}.post .post-content blockquote p{margin:0}.post .post-content figure{justify-content:center;align-items:center}.post .post-content figure img{display:block;margin-right:auto;margin-left:auto}.post .post-content img{display:inline-block;max-width:100%}.post .post-content .table-wrapper{overflow-x:auto}.post .post-content .table-wrapper>table{max-width:100%;margin:10px 0;border-spacing:0;box-shadow:2px 2px 3px rgba(0,0,0,.125)}.post .post-content .table-wrapper>table thead{background:#f8f5ec}.post .post-content .table-wrapper>table th,.post .post-content .table-wrapper>table td{padding:5px 15px;border:1px double #f4efe1}.post .post-content .table-wrapper>table tr:hover{background-color:#f8f5ec}.post .post-content code,.post .post-content pre{padding:7px;font-size:.9em;font-family:Consolas,Monaco,Menlo,dejavu sans mono,bitstream vera sans mono,courier new,monospace;background:#f8f5ec}.post .post-content code{padding:3px 5px;border-radius:4px;color:#c7254e}.post .post-content figure.highlight{margin:1em 0;border-radius:5px;overflow-x:auto;box-shadow:1px 1px 2px rgba(0,0,0,.125);position:relative}.post .post-content figure.highlight table{position:relative}.post .post-content figure.highlight table::after{position:absolute;top:0;right:0;left:0;padding:2px 7px;font-size:.9em;font-weight:700;color:#b1b1b1;background:#f4efe1;content:'Code'}.post .post-content figure.highlight.language-bash>table::after{content:"Bash"}.post .post-content figure.highlight.language-c>table::after{content:"C"}.post .post-content figure.highlight.language-cs>table::after{content:"C#"}.post .post-content figure.highlight.language-cpp>table::after{content:"C++"}.post .post-content figure.highlight.language-css>table::after{content:"CSS"}.post .post-content figure.highlight.language-coffeescript>table::after{content:"CoffeeScript"}.post .post-content figure.highlight.language-html>table::after{content:"HTML"}.post .post-content figure.highlight.language-xml>table::after{content:"XML"}.post .post-content figure.highlight.language-http>table::after{content:"HTTP"}.post .post-content figure.highlight.language-json>table::after{content:"JSON"}.post .post-content figure.highlight.language-java>table::after{content:"Java"}.post .post-content figure.highlight.language-js>table::after{content:"JavaScript"}.post .post-content figure.highlight.language-javascript>table::after{content:"JavaScript"}.post .post-content figure.highlight.language-makefile>table::after{content:"Makefile"}.post .post-content figure.highlight.language-markdown>table::after{content:"Markdown"}.post .post-content figure.highlight.language-objectivec>table::after{content:"Objective-C"}.post .post-content figure.highlight.language-php>table::after{content:"PHP"}.post .post-content figure.highlight.language-perl>table::after{content:"Perl"}.post .post-content figure.highlight.language-python>table::after{content:"Python"}.post .post-content figure.highlight.language-ruby>table::after{content:"Ruby"}.post .post-content figure.highlight.language-sql>table::after{content:"SQL"}.post .post-content figure.highlight.language-shell>table::after{content:"Shell"}.post .post-content figure.highlight.language-erlang>table::after{content:"Erlang"}.post .post-content figure.highlight.language-go>table::after{content:"Go"}.post .post-content figure.highlight.language-go-html-template>table::after{content:"Go HTML Template"}.post .post-content figure.highlight.language-groovy>table::after{content:"Groovy"}.post .post-content figure.highlight.language-haskell>table::after{content:"Haskell"}.post .post-content figure.highlight.language-kotlin>table::after{content:"Kotlin"}.post .post-content figure.highlight.language-clojure>table::after{content:"Clojure"}.post .post-content figure.highlight.language-less>table::after{content:"Less"}.post .post-content figure.highlight.language-lisp>table::after{content:"Lisp"}.post .post-content figure.highlight.language-lua>table::after{content:"Lua"}.post .post-content figure.highlight.language-matlab>table::after{content:"Matlab"}.post .post-content figure.highlight.language-rust>table::after{content:"Rust"}.post .post-content figure.highlight.language-scss>table::after{content:"Scss"}.post .post-content figure.highlight.language-scala>table::after{content:"Scala"}.post .post-content figure.highlight.language-swift>table::after{content:"Swift"}.post .post-content figure.highlight.language-typescript>table::after{content:"TypeScript"}.post .post-content figure.highlight.language-yml>table::after{content:"YAML"}.post .post-content figure.highlight.language-yaml>table::after{content:"YAML"}.post .post-content figure.highlight.language-toml>table::after{content:"TOML"}.post .post-content figure.highlight.language-diff>table::after{content:"Diff"}.post .post-content figure.highlight .code pre{margin:0;padding:30px 10px 10px}.post .post-content figure.highlight .gutter{width:10px;color:#cacaca}.post .post-content figure.highlight .gutter pre{margin:0;padding:30px 7px 10px}.post .post-content figure.highlight .line{height:1em}.post .post-content figure.highlight table,.post .post-content figure.highlight tr,.post .post-content figure.highlight td{margin:0;padding:0;width:100%;border-collapse:collapse}.post .post-content figure.highlight .code .hljs-comment,.post .post-content figure.highlight .code .hljs-quote{color:#93a1a1}.post .post-content figure.highlight .code .hljs-keyword,.post .post-content figure.highlight .code .hljs-selector-tag,.post .post-content figure.highlight .code .hljs-addition{color:#859900}.post .post-content figure.highlight .code .hljs-number,.post .post-content figure.highlight .code .hljs-string,.post .post-content figure.highlight .code .hljs-meta .hljs-meta-string,.post .post-content figure.highlight .code .hljs-literal,.post .post-content figure.highlight .code .hljs-doctag,.post .post-content figure.highlight .code .hljs-regexp{color:#2aa198}.post .post-content figure.highlight .code .hljs-title,.post .post-content figure.highlight .code .hljs-section,.post .post-content figure.highlight .code .hljs-name,.post .post-content figure.highlight .code .hljs-selector-id,.post .post-content figure.highlight .code .hljs-selector-class{color:#268bd2}.post .post-content figure.highlight .code .hljs-attribute,.post .post-content figure.highlight .code .hljs-attr,.post .post-content figure.highlight .code .hljs-variable,.post .post-content figure.highlight .code .hljs-template-variable,.post .post-content figure.highlight .code .hljs-class .hljs-title,.post .post-content figure.highlight .code .hljs-type{color:#b58900}.post .post-content figure.highlight .code .hljs-symbol,.post .post-content figure.highlight .code .hljs-bullet,.post .post-content figure.highlight .code .hljs-subst,.post .post-content figure.highlight .code .hljs-meta,.post .post-content figure.highlight .code .hljs-meta .hljs-keyword,.post .post-content figure.highlight .code .hljs-selector-attr,.post .post-content figure.highlight .code .hljs-selector-pseudo,.post .post-content figure.highlight .code .hljs-link{color:#cb4b16}.post .post-content figure.highlight .code .hljs-built_in,.post .post-content figure.highlight .code .hljs-deletion{color:#dc322f}.post .post-content figure.highlight .code .hljs-formula{background:#eee8d5}.post .post-content figure.highlight .code .hljs-emphasis{font-style:italic}.post .post-content figure.highlight .code .hljs-strong{font-weight:700}.post .post-content .highlight>.chroma{margin:1em 0;border-radius:5px;overflow-x:auto;box-shadow:1px 1px 2px rgba(0,0,0,.125);position:relative;background:#f8f5ec}.post .post-content .highlight>.chroma code{padding:0}.post .post-content .highlight>.chroma table{position:relative}.post .post-content .highlight>.chroma table::after{position:absolute;top:0;right:0;left:0;padding:2px 7px;font-size:.9em;font-weight:700;color:#b1b1b1;background:#f4efe1;content:'Code'}.post .post-content .highlight>.chroma.language-bash>table::after{content:"Bash"}.post .post-content .highlight>.chroma.language-c>table::after{content:"C"}.post .post-content .highlight>.chroma.language-cs>table::after{content:"C#"}.post .post-content .highlight>.chroma.language-cpp>table::after{content:"C++"}.post .post-content .highlight>.chroma.language-css>table::after{content:"CSS"}.post .post-content .highlight>.chroma.language-coffeescript>table::after{content:"CoffeeScript"}.post .post-content .highlight>.chroma.language-html>table::after{content:"HTML"}.post .post-content .highlight>.chroma.language-xml>table::after{content:"XML"}.post .post-content .highlight>.chroma.language-http>table::after{content:"HTTP"}.post .post-content .highlight>.chroma.language-json>table::after{content:"JSON"}.post .post-content .highlight>.chroma.language-java>table::after{content:"Java"}.post .post-content .highlight>.chroma.language-js>table::after{content:"JavaScript"}.post .post-content .highlight>.chroma.language-javascript>table::after{content:"JavaScript"}.post .post-content .highlight>.chroma.language-makefile>table::after{content:"Makefile"}.post .post-content .highlight>.chroma.language-markdown>table::after{content:"Markdown"}.post .post-content .highlight>.chroma.language-objectivec>table::after{content:"Objective-C"}.post .post-content .highlight>.chroma.language-php>table::after{content:"PHP"}.post .post-content .highlight>.chroma.language-perl>table::after{content:"Perl"}.post .post-content .highlight>.chroma.language-python>table::after{content:"Python"}.post .post-content .highlight>.chroma.language-ruby>table::after{content:"Ruby"}.post .post-content .highlight>.chroma.language-sql>table::after{content:"SQL"}.post .post-content .highlight>.chroma.language-shell>table::after{content:"Shell"}.post .post-content .highlight>.chroma.language-erlang>table::after{content:"Erlang"}.post .post-content .highlight>.chroma.language-go>table::after{content:"Go"}.post .post-content .highlight>.chroma.language-go-html-template>table::after{content:"Go HTML Template"}.post .post-content .highlight>.chroma.language-groovy>table::after{content:"Groovy"}.post .post-content .highlight>.chroma.language-haskell>table::after{content:"Haskell"}.post .post-content .highlight>.chroma.language-kotlin>table::after{content:"Kotlin"}.post .post-content .highlight>.chroma.language-clojure>table::after{content:"Clojure"}.post .post-content .highlight>.chroma.language-less>table::after{content:"Less"}.post .post-content .highlight>.chroma.language-lisp>table::after{content:"Lisp"}.post .post-content .highlight>.chroma.language-lua>table::after{content:"Lua"}.post .post-content .highlight>.chroma.language-matlab>table::after{content:"Matlab"}.post .post-content .highlight>.chroma.language-rust>table::after{content:"Rust"}.post .post-content .highlight>.chroma.language-scss>table::after{content:"Scss"}.post .post-content .highlight>.chroma.language-scala>table::after{content:"Scala"}.post .post-content .highlight>.chroma.language-swift>table::after{content:"Swift"}.post .post-content .highlight>.chroma.language-typescript>table::after{content:"TypeScript"}.post .post-content .highlight>.chroma.language-yml>table::after{content:"YAML"}.post .post-content .highlight>.chroma.language-yaml>table::after{content:"YAML"}.post .post-content .highlight>.chroma.language-toml>table::after{content:"TOML"}.post .post-content .highlight>.chroma.language-diff>table::after{content:"Diff"}.post .post-content .highlight>.chroma .lntd{line-height:1em}.post .post-content .highlight>.chroma .lntd:first-child{width:10px}.post .post-content .highlight>.chroma .lntd:first-child pre{margin:0;padding:30px 7px 10px}.post .post-content .highlight>.chroma .lntd:last-child{vertical-align:top}.post .post-content .highlight>.chroma .lntd:last-child pre{margin:0;padding:30px 10px 10px}.post .post-content .highlight>.chroma table,.post .post-content .highlight>.chroma tr,.post .post-content .highlight>.chroma td{margin:0;padding:0;width:100%;border-collapse:collapse}.post .post-content .highlight>.chroma .lnt{color:#cacaca}.post .post-content .highlight>.chroma .hl{display:block;width:100%;background-color:#ffc}.post .post-content .highlight>.chroma .k{color:#859900}.post .post-content .highlight>.chroma .kc{color:#859900;font-weight:700}.post .post-content .highlight>.chroma .kd{color:#859900}.post .post-content .highlight>.chroma .kn{color:#dc322f;font-weight:700}.post .post-content .highlight>.chroma .kp{color:#859900}.post .post-content .highlight>.chroma .kr{color:#859900}.post .post-content .highlight>.chroma .kt{color:#859900;font-weight:700}.post .post-content .highlight>.chroma .n{color:#268bd2}.post .post-content .highlight>.chroma .na{color:#268bd2}.post .post-content .highlight>.chroma .nb{color:#cb4b16}.post .post-content .highlight>.chroma .bp{color:#268bd2}.post .post-content .highlight>.chroma .nc{color:#cb4b16}.post .post-content .highlight>.chroma .no{color:#268bd2}.post .post-content .highlight>.chroma .nd{color:#268bd2}.post .post-content .highlight>.chroma .ni{color:#268bd2}.post .post-content .highlight>.chroma .ne{color:#268bd2}.post .post-content .highlight>.chroma .nf{color:#268bd2}.post .post-content .highlight>.chroma .fm{color:#268bd2}.post .post-content .highlight>.chroma .nl{color:#268bd2}.post .post-content .highlight>.chroma .nn{color:#268bd2}.post .post-content .highlight>.chroma .nx{color:#268bd2}.post .post-content .highlight>.chroma .py{color:#268bd2}.post .post-content .highlight>.chroma .nt{color:#268bd2;font-weight:700}.post .post-content .highlight>.chroma .nv{color:#268bd2}.post .post-content .highlight>.chroma .vc{color:#268bd2}.post .post-content .highlight>.chroma .vg{color:#268bd2}.post .post-content .highlight>.chroma .vi{color:#268bd2}.post .post-content .highlight>.chroma .vm{color:#268bd2}.post .post-content .highlight>.chroma .l{color:#2aa198}.post .post-content .highlight>.chroma .ld{color:#2aa198}.post .post-content .highlight>.chroma .s{color:#2aa198}.post .post-content .highlight>.chroma .sa{color:#2aa198}.post .post-content .highlight>.chroma .sb{color:#2aa198}.post .post-content .highlight>.chroma .sc{color:#2aa198}.post .post-content .highlight>.chroma .dl{color:#2aa198}.post .post-content .highlight>.chroma .sd{color:#2aa198}.post .post-content .highlight>.chroma .s2{color:#2aa198}.post .post-content .highlight>.chroma .se{color:#2aa198}.post .post-content .highlight>.chroma .sh{color:#2aa198}.post .post-content .highlight>.chroma .si{color:#2aa198}.post .post-content .highlight>.chroma .sx{color:#2aa198}.post .post-content .highlight>.chroma .sr{color:#2aa198}.post .post-content .highlight>.chroma .s1{color:#2aa198}.post .post-content .highlight>.chroma .ss{color:#2aa198}.post .post-content .highlight>.chroma .m{color:#2aa198;font-weight:700}.post .post-content .highlight>.chroma .mb{color:#2aa198;font-weight:700}.post .post-content .highlight>.chroma .mf{color:#2aa198;font-weight:700}.post .post-content .highlight>.chroma .mh{color:#2aa198;font-weight:700}.post .post-content .highlight>.chroma .mi{color:#2aa198;font-weight:700}.post .post-content .highlight>.chroma .il{color:#2aa198;font-weight:700}.post .post-content .highlight>.chroma .mo{color:#2aa198;font-weight:700}.post .post-content .highlight>.chroma .ow{color:#859900}.post .post-content .highlight>.chroma .c{color:#93a1a1;font-style:italic}.post .post-content .highlight>.chroma .ch{color:#93a1a1;font-style:italic}.post .post-content .highlight>.chroma .cm{color:#93a1a1;font-style:italic}.post .post-content .highlight>.chroma .c1{color:#93a1a1;font-style:italic}.post .post-content .highlight>.chroma .cs{color:#93a1a1;font-style:italic}.post .post-content .highlight>.chroma .cp{color:#93a1a1;font-style:italic}.post .post-content .highlight>.chroma .cpf{color:#93a1a1;font-style:italic}.post .post-content .highlight>.chroma .g{color:#d33682}.post .post-content .highlight>.chroma .gd{color:#b58900}.post .post-content .highlight>.chroma .ge{color:#d33682}.post .post-content .highlight>.chroma .gr{color:#d33682}.post .post-content .highlight>.chroma .gh{color:#d33682}.post .post-content .highlight>.chroma .gi{color:#859900}.post .post-content .highlight>.chroma .go{color:#d33682}.post .post-content .highlight>.chroma .gp{color:#d33682}.post .post-content .highlight>.chroma .gs{color:#d33682}.post .post-content .highlight>.chroma .gu{color:#d33682}.post .post-content .highlight>.chroma .gt{color:#d33682}.post .post-content .post-summary{margin-bottom:1em}.post .post-content .read-more .read-more-link{color:#c05b4d;font-size:1.1em;font-family:Athelas,STHeiti,Microsoft Yahei,serif}.post .post-content .read-more .read-more-link:hover{border-bottom:1px solid #c05b4d}.post .post-content kbd{display:inline-block;padding:.25em;background-color:#fafafa;border:1px solid #dbdbdb;border-bottom-color:#b5b5b5;border-radius:3px;box-shadow:inset 0 -1px 0 #b5b5b5;font-size:.8em;line-height:1.25;font-family:sfmono-regular,liberation mono,roboto mono,Menlo,Monaco,Consolas,courier new,Courier,monospace;color:#4a4a4a}.post .post-content dl dt::after{content:':'}.post .post-content figure.center{text-align:center}.post .post-content figure.right{text-align:right}.post .post-content figure.left{text-align:left}.post .post-content figure figcaption h4{color:#b5b5b5;font-size:.9rem}.post .post-content hr{margin:1rem 0;position:relative;border-top:2px dashed #c05b4d;border-bottom:none}.post .post-content .footnote-ref>a{font-weight:700;margin-left:3px}.post .post-content .footnote-ref>a:before{content:"["}.post .post-content .footnote-ref>a:after{content:"]"}.post .post-content .task-list{list-style:none;padding-left:1.5rem}.post .post-content .align-center{text-align:center}.post .post-content .align-right{text-align:right}.post .post-content .align-left{text-align:left}.post .post-content .MJXc-display{overflow-x:auto;overflow-y:hidden;padding-right:1px}.post .important{margin:2em 0;padding:10px 20px;position:relative;color:rgba(52,73,94,.8);background-color:rgba(220,50,47,.05);border-left:3px solid rgba(220,50,47,.3);box-shadow:1px 1px 2px rgba(0,0,0,.125)}.post .important p{margin:0}.post .post-copyright{margin-top:20px;padding-top:10px;border-top:1px dashed #e6e6e6}.post .post-copyright .copyright-item{margin:5px 0}.post .post-copyright .copyright-item a{color:#c05b4d;word-wrap:break-word}.post .post-copyright .copyright-item a:hover{border-bottom:1px solid #c05b4d}.post .post-copyright .copyright-item .item-title{display:inline-block;min-width:5rem;margin-right:.5rem;text-align:right}.post .post-copyright .copyright-item .item-title:after{content:" :"}.post .post-footer{margin-top:20px;border-top:1px solid #e6e6e6;font-family:Athelas,STHeiti,Microsoft Yahei,serif}.post .post-footer .post-tags{padding:15px 0}.post .post-footer .post-tags a{margin-right:5px;color:#c05b4d;word-break:break-all}.post .post-footer .post-tags a::before{content:'#'}.post .post-footer .post-nav{margin:1em 0}.post .post-footer .post-nav:before,.post .post-footer .post-nav:after{content:" ";display:table}.post .post-footer .post-nav:after{clear:both}.post .post-footer .post-nav .prev,.post .post-footer .post-nav .next{font-weight:600;font-size:18px;font-family:Athelas,STHeiti,Microsoft Yahei,serif;transition-property:transform;transition-timing-function:ease-out;transition-duration:.3s}.post .post-footer .post-nav .prev{float:left}.post .post-footer .post-nav .prev:hover{color:#c05b4d;transform:translateX(-4px)}.post .post-footer .post-nav .next{float:right}.post .post-footer .post-nav .next:hover{color:#c05b4d;transform:translateX(4px)}.post .post-footer .post-nav .nav-mobile{display:none}@media screen and (max-width:800px){.post .post-footer .post-nav .nav-default{display:none}.post .post-footer .post-nav .nav-mobile{display:inline}}.pagination{margin:2em 0}.pagination:before,.pagination:after{content:" ";display:table}.pagination:after{clear:both}.pagination .prev,.pagination .next{font-weight:600;font-size:20px;font-family:Athelas,STHeiti,Microsoft Yahei,serif;transition-property:transform;transition-timing-function:ease-out;transition-duration:.3s}.pagination .prev{float:left}.pagination .prev:hover{color:#c05b4d;transform:translateX(-4px)}.pagination .next{float:right}.pagination .next:hover{color:#c05b4d;transform:translateX(4px)}.footer{margin-top:2em}.footer .social-links{text-align:center}.footer .social-links .iconfont{font-size:30px}.footer .social-links .iconfont+.iconfont{margin-left:10px}.footer .social-links .iconfont:hover{color:#c05b4d}.footer .copyright{margin:10px 0;color:#8a8a8a;text-align:center;font-family:Athelas,STHeiti,Microsoft Yahei,serif}.footer .copyright .hexo-link,.footer .copyright .theme-link{color:#c05b4d}.footer .copyright .copyright-year{display:block}.footer .copyright .copyright-year .heart{font-size:14px}.archive{margin:2em 0;max-width:550px}.archive .archive-title{font-family:Athelas,STHeiti,Microsoft Yahei,serif}.archive .archive-title.tag,.archive .archive-title.category{margin:15px 0}.archive .archive-title .archive-name{margin:0;display:inline-block;font-weight:400;font-size:30px;line-height:32px}.archive .archive-title .archive-post-counter{color:#8a8a8a}.archive .collection-title{font-family:Athelas,STHeiti,Microsoft Yahei,serif}.archive .collection-title .archive-year{margin:15px 0;font-weight:400;font-size:28px;line-height:30px}.archive .archive-post{padding:3px 20px;border-left:1px solid #cacaca}.archive .archive-post .archive-post-time{margin-right:10px;color:#8a8a8a}.archive .archive-post .archive-post-title .archive-post-link{color:#c05b4d}.archive .archive-post::first-child{margin-top:10px}.archive .archive-post:hover{border-left:3px solid #c05b4d;transition:.2s ease-out;transform:translateX(4px)}.archive .archive-post:hover .archive-post-time{color:#717171}.archive .archive-post:hover .archive-post-title .archive-post-link{color:#a14639}@media screen and (max-width:800px){.archive{margin-left:auto;margin-right:auto}.archive .archive-title .archive-name{font-size:26px}.archive .collection-title .archive-year{margin:10px 0;font-size:24px}.archive .archive-post{padding:5px 10px}.archive .archive-post .archive-post-time{font-size:13px;display:block}}.terms{margin:2em 0 3em;text-align:center;font-family:Athelas,STHeiti,Microsoft Yahei,serif}.terms .terms-title{display:inline-block;font-size:18px;color:#c05b4d;border-bottom:2px solid #c05b4d}.terms .terms-tags{margin:10px 0}.terms .terms-tags .terms-link{display:inline-block;position:relative;margin:5px 10px;word-wrap:break-word;transition-duration:.2s;transition-property:transform;transition-timing-function:ease-out}.terms .terms-tags .terms-link .terms-count{display:inline-block;position:relative;top:-8px;right:-2px;color:#c05b4d;font-size:12px}.terms .terms-tags .terms-link:active,.terms .terms-tags .terms-link:focus,.terms .terms-tags .terms-link:hover{color:#c05b4d;transform:scale(1.1)}.slideout-menu{position:fixed;top:0;left:0;bottom:0;width:180px;min-height:100vh;overflow-y:hidden;-webkit-overflow-scrolling:touch;z-index:0;display:none}.slideout-panel{position:relative;z-index:1;background-color:#fefefe;min-height:100vh}.slideout-open,.slideout-open body,.slideout-open .slideout-panel{overflow:hidden}.slideout-open .slideout-menu{display:block}.mobile-navbar{display:none;position:fixed;top:0;left:0;width:100%;height:50px;background:#fefefe;box-shadow:0 2px 2px #cacaca;text-align:center;transition:transform 300ms ease;z-index:99}.mobile-navbar.fixed-open{transform:translate3d(180px,0px,0px)}.mobile-navbar .mobile-header-logo{display:inline-block;margin-right:50px}.mobile-navbar .mobile-header-logo .logo{font-size:22px;line-height:50px;font-family:chancery,cursive,LiSu,sans-serif}.mobile-navbar .mobile-navbar-icon{color:#c05b4d;height:50px;width:50px;font-size:24px;text-align:center;float:left;position:relative;transition:background .5s}@keyframes clickfirst{0%{transform:translateY(6px)rotate(0deg)}100%{transform:translateY(0)rotate(45deg)}}@keyframes clickmid{0%{opacity:1}100%{opacity:0}}@keyframes clicklast{0%{transform:translateY(-6px)rotate(0deg)}100%{transform:translateY(0)rotate(-45deg)}}@keyframes outfirst{0%{transform:translateY(0)rotate(-45deg)}100%{transform:translateY(-6px)rotate(0deg)}}@keyframes outmid{0%{opacity:0}100%{opacity:1}}@keyframes outlast{0%{transform:translateY(0)rotate(45deg)}100%{transform:translateY(6px)rotate(0deg)}}.mobile-navbar .mobile-navbar-icon span{position:absolute;left:15px;top:25px;left:calc((100% - 20px)/2);top:calc((100% - 1px)/2);width:20px;height:1px;background-color:#c05b4d}.mobile-navbar .mobile-navbar-icon span:nth-child(1){transform:translateY(6px)rotate(0deg)}.mobile-navbar .mobile-navbar-icon span:nth-child(3){transform:translateY(-6px)rotate(0deg)}.mobile-navbar .mobile-navbar-icon.icon-click span:nth-child(1){animation-duration:.5s;animation-fill-mode:both;animation-name:clickfirst}.mobile-navbar .mobile-navbar-icon.icon-click span:nth-child(2){animation-duration:.2s;animation-fill-mode:both;animation-name:clickmid}.mobile-navbar .mobile-navbar-icon.icon-click span:nth-child(3){animation-duration:.5s;animation-fill-mode:both;animation-name:clicklast}.mobile-navbar .mobile-navbar-icon.icon-out span:nth-child(1){animation-duration:.5s;animation-fill-mode:both;animation-name:outfirst}.mobile-navbar .mobile-navbar-icon.icon-out span:nth-child(2){animation-duration:.2s;animation-fill-mode:both;animation-name:outmid}.mobile-navbar .mobile-navbar-icon.icon-out span:nth-child(3){animation-duration:.5s;animation-fill-mode:both;animation-name:outlast}.mobile-menu{background-color:rgba(248,245,236,.5)}.mobile-menu .mobile-menu-list{position:relative;list-style:none;margin-top:50px;padding:0;border-top:1px solid #f8f5ec}.mobile-menu .mobile-menu-list .mobile-menu-item{padding:10px 30px;border-bottom:1px solid #f8f5ec}.mobile-menu .mobile-menu-list a{font-size:18px;font-family:Athelas,STHeiti,Microsoft Yahei,serif}.mobile-menu .mobile-menu-list a:hover{color:#c05b4d}@media screen and (max-width:800px){.mobile-navbar{display:block}}.back-to-top{display:none;position:fixed;right:20px;bottom:20px;transition-property:transform;transition-timing-function:ease-out;transition-duration:.3s;z-index:10}.back-to-top:hover{transform:translateY(-5px)}@media screen and (max-width:800px){.back-to-top{display:none!important}}#search-results mark{background-color:#c05b4d}.not-found{text-align:center}.not-found .error-emoji{color:#363636;font-size:3rem}.not-found .error-text{color:#797979;font-size:1.25rem}.not-found .error-link{margin-top:2rem}.not-found .error-link a{color:#c05b4d} \ No newline at end of file diff --git a/resources/_gen/assets/scss/sass/main.scss_48b060fe05b0a273d182ef83c0605941.json b/resources/_gen/assets/scss/sass/main.scss_48b060fe05b0a273d182ef83c0605941.json new file mode 100644 index 0000000..0fe2077 --- /dev/null +++ b/resources/_gen/assets/scss/sass/main.scss_48b060fe05b0a273d182ef83c0605941.json @@ -0,0 +1 @@ +{"Target":"sass/main.min.912787ccd720e5bbb5bacce75e146512498339ab7b308a103cffaa70e0f04342.css","MediaType":"text/css","Data":{"Integrity":"sha256-kSeHzNcg5bu1usznXhRlEkmDOat7MIoQPP+qcODwQ0I="}} \ No newline at end of file diff --git a/static/ox-hugo/chen00_flexure_hexapod.png b/static/ox-hugo/chen00_flexure_hexapod.png new file mode 100644 index 0000000000000000000000000000000000000000..a54295f51cae7e3bc8eac4c2375647095f93f67b GIT binary patch literal 45673 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ð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 UuI@rl-2eap07*qoM6N<$f;OLn_5c6? literal 0 HcmV?d00001 diff --git a/static/ox-hugo/hatch00_cant_beam_gramian_balanced.png b/static/ox-hugo/hatch00_cant_beam_gramian_balanced.png new file mode 100644 index 0000000000000000000000000000000000000000..faa2a35a1cbfa1769997eab29032d155ab0235cc GIT binary patch literal 29389 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 TLU9!&CsDduhPd1lHlhCkjU+ep literal 0 HcmV?d00001 diff --git a/static/ox-hugo/hatch00_cant_beam_modes_freq.png b/static/ox-hugo/hatch00_cant_beam_modes_freq.png new file mode 100644 index 0000000000000000000000000000000000000000..f480c24590b272ecfa26d5cc01936ef19af1f8e9 GIT binary patch literal 57193 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 z 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 literal 0 HcmV?d00001 diff --git a/static/ox-hugo/hatch00_cant_beam_sorted_dc_gains.png b/static/ox-hugo/hatch00_cant_beam_sorted_dc_gains.png new file mode 100644 index 0000000000000000000000000000000000000000..577e729d2042d7a16df354d00e1a3ee4c60a03bd GIT binary patch literal 54385 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

vWY{8bXnjP%Ek{H8ebx-N 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 H(}4d25YUp| literal 0 HcmV?d00001 diff --git a/static/ox-hugo/hatch00_cant_beam_unsorted_dc_gains.png b/static/ox-hugo/hatch00_cant_beam_unsorted_dc_gains.png new file mode 100644 index 0000000000000000000000000000000000000000..8a63a4bef6c337edde9424c8f944e283b7cc98f9 GIT binary patch literal 94693 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[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 literal 0 HcmV?d00001 diff --git a/static/ox-hugo/hatch00_disk_drive_mimo_ansys.png b/static/ox-hugo/hatch00_disk_drive_mimo_ansys.png new file mode 100644 index 0000000000000000000000000000000000000000..a62e069d130bd741ab69bca5d7f0c2b149ed471e GIT binary patch literal 112380 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

    OlG`P_JC1$kUPFQ`K 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 z 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,<)pIy(>rH&x{lPaFU+OI-u0Vo=&!e)rR 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ⅆ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%0A~bkd~KNPWGoC~ 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 V@X?6t?-c$_xA@LH!PIHTe*xkQscHZK literal 0 HcmV?d00001 diff --git a/static/ox-hugo/hatch00_n_dof_zeros.png b/static/ox-hugo/hatch00_n_dof_zeros.png new file mode 100644 index 0000000000000000000000000000000000000000..993b22924718c8fb8f348b3b25ae36c3e6263898 GIT binary patch literal 104270 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

    g@1`(PyE!C$z>gD$F5@m-kW+W5l@ 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∾1NV?>>AinF(t0EY7-d>Xj)6*!Tij* zp7lKP+mFJGT2t5IN3(WwYswn17U&H0(W~*Q`d}+IR#r8i9KA!XiT*MU3>yAg4!e45 z_wCykJ9ri(g<`a|gs)$dBj_ro@QB!0-GZ}=>QP}|VZDQ$22j3P@!dkOUO|yZrp9Xc zE7=6B!4;|RsfppTA1aCf@Q7r`1ib$^`?|WSYWAs-iGgo`^8XB1Nh=}gf#ss@$T?Br zzloJFIb(f2b@deNI$mF(U|(g7`e0yk#NS)n*RgYRl}{O;r5)_Jd) zNX8W{jAvAOK7??=uUzI#?aDffoVer2(W9EHR;?nMPAc=)y!%c4x%|EDyUbHr^4qjaF^r;hPvZ9{4Qx38LcQjQD+<+C9eWwjh{)dRfqT0vF z&CQMGOS4_u#DCkn$n-@Zx^kcX2hB{?DA}{)Xfn#}cK!Q9PiyabYm~ie0~}PhK)I+z zf1dT~9GgDXs`2w$JQ2JOGi`eX?W-@xE~!Q(6F;zUA2z(qee{AeqimPC2sV*9XCq;~ z#kyT=L8>E#sY>jpo-DzOSC)%Ehgz)|L(z?$_>5IC@ogPK$-nGF=kcclC@sZ}>U}m6 z>9FG1EQmNu<2F{7di5Le#*>px7Q%j)RBKVrIhZwe{F=JtL%|?U2&xPho0sbQZm247 zsaVJ4z`ayl4$Rzb>Us1eL}Nyj96NO?^vIFU+%t9Pyxhl*^}4)9gOFg;)b%tIV!<*T zxjT9DcdAT)vW%RZ#4x)~+|}8oj&JYo$7!--Y~tc}*+bH}&rB$g{YTGfaCFSE1iOo{ zgq~>o;$L+N=js|{Z@)JD8cMfI*iif|+M>Ph+O?}u=((c8%Eh9$-~gvaJSZp5|Jo`l^OJTx z?+un`Ido`P?xpnp2ge*UtW&>P0H>13;kXc{4c@^W1Eg{5kXsi#5rKK7VjSb{$)rl~ z#MA{DL=f{N1lZ6BQnm3M>QiWdDu|0g5%gvsYcXuyx+#s;QFUVIFqXg|MKY}n9kvG$ z0%L8sMa-GxBX;gKT>w@}3RXrFGv7ads^)5GgTvB8ZlD@P$R71iI`Fnc-zXA!1WDg- z+t#gXXu2n%nnjfQ*QLjq3=}qrTgc=+&jVE?lAz8YS5JZ}ET}m{2x^l+97+ORxXwm~ z4vMxX7tTR~=9H|@W3au@sqf>IoHu`djac^`JIVIdZZ~)mbfcIhz>Diz7I{iy5JKfZ zzB;syEvWxU(rWwXcZEm)RexH^@r2F-qAg`!QKsgI={niyzS%H)y?!m2r>J{BA!}lS z!D0HG?LBAjuzSoQ>3XHEeXiSR^=%JWfP4f$=RU1UtP}Tz=yV!g$XkLos%r86M_%l@ z^6o??DG?W1oSO60+3YK}knO9R#XfxU$t+c}Ln-ruWK(c09z>S&<5_Lh>?M}GC4$p> zfDWz6ncuW=<3cV6i8uwG;+s-!-MaPH4^LZSQUB|5$*TCg!b}ZuRs_;f2@Jc1<;KCV zxPIo`R%}0#ebNhZujk|l2CEoFbsDn1MF=q8jokxUg7~S%hLxP2me)qw?)TmV#?-~e z8OE9Fbt#~R?%%8}?D&?r@@YuSP-UVsZG+LjsUr0)HHj^Mb!b!$M~Zgaws{tO&K8sc zSyWFvPL=5M+;Ks>ckj0ISV9nlG&}J*Q_N*YK)-t~3sW0Bc(4Sku~vd;TRj0Bgc-q* zR)d&a>c|(YJ(I740aU0ziS4Z;6tRJUB+$vnuk^FPJy0L-PxQ%Jld8;EHtVS?3PBqQ zln6R|wl6tn=#Vs`XGyjb3OhQdw1vZm52r-e?cBKmA!CrQ!CdSuNQ}m~XfpA9GkLZP zN*jp1kc11Vwcx&*VQzfs+h=Eg(q`27##9M$cw2VoKxD+`=~TI-a6Kx83NFMyuxrpY zr`ph-;2}DqSS{Km!c*QxVz4j9^vhIbITn05O;dHF@+$P#XmSd2oK3uU~t*!`cC@>8uUUjQ{sv9>Ta1KRB#`Nx#_TTA;;P#35R2 zY@&AW9)XmJt?mF)Sh9RztCDQ`QhViZ;Ox_=hPX0ZcrG<9*$_HUcWG|kx^*yl4*uID z7xdrv1!uNM=!bxL`f(UvK7aq7fJD%ln#Q)rk1ds0*3}dcekVv++g=B(mVPR%Q6tta z+88~>2>!qZomE|hoWrx@bAdJmO#WH_LuGjb*k9B@qZ5DN&2Vk+f%Y0mAZ7fsUixt& zC{lcvEa`H}{Q6EB*@lWl*LFJF@p*sB0k>ryG@9A}=9Ku}f8HsQGzveLAEGl?zG9Cj z3I+dkK{b}+)Ex`W7#4$%c8Vo5vzoKFTJ+7Jpba(pNvN=Cbua4=nz);*e^priv zQDX&hIZh@&)t#IQI#-XfmEv%(-_~MR$16NSPYJVga~tC5sKx5c*!twgo`G!%%ecz! zEJyQj@X(=db!X{kQku9-Nrr{i>^}3Znt9B+n^RjfYj)}0z3BH6S06|O)2aR2i_f+1 z(L)DTHIpC@t!B;CK>4+_IUl4N0%g`fCayGYqfYU#tN*fw0s4bCgY0q)?=t8HkRt zL1&bH5muIiPKvYutJj#b3+;c|_qLGWYGBnU`}27bFvXhCf;)EXDDy|5+ok7+qb|nY z<#knHO@rs!tqw!~9=mrhM!tXhx93&`E>G47`BEdI)HK=-hY&rl`Ob@|Nd3ZuZVRm<I0=)oKp~n z^)HqRF4?3c|0~UD4aX~^d-UwN#!`2Ze>sGt(}|g`G=}0^r$ZLkp6j9e+g3UZ>>NKP zimyA49WuX7W*19fC)RW%?=fTQc!Xo&VNxAVA)J|0xkH=CApuFDU168d)r4giZ(>rz zqBr>=9CxPfDFF~N)4AmKA39{O@V8Eg5~ou_bZ4AG&Da+`>esES#|f8q@?-)FTuVu! zXn1;lnMihB508zG9z}6!Zf54`&DFclYWLH~2Bmr?9?vSY&XPxpj(R$0zm3g}oun+= zVt1$=0KzeyoLBNwrz0D>Qu<|>o7*!65ciAhddo0D!Wud3#_^l#7*L__ihv|#zLYzJYoM7t>T*5Sj$Ig|LZ zh8k|sc5>1zLdY>@0!Z`1%1@r(m%;g${eV;F2#w=7;o;vK3N^>~G!)oh!jtlE-HJs< z=7`JkAT*xGkMxT9zuX3(z5~q!KKnhP4XgcSVWB0zed-L3ySU`!Wc_7u+e3K+@)yKYI!sRs<5R0l-QfS=IaG3TZQ~MU*TE~97uQLhJhB=#s- zGxva~MmxcOvdE49fr5bNdgwp)kC}jJy zcGBG<6iR&_@j2j&)*pAM+1uQTG1JB%Kg6CN9(Ikbj(hT9b*qod)JWUQ`FWChWz&WY z4UnxlQ9*NNqFmY?vE()iSTrL4{>&9U-loj8B~VOM{$d7_TZK#a^S5tgsd5}RgPRPa zcwe}1q07%Zz=rvho9RCnR82IxY3-ggXzA-)dgfib7S{jIa)#jyMb!SN-fU#k^qrE$ zI~I8cRbR4u5GC?P#gQKC4fmsoho?2A^;Fw+>8$pqIn!p(9MUtiR831#J3Xp1eyj3ZKbQCiIW9BO$jk({-}BEN44JrxHmzAxr+jID za*A4OYcG0xH+=YJv^64PudDQ!{WwaJ2e)38fB*_GQ9nkDB8dCBan;2}+LDsa3)F~Z zW#2}BwtY}^5rLD4zh*eX zQQE&T1F^)8;4*4Q8ryOt&!!X4pAH+;tWBE{03Pj??n0)|jlK2x7JkdL?#LKq5j{OU zKPX8{NU&O zz&Gh8CQ+fMINuf2|v}VJHOZl5awYY?h&{P^9LVGOS20;=YHl< zYglT}>jg2Fn8i+(OmmvFfUR4bC?QJ~)$9s!q#QqSV&K~r`c^bDc4N77^tN5!w0Uz) zrK_1)AU}ylQcaO_*1>S{kL-2LgQyX7w38Bvzkf1*4-Gyi!wYI_vSh><6MN`TJ<^b{ znS;t&vqN<>Yv_f*u_gH}nxZetU`w(xjLdofT{WMM!7G=`jNZ zok`=HRT9J-;FWWNoeCVO&YBp1Vfl%$r8=<>f5y6~msa*aebYl{9e<5*Kd#{)y*_=A zU$-z=6U;kY%KVqq(y)VJn_d+bI=+|~LPetEo%VNCzaLn$@d}+N^G9~v5sxO?G}!P_ z{575&!#=Bme5*gujtpG-w5oN!r08NSY=5quzJ6CuK8d&`CI=z0>!at}kkG9gV(IzI z7U3f3EvLGJ?R=0VNi9UcULQh$Ugrg$Gme!{vuv9<+q531PFcT+j*bCn<1e9|L~4K- zP3+Wt7rs^$u|AR9-pAmyFRD#dszIHn^*J>gTxGX;PMK2MQoFM^e7y0Dw${_98&NY? zVYI6ijuBP$(s5dI5%qPdf(!?!_LqBMX<|h_qjtc zMXDA%eE#7Vonf*kFEl(nCv;9|amyi{w>3Sd_bdGxF8A$S1*{MkGH{&!4NPPNduA*>V`2GHrEz8t z0q&Nu0M@bw+jZ@#1q*6y7Vteg7SgHV+XR~UPB(n1+T4<3DWL=cT7FI!x%zK}fDKwiursrV|0FB6SYMu!PG? za!B~ZWd;J1^8HE18NrmTxGDxyEV{n%hbUGB>ylR>32!4g&U|R)5>Lr>>-6+IVJ9e8 zYdJbx>OSlKx_?&usx(8o@o1X2r3ba#i?qwYwy8O>6w*z8bpGa^#u^7UTz0YuwSk$r@!nS^r@b6(jdsLZ<@>Z z^|p}FNTSlB3mA5~%h=;;{o81w9Gfz@68J4<;X;5=3cwm5sK6;1j~}-H@RA0BXQHB? zN#@I1KeGkCzFi^V_9rAHMIHF6wV`FN2D}Q@Ul0v}Ok}~$cZrcpip+qqygk2)Nlm=1 z=idTer>p;7mGXvmoUBuAcyibV&2b+p+cnbCicQ=0k;wxRpDevLK|TV8K(wrZ#m#?c z$Ac25qoQ7GCaw8)#Mb;+AVon<$FiMT>LE%1*TE!gr1KUoBo(6vqLp>94oXBg144W- zS{#13c;@u!lhB$ejjyNLKR%X*>$|W|1 zZj-gQG1tHe)^s#!w1k&uzfvkX5>s4OaHbLeL`bVxkX4S^=-;~4I`rw+ci#k%FJkNC zGxT2)bf5e0#Ws(XfqZ0%_h#i|pN!V{SG2P9TJT+7oCPJL@gM0DULl7DuS!gKMs{|n zzZ>6AD20on0CiE#MSyLm9RC=?`6yF!BwdV<7q>%82)po!t6X7dYAVqKt9h#&8?__mH?KT z_;c<%1Y&S^rVDs@27qv*gbEh`1p7v(zH3DELcWzI0r= z^t9ao+yah?lL3p2XZu%v(xW{%6lO&dqp?P_t^xd_A5~SO2xXT~_V{?m0YHp`1>|<` z)oYshQ#P{!k3-p5;cHB;l+qU(1*@sw$lIzu%ErPnl zo4@74eOaAXTrQzVUx@}2Ya5VHRAMrGBRF9H+FDm1d70t+9&C1R`_PiXA z3~29GAhBp3vAD^C6oDD zJq|xZU~wB#CVi~GjmKc`uMk}(wIe^n^vlNq>OsxYku;?nCG(B<#W!l(b|jJ$L;ea| zMPqI4K{hg^U>{gIq7wre=bw8rLpc<*wW&@b`HE$(1mKWpnea`}1L!*kFCGiLaSk2P zB6^d7-vQ5eWM*c%TcBl6J9Vl9pwwIN(hL4oTf@T8xQ`UI$Jzg?JzRd4anHHl2>Nxk zD09TTd48ee&n;dL)8c-l&ff8zJ9v0J_tMx|p?ZdM!Vu(w!qqms#D8R+qEd#Q3=svT zB0Z`E6i}fcuj`;-q$`e?qd!FNV#1)xKN2YPxuW6#2hrBC&$fkGyN_1SzUZGmcNI}2 zRP}xN*JmEIY~Fm#m0R}M$zZ&0BNBFh%(n$$vk9jipMBekeiz$AB4n+J__>)NwJluA z)aS*A?jCqKt9kIpw$K|dKYknu)E&PyyLoV{R_b=$)Yf`Lx`ffUtXg94)w}n_CG3w- z*p0m?O-n`_YDb@TDgW&U9b7B+;jP0*k46$7B)=a_o&PJjpYSmdT?VyGYDt0clbBU7 zq85@*4u0*juu-3j+C0WkVe%Psh4NJ-#w6{kwuw|-wCJ1uY7bNm2A%8u**et0!KLmr zA|AsjS`F$efQoy zNoN%6hx(#90PTG5o{|sHy}MW?z#qg&^1bDw3oDku*KRnmuQw^Y4KRJ7YSsXRvjrww z{PCHFBEtfuSOf}!8xZk^G6}5+2dR~=mL=l}=!PQLbo5pG!I8tkJU-*eo@9uXfU z3aYnJU|;s*@L4BL-0%XWj)q_oa0HILAnj7|z+$}{xw&zC*P~!a|J&`#+!sD9=yq!_ z*1|;%<9zGNKN-d4Lx&6rr5hGEX5$tu>_7!=_J7hEJ8s;zcWF1$KAW}46m=3}Lh2Mp z4oVbuTTrer(KDaK9xk^LqL3pjMt8!52@(oNYDd#?b3HZpBGQsZjTdL~rfd6c*E=#I zhsS)7v(0$74f;X~zOpfopFG)u53tH&EP^sbm1Ib7C6>3}bZRd)IEzS=q; z^?Znvt`SSWE`M-y_kf-Ej{S9p3PJ!-kTl_3PnkgjoQ706pQHCLD0Sq>2v|BnPNbaP z*@8wF42S3W<=(2b#<|w+1;BaoBteKpoBa99m+-JJTE6p)e)wqW!N)x~0H-MfNKpi; z6Zfo{^luZ@->bA1ao?jfRK>BXX#4w~4giTHa+M)+YM8Jwv4qlJ)f@k(-6;I+bO4Y> zn-eQ%%$(^(onowK(EFk(PqZs}dJlUaB zX0&w<$zjkpO?Nfc3zb_AFoP5yJF3l;4tYP)RaK3Z5eglcJ>T z%@{B?y(*zBVVi%DQ zX8UfE2c}3C8uyyy(-X7ji8n^;q%#z@j=+U3p1oL$GoRvR+zCahL z1aKxNU3p57xEbgDJPhTEOu3Q*lD&;lKQ#P=PN;KAhk*mrANmoMEV2$cbmq<#aXi^5 zy1XiCF%ehjZpoSC?HxkFN4b71dR(rf6)%6JtIAcGOG<&Hh?op-`d?AUM7YQZn2|}` zMJB_M1W;Uf9dd@3xA)&_0Co)YtJR`K1Qq|%<;$&D8IATA6&kgRZ^1)bv#aW#pyEzn zXgqq(yMQ&01MKS7#vPr2;`!)oN*VLoWMpSTr)+{z0m!3A`IJRRVUf7yw__CwjkVG1 z|2U;$=EAfi9QQi>i-LnI8(|C?y)YR^g%B^-FGDKBYy;8^vhDMO#sv!$N15Xp)eT*e zy_hNV7yl(pr)2DqWpS-)6`Wtzh|5I6N%>(J-|I4qn^dTYt&NI`@_jPm3l9LeK_|fLTmU%nthq=+xZqVR%O?^wWR^8fUuMx> zkJs39nSVN;xul9EhfFGdyQw~%nzO3Vp@mAOLp+Z*x*;T|CNrWk@tB_^&$FNTOR;@m^(^Bh-I8R5ji0{y)e=w!f zYRo{?_iLA`nVOoW5;U``-;xH(JOD`8=C8*dOQ68iU)T?t5mNV>h}CJ)KjLG^z2gF0 z!kHeuRYk(094cH7G z`v-XMWrvIMNRb&6pUTSzk>}u2KNH=>Wk!*}`Nh9^`*wA9vE0{Cn^W3kR;0U;nmRt zf?GXr`aHjlRY{vuVwmRY8~_0nUHba+%TvMLW=k41s=;tPhYC zLJm7MS@Q-IVd?{j+3g{>8HU&H%=jZ|p`S<-Tu2Oy$gdR{2*#6YIBOchmNC!h!5E%a z^V}&I#VsUx(eOP+oJIi&A22C>ZQIAzMp|k{rlyClwaMh*Pt8N21qotv%OHrG+}8IF~|z0$!q?=5TKfF`KtSt$GiLslb%R zGst`a&YBo=Br+nxivEl+k_KeBHT=Rf&muTOkk&twEDUUdsR{;B&XJQu>)<_SZ9~8Y z33p@-OoyO}`A|w0*M_THuOfNDmO^MMuthOu1?5tH#J=Poy&KE&5KOQ9NPjjM*MjM& ziAeoX?zZ7Y9RfdE8!vyZFX}&t2St&I*grlSP~}0T1ky7SE*)@qrMQscYG73^9}X+5 zG~w@W^ZQ^nCv()I`l$m4zxL_e$E29hK##WUR6PWNDu-t+$nL*GlSH=i>dcpK-?HEr zw3;>zh3}FSDqzlor1}yX9Eg@k1VTuX*HD8QDgdn@p^ z%K&5#7l0}b28Y=m2e;jkSXY_iOp%bm`NJyt^ySOsw{an6J$nx3>;F3in+d%T#8XNo z#R(|O8qAYD3Yul1OadJd+bEtWyD?CbFbc1!!&7HJXVMxXY)c!2Fec_rFoIeFdkMEI zV>~gNmYvnJUNZ@DjQk;EkvZ}i)8bQMz;QlS<<%)0owSY<*OLru_T?L-U?!`3 zW%x4bCeY3?$>n>{4~uOGBuVBLnegMsWD<;Oh0a;jPQZ-rW3fWAS|+|-N`Y2~UQb>< z|K=|XqnmO4!KBFqSyj;{GxJ!GLWh^n7QF6v!S^bTpcpRfG0VwV&&tY5&0}F3D0lhN z&2NrStzA21%zap+RgMNG*#6k00MJPV_B>S#o=#xew!r`17Y{@V$7Zt8d{5rAKu-_y zQ(%XTXJpAy_o93$+~1f0(1;%m1K;3z<-YKnmvDj$k$%b}Vd?1SY)r5dUM}myA+BMW zKEVc;uomb}p@f>uTY}TJc0l}mzjT+VP>#io#6iyBNkcE%ndaTTy$R9Jm^tsOn!%~L zHtxaKb^XO3I)Cb+#@G8{QkI|zE?3Fd!{aBFEW;TXtGFwomxe+|YaTh)lQN353`eJP zyZ)yINLuh?qWn9Xs+!Kfl+v~@H2I%}q=gL}x zs?O!A3>zZ>>#7AxEcf`fWL8euJurT`k+$HmcE75ZKr@B?=~c&4Pt()$Xi-(Dv-k0o z2ad~xsY6Ya1Njev#nH8v{>m0ZB%|xpescL8q{k?!ULB>~xk1qZA~6?7SGX}YnC>Xo z&!4R&GYTN~ws-jDFPskVNAc_G;YsN<1L7!oI2BdZq?KpJkDxEzN4=#T>uB4>Z=~JF z-`hkAWMY^?>&vvOM%qq@uvjUPNPR7q`pf@-nuHzxn)SHyaQUOaH_y*6vj#7z{-BY` zlG#ilG43Rl@$bm96Cb^iJPuay5F7Q$*B(CH&S;Um&ySuwAt$p(k9ekYIA0%bXQ$7J zQ`3^ZtMhGL2byyjL-QaXzHDF&35J3xjd3C!_gUoGqiNi}R%9&L)gX0+GmK(`i~;|9xPthNBn+BcCIK7daN_I_7%SXpKxN3i88$lAmdiBO@8Wmc$$5ZZdjI zgRxDF^L5)he|;|$Jf|@3tulPrew+O0XuV5OdS6@lAUte$|7BKSO?m(^oVf;Tc2Oi6 zQ1wNheKwGNB^)H9YV61^sa-YP{-H zyr^-{&O8F~;t=lUQYRm1P=?X)9waGr}4g%(m{49Zm z`1gKgOVDUuv*QW1U#slg=oOzqyS3iao8zjm2SQu}| z0Eoj&izzEQITdr<$6^U4J#V{t5>i3IF!D9`_t(`(^5S~#Tyc9 zKJ^z%X-B^$a}sx7sldVImRP5V%PZzKGfQ2rY-!fAWmT4jRa|xRRUsOgFZu^lfy9Gc z-olx7Bfqz1QL%n$b+;92_L92X%*?B{60&0(N5o(Db-RUsUy7*JSa+L(CQNqz1C)ei z^ePCOrHv%4W6TSqBMb_NQv+lEQkmJF6T)cE=uDSj1PQ7bYU&38l37f1tGxd&3j;srJrBc<yt4cwrLQQF5E3L>@j+@X{vB249qkT)NO+^Rl2hrA_PRNZaY$5>dVKF1W% zP$C3Ne*dZZh}VWet1=0BOW4Q!_c6{kawRpJr{SD1t;&OH zx(F+fHSajRa`)=F(KJhqB>sTDgDapVefBSg5kgllhp~Dv;o9*?%R8}ZUul?joOBmUBq4Xu2H|V<*Vml!_F&1B>YE@ zp^;^5+`8P0O*d@bWEWp{;cIz$AU-3dkW>0$`l?kSR||`cJg|*C{OE;>p?Z{O9z+T! zUk!zf53xBwafOf>mF%8c6R_VJgD9;4m)M*x z-(T@B{*H%Xk)-etbS8**Kz=KWN6dFr8G?#%n|eZhC9l%c-(}(7BK`OGmSSLIhg-)_ zWCgRcYB(O;Yaj1S^g)XMDFG~b*c|aPNCV3P&`pN zFRUKOO3%R;$uZ+O^PujltzmWi>kmhng)yDvwWiTzYdk-5%f5!STiQE)R( zG}QEj`#Lm>X^vU{eg$?tdDoPH5kxFNW}6Yj3bu!0>%Z8ZQUCtCObvj#9cpMONVL|6 zHO}?n9d#gLfUJZL2$@bEKamoeLNRDO17*KSTlf)hh})b`i6Zvdx=vii-Me?Eubq0A zjH{ZKhK7bW&Mkj+qxt>L7JEjb-RJ;BOO&7_26ImVAn*ahxT8f^v$X%jnD6QS@BHd& zdM^7iV3`_VlLJ~j1AaBEP@>&MJQzA7y%@4XyRtU^#GI!)E|eNeCEy^{COW-Ou z_(F2ZjpCU%o>y1*oqb?Lm6!d{h=X0Dn!o5~ILy0cLfXl$-q(AZHM1Y%mDZuYp?%tv z1A2)Yy{CAj&8=&_f2i?@fByCT{pa-|M>3g zM7KK$S74P^RsR9YCFgf#a(YsdalHvDmXHoIHj2Y0c{n&T+d?t}vHA3Xr5Eo%3+XHJ z%`JEts9+`b?KhD|;_9ZPi7mPux&?vKmuH6#9+Vm7)2Rc?G>#zj;fI}BHXRA9tz9!P ze<`3Vl>|uFZ6L_#sQNm4UjqhHP15FufeXv;+x5>s!w}42ber|M!+49f*R9?E;a~X9 zpI_8JIC}r-)7xdf39O_c$UNT*1Gex4EPu(Z^sMM?t9zHTKWUBb<*_;R6Tf51j2Stv zGy*Lz?H-9&D$lC#w{PF-Dk%Rp+vx8_5N@6q$vgj6_Gk+Qe$LO1=hwiC%Mduoh_7Vi zI-;Kt*%Um1D@YQ{$enZ@O=DFaGYX1{ph^*wnx1DvJqq>7Q+f5xm?l06}i zL|7PZg-ciO=I49mB~bw{wC@Pua3frp`N1Rj1DTKz@Kg7cYQvc2zex?NnS9Yfka zdHB$g$R*JpmVF$`ALER^gK-5Yyw{CqpHq5%nYOsCz5fx7X=3iHr*4sM5Xw|XV2;9q>CNF$VhTK2-tLI4- z|C~}P*W}N$6S{sh<$e0~J7)F=&Ect)L#U}p?kbC9nso=tuieX_srz^m z6Vg}yll2rCN+?sL8g-OhCuxIaO5~hDmEo0}n*_(7>eV!uZAeob)g+j+F}a#hH5B59Zn|HTqD$$V^*=#`J<0WMM+C8eyQlf15xdKj?A#nn~*np74Y7D2tH zC5mIi4+o8gCNor?R??cB;;~o%1!2_dO)X?OVnl<0hCgQ8Rwk@wXNuj(+b&n^!(~gx zYQObGu*lnG_ zDg3~~YEeWIywy6O;h8yrqJ}|v@PDE}LA3IOxqHrc4Cl}D>y9wu7Db4{AfC?j9Myx0 z(N3$-ZAt(X;)^j$OS0RWnhsCgwJst;y;IKUN7U85|&OkwMl+6>8Ekh{ssqs8~`-gO^f6uZAktp3p>eR*SEi+1G(Wfw<> z-|0LY0a}v5l45+aXb=llv^~Yx`>nNpf<#F@h{kR7@_DZ+d%|c;UZ!nqY)k_h0`dQZ zM2;~Rj`kwM$ZOg1cz~@y&IqxpFdj$W3S5W|bH&iZKBkWN3_r(ll84YX76KjH_3=|D z-$zeB7hfhJ2nY++K9$~4zR)Pk^9MTLa{W|OZ*?QB<_di(C(;I(Us!Um$C+`2oY z&q!#}HjOz(TAAaYD(S=E_jz3jCJt_S1Bl(EW{P|`QZoq+)eyZKUgu*7lZDUvx zGWrZ9)MYV=Qo>%WXh!9j+-xqMq!nA7cErW$6Bo29y}y+)T; zQ^mT?EWiSKs&gwU=gNt@9aVtgq>Dvy?q2f?+brosY`^Sn!{EJQYUVRrnMs3;Jk4M* zO9};|Z{&MOTp4^P($zskxJYG<&($!S$#uP=CXcU6gT5WNz0^6Cra=h4qJI{$*VTzIfA zR*H{)d$WtnyP~l)UO&=C-U52@iRmlX1F!Qi7^7?{LY~ryS8c*=oIhA`wR?h)Dt1jA z)dRP_C5bpbv+2e7jz&h8I45H!zqEce%3@C>J-&>{o7!a`Ht-1Y58P&)AE|LlH@Obd zz4;Wyz7-<-qajfO(7{X+VS!zfd1xn&-mR4W3yHuAwSLUGamI!@w#DOW<5LhpEx$3?U{GK)saB zQ;K?)!pj<;`I1MLZ<|ZcLlO3S(&-CpC0TGCZ_e*3!&PVpI-URyjN|i2=R^ZJv1r^t z{Y+j%i3;A`ruRGrtp7D{BIY73tu?3+D6yW!zO>zF z74n%41>!6}4U?)xBmyK;O{4P8-$|1|QjC1#3Rq|KzvZN~AU)T|`2q@cV@KQHW&g|5h)2gLG*4+rP zrlzc}SB~1cOyv@G7%fst)3|fz4dJ`Fjq>FSwejYz$$9>KkN*}sU?wd(^128Svq7lX*d%X1;+2fbeX)ij36!sSA&2P+ z=ZEWcA2rtB>2|_FYqbD`4w4g;yoZzjW=yxxurP|>a2z(6O-HS!2i-?F-DZ9<3j3ZX zX;eW^w`|=yy17#f_BS$a_LJ@d5dQMryQ(p3hq=@l;qvNo$A3QEEd4TrT~D$+d1r%a zM;Qe%7TIl>%NjHp_}!*s>U5a>5ZV3HSxEQjM-KADhbH^=|w}(lW-qY8A1PUDoB;QTi$&o`5{;X5KY2@7~>|@76}qi7hzF?xuKJi;`;iPUnsow?|OlCjb&jKv27O z`^?i<@eX-Q2&xP#d%(mV8C>Y5-obcO4?Ojku1s*Wa~bU9;dr}E>(+<6=hbi4)iQB+ zNi} zOMo|7y%I&lB0?H47}2Ay;=_OYp6r|sGTHIlJI1Weev}r%^_Bxg@=yBlgE!bwGe9=W zj?w1+L-rI+=`}!A8ck}?&3u;MbYN}2RV1d(TclPUiTolKkWu0Z_*%?(bls=lQYc`# zuVknsQQIO$MQSz~fL8cz7Z;aXm;I0y$gA1mGPy(!HfG00vh0-r zvS#XNwy6&mtr(ohz!inFFbsXBwX3TRS9J(NT_t5l_lRCj0*4^d*KX6ML99)oEu=Ng zbTA)We9?qo#G*ZLPhUBJfhE@qiumbCZ5*@4#mdA`C^H;P;>(Am5=0Ksw56?WNcbJ2 zpL|v|rR#!M4!p!A0&8q))3%5YQq;#Zw5%%mN90Ayg_gDa9eUVV5@15AaO}EiVZ~4M z5k)}q+07kC;tn#0`G5nj_ARoNH+vi+^noYMe`3*qLA8p>n5T|?6fh+K={r@DBvS}5 zO7zFE0SI{51UGiGgkdYUx88{^9gcfd;mCJSN;qW6F8i$?oPy0y*iwk@Hay%w*cXEM z(CvkaYn@@Y5`W7rh-pT&BZ@&LZGd(UAOCOKe8cDtsSD2}3@@s*LfncUIhXY_A31?! zh7cMwZPhAJn)$RG-_M{lcgKJLeVNeR1EHW41kL*Rwh!1mEtTLuOE{5|Ob_O7(k@D9 z0=m8p*w?zxebx%-Li9^aEg+J89fWjR>iTu-a!+`S8r6vRnMI>ShS7Rlv)}7qEiOk~ zQy=@%Vn2lUM?BIu@aGclO|-IL!5AO|HZL1oUeICFP?>ED-C*7inULwU|e*j z;Eo{9A;8tOjI;-|*N^{U&*KF*LciRPuU94ZWpgK8t*9q+*?GB{nS`1xq{ zum#k!62iLC6qIAAJZJs zu$*RyB%1|$2S7IBsNBz!h-sJf*=8+Tc)`$n*!HfbYLtv&hH6T{b&uI2)_21xfM`l4 zU~`omnz0}^i&$moEa2Muj0thS^J?C_yCO})Dcv(7B4Qq$=_?!OPdAsUp$h43Y|pla z^1O9s!8F6#wl-{$rpVQ94-dV|p3PWE$3 z3oAz>a*NvBiB!Z z%83v9g0p1}2Rxwsr>9GvXP{c5CXp02hRvixHONFQii;uaBQXte0!AmAC8a#&c;w@W z{6bDBq9Y_wo%W!Pqke5SykV4^0olcS4<1yb)<;XAEvXj#;U&~aBE;Kk9eNAF2t`+E z@gGH2nO#QWIz+JZ&euSqOp}#DT+x5Bi|cb%!XFHT!EnCwYQA5QepE;u^_|3$|}NiFH9cxN>gD!6jA`>FnbW#|bcZv=c(oF3dh|Cv(7b*A5Fbj<&> z0CKh~cKyFmvRs9)jKx`wK$#>=Ep2K2R<4-AZcarVMh_v;FXT!K2_l(7)X=R4EN{#m zg$?H6@fnSfqol%i9`||FkcyzJRYZy#T!iEy(=DUg6-Ten?Aem{M&~!EeM4fr)%i*3 zAvk+$L=FAQV{Z#C9YPW&#q2zwlBrb`8hTrDa-*)(ITuzwoQGDcL4ytIGKyB;v{kEn zwxFfkOUvxDZrrHP%UA=coLG0@;L$^DBbH>>O(&$igtWKwj^K8YjCoE5<6+m%ojbP= z37Mp4z+|tcm`DAoDw7&`>9uY;Iyw^F1!_q}Gzco0aIzo*AbM^kz>;t(HKw?G+Fatr zd7nkT6=+nfOqz5uT?eAU0?Gc|m9|VmN+jEc8v|YL5IZ|{XudHg)-v=a!^!rviXLkc zrEiCq@NSY4M|m*wag_1CgoHITisGhZlPepEC7{2I>eRL5!-oyj<#h9%PV9_{*^8$M z*Pg2OAhOY5_s9vPH@6(7k;YM%e#el@PUf`B)sFyiKF<@e4R=p1rC;dy&e_!CoI^3@ zlkpPet~woAphC3k=U%1$D2I* zVpR_W3FeIWec!o0ycvhVU=&D`_~c@@1p`a=yUvk{%67Y&gS5w9Ubi4_M&C&>Z`Qo| zUUrqkYf0}TW=X|y^jAX?4(Whpj~$oJ_>K2D7J!m?K7H=#f) zd3+mn9}I5#z5Cm@H^b~Fjk+A6$F|79I_mN=wOP$TY}l57gcnadN2$ZqyF(+V=pYim z$xpyeC)C{j)C|QRFzqHu zg3=7jgl+z$9sd@si1K$Gj2l;V_<@UYbR2aB6&-J{Httz4HeA~iezdKxI;01vL~g_d zHvv(thPCq01QTDwIh?WNxqm26Gxa3x+zZAL2XFvLc};l?ix55z$-bX1Y*i)UkL4%; zf&jo1OGf0odeWGcM0ib~HA_Z9psxP(>C+`DquV4j9F03&SsK6yGH3sbT>`8BRB2-K zN#0dUApyW6F%q;>Y>ME1Vm7_-TJSOuA$86J^15^l3~b+=Ml@T*&M-MT(#am!wIK~Q zbv#y(I`#G?6Jg0Uf5peFM-S7?C(OMGdEb0mL1Otg4 zl`tZo@;1$z*9APobSk%_?4w%;o!af{J-;UAHc3$8N|{dtF|&0vEpuMD8%JkyLvrMx zlr?d=cjwNQ3DU(${2GxHnsm9NqT6b#W~)v{Y7d(r)VC6wl%!632b9K%)_?g|HP&t> zu;`hwF&@qTesS$%w!H!m%>)k5{NBm16PJc&JEl?c^sd4eio9L9#GNeTT(~{aU)BN= z@YyQ?U4#jk=Twaxj@<)KB%Up|_me$N&kJ0(@Yxk$CV}>l7jT)0idmp&nxMmr`(3n^ zbTc^&sZ-7r z$0sCQ+;)NE*1NRh`rW%HhIDZwu1B0gf*+mppyua@wVN&4pT~B^rKPI)6x6dhfF^`w zudIuB1QO)I@#d}W1+!wDU#GFRq&r|pffxeF_>lW9>|mY4FDsjI6z=Ir6(&PAfrceG zP2xH&hqaMG-_nc-md2%MIjo@{J)u-q4a1p9xpC8`8b}z$pJY=z+$QsJK|z6d?c;5J zGB+6oOyvigneyGpBosl>^iPd{%k9X>d?+EmrFwj!{U@8*Oe;vvHof`yVId z@9??@U1;-w1rU3#TxGZ==hM$`vm9c~Rk#RYU*3-@=q9r<~G#XdQS zF@Z?Med2E3yeR|LWrg+JZFPPhPZu2@xvA}Gq3Y$0`a0@($Dg8g@}9X<4m3I4_-u3- z3~pC&>#?Q`6GXo&{XA|1{7~E}_saKGzIsC{b1%1lZL|l!ef8?<%oViXV3-mp?)tgE zuU{YTy0oSbTX}SW;Q&Xl5p1S*Dl-V9U!~87L^>-XJ2=zG3g1_@bowN@%u3pfkVs00~;I3m`D04 zfiHZ$PVoGRZ0Ln}8gg@T_Hu$Y+>_UV3@rHGzj05H!=qqUWfJH9?C=p zm+9*>v{)An2I$y+VUy9p$pKxN3`xGnSnlcX z>gvk)xRh1fOvYHjgNKE&hvaQbVIWRSJ_I$HDBPEWCy4~0%)+(cP{e#7>hLf!80M6X z=X1cwzoz+21aaDU_L$xH9~3PNqD{5>>2w#x(D?#BK{`36w1l`TMg zgTHnQ8iEUcKb#Xi_?N@LaVe`0eJlNJCOfCF(rMx)++*#6us35=6 zjC8!&l4rt%)ov(T_i^kZ+K+|9aAxHY;zIC|s8aYUK@!e=1f^gla1oB$p$dmHlCp`s zGe~}R4>@-I(0l2#MkF>xTYG)0KAZW+&;ZUr?qoHFv$tJpxxKxvkHZc`#;$vJ_QDHvNc%Uh5@&f)L(Z8oLf z#!d?=ppSclf5?q&h3yFm8vZ5@(oj9?HH8@ZC0vYn1vQWzKtIvJ!`cJ_4|2CsCS1|E zSyK68>9@DyX&;v`!EnokJMXfJ%NeGX`%Oaf8u1y~?nDu`K)DtsrH7Y|qV$Vpqd;tSELSAf|87972 z{|@*9(0MJl>CpC@&D&UUi^li5Kp~V#BOld2IASG@bM)EKdm1rU?_EFFHhnBwOU;7G z#64;lUzOYnJTuOdyT_Ncat;1-)P}+>ocGIhI}i9;OM7Q8D5cwwwWMFfA`PwtcO@?> zm;{iNYdu0jQx>*gpSe%eq|)Sr01Mnoze|U6Wy3#c{?K}EFTBGSq)i4Z_3I1b8hIjC z;4czMCS$^=NP8@cxu||xrD)nU6ckXsad!>3UDs~f)NM{RPcXXU<9?jt)Q5Wb_yydg zWQQ+QMQ6vgGMNT&I)e*A63RK0<@9HDApND~x&)mJCaYnfk|}`*L>tIYZgaR%ev=7z ztHI-a<6r3LH|4gW7xsVGn_M^g#=rg@xnZOT&tYoJPu}2%S#G$>}}GMdDtoJY4M88SCMyll8y>DuhhzG5czV1K?Hs z5}#u!DFPE7NcCd_Ut(|!l%U4Py|Aozv^hN2IP_81T=?K$~Bbfh}6Kpv!e1x z9~mFcrt$l_`T{*mKLS)sMp*IOS*=oIBkVim+CA=T%`X5Zw9-N0;ls{!nNIs$`0}O8 zo0<D{LSG{ULHb!s`98Uge$ zVQ7=mM=@izsrQDY%cg1ryMd`;BUEsaEnTsq+n8UPbgpJ4CxJwfHVUj%@_jbb9`yC~ zqaL&M>ml7>u}i;5*&~=CX~`B3dp6jx!v-uLmiyj^VYv*trf#0c0WbN<=x-A5mj`a{ znh!3RiN~Bv(~34I`pRx9HlWGMiIe|)zTRcL#_^E>nbwt@yZ4TFl#WnmGcF(wkA3Wg zzle8=3!{!AU<~L)G)yu}{Lw;FB7Gn%k>PW%U?MQ`NV-BT1uht!!!3P^YD!b z;R=c6JbB`|#TwW)B*zmHW1L|{%31mE*E{}koKtW*ka|r3FGSWl-)G&93vqt-7n8_- zaGmdckc~SAA!7T9r@{q94Hd9?+n)GQYn7;RAL6?s5(@#LS0-^VNWU7U21YRX+aUWp zz^0??(On!6@iO-1+=*dRy}ezRuY7f|nOrcV#%c}X`{OK@`3REO%&7%*UPD1^OQo1G z=l*AjWJ19rDLyA_h(}k1&m;j%;=7bK1r@Exd5K=o;10CLokNQg!FMhdk*q(lczoDa zT6l0UB@d}EYdM*WP8>=~dI7SK4UHmC7K}h|z<}030l{co*iE7AWbt#N8j0@f#&^c< zQ4v{#)8lQpt>~4v&cNZvxTU@Un{(1QHi!-n21`Y{8bWg+1J02=2&%>N670HBBXKc9 z!WPqyB>8Ut0ehsPfa_O`t5T^`$Jh4Qp}?bNQxT=gb3fcq_zxE+oIYQNfR_QARZoixo8z57nOrP< zA5x4-!>TYpNV)<*d>FsGhS9PoZCkh208x}-7ld9?&HUZb?;rP|&{qW~NA+X|nYpIu za%ejo&U7q+r%qKIIBV0YRonVB@}Z%sh-xQJMQeMRkH;9bAQ(9|foLWGla`X3!3Ye1 zIaR7F!hrWYolFwSyd_IQ(M-~ja%Qh){<%IMnNC=uaQSoC6YiPO5||}f4irxFc}t7` zeEqs`wCZh6I*tJEx$Xn{_ZO^EF;Iy$H8Dv+q{Mg+DS%{>2l?0H-$zh|dv4t$mR_|u zTTx#hz1xF<=-%H(*wZ7oka$xNF!1eFk%#^*H^qLpeti}ZZGnLA^dwr^G73iyIDz=l zT#`?gwP6_{F(m00y?j|4*Di70wJnF$zJ9=6%YvSmm(2txO7brQSCSw$hjXM_L0gq` z=7~~-f>{+Y_ko!M2dZX=&clX3{-R&Z&34q&+Xt>%88hAj$<4YJJ=A5m0|%o_+(o=L z83~$HO3Eeri1pndJzlxi4#2iPK7D0tQmDi~iS3l*W-THCfB~RE$zT%{oC@VOoi3|O za-J|k3$+3zAd$nBKYsX^ciC)F@0shV)rYLFWt6`udaJdv6~4HfyLXRYeUAmod(rMc z^Z+eRgoI7U?x1tO$plUi>~FWYcn7Asx>`Gh-ojwULz(q>m->&fZ?!%=KCu?Vvjm2o zc>nCePX2oh37)_TdoJG$6`7%OoapDiOq)5^l-sxb_Is{kW9eOJLb7MJt%BhyoBLwt zPP89{$}qQ?%K~T39_%9S?|b^$Ntv%)%gZ}T)30@;K~Z)G5=*HZ+)9ew4v)2UPCV|g zg7XP)k@y+UWVh};FW|$o3*$<@tege0E?mGLO{yLuP$<~PpPsk(Y8mp<)@<3CWxwV! z{%p*g&R!^p;K(#7jpRWszic6Hja4TXsl_|LantU6mP`r}f-y8{!Yr;WPC@|bT1Fiw z^Y0TEj;CN;S@r&uc`=CT%aW44L`1U*k2zZ$C2DZd4Z8>3YT2ESn)_h|ONxGe-q+Vo z2|agmL~`azm~-;f193iU-A%5tO;TpuF@%L0J?`kj*?H2yj!mEYs$~ZQ0}0h5G{NT` z6QrEOCIBoK0$HQXXBgj`wbcXU8ksa{((s)bPJrpBg~xZbu+Y_w9UouD0wc4pCcu$N z#c7J?IL>BQi!Pz&e;KCYof%kzfqAS@&U8B#P=Srf4iiv1N?^E=O)J;1|bh* z4rDpPKIs_n{nT+xGh#qmb2eNE`B$;XB4x%4g4t4S4=y?gI~X1kBUJ~h?aNw@9>~y3uYwxDU7(i3f@ftk=v8r z1S(x0)4{i$=xoKuO9QF?uHLGSe2GF3_n2LW8csFSRMyeOj*yc=vG7B_&+S(FQ0KyQ z30Fpe6$^+&*R-c#L#`HS1R(K#n{wmSKi)14<9_XQ@>l$4PX5vM4m9OC*6uM)O*y8r zH3$BRz55-+L`Lm!I@1+WAgO4Btxv*R&kF+LW^=cx6OhBh5gQU|mY%cO@)OQ3%-|tN zJOx!WHD9|veVTI|IDEPa|IJM=S`zT=c}zv?KKpTF?ywLbD?xc#2S&@(P{anoQoFs@ zVa>=5>6NF*Um?FbkT%+R-iSL99R%6uYS9_S;@m?!c&mz~;z| zZk#a|TAimvK`8_kADRqnuX8^)X-4BkYUzWY)mJ%ew6MZIWDzyHT>i*mE$*EmtZ$2kF39vV;FUC@PgH!8adLqf-|eH{jzfX ze`81v|9t}&osiW$?=mr?+=WXq=1Y7SsPlZ{M5T98Yg=6&}2L6@gQ4kGWpAeNpS;B@sT3+7^|vC)=E^gvTp;&&y((W)V!|{6D{zb@zFw z#lo-!Lz?w?f5lbk5sXhzEwn&V`|Cj2%jutBp>rk@+%ew=s zr>o~lzzIE&l)a3xQgJj-rzQ&hM$_4;(beWq(O7^->&kErnWe+)VzHC#oq`K1nvw^k zR=@s~*{CH$(C~p*tf86^1f817r+{r-#K|80xs`GM;E!IA!AP2yO-s*P56LFS6V>0Y zgEyvKgG0VWIsqMRstf~?F+Fy_Dc?jVKK_ia3N`a!#IB9(am*wx4EtWHrY*TVnAbWT z%X{>wx!nBh@|iZ{KP(6yr?pa-?e{k$2$Qt5A2cXjpV?q(f3r+Ls^R1^cvVy%B4L-! zNO2@so5VLYalnVd|F}BjL@#16c{*1p=K-uoAD-M)N5>Q9eLF+I>or2%r^fn_fei$Z zN@+fE;zX=xlg}*5V?*>#3Zg)jk;r=%ommG;7e`CeWA@-^W=B{9-byqKl-mo41uibd zF|O}VC=Drb`C2*m2d30z{i?(eed7qLWK`D#OW@`2Z zP#_X#q+UOE6v+V(`0(A;8_^%okRW5465|i&e430|#$R5%mZh6rdYvy0?x?Mn_5w$v z$L8I-LGF#d+0*ZTS^$~Wb$=kGDVrR+UQB#63FXk1ia|wX_Czh@IPwHJqP?9|?%DEv z!-8p&UOIITu{5Yx81~bjBw{>-agXz=v&xU;e*gaf?ccBXiVtv8Z@~ffw-`IhRBA;_ zd3$SbEnG`BZ%#ulZK0vW+KVpMkV2>CrNv5E30*|q_<%|X2Vho<+=&Lm1 z`}n}4*A4)dz_6VAv=EGYmNziHFno9a z7}yLh|FsA_7~<}6Z{?r7_1s$dcki}WnAG~)yy{G=OikTRo$6r>2;zy;4J(RJCm76Y zM72LSx8StAz^J}VA<)Ea*{NF_ZBLe=j3lJJCX4E!MXGy!u5{XF3E4w|5KN?`UPnDW zJ&|_e%^E5CBK~c&-t%-tN`yuqz=oeM1ZQVR4T&g720Tljo|@bCe-zPAJ8)_$oT-bp zvAja5l8doFc$dvZV+Zn!cTFvM+^Gfw|5Q$nv3U0E8OQ5jnhEaxL%xrsQht`hVVr)g zAi2wWlH|mSA^a7Zn~>k&as&-l*EL!SnVX$2$48$&8pmK0*!M|Hsyufc3a``~S(15Hcr1nG=e_4oQe2 zk_w3?W9BhZL@7g=BW#isl}uaal2GQ9St$w0R3uT-`K;{sJ^$-E|M%M0IeSyT;d$=o zzSsIr3*V;~?ze^wMR|*LQcbBSTvZuc^c476SGPk09cG*GGu6!K(ImT(jTE_cJ6IWA zm=biS(%FC|OY{Siyh*U4PCZ}e^~)n#bsD&W!I47v zx%cII+9o?dvQ5ux7cy)mlv-9YLx`%M@Zhbt!QX*J#X3w|$6IKLTNBs8j^|BEuS3h< z8o)TK52szPs_NQ)*NBOY{b%|>K#5y-?zBI+EhmqMaVty;l27@6Z1)dXa!fehj#;SR z=eww)r(#c?iGk_kgb81cYH4d*SB;vDgh<=Q1}=H|bZ(>AvBMFWip`gc&7dw@5N9}QM$=kA09#wz;K!+m`JO6v)@%_|BW6` z81%Z$^nIc0*bRUj(;?bn8BQ#+hA^eLu9A?!`%_jh6v+jLvlQ#~>m!!IipyETe^S=C zf6ZuWxxTAZT&x_G9m{I&HJVxNK>M>(FdKzvNyQiugLiAymui!o>i}R3fGyP^e6-yY zC*7?FXw&|kZiTq%=Y)GbphM(q@Iy>XoWz~e5MLZ{J8j>WRh@77Qb#bzr?%CcLI#*M zBLS)VgU_#D`-{M(Y13TPAtH-Z+3`AwDUmH%96XbaZhzXxkGXxg0-NEA(Nvze3$HzS_k#8SC?b zI_BAbP~GwU;)M&RT3Y>4mk*(jXI(jj z*Q0%v5|RH#Tgv#>cb?vhMBMiN4MrQMXY1z)rXzWA_z>oR&>GKiXd!}n!0tW0BOE1v zo=(T(x%#F`K(T+Gr_Kg5z#Cb=X~?$7HRdl$5gFZS@#R>tyZebkj;ffkK7k=2O*yqx6zJ<~JS5M~LE^DuEclRYA1~j$DRJn>55O|j z5D3%rybtNPX*HH4PNOv)Gq-PfpYG9PD+rU@YdL9LbMyw(fHF9gj{W!J#Qv?1kG$tL z)so<#KF43(wMGN5F^40d4^;|*l9i7a2*^hna1}J2gDdvLHO`!5a1H{v&gwn8P3t&D zVtw=N^5|z8apI$0f$2MP=F*5wF>LAsXRiEAAxC;P+k2u_*c0OV&DO^?eN@_Bw>QOK zYo6nK-x<>kGqA-6@=8)Y^yd8Y>JpSs&ZSd@0IgCk0&{hZU(`C;qb&&@w2fw#hK@sT z+{w%;DQtXCH^hp-FlO}Brx&tn{?x}=)RH&uat-NprTE^d?^Jft-hYU$Yi<zRMAZ)IYMvJkl)n92%B6^X49+=CfM45fS$MCd(3GA5=%H@WC{Zu@Yl)67O2^l6b*{{N_2$j>{du?g6=t#) zSIyEMeSH~PffPVktP6F?eGyq#pFX7t_w4sTavlV8H|W(X_QYm3iEYilPW0P&I9e4c zkKxRW_U}G?xXMsUkee%LaOPtkIyyN)i(J4r#SFjFM2CJ&Zv8&*9wAl}x{qAE__S>~ z58M675zQle!-OGYIW>L;cpRddNW&*_69WOd5KjsXDtbaOVj{C_$NVa;qd@KGZM$l; zYSCgnn6cfAQaU+N^nO3zzsC{UPUw)XB?(f&@IO=Mb?@RXsJ1c=#1A8jr*qVJeQBZa zKX0t$$QL?%WXHiA0PO4ZxAxHsnx-us;!pkRMwO=c!j|Mp{kTU<_$`R;2QlJD1uzab z+W&`I7EwG}SNZw2y7I}H%PTe-ATXj*U+GN>q=qG}N*jcOvM=^T80R4x*_g$fj;mmP zSK<1o0z~zAFc;$prVi1zBMeVst?l@ZZ!w%EUh$<{4ad<52?8F-$)uxl{qKpKQ+}ZHj7@Pg??$P3oKh=}xYuFObpK8n` z-_u(F4-4of5K%hy#N}ijp!NQOY{wO!gQU%tL!+1tk&I>tH_4lU5r&qSmIXl0X}lHy zQ;a$TQc0tdQKfJ87-M`=7)g;*#*xJzHNiQnG}LL=Zg7{=Fbs{!yi=^cDh$8^H&XpW zo%Xz*Mk5~1k;l;+iiv(vcd0)ib6KRTId}GO>@rmb@D}m{kT;?D`QHOqwMNClZ5y@Q z2b{#5R1f6-rXzG>M&G*l-U0ZyYsWr)b`jBI&bfP<8bK>Q67R^-xp#O%JRa^mD|If$ zvZyvIf2$~Z!RW~1c z#9vv&S>dic<-A+I?&!*b$2v8Vz}IIL^$*raRDfosqmY3Kox;4UHEz7!V?@s5z<_hV z8@a1f<02VXlbcLo^WvS;TywSMt-)HVE2z#QGvaru>Gb#vYw`5LlCD%)uwy^#2P&W{ z*QhvUcB#w(;c)7G?t1E@NA~l+o#-NSHTlcwCk6mH=6Dy^L!uHjI_%!yDfLDKzx_ZI z!uya_9V+wQzuy2c!|?TuXEo8*oliE_3#r5N^|IT}7zuQyW+5dAFRXI;h-gTf@G$S9 zE47wr-yU%rr99Uw@6!(om>-ZS=Tqx_38q}W`{JMBYC21%vcbu>&2iPpI1;jJ7gikK zLW3J)kq>2iedzWJ?wt7Dm)$mX8m6sbhdk10 zd4!~PtBsi&=4v|r56{q{G8}JXp~3K`dV6&zI7f}#ot$|xOj6Qwbc{M1@9!BiapLBx zA2ymK5D;OvKkNHx*pBenq4AvIgOun?wCl>H;Ptk64cVB~&|Gb%(c+r*pjpGyXDr(k zuqB1e@HS}v-u6>BAKoq8e~X6s@QCn{Z9{AJVSeMQInEcxXk7Kw^j8#z>uE4A7>{zh6TiMsl3$jC=Xmp?;o=HH9QTGZC*A#uY;?DYIT$-Bq} z(26+N)Bn=n5R4l#GHm@m8C$8Liam+s!m+^yu2FPddgJJC<80)o-^GqGr#N0uiS>Ai zK9_KKoQxbrWgvIDb9(YOf1~ca0)x&eE8m+mk6(<(tS@5;| z`$zQ2@or2Gglc9%YovbM5?goLb%DfqIrIHv?1xVEFba!0eYy$b9^+fv`N#-HZ1|kS zA$plY1>n-oFg96?D#LZo92r+CFoWE6@c3}s==;z#cwNNg;8cF7;Le5)=+itblWrf_{bpG{kv;S3qhzCr<=5 zqH^KENP2f>kBEY}m$*+GP%SW&H5>^rffY`XpR7lYyiaGX_>#|qDq$@Y(-q)QWeeAh z*Eq*ydfrtqdeAmbF~0I)i<8H;TSX>wt-&(V_U+=|QNN4bK;}wLojO&{QI0T0k@>TP z@&eT$;g>Q+x+mBcr;D7`To$x7U%UgB^Z*26sdB>iS~kkldWozS5~404R!j2^;==MV z273N2aU|B(Yf1l{?ESA897{e2_AKupDjzwi*yb#N)U8I0hvCAB)Oo8fiIUT4hgrd1k=*9!l2bRc(+081H!z z@yKHVMu}sW1s(0UeNecKq98e_KXGEF*6}`Ni&v#dx#|(G1)pU2{4dodfdBrDVQR=}2AdT~6Nm^U;cr{?Ph$&kF?g1pZ%M2qB4u;X= z^~9_NiOGI1$09E)g`<69R6To=JnMCp9~g=W3w6lVoSe$@d3R_n@iX4%>m>XDUliFUzC7@->cH@^V^)bq zlU{|1xT9f1c9mbb6$(a=1>|L<-r7~LG$R30NBqt7kBw)uy@;`7Y)MU_>gaIUt-pNF zoVTbv`jH2&iZ+zWZ_kir&>YMQkzH-y4gNP#fN+@~rF>buiXvQQp3wxWRC%%aI7M&w z&U^gsl95(D0Xh#HIIw5Zx=zTZ&7$qxIL9n9ucxFO1ULiJN%L0!`U;5CIp&}>RFupX z_)$M1{U(FuSQ^Z_O_Jpd0^Y~Otes1cp}V$s@!dZ7Fs$QheLv+EMBQ1P{?$A1U_QMv zF9;VmW6PHT$9c{}cki|@3qRh{H69sc;feRbJf3J}?s;m4WO&5CBm0p`kM^qkPWi4~ zyYf)acwIIacc$Kv;ToXkXG1;c{`x$3+|6Yl9Q#PT8eG;_D_@T3+$7}QzR{MJs~zJ4 zAjXWeg0mAxw~>aMo)p1b()LxRYt3~S*vHyB_uF?vn`wVzg+8->h%V=DGWJjr3KIVQ zBxidj1|VVa4!qhk@C9s8ec6phj}Bzt1a>$V%7Mh)jr6RyKkGYiXXhq$L?}z=(Ybqf z3%YvV1d)}y!M4xj>#$qllEoF~H>;>UN^thKc62$C*fYZj5+V?ef%jASHP0^X)~!15 z9XzP275tw;`pvGQY3bMJ#g|yEg0q|fBS+rpwRz{`U5u4}2?0>cX2HHHe1xmbwk?7@ z`eVvP!2{Nst03YCv096$X+f_#c6v<#FjamP{=*~^v+ldZiU7RRxl5PTw$ZPjM;<=x zXP8n^I+lifQcfrSlgmpB&lTP_!e~iF$c`Q8Yt*UHI2?u`HzTx2$o=ixtJ7A&vwYSB zW^~Ho<8vLoG8c1krLDow?N?g7k>TruSxUjvj~dw{E=70?_+#vm0|UuykAM|%E%!Vx zTW!z#-MMo#1q;HqADT;}+LnD6qRA^W)>>`7X|RPK=aLLy zkfnC9Fi`?TCBpK?jp4wUMcTGi$}j2j3wE4m#G6_BMsgbVA7Y`jrBUW7Nv56+Tb_gW zOr%*}<)%=3g3r^Ve|s)bG{7a|x7TzRg0LuiMWOw(QnZL;sMy#masmIJUi9ptNU)ab z^W2Aa+C+ z-SD|tT3mdU?=tJeT{HS8z2a&pMtEfa7a^#Iw8f_`<2VOHmM_H>SY@Rk`#6wae6YwW#E_U z3Pa}Vk;g5QlqEf(Y163&?_cKSRp&^=usuKjG2t}~+scD`4rzUn1~ki1D@Fn=9OIg? zip8X;D6mm}Hl44b7IQ%lK_wzn;WP)X>V`#-A|_wv!}1tr1XSMHuypp!O@vp(eac&pkvI{rmRPn_5?Lah)5 zr+H~H4Tw&?n(pcl8t)j{i(dQYBlWiRMqF)`*Xd86VpIq9#GxrCR3g4Q{oA=XcG6Ho zD0on7T$hf&4mA8zKvR&r2Z@iDQ`tMvJm`S5E>)FvC${LI?)er!hROTOA0E0VzBAk+ zx&72_YgTm)Re!wx;D3KR9{ z?yJey(g((HGpsNj#>;>C3pt$32=>&xrdFm}^)cutmIN8f+7$sOcg(uwoC7od_x&)? z27?QH(N>MF#^9l<&%VX+EVgx?PdbQbRqGZV{`~R73+N=SQev^f2ScXQQ`@a>^xwonKT?BlF?aUCE^*Qj>N}`WBZUL2g7fkrS@buCq>i|1GMo;0(CWAL^EF z4-Hj|bC_7Sq1>7tRW3j(tLP&mtJ6fug@E_uBzTH}mA%~g++{YSHHHp#x603_jUH#$ zk-i;x%R6vzjM<;xz+8%xK#DoSA|{`^%qa_t|Hym_ALm9fa~{?L*0H<2{P^*XXWv70 zsv5L3cI0>2gLu*4Q9RU?>Q!GThA$*{)!aiSZ$Xg+LlhQk*D+jUA+B z)NsUgYZ@{$Nxos#<$QPn27~0=>cCA&)ILAty8XFA_~Vt6p}+MT(-5~}gmOJ#C{$o( zGy&T6qpSH8x8)*94{WzKxT+(z=`1rQ6Ma^cdCy9kaclX_j&=W|1z@>Ut)@{DcE`@i z{boVNn6>-wU1j~w$J>kRhjTXZs*ZitBA(fn^3cluDPPY>E67kX8<38^?AOGthAfB- zvr9kU?iKKW)?AuP+14a6g|_EM{k58dK*iE{h3`t!b_hSlj^nHrNT zpDkG0=`@r*6sOWk>FEvT_0wJc&%?N^S>wjlgDnIVkYzXm8zZhd-nw1Y9oio^Ibl!L zDh|Gfu4e15U8$a$hqV4I2FVNv-}1Ya+#e@6OQ>>cutQqk>hW63nrUg(IT`BVEpUbt zg7_J#cSiUouCBW2tQ1m8E9R4UqZj%(DP11cKewlqskbIWd|vlc|8s%)a{fGVn7q9S zGL>`kKhH|MP@uWME8eVXl_@41}7tn>ET0N87_6o?G~)4rj`L zZ%vUtWmJ%%^#6P&d-TP4CV3_gX&Fu3!I!Z3AQy6G5DinqR;_{{@~W0~)z?V-^Zi$b zwPPKe^G0*06_4)#f&xR%fk4?3=2E<8L(R z&ou@AN6?=9@9lUGR80^|)kF4Ko|ygJoX%-ft(~gtLeg(vtm+Y*0RP=ymoW}-`JSG) z8dKVE_&&Tn;BP@70G`KiT1{=aV#Nyj|8^t<-ph;bg4_vO;1%bcci>lYRI(1h-0t2z zA>unslFST8vJ^A>0p>f1imOn?$M<0|KU)dcMf zrNiWE?$}WSY)O(vDMS2m8c|7YoII3eEQ=Ss^&g&p7V^a0n^Q!W9VdeX&{%54+q_1S-jGZlqC?x>G*T>8I8&3sW zlH?YYpx}Vb-{QCcl!~aGw*7y*YKLc0t15qsYzfq-5LygUXldtozHcm@eLj^AEH_fs8mv({^c&I zA!LXfW$!^gx$*n$m-<665p(QV(4hIDTnz)giowgiQk7Z_yzzdGL+o|9+mk%1UVpXL zNppiFl7n*P&o|94m1eK-4t#J31xgzbG5G1g`1mD}bGVXnxRFGjmcBJgl9}kQ#AVi` zPR+BE;v5!5T<3OET^N5Z{?pufRTLPchzFbAhQ&#`x-N_ZoL*Mva6|fVI*fn&ZQ3UJ zInreP&QShKm^^X@URYW_7(Q(=Q!oo%TsXmPjm>4CFWNJqwz!MnqQjeVz8C3YfS{T+ z$8VL;+LKzb#H+vgjoYH{5&XETPj^V1I%})(F3#90=0>es8y?-iOGeO{Gn>mK5P_|ucf5u(tXe= z(V2P&7ANy_wG|N=EZ^jR>CQE`vh7(K313oLdIy?mofoqe=e=qsCUciEiuh^cF$9#b6tehj; zmR28@W2)8zO{SRm33d4es30F z+#62lmXCb?`nGm|)rMcqU7h1{D8z49?V6qHRqr-(^fFOIAWFQgsUKF@i8-&Hr6!Am`o}${9O7wp!bIe@;Tn z51?g&#>hsS@s7^x|D2vPGsu2B3Ee55V~Yi2V;V~&L)YV%lK=Z5jApV%c&xkw2T>B; zL)RuF?DU-z|1Pvy*RX0wpP51bCZneQe4S-g6~UH{-2fZm1M~ju{>}gWQR2V+0JFb> zP5T>}&}Obhy^!O&#iQyA9gbDZS#7lf*eCLk zpZ}>twsZ{MaEnv^#rQ<;zf6A>4aUE;>wiD!He?HdPzZm%Z`UqeYO`bU&0_xj$X%!* z0Wkz;th#c2<%0L9Dibo=FL`%gh4;#r?=$l>&m%sue-B!nxBV13#(C$w#+Z{?V}Evz z|MUaPM`;D8y!@@Xb$E@{X3UeNEVd~$3<(Jt6#Ho5Nn|h)pFrA%=#KFT7$2+Y&U81Q zg0#HlJ9h3|W2nk+aE7tVU-Pw%9zqxg5RV9Iq-L!;!_}78ryRdZ<_SxpR>CUj#DJ6~ z4t4S?G6PyRzfCqo%J0`hglF;xBJv74vGgvpOu6LZE$2s;ZFEP!kG~-9$rGni zlgoFGx0#u>!>U8Y_%DsBI;-K^cOc~6wyhDwg5=N|XBQ&is0xyNagnHK(S{4N8|MAB zw&~B;jTtp^_4)G)_1pD17S(j@ix)2>mk8kF#+$Dun_@n{yBEPPXw>=n(~)Vr8@O<~ zfW*7<8k^tPcwj{ptz*eqBZJ%&g$>a-d!Dq@_wK1GV&Y`%?+7vK*DIDLjj!-iLaPa$_Zh;UgoA2?<5wd>bK;4DQHat}$mLliP( zUJm@k=X0EGGM%~k2sVLq1R6>bR`7EL3{rp8rF(bzg>$KxE|--&8h1XG55}Q1@LVcc zSez4N7f8@l>B`5SR*)hAqf`*jh!EoUn<)|+43_ft`+B@~Jdo#8!6KkHPQz}e_07|rLI8Te1x>LKhqC2oqNzp zpp;Ww=U!Y%#<<^747LuxhPeK^ru%G(!fmTDKl9DPze<_9`YGgloI~uh)HbW`(423- z{bpqQMr^2MhAEmCkt&~E1@h6tJ!m<;Y2^-xxn!7pyxrsS6x3lVE*!P)6fZ9AEP`B= zbE|0BM(S=g;8{OIGZ5tvTkn;GTY4VtJAPf&+l|H=}qD{%{s~fx6O|IbX5I z6Wy#Lw^@f8tY#j^=d6T;gl9m)yEzZOui#;yKorG9)H~Ia!2X{>xSuZ;uMg`v$S{TM zkZTDR7ffZt<9|<)uLGyv(Uc^|6!yzhZuC9vd`ixdk+vr(ihG?Le`iwlapRs?ITxZ_ zXyN1s+oRUyN_+!)F*7`{)!Oy%&YrW8lo*)C2^@aI0?X zC4A?@KYRLge(JKXWw=2$NREkN%6K-44-XDEsGh`rM+BoQ0V5UVIhE6b3@K<^Cw#bs zY4dUT;94D7nzL5F$di|Ok(3weZ=0&Q_DSlr(+hMnBnmin)Ip4rSr)WfgN z-K!`3WR6d%_SrD<1o$%*<&Qy6#Go)tC2kj}`zaGt6k-n~9z#*s<5D0yHlZIHr2jjo zMi*j*fCon&-;7U1?5uEp?kPc6Sc0)fHOtw8gn&?hS%Ro})Z3W0x=g}($fx~G%JCgN zu%d|s#L^)MX36FwB|9FaAMaz2qw4u=wK=XGgLuhH1g6A(uLJl9Pz*)IK9QxyH5+!4 zTnB>`v7-sy#|C+WQ#_xx)H(PG=C@QJUi4uPJ&Yxr9m-1~fZx#T@(ao+*Xh%1Q3xpfT8IPU z#7L*36g0#o;pEe63L-gkexfJ}B*T^4CXQ@65Wr61{xET*?JLI8md;W`bfj`*_&e@R z08gSDnFBHn<6D2S1QtN%b~k--s%4Pj=lIxr+w;q*pWT`9DLO`I#&|7fzfOm(_miZ; z2Aco8X_F@6SyJ?(=2^9G#GLV6{X9`Np%{t)nCGMNdvWP&{({N;!I+n>K85`!JcRsR z@W2C|lPI9zD1mMK$`@crt|MF?WdLelQC46lt*y+bb(i_&(9kx~cKieBq}Y6!%&L5&Jh;mjcxmBI6glP{9FBa8@A4dQXf#I?F;!gk=aEvn_d6?@>-#GXm& zC{i4zGUHqWJ`U^Js4=#CVyY0{pf^Vzc{Cy+{QMi-tj|4y&(T2jqS&* z^NlyR8F*|#8+foRpVeTzgV4taL55V97Sy3 zG$X*O?8l#GIbI)|&mJJ1A?5TR95rR-P-kC9C&_lPvVz1r)pk3@){2J*$RDw~ zBqSsjos9j52WhTW!9Px2ot>RI+~rv#c1R#{<>le9m9HAfR4#)37gjuJN?Hohth&Ur znGO9~31FWGOO*C-G?!j>PDM5(M2AH<;;Jik>eglbZ`RwWYCkN_;fW(TQ@BOik(Qv? zHHrRm1Qt>Q0J{m@gt0CnL>OGljW;V28IA+CDk6-EfKO9ii85zxln+F<ZA zewYA4w~Jc(So)qNbORK|EJ{VsA|j^c0Josklf3Cs$+5D8Ku}+cgivsST-hyW7w36{8DK4RJOoN%YR=4xNk1GaaD)z2Nu$ zsJ$_D?Aq^Qax`cqx!oyP5@}3xs`YZ7Cz`3@7PT=MN}$_N>5wP)E6#6xqw}v_`Pu#Rs$(yb!kA9es5ZgxN>d8q&9u#QZ?*^pgNll{=gTbf@t;UX}b&8es-$ z1F})rZrr?iIwyrYMOgwM*=*n+)zn0~pSleiOs}(cjfxA9Q{K)aKX@wZ?c67{PfLo~ z>PZw8=kp}l?BSS3khLESEj z&##0;c|wDg_5SAJmopQ%MiOe^snbD;^N|-(XYi^sxLo{ zLjTV5=X>Nby?#9<0g%4%*x66yqxaZrvLt5EKuPk%GnTdBGV5|F=a$vxXvB*kQnSgs z$(r@Kpx`EgpS$r7W*B)rsjZYhx%~S&k}P@ysyahRG8BCq*RM~X)rm1k&=ZV`-jU59 z(*EPw_-RSl$WF24EF7^Mad=ONvN!QwTHX4kpPL!)NQKZ}DqLoY~g;W zIQm4M=!v5#&^FqC`}W43&im#%D_d^A$=Y!pZ8ZgM%h|VY-ds)ml{}5Vimo=GD8BNe ztjrwA$%_{Wx2kogay(@sVBI|DLHT=JpsacG z9y>wcC3nH>`VJd36LY<$qxBrIe|AR8kU0;Qe?7-RXFsZ9N{|l286+qgBFiF@@!#~oCC_(;gort9 z#m9H=ZUoeYq-%}iCh_SJ9#9$9e7Y-k2r4*P-uelY!yK0Dj%n^10r%#EGh&t{Bf z)Tt$vG0#g2iis^e+WocGb=_tg>ovN3>&$=;3zpPAvFT*#MyQ0Z%U^tOm^5(o*#{?2 zoVZ`^Y`&k6#geR2tLG+s0y9tU>np)1lsg5h_y@?$?Qhbnwn&m!|MQ_z1F6W$>v`b^| zvr{$688cY6QiKS`9(Maup`{VLFcBcTSJRy{XA3pL{`qdsgKkKoFj&wMvO%np_`I|P z|7tpi7NDy2iRyCAzs(Llr(|bKo+)nMjQmF)OCrbC7Vg^iiD*0EU~*Z~!~~7mK1yw< zZh9~4nUB)#>*ILvniDugZDtJubyX-+65b~r$_?)lacC5ezxX=SPK)^@y#$^3q234& zWFW>LfOFKeX&w27RTNnj4r}Sxi&8`#C#B%5+|3(xLkFzr&BGkbLX}4j;PQPIaNGHz zTVva4sKw~dgRPIZjC1G{Q&7Ou?c~}$()Q-WR&4A}twuMCqE%4Me815uGNY^0V;hGo zuQEsDGo|fyUcZ62j$Q;Ju?(G9*KR|98*w0FOL;ih&VNhPT!0plD(1L86y30}9iVh* z#*)T4`&^%>kKp3X^bj-*1R!j!9 z_6|3t-VSWda!8g5XBxTCj8v zccmCsNJ}uS-8!^TWYzm zTw>CiyY+j%#3N9nwS|G;3=zx_kzo<|j~ltlS;^lN`BZe)1B(qgivsXX>!k@1iT z-UFZ5){P$&=a7d5;K5$4zGzf&f4*eEfdzrOk>$K_eNgRJt(ms1LjP1vfhLKtNL|S& zTuI9+ScE5H4Fn}WJwN}R_S}mE9A$eKTSpY+W;Oed7NEjn=ujQNY)Yw?;T)y^qQ)|8 zXH{i+j*O}^YkR+60Gp{q;)pZ}j*ZNgVL(L;_q`qbHUX)zn9)2h(Hx;y3SPk}>mri^ zXoiw*Y;CtSB!mvwpQkV!K+x-?h{C{1^IC5lqU-PP|E|Ld8JvSv4QJ-igE(;{P!!h+RQIUltEEwjL)=pluhUHJVejXnuHQAaJfx!3ydzFR3Ar2NWWmRGOi*5T(?UR+#|jD|t{IJ<2+zy2O_`^`s!(_Juu zsVf4%VWf5yqs#N%p`j-*g)9X7#h^F= z^FSyuiVG45=(Tae-RTV0ROcmC04;L6!2y1~c!(A;I^++yU_3CN`0oDX2kVW#`=Wc`DB z$D?sFDNXa|0LY}Q{QYzK=P$%JJVRx0?%FAyl#$VP3s34ho?aJ?E5wvX{1zlZ^(1z{ z@rYu3_386u#BVm{P)?{Ty*a%;_a{_i0`1c?K(~8%-9piCR!<^&CK;gMy#IKRRRrb+ z6p^IU++kYLJ+SEi2NxCtn2L+DPf63Rojbc&McVezxs#SQ9nf`z`I1ac_oH+``u+Q7 zz3dP0)RHkoo(U3L=P-HlJvK?^{@m46mSTvB;({?&SQaE(xLY(3M(!uB0S7xz%Y*c zTfB@7$a7)pCjbkG#_Ed5#m3eChr+9s+sWUlC8Ft=83w1k@cgA)1?xxmTsm+c@vXDa@pqk90Hybvy zR_jtL*RnBeT5{9P9Vy5)mj4w^q{gc$rD7U8lZ9)8L(?K#moAy4STW}h(h;N}{msP#bvZ9wB<$Qk` z65+d{z4_T|_c>I%R1|q?M(yt({p2336Tl55uMU&CyV<6xau zq|%W)jHY5ZJO? zbxS58N9gpyMAB{{TrGgZK;K1K!TDDOI{}kVe3MAniGj(&_ar5Ng;rPOfo1n1puBMR zD}wx11zSuHlX=*p)&uS&&syw?h73nid>vwklCuL@vzF~kY5K@wNzHX~ofwrSgdei_ zw8c)!vJY`*w}gh?nDhYL%KPihPF|G=j;wCBjcy9|Bz=AKtr^u3w?=!8UNyhYS{dwA z)TExyq3E8ygA=+7)g}2!u)0M+2(Q57vKAR@&m^@y%g8p~F_@i9>(j)^lQ*H{6wq3v zHXTpyDo{A7aca6H&9Uc}ml<^C@0~=s*P$@%?R=GX2XpyGIn` z!a@UP;MsY(?F??7k^4-Vf;>?bym3pn95Lc56=g}xdDEL12FWDIDtF;nF+R3*l7oY4 zr0se@?nO@`FI{q)=X2XLd->s8{?4TrPF6a1`vzmO+N`ZF|8SCl>7Gv;!Of?mk|;m% z1Z%o;D^F+lv<``jjqZne{&mz|k;O~$A&oU+89%NxGe$mCOayDAx1#X`TJ+!he597V zw{Szwm-llt8G2_Y4c`+*MfU#1a1s8;bhlEA_S6g6P(o71*@Hcm@f2Cu9$J+4?c90z z@moZ7c7e-u1^GEMc}xpv{NIpd4ily>#sH+>wd?JdPcIzo$(|Li0Js?OYoWurOp?%_<($Nu_m)CW$1C&K{T3A6HE%aj(tuaK)W- z=iuwjb24q#tlOMoZr|c3GD2va*)ZM%ijnoaD78%L1(J(62K12yWvm30**#u=8h((E zn9HY7fo1)KXx~lh0%YqrGYh?to(PhfHED9KY5rELNcPVK`Ot!kmV%-!B}m{gSR|jF zdSW*B!)fBA5_>?yrLfC+^PZY~*Bv?)SyMkC`i%sZg6BC6&8D%6udmx7O~89tUz;(z zRX3qgEcsl}Fd1Z9Odp45Ko&N2Zs$)ia1AmODgRoq(_HA%EXOsl)5D;wnGAUI`VlsF z@h6~l#b=I+mE`Za8-$ zpGOq+H1r8`xcN1049)w3XyS1aRo(n0ORiJ(t&_H`t%eI?F%cw!pswe%j-XAJC=x;K z6?o!alm{|tidIe#6H2jRn9Y1Qq>t2oQBDx&=DnjPhLGY<1L#6EE6pjbSS>m=aprIv zhe)Cxv?PyPEurlw$GUz>#oi-GEw=-1+8?cluzn^hCO3<*@1O+nQ5ZRH4CFx_}bV1KF`-jm&qbj*VrTFp!)+|&U z3r;cx0ITXV7iY@GOH3k>c!$M{7YDy0Rf=+L?c|cNFIPR`UTq!mUN2(fTEhT7#0(=X zswtXK&C?_y`?GnKjfKiYc4!{{(yfc0UeBkc1xrV#pdJU<4O(FIY(eHSf}*y?@b~<7{pW zi`d_#MGZZRyZc9ZDf1)TjHTSEVquzft6J#_s+fM<$S?52_|XD37EWL~lba!Gz5O%8 z-m_L(3>et2-$lLH=B5LRU*DXfp~ygO@!m;VBp|17_<84IOr}{MU){YKN~}3!!Vjkn z)^GNq!*csceupy$jPR}}A74~@pj9r6sKZvUe=xwQOv^(i@Mu|dKUUG{l2iLGu84C-K~>XM|2`hr9R6yWK+@h zfV{|kJsl@cu8&v%==e#d;dM7dO?OrMOT%B>_i53--p1}Qs1IRVk?avlpIm5&s}tuX)C4pZltLN_NKkkVwF9r_ z?O`A6?sU$#!-$dSBK9vo?Pc)Lb`{wtz#G8avh2+664gScHh!%3WD zVqGV~wI&kgFz=g3Oc4gW`&f|sWm)C9#pd?o?Cge=j!CR=RVki1b7v4SFS#hjWNtu( z&4-*<3(t!S?M35Tx${Nz!8$g%@(bEo+8;JAytJ=4yBsUKBQ277%BVK>o@t?}nItxQ ziC&0PzW|~mDa`1Ehh$o{9EXuja;Hu5mg0407ZpqYJ%N?4%h^PMDkD}Dd~mg3IO80* zwW?o>`CZ*wL?Jb{HBr#k_ug8X=toIP>EjKw1(n&U3tgtT<=@YukievmU! zSUT+|Ore0r4_^_XBA!*TH-_Gdwi>N=_s$&=cyOaf9S`$}vC|XsACx3)_8s0%X6hlm ztFFM)Fv_-YdvK*8ZsgfHiIZZ#U8A;%#>k&e`yqFb}yQhk|N%-s{C zAa}x-nu#WC9oIyVjQJk@GE>GGGJ}wjYeVK43NVICPzDpD<%~Jo*JBN5 zC#r|7rrGG|XxC;`s~^lgx=I)ikkJE=FqGG{PiU3nv+ommaKfj2>AoRaR1Ow60r&Kt zvw^PZc_K|C4wG68x8LnhiFhFwHTygKcaKk9q`hrtV4y)W4c&JJ3xqolg-Pu`I4qTv#y~i*$ml|l|^sGI-b*6;g z8q!PW=x}Z!(qHikySTKS!?q#nqxk@2U?;<8tyzqsM7$B;<)`6+)VQmvfmg4v#h%{z zcOer9$azZT0-sKqgm09L)xgb0EZGm7 zCtNE3I~{!cjV|aVrGiP<0<>8*@NvmxG=SAJmC!syGS#$pIAq9}deLv92dD2l?E@Ps z>Iw!p9$567vdx9$Ji584PqQ1ib|~#KcF)R@Tr>#qZ4^Y?Q6D9w9CU~!7~yLt?Ox2M ziHhv#@BQ`5z^II4&Im%#OLp|1ak=;1Qu>+p-MWbvjM9lX;db(NpSaHLyLaD&?qJ`S zn6L2}=#bj;kaz`ONlgt@+JaJg1xH+vXh{S@9q9##4BLvnqah-Qg%Isu-`;I$%L(Ri zbUZU&YgcRt4(=fHzNq;Q&ymqvh(r57_qWzFyCY>;7PLNA-lmtIUED+^54Jy!u3Qu(WrInQM~1XrAs@K z(=;T~b}L0@`Z89}uvBWXjs*nG)vjN^BadYVq`?@G7P61UJt^TF-O6)uih+F3ze62t zW4*#kfhvbTA@*qU;w&o4`@fm95}pUfzn5tnTY(rgl(0)5Yg{#`95!~T%%Z+VRwc)s zqhnsqO0v!3DhCsYXh{&!2-0?M!rITgxOZ>Mn_N)vPaW}ueqwvq;qEa8Py^`eIqr2c zT5C)8QGvYXgb~S!Xhw%&B#wEwF?VCN*+%pJikRC>!T~Lzn9h3^?tgp^aH}J?iIlHE zR&wa3hAmoHl1y0jN+?u64Mgz3D-TAYJ>k@p^^ZSTj~?BLigF4wciNL^#pgy0Xf7X= zm%2gS8}F9D5S5$UXb$cUb3U*Jmy=9tX>HvB+&cUdM`n8p#3A7}TVVJyzEg*9VSC=j z1U8JogYfqNg6n`SwB?RxlpfbAZf*a&e(su@br+k~o30u43XQ3XAmN^BU0Kidksxx= ztm9FOV0SL7AN?F4`U;!-Gi~#L^oWd8L7#aNS5;Q@fmr`_{A=$M`Vs2IX?6vNda7SF zP>&d0IIWAZk_2Q1#6<9=K0JTH18kGn$h_CIW)5NW1~{3*#J# z5_gI$Rt!c?z1q>AR}I;Mj~Wa|qfsOCSyv51Qc(blYelR^91>(UNE{Rb?=`gXK7pxr zgM}eSFiDm5`_UH?CMAJ(RKT+s-?V%@rs3=$Ql=a{c#xM|!-jrpp^kcS!xJ4Ms@{zu zy&|#!u;}@r!mw-++SC54ez&4jLew-!Y8q%E3PB2`UCW&oE<81A^W4dYGx+M5DMd9iMY~DP2x8dbwU#cNC4?oFtFEovV+G?}~ge4i;Bo#0GgR)su z_l+jM9gM31-}9R{d*M@L?;LbB*vBMTl|$6z%~1JF0OAMe!5n9P%K;%+3mPO5SU=F( z%fL1{(#$N&eo3}mNg)KHkYH#!UeR42_ypTRDoW>)W4jS8z~fAsHo!?j@uH&S@69mq zFS)gQhD>r`n_sLBzPb2wRtu#F_WwcIVlqG9J&xP!P|!?%hlUIlFq~Bl8{4m)@Bl+0 zJ!sL@#KbZ7vlIQckc6WCE)mAek89Gk}^* zA`+Ax&t)Jm>{4Xwi48fi>nKKsc4B7Q{iEldP7$f5ZA&Q_Xkh5*O2BT>jr5PBoSen)1%*Zo=^Px>&kiBi}kbn#i$&Vum47uq5Zs zS5scSdpDd$bU2a>0{7Kb%&1O=dptR2t!x3=X%z2ht)}yu2M_aB!2G_g++1ADlr3_^ zQH=*@Ye2G)ReJR-RZ&rbo*gL9Wd z#ofC+7A~TF@7@mi-m-H-sC1<4I>fcAp%@w&wTIlF!Uw+g^l7NfdPE|fUR=Lr?;v?! zY|qR!Ra5vDyy?Lw4xTw@jN~^989}J))O{Cjj@3uWVoy1C{vH5oN7-X%W?wr0IKB|c zI6Yx|j4Zz|Wt;NhKoPg?+hzX#Y_%YI%X9!xT49MRt=J~P}jhqsEu~2!JX8r z-!)`&zB7=h>dh2+JaQ_XZ}!$Aag?PgPSI-0FT|=wU)Dlw!2I0@WmBZ*m|^%)GAa}q zJK*IxX8W(fk+!+$QAJY?V=Wv=vyE79*K<_MjCtB%430APk-x=FB{NpA3wd1sn>;%n8i9*h%QQ-q&+(0XL`B5w z&-gQ&?%m`bcW2E4Ap7xa+gdA1X_*EF#vi}Q=LvPYA;A$mt>LU18F9f)0k@ZA47?|~ zTm>3a;ItG90u@Ev@03Q8+>Dj;K`|&(10ETqMP@(&_Ynz~WwAP4=FQuTe8G*=y6>{0 zwgV7j_({E}-0v4&D1%Xj!bd|YQ@ao#QW{yX4^uvysY$juP{=#OKZ>RMCYw=N1*o?$ zZxe>+fJf%Rd*+F%5u*t?FWoNo`xN$N2#Zw}#tGlMxrBcIj}`#PlvJKnvRY(1FeRI` zw5XdHFW#9AW&^!$LrUFm)1P6|K?R>gi$LwoBbrRpEr>iRZ%XH9dCgn5KDMZyWklU%Z^(mkytz zU*cqBO8E}`PA`C>m9}6eg`KJ%H z;T41>io$*PcD_Mw@lVGmXz|{E+^tW)L&dL%ez~Z$bQnr1#Fr{iz$WKcl$*@jnGB&P zu^Fj+O$b8i}2HD7~J&d#BJT5pr|EYP-Mx&w=9bAU#I%04VomP94%3#g{T~)~C`H zdoNzR_}CqPvLqQuoyjg%u(CUyk@xp!(3)3au2edo->%8#L8CyyD%dGk z=J)X9XS@Z#<>?ikh67zx=7Psi{|m1|N0>QDil9kODn%tF z*MagSdRia^GfUOGSQTby?^;%K1c%JdIy2*?}&b(U(d{Ogq0xOE5`lABCxF{8FG^dhlt zN>XLF@?U-WwyHm=`*JuSxVgdIcjY0DYJ<#q^sXt*uux*El`3q&clVKYBw-_}F31C^ z-?hB?G1^g03LxKY9rl5%BVn&$b86rscp}G&+B#@tO-A_SMA~#-e9RfX1uJ|Y*o!+5 zNKsKy=aQ#qQ}6$pjOazyx!5G&JtXiq&fVzt@SMbzj41ER^fQ^A$qwv>^yAyTE>{ig zM|0JgsFTs55qs_4<=={gGB8M3vJ;ig+OS^!F=(x&Zp= zj%t|Qtnu+h#X{6PW<(PYC{p~qt(Y{f7WF(iskC1C3tnM=- z`ZNNx55GWlE%;25noiM15mHC6)^kqXDfDVl{Kr|cw{+|_b<7^VxH}^Y7k^!WMw3iC z!YvEFC15Dq*Y~nlNgb(iJP><8<^(+sY*RRDhOAPQV!qHk5LO1R$u;=I6ko$)!_31E zl-DvwT423BZAWjMpgSE}1R*I2xo`(2@`4QCMcdEwH}-8wG%5QCK^T_2hP_6DrUV>A ziqtm5Djj5#(o}|FD_gd0t48hwi4*Uxl`j3tV5a8G&9a}akNt%XB$qxxvFbRda8r16 zu_kQ2UP4v_wci zh7295qU^iB1XGf1(IoH)c#lV5WNiIh+_iGQy*`&d(ot7e_lM}E;)7sagG4Xg#NX`Z zwb{JQ=}LIInfuOW=uf_+iE>I@NuU(#xje4$;c^{8!N$HnbdOL#Ss@rn1Q*I|Gr-Fq z505*Nd*#6PtQwuq4;J+zpA7EsCCZw2M7fCjgDg(i#XYT3!O&2lj7m%S{=;mW8@}4M^KN{SU9__azrEnJ%IT#gsfgk{pMAq~?Js zX&)f}P^s1dxuK~PR~xSNt2}^`xPsQ(F|g>L_C%Tho9w z)YM!D*WL_REZS(qj1~buYkhMldNt6tbCYWiAMSXhGevWND*@llVh4}^@_U4KvS)|( z?Y9tQ8g~Yk-|_a{>(}25+#GJFXX)itw#sy~g{^JIuzuq#EL1Ir5C1VEziWf@PNP`- zrZ>k^^t|R9bR?}`S9$_gnNH8$N3&AV!V3=f6_&YY`HuYjFYh09J!sQ8JM%EH&)|9? z&wKp!*M!5}z<;S}3%)&gs0|IM|4$gDg-7&~9=HAEV^+9(seP_4$ddv{Wc4F7r3d&Yg=X%i~!f`WqBExuW%SXoffKsT$97HX+`cqo`plWp4<6(4Y_Pw0a7Fg9Pd5xkJ{mi< zRD<#~BeIEXXu(uv62!`3yvs2!DEb$Td_AfP>M}8SbgwxzW;BM8ZA6R^4rLpT} zm#Jvm6&eS?^!NRm1VnF*`3P3$8v6bo$%!oLbSnA?PYH_Up{m&M$8--`r9j)m<$D*k z!t5f_ECgcIHHS;Gz?6~Q9ep%fzZoMy63i!4A&i`w{4cWR)IGJiv-fKHUGh99<>VR! zO-8q?PR|tR)Ls4|E16Q3in%_bsz}?PR~BiQx7~GH<}brZJzt6S2XeaYz=6)OVf?sx z_>m*Ku5nLio~W%OSIHp6YTC4@$L-UQ_0Y#S`Y>&7gV1n9!@8XupWljhWbw9IJEqhI z=oM6wr#e9j!PlD(0zqG5ZswGR@N3k(Kd{-Yz*jojc+=l+rH$y zFE8`+C4u@CXPsjj9mqkNK?sq7sMMBhvX8bCL<%@Th(E~0^n6OF9y0D)P)ibMX*dnh zi^4@|NvEbro`c|$Y~?2iPSh|rpsJCF5e;}oiyo*R=sBt>GMNyS&4D@GUOMD}@bKKr z7w7Zcy;3^*cmC;r;`E!2R1LIOOervqQr+wr*L~6YAe+uLc1`?iuHNN@g338>EcFlc zsI&H!-|hu9s|^bNIf>G(Ogb&(DeF1J&=j^oc4PtDjp}eUnNhiHJ^@yd)f7=$0U=39 z2agBqf&s*xfVHc2w)|o1r%T>Ak7L+&7IFJG{knM;HDl(UF1j9)z!?* zmOP}Ki{_l5055e|xLCTb@aO&-Wa`%i0hQ#IeMdV&=u)_98o2o0`#>#!1$aSG_-o0m zq->WFLCh>6U?<#WP%orf~~@Ejd1n$~cMA`<+FJkS?HRs4XbYhVY#v=f)>+!d!n1 z846cf_LRm>qGMS#_%9vz{vgsS_R+xZ-RrYn!t@i*;!ooNlaaeKo}SPN9#dQ}Z|XOO zFsBcxIn{^IIL92Z<`TitTmxy=@P;5E5;#AcXa0eBmox9N{M~eWK1cnP90+3h$gb*3Lb6 zDDCYdI{6FJNb8Tvej6ylIdDI_5?vuKEl>|={$Q<7A_=auvQKYqWz$M^C0o|DdJ-1qyw z#_RREUKgSnPMo=&-PVg1-A>C6OEf@LMH9JGM0Y9TVR}SXOKVYkf5$7=9xp$QpN}}B z3+~=NI0;bI!*%_t_J5`_#jqOuz>+`;3z@ZdqS*|QV?b5yKC+*xOm@&yUaSSNzSE>g zy+&y0UclGO^zV}%){V74Pq8Rny`p!c59`$}Mq0{Ql&7H6=%|r~yjL(lWa!EXLIGA* zRtngoJV(LgGqrow%r-pblKXwO4Gd%-5UMVQ0>q7U*{}LFRTIYdzz7$Z?p zAdjxV$BM{9R#O$`y;`3H>)DMi5uckx$TI-T1IQENuMj)o0J1{XFe(vm z^h*iHj@iE5Jr^wpx6!i8MYsw3(qgaz&N4;ydbrQf@+uYoywh|DPCU?%@9pSGr2wUz z=0I-g{&uX5%~cTRAtMH%)w;@?u(kPM)zWsDeu>>U(D-m08`<$FdkAaRs^xWHIPtdl z;Ps=6#kTOK@ofBOq=@?vGLL8O;;*7E3H`Q7)lJqGld=E$5HXSC(B9qMmCySh{SM+} z$-63{DO%7TEeKa|DKgRfZg%nMesSl|p4H)O%Vr@$x9rrEN`IdBv&XF;0(EU*^0conK=52T3u0=Bw3Es*4{TL%30NqR7b923twT`+ ztS6-UQIi*?r5CWo>zfNAXc{yD!eleCig+dq1|b?Z!8+5@w1JtRE3XhwO#7d$;UiNy zNWd9j6n`Um3OHu#G}n=D=YH&&e-i3<7PelT-h+u{JnTreED!)7gaYWZ8dA453#D7g z7FN)vpXez?lLY;q`&NV1?R-H^a{&Z7bE}R14n|K~Es>&z7nB3v2<0*#fL*R`L#V+p zU2h2}2$CXSO%cD}sok54%AG_m4hXa+?oVzqG%^t_Cv&UE=07xUGw^S9i7hB!E|WRm zzXzmp__Qm0tOfH=Tv{gA^CxvrHwwGUOxBeG59}3A7?+C#o1=pma^=EHRpPCOOK@4- zvO&n*f@!T@Qml*mn1cQ0r>DKt#|_?MnDykzUPYUGURAUre3TUnO4FV_yEHW&d3Z!SOXc2!4)PD>Tm$=qmwYe7|iag&McSW{Hpo@HsgbtdE-V0(m_o{_Iic`V!c?@ z--Xi-R*&$vuJ8xLIfQ{MXH+uyUc;Hy<%~B}F@qgY3rN*z(=cGvp1wlR1347_1gWQd z^#Eb8M>E6Jq7`S!LOu(0qm}cT`{cDi>Vm;zVSt2g9)WW^=soX87iIzK@R9mCh-Z5e zc`gtK5yAiTU%U=qhHW{f<(pV;^AAYdZQ6JbUc}hDA;3fQ zTU9eATP)x)!DSmV$q4s>WYR36jv3uzpsjvKB@n*LKwn=Qrl0Vq>Vw#6w|Iak+I-4R zh`#w$l|Nr;IJvqG6RMcgu40B5Gz0xX5X=ZE{@|-p=CJdRPTRv{xt*tT?-}NclaD@u zLeAhW*JTwZqSm~k`xm`daWOMU^71-8jf}L#qo87d`>k2*rsP!%Ujc$`rPbPD+Dxrx zT1G}-<#aZ2X|6TfUvgsjh!F<&KUbZ{DndtuZ9OF z-~N5+Bgo)q+e0TwHCusH?^G?vD`Yse|0u2mJMB7BExX{tk#^P(vW0?F?xPSWAppDj6vUhEm7n3ei<`xQdHHc#{7C&Q>Anng z$Ot51UNb)3J=~n@Ep$;kicRxSn;6F-z^4iKi(b4K8u6I>(fQ)-yW0`_R1D~)9^Jl= zM<%nBzNb%@4l%Kcw8afrr(3rM4FU!2OtoW4o>eDCY#^S6;W9f7UjRIS| z_>_O*yNkJz=ncW@co1udXAb^0vg6~zD=egpsI)cB-41=nEN5eEx13wItVnwxAFwN1 zZ~(#u3bV~9Al(1PDa7%d&6>cF&xs`RQgGEEEm>jx=P+X{9m0h!hkLRf?_a!433|i> z@Y2aiDcw-x;*ZNkKuihyE(;0Xedm;3L$iJ5?f0Q-Ljh{Vu!pMN+sKrz>Rayb_6J5> ze@VGYJ`f^FUteDaA(H^+c}!YUg~p^akEaE=e&1vQb+Kr#BpV5J#d#9@4O9oA8A~mM^cPB;0N$MIj3;M>mUhFeLeQCS%OK_FY5~UcW+3 zpF+}mE%fd;qCs^r=)7~&#f6EF#PxXh?n8IQlj}D^LB$84g3}b8J=ndvnGGB>vA1(m z`gE@;gjf@2H#i**k(Bcgu!>Ei=fBx^D~&#iR))Hv${6s196+m1?!F1e+!YO5SStGMdm!*}z%O;O(KcG!R0l(=kX7O&A5Qwp| zmnl4(taRs}i|!|efF{TcGK_;CQwrkSvEM~E!NHJR^nyN*niOC_chI1zUET;J&6g=o zf`}t3qn5}e_5Wt2F1@xac*Bxu?6_^LnejT7Qd22@e_w-<088@mg6)|uE8wEyD8XuScY9Ak8w2j(f#G*Iii| z3=h!enJiQ5)~#C}P^Xv?$svKG7S#5U^@)%f>)Fp|WVGet!H3{mbY&|L05NGAx&1Og zl(!7S7FFM!9%3#4WQw9{I!j|67K&M49DKnor$AN0)n#1PO-sWiHY>fB(x!M$%V5nMN*^qU!45N=bKBb}< z{eCgW=f)s*R;HqHES%QA0Xy<2JuggM9NKqrO&invE@M~kPV-pU8u~+G2vXLD+C7w83fZ3$;Kx?&bJ@RwA9WvhnmAa0Iw{!B+=K3qgjT$rNItt5N*m0q! zfVJ2Ef%Bj4d1qu|(uyj8m#}8&zqUrZBg=MfN`G}>`FAf0YM~Q;O-yh^Mme_2-Tnco zYqxII0t#JJn5%8mMvY|gj@V>mrO+Qyxa`jITffQ#$x z-c4NHSHwW6Dc$o5jx)g<8eVs2{G;BJ zte^wG{w`axdtJn=Lwi`J9vZH9_W1BoqtckyAM@FKOt|r|XF7Ca zz)9rJs1u*NYjnf!g_0y8{3q8=R=qLm;|o2)8L=+acmotm9K+d*-BH)^jKb_;LQzS# z;Pva*-`jWb^vHJW>O)k1#KM8uI~qS6mvE@ zd*a14-0(`;j!7mg961rPZ`Q7{iPy)dt=$%MgEBpreJT|AZ0a%Zw0#x;z*1e?#OZ@& zsR=K@VEB$M=n~ACrV?WrFxb6%(R78k%PhRO4eU(r=d*3_TBKGJncdv$HaB#KTP%I_ z$(cuq4tp0(lPxkVs$se2h$(~y(S!lK4`opga|&je9+nh;CL_AugnD^_#X6aZ&yjcY zCtizU{$=xHshiVcMz8pbleZT05zggwL+CUwD#o4DgTslI&{^*8L8KuDt2BT%8H!|{ zWmR}jRWrB)AV=22I-x}n-U_f)WERk&$-m}y3g`P>+yPNP?Cn2}j*d&mW)Q@_ek&MB zGkBR{E3?cxD$MVu6OU9v|Gk_4dmouwmN}yXy^KoBCc!`qFcV@<(uMc7%Y7`4ab)TB zn(HVDovE3~)VUjmiKRs*^`MX@Maj2Se~Kpf6nNL?|kAz*hkr zYAsbP*U3GhS$tRV?2>;ya3HsI@f*<17phbT2dc60!&^sM^{J_<0&=?;&kI3M%|=x8 zQ;Hkg+?>61zst81sMiyQ#E~{-;qbp$r2h5SLblDp*Cf%1f*$>%e8dmW4`vG4!mf5X zufEzI9Me|Od)RBn1A?nq&H%_oQxl8xgd&q|q>FSKmE=b>kTWs#<7>}* zk~H^DYy(lD?tPCLMRf9KCjvCCo&Gdy5b7fyUn>7Jus17bAsuivy~;5p%@lS#N}!UV zI^wQMsLSA5K736#z3Q448U@Lmj2}-2CD1P5v&-UArdHK3?{D zl?>W>;~Lr4a%ap%NL(hT_a`@-)V3Qy&IoPIT#c4pxebzh_!|{v;Mm~9}d#cf| zD>|QNSH^N!8C-@RtdnlovG>F*xd9lk4LeWZvlOq{LFNz99QHa?K*MN}rpB(Z?Jx4ggl zxDLTMeiAONXU^2dBjL#BMJ-~joV;flxq9}yF~zmy?`d89%Fd9(Hnx9R)ng>UCDBu4AMVU3J!|C|HRw z@+4gj>YcA4$KN8UbLca*`{~;~TF>59^kMtz4=LPfS+>G|n*Zq8_=ywa?))&NX`%{w z?s2wjFWqsSy6@ab&El@NXyy6&YN-yjs2Zdbf^~BDpDLWqa4ZsbpHq*vZfdHNot1SJ z6nDRUyxW5FutV~cz!`{kM5Ju+h1Be_&x|p4Gx`ja6%uI>NJLYV3K0O9nJcC>CQIX@ zEan_Ca?IExOw}QO3@l$EUYoC>lUg{!Z>*Z^BgA-=DFQ8?Vo`bE056mWY&~m(_9NKB zae-Jv?Jv{x(;v^AyaBdGMb8J8*Q8ElJB1#FQw+f{Ge3vX9QWnKzg zX7a1icWQ_Jo7vOYI4Y(&&#=HIAvrcKUmq3=4P1_ zZ9+B0rS2b}^dSA#_^Av`sOg|VYrib~0Ahk=?|VbPo%wg{wt&KDEJ@HC9c@%{v_)-2 zy+MPX)MG%acf4P55bkDDq{;LYkpcL(2+A!!>Cl@QrN}>YU$bL@Ar>nj7DChBkiS34 zz-!lLcX|+rC=7o`@4Xa-;+B=!`%Hh7mIh4h>M!HCCr*^KXqg&17I^jFCr`w6kp9IU zdW>RXsdNq~%uCwVPR(C2-+ZFq*A;_gg%cOG$Bc_<>;W--boLT3Iu|>4TYK(uoN-Ad z>I1U5AC>Z>SO-HKh>}p9!Un(VY2t6t{(od;vhf=^i_PimfYFHu>kb|~crkU>u2zSy zcJ{@G8z&CuVH&Bwy_p>(aHo^AhGeeb=6&{M@bawjDbhXHU!Iw4vt= z{WTRd3`Q;a(>`%?BTu1HxYz1FdP8E++O=!hZ&zL?(RPZBP1YsT9df(*pW&W*&n(;+ z%T2uas~!}`(Za~NDb#dWFg7LKN#P*1iS%kFCcB?D?FC0dEJc4OF7wah9$p3x$~gOo~lDKCRhWh&q$wNxra8rvGa{QT;iu!O3sIS8Bu zlfZ?s9w02Z8@MFY(hSshPlLd;Y{ zL2w0UdKCrGel7JcMJvGefun#rax~3*)5| zaT%~sP&v|P`;Y&iNw29e2UF?x_Q(c7&sBXC?bW6c)Iu~NYKk$mArnMFbf*ib+;y2x z(hsw-KmFGkBM%I&U2=6Ff}spritfGXrnV0OuC)6AhL&*`y;yrpz`0 znQw&y(`*<(-&Xf5jswyY29MU()MODrqqc2F0}i>b!gzowV_hC3T_q4K(4EAsVupIq z4C+aiI?=Ecx9GleBo%;H3NwFWiyI$J`5*GPA9ODU0a>FaO)OzDM<7oxrVKp!_s7Yq zK4;FI`$KZ$;W46Xw{CTnMlD*zN%+6+v`X!;)*o5_)#|xJcxD!kHfP}BBxHyt?^8?3 zPng1HD%p)$&`wZ)*1*=Pc1r~VUWY(LO-B}zEc>;*D8DXA!5;{O7zHfkzGEz<1hvg9 zEOV*>6~=|Msp`Sv0Swkz>PDtN1tb$`Vx|lG`PLF3D@!j`i2#`g4VpW5azhiKFuLAU zW|Vde%0t|sDJqvgh!#7rTLHm~OqY~%@)tF@fb@KP1_}N?o7gn<_XOy0{Io)l4-h16 zaW={`>~`HK`{4K&jj!^|QV5-i3YcYke86LP23immh4>~KSu_p@83tEp+?GD(r?vCc zOKaLvuGdx=D3zQJb2U5O3%?+d$WrS`6=>rA9n=MR0^Qlz_cr1NC!_f1Pb(G>%B4v>G+uba8d!H-K9gt z_lqidNBQKQ+1|uBn&uheZ+5Ywbm1}-C}t@g3ix8%`R zQIO2TWA>s6xZu5dAL{8fMoIM${o>XGz{;i_#IPnz^u5pTlP`L3YAl5YVy>&h2bQmb z^@K=Hq>e7`<3^gI=$-{Qi7cYa{dpozVFh8G@(ZgbY^}~|A)R3{px;FLF*l`Ngl1NO z2SsWk7vDx^9|bKk%e;M4BB0p_-4+a~GFR`hHyz(}=C*LJZExBJ>F|LZ%*S65Rwh>r z)728g11i%yLDQLY4u2aG6tvbnQmNi8IrURj#pHWT#QZ7$sO-TFqH}=U%sLy4S_y6L zF}fXa#*t+czSH`ejF?Rzo*PAT^$)pc`{pvdP?KI3+|A}2YBg;d^QQ{`(lvUw9{*c8 z>KYS?R@4xb@hYJo@>(N>^jgE9kB~$AOuaUc4Bf&Vi*5b&zH5U&SXDX`f8@F?7T5dZYbpj=6#!IYkQ%f zXJOq2zIiGG1e8}I`lk&O3qcrc*}r)*76%YGY%PKTGI~*`^ywRsQwOr1vW@*f4T0Zj z3M~5Em}g;Ok^IRq%f%Qy!;bg6duFFIwX*-jzq`xMP(O$}l2?FTj4Ugq3UFiQy>sjD z0s`?|pM7?IS5^-LgAvbkjMUeUHPUf0-AndmU76qs0)AsJ6k8JDg7Q#KBp9qim$M_? z8M_#B$@}}81|$U$JTbg=AU0N2VaOp!bPKecijRm)m_tuP)h`u!8@5gZ8LHTBYxC;K zkhzd5;$#7V&uOS5y(iI#0+u#$5rK@L5lztwPL~FTBhofp+*x}<5R%1A!Y2}66-EAm z&*(3TMV??WMHVkt+2S$p1HkM{fF2P=@j+z*12_Z;Xgess`$Z$w^3JtW#Db7SL-!y0 zehyQWP5$U1j3Ae}4DSd2GdGhwiOIDzsV>Ho;=PCu2mxe{SJCUzgL&sM5eswouO0K) zn-9<>g^mI)mBhpX?agBn?m^b3!mMYTBz%5f`u7wtIoX>A0x~aH7(?c6@JFn{q4njt zMaNhd>kEFe{s-5u9g6$I-y^3CBl!&lcgEelLgU8*@X}Bl*Wk$y;UzEz39#RuGTsrK zAF)F|;-_)ZNp)v6z0VW}c%oY}>K}Eaib9|+{Z*${EorXVTVJs%hyCFj=~m_@vwasK z^7wg!&~gAv+!^RD>Lw5nQL8@YT*@rr-nx;UR2qV5p_{_aa9G5iA>O6}Lc_c&V(aWr zs#Ju%z08o%p5N!w$H30>&WaDH&vTBuj3IhmL`8|l=O?0gG4EpI4V82x3QwX`WCiu# zuyh3B{tkx2_L?kHLVqVY;IG!nca$Ggp%m&M#ShwEtrwNK>-WXXsr-)7n%^sgs5Kk$ z_nXt5Es6Lh3#!8K`vs@UV{D#Y_!R@&B(2*;OlLaN(LP`A{d4EN&mT`wP>EfFwVRth zgv-a&x8I?dh!=h!hC(6HfB9pie6P_Z8k3h2x6&PDxwFj6AylcHIRhUh5p|;+X>92@ z0A7K~Eznc*XOW?;ci!+zOiZlSz6D!6o!)qY3Xikktqjw*C2>~8rCli(T>)cw7U)Yj z>7{nJCQSogZ$NZT=gIksf=MJa*s`=QZZs0bG$joi`Q#+y8R7o1rOTnsc-_ndE0p;X zuw=oIwzIF9^i2)(k{5*{y1l$wxSQ%=(R59K5%?mYy~`@K5`FjtKoNn7kywO}j5hT< z-I(#o@3RWmMGUt3+} z`F^IOC{s+bjS4z8sh2eSW-ByRho>&o}%DtJR`i^kfYWYD|Yr})qHr{_v`fyh_M$NqW?vtVI?>@4zOQ;#s&1TB@ zlar?eCO>^Nd6m}4jz7BT)YUC_`BWN`@;#+xklyf4*Grd7TQcoU_R3plBRY2oUv+Ec zt;JZQEo*^x+a>l)oVu2s0n@SpC?2T!uELAvzhGg}*6^2VI{ejvJMWIU-|0ldnwK9b zKX2)5KHSowp6l${PDqlGV_}FF6`#t{)9rQ5cS~Sg6Wq9mqAQF~MH2PrXXugw3v2!P z+a=7?Sf!R+;zw~SjC4Bc8v0RQinI?6L+z%94o1uRSAVph$-U&GvE?4TCl%W0zxRJt z{kd2#G1%ddL-jtRC}aKuhxxlS8)=1^>#jrPh3CVb$7A@oc1g4NxMS(?>j4+WHe4?s zWuInab6rm-nFhUgBs@OVXdXQaY2d>D^^x~I07a3_i{k=j?SQgRqN)+h0U=#%LlE%5 z>?XX3{E2EV{}g4f&$due2q8s)t9B|{#4lxx>M7swn#^|4q>Kv~$|s$@p{|bB;GW$L zE%=w>)pvH8_#7l`tmkv{3&mIS-Yt!@jZ`Jg%q+6aeuNMnwaM%vqw3ciTw3=9J)B6V zs((3?kVPXU#(^*|yG+`gh|Y5pf(@|eG9wTF-AvCZ>dlw)!gD8Q>_}Fu`%&e^*cLhWzmy`sco!`6xb-O*_lIaHvNE zrqiiYZC;*z4*mW+hW)FL`@5wkvV;YEzxOhIUft#TpVNk?fK&oMK0TRNWXmVY*!2It z#sBqYexM9<^W#(iw8sTN!duSXbh!G{`;WJh@4un3HP^u=l4C$lY)YK`f8WYvZ$r^w zL9LE%TaQm2-m{Z0ufm@mag9cblQbhFd$tvA4$SB(dt#XD{Bz#39fI_HWmX-{-iT$^ zmM+b#HnmXUw*7Y;52ZP_#7upiO^jhY^V|F8vE5bBdZu>%d#9vEt##TUA3c(gF!Inq z-Ke*dsY%4j6Cm!t?{Xxq(N%8Q;w*iwJm*GQKtL7;?}VE);Q|;tPj&F;3rY+a?^O2% zH6XgYDfUnJ68y>Q5IWI(#ru2R3QK;;r!PE8;GG?m(=NodTWi}RC z`x zg|vI*bjK{O)vGmG>;xA}i)U_7$`B(cQ@aPBSyaD>;@tYjJRo%OyaevXhU$RbC4`%z zE#}z_{l;j=^O&8}4RaF#e#GaC{ZTJzd2P;utMi!q0}(k<2HKoO$ps-$zxX}sfc^Wm zMXdn}-Xr%j#l|tV)5ZJ?f`pQy6Zr5k1~pw5A3_=1l4i&n0E3y(dd26t^(gQ33&6F6 z6QySH!%%3F!Gw5+7VxNI^G)EfVjb0WM z=qWXQXeBfG0tcwAY+5SrcMpXH24d~-Aa3=`w4iPO{L__6u%BU~ear?hwyZr1FS}L`2gf4q&Tibek+7SAHgQu{dGWgr zbhGx!bH_)2L%)awX#?gEnQw2VVIZKh9gf<^zm^FYl1TJ7&yu2`z~L)aoPoTHNuds=eCYqF0%C5A8OkS^L#rRG8ckl(p}0hpGy1F6mW~U!V>#OkcHfrHW$c5GQLS zVt)UJg~QMQwS{>wWrkb<6ToJ8%h+Y5UcHL8qJ}tG!3j8IF{m70%mH%BPo%jMpoOmx zvl`rj5a7d$;NMiQcp%bJ{^%D#NtsXb{RQw&*-kuV#=y6&^P-mP?61;e?`%sSd}1VQ_)^%nS15RPy=r~4WEDfC<9W_ zzx>zGpw4puoLeHYbM!Q5f%n;0vgz(>W@fzEC6F6MNpP&s{;Zf3z#^oaL+$Oi*?D2h zXI{Pl`2;S9!OWfK#kI+3J-)cOxVK@VV?ry%EIMyL)w<0}T(NDzMIZxP-0d+gRz1Hc zWztV{uZ~$2zkdsv+jYvRBe`q1zkfMQCyR?9n37+X;TTRhDhWF3WmF?AgIf(TeN#aB zj!Zk>3?#+i*3pb?X&AY{B1uPMJ*sU(iQiiv8YB&K4ct&fdn`evvSSw% zaTvY@a450~+VjGn>XPiWmz*`{=5E)e-c96H_=zKF3P9e6X=~Ed>;tqyOsoG_vt@iB zOSrkZUehQkw&cl4E3JNWyPnTYH67;mfh^>56&x?GPKehIq*&mcTC{!`G9x)=Lyu}J_IWT$iW=mH?%8JlkM5%PLnAN#l^0Dxr%MLR(_Dt^=mtG!=_kGXzOw(ry<-CC+G{8r3C;HHbK(zFf5Wkn4;o+PuryiTy!fATRw>E!lp=l#3^m#9 zzr|?@-Z#g^C3N`w>fe8J|sF{uXA+x2$Ol*H<9R`_o5#kS%9kUVKa zH!RJ@=cWI&Q2C0522IO57opx&*R}umN$!$tbOVeycz*bWv2JGd{m$!U`yt|xP~2fQ zXGbI-2m-q!Eg^Vs4&kWT8u zhi84OZ=0_1!fX39Cr_Hxba``^P9TAH@%AxwE*^C}yz%5ub-C4AgQs!}#PYv+SY-M= z)NXYy&e(A7e}CDApW3@3Sk)M%R$lTx0Q>9EMgP71Vcwo(EH7;(GgAzvna}tReHI)% zx~_y}ir0%92J0|dwP5k`p|jJjUX9B2bH$3L0klu!Kd(~#8?w9mY?gl0Agk!LBx}1# zrk|eq4ZUg8p)5E)(DQTvBHiv(>(G19+OS>BQ3?< zYEzp5jZj=zTUq(XTNsw$bbE4gLVT*e0|jaGox0m$a14*ly!%~y@Zcx;I+|gvV#*e_ z&HKKgZe(3R=qSiBc&Vs(3xm7rb(c^@MLI4qD!1b-24GP1Ab(bqMd%IXxDOccFh4T4 z{$I@ff?3fS>TiQkj)d>c$jUON2Z%9e>`CUdNN4w`Gs7En^6ex>!T*>n%gUcMs2}EH zVcruCJ2pVVV7_$e$+{g3O=0q=+g>;JnuHPJICZVT7l1|u@+8WsQ5eKFjLZ;c5phqM zGiQ%UlPLRHEOuGJ8dyP;2&*oAcWLex@LgEjaRFbal9>f5dbqjofPn)U6nvszcTFfI zHWH&s{p)f2g4r>qL3raGrkn9?QsF#CwY}b0Wco`@+R9gl_8%8u;bQE0p`9F9o0xU% z*QTX6?lMYkbOytX)OfKCU!8r8H&2n~hS7F8H=jPexJ!5CDe%ajYdUXVvF~%gbGV2U zdk*Hiq*o0oHosBrn_CMxUA^i~!@|XJg>y5xvte^7NHn$R881sy|3WjoX>}tLDRliJS z7#)Ejlvb3@$9h*S^$c`$RJf==fwJgh-TuE<;g{|T5RSE6{*g(I32U_U8AkvkqMS;e zuKFBaa_AURiz3=FE%Qnu6*ms~n}N;hbiWZbps z7=p+F(_e)hq$Q?KYNPY#FZtef@v|p7T!-3)k^JBL5e}m4fmQ8NDtzL0HCbhj_t}a# zheIzv(J*DqXDeGx@U>n7*0}id(EcWluBZan$Qvh-7*)`ywzaorqT9q$`*!{;&F~nf zv1&X78_w64{4m?yJ@aATVsn-~`0xmWZy1kE38;={Hpu|`9?R^aoUZ-}Z#K#FZ&&c& z``^nP92I`my*mNnTGtL8Y5*Iy7_`C&^U3vSA4McDX2U$z@ooXhtbVBF#41GNQc$EV;lMqRQ8SG!N-(Do)~d(5S$I^2rt!8 zk*5YEW*t_uGxzMwI>!qBRpq{GL7k9kIVia~=~*3KRw$d*i(?Ga_k+_^=) z0yhVKn((26uWVtzlqbh|HkU~JzsZQ};l1@**7Tty5R-CTULE5neprBbN(fGRH5q|* zh_|oBxZa9)F+AoNyV85X;Wg(p>?{1qy+FSFf;|;ixk|Ey4F<`HD>JN>PMdyz{bT%X zO1{=r?ypQ#FAHLShB4+POh!q`Sxgl8xbO_*SE)fEcTEjxDjQ;Ha-%O2%wf;6VxmeRFV zXgR4=;-+6Pq0(Q>_>Z&;Kr&fh{XJ{bOs)s*5;%<;rlO#WKL%Z0@BsarTz943$vJ@! za~E>sMCY6^xlf=P0Yu}%^bo`Ghr}%jR79KtY2fRp9dT@4x%VeLhS+XFVhNGM89(MR zdLfezcApcgv43%_)D?g$UBQ3WEN+G6{I4`g~$I25$;S+5Jw?T8*;dfH{v2b zj;g|6Vz_uDWd{{BXGe;B6s1{x&Rm+lhLScNp@R{+=;Du$n=AMmit#LkMznp5jZHRD z1{ABu$-Te14;(~P#~Udtqdf|;LI(K~^zS5CF$0>T=CqqJtNCEZ!HLZiz5o9ERDTl_!)3&Hp{RDPTA4g3!xHb0 z{Ohly(D7DEAR=I3?Dj-NZ>`2xp$)sV&rpFd4(1Zu z#XI0W+npd4#J|16)wnDBLmdpm=;E;gq%N1*(IyHhnGRqg@|s$L&fwc|PArJ&$`~@7 zAp>!Xmo5!O+G4}sFhh1#Uj=83Fz}8tp0r`nc^P=Gy@t!>4CsLx*}R-JT&+RH+~mo8 z0%L@oxSV>Y-Mic_$oPa>Gnua+%djv6^~JAsmpbkNGA&{cvHIf(riHEa;82sY%AazS(5UM1M)p~(6^1Aa3d}(NSIY;fl_O_P?s3_- z0=*6$EQ&oZ*?v%;g#;-5u0LMl zbHn7laHoiR=%Hl`Gmwnf{t@P8q6p;8tUe0F!-E`ON6}r!SbQpFK{MvOS=ZI`a81cn@c|wz?NwP?2?@C}bd$ z93ui6`%CN&UF*}ZlXMV^_I~csniWH+ff38;=;HLVDDv&@8K@DM?WxG{ zv~*ZnO0!b-OYFeRHjUMT<7WbgLmGEEfe_5 zhqa~uv@9Cz_Bg1#`Bj!$im8C8d)b;*ms4()c-X-Z%^anNxxx8Mx7N2Pnly2ucJJOz ze7>r#U!+aytgY-a^*ZMpiJCojnQn?)`{A-T2PjWKyER?VgbRvrl)cYv+EYx+2^}St)gf zELCQP;kV@i0!?j{HikYayO^jk`FUX~r@t5VPadiB*rUKxG8RWNzwW~s<>L>lx$k_Ault}Yh zjjfBTWQqyN0zd82C8|;0iR$ZsKG4fp05q zfEbeS9{$*Lo}B!##=#wbqj%%coABtyr3o`;-5LCO$U*ot-H!>S`{x;9aL<_!RAUfg z6HlFP@7@kUI@I3G&!mC!u(6AAr~P%tcuxh8qe}IID-xGYmhBmvv_~1J_wZJBwu9B! z_xbVbp#xhakAKkHp5g}s3WF&t1~Ij1{pCiFOHK4Yb613n(*FF5yjhP-hFys{4_+Q) z3jwF*)kAakugAK=YPQ$X#ftKLaZ$cO^l_Bwt@TE7Qsa&7cX}taSpU2J$=5S#qVuZ_ zW0giR6?%?yg#Czu<EK5K_BY4mFVbLLm|Z>1YR2c!y7a-inEzzrJxVmre|-Xgv) zx7oG~Nf01-eqjl+B$%kFErTi1b{d=P;JHO8`ZD?c^l?S+mzubCOr($j&698lDJNo$ zmlXB(rrCInHK8}dO^td*L}ivW>D&|rgEj_Khdem9tP85#sQekQMsy6%VOhv^Jg`*f zU7}G&{e>ZSBc+922ST%&hQ@?_?FX%}4KiSWSN05X`@`D}!1>~0^PH8&RG}7$_oG>`!7Q2O+_{H5KEG_eFlAN~ ze0!`M972!#j6zBMtMqdSG~H0PY147&&sxH+UknOokmNBzu{C(cRglp;n#KYXP^xIu zsWyB0H=NxjuDmFE2j-G^Zmkf|eWCu4C3DA;lgAhRhZVPAA-i=|;HbzmrOD4teQPal zZ|=F{jD}8LYIwP+FB9$2Od4Ky%Nc0;Q$JXPZozfoa1D(R)x>^oxn>Wezpep0R`n^@ zY}B;IW>gDWgVTxU{uJMXzJBG)!^emG^UJNC$aBJtT{p#!#a6Nnl~k=*2TV+b#A7Mz zbqXgjNe7V>+jN=7o;%l2pjkPDU^dD($MO%HpvaAHguE7!16rHN5?Z4q#@ETMpSHf0 zS#nu1LJ}&har)8<+phi<8V$+^naYLa*?3-5R1YXyI6~S7YwDCmaJ4DLw@1nV39lZ& zW4oUNJDfdn9FJhDGIjPN<^koVKdt&qKkbi{0Bkrk?;6jQV5X7jC{5eq@?g$6iSQg* zU)Rv2I=bg1u{dn}!>2DsaHoFL7R7j|Y^BFcMZUqw)aX{@+pP|CrZid7JJAdI(VK|W zxK(g%l7%$7z_AJ!T)E6foAEQFm#>%KKiI5yXl-w`c7!KmHJcJRpJStEn}1y8ff z2kXNKRQFh`%f5wtu(ssdszUjM($&ej6y{%LQW&~2iUvzc3$)*2>>LG@3@CUND6jtf zP8zTEUUOLe9S?iCJTrTGVJ#mVJ(5r0e#)#kKJwbv6>DUEj~+PGa&Mqbvua?g`7Vs7 z!ZNje%s+Qtl{o1vN7N`B&us>l*z(V)#XVTO@> z9*uZ@9qzMmL7DtsNzIS2n5S-G$(wLIt5EJ%wlm`3R!_y9Hq zt_bj0ZDnU@}S3Ddwrhsk%36zu$e^* zqG}xS_03I@V-v(e-*PvtHrh5xej3e&YO}K3$$aqi$qjm;Y{Qh(e%~b?j5zMc*78{E z$Ap=uE8n)|**TGWpCOA75VlzWdQvfhNUAAfA&DG+-=sF6JU{7qda_WCF=rLAu7#wD zICBAstKiY(S4Db#*^{Pm#2a>*pT1x&6h_n5QU3zNP0D_-QLNcU1&!5fOMqgZO+95r zLD&RY^C_2PVanIq#C#FdLL+|+FI~lWFe4X%6Y6Haml0@FdmQQaZYV__zt~K9Yn;y*KQy&xVf@i61nafr@fLRnEPh!NkwTaWubNJAvoG!v<_V&F;cg=j@H*lQJ@pmH z(6AzL%IQx*zhbTH0}2u${K!~h--JFEN@6|Xh4SPpjq!5|-RfKnus6ShFOgK-ONnC? zpg3CmcKC>>t09uzHAl3rioYqdbc_M4BYor8J5N@^(o5L1j;%(++HeBvZPLV9sfPZ( zNj0Rrp&dPQtYKb#Ur}(Ok~-r<@KsS5$CkB#jCnV8AMv+R_$c{(a@!?@zx&w;%u%VSV4+vn72OJi7e!>GYLrFoU8W8nyE1{r6&M8*PjlmpeSz z&Knrc-_LK@*3HQFJP&!5#JM5n5A}Kj`uznhYcwmCvfN4q%V`sR=bh|-r{Pu2d;zkz zDGReLXNSaN&L2O1{K~^5mEt-c*}P`zy6b3#b-H&SGs5>98?0~Fa9$Zo8jR$*;l`#@ zC2kUbb1->TMe+&LiZaq#ugy-R8qm3}X~kN`26V~}* zZ5h*=xaiqk2Gd%u?X{@|&_#U&EZt950t;)lY#GG;Gj%KnVd-sC{OL4ftZ;cXh*J|U ztr;v>rG30)ZX8I}2@?GtrIgW!V|TFnNL~uZ!x`DAMnYp0V`Nbxnt8b4s!I(1&jiy8 z`S5uS;-Ai-|;!M+8Z*y79fdksikIV3b+dvs{ba6S5SL|RoiSO9e zXk9a0b#iZJV5>4u!Z+FAI*_l5GNhuoG1ZUwpb`jP&~FYOJz9bkOk+&GsG8^AI}${S zXnD6B*=;VGVZM{aySM0Zf3mbs#%{r?omq)QIIQE7(%>-$Q}}JvVT%Vh{W&5XgWG2@ zZ?GMa&A=^wvM$BvXgvVjk8})DFhv`W%39n<3Lxz6X5?+s~t8Y-xA2k^bZtkDGs8;aP1 zVF+dQcHW` zo9q7!SRzF<4|`MQBqyG9)3R`e6oO_V+NYzXUMB<4oGJ_^XR&6jw)s3(VI7dOl0;28U7Gj^2 zcIVDG&mSKQnCL^2!@W2BSd6bPcnxL$SZ+~i2 z@=!;~N{^TdUXle*%_wN(m66q}zFh;9&J^!PdvA`g2O|s7eZfw+RaPK3)o(;8Kjh0~ zF6DTXLd)W3T)OBn27y^Kt*!KVHUKy>7iM+;@ggrAzFdK$Zbw?wNjh<&F*s*S@bB9Z zV-5;T=>G6{46T{_?E^tH2r3x9nA)hLJ=*E<3HxIJ#l~g0xP;voTq>rD{>t>`6l=Ky zN=FluU-6H6`jJLdv}bsgj87`bJ27W$!DRT*(SR@qix1zOTR_*sXJUw3zl0{{+U?u+ z%5VfSdIJYeLC@Mv0KdKefrE_kOa&bNom2HYQl zIh-mFxGf9huOPVJQ%%K~_8RPN2ZrMH6@cYXSbH_OygSGW8v-->JzE`}hNP+3Jm&(B zgUw!)d#2we^Qep!{8|ySt47V5bpn2*tr*tvbJbYRp`eshNuBubw78F7OG|fh+E_?- zoZxT$?gSb(Ow>9na;k{-9l62HlP7n>UBk}QLS+jRS-dsHG7G#~h80v@I>L_W!*>mH zCV(UA>dI~esKnuq?%IjP|R~?dYEgx*7zJ{M3T^xnFdTY!6*u1T& zs#rcQ!0rgsEAgW`urz5HdrQTmTapBCnYB(Xl>mnH+Tz5|{+#ESV0jl-%%haFWHu4E z19iX$i7?jIqGy3Ob$fKuKot1-3mNheG(e1asy9AGM++AhjSR&(34Dn5wFZ3<=Dnxu8m@$+>5U1ruuQRlWgmq9~8s=Un z97-&L^7u{sm-ZMVG`FSg96V%JmN^XNGG|XVtpn_&Ub|LHZrZn}84D2zWCdaaa$eSN zOC&cqKLfQ`F7`vjx7xxUVFs}nhj*C`A}Lvu`@-^$Au`Y*Rx-UW{Ryio!aQr!2BR^n ztw?6=aiO@8PfGkYjIX?peBT@#JU({F+}^ELf4Nd8WKbt?Lau+!Ev2huR6O^6i45>k zCBZ5yWboKvErz&wQ+6T5^Bki7~tk0^vR z010HEo(lYor~+TTT1*}4+WXju?VZH#MO13ttt^WFLAvi!+s5O4jd5%_6GBZE#Kd&v zK8fq+@ZoAyH|uGmUc!?oJ``ZG&jpmiH?W%TrO9$Gxl6GtWK9l3nfvp8S4Cwb4&uny zK+|7;^_Os{BjZ{(=r4&jitMa?PPVtEI+Mwxm^C7_pd>FaJ=KhT7y_ccehFQIJ08T7hSVmYpEDxA3S{UKtBkTK2ke^!lywttXK+d;yv` z#~a$zP>}VC)m6w5yeKE2LeauIyZf&nA2-51{SNvSJ?9l68I!+SU#d1{3GWVm*TrKB z&Tlrl#~Ig^f)yahjnz`sCWJq8yen&H_Xuji4p=cNPfN4paZk+cJFF%V+#2>lWyeA-_AIvwn%TBNO7~KfHw+FONjy^zh&| zpv&s=TpAqFYy$rYRN8gM#WqwW>#?l})Q_$;_GRV5FGDyV(tRqzenjV834qw`al6hq zmhtI&X?xvcOV@gwA6kUnj2Ln$Bf8PB7|3c$WX4`!5rkzXJL!kDhVaXfBBm#PNc-br zfINuIEKjQPdUTy>z?roAl+F$|7vy6aTfB41c9zo=1zT5DpWR}(~$O{{W;s56R%&r8aFemka|w0OCZ?AnQPee zg#KN+fXYw3%;J|i&==IZ;vgs|iO?R}BahamGW*v0K%3f)uf7eO)gub6uG5qCh3+WY z3>R-uqXM+~c-qhN!t|h$Ss_{so=|KRmOf z>u<3@qFRp0y#m#i>>`;(C8ONC9M?k;vNAm{c#=I_&=9t~yiYnhKr762lv+e%+DS|FdIEYf zzbscm%#%sv!HDENqP<3(Cu0e`N%0GG9YqfN$rTcI3*`Q!L#Oc!HM+4)&SP4AK@KaE z`VBt#k~J$PLI6)%Q9wk1A9FC2A$~A!eszFP%FVlYT?EnHnjgL^Lzf}{p0GW5XBKpf zRk?f1X1g;lExIXV2A`rcdw35fkh8O{x!KcZE#YAd$RJ_}ujo^}tgZP0rTmH`^A)dz`dj)?GX3>V|4WX-v+IqD=voG?ZFKd*Oz^P)Y?i zJ2L_>mkH*c2ssPp$nr;NI&B6L_&f_Qj4qxJ{8tx_Ykcgc*(m5sUp$@BqiWwOjYD-_ z>otYIL%!n~`FSV3%}j!v@~zQzqG{{o(>!ZZz)&`iYqopDm@!t=ln}I&3ZHGGLl);O zv!_lyfnd zoZhP+7x#D!49ZxhnGf)5qKiT8l6Cy9zuv(Hq_B?EZe2V^@zGC9y_a?S_gHbyQZ)k( za^aDe|A2F)y8pqB$TiIveQ-NDwUj4ZR5+&PA9|r-fRfgsnvQMweJw;u55^S-useo zOfMLI#H=opuC;*Yis2iC!KbOZ>M5e{z%PSevyZpei@7x~@j@rs#f`^DokwH38rq8% zn>9Xl6=`V+7YI4*PmQ52Jav5P5Cw<&P2!YmlZ^$3!J<#3!JS+L{dA$~n6hzg@*ST0 z0QgDPck1kBZUU7^kH!qwZQzrZgFR2m@C}`uj0GLX1PhWWl*(cQ1Jbv5P;ODe5(*)+ zVmQxE?(PQQo%>+EH?XTs>V4n=4$DfSez4Pxs-F=35R_}|c3fM&WQjD%Jnwd=RD*(p z`^=4ohX+eY=)C6hqQ^mXXtwtu9|<3@B$l!&1Afj>UYqXx27y(tYu8cCF?7VsYuuW4 zJQ3T0B@A;YW(<(tH`3Zlpq86J=o>+iQ9!*Yjb$bru3Y5mZ`XJJuHy^LV{F1i=p@^n zMWMp{SxeK^X9)U?LGr~rG0xJ6&QwKv{2>P|#+D#KUIK|bocg1T0wz8uD@AMi;67?Q zfC}p3aSGH)C*8L4-kEgE)p{nn2ceIp3BHZ!HoEk^cjfo?h-4sQWn9hD5*Juqd~9rs zK#pax$PspAa#K3Ndo-2Nni8r%{rlw<6pa*nMvI6qAzUBAzz#YKxjvJhPfSe)x3N1F zA`6Vey0sWIc(5xGNfcuRyQy%@aY*R_*vx2`8cqLZbWs@`yBLt~m&|Vw2qd4^tygaw z18;^?HllJLja^sRyg6SoJ4dvr*eg5nhFP)+d^FWe3{zLCW(e@>KQVbb>G`R~me&GM ziZ|(_GnH?zY!Nof;5;K>a%IY#UG?j$sp)U&Xqv@^NPF^R+8>Ee({~eVAV=ebYAMHw zNE~)u-ECX9>QI4r|JCT~?@Yl{=pP(ujYfKz7k>QM4XnHm7?tNEUz|_aP81%sI1*nyk@5K1O{8sHv*4FYJUkkSis$tW&BHJ3Ca&^#dGLi6tj~rV&5@M>{K@NCmUEL` zuDL(!%}a#CwMu-_ehD;Z`=2K~h{{D4fDjd}Z$%&b{)C#Z@ufQ9n$3=qo0yd|gk$1O zuJK+-Zw=*k5a9I7twBccVjRDw8GUT8U-kg>R%H+0Ce|_ILfsB{QL(&g6?N&bhi~ts zrdo*RjR0-4r_31*Oi0%yix=Cy?DgT@oWdInPEi#`7jtU6KotvG@%7ucMgYmt57gfx zYBr$hv>8?QzF^2H_%9OM?0hTfonP^yacLj8jC@3a!$8|@CRI8&xSyRH@M2cnoCOQI zae=J>=cY{Q^6^R4Kx`as288e;K_^a}unXV0b7%j71H0TWsx($?vdbR#`4Cfx0y8v$ zaxVPhjBps+i1aB2Yi<05q6Y&8M;Lb2qd=G{AwcN7LM~MNcr5-6xP#dZ2LFKEX!UVn zvnEYs*|Mf{ zn#$TWI6!z`EApc#7NDtJd!S=KCqB)ZTGaQ_y4kD(Dxg&`KIg5gt$n$$QzdYMloDCr zdFaoaJxd|wznY7sG3du)7z-Wn0wlS1pUP#S2p>y%{qatyxA#$L{weR3Z_Uhlj*9G) zKZRZoW=(~{ji=i1@Q7bOe_m#qgZC2F2)vmJdGY~+eq4rY%);ShlBT=&)%WMTNXWlq z*y^6=X7ac~z4Ydw!Uq9i?@B!JT4^3P?m_Vhn0FLAO&{fOsp@qbJ7PpnPozo}m-~J@ z@7-s7s$=tz#v89xy!~dw1*#ml@WRT@ znm+&M;O*Ye(#pNtw>+B8r@4pgtZ(T+>hk+7lHER~zQ9-VMoz7oX`}6v@ z37^yp7G+J?eG_`U*-&C?UpQ6X^3C`1}?6Y9vEA8Y^xqf9># zVTLTKWo~iyh3O{H@K=I+0G8P%ISr#emDQ(|?JX^9a&%IGp|*yF)q)L&cZ;Tm=goei zClOa>Wo3PJ=z3YS1n%Suw8AM_%UNR(rXDmlAMF9|=}7++En!&&azdqyjKi6n&tHv< zth)f5MRs%=wBOXAA6bRIgaNo{|F@(Smt1BUpw)YMAzFrD`#d6!qt;5pB3?DhEcu>3rqEJF8m zRj3r(6zr4l{k15oMS_jq!Pl^z!??-~-n{0XXkf}qqjWFn@q-7KY4o4_YV++#C3Uo} zq^3rvwX>C9Vm((*^D*yUVP;I3(d_W81)$wFS2{Ed7-tyzqftkVmUrJyv#@Gfua=*` z|M7oX|E^lJ9U;VqkdV&0Q2;E*HM_#UWMyUPhS^;E7JsrYJ#4eeuzmZ+&?k4DFuZHC zacD^Zm2OiDVoqxG7>rF!Nv1>Ds&g%Bu^=odz8`tPkv6R{K$IW3W(9%$X>I zg8lUHOt)p#z>R~uSq6ejebUs6Jm-{qU%%=o)Nh?|zI3i&P3^hWWybXj0Fav0KYO$F z^gTOaG?TXIM%oU?wh8%LhvUh~uCtEPZO^=aiQrO0vA<+2KsFZf1RUC#Ba_ht6-dojY;O`ZL?r|cL~R}PxjgA<06;PvX`Wsm zS7uOl87QGJc4iC-$<6J$?wsiRnJ1WZNT*PRDvX@4{x52W?9$U=ZIs?a+-7I*632~B z5mly)i=VpeMd#G-hIMw%rK-w}aNUuVfS*6s2uQ`ukqtECG*|n5X)GkLWN^IE8T=ML z9`(9PZpV<;Hct1qF=&CWlsLq5K8M0fKXaeY4rv}*U7%@liLAaAyqwf53)+DAu*vb~ ziU_s?LBS+wOCIQSQ0!a~2&L6fG4{Q%EQNUvbCzr1r6f?5NWzF#&Ge7KR0acNIo>cF z;{E$;o$p?Be6`DEW7pvswcO?o&hxy^bLX+iGAhI!HuFt6UvnLHb=JlXE99N=22Do&@QrSO?q$j#rEv%GGOf#S&~buO?IE-u*q*i>uDg90Q|=@^)Krx=1!4U{!Sc~} zWE<53w=teEKQOnz1U`X|PVHZtPG6zW(fCdyBnVbr@JeubaWV(Lz)`WO=6nrRKdU;N zY_(Y1?w{P4lMoxK>wM^P#XvzuRO8kPx0KBF*H}SLeT`>^-{`95W8!G$B-DjL9`<6r z^lxQleuoYn+ULo1)DoRV?*}c`|8v1)KD}JGH{GzM9j&>bCry1<-T42g6cJV zaHHCO^_G8uSI))L1ITm)m6R-y(NXuC8XWh4julq|oGOmL|LXG*3Z{`$k&n#rQ&NDbFLqE~c58{^NM2_GtE;^HGJ zU2omJecI9W`Yn?0(2#O&+4&YrgZ8u6Al zKdUho*_wKB17?vVCW$4dIH0WTW!g$e;g!X2pHqOETry>v1NrG~|M;%0C?*cff9=su zY7*LU8GFPMm4Cqj>fp^+Q(f%k{CRfxmoEjw<5zMiF4y_CACKm3u$;ShWw+K zTw&U&ITR_JzGJh_@@UDo(Lq^d8CBx*qojX80|bDigeFrpWaPCc_)~vU-idzueKOut zNHuCXjTbqfE;eqPV*tEDqd zPkU3u>(lJl_?Zu5+`v8O{*4=c`bYBd>fgirsTh%aLzC zY!r!VbZzkaiU{~vzoEeyK{Gn%mBQ?0+eLFV-a z4&23K`aZtev&i5OX1dq}?Q%JN;4{gBKVGiCRp`=&`=ay!wD>CI&R58LnxwX`??Riv zkUiVC4;KN=*Y%m(njSaWO^PV@V7=l)l+BZnmVC~QJ$kd+)6(EjUC98dWhV3%Q>|O^ z__(TDu@r&b(a_N5CAhp>Kg#F!ssFW%vbQgaxFdOuy~P$6D8%7K1lQ)Tj*0OynaW+S zqr7?f(hOqn)GUK3mooJHC%J!VXs@BS!2H;A{Ah1Ie;&aL7)3~(*J7^`5$YyhzxHB# zFb+Ac)3Rj~m>#Z|e&=eK;hcTS7N&KE?O{B!@~`5LA1&F9^_EtI)HTC;%>DI3bWsDE z1zN}li(G!tdRov=ahYC?@dR%id~)dHyLW??_dkxt6>0;7&RS-(2rNFkxaxDGifwCf zO>_Q?%lNADDaR)M^;t8}0uP%bu`jT@dN*xpMdQ!5czGn$6jK|%a5u&1CWJ3uKz%(T zAxf=~aF0_Se;>GW>sBE5*+Pyiq?Q(jv*Y#7Cxv*L55xzi*`^zHyy=+7V;qfnNEb^> z%Y!I7w$aRlGwRZ}>Adr%89g1ezYXTzgKxuw;zI?)xS@>rI zb#!+3UAXP;yQmAR?)kqgxb8nlGX)}OJGSEpCnlj)0ly34O?=?G*S_72lp$4Kb%)DW zuWkr+OKRZhQp%ZD$~4z@u#BoR=Q^mI)Et;4uUE)=!)IqE!tY_+Yo z7kAc4NJ;s7i5qvf+sQ19!uu}h*K)Keh-AF1dK>2-|KA^i-F*tmTdTSN59JSh*TL*p0oxJc%*4dp*jV$=W5e5nuaosk6*u~?ij4gRB2q&>_mvs37Eg|Flu?Fxd`f6Rur2OqX2b~b zBxT-MxyCRrY_f>X@jpB1_@LzNowni|Zc&FrOLQG0OzM+;%$0`DunEN(!#rsm4*zDc zaQdzC&CI*FEGy*)h(<kZCp!4=I7;ORIk!=%lmP)T;yX=Gu|B z2J{PUH5i;j?4-R%UXuypC-H857=Zo)TolO%Dez6DhT+akA^P*U(HtHvye%D>5%n6(xiON`l-UdGRl3yM;RC6L!{grJF;mrpd~A5S~g>w)|?D zG~>2sD!GwP3aCKL+~iuUQ;dhN)9=7Q4P%Q6YXr9QnxCe43loGOK=>K{Uq8Ko9t_6AGxSi8B*rcOn5J ztQ{Um2iRf>Wg2E7bBN^GNkDUg%ZL%qfDFvnNoJBz`gCuYnwnD#>*&-%mqc92NZ#r_ zQXkYcIMZZMlFEXI?g$D2sC%7m<-kNeG?>1OYQJXE+0XpIHJIHXplhsQI}aY*mJ33P zJ&966klmQiw6;b8;J*AJQjS#Jo%D#3fXs%phck_`vFoy80IRxCR<+FIKzPdJ62$mH zU_Nmz=0g!X26Uc>;JRg7Z>=OVcMy}<6q0xud^CTG+s(_X#fjH}_^hcZMFRdA*Uo#f zg@v;ge_uFe!URd`qd%nm=-6@-3FE)USGOosE19IzsncKMn!yzY@lX>U3|E5ff&Dk2 z;t)rOV>2%s0SwDXNyL=Vgqu;L;o}iDbXdK<8~P$26lF20jcE9Vh(RGE3VE?a@Tsf% zE!iefs6*Vp9kaL_a~ManeyGrYK6Zt167yc=&b!eQC#vHP5iL0;|LWmUB{25cUtF`H zPF}J1g(swbmsDgvFLE?B;UmN;MDu0Caf=2P1#<(FMNPUi^SKNdtA{V2OLEPy;;d}G; zZ6}?6TxQGwsEY9zMad!7-X*UZ6OkU^X=Tsv;G6Jt)*>AKw;dBpUR)$oUxf_#@&;Af zlBg&!5E-c96Iz{zthys|1N5ka${C@FHaU;=En~;85KuDo)I7G;e47SU`#Uy{w0qu6 z)o*{)u1RcKe${3N?LCYc#7%FEhDI1?4xLeWBVd*7D{~KgB9f>ph@8ATxQ0|-S;uC9 zvZlmPnrlRoUnn#E;ZqWGDjIbd(i(FMMcF&Vt(oW_;Dlssq9`wJQ^Si3!}~97!)NY` z;#yp7WK0T#s5izvP>AQ=@26sGA%_H=h?H=B|9sY(vs*NN0*^u$qYU3TZbPZ#vSlG$ zJ@!Ao6fnzb*msfN^#YHAP*q*IDXmfn>pp?emBQL$B zK*58rNBebjml$F}{71Pbc`Y&aWeSc%F|}&Xpw){Ge1^5nG>)T8xjb_`<%zCY=Vnq8 zaYvm>f~LYW{p?LpC1oO4YGA-I<|pecaB;=)T%UvnP&rfw!~4PkyL#Y&(zRQ+J~3@M z@GZxTIlz!;Z2#%j;qez37_z~gB(v}|lg}C&09G60+{g>-IsJTq677*pts7m9b+*&H z1gezwd-}h-#7d!An_bHcHJX$|c}VwGQ^lp$OfBBj-@jKeUVv7_4cvKbyPN&-wh8g=#Pwo{n&59F++6#-g zT4tn5hi=_EYQAdMgDE=7d8AI%b)2QR;w@W- zQPAJ}yn{Mfhf@y5#Ar5arpMKuu&>Yj@qxdzP5TZJJZ`9Ewe^|F20gbm_p;^&t1Y&7 zyq07VyU7R9FNuNU2F)EoOe~Y1cZ&pxK@i9dA>JUkEl7HVRflJkC~U?hevy}?2_+i= zF6-}vgz6bn`x@_ElT3Jnq=@yk_syGfMcQFS7GDyeJFS{{5 zPW$sa)3al57A(*Av)Qk{$g3!{4rfk%C8EpMgC)omYh^d@#7OJ;yNUdakMU?-AGr;M zXZKFw-2IuYFk1e;7dwcfHV_Ugz|`&e(h_*G`44c>f96vP4f?7F`yQB$j8 zudB1EbKy~nEwMbOa*?D@4#rn>8h#zN@7a^N{xF`)2Wj|$hGe){=8$orkwODGQwqn* zmyeISW6yi>X3n?anmkzKeCKlHbzKN^pjT3(H>lE()12@=*Z=%3%|iNumq+UmR<> zA-}3xYiYHZvCDi@NJvQjYUUP~Ou0`2BG<_3m`cd1L3Dxj&0?n?o8o(C@W}OhBO)}Q zS{D+uiP`2El9~F+Rk5<)8++#+@ z=-#Q&AHTkk*Q(K~RsC?Qzd1Et0ZRK_*hwNSsjvYJaErNy06|%hUn)YwZ$o^|3)UqV zGB7*s%`mpB-LIhv0$BXcIp|Q zfM}FvuH(?@rS4l!6ZRT8%#9{qKU-g3U+sRt^gKzq(~bv9YDQF40WVF4HB`1y;?lhSKg zo2{ek;J|=KxI~5g$F8au$zD*18{?2Nq`(er`uudK1=kEot05xsMc<73G3!|N_N2#W zJk`Y$f)V`ka0>IW2`=UpOF=hr&Q-3ZtSfXemNK3a9T%wBYmO@8Cd09JSH@KwrW*$g z6(wb4h+Ez1=U*+S5Fbu=!Ut53gBd0^w#E*A?MZ4ee1uFMa~mKwyEQpoZ9~9vj`8+; zY>oRFGSgw-=@95yGKVh1R*%fJZ@+D|dyJ*!&r_2#!JQl0%*)-hU%hUNBUt(B0A1aK zNYjUFx>?;Ku9xRRIU5!|ztS(zLWda%&Diwx^ap_8;}j9WTD^b8c*Xn?GNo+A<g&2D%z6o-;WBYL)s>9TBtfG zh+x>VVF;G{%(}GvKx%b&RcgmW5W+jBc`-K8Yi-hCV`FPR`qQ%$c272#vbD1EiP{5A zjXU9eM!lQq>FIeKbh(Zb42s2;%+L9yR?I-cNn` zJ;CPqVLD)It{%ImOhi3C)5}`x^tkRje1@3!fzRwp-d#y~`4NbcHki(+w6Q)3z|mes zYxqGUPWAKl*Xu>B1hvxpTJynw!={Yo1EbQ@Pd5FffspSvw`J0~<)(sHuWTOwnV?BI zjY*T}FC>sq*&UWFxCjj{Hm4>qGUQO!H7osg4%O$Wr96+X+;Fi+KcqA z%zRbNit3g7=WyBm=(k4D7`GYlXAoy#XY?Xq^OwjZi%&=pi!~8_Bjmvw&tR+jj^d4+ z-uy61f$DtE+`K&VF3pkw#L%wvukLg*BxMl=?qC{Ugx6Uq!K|Nqh&07o zLfD?SnCpXFlW`gSbA{X2Z{I9zY?@(bcC1@QErt8Gm)L0`DO8zggexU^W5W3V&XqDDw*&MPtFS-Vcg#^ zMBDU_Z9Pq=C-01Z{WfCPqT$a=4^5e|eumd{A{!ETK5JQz;OH+5UJqtEjZ>FL6$HZ!yI4R+FAzDE10&RUt~7y$V8WypX^`~P_xGsps3Ya7 zWXggPU=M!5O4pYzs;iM!oxV*~VCE<3czT`^=#VS0`{Ds6iyKwC zw2?*W)APHm{L5_O%aAu49yUhdAStL~mxB}`ojOQXk+=b{vW4j8yz-NY5Nfg>=a(|Q z@#N|nL*XY$J4J}ymbW4~)&eb0K0Un!7A&0wei6WdGn8b`&btRJ3#N~kga@>&sbCs} ziEm^?n$0dI6H?J3Y{Ms@QJ_UFwo!n^!DgoigtcNI5p7+l<%_-d4^aPb8Z5HAN&?nz zy};WqzJD9~azw^V%!tQ6BWiTr6KV%(K=D)Tp-5zytqDK6Miq^E1??}v6FkgG{WWRd2*wC z3p=pc9cap=fyEG05E-9?jS-iw{k~mKx2yg?1Z4jEYeM@Yi%>(zphC0xFgAqT&__0? zZ{Pv4*M*?umW-a)Nj24moRf|I-a|os(d?f0LF$oKdkMz?-#2G7Yo5CI3dIK+y6{60uWkc`TR+lzHDMbqp6=YUM@{FxU8je6s>6>@CM!Idfz00wJ0p3*^^&Iu z@bYlG{`a!7etO-1{lNkXxbai%1D_4m<^9;H=uJ{nXXV$8n_hk6#GpjA5tnlYwhOKo zW?47fs{HZhq@#@vVG6hX*0(dS(|_2Vt`3G*(_cIld5qRIS>0^;L92z>2w|P!?$CjQ zA1}NVN+DXG73^LBz3AOb-Tds8aRF~Q^3>XWLUQv2$y(+M#xGlMukr!`jfL>^FEkR; z;8DA0af@3?3=v2XO)7y0wQ7D<8X_oZ08RncP&?a~jKv?V0N=1Kcy~Gnn*QE|z%16G}E`!sP zI5gxGGMNhmdLin_kyljp?iaHBV66F*2qR55xAG#b!#4Ujf6girPbt-QuX#6va>`l0 zO5dnI_&f6JV$usk|BzeOLPvkqN>|r;WqQUn^)(8xsrH6)=R1g}%RG~dTB2i^rCRkr zRa;PL2w4H6&vG(cyoM)iH!;Jn*tnj^V^n}5BAX8Shhy;8y?a}gY~JR#@=+s3Si=>o z%-utg%kB@8)=x*r(#om}_3{N%@I@G(b$l{QGH%~K%m|VVjrn`3>?khf=?U)r8rG@R z27^74haYe~q8%MGzlY*vZ$FGM_=@J*+7meIL}mtasRf;`qca_5k#DMH*0uMNl>cf0 zs1W39Ei5R#AAcz3?fK2#P8GW4;>C-1djnkyX!m#|+&qb*3tTcJJC@>t_?5{ourJ2s&C2}hpu z>_-6@KLn|sHv{#^@t>B5FP~+och;inIaggb!}uJB(yZeRm@q=s&-~~e;EZF)km`6# zgonfCSWvrv8fojbuC_jp|bRUshh!z!|g$%;9~)uEw8WbK&X z2MVL1`~+7v{qdx!w#i{|@0gkhP(iG-w}74Mb?M^EeHOlZ_kD0;(@V>=2OETKx zVMIA12^!3*0I^F1J;Rz@#1ctJ)mjhQTRL?x;Gtp7H{Af?vajw3h>gUA^wXH}CUZf{ zSr`q?CY{P*rrKNgY<7COe_Wr*RRaw9(0|a{mle54^8@bz{k9<3F5 z-7uulIocZ#dy+=pfZL|$*Fyd$1R|Ktx0Y zw?bhe5S8S&MAR#_HXC7uHpQ$tBCxHyb_H;lcg8gY zE}%!BIq0OsC00b-MOQ=N0PMarENGR+^}-Syz#fpmI5Tj})#ZD3?@pXj)YU8b!-l+f z5!Yy;BV2iof)FpB`efJNx~nTHAJ|~%$W+sTi8ZA*p`|@f&0=1i7W6M3GGTQGZ@zZ1 z+(EA-wso+0!+A+63tX&%EnOylrT#s#)s z8rafIv&nPx-J`o~b2#2;Pk6Wx+d`&@8Nw72}9~JY2i!syysLUc!dR zSUE3XJ#CVY@zuTO9BF)T+q)Ob*=Wy#IYtXED~mC8MPlBhFaqGxA!(Ni-A^FX_JdMO zvYD9gwfv=7#4p;$X*cl)>4S0aavZtgy3C_&Wa?l`W}!sY!SP6gvSVI0>T9ZFCHt@i zw#GZlo^t$1O)0PmdEmd3w5acLJ{TGT#@+zxRas!u`ikr46OO-|f63254O?F$#?{Xr zMwL1$nFYviy3SZ_&pV%_RR=F=Ml5)6hjDcFwQ{yQr39uHu7NP_qTZ9T5fK*zDNB!b;NAj zZ(n!+>lLYbuUljoZab%{^$5n@9Mg$6pFYjdeXXhC=j$6C9nK+Yjj$lR!e%CafAjiv zA6SX;G}8KgOcTFtxd%5J^W`;eiNxiA2B3wET~~x0tzL*{$(x4Q38`z`1Lr@Xnehl% z?F9X1H6LkccsSaaUeOe7+rie3!|2uVo_>D8FvyQk)KOC8R#aBT-pR@e5v9_L7yCDt z0$soNoptrfm2=C-LvD#Shqtj6ESfK!M8`DLFPCeHN_DOk9MZAi&f~LDGq3EE(PJjM6 z9x?7c}!x5fV5>Rid~gR7LhfFI|G*Cac8jyMXnbd@qk)1aCGUf+0e4 zeW8Fy${XOnkd*1-)XfIB&&fq*C319{wQh>wV6?{a4x-l&b}bssw^Q(oL>_AS=EH}f z$hk#WPu-(8U_j2?o9}rTnfHe=$uyc$eD2xIkAwI42e}N4s^2QCq827#DafKs7p$GR z9vM_YadA_S)1fNi6a2WKaQW>ZC9&bPZ-dV@Aell$r*o_wcLZ$XkX8S?mIhsE>f zPknFjj6+_0w76VqXPl3?*o7u@=?+n(1H2?@TA6jTJ zo)gA;Mtj+T2(W^QF@Py+1u$G+hD*ex0A#I<-pPkgJT`~N$Pi>5YC+swR!{!R)D<=H zlSSia3#4cfIna3&S{(jJP~RQ>6$NPOI*&wAs31}~CkhG+{W$D~cWE}vAnX-2pA02$ z1wrS*&c)6F83ERJjXo`dcoLYLa_AqT#P9xM1ik?sl?Ch|+EOyD1+PtL6A$^>V@k(v z-TV`@#RHpjU>KvZXrX1GTNcyE>CNiIMuokRidyNi9WlbY~rLvJkTrsAH6- z^?r+d!{&!0sX!o$S`OI@HYwZuHt+ym zA;zM=viIa8m0>o~aVsymT{(ku7M3CbE8qhqu)7nVw?EAGb?i29x2b*gEazJ={xjEa z-VA7;gH@Hx;((#jZWeTFF|R`Gutj7mj?*xVVSkOh%gL>?VX}eqs-nU0ShbjbX3&PoAI;;<+R#D`>nWzC;m_8kR<9-mpU@fP=MuG6Pk3qV-8l%G7lvU)Kp`y>kw z@+!{mdKpgR#8OXB!@3P~l!1F1)w;&-lJI9A&jfI98J9EbXvUS6>zhr(4F}^F7}#)j z{Mx^`Hsw&&o0C{IxN;q4oaJlyXrH8B>f2EV5U4K7PDBH5>w5;I@xB}X@ZEB~qLJRB z_gU{mG$#72q3d`=5_Z^fP>VKgPE1uI0wj8hF#?^o6hl;A%Ir z0Hy^~&iP~CQyWZ?8E>5~T`Z2Cp83Zpp%K{dz4lD&F%maJMT$__(*V6rM&Wl8@@Q1V z9>=?&*Zq|2zt0;qR~2^#i#n*1ZtpeL^!}&cBLlBRrc-q%?3;Niu$w~Q_x?iF@q7Aj zPWle?(!s<0W`Re&XGvb#AotFn)9R-)e1i%=CDQH0*{~V)y_q_RWVtHdcqmB@A~%4@ z3;+^vAiA|asAY@Oqld#`a5SX*>dR0d5axR;)#B$@>qB#5>!R$wwV0zG;M^LEAZ2%a z3P`(XYMTZ6hE20Wy(l(eB9;I{vl6=}O$IF; z)n+IiHn6zg&_{Ab)yo>yrCH3Ul!}3*1Na4B+BE(2yzeXX!xE}Km%J(}y1i&zB0w!? zfj^K4dJ1Mm2F#i@Yb&QHGEwqY-xt>G-nB~-5|q9U21r{5QU^ah>p6!#z0+?h)X2px zqq~sgAQa@PpKa0F1F>b9TTH?M6*`m7P0%&v3*@i4&Q>#>tzvCm^dx>mU(Pqbkva=* zIGh)e7Y|y5k}~iMk4!5W@aQ2moWA75Q8u%2q)TI@L6n@3aa3NnESI*{LFNqTZ+{lP z72fX5gL#-s4BGw#${8x@?}YVbAH(unS1h&gg(7P8zCN{e9evHE4-EI7`(to&Mf{KZ znd8~ql&crV=Qiv~=gB}qT1FEL8H~bRIiv@z{nAlmVVB3O$6Z6>iQg*w=lPxl*EMU7 zGM$i3ld$U!A|ybGl-a=g`-pS7GyC0h+U=fm68BahEH;U#Mi|$bVvPm!C}!Q-wb?A! z55OA_DZS?bvUWv|b@1BaZ4nXU=*hc*1iJ>s#Pk;aGtStxs5LojvDI8jQYzvxb_DSE z9u`)atfH-n8Lk2v5;49Q?I^#w$Qp z95KEZ78JzK;R2gwn`M;4J5z{LRW-HFU~N*jv;MER6mA?pMqH;pg+^rOoiB6&*YflC zZ&ldRz(T@o;%^RMSyzxd-NF0z<4qMmjGOi=wTtbl3dhdi^q{w? zbpF_~?X}Tzq(+wjWO3lFsd{JXUf}_dVU7c2@HoBZ;_?p*#of1-mg9hth6^1w^v!d;bNe>iChehy%4TI8Ja*%sJ1-_x z$(~N~nq&BI@>A_dw~zZTW?$$u2PVD|r8qEiN>0xAh%~*T-Gj)ud-klI_YtRLPzAxS zxeJdzQQhuWK*b0PZEg^DknW&szSlxA)etQ^)qiFEtm+KL>mX98y2GDr;tk9mznJq2 za4U5-ZKd6W)!PG>Lv!;=kjNCAJeznww}ywrAi%j6*HH%?qU0g;SLJFqxvyYBsXoQG z{FEt5YaEq^&gs#!r=7j)=NNC@phx-nv)>Kfl{5deA&(2k1*;E}K8-~vN@u>2eI<&c zdS_?lm);3semrw*-&8b%)9gax-!X&lgGl7@U0`m9m|eN#g0Z;dj%aDK_;>Wl4A)a2 z2b6bTXh!tHEC(7J$EG+0G136NH9;u}=Yz|9`AXO*X6?Iwv-ieVrCb`zOW%&8qL6^l zC?l;m&9#Nf4G(YOzJI~fgwI~5TP)CTaN2B=z2$C(u?9J}Y*aRNiy>1!-(F-^c;3q7 z$%x{MvK*jRos+w)?;Z0i`+Gr~Ii~2&G2*k3TsVZ!T<4{;`!(34R(O1BgXVJnBUD}%nJo$hUXO@W2mqe!)#KR06}G_>$T1_mO`2M{RzgN03ZZ`&- z9W>&@3E@Gr+AJ7bH?$?T_o5uJT;1sIQ86$O*Yol#)ZxzW@6^C*XCI%`4Yl&|Q?p>F z_BQiB`}>&*!H)&S{~+eBS6CEinm2i;d4&5K%@sW4e;Kp=dPAH-uUGhDmgB4wDIAv{ zOy{(~zTA08pbN-da4X&)Hg)Uh zE@A;jTg<=Wn?S281wAX1OSSv;SUqDHHHq5e$SpuLk@IvvR5se^n8ikn`9_RcX^$lX zbBqU>tbojYoV%vH$c_Qu&1Hj0EfW2P_sA9%EEN+#6$Di0 zT;;(75XO+eYPGAE3P8sQa8DJ5S9~2Vdn>#kV3OFc{5y}GMuhMd=4dxYg7k%6Nm)7@ zA0)AWoC_6-bMV-WAkm_qtNV{v)sNmXc=8(qrWwR1fT8-0?3b2nXVMViptO-^(B@eZ z#(JPZDL|IUe0$U>V?Qbiqw@6GuQ|Cy=nnEa{n;cK&;2SMezXO?$iq?~KIZ=U=j_L4 zSkZ=iIZ$znYe|DXEpAZ@Ywx%Dzdt|7riiF?{{-LEQR;9zj@ zI-GP+4y`czL31e!4rQh!P&1E)&OxSa&=ld1kiMby z&_Z)6kQmep<<~t%4P*+6@lB9#MoO;J2+m!+coV0k4q_#4^fV;CL^}kae{8k(Pv>DA z02?3PrCotuM&yD-=I~vo2o6Hy-v=R!c3|-xSV%?Tsvm`u(5fX0QQWnGa(vQ(@Gl;- zi#-y2hnX`@xVgrELs6%|SV^ua9f8PQ7~!H9@n%|wXS(87m78*n59`TcW`2(_LNc85 zbPHcCGB6g>58TTn8A#4ed6YPHNVGL_} zb47OXRFh^{3O$o%<47`H@x?C8>$`RHsp51$}G1R;en&_jo&4P zbfEIHIpK^GvUHa^wNBe^0>e4PW2iU7jvG7~JF46iot2gTw{v5xDBuweiG)arWOOdW zr3w;U;vWdu&<-s}G=guXUQ%{@}ssjqPe-zpKO(k-T5>jjz-nKGYf=!O9!Ha5R?A&KiC;pd1q*(`n8 zWIm2GjiUmab)7qJ-rpf6KO3M|cmJn?>gMCI`Dn_>#J*76!!uOC|uu?7t(R%7~L(sPrfZKKHH-b^Gajbr_c*Td5}y@{$Miu z)#YIgpGyH=r~tdy81W#_ZSw2~pURB$A6DDJJ_=Zf2}o^4G;v6{{W-0Q1jr5jtcYML+ zWbRN{OP-~~ABm$c7YUkWIjfi?r%ma^^Y(`?BD~7Llfey5uDo^s?7|~1ne>s+I^U2I zaL@N&P)fNkC=8w>N+Z?lPL}L-dU?5-@D*&`ZY8QPsiGOiM1qsoF>&wOE79X;&fGh! z)?2y{N_v%>dNUb8zzW*W{`%kcZ*Fci{QMm^YwLY4uB;xb->4L`51BEmrvx-$z4`Gv zg-w7?$}k3yW!^~yjvT*?kohCdRTLrhfe`TMoNfGA z_Sx+C*3|YgNP{KTh6yGWbtofu4PNsHSAvuJR7w_!o<4R=ud3Lq<~pZUn87is5bL`U z16Rn1IqJZcatSI%^BVV=->YZOo}wJ<8go04+F7g1DHt{=){8cJC^Q^F02iPwqBat= zQ4n@+`@csXaErxP#6(-P$IO@&wQZbDsM+81g;@IaVTB0~rZxIi~83?U)cBPv-kj zW|%tm?yZ4c+b{&#q~0-j8fwB{iV~Dtl?~p6pMHZbGxqu8gZ%7iP-^-#{PgWgMI{ob3Okq6 z=QKRgLpT0shQ~g-^w)&8^&YsxICFr@o6*c94ahW}knRC%B*Fkzvd}Yg26fO#Ncz1w zV6y`FG}{htq@zR6%95!CtJy~)5>XKLe`;#$tUEQ=?aD+;9*s)Jrz!fBjn0`nrtE8_ zH&Lmp+I;PwNvIxdf3CB2eP?nuY3eN7ii0cW9Gx}ZF$Q@C6J0Ck=)kd%TJ#w zpQ)a(aBB1Wm&5yDJAbw)Y=niA6@1V&giXPqx%MCnBWEOhK>|J80*kTmL%IDY@rkyB z2dmGu$~b=V*!hD3-&d#kZh7CnB~>`{1M$({25Q{%I?e$`ft6X_;X=(uwl>7g7a>dl zLi?jKmXG&d!KOB_T=U(h8>8TpZ)u1<*x&I z#K1p1<~j<83``iBY1~^E(#My&FxSz1w1q`+0)?ytkAfu{5TKWZ>%ROU7fvT*<6O=+ z4UIzMMUM5&(xBVwZ5~-W%+h)J5O6-G&Hexg z5i!F%x-aY9sqaBH8a9Iu^&IOnB?~yfaMYAw3;<=tf!2B!#8`o0wUrqlG+jLcyH*d7 z9O)u;mm(I;$jZd+3)g8kJC2;fD%|J>FG*`0(SQHr$8#jM^!7bHf>MD>O&4uZ zsb%j?4X8G`J|@C^FWGr&-cfo`qOp*y7I)wL{e<*B{1B_X12wqeQ#jUpL9MilIElJh zMz>KO%uU`P1;W^@h#_u9z~ba+>|g4IH^YO)v(mi|jNYmvW}dFConDEj6oj|d;Gn4& z=r4z?uX@4*DwH5uJ-c&{6m{ayL2`3Et(77oGu z^MAD5{x?_U|NmwG-*)r=mFMQ}zZ60WQ1Pss00-BE<~>niOW*tSDf@sATZlhuJ^z3I zg!#Ynn*P`8?D*#P3NJGD{Pdpi>p|`7S??3m_&$Ap4c#B$BH05v8IxoRSF$h|i0bRA zXW@32D@81kc9x}cWrI)ZQrY9d7(!cVA4Vg`uk|Txd3C7@q2sy{#yzpw>&(GL~|!4BmaDx zEq}Nh6*x+cc~Ue51WEaUxKwAIxW8|6)(z4+kJCT>C-*eTY6@8!bau@63fLC z;N`pr7T;!aZHr>!-zQ+=8+tTh?9=g8>0hH{=0eaiOvQZ z-$Q_)KTt8rP&NJkT)zG0PQw@7XN{V@6~jKzrRx$7Eq*-ByW2LRf18*mhae~Oh+Esb z&RHA;1|wKJm_Sz8uKkZd&ZhqApkbX4HrVJ_Rwtc|aRzSr-|B4DSQt0GdC%$1k#jy_ zZYg7@;j*GFvrkBT0fhv1iXn6x#AX3>t0>H#H9$0q!AtkgeVz_=E2*Q1mnkBBA6Iau z;S{-+J9>yf5^_&!J7h&7U*VYM_lEWc(iAdWx#aq}jcUst0sLsnCkkl>IFlbg?*BCR z6j*jAdH`lBg!QDwZyY>g#E1iCf7Q~P7TuAHsG|-R(T)Bsf|}N^U!UL9`dhf+924n@ znH|E-M9=nAYlhAj_v*geSc0IDdO}G78yt)`%ql(T8vfdZmrmK2&TQfApA`tD3h1rH z_!7kxKRWcszRku*x!5Ki9<3qDBEQeGS2qGo0hywcdAr~lXn`ZQD%Q??1BQ1;`i{z-k~Yc)ZIq&K{>h1BZ`xvw7R7 zfDc$U$-^_Vo<8Z6Fd1A|cBF*ya{P_9K4PVXTj$EZsfW|F2x#1szj;rrTndzqIscQI z_2Bo10A!$I3w|GJdQGW2-SV!UYYHar`A36B7a5{n4t4_IH|{T|!A* zp#_QzVMkHtIr1B6WFO7Y@(<9v_@+8;tLbEUiE1D^iqh0?G2)Vo`6KIJ8dEp+O%=6fYrtH7(pN*@tY7&Cfb++>H1qnZ2(nUzWht~h;@vLizy9k z=dF@F9&eaM)lzXXb8>n!L)$;#{kRo>Zz<`!Ze3;0PqnxhZn2VmJu~`{%r|Gy;_^h) zQpb&aaQ2IAw`SEU8TA%1FSCzY-G|f`7dWi9`6wCt{~Jp75Su@(iQ4ZrSYkq!eXBXc zJxqboNYR^hr7uxdDhj?U!$53Yo=w1=Vb0MBhIOk;X zUYQz2wQEh%0r=6k)0>A|gwBw=8GYoSZyz72@oDsN)iV}NI>T}gsM=K&PTi8!YL{hu z5L6*5`I6F~v4&)xv?{lVpdO5q)Kh{$AXy3+I2defWf;u$CyI5XzQZID{THIE?8srY zm1~HiR`3|1ep9ltnuU(PCs{$!I6hN$5no1J)dVCUJgig&tA_XqGPLKW4WA zw;@lK=Eg4n5R=eC)aXbGyO^=Edf&6_@xAipucA&LI@DRzk!ot2dQ|fcP@E65c=`IZ z4~OZs^z`}=EF8$gIM`L3s#HD$dF&zv%jF;NJqb=dHu=O7(^0%V!RrYVlKxV5g^Us? z-gJ^;nZ*^7k+2D9ZP>r&QlTkxnsylC9bgt^BSbSDSoD3Vg6=WKCYI%-^YD5Ch1+rymXwM*R&H*Xu?7T? zS!D1oRL|O+o3O4ocUwa>we7HxU(3r|hFNxHwCO(b`Q8Ht>_je~fx*mS8rzHtUjH`U z`IyO*L-Bc^XgqK6;_ie!@DzG*j-G?|B878`!`+~(sNc5j*rChqYPp{ZDWf%b7MFZy z(6A}9mvOvZD1OS-7uK6v;V=MCNxHVzO^~%z(m##gzIvrYaKp%;)?1gFvPrj5q&N>D z@B*|h6hVsC`A>+ESqzrcPEoLlwahS3=mr(lLSrlZ$tFaj%6*2CG&GJ+k2_J)0T;SV zLOh~^V(}X{_WXIC$veGt&UpPf9$)>?tXc%>d;O|vrmbxV9=nYZD1*-?KVH@*kV3ZQ zy-#JhJsa@bn=5=0hk0|a-n{9eSRA@H8uVbtV&o8E6rTFU1q7+Rf%C~&O;I(5$JK=& zn^Bf_<3_@_!4W(Vo<%J)7?ra7=%CMT_%1d2nI(gVg|;GtW|&1#`;q%}b$$?~Ba2sd zBU60c(3v;r=s41F<%M@2a?M%H6nrL_Y z<3OFdL&NsOSjWlZDr(qV8^Ns*$MRJ?IkaWOqcR)DBzd35r-+iXsotGkv_ z5jiQmgBBg3Hck`JjA6ZjnQ=pwg5gMkg|S9TE%Z1RJiK0PdJf?>?KCxt@)O!}ciR1A zQS{rj`oW?&*$iiACq&DPhF0bvlv%-$oFb55Rf$gy0!^TgH&cH$+HcFDL5a~l3)5S0 zktOJvBH33NWt$p^H{VQ(N3*nqBiw-!J3$s#4CkrOdISjp@Ms3HsRBrSDzi%i#_?vh z!8<7HL+-j3vu4hWWE!P`bI-=L1ufEG-EsU@wWsQht6u z9_0A8C7wH9yil^W0x+)N2zjDRzsqR-JT24GXI9X28xY9g3ZSZpKPDq+EfOrsLigK(KHF#ge|)Lfwq+&>rQs zo94$iC4aC1LveU%njN|qIq`tGq|=jbCGzaT^`?|7TnD_bxfMFRgA{g7=;1Fcu-1%D z3g*A13LZ!=);6oN4#I;!FPwEwt2#mKb07qEVu_n^92ph#Y1dF_vC@y)%&mL#l9yrW zzNDkLzT!eI4WSls`6H~6ymX_|BJd0|fTnZ(RE|NVZ-ZIeGON*8V zC{CdXUb*u=JH1Ckkjj}GdaxIFb}fbbpxxAjhaXlgK+r8&XB5up=3i45J-N6{yKkGu z8=LFb>gcF@@9y34cI$r*xjbuO?xRPK=Dz*oBIR}?xo%l*kie2nhyeT=Rk>MO2Y=4D zdYLmn7ZrtukHg>>g1qeXjqg49@m>4t=u84c&FC+JLBylZ^u3J0d8EU%~+$4o=^XlH48bg>7y^guXa;6b{PPe2T6c-Ag zaxewUDcQH34~MtC!mpCb?(B-Le@nC(F;L1ie7B^~N{mimXCvNUfk=Roe(=-&>=D~- zPv^I%1eWaFCA*1keE2aa<*nS1yb9!wO%<)~J!pTt1zbUAfO%<@OUUzBBS*JEiLH!r zd4MB)(Mr6mo64y0kc;QenM0DyS=$6``Np(IO9EzhiOqPAnMP21%iu!SFl%C`=!&+m zK)SamRe&!?q`r7DhYH_`SAMyFekKkB=7H=fRToO-oR9Bdh^Wb0sC4ApZWii&u;Xgd zo#MO-T2G>{3a{poz=z%7?qPe5o(ytdw{9$@Ps#MTb0d?p_K@vWvW)kkQIRAb)YCBr z?T9eRat~K_21P|3@8&(GO{DZa%)uhTWX3CA`6Ar2guo0dmzz~%E8K{_X)F9SckrSb zDq3W1(R1H|&IxtoM{?F5O|AO=!mI7%$H?{$BUzr~md_LdjH6emtXWPcvy|Vm}{3uaPm3I;$m;s|s=uQ&UpRv8?V$ zL87j)mDjP6F?&TFVWrQ<13Egu=2L#&I%V{8RpGt)+Q=L@L3OY&*n+IZARXz20Y}zW zXeKo!COUcxX#Oquxx+BsmW7Wfp&BTKl_jgf?vY4$i#92W*J+u=5qO*^7oWu;n>KCd zIT*hu+UMGPwQYT@fUb;{LY7!!#Pelr2MEs zh97+(UJ2s6z(o(<_!mxKqWuxh9pt8F`!2eg4Os4VMA9j?nshN=lk028yO@GUT%uf< z5s>{u5I&hKqL9g`o|o3VZQGMY3FV1QUv5nf+Q+debr{D(0o}K3V-bIlJ|8vC!y~?= zm|N==^+B}EFHp9q%atk&EM?~~JKgE$oW|gM+5oANW#LVV39-RD#<-YFoQmj;3R7x- z4jEtZP@}9De^nlfaPlaP>roe2prMj>`9Iop5UU%UC}Or7q;1+kz$NC6q(-MYIYf~R zk=9e@qo{liu)Z_;VH6}!0M;p$2YmXO+GS8NZr<8xd40G(B?zFSY#q9P!(T;j|A~UBA!AEvk`1c1Qv*auAH0T@b=wIHaKL5 za#PQw4=kbw%8S+*ATidq0tm!saT4+}4rZZiSviMReYns0|63UfS1X+~?1?!8*Q~z- z4?cY1OghA_uf1qbS6SQ*@{ebl=a$@$+zPg`-J^-6d^g=zqZ^*2T1*D#Gm<5;CgyuE; zx%-^?4PL)`b(r0ld$;A+)Kz=8GeVhNA7h<1&lw zC+Vzq?_YJL%lOI`LgkYN;hNCbidF6%?)R_L)cqi*-Pp#c)ujX z%LpK=V3}ZzSG*lkr^0ZC+`|l{{1&s&z(e6p4dqS$MMoPBT^0rppv6 zHc2N1Xsp}u(4domqmo6|?kUC}Olrw+P(TAYi#m@Ab{bp`poU_-zAzJ<9Tun@Whf9m zh?roGwz3k~hx{u^h9!cID%+mR=NKks1UV=gB1;pPQ6faeNwnL3j}0s@xrFMy#s^LX z9K$;xl5rRL;LlY}Ir(Uw{)I!27X21za0kmwpcoS2Wi3@a;+PTmyWlacq5wn-6N)AL zCW_@wcrBwV9B{et{#oSs{hs>nem^Vp@{;g?_onkxbH^Nfmod}mtYAx7`z?ur(Yby;6X(sP4qxN?K0i>G!H_Cwtt&h=RitsqL9+6vT-){^y0=gq6f*pSFPcpSC2SU($SAG!p1FoQ-mICEc*QZjiCn(`f5}vsu|wzc^c5qM*rPkq7iefCG#17y z5AFNDA#M&uyr zdsH*n0c&3`L&l_JBXj7*ZoZzAGxhjrEj(SZ@1tua9MSY?RzvS?jXssR3y0=E)k5U#Un=Rjq>{`I7S~6m6Q3qV3zT$xdcHrudq4%dk zO$yMKEwfST6oSpqj2S)prmG>72N?%wP?2(7Q%7$GqrsAQ&v_}eL34QEig zp8Ga~HGt{(k4O2TOM==NH{;Bky04qAuEAIK$^rCJ8I{{2P&t}eOpIGJC2H4jC?558 z?HVmxR=mV9etAJHnNi~ZbeK_6kP(_-CXyUEYhDba+ZlR+V)`tuEXXPwLJmB^Lgm5= z=R_~|fbcylf4XK5{)e(d1~<^h+;fnmFb+-8>;YnF^$c#s)^3PLPRSAvR2f}fKTjO} z&4ab-Kreo-QhlRS^VPTZn?jPz>Elqn`_&Ux^cd3@8GYZUju5Asr#Vsk`!qfud#+<99}7 z9aXz2mxN2%$0L{#8#ZZjw|^o;gdK2l6jjN6U~rX=%*Eh8*%I{3 z=AcDGpMypdT5Zvvd~6GAD{%JNohUfl%w$k|8;L-jGS`NWa5nk%!!gQx+&qj_{OJ=$>n$Tj4+m&Nh$fBiPthh~;x$@qkxU-dI8X7Ib+_v)20+W(zR%&B~ap*q7 zehC?0>7m}bOWkvyc|PltkBop!2K-ZuJkK(ofj5tZm9)ScDe4}cm@>A)gaUi^hu8FA z%i29SnHTRCYxIktZx~g5NOlIu3+L;V?$V!Ytp(R5=zXZ2^TVvH;?3QA{+jACxKs20 zr>Zvr%Q=7BxbN({tYarjDrE_gsDv6>B1(m9B?(cMlE}!Cy$z9)BotBIVYJv1g>2PS z){-ofh$Knx=Q982J>K^@j{ot@7;@jg-}ieh=XqY|)kg9T=loAn>P?J%zH8LrAeHS5+)yXk^f*_oZx1^ zxWhxB{w|4Lda2RNU!=|jkI{g{o>k!3gIgAeeRrohX1w{=e6Rd(QIFsC)z!5$to=HJ z1-!xh*V_y=PKe9f#q%cK-2vQ7zjtp60E{GB^A`kHSq0s@H&sC(3TZ!54%J@X%Yv}A z>@e#*VnrwmXQ#t^IAV$5R{LX3NhJlL965qI>Wkie_4RG(IbTx}R-l-coP{~&Sc-x^ zy|*=80FQYyJKI8j01k7P1DXs`+aUWNk+SUGxg1b$jHys6@3?oqF7Y7FqXvq zy>SCj;fkBg_y)3Y10N!Az{L-4iS^EvbtC?1RLa@RJOo!d^it{c@#hKLTP|^|ck@CO zR{^qui%As|FjJyrZGm7Key~2-0Vdu22>7srUo~YAQ($9xpXeX_NNbWHp*Z=R;%M=T zMW%EQU4L$X5~20&YW{*5FcUYoc+1gCnek+{sE5z)vemqLc5OGNq!p~U6o)*s%i*)f zOE0_S!=9ZxGe0{Sj}LO{G`xGi^?MDyf3Qw|z0=|*Rb_?!p*D+JsFfVzMv%Jwwr}4~ zk0rOZFGGv7GG4ZLl{Lm-T&E5l`Z19^WaPK6Eh2De){SXojNS*A880uDKWP}ozpgv* z*Dq?FK{?dz4$_6Vi2b* zvvJQ2y%evhi!Xn@clU?>%5D31JU_6`soA#4=5}^=2Xs^_;yDJ9;4+Axo~wa2Ao38# z4?u+}>W8>FEZXi!;eTWs@A)MuRpCQF#af_i$L^W+^!9~L9~Wh*@;%M=Io>Q<8DYb@ zGoc3STJbcu?-08HbYX2sToE}-xlX>?wc@!XwT{r`{E>PJ#5138)+%Bk)iUW4Tjj-_ zSK)BC%bV3{5AT*OvsZWbI>;EsPZ~xM-%t|@$MAObC}543Y`jw_gtNsE5>{NWFiCV& z?+wIB!^7j!*fd@aL_=n-7O=}WT6)xFv>vK$+x|tp&^7ciJFbGXtjs;b$2Xv0wA_pK zNH|6@G2Zb~AZ~g`A?#!AQ^a;nx@OWVE2I|;9tR*cFRI`?JgOj006Kko^)e2bQi)?a z-RlrSUWq%q=O*BHDdrnO;G30?K{$K^%=!oOiA} zr(hdbKN593>lBP>VPzRnd##yG#7GULt=pI7w@qSlaAD9Z%;U-M+65Z_kHQ7#?4n(5 zqi(uL{g7lTA|za0iuso>rmiUSrr0Q&|)uG`3)!sQP87t57fskLeZ)^W(fNVRiUNSvCRetjf2M%|o)J2xM6e$0pgM zLstt%ul(cN6&@4nvAc(dH)kMeJ8zG6dkbVs1kAB44}hzB{`Jwkw|ufgoTcW4-9~$; z!u(*B)VlSOVTb=nq6{*?gwT&7OeWwt>05X78Z%~Y=d7%(0kewYX!A(mpX6&XMJy9x zZo>>lv763OosgjfS=kD2Mq9|;cbRG-UwtVEH!xy71uKRh9XmE@>SzOl#twatUsg*P ze3!dVo4lF+U2AB-pk12on&ntWu~*{MXwKeN622_CM?N*9z?;FQ@+W1j#*bIDGdVtI z)!PSZJiZ6WB&%fU3OyB%^yWVi54_%zFI}H*haDkAs3-{5CS(wWf~&ikmm&xmB^JIu zL(FRFiYapHW4w&2C7rx3Ykj-Huqbd7-c8Y&>=r8O8e+JLL*L2Vq+y4iJ^D~7S*=_5 z?w^^A7syv3V;uOg%yo8Rii_)!x-yn95D8r}XxSGwh&f(vJoL*K$W6uw9rnhR*%Fj* zI)!_01GLkQ8&f_sZOw;{BH5v}udfhgICutjd2NyZ4pPXxi^lZh4fI@}@2=OdS@L-! z#;tZYRhvHWwzigg@vWAiM_mj;M^6~9s;cTE+i-yFxX>jom4TQd_;f1m4b2!ERzMZ*HLdu2PfYhJa&4j7oCkbGIJgp0!#=UO5WRo zlnh*NGYS^t-`WyNnfeNZR`uw_p*Z7Ge>6k0-)R4;o(?F3Ti!DC_;hS+L5H7GR{JB}QgJ<#mC+xirH5fGV|&bhR5tlwq6xc;b8 zQ20#cz4w>P#($$#cI15&p^!?>6Gg*qCL9D7*jUL&p-0yuQUEeQB=9 zzd)p$XW=?X#aPfQs_qK>o-OnjBkq8U4}c)e0+DQ4fWvgQ?JXRP0toDy%SooO%Qo+? z=IO_d?UrrGkjLq-2di0Ayq~j?NuUic{1~~9MPKsj7+G^PxZbc?Js3qP~HdNww04#qHM(Kj66-85HJBYbw( zzkX3>WitoG&^6q+aU(=EwZ!*9c6Rp5KRgY;-@cbYp&-xm@{gmA%-*;Lb{QWOy`#ym zA0GxGp3};Z73MI@3dt^FD#Ybpg#JaGy~)eXQ3FWlcI>Iw;!TtQHs|MWw!B(Iw6NOw zQpz21XeihO@Wsvy9Ux)O(St~{*6@6=KMP1)-x>3ZPxP_|bYgbu0r&;~4SHpCq01Do zVT7xvwF}w5{#Rh&jHC|Da1xS*cZ$xFlnPq)#DK@F{3b7UwV6g`(hLC&{Q6bqO;@YO;oDgI{bZXgcC+1>}Hx%Hnd;A3AW3gGvdon2;3)OTS)O;Hs%7sKB9-HGydwUU>_EuBbma=AkwSd)PtO#)cKRvWs0#p= zVwTi%!>7$-HxaZ&=7J`=9xp?-&tO1vjjt+tWF~VPai~_VT`R^J=Ry7Hg;hw}6L_e= zIs7#7_Fba1E3pp+peUjm)4<8|fXktwPOX^l+07C)SqV$KmHkK^#T_XBP2tQK<&-6` z;<73f5A%o2`E^bV*LOc@Y12DlWcrOc%@+4N4YS=>@t18m;>KRM-)qCN}7CyWs zQ}FGe?^LLPj>)7$%_^0gSlb!&4gHD8)<4iN#&Gx@^&^iSJxc1ig90u{k2);-k?Yzj zRYUJsA|w04G*B(H>s7o_#4&UcHzF3)IBuoxqw0z(sCFq?or326~H~}ko6 zIESNFhzMx%hoPSSU)|U);&HZ6`SDgGcs>fB)`s5|6u}!^KBrEBTxDP$ z+vg!nMuEcbJfs?MM^>-D&x_l~)C8ba&DN}b^WKoNM-r5~W(-^ZbxG9m5@?f_%>tN_ z`8W9BIOxMJpdr(LG;i5*xCh*h+VJ6(mrJ9;XoxB(jyg-#EEj3Q{O69GnBf}J+~FY| zZ?Rk3~Ch_}()?=CA5-8P08P*obJ1a)r9zt(l32FA|&u9@tf6$D>}^E=-)x~con1CtND7o zzcaS6e;f{GU!HrFPv;7l8LlPD)3XZKNpZ;w+KN_QgiC8T{ySDzS2r;>sBY`E`7fCb zjvc&e;{Ry@UXwnl`?nB)MMDDb51@XM3XscM8j(@M{=@S&+M!*gyOA`jRo*f=0U=>dzZ_e@fzPBUcCW2|ZHgZlN{J0P z7|DmG9E)G_Q1+CKGc|2QdnSw!AJY(sUY2@ujtC3Q0h%9f9EjEGbBkcmwiPm52KDh~da^tvj_;CF6b2y9kdkmQA2^tDJ&4YlB&%LYW0!hP6 z@VGSR1wFw@VKJARMFxRF@MkQ`FlnOZW~T1jdtQuHOhHzd0dIR;I^eljx5 zX18I7HQ)a;MJAgZn?ae1_cHvCBYCml%nBY+r@`|Tpilt8TY%DZ0h_o7m?KmBjY?+P znr&Sj6Y?hm=26PZl5%FUg7`RX+qXZFUXMoj@&+TdpV54Wc+6?}8F&biOdN^cW6^D$jAaT8k!4JQhw|YVTcX z#l+p|+POB-Q@itX$wU3gQ3%$UdhCocbTZ<^usBf>ju?N}Y2ws-KBC32bDNsAYGqC7p#_DK z;bxHCMbm(Y73#2c+K$GYJ9^c>c%MrKjNtd+_|$9mLwB{CwbYDTkQhv(2EodED)j)t zt`(Dr*$(l?c_$V34a%Rc%Zg^Oh*z5Y_0c5#bAQ*z=waFbgQ2YB0+eU2z6+Xv@r^k& zS)J=Rk=Ya&2BB}sy}jJMHqdNdMyT6p%VrMBbbO-c7;RxJhi56SUWe{2mZe}oD$2XJ zL=l{m`#IaNW;fp}^6|UxFSoSjPt;qV5(aiJfSe*E=3RM8RSzsJo&>Z};%JR#MG;bZ zu%_}u1~jb7DYhK&pumGS1A_dP$4LPVo&&16n8iYNvq4nfK8|k955*a(Tf*SxYQDGo zwlndM;{~Yx@ka*O>NNA|3^ZbTdXG-W^Ig`(4F1;5a`E@zgIge z&QA7YYfEl<)Is|q5PBX(S7rqE+f}ZG zNqZoUi{8Hd6VM>ZD2dww7imKKGA5Ku=8&k`}3buF8v&$3vlXIA)Wj=JH{*`{@xE?K9p&7X#o*Zpt5Qj&ImWZ7Vi z!TtGzPm!2xmlyx!G|uEWEAwC)XPIk?mc5|{pTO~g%}j>MIvk^A_g}ODQHxcQPNc0p z>uQ((q;*rGgfIEaz(O_%m6jtZwk5$qnmzAnaBbM{m=TME;Bze=}zo(PWwYOl(he{+|`v6y+%P%@V-ZtX7$Bp-gVHr7ojU858+wJG~(ELw~3xg>b3<|y7 zj&xYdsU>$jIrHy04x;GN_J$R36WM#7mVNR_&;YJ!026Jm|LO12b$0IBi0wH*_~7=R;}(7W z^hpeQ+G|YnA@4st?5v0c6{?%310FXF*LTMyqzHQ8gm$=lbj8(al;WhVa^Kg;g20BK{M*ko^k zQ;@YSl=atu<=u`x$b9}hOw1MEzt7~#in+=%y+8=Z;!d_sKYww@ru+mfFn;r5D}_r5 zaYOk&GVcSeu8LHItekrlR{SiR=;KlKY#rTG3lWmYoan0IGn%N~j8to9qSoUWvLJ+- zp$tULp5*bV@6Pc?&A~int1PAE?LX3ECp>psyY?jNh>;^lp2s$_MWgy4Ms|9WSGgiX z+3@ykASQ5hp%0)MDc8(Ef5cdf_QetGc-hlS{!B;O%pD5Ayli4TqZd$Pr2spa0|fD@ zrZM{1h$y$9cCRB7U?`_ceKX1Mb9}7b&rOQ0n)E_S*yF8a8a`oSrl(NaGq&0;1_8 zP_&$RdRLdNcf!rgHMt4V%d2AW#;3j9*u$*yHJYW(qSP%as+i+?)*j-SM_cd#07ObH z(T6&OeVLu?aUo|oU2Oz39;tpmU4aUYoqb{Q63asLs|htDR~0p&{XR*d2)ML`p4X56 zHT9umb~w_)ee`U%up>9QikT{4eaXpxa=33f?;=H|007sF3CIhZ0Hy@ZK`j%8hDkRKuJ^zPFfssazkuU*CDyk$e0{=Q55IUCB{Gfb(*$ zb*C1M%0xOM{tm=vC%Uj?k^&4$8)i0vWTv15Nl3p)rv+I#e@z{&JB0)u8rN^#QlI@! zBIFjRB~dAJx`%Yx0}_4!+^60&DvQbL?e1RXPgx6*G z(ofv9g#RjRc6>=pLnqS?XLB2yLkF~5=w3XOT9G+`67KB1WqR(+7L~2ZwYFCCRn0Fc z-!!4==R?nqb`p>G_%&toDhM~<@|pV*F^YD_NqYyhsS{BM1s5gaP>U%oZ!;WGx~9p# zXV3f=kn#`ay?SkcDWVWfRU2MVs!`^=`Tm?sAxa~w*{fHtPTHui#025ly5U16K_R|- zc7@XC*_7zV4^zFpXf(r%YxHx{x-p)U^C5I0lF;~^51SUdtpNW|a*4Mdn1HOPq+6n@ zNs|H8@Y!d1$s*Cy8FKfrsb)GPYBk#+5|e0BmZqlw+~1dUTSbL|X3j@%)zBmNq}$~c z)tg4en>rP}x0w(5(hzKIhAI3Osb^RB(fdQ>K(qO7#K34ZP!oNA5Lf+;|3jbdV)v;3v+e@a?_aCrGTy zxBlba;-Sb8_}ts+LF#`3W|WbOv*mnSF&x-mz3(R%z2u)kYHFM5odW&+$IhSsGOfnc zs39?T0;j=h;UTjHG-_`4vzpLUJgqp_;J9k`UZTn`zdugCh@-4VHrwj7w5;em#2HMUL`QLLu zwA9s2JMS@Vs6qWv^7{3O4hNsJ>Qj8=sSAQ1y<44$ung^ijaM4KV6GVjKzKr#0(2_> z4Be#EA2mvA%e7 zN4Vrp2H1%qT+xUOVr)wd9~gHlCWT7yqeKq!g#0~|iS1xMI%#AYx!wvx&glTp`G$Gu zBiZKOKPEdpH`ki~{3n~eG@^po+?Z- zxAtjM({6M%6A^3kIOkIti`E&gL$q-)5KPW2L`Xny!ARFs+ym)Rq#}@WMH+YZ>w0(b zQ2x{+Nce)3b!7z;7$7j$M9+m1!G(zqZiBJ;!UTwTK*xAlN5l(!(jRa$)PB--Eon{J<|j$ zWuO+yNpRM=qCXA~=YKKz%hdJtJ418vHDt%j;)D>sF*Dn)IkNyE2w*PhO3pX?zZB3< z+aNM_p{tTv5ekt?*VKF2%1txkjXAZdt$}t-MsJmlb^LhWZ-4XE378$J-D!?)lBYM{ z)!9woYL^DTdjT$6ronkKqmJ(7H`we+;ZlK`oh@KqHxr+Q9eekJ*67N*>)YA~#;kmK zbyH;v5DgX;3@*$c1vItWv=2Xzks~Xw12xmloo!p{bZpMMSJ%{R>H|0>=EG;pse{C* zmHt0-Narb=>opwQWe?3Be0SuO@#PXyilG*iOLy(uxsW+nj7_V@te$JcH!|7Lf5PwY z1h0n%DaXFBuy82Y9(&C!u)zdy`n$Z6;>h!@gElQa6*wLfGB=!iKxtQXO3H1_H69k-4ZY@VR6!KYvfhT-kfVU@gE2wp zTqN#}Uib0o0`heJt$gS$kg@rc<5kb>)*IP|54Caa(}6n5_qJ=_tW&BM5r~-2Q+3Gh zH!3AkMRP7O?wNaG7`~v|OaRrQm&f7xv1L9FFNCZis!H?%3ooqv^l~hiQq-QgfL}Ga z^Rz8bG?Ax3PRCJ7lw)MfxY6+yt!V%|P;O`CuFwsUMJ)uCi%VUk-k$4Wl&FvagP8Vf=zNGktq+z@N#l+5bunYh;ymfzXNTZRWF1ezk6Y0p%I(? zhAw@g0XaN{TZ_-fv$QauUCDB<@K^E5u7Z(TU^Qc!L%fYP`jRn)gG{JH%_%m%Xq@r7 z0>*!6?O?@fz~xUtplqJiph!k4 zW!DUuMvf)$vE2*q;%QRcaE1(ZQe*E%)-5X}sYsNr7c@0`2D#9Z-ZgRk$t!7Ke#e3= zmtvb?T?V72HE`fmevDS(aGXYF0iYy)F%dARmq#^`-3cVZDpxp z1UL713T?>+wgV?FF*_=Q2t$_4WMwv0B&UbXJttm|47wxRK5Ir+VrRCKLic^Re zM*HccO`0-A`NK2&2eo8SvlcC8QmiiJ(0O)0$+Mu&%3)C1(ZwZ3(15&GPXir(_v4@v zJECU-c|qE#(TPSrJatqpQK^)K{u2cvH&m+O5M4)+2a#S4_uDGG2%0hG?FooS9unIe~DLHUwr2u*2H+}s|0q{n)f7uORsF@4Ff3gkNpi1-O#&^kFw2cqc=Lb@}5SeJL~ z_;XFE>?juZvy*ny-U+x2SIki_rZQm-j_etd(@d)Hd${EFmGacAq%QMaU9%|z-@QmP zLcyvwYSdx09dx_$N9isa9s_=`yUXxGZrfKp1ojqLkU!|I9-d2C`RcE4)sT`;^tI6RocZL*##Ux6vfx-1j#}Tw@FHNXe#BlTlm( zY|)n1hSJg6Xdf88Q};3Dl-RhDR7mY_oV87w_|IBx{>xSU=BA_#)ox&ha!>Lp8SS_C zX|Uh+xQwu3lHp6WQnF^`<+Uut;Y(EW=BlZxzAWqd0^1#>n;KB5-NNI%8xE@vup{to z%G#6GKf|FeA9FIwDgib4A(-4RI|g#ih@w0py7l+dH1y{fnolHG>7L+iEfG`Lsx z!pl9WD7SBK%<+cMv#E_Ip#2(yYT2@;5R4c3!<^aPS$5rV!ce0+g>o6P@u!D^=I}ed;Lv*-+{DJmC~|SH5y{s6 z!-q2&Tq3O%B!o;>|3Oql!Hq4$>9%~RsfV0`Ca!x5*@}g0PvCwv6 zJElK1N;hv+%??X`c0ucAg4&?_s?9$4a@+PPt!axEPwuBp2^~2d$@pn*#Aza=#;)|^ zL6%w!5gOG0Kpjio>u`)i`Gk~{Bfg@#y}uin{FET2W6Z zwj};?FzU8|w z&IMVXfrTl!#68T)eFHSg*NS|$4k&xyx9!>oU$=-*Em{>Y)Rzl!vp!>80oXfHp_svW zCLCQp(;URTrD%>g8?fkzTaE&tG3S&8v^0eQ09f(`sE_efaYGL()9egcaD8R<-j-|g zgO9r7NdZWtU=@@px`{;X%hW+O+8xDEij9MlK`s#WET&bbcm?PhNkDKW&+ZSIu#U10 zfn;YNE*OTwqdB{P#!h4sR7X-~h%6F0~X;N-NAIVClrV8(EL%sZwfzpHnF=<+iL4c!G);kW{+6Q2GywcJja5Lk7}TUL9Hfw%>~t@h9jJG7pRTq@Hl*r@nXMi{E}FE zN}B)(+2eiZUI}x|Rs=SLx7tkyT6pFx;Er|WSZsj)gtu(kq{)M%qEw_}d|k37ac2V~ z{jI%oAK$vQO>hso{-q@o#3C}M6W`Nm>*OX|1r(K}ixMT86IT^_NQFPnX&VP8nCQOQ zTvMuQ+CT1lUtAmLNdR4XYHjnPNKb+up^c+$?j^IL(ElE%yc}%L&sULgM(Rry-Tr=H z;00s2s1{(=D^puPJgHFh{55g>*qLkBZhU*eY)_ZUe-aWPA-nm2Ad06Wt8q*SkUid~ zst5W(+uJCofPRCX8a=Yvs@glQBs}m3?`OOr)ce5?IXbksWofmwwG1oNqxfIE+;&4J zTfeyjH!^F*ux z7bjGQ71weY8AaF%-xl+Yj$j4>PeJ6Dc}nQ$Qp%LvQ$|>hs zMh27}#QefCbwl+W?^d=fC7ep_<+pQZy_fK9$LSEOQcjZjxQ?Yue^QZ@{Vb7jUga|# z)DDH#PqY!UnQ3mdk1M6N=?7{?onNBW==T@(oz}!Z4m(pnu7oUbBmY5&Y(3C^+>VTX zkZ&~f&T%Z}%0^>!*18F}M>XF^X^6m0oq0X4xd1jg5n23w9N1pHdP$U+PLT{B(NL64 z@^yfoQp*P!aM1WYx2->X4fk98d{dn_e;21Zbd1*l?!Xf7DeCR0)sy~yP8UO6_!zUx zAWM-;phjSXbuwgU;zk<4f`k`Gcb9~7&*?9cmNswI>Wvgc5cdQ$VaFjjBKnCbV(U>y zr%u}Ng@BJDOZJO;mITj=y(R7lXWQQEtFA6%_%Vk1%O|B=fkIv+y*F{k;lshaKDUdk5S8LsmUl7C2Uc|IZD6VHMU&`4Y+m(d9V$t5vw%5a3JfTC~xkXpK z7F6d`HiCeqlQxB1GL7_ylWW(dOXj3ODJRkwQn5jLAWpdA`d3F(AhZd*6{Zvd2*_<& zuRS%o50x&v9q@!3^q0MttG?a!IkViUNuxa_b6_O&CxC> zK1yonh?!Ta_?{XwPd&I%YuuDz5j|sHjl)IN?9Fmgu!cn<8B%t!%3>D)BrivnBAv26 z+l4Tk`C-4JlhMY}RDajf)3?HjR&Wj4sHz$h2EU9-+z^KshwN*mrN$d9F}YR$JR}}6 zKmxqYT=AIIwp*gDDC9v!ih0d+@Y@a@Iy5JI)`n0*gDGP;_-i?^=>$gcFK$BV8k_76 z|KCy<50K#GRuh|iZsC7I*Q80WFO%=_Y!#weMCK`YxAY}?N5G;Si3~tbp_Ia(F&Pl2 zC=5!JdJ2XYWFZIy1eaeXsC?*W<*d}76_a!hFd!kLTmTJ` z%Uh>-*XR+17g7em$uZM$7n)wFvtA|*SU*FEq{|knPXVQ&P6HK1JrC4&YhTZ7N=y}5 zrNh7i$eW>n|9sqOsDV?f-*n|5G;#>*9AlsIqxjeNt>?`b2ZZx_LxhYW+kRc|om3V= zd=Fb80u+U8t9f(if%qYb^DA?G0Masfw(x>To5B4}sbm3z5qJ1dBYy!hkdMpN^tqcb ziWa(vnuq79B|}3|?P*1vAhHF6plB7ZQ0Skl6y|u?We;ihlCTDS_y;m5F?gX}aEVK~ z#S!;-we=5yv!y|KiPW3g-5(`xlWuH`q0_5-F#N8s2a~6jqOE#K<>T3XXE1S_u(yRjK*RVj(?W1(z1y8l)EX%G z`5Aaui(4P?j|Wol&H}G{4itL_@f_vZoYet0Brl5Yfgl6Av;o2}bmXePIOC7;I_%}1 z^_Y+G4hhhwO)+Y=&L35vKC`*t%7h6b93z+;zd5rYH{`f*Rrn=_hK5Sx&E4(auisYw zpF7K!M014#Pg#Q;{|G1H5wAkJZaNsByMI09Ry+(F!omz@EI7D{CQqu@ zerpVP!f%4jzWP3e+U<)pvLdpPfN67~sJ>BiwH``7gbG7dhcf&fW+5?4ZZ(#=a8d68 zz9u`iQ%&zevPSqnfj}4eT{osFME4LAR8#jF#W(_&Z==YFGEzg0f)q`~;oL1cCczR* zZ4CZR)4cZ-yYKhLA$;v$N(zk!L?=2FMnF2Chl|gtS)5>d5%2!X=q>~Y7Y=nf+*heDsp5AQKFUsucbHt?$-#RtkB z?`%Wp7{1&p7ANAdew)0@Fj2s_U+8~$Dkx>U`p^SCig%nuHMVg0eO`MtGC#p@K#A|^ zoxUs7|JjehQA8FTMs1Wl<<0Oy;|xbLMnY@FUp-S?zc0*Cp1xh4C!dv^1Sa?ObUOMQnX08bd6+ z9e+jK+Pib7gao^1*R(;p{w+{8k7^HTAO;6s<%B92-&d)HkG857T|VxsT9=P)U7W&- zE0Nr)WZtBS6Q`r1n(6aRbSyL`1Ij8PXA*yP+%;iOcZ1wBb!xpsS)&F_3l?3+#jQwDQdD%D1p>k83#Wt0%<_r9cySg09jzS`hlxo{g2hN@ zY}~S^;T$icn3mJ1gmQ~gdE94aMDP9foHQlvu`-XyG>Z=qtZi#~B?B9~@P9`Xw~?pb z;TZE-0eKOlgNTt@#@@(LGaYn6Vp=;Q8k8oNBWCV$#As70FL!Q|Q6IvYe61M>%`+EX zI7QM~T27SIY8_tmkklG4;=Fn@McVLuXvpM(a8F~aGczY*Y%^?DaihkKV}QS{=pd~i zR1x^ZKJN)Nskee=&kDDKzc*CJgZ7b4PC$_`Bpm z3>TM{Mh9OM9X!7SbcGsT#yF`QsC?U{*jw=1`4SQ2W&{k_7pRC6D#m&o#6ui=0yJRV zgp;JMQ4|T^-#VSzjEQE{PWi%qgN zn#xE8-{c&Sj1R}j@X-ZPt`P3U22iPeecctNb9#DzZ39TYkPbQ#eILE1C^5*GrU3Tt z-Kq%FlIF0vrE2cp%iVE^tSqMQI)BDxJvcd~{REVq%vThV22b#>OmqxEub6*8+gH_d zOrH)#wx6_PRd+gNKTb8FfHe!|D?>?VGHM}+2QsqvR4g1`xB&SDpNenatQiDK{G00i z(bBD-z=)=S&R95XT}fS$$xOYI9=!@g^EjffaReb7@;gAC!)uMWb={+dmuAQ&W)jjA}14MC@huK`C=QsGewN^6y`U zE0ENOxD+AZR$E6K7=oDKaA70}G2`R%pnk7$`#^cOTkW~aoWTrCb3{}G!V{`vO8((r ze8EzvI#1FIL2Y&LfsFjbp&rUyDg_r7CPT$_RVGeF6G$$;wYPf~XmHc3NPvDG&v>`0zuRv~u-B0wZHRn4oMT)`bXM z?tGTTC_~&Zz~=Y zaI$5r8+R3HS2-lY!9T6Cwf8LPAb39IFLuaLzzP~s($-O1_Z~gEn~yYa7Yg)7vafBi(C6nvEfB(Luj1G#Swqrr-wKm@3ZLJEBu8^-m z@UU2ZeIHz+NNyEDmK*`YCzVo7XKkd8~Vl&1KYrYgnc+nFykc1K1t?TpSQw zs!9_VFUm`(l;gxBKJRo~HI}zsH;9{1M2DeZai9;a(U?!qq5Z|u+Gow$SK1saFeaS= z<&jB@4U#2UtN5S*kasFbBV&Kp>&MAdH$#XjpgyIT$lSIL7pnzg=S%+#9bZ+8K2k0D z-abg3)YDcsAbDk#-ox1C;dR;({_KjrHXo_JW1+R(i9h|9rN0BNHRdc3nWI4`<^X?g zZg>64o=!uqpJ|bm!gJdrI>e(>&2Zs3m*ix~=COSs!q$JiS-}g1r{2cQqcrg`RTvz) z58sI503KKn_edx<>Efv-WbAorbR_+JA|!f7gVFLV{r~qY^X$FKPS5FnH-1&IDP>Dz z2lWM=v5f{>GJexw6#`oM6bx-C#229P;wz)^AY7}*lzgC_jv-A5_qu1N$Im9Z#?u7t zpqBkak-N0r14{3BFmYNk=VyOcriC4H>X%y`O?rHN=w~{bLxDJbNHUKgyJO<$@DwXC zxhtDfV#LB6=ONjoP7qLZ!r2^hr6H670)@}>#sm^zT^xwF5G_CWtHO5r_T-{OBVx@j z@ZPXN+%_rOZ!FXMLb7{IhYwZoCpe&>%|xmzYZ(Qzb2~(ClN%(H?pOI3Xub~Td|&6< zkSSXyfLZJEBa_uxmYPW$=X2M6k8Pn2AjvK$9|e*5x8{ic0+>@prp5(CG&WYy7~M%S zxrEVOIM{Pr0ZPlukE9ZlW?(RCGRaASJ@nhVls_s>U*Jw^^ z!Rt{&hWMlZRiHK)M~jHKte$RQ8DYXH%XjGoo53NI+iP0-(pJ=@R<)xkIV!^9CjNsw zJw3-%oZY!^9E_tTGF8qJUL75yf;z6F-U8(4$}5!=k1j?fq_c7B?xV(2HYr~Zh3^H| zQE=MHJ3GJeFmkDzKfy}MK7jeUA%}oG_Frz>xm&l;vnPDP-l%RCb23C{NCCMdFq=4W zft3pIbD3xe5+^>Su9J1IGIFgV;4vWV#J!)#{0Tmd)=wPQnH#Fsa!qsySSk z1y^g)!U4Fa_2j<5Li*6z9h+YzCA`C8pFL5>;OLO)(P-0G12p;ZdW1rf{eI?RRI9Mx z@Ogqx4|-GkcTXN~FdnyK!$SB)(G>$4#c!(nmE6j#i9#qZV8G7I;GuBM`moZC#?Tpz zX*c5Rt#rt5U=vZbSdbY;!nslI<;QO^oXCd{9kr$zWf(AA;_?H%XApkr$Y;jd_#=E( z88j#^xz)SP5DN@ofXXdR(&lzUxC8D5e3SX((0s)vX9G8 z%%590%^`Oc(W^HnxEMmmOG|wVm-W&euuZk`sqxV23OJ6?MIAGLW)>D6Ar-Xk-o5rg zKlL8{$c5ZrGhlkgn5TxN`}dSl5+Jv>UAmkJ&f#N}9t{Pz03>yAEJ&tbnK5haalHCG z?J|!MEWligi;G3KjYjicf=xvvkHK(w;eI-miK5;lFP!E@Tdc|VOMXP<_g~LBWBh;L z?I6R+p-xVpB@LGThu^=RB!qdREoyN$Q2eQdIg12k$SC+oRtTBdZ&wQ&!W?3+e*OBz z-SAjOt92+(O>{xoE%nD~-0ZXZ*H2IG?x~dLNJ1c5dEJ_=Bim*l=DN?I2jJ+fezB1p z?rqX$jGc7tA5?$;?b~1vJQ~nF{>k*+<@J?XG*_A5Hd@c-Ul~|_Nv%rx&zQ-|?9aUt zeBu)lzIfLlEG2EyqGoPd-w0tCxdma4mV$1J%NKa~@Y0;@tgKzE=LoVSb+WB~b@ulj z{Sg%*HjYm}c#uC$P0>$N^Ie!X^#{v{`pbCaGcg#v{2t`PjBHl-I3+9*$O-?MgUPMN z35GK8w(qnZX2;+b@z&jkUg|??txW#VFG*7ivRV~uWzA}8Dk2oFQH1fTf2$r%8WfTD z;WUz22-lw$*_cquHrZ-6s;G$XGbEzyB(SbsU-j`G32(aj5U4P5(*~jW^*E(&4{z5E zyyO>uqW{KnuhWpfv_O~2^%iitu`40<-EQZ1=f;gK=xxUMdyUa*{lmSlJYX}k=&+>T z7QbI9rI(&iDrr9}c0JkMt{(9Tyc7phc3C!{UcU2TKQB~uqE;UX*uODDwVQ!`eiw!O z0AG)(|2x}li7x;5`u|Izv#@&&`~UrtoT8iV=D$fWK1h?#q488~|NfIKx@_Ou;*5vS zF$I7002t1E6b7*Xkirr*`VB{ zy`qA0&MSQ~NJB%+TgYYA0PxeyvDd_^ZM1OZTnIGBFRCtsC})AV{Ym(J_-=JonE@-6 zjH3ko$0KH5-sQiq>k3PKA$3X#E~V8Qi0ChZeTFD4`uBRf?C z)uL#B_3>jXbm;Xc0`0=&9{v-0oSW2H9)R$RSu9whWLu714Jf`o9xYadMvil@ zU{lA4#AL3ZvWk9(S(BHbpCwEmE##4b&l>*xG!A7%&+oOQwWk52gz2mZ20VUMUe0Ql zmPA>8m$(I#EsKEKM5~C1+g6FJpgvtVU?2*yKL3dm$snK4{K5*NwRzg}8bU9jWpfJ51dWufBtbC%?w$;@4PfHDaXKH*K*o$;&%P7rkWp zIwK*hxMiqxY|c)t2Pk+1%*SR*Um30jQ2&^pL^UGPR^qvv@<-!O&(^(QI$Tqb$CzKd zf|Ka03&wZq)u+!EE;eIlM~jD3(G(wD_goF@nnI;5(r@|GVhnPw=u#n~^3PROn_eeQzj1?Z*BNzuV;dOlmWp^}2pd_4n^DkvX4jaEl=@qQ9V%^c3>c z_;ZUuIIt+$LwaARcjW9X*%=8!QsA4Nn|pvVz#SyNtOu`@Esg^VYj<@Ru#E)`D1c;q z)-El!h9hK{;R1ui2ESs!YwH2F3I=UXK)zbXIJI7CfP9#uhnw!ywcMVEA>*N(^lYm- zXjya;rX*YUbbxd#^WGI&ysA> z?RVub(OxxM^A6atqy+hADu)02=QdI85kAv~l33+G@;k!*FxTV=%G4@7H=@7)_t!h_ kYKSzN4pblEeO>Fx`MdK+4Gzpv@P890OdWsDWd2|O52WMKJpcdz literal 0 HcmV?d00001 diff --git a/static/ox-hugo/hatch00_modal_matrix.png b/static/ox-hugo/hatch00_modal_matrix.png new file mode 100644 index 0000000000000000000000000000000000000000..50ba3c125e5a4bd457c685796b45b9109b4843d3 GIT binary patch literal 14662 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 bHb_4?>F(TU4hqKek)%^6waM8^=WqTu&vcD2 literal 0 HcmV?d00001 diff --git a/static/ox-hugo/hatch00_model_reduction_chart.png b/static/ox-hugo/hatch00_model_reduction_chart.png new file mode 100644 index 0000000000000000000000000000000000000000..13edc5f5a890b967ac57ae711f373f7d3684ced7 GIT binary patch literal 116908 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 RS**f8_TwhnB#fE2@xO2;a2fyr literal 0 HcmV?d00001 diff --git a/static/ox-hugo/hatch00_disk_drive_mimo_schematic.png b/static/ox-hugo/hatch00_disk_drive_mimo_schematic.png new file mode 100644 index 0000000000000000000000000000000000000000..c8a6d2a9fdd84d4434e099a641211d038eb0af13 GIT binary patch literal 123954 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%0DYNW5M&$SeAnfg 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 VIKNnUOyPfa!^hejwwkv3{{X$nIurl^ literal 0 HcmV?d00001 diff --git a/static/ox-hugo/hatch00_disk_drive_nodes_reduced_model.png b/static/ox-hugo/hatch00_disk_drive_nodes_reduced_model.png new file mode 100644 index 0000000000000000000000000000000000000000..17b25ae1b1356298588c85cedc71bb63d5d80955 GIT binary patch literal 96345 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 literal 0 HcmV?d00001 diff --git a/static/ox-hugo/hatch00_disk_drive_siso_model.png b/static/ox-hugo/hatch00_disk_drive_siso_model.png new file mode 100644 index 0000000000000000000000000000000000000000..c9cd0618672dca240d28f7e53c308c46821c553a GIT binary patch literal 118750 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º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