diff --git a/docs/bibliography.html b/docs/bibliography.html index 7d84a44..cf434e8 100644 --- a/docs/bibliography.html +++ b/docs/bibliography.html @@ -1,229 +1,19 @@ - - + - Stewart Platform - Bibliography - -
@@ -245,6 +35,20 @@
+

+Things to add: +

+

1 Books

@@ -265,22 +69,22 @@ -merlet06_paral_robot +(Merlet 2006)   -taghirad13_paral +(Taghirad 2013) X -preumont18_vibrat_contr_activ_struc_fourt_edition +(Preumont 2018)   -arakelian18_dynam_decoup_robot_manip +(Arakelian 2018)   @@ -307,22 +111,22 @@ -li01_simul_fault_vibrat_isolat_point +(Li 2001) X -hanieh03_activ_stewar +(Hanieh 2003) X -vivas04_contr +(Vivas 2004)   -deng17_integ_dof_loren_actuat_gravit +(Deng 2017)   @@ -349,27 +153,27 @@ -dasgupta00_stewar_platf_manip +(Dasgupta and Mruthyunjaya 2000) X -merlet02_still +(Merlet 2002)   -patel12_paral_manip_applic_survey +(Patel and George 2012)   -buzurovic12_advan_contr_method_paral_robot_system +(Buzurovic 2012)   -furqan17_studies_stewar_platf_manip +(Furqan, Suhaib, and Ahmad 2017) X @@ -396,57 +200,57 @@ -liu01_dof +(Liu et al. 2001)   -tsai03_desig_isotr_paral_manip_using_isotr_gener +(Tsai and Huang 2003)   -yang04_kinem_desig_six_dof_paral +(Yang et al. 2004)   -anderson06_precis +(Anderson et al. 2006)   -pernkopf06_works_analy_stewar_gough_type_paral_manip +(Pernkopf and Husty 2006) Reachable Workspace -mukherjee07_dynam_stabil_index_vibrat_analy +(Mukherjee, Dasgupta, and Mallik 2007)   -jiang09_deter_maxim_singul_free_orien +(Jiang and Gosselin 2009a) Determination of the max. singularity free workspace -jiang09_evaluat_repres_theor_orien_works +(Jiang and Gosselin 2009b) Orientation Workspace -jin09_kinem_desig_famil_partial_decoup_paral_manip +(Jin, Chen, and Yang 2009)   -legnani12_new_isotr_decoup_paral_manip +(Legnani et al. 2012)   -li18_optim_desig_six_axis_vibrat +(Li et al. 2018)   @@ -500,7 +304,7 @@ -cleary91_protot_paral_manip +(Cleary and Arai 1991) 1 X   @@ -514,7 +318,7 @@ -geng93_six_degree_of_freed_activ, geng94_six_degree_of_freed_activ +(Geng and Haynes 1993), (Geng and Haynes 1994) 1 X Vibration Isolation @@ -528,7 +332,7 @@ -geng95_intel_contr_system_multip_degree +(Geng et al. 1995)   X Vibration Isolation @@ -542,7 +346,7 @@ -spanos95_soft_activ_vibrat_isolat +(Spanos, Rahman, and Blackwood 1995)   X Vibration Isolation (Space) @@ -556,7 +360,7 @@ -thayer98_stewar, thayer02_six_axis_vibrat_isolat_system +(Thayer and Vagners 1998), (Thayer et al. 2002)   X   @@ -570,7 +374,7 @@ -obrien98_lesson +(O’Brien et al. 1998)       @@ -584,7 +388,7 @@ -mcinroy99_precis_fault_toler_point_using_stewar_platf +(McInroy, O’Brien, and Neat 1999)       @@ -598,7 +402,7 @@ -mcinroy99_dynam +(McInroy 1999)       @@ -612,7 +416,7 @@ -mcinroy00_desig_contr_flexur_joint_hexap +(McInroy and Hamann 2000)       @@ -626,7 +430,7 @@ -kim00_robus_track_contr_desig_dof_paral_manip +(Kim, Kang, and Lee 2000)       @@ -640,7 +444,7 @@ -chen00_ident +(Chen and McInroy 2000)       @@ -654,7 +458,7 @@ -li01_simul_vibrat_isolat_point_contr +(Li, Hamann, and McInroy 2001)       @@ -668,7 +472,7 @@ -selig01_theor_stewar +(Selig and Ding 2001)       @@ -682,7 +486,7 @@ -bonev01_new_approac_to_orien_works +(Bonev and Ryu 2001)       @@ -696,7 +500,7 @@ -gao02_new_kinem_struc_paral_manip_desig +(Gao et al. 2002)       @@ -710,7 +514,7 @@ -chai02_pract_calib_proces_using_partial +(Chai, Young, and Tuersley 2002)       @@ -724,7 +528,7 @@ -mcinroy02_model_desig_flexur_joint_stewar +(McInroy 2002)       @@ -738,7 +542,7 @@ -abu02_stiff_soft_stewar_platf_activ +(Abu Hanieh, Horodinca, and Preumont 2002)       @@ -752,7 +556,7 @@ -jafari03_orthog_gough_stewar_platf_microm +(Jafari and McInroy 2003)       @@ -766,7 +570,7 @@ -chen03_payload_point_activ_vibrat_isolat +(Chen, Bishop, and Agrawal 2003)       @@ -780,7 +584,7 @@ -lee03_posit_contr_stewar_platf_using +(Lee et al. 2003)       @@ -794,7 +598,7 @@ -wang03_kinem_dynam_degree_of_freed +(Wang et al. 2003)       @@ -808,7 +612,7 @@ -lin03_adapt_sinus_distur_cancel_precis +(Lin and McInroy 2003)       @@ -822,7 +626,7 @@ -agrawal04_algor_activ_vibrat_isolat_spacec +(Agrawal and Chen 2004)       @@ -836,7 +640,7 @@ -cheng04_multi_body_system_model_gough, gexue04_vibrat_contr_with_stewar_paral_mechan +(Cheng, Ren, and Dai 2004), (Gexue et al. 2004)     Vibration Isolation @@ -850,7 +654,7 @@ -hauge04_sensor_contr_space_based_six +(Hauge and Campbell 2004)   X Vibration Isolation @@ -864,7 +668,7 @@ -furutani04_nanom_cuttin_machin_using_stewar +(Furutani, Suzuki, and Kudoh 2004)       @@ -878,7 +682,7 @@ -ranganath04_force_torque_sensor_based_stewar +(Ranganath et al. 2004)       @@ -892,7 +696,7 @@ -chen04_decoup_contr_flexur_joint_hexap +(Chen and McInroy 2004)       @@ -906,7 +710,7 @@ -su04_distur_rejec_high_precis_motion +(Su et al. 2004)   X   @@ -920,7 +724,7 @@ -huang05_smoot_stewar +(Huang and Fu 2005)       @@ -934,7 +738,7 @@ -ting06_desig_stewar_nanos_platf, ting13_compos_contr_desig_stewar_nanos_platf +(Ting, Jar, and Li 2006), (Ting, Li, and Nguyen 2013)   X   @@ -948,7 +752,7 @@ -horin06_singul_condit_six_degree_of +(Horin and Shoham 2006)       @@ -962,7 +766,7 @@ -preumont07_six_axis_singl_stage_activ +(Preumont et al. 2007)       @@ -976,7 +780,7 @@ -ting07_measur_calib_stewar_microm_system +(Ting, Jar, and Li 2007)       @@ -990,7 +794,7 @@ -lei08_multi_objec_robus_activ_vibrat +(Lei and Benli 2008)       @@ -1004,7 +808,7 @@ -brezina08_ni_labview_matlab_simmec_stewar_platf_desig +(Bvrezina, Andrvs, and Bvrezina 2008)       @@ -1018,7 +822,7 @@ -molina08_simul_stewar +(Molina, Rosario, and Sanchez 2008)       @@ -1032,7 +836,7 @@ -dong08_stiff_resear_high_precis_large, dong07_desig_precis_compl_paral_posit +(Dong, Sun, and Du 2008), (Dong, Sun, and Du 2007)       @@ -1046,7 +850,7 @@ -heertjes10_optim_dynam_decoup_activ_vibrat_isolat +(Heertjes, Engelen, and Steinbuch 2010)       @@ -1060,7 +864,7 @@ -neagoe10_accur_stewar_platf +(Neagoe et al. 2010)       @@ -1074,7 +878,7 @@ -beno10 +(Beno, Booth, and Mock 2010)       @@ -1088,7 +892,7 @@ -yang10_model_dof_simul_simmec +(Yang et al. 2010)       @@ -1102,7 +906,7 @@ -brezina10_contr_desig_stewar_platf_linear_actuat +(Bvrezina and Bvrezina 2010)       @@ -1116,7 +920,7 @@ -houska10_desig_implem_absol_linear_posit +(Houvska, Bvrezina, and Bvrezina 2010)   X   @@ -1130,7 +934,7 @@ -brezina10_contr_desig_stewar_platf_linear_actuat +(Bvrezina and Bvrezina 2010)       @@ -1144,7 +948,7 @@ -zhang11_six_dof +(Zhang et al. 2011)   X   @@ -1158,7 +962,7 @@ -yun11_gener_dynam_contr_model_class +(Yun and Li 2011)       @@ -1172,7 +976,7 @@ -pu11_six_degree_of_freed_activ +(Pu et al. 2011)       @@ -1186,7 +990,7 @@ -ding11_robus_vibrat_isolat_dof +(Ding, Damen, and Bosch 2011)       @@ -1200,7 +1004,7 @@ -torii12_small_size_self_propel_stewar_platf +(Torii et al. 2012)   X   @@ -1214,7 +1018,7 @@ -pedrammehr12_study_vibrat_stewar_platf_based +(Pedrammehr, Mahboubkhah, and Khani 2012)   X   @@ -1228,7 +1032,7 @@ -xu13_track_posit_vibrat_contr_simul +(Xu and Weng 2013)       @@ -1242,7 +1046,7 @@ -baig14_neural_networ_optim_desig_param +(Baig and Pugazhenthi 2014)   X   @@ -1256,7 +1060,7 @@ -du14_piezo_actuat_high_precis_flexib +(Du, Shi, and Dong 2014)   X   @@ -1270,7 +1074,7 @@ -abbas14_vibrat_stewar_platf +(Abbas and Hai 2014)       @@ -1284,7 +1088,7 @@ -lara-molina15_combin_struc_contr_optim_desig +(Lara-Molina, Koroishi, and Dumur 2015)       @@ -1298,7 +1102,7 @@ -thier16_six_degree_freed_vibrat_isolat +(Thier et al. 2016)       @@ -1312,7 +1116,7 @@ -wang16_inves_activ_vibrat_isolat_stewar +(Wang et al. 2016)   X   @@ -1326,7 +1130,7 @@ -yang17_dynam_isotr_desig_decen_activ +(Yang et al. 2017)       @@ -1340,7 +1144,7 @@ -beijen18_self_tunin_mimo_distur_feedf +(Beijen, Heertjes, et al. 2018)       @@ -1354,7 +1158,7 @@ -jiao18_dynam_model_exper_analy_stewar +(Jiao et al. 2018)   X   @@ -1368,7 +1172,7 @@ -tang18_decen_vibrat_contr_voice_coil +(Tang, Cao, and Yu 2018)   X   @@ -1382,7 +1186,7 @@ -taghavi19_desig_model_simul_novel_hexap +(Taghavi, Kinoshita, and Bock 2019)       @@ -1396,7 +1200,7 @@ -owoc19_mechat_desig_model_contr_stewar_gough_platf +(Owoc, Ludwiczak, and Piotrowski 2019)       @@ -1410,7 +1214,7 @@ -min19_high_precis_track_cubic_stewar +(Min, Huang, and Su 2019)       @@ -1424,7 +1228,7 @@ -yang19_dynam_model_decoup_contr_flexib +(Yang et al. 2019) 1 X   @@ -1438,7 +1242,7 @@ -stabile19_desig_analy_novel_hexap_platf +(Stabile et al. 2019)       @@ -1452,7 +1256,7 @@ -tong20_dynam_decoup_analy_exper_based +(Tong, Gosselin, and Jiang 2020)       @@ -1485,11 +1289,11 @@ -kim09_desig_model_novel_precis_micro_stage +(Kim and Cho 2009) -yun10_desig_analy_novel_redun_actuat +(Yun and Li 2010) @@ -1498,168 +1302,123 @@

-

Bibliography

-

+ +

Bibliography

+
+
Abbas, Hussain, and Huang Hai. 2014. “Vibration Isolation Concepts for Non-Cubic Stewart Platform Using Modal Control.” In Proceedings of 2014 11th International Bhurban Conference on Applied Sciences & Technology (IBCAST) Islamabad, Pakistan, 14th - 18th January, 2014, nil. https://doi.org/10.1109/ibcast.2014.6778139.
+
Abu Hanieh, Ahmed, Mihaita Horodinca, and Andre Preumont. 2002. “Stiff and Soft Stewart Platforms for Active Damping and Active Isolation of Vibrations.” In Actuator 2002, 8th International Conference on New Actuators.
+
Agrawal, Brij N, and Hong-Jen Chen. 2004. “Algorithms for Active Vibration Isolation on Spacecraft Using a Stewart Platform.” Smart Materials and Structures 13 (4):873–80. https://doi.org/10.1088/0964-1726/13/4/025.
+
Anderson, Eric H., Michael F. Cash, Paul C. Janzen, Gregory W. Pettit, and Christian A. Smith. 2006. “Precision, Range, Bandwidth, and Other Tradeoffs in Hexapods with Application to Large Ground-Based Telescopes.” In Optomechanical Technologies for Astronomy, nil. https://doi.org/10.1117/12.672947.
+
Arakelian, V. 2018. Dynamic Decoupling of Robot Manipulators. Mechanisms and Machine Science. Springer International Publishing. https://doi.org/10.1007/978-3-319-74363-9.
+
Baig, R Ulla, and S Pugazhenthi. 2014. “Neural Network Optimization of Design Parameters of Stewart Platform for Effective Active Vibration Isolation.” Journal of Engineering and Applied Sciences 9 (4):78–84.
+
Beijen, M.A., M.F. Heertjes, J. Van Dijk, and W.B.J. Hakvoort. 2018. “Self-Tuning Mimo Disturbance Feedforward Control for Active Hard-Mounted Vibration Isolators.” Control Engineering Practice 72 (nil):90–103. https://doi.org/10.1016/j.conengprac.2017.11.008.
+
Beijen, Michiel A., Robbert Voorhoeve, Marcel F. Heertjes, and Tom Oomen. 2018. “Experimental Estimation of Transmissibility Matrices for Industrial Multi-Axis Vibration Isolation Systems.” Mechanical Systems and Signal Processing 107 (nil):469–83. https://doi.org/10.1016/j.ymssp.2018.01.013.
+
Beno, Joseph H., John A. Booth, and Jason Mock. 2010. “An Alternative Architecture and Control Strategy for Hexapod Positioning Systems to Simplify Structural Design and Improve Accuracy.” In Ground-Based and Airborne Telescopes III, nil. https://doi.org/10.1117/12.856760.
+
Bonev, Ilian A., and Jeha Ryu. 2001. “A New Approach to Orientation Workspace Analysis of 6-Dof Parallel Manipulators.” Mechanism and Machine Theory 36 (1):15–28. https://doi.org/10.1016/s0094-114x(00)00032-x.
+
Buzurovic, Ivan. 2012. “Advanced Control Methodologies in Parallel Robotic Systems.” Advances in Robotics & Automation 01 (s6):nil. https://doi.org/10.4172/2168-9695.s6-e001.
+
Bvrezina, Lukávs, Ondvrej Andrvs, and Tomávs Bvrezina. 2008. “Ni Labview-Matlab Simmechanics Stewart Platform Design.” Applied and Computational Mechanics. University of West Bohemia.
+
Bvrezina, T., and L. Bvrezina. 2010. “Controller Design of the Stewart Platform Linear Actuator.” In Recent Advances in Mechatronics, 341–46. Recent Advances in Mechatronics. Springer Berlin Heidelberg. https://doi.org/10.1007/978-3-642-05022-0_58.
+
Chai, Kok-Soon, Ken Young, and Ian Tuersley. 2002. “A Practical Calibration Process Using Partial Information for a Commercial Stewart Platform.” Robotica 20 (03):nil. https://doi.org/10.1017/s0263574701004027.
+
Cheng, Yuan, Gexue Ren, and ShiLiang Dai. 2004. “The Multi-Body System Modelling of the Gough-Stewart Platform for Vibration Control.” Journal of Sound and Vibration 271 (3-5):599–614. https://doi.org/10.1016/s0022-460x(03)00283-9.
+
Chen, Hong-Jen, Ronald Bishop, and Brij Agrawal. 2003. “Payload Pointing and Active Vibration Isolation Using Hexapod Platforms.” In 44th AIAA/ASME/ASCE/AHS/ASC Structures, Structural Dynamics, and Materials Conference, nil. https://doi.org/10.2514/6.2003-1643.
+
Chen, Y., and J.E. McInroy. 2004. “Decoupled Control of Flexure-Jointed Hexapods Using Estimated Joint-Space Mass-Inertia Matrix.” IEEE Transactions on Control Systems Technology 12 (3):413–21. https://doi.org/10.1109/tcst.2004.824339.
+
Chen, Yixin, and J.E. McInroy. 2000. “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), nil. https://doi.org/10.1109/robot.2000.844878.
+
Chi, Weichao, Dengqing Cao, Dongwei Wang, Jie Tang, Yifan Nie, and Wenhu Huang. 2015. “Design and Experimental Study of a Vcm-Based Stewart Parallel Mechanism Used for Active Vibration Isolation.” Energies 8 (8):8001–19. https://doi.org/10.3390/en8088001.
+
Cleary, K., and T. Arai. 1991. “A Prototype Parallel Manipulator: Kinematics, Construction, Software, Workspace Results, and Singularity Analysis.” In Proceedings. 1991 IEEE International Conference on Robotics and Automation, nil. https://doi.org/10.1109/robot.1991.131641.
+
Dasgupta, Bhaskar, and T.S. Mruthyunjaya. 2000. “The Stewart Platform Manipulator: A Review.” Mechanism and Machine Theory 35 (1):15–40. https://doi.org/10.1016/s0094-114x(99)00006-3.
+
Deng, R. 2017. “Integrated 6-DoF Lorentz Actuator with Gravity Compensation for Vibration Isolation in in-Line Surface Metrology.” TU Delft.
+
Ding, Chenyang, A. A. H. Damen, and P. P. J. van den Bosch. 2011. “Robust Vibration Isolation of a 6-DOF System Using Modal Decomposition and Sliding Surface Optimization.” In Proceedings of the 2011 American Control Conference, nil. https://doi.org/10.1109/acc.2011.5991084.
+
Dong, Wei, Lining Sun, and Zhijiang Du. 2008. “Stiffness Research on a High-Precision, Large-Workspace Parallel Mechanism with Compliant Joints.” Precision Engineering 32 (3):222–31. https://doi.org/10.1016/j.precisioneng.2007.08.002.
+
Dong, W., L.N. Sun, and Z.J. Du. 2007. “Design of a Precision Compliant Parallel Positioner Driven by Dual Piezoelectric Actuators.” Sensors and Actuators a: Physical 135 (1):250–56. https://doi.org/10.1016/j.sna.2006.07.011.
+
Du, Zhijiang, Ruochong Shi, and Wei Dong. 2014. “A Piezo-Actuated High-Precision Flexible Parallel Pointing Mechanism: Conceptual Design, Development, and Experiments.” IEEE Transactions on Robotics 30 (1):131–37. https://doi.org/10.1109/tro.2013.2288800.
+
Furqan, Mohd, Mohd Suhaib, and Nazeer Ahmad. 2017. “Studies on Stewart Platform Manipulator: A Review.” Journal of Mechanical Science and Technology 31 (9):4459–70. https://doi.org/10.1007/s12206-017-0846-1.
+
Furutani, Katsushi, Michio Suzuki, and Ryusei Kudoh. 2004. “Nanometre-Cutting Machine Using a Stewart-Platform Parallel Mechanism.” Measurement Science and Technology 15 (2):467–74. https://doi.org/10.1088/0957-0233/15/2/022.
+
Gao, Feng, Weimin Li, Xianchao Zhao, Zhenlin Jin, and Hui Zhao. 2002. “New Kinematic Structures for 2-, 3-, 4-, and 5-Dof Parallel Manipulator Designs.” Mechanism and Machine Theory 37 (11):1395–1411. https://doi.org/10.1016/s0094-114x(02)00044-7.
+
Geng, Zheng, and Leonard S. Haynes. 1993. “Six-Degree-of-Freedom Active Vibration Isolation Using a Stewart Platform Mechanism.” Journal of Robotic Systems 10 (5):725–44. https://doi.org/10.1002/rob.4620100510.
+
Geng, Z.J., and L.S. Haynes. 1994. “Six Degree-of-Freedom Active Vibration Control Using the Stewart Platforms.” IEEE Transactions on Control Systems Technology 2 (1):45–53. https://doi.org/10.1109/87.273110.
+
Geng, Z. Jason, George G. Pan, Leonard S. Haynes, Ben K. Wada, and John A. Garba. 1995. “An Intelligent Control System for Multiple Degree-of-Freedom Vibration Isolation.” Journal of Intelligent Material Systems and Structures 6 (6):787–800. https://doi.org/10.1177/1045389x9500600607.
+
Gexue, Ren, Lu Qiuhai, Hu Ning, Nan Rendong, and Peng Bo. 2004. “On Vibration Control with Stewart Parallel Mechanism.” Mechatronics 14 (1):1–13. https://doi.org/10.1016/s0957-4158(02)00092-2.
+
Guo, HongBo, YongGuang Liu, GuiRong Liu, and HongRen Li. 2008. “Cascade Control of a Hydraulically Driven 6-Dof Parallel Robot Manipulator Based on a Sliding Mode.” Control Engineering Practice 16 (9):1055–68. https://doi.org/10.1016/j.conengprac.2007.11.005.
+
Hanieh, Ahmed Abu. 2003. “Active Isolation and Damping of Vibrations via Stewart Platform.” Université Libre de Bruxelles, Brussels, Belgium.
+
Hauge, G.S., and M.E. Campbell. 2004. “Sensors and Control of a Space-Based Six-Axis Vibration Isolation System.” Journal of Sound and Vibration 269 (3-5):913–31. https://doi.org/10.1016/s0022-460x(03)00206-2.
+
Heertjes, Marcel F, Arjan JP van Engelen, and Maarten Steinbuch. 2010. “Optimized Dynamic Decoupling in Active Vibration Isolation.” IFAC Proceedings Volumes 43 (18). Elsevier:293–98.
+
Horin, P. Ben, and M. Shoham. 2006. “Singularity Condition of Six-Degree-of-Freedom Three-Legged Parallel Robots Based on Grassmann-Cayley Algebra.” IEEE Transactions on Robotics 22 (4):577–90. https://doi.org/10.1109/tro.2006.878958.
+
Houvska, P., T. Bvrezina, and L. Bvrezina. 2010. “Design and Implementation of the Absolute Linear Position Sensor for the Stewart Platform.” In Recent Advances in Mechatronics, 347–52. Recent Advances in Mechatronics. Springer Berlin Heidelberg. https://doi.org/10.1007/978-3-642-05022-0_59.
+
Huang, Chin I, and Li-Chen Fu. 2005. “Smooth Sliding Mode Tracking Control of the Stewart Platform.” In Proceedings of 2005 IEEE Conference on Control Applications, 2005. CCA 2005., nil. https://doi.org/10.1109/cca.2005.1507098.
+
Jafari, F., and J.E. McInroy. 2003. “Orthogonal Gough-Stewart Platforms for Micromanipulation.” IEEE Transactions on Robotics and Automation 19 (4). Institute of Electrical and Electronics Engineers (IEEE):595–603. https://doi.org/10.1109/tra.2003.814506.
+
Jiang, Qimi, and Clément M. Gosselin. 2009a. “Determination of the Maximal Singularity-Free Orientation Workspace for the Gough-Stewart Platform.” Mechanism and Machine Theory 44 (6):1281–93. https://doi.org/10.1016/j.mechmachtheory.2008.07.005.
+
———. 2009b. “Evaluation and Representation of the Theoretical Orientation Workspace of the Gough-Stewart Platform.” Journal of Mechanisms and Robotics 1 (2):nil. https://doi.org/10.1115/1.3046137.
+
Jiao, Jian, Ying Wu, Kaiping Yu, and Rui Zhao. 2018. “Dynamic Modeling and Experimental Analyses of Stewart Platform with Flexible Hinges.” Journal of Vibration and Control 25 (1):151–71. https://doi.org/10.1177/1077546318772474.
+
Jin, Yan, I-Ming Chen, and Guilin Yang. 2009. “Kinematic Design of a Family of 6-Dof Partially Decoupled Parallel Manipulators.” Mechanism and Machine Theory 44 (5):912–22. https://doi.org/10.1016/j.mechmachtheory.2008.06.004.
+
Kim, Dong Hwan, Ji-Yoon Kang, and Kyo-Il Lee. 2000. “Robust Tracking Control Design for a 6 Dof Parallel Manipulator.” Journal of Robotic Systems 17 (10):527–47. https://doi.org/10.1002/1097-4563(200010)17:10$<$527:AID-ROB2>3.0.CO;2-A.
+
Kim, Hwa Soo, and Young Man Cho. 2009. “Design and Modeling of a Novel 3-Dof Precision Micro-Stage.” Mechatronics 19 (5):598–608. https://doi.org/10.1016/j.mechatronics.2009.01.004.
+
Lara-Molina, F.A., E.H. Koroishi, and Didier Dumur. 2015. “Combined Structure-Control Optimal Design of the Stewart-Gough Robot.” In 2015 12th Latin American Robotics Symposium and 2015 3rd Brazilian Symposium on Robotics (LARS-SBR), nil. https://doi.org/10.1109/lars-sbr.2015.26.
+
Lee, Se-Han, Jae-Bok Song, Woo-Chun Choi, and Daehie Hong. 2003. “Position Control of a Stewart Platform Using Inverse Dynamics Control with Approximate Dynamics.” Mechatronics 13 (6):605–19. https://doi.org/10.1016/s0957-4158(02)00033-8.
+
Legnani, G., I. Fassi, H. Giberti, S. Cinquemani, and D. Tosi. 2012. “A New Isotropic and Decoupled 6-Dof Parallel Manipulator.” Mechanism and Machine Theory 58 (nil):64–81. https://doi.org/10.1016/j.mechmachtheory.2012.07.008.
+
Lei, Liu, and Wang Benli. 2008. “Multi Objective Robust Active Vibration Control for Flexure Jointed Struts of Stewart Platforms via $H_Infty$ and $mu$ Synthesis.” Chinese Journal of Aeronautics 21 (2):125–33. https://doi.org/10.1016/s1000-9361(08)60016-3.
+
Lin, Haomin, and J.E. McInroy. 2003. “Adaptive Sinusoidal Disturbance Cancellation for Precise Pointing of Stewart Platforms.” IEEE Transactions on Control Systems Technology 11 (2):267–72. https://doi.org/10.1109/tcst.2003.809248.
+
Liu, Xin-Jun, Jinsong Wang, Feng Gao, and Li-Ping Wang. 2001. “On the Design of 6-DOF Parallel Micro-Motion Manipulators.” In Proceedings 2001 IEEE/RSJ International Conference on Intelligent Robots and Systems. Expanding the Societal Role of Robotics in the the Next Millennium (Cat. No.01CH37180), nil. https://doi.org/10.1109/iros.2001.973381.
+
Li, Xiaochun. 2001. “Simultaneous, Fault-Tolerant Vibration Isolation and Pointing Control of Flexure Jointed Hexapods.” University of Wyoming.
+
Li, Xiaochun, Jerry C. Hamann, and John E. McInroy. 2001. “Simultaneous Vibration Isolation and Pointing Control of Flexure Jointed Hexapods.” In Smart Structures and Materials 2001: Smart Structures and Integrated Systems, nil. https://doi.org/10.1117/12.436521.
+
Li, Yao, XiaoLong Yang, HongTao Wu, and Bai Chen. 2018. “Optimal Design of a Six-Axis Vibration Isolator via Stewart Platform by Using Homogeneous Jacobian Matrix Formulation Based on Dual Quaternions.” Journal of Mechanical Science and Technology 32 (1):11–19. https://doi.org/10.1007/s12206-017-1202-1.
+
McInroy, J.E. 1999. “Dynamic Modeling of Flexure Jointed Hexapods for Control Purposes.” In Proceedings of the 1999 IEEE International Conference on Control Applications (Cat. No.99CH36328), nil. https://doi.org/10.1109/cca.1999.806694.
+
———. 2002. “Modeling and Design of Flexure Jointed Stewart Platforms for Control Purposes.” IEEE/ASME Transactions on Mechatronics 7 (1):95–99. https://doi.org/10.1109/3516.990892.
+
McInroy, J.E., and J.C. Hamann. 2000. “Design and Control of Flexure Jointed Hexapods.” IEEE Transactions on Robotics and Automation 16 (4):372–81. https://doi.org/10.1109/70.864229.
+
McInroy, J.E., J.F. O’Brien, and G.W. Neat. 1999. “Precise, Fault-Tolerant Pointing Using a Stewart Platform.” IEEE/ASME Transactions on Mechatronics 4 (1):91–95. https://doi.org/10.1109/3516.752089.
+
Merlet, Jean-Pierre. 2002. “Still a Long Way to Go on the Road for Parallel Mechanisms.” In Proc. ASME 2002 DETC Conf., Montreal.
+
Merlet, J.P. 2006. Parallel Robots. Dordrecht Boston, MA: Kluwer Academic Publishers.
+
Min, Da, Deqing Huang, and Hu Su. 2019. “High-Precision Tracking of Cubic Stewart Platform Using Active Disturbance Rejection Control.” In 2019 Chinese Control Conference (CCC), nil. https://doi.org/10.23919/chicc.2019.8866606.
+
Molina, Fabian Andres Lara, Joao Mauricio Rosario, and Oscar Fernando Aviles Sanchez. 2008. “Simulation Environment Proposal, Analysis and Control of a Stewart Platform Manipulator.” In 7th Brazilian Conference on Dynamics, Control & Applications.
+
Mukherjee, Parthajit, Bhaskar Dasgupta, and A.K. Mallik. 2007. “Dynamic Stability Index and Vibration Analysis of a Flexible Stewart Platform.” Journal of Sound and Vibration 307 (3-5). Elsevier BV:495–512. https://doi.org/10.1016/j.jsv.2007.05.036.
+
Neagoe, Mircea, Dorin Diaconescu, Codruta Jaliu, Sergiu-Dan Stan, Nadia Cretescu, and Radu Saulescu. 2010. “On the Accuracy of a Stewart Platform: Modelling and Experimental Validation.” In Computational Intelligence and Modern Heuristics. InTech.
+
Owoc, Dawid, Krzysztof Ludwiczak, and Robert Piotrowski. 2019. “Mechatronics Design, Modelling and Controlling of the Stewart-Gough Platform.” In 2019 24th International Conference on Methods and Models in Automation and Robotics (MMAR), nil. https://doi.org/10.1109/mmar.2019.8864694.
+
O’Brien, J.F., J.E. McInroy, D. Bodtke, M. Bruch, and J.C. Hamann. 1998. “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), nil. https://doi.org/10.1109/acc.1998.703532.
+
Patel, Y. D., and P. M. George. 2012. “Parallel Manipulators Applications-a Survey.” Modern Mechanical Engineering 02 (03). Scientific Research Publishing, Inc,:57–64. https://doi.org/10.4236/mme.2012.23008.
+
Pedrammehr, Siamak, Mehran Mahboubkhah, and Navid Khani. 2012. “A Study on Vibration of Stewart Platform-Based Machine Tool Table.” The International Journal of Advanced Manufacturing Technology 65 (5-8):991–1007. https://doi.org/10.1007/s00170-012-4234-9.
+
Pernkopf, F, and M L Husty. 2006. “Workspace Analysis of Stewart-Gough-Type Parallel Manipulators.” Proceedings of the Institution of Mechanical Engineers, Part C: Journal of Mechanical Engineering Science 220 (7):1019–32. https://doi.org/10.1243/09544062jmes194.
+
Preumont, A., M. Horodinca, I. Romanescu, B. de Marneffe, M. Avraam, A. Deraemaeker, F. Bossens, and A. Abu Hanieh. 2007. “A Six-Axis Single-Stage Active Vibration Isolator Based on Stewart Platform.” Journal of Sound and Vibration 300 (3-5):644–61. https://doi.org/10.1016/j.jsv.2006.07.050.
+
Preumont, Andre. 2018. Vibration Control of Active Structures - Fourth Edition. Solid Mechanics and Its Applications. Springer International Publishing. https://doi.org/10.1007/978-3-319-72296-2.
+
Pu, H, X Chen, Z Zhou, and X Luo. 2011. “Six-Degree-of-Freedom Active Vibration Isolation System with Decoupled Collocated Control.” Proceedings of the Institution of Mechanical Engineers, Part B: Journal of Engineering Manufacture 226 (2):313–25. https://doi.org/10.1177/0954405411414336.
+
Rahman, Zahidul, and John Spanos. 1996. “Six Axis Vibration Isolation, Suppression and Steering System for Space Applications.” In Dynamics Specialists Conference, nil. https://doi.org/10.2514/6.1996-1211.
+
Rahman, Zahidul H., John T. Spanos, and Robert A. Laskin. 1998. “Multiaxis Vibration Isolation, Suppression, and Steering System for Space Observational Applications.” In Telescope Control Systems III, nil. https://doi.org/10.1117/12.308821.
+
Ranganath, R, P.S Nair, T.S Mruthyunjaya, and A Ghosal. 2004. “A Force-Torque Sensor Based on a Stewart Platform in a Near-Singular Configuration.” Mechanism and Machine Theory 39 (9):971–98. https://doi.org/10.1016/j.mechmachtheory.2004.04.005.
+
Selig, J.M., and X. Ding. 2001. “Theory of Vibrations in Stewart Platforms.” In Proceedings 2001 IEEE/RSJ International Conference on Intelligent Robots and Systems. Expanding the Societal Role of Robotics in the the Next Millennium (Cat. No.01CH37180), 2190–95. https://doi.org/10.1109/iros.2001.976395.
+
Spanos, J., Z. Rahman, and G. Blackwood. 1995. “A Soft 6-Axis Active Vibration Isolator.” In Proceedings of 1995 American Control Conference - ACC’95, nil. https://doi.org/10.1109/acc.1995.529280.
+
Stabile, Alessandro, Emilia Wegrzyn, Guglielmo S Aglietti, Guy Richardson, and Geert Smet. 2019. “Design and Analysis of a Novel Hexapod Platform for High-Performance Micro-Vibration Mitigation.” In Proc. 18. European Space Mechanisms and Tribology Symposium.
+
Su, Y.X., B.Y. Duan, C.H. Zheng, Y.F. Zhang, G.D. Chen, and J.W. Mi. 2004. “Disturbance-Rejection High-Precision Motion Control of a Stewart Platform.” IEEE Transactions on Control Systems Technology 12 (3):364–74. https://doi.org/10.1109/tcst.2004.824315.
+
Taghavi, Meysam, Taku Kinoshita, and Thomas Bock. 2019. “Design, Modelling and Simulation of Novel Hexapod-Shaped Passive Damping System for Coupling Cable Robot and End Effector in Curtain Wall Module Installation Application.” In Proceedings of the 36th International Symposium on Automation and Robotics in Construction (ISARC), nil. https://doi.org/10.22260/isarc2019/0089.
+
Taghirad, Hamid. 2013. Parallel Robots : Mechanics and Control. Boca Raton, FL: CRC Press.
+
Tang, Jie, Dengqing Cao, and Tianhu Yu. 2018. “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–45. https://doi.org/10.1177/0954406218756941.
+
Thayer, D., and J. Vagners. 1998. “A Look at the Pole/Zero Structure of a Stewart Platform Using Special Coordinate Basis.” In Proceedings of the 1998 American Control Conference. ACC (IEEE Cat. No.98CH36207), nil. https://doi.org/10.1109/acc.1998.703595.
+
Thayer, Doug, Mark Campbell, Juris Vagners, and Andrew von Flotow. 2002. “Six-Axis Vibration Isolation System Using Soft Actuators and Multiple Sensors.” Journal of Spacecraft and Rockets 39 (2):206–12. https://doi.org/10.2514/2.3821.
+
Thier, Markus, Rudolf Saathof, Andreas Sinn, Reinhard Hainisch, and Georg Schitter. 2016. “Six Degree of Freedom Vibration Isolation Platform for in-Line Nano-Metrology.” IFAC-PapersOnLine 49 (21):149–56. https://doi.org/10.1016/j.ifacol.2016.10.534.
+
Ting, Yung, H.-C. Jar, and Chun-Chung Li. 2006. “Design of a 6DOF Stewart-Type Nanoscale Platform.” In 2006 Sixth IEEE Conference on Nanotechnology, nil. https://doi.org/10.1109/nano.2006.247808.
+
Ting, Yung, Ho-Chin Jar, and Chun-Chung Li. 2005. “Error Compensation and Feedforward Controller Design for a 6-Dof Micro-Positioning Platform.” In 2005 IEEE/RSJ International Conference on Intelligent Robots and Systems, nil. https://doi.org/10.1109/iros.2005.1545073.
+
———. 2007. “Measurement and Calibration for Stewart Micromanipulation System.” Precision Engineering 31 (3):226–33. https://doi.org/10.1016/j.precisioneng.2006.09.004.
+
Ting, Yung, Chun-Chung Li, and Tho Van Nguyen. 2013. “Composite Controller Design for a 6dof Stewart Nanoscale Platform.” Precision Engineering 37 (3):671–83. https://doi.org/10.1016/j.precisioneng.2013.01.012.
+
Tong, Zhizhong, Clément Gosselin, and Hongzhou Jiang. 2020. “Dynamic Decoupling Analysis and Experiment Based on a Class of Modified Gough-Stewart Parallel Manipulators with Line Orthogonality.” Mechanism and Machine Theory 143 (nil):103636. https://doi.org/10.1016/j.mechmachtheory.2019.103636.
+
Torii, Akihiro, Masaaki Banno, Akiteru Ueda, and Kae Doki. 2012. “A Small-Size Self-Propelled Stewart Platform.” Electrical Engineering in Japan 181 (2):37–46. https://doi.org/10.1002/eej.21261.
+
Tsai, K.Y., and K.D. Huang. 2003. “The Design of Isotropic 6-Dof Parallel Manipulators Using Isotropy Generators.” Mechanism and Machine Theory 38 (11):1199–1214. https://doi.org/10.1016/s0094-114x(03)00067-3.
+
Vivas, Oscar Andrés. 2004. “Contribution À L’identification Et À La Commande Des Robots Parallèles.” Université Montpellier II-Sciences et Techniques du Languedoc.
+
Wang, Chaoxin, Xiling Xie, Yanhao Chen, and Zhiyi Zhang. 2016. “Investigation on Active Vibration Isolation of a Stewart Platform with Piezoelectric Actuators.” Journal of Sound and Vibration 383 (November). Elsevier BV:1–19. https://doi.org/10.1016/j.jsv.2016.07.021.
+
Wang, Shao-Chi, Hiromitsu Hikita, Hiroshi Kubo, Yong-Sheng Zhao, Zhen Huang, and Tohru Ifukube. 2003. “Kinematics and Dynamics of a 6 Degree-of-Freedom Fully Parallel Manipulator with Elastic Joints.” Mechanism and Machine Theory 38 (5):439–61. https://doi.org/10.1016/s0094-114x(02)00132-5.
+
Xie, Xiling, Chaoxin Wang, and Zhiyi Zhang. 2017. “Modeling and Control of a Hybrid Passive/Active Stewart Vibration Isolation Platform.” In INTER-NOISE and NOISE-CON Congress and Conference Proceedings, 255:1844–53. Institute of Noise Control Engineering.
+
Xu, Zhao-dong, and Chen-hui Weng. 2013. “Track-Position and Vibration Control Simulation for Strut of the Stewart Platform.” Journal of Zhejiang University SCIENCE a 14 (4):281–91. https://doi.org/10.1631/jzus.a1200278.
+
Yang, Chifu, Zhengmao Ye, O. Ogbobe Peter, and Junwei Han. 2010. “Modeling and Simulation of Spatial 6-DOF Parallel Robots Using Simulink and SimMechanics.” In 2010 3rd International Conference on Computer Science and Information Technology, nil. https://doi.org/10.1109/iccsit.2010.5563824.
+
Yang, G., I.-M. Chen, W. Chen, and W. Lin. 2004. “Kinematic Design of a Six-Dof Parallel-Kinematics Machine with Decoupled-Motion Architecture.” IEEE Transactions on Robotics 20 (5):876–84. https://doi.org/10.1109/tro.2004.829485.
+
Yang, XiaoLong, HongTao Wu, Bai Chen, ShengZheng Kang, and ShiLi Cheng. 2019. “Dynamic Modeling and Decoupled Control of a Flexible Stewart Platform for Vibration Isolation.” Journal of Sound and Vibration 439 (January). Elsevier BV:398–412. https://doi.org/10.1016/j.jsv.2018.10.007.
+
Yang, XiaoLong, HongTao Wu, Yao Li, and Bai Chen. 2017. “Dynamic Isotropic Design and Decentralized Active Control of a Six-Axis Vibration Isolator via Stewart Platform.” Mechanism and Machine Theory 117 (nil):244–52. https://doi.org/10.1016/j.mechmachtheory.2017.07.017.
+
Yun, Yuan, and Yangmin Li. 2010. “Design and Analysis of a Novel 6-Dof Redundant Actuated Parallel Robot with Compliant Hinges for High Precision Positioning.” Nonlinear Dynamics 61 (4):829–45. https://doi.org/10.1007/s11071-010-9690-x.
+
———. 2011. “A General Dynamics and Control Model of a Class of Multi-Dof Manipulators for Active Vibration Control.” Mechanism and Machine Theory 46 (10):1549–74. https://doi.org/10.1016/j.mechmachtheory.2011.04.010.
+
Zhang, Zhen, J Liu, Jq Mao, Yx Guo, and Yh Ma. 2011. “Six DOF Active Vibration Control Using Stewart Platform with Non-Cubic Configuration.” In 2011 6th IEEE Conference on Industrial Electronics and Applications, nil. https://doi.org/10.1109/iciea.2011.5975679.
+
Zheng, Yan, Zhicheng Zhou, and Hai Huang. 2020. “A Multi-Frequency Mimo Control Method for the 6dof Micro-Vibration Exciting System.” Acta Astronautica 170 (nil):552–69. https://doi.org/10.1016/j.actaastro.2020.02.033.
+
Zheng, Yisheng, Qingpin Li, Bo Yan, Yajun Luo, and Xinong Zhang. 2018. “A Stewart Isolator with High-Static-Low-Dynamic Stiffness Struts Based on Negative Stiffness Magnetic Springs.” Journal of Sound and Vibration 422 (nil):390–408. https://doi.org/10.1016/j.jsv.2018.02.046.
+

Author: Dehaeze Thomas

-

Created: 2020-03-13 ven. 10:04

+

Created: 2020-08-05 mer. 13:27

diff --git a/docs/control-active-damping.html b/docs/control-active-damping.html index c5774dd..2f02753 100644 --- a/docs/control-active-damping.html +++ b/docs/control-active-damping.html @@ -1,240 +1,27 @@ - - - + - Stewart Platform - Decentralized Active Damping - - - - +
@@ -250,25 +37,25 @@
  • 1. Inertial Control
  • 2. Integral Force Feedback
  • 3. Direct Velocity Feedback
  • 4. Compliance and Transmissibility Comparison @@ -315,43 +102,43 @@ To run the script, open the Simulink Project, and type run active_damping_
    stewart = initializeStewartPlatform();
    -stewart = initializeFramesPositions(stewart, 'H', 90e-3, 'MO_B', 45e-3);
    +stewart = initializeFramesPositions(stewart, 'H', 90e-3, 'MO_B', 45e-3);
     stewart = generateGeneralConfiguration(stewart);
     stewart = computeJointsPose(stewart);
     stewart = initializeStrutDynamics(stewart);
    -stewart = initializeJointDynamics(stewart, 'type_F', 'universal_p', 'type_M', 'spherical_p');
    +stewart = initializeJointDynamics(stewart, 'type_F', 'universal_p', 'type_M', 'spherical_p');
     stewart = initializeCylindricalPlatforms(stewart);
     stewart = initializeCylindricalStruts(stewart);
     stewart = computeJacobian(stewart);
     stewart = initializeStewartPose(stewart);
    -stewart = initializeInertialSensor(stewart, 'type', 'accelerometer', 'freq', 5e3);
    +stewart = initializeInertialSensor(stewart, 'type', 'accelerometer', 'freq', 5e3);
     
    -
    ground = initializeGround('type', 'rigid', 'rot_point', stewart.platform_F.FO_A);
    -payload = initializePayload('type', 'none');
    -controller = initializeController('type', 'open-loop');
    +
    ground = initializeGround('type', 'rigid', 'rot_point', stewart.platform_F.FO_A);
    +payload = initializePayload('type', 'none');
    +controller = initializeController('type', 'open-loop');
     
    -
    %% Options for Linearized
    +
    %% Options for Linearized
     options = linearizeOptions;
     options.SampleTime = 0;
     
    -%% Name of the Simulink File
    -mdl = 'stewart_platform_model';
    +%% Name of the Simulink File
    +mdl = 'stewart_platform_model';
     
    -%% Input/Output definition
    +%% Input/Output definition
     clear io; io_i = 1;
    -io(io_i) = linio([mdl, '/Controller'],        1, 'openinput');  io_i = io_i + 1; % Actuator Force Inputs [N]
    -io(io_i) = linio([mdl, '/Stewart Platform'],  1, 'openoutput', [], 'Vm'); io_i = io_i + 1; % Absolute velocity of each leg [m/s]
    +io(io_i) = linio([mdl, '/Controller'],        1, 'openinput');  io_i = io_i + 1; % Actuator Force Inputs [N]
    +io(io_i) = linio([mdl, '/Stewart Platform'],  1, 'openoutput', [], 'Vm'); io_i = io_i + 1; % Absolute velocity of each leg [m/s]
     
    -%% Run the linearization
    +%% Run the linearization
     G = linearize(mdl, io, options);
    -G.InputName  = {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'};
    -G.OutputName = {'Vm1', 'Vm2', 'Vm3', 'Vm4', 'Vm5', 'Vm6'};
    +G.InputName  = {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'};
    +G.OutputName = {'Vm1', 'Vm2', 'Vm3', 'Vm4', 'Vm5', 'Vm6'};
     
    @@ -367,17 +154,17 @@ The transfer function from actuator forces to force sensors is shown in Figure <
  • -
    -

    1.2 Effect of the Flexible Joint stiffness and Actuator amplification on the Dynamics

    +
    +

    1.2 Effect of the Flexible Joint stiffness and Actuator amplification on the Dynamics

    We add some stiffness and damping in the flexible joints and we re-identify the dynamics.

    -
    stewart = initializeJointDynamics(stewart, 'type_F', 'universal', 'type_M', 'spherical');
    +
    stewart = initializeJointDynamics(stewart, 'type_F', 'universal', 'type_M', 'spherical');
     Gf = linearize(mdl, io, options);
    -Gf.InputName  = {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'};
    -Gf.OutputName = {'Vm1', 'Vm2', 'Vm3', 'Vm4', 'Vm5', 'Vm6'};
    +Gf.InputName  = {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'};
    +Gf.OutputName = {'Vm1', 'Vm2', 'Vm3', 'Vm4', 'Vm5', 'Vm6'};
     
    @@ -387,8 +174,8 @@ We now use the amplified actuators and re-identify the dynamics
    stewart = initializeAmplifiedStrutDynamics(stewart);
     Ga = linearize(mdl, io, options);
    -Ga.InputName  = {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'};
    -Ga.OutputName = {'Vm1', 'Vm2', 'Vm3', 'Vm4', 'Vm5', 'Vm6'};
    +Ga.InputName  = {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'};
    +Ga.OutputName = {'Vm1', 'Vm2', 'Vm3', 'Vm4', 'Vm5', 'Vm6'};
     
    @@ -404,8 +191,8 @@ The new dynamics from force actuator to force sensor is shown in Figure
    -
    -

    1.3 Obtained Damping

    +
    -
    -

    1.4 Conclusion

    +
    +

    1.4 Conclusion

    @@ -462,31 +249,31 @@ To run the script, open the Simulink Project, and type run active_damping_

    -
    -

    2.1 Identification of the Dynamics with perfect Joints

    +
    +

    2.1 Identification of the Dynamics with perfect Joints

    We first initialize the Stewart platform without joint stiffness.

    stewart = initializeStewartPlatform();
    -stewart = initializeFramesPositions(stewart, 'H', 90e-3, 'MO_B', 45e-3);
    +stewart = initializeFramesPositions(stewart, 'H', 90e-3, 'MO_B', 45e-3);
     stewart = generateGeneralConfiguration(stewart);
     stewart = computeJointsPose(stewart);
     stewart = initializeStrutDynamics(stewart);
    -stewart = initializeJointDynamics(stewart, 'type_F', 'universal_p', 'type_M', 'spherical_p');
    +stewart = initializeJointDynamics(stewart, 'type_F', 'universal_p', 'type_M', 'spherical_p');
     stewart = initializeCylindricalPlatforms(stewart);
     stewart = initializeCylindricalStruts(stewart);
     stewart = computeJacobian(stewart);
     stewart = initializeStewartPose(stewart);
    -stewart = initializeInertialSensor(stewart, 'type', 'none');
    +stewart = initializeInertialSensor(stewart, 'type', 'none');
     
    -
    ground = initializeGround('type', 'rigid', 'rot_point', stewart.platform_F.FO_A);
    -payload = initializePayload('type', 'none');
    -controller = initializeController('type', 'open-loop');
    +
    ground = initializeGround('type', 'rigid', 'rot_point', stewart.platform_F.FO_A);
    +payload = initializePayload('type', 'none');
    +controller = initializeController('type', 'open-loop');
     
    @@ -494,18 +281,18 @@ controller = initializeController('type',
    -
    %% Name of the Simulink File
    -mdl = 'stewart_platform_model';
    +
    %% Name of the Simulink File
    +mdl = 'stewart_platform_model';
     
    -%% Input/Output definition
    +%% Input/Output definition
     clear io; io_i = 1;
    -io(io_i) = linio([mdl, '/Controller'],        1, 'openinput');  io_i = io_i + 1; % Actuator Force Inputs [N]
    -io(io_i) = linio([mdl, '/Stewart Platform'],  1, 'openoutput', [], 'Taum'); io_i = io_i + 1; % Force Sensor Outputs [N]
    +io(io_i) = linio([mdl, '/Controller'],        1, 'openinput');  io_i = io_i + 1; % Actuator Force Inputs [N]
    +io(io_i) = linio([mdl, '/Stewart Platform'],  1, 'openoutput', [], 'Taum'); io_i = io_i + 1; % Force Sensor Outputs [N]
     
    -%% Run the linearization
    +%% Run the linearization
     G = linearize(mdl, io);
    -G.InputName  = {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'};
    -G.OutputName = {'Fm1', 'Fm2', 'Fm3', 'Fm4', 'Fm5', 'Fm6'};
    +G.InputName  = {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'};
    +G.OutputName = {'Fm1', 'Fm2', 'Fm3', 'Fm4', 'Fm5', 'Fm6'};
     
    @@ -521,17 +308,17 @@ The transfer function from actuator forces to force sensors is shown in Figure <
    -
    -

    2.2 Effect of the Flexible Joint stiffness and Actuator amplification on the Dynamics

    +
    +

    2.2 Effect of the Flexible Joint stiffness and Actuator amplification on the Dynamics

    We add some stiffness and damping in the flexible joints and we re-identify the dynamics.

    -
    stewart = initializeJointDynamics(stewart, 'type_F', 'universal', 'type_M', 'spherical');
    +
    stewart = initializeJointDynamics(stewart, 'type_F', 'universal', 'type_M', 'spherical');
     Gf = linearize(mdl, io);
    -Gf.InputName  = {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'};
    -Gf.OutputName = {'Fm1', 'Fm2', 'Fm3', 'Fm4', 'Fm5', 'Fm6'};
    +Gf.InputName  = {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'};
    +Gf.OutputName = {'Fm1', 'Fm2', 'Fm3', 'Fm4', 'Fm5', 'Fm6'};
     
    @@ -541,8 +328,8 @@ We now use the amplified actuators and re-identify the dynamics
    stewart = initializeAmplifiedStrutDynamics(stewart);
     Ga = linearize(mdl, io);
    -Ga.InputName  = {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'};
    -Ga.OutputName = {'Fm1', 'Fm2', 'Fm3', 'Fm4', 'Fm5', 'Fm6'};
    +Ga.InputName  = {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'};
    +Ga.OutputName = {'Fm1', 'Fm2', 'Fm3', 'Fm4', 'Fm5', 'Fm6'};
     
    @@ -558,8 +345,8 @@ The new dynamics from force actuator to force sensor is shown in Figure
    -
    -

    2.3 Obtained Damping

    +
    -
    -

    2.4 Conclusion

    +
    +

    2.4 Conclusion

    @@ -624,31 +411,31 @@ To run the script, open the Simulink Project, and type run active_damping_

    -
    -

    3.1 Identification of the Dynamics with perfect Joints

    +
    +

    3.1 Identification of the Dynamics with perfect Joints

    We first initialize the Stewart platform without joint stiffness.

    stewart = initializeStewartPlatform();
    -stewart = initializeFramesPositions(stewart, 'H', 90e-3, 'MO_B', 45e-3);
    +stewart = initializeFramesPositions(stewart, 'H', 90e-3, 'MO_B', 45e-3);
     stewart = generateGeneralConfiguration(stewart);
     stewart = computeJointsPose(stewart);
     stewart = initializeStrutDynamics(stewart);
    -stewart = initializeJointDynamics(stewart, 'type_F', 'universal_p', 'type_M', 'spherical_p');
    +stewart = initializeJointDynamics(stewart, 'type_F', 'universal_p', 'type_M', 'spherical_p');
     stewart = initializeCylindricalPlatforms(stewart);
     stewart = initializeCylindricalStruts(stewart);
     stewart = computeJacobian(stewart);
     stewart = initializeStewartPose(stewart);
    -stewart = initializeInertialSensor(stewart, 'type', 'none');
    +stewart = initializeInertialSensor(stewart, 'type', 'none');
     
    -
    ground = initializeGround('type', 'rigid', 'rot_point', stewart.platform_F.FO_A);
    -payload = initializePayload('type', 'none');
    -controller = initializeController('type', 'open-loop');
    +
    ground = initializeGround('type', 'rigid', 'rot_point', stewart.platform_F.FO_A);
    +payload = initializePayload('type', 'none');
    +controller = initializeController('type', 'open-loop');
     
    @@ -656,22 +443,22 @@ controller = initializeController('type',
    -
    %% Options for Linearized
    +
    %% Options for Linearized
     options = linearizeOptions;
     options.SampleTime = 0;
     
    -%% Name of the Simulink File
    -mdl = 'stewart_platform_model';
    +%% Name of the Simulink File
    +mdl = 'stewart_platform_model';
     
    -%% Input/Output definition
    +%% Input/Output definition
     clear io; io_i = 1;
    -io(io_i) = linio([mdl, '/Controller'],        1, 'openinput');  io_i = io_i + 1; % Actuator Force Inputs [N]
    -io(io_i) = linio([mdl, '/Stewart Platform'],  1, 'openoutput', [], 'dLm'); io_i = io_i + 1; % Relative Displacement Outputs [m]
    +io(io_i) = linio([mdl, '/Controller'],        1, 'openinput');  io_i = io_i + 1; % Actuator Force Inputs [N]
    +io(io_i) = linio([mdl, '/Stewart Platform'],  1, 'openoutput', [], 'dLm'); io_i = io_i + 1; % Relative Displacement Outputs [m]
     
    -%% Run the linearization
    +%% Run the linearization
     G = linearize(mdl, io, options);
    -G.InputName  = {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'};
    -G.OutputName = {'Dm1', 'Dm2', 'Dm3', 'Dm4', 'Dm5', 'Dm6'};
    +G.InputName  = {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'};
    +G.OutputName = {'Dm1', 'Dm2', 'Dm3', 'Dm4', 'Dm5', 'Dm6'};
     
    @@ -688,17 +475,17 @@ The transfer function from actuator forces to relative motion sensors is shown i
    -
    -

    3.2 Effect of the Flexible Joint stiffness and Actuator amplification on the Dynamics

    +
    +

    3.2 Effect of the Flexible Joint stiffness and Actuator amplification on the Dynamics

    We add some stiffness and damping in the flexible joints and we re-identify the dynamics.

    -
    stewart = initializeJointDynamics(stewart, 'type_F', 'universal', 'type_M', 'spherical');
    +
    stewart = initializeJointDynamics(stewart, 'type_F', 'universal', 'type_M', 'spherical');
     Gf = linearize(mdl, io, options);
    -Gf.InputName  = {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'};
    -Gf.OutputName = {'Dm1', 'Dm2', 'Dm3', 'Dm4', 'Dm5', 'Dm6'};
    +Gf.InputName  = {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'};
    +Gf.OutputName = {'Dm1', 'Dm2', 'Dm3', 'Dm4', 'Dm5', 'Dm6'};
     
    @@ -708,8 +495,8 @@ We now use the amplified actuators and re-identify the dynamics
    stewart = initializeAmplifiedStrutDynamics(stewart);
     Ga = linearize(mdl, io, options);
    -Ga.InputName  = {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'};
    -Ga.OutputName = {'Dm1', 'Dm2', 'Dm3', 'Dm4', 'Dm5', 'Dm6'};
    +Ga.InputName  = {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'};
    +Ga.OutputName = {'Dm1', 'Dm2', 'Dm3', 'Dm4', 'Dm5', 'Dm6'};
     
    @@ -725,8 +512,8 @@ The new dynamics from force actuator to relative motion sensor is shown in Figur
    -
    -

    3.3 Obtained Damping

    +
    +

    3.3 Obtained Damping

    The control is a performed in a decentralized manner. @@ -751,8 +538,8 @@ The root locus is shown in figure 10.

    -
    -

    3.4 Conclusion

    +
    +

    3.4 Conclusion

    @@ -776,16 +563,16 @@ We first initialize the Stewart platform without joint stiffness.

    stewart = initializeStewartPlatform();
    -stewart = initializeFramesPositions(stewart, 'H', 90e-3, 'MO_B', 45e-3);
    +stewart = initializeFramesPositions(stewart, 'H', 90e-3, 'MO_B', 45e-3);
     stewart = generateGeneralConfiguration(stewart);
     stewart = computeJointsPose(stewart);
     stewart = initializeStrutDynamics(stewart);
    -stewart = initializeJointDynamics(stewart, 'type_F', 'universal_p', 'type_M', 'spherical_p');
    +stewart = initializeJointDynamics(stewart, 'type_F', 'universal_p', 'type_M', 'spherical_p');
     stewart = initializeCylindricalPlatforms(stewart);
     stewart = initializeCylindricalStruts(stewart);
     stewart = computeJacobian(stewart);
     stewart = initializeStewartPose(stewart);
    -stewart = initializeInertialSensor(stewart, 'type', 'none');
    +stewart = initializeInertialSensor(stewart, 'type', 'none');
     
    @@ -793,9 +580,9 @@ stewart = initializeInertialSensor(stewart, 'type'
    -
    ground = initializeGround('type', 'rigid', 'rot_point', stewart.platform_F.FO_A);
    -payload = initializePayload('type', 'none');
    -controller = initializeController('type', 'open-loop');
    +
    ground = initializeGround('type', 'rigid', 'rot_point', stewart.platform_F.FO_A);
    +payload = initializePayload('type', 'none');
    +controller = initializeController('type', 'open-loop');
     
    @@ -808,7 +595,7 @@ controller = initializeController('type',
    -
    controller = initializeController('type', 'open-loop');
    +
    controller = initializeController('type', 'open-loop');
     [T_ol, T_norm_ol, freqs] = computeTransmissibility();
     [C_ol, C_norm_ol, freqs] = computeCompliance();
     
    @@ -818,11 +605,11 @@ Let’s first identify the transmissibility and compliance in the open-loop Now, let’s identify the transmissibility and compliance for the Integral Force Feedback architecture.

    -
    controller = initializeController('type', 'iff');
    -K_iff = (1e4/s)*eye(6);
    +
    controller = initializeController('type', 'iff');
    +K_iff = (1e4/s)*eye(6);
     
    -[T_iff, T_norm_iff, ~] = computeTransmissibility();
    -[C_iff, C_norm_iff, ~] = computeCompliance();
    +[T_iff, T_norm_iff, ~] = computeTransmissibility();
    +[C_iff, C_norm_iff, ~] = computeCompliance();
     
    @@ -830,11 +617,11 @@ K_iff = (1e4/s)*eye( And for the Direct Velocity Feedback.

    -
    controller = initializeController('type', 'dvf');
    -K_dvf = 1e4*s/(1+s/2/pi/5000)*eye(6);
    +
    controller = initializeController('type', 'dvf');
    +K_dvf = 1e4*s/(1+s/2/pi/5000)*eye(6);
     
    -[T_dvf, T_norm_dvf, ~] = computeTransmissibility();
    -[C_dvf, C_norm_dvf, ~] = computeCompliance();
    +[T_dvf, T_norm_dvf, ~] = computeTransmissibility();
    +[C_dvf, C_norm_dvf, ~] = computeCompliance();
     
    @@ -869,7 +656,7 @@ K_dvf = 1e4*s/(1

    Author: Dehaeze Thomas

    -

    Created: 2020-03-13 ven. 10:34

    +

    Created: 2020-08-05 mer. 13:27

    diff --git a/docs/control-tracking.html b/docs/control-tracking.html index 22f7fbd..5f8ea6a 100644 --- a/docs/control-tracking.html +++ b/docs/control-tracking.html @@ -1,239 +1,27 @@ - - + - Stewart Platform - Tracking Control - - - - +
    @@ -248,42 +36,42 @@
  • 3. Hybrid Control Architecture - HAC-LAC with relative DVF
  • 4. Comparison of all the methods
  • @@ -351,8 +139,8 @@ The control configuration are compare in section 4.

    -
    -

    1.1 Control Schematic

    +
    +

    1.1 Control Schematic

    The control architecture is shown in Figure 1. @@ -375,31 +163,31 @@ Then, a diagonal (decentralized) controller \(\bm{K}_\mathcal{L}\) is used such

    -
    -

    1.2 Initialize the Stewart platform

    +
    +

    1.2 Initialize the Stewart platform

    -
    % Stewart Platform
    +
    % Stewart Platform
     stewart = initializeStewartPlatform();
    -stewart = initializeFramesPositions(stewart, 'H', 90e-3, 'MO_B', 45e-3);
    +stewart = initializeFramesPositions(stewart, 'H', 90e-3, 'MO_B', 45e-3);
     stewart = generateGeneralConfiguration(stewart);
     stewart = computeJointsPose(stewart);
     stewart = initializeStrutDynamics(stewart);
    -stewart = initializeJointDynamics(stewart, 'type_F', 'universal_p', 'type_M', 'spherical_p');
    +stewart = initializeJointDynamics(stewart, 'type_F', 'universal_p', 'type_M', 'spherical_p');
     stewart = initializeCylindricalPlatforms(stewart);
     stewart = initializeCylindricalStruts(stewart);
     stewart = computeJacobian(stewart);
     stewart = initializeStewartPose(stewart);
    -stewart = initializeInertialSensor(stewart, 'type', 'accelerometer', 'freq', 5e3);
    +stewart = initializeInertialSensor(stewart, 'type', 'accelerometer', 'freq', 5e3);
     
    -% Ground and Payload
    -ground = initializeGround('type', 'rigid');
    -payload = initializePayload('type', 'none');
    +% Ground and Payload
    +ground = initializeGround('type', 'rigid');
    +payload = initializePayload('type', 'none');
     
    -% Controller
    -controller = initializeController('type', 'open-loop');
    +% Controller
    +controller = initializeController('type', 'open-loop');
     
    -% Disturbances and References
    +% Disturbances and References
     disturbances = initializeDisturbances();
     references = initializeReferences(stewart);
     
    @@ -407,32 +195,32 @@ references = initializeReferences(stewart);
    -
    -

    1.3 Identification of the plant

    +
    +

    1.3 Identification of the plant

    Let’s identify the transfer function from \(\bm{\tau}\) to \(\bm{\mathcal{L}}\).

    -
    %% Name of the Simulink File
    -mdl = 'stewart_platform_model';
    +
    %% Name of the Simulink File
    +mdl = 'stewart_platform_model';
     
    -%% Input/Output definition
    +%% Input/Output definition
     clear io; io_i = 1;
    -io(io_i) = linio([mdl, '/Controller'],        1, 'openinput');  io_i = io_i + 1; % Actuator Force Inputs [N]
    -io(io_i) = linio([mdl, '/Stewart Platform'],  1, 'openoutput', [], 'dLm'); io_i = io_i + 1; % Relative Displacement Outputs [m]
    +io(io_i) = linio([mdl, '/Controller'],        1, 'openinput');  io_i = io_i + 1; % Actuator Force Inputs [N]
    +io(io_i) = linio([mdl, '/Stewart Platform'],  1, 'openoutput', [], 'dLm'); io_i = io_i + 1; % Relative Displacement Outputs [m]
     
    -%% Run the linearization
    +%% Run the linearization
     G = linearize(mdl, io);
    -G.InputName  = {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'};
    -G.OutputName = {'L1', 'L2', 'L3', 'L4', 'L5', 'L6'};
    +G.InputName  = {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'};
    +G.OutputName = {'L1', 'L2', 'L3', 'L4', 'L5', 'L6'};
     
    -
    -

    1.4 Plant Analysis

    +
    +

    1.4 Plant Analysis

    The diagonal and off-diagonal terms of the plant are shown in Figure 2. @@ -452,8 +240,8 @@ We see that the plant is decoupled at low frequency which indicate that decentra

    -
    -

    1.5 Controller Design

    +
    +

    1.5 Controller Design

    The controller consists of: @@ -468,8 +256,8 @@ The obtained loop gains corresponding to the diagonal elements are shown in Figu

    -
    wc = 2*pi*30;
    -Kl = diag(1./diag(abs(freqresp(G, wc)))) * wc/s * 1/(1 + s/3/wc);
    +
    wc = 2*pi*30;
    +Kl = diag(1./diag(abs(freqresp(G, wc)))) * wc/s * 1/(1 + s/3/wc);
     
    @@ -482,22 +270,22 @@ Kl = diag(1./diag(abs(freqresp(G, wc))))
    -
    -

    1.6 Simulation

    +
    +

    1.6 Simulation

    Let’s define some reference path to follow.

    -
    t = [0:1e-4:10];
    +
    t = [0:1e-4:10];
     
     r = zeros(6, length(t));
     
    -r(1, :) = 1e-3.*t.*sin(2*pi*t);
    -r(2, :) = 1e-3.*t.*cos(2*pi*t);
    -r(3, :) = 1e-3.*t;
    +r(1, :) = 1e-3.*t.*sin(2*pi*t);
    +r(2, :) = 1e-3.*t.*cos(2*pi*t);
    +r(3, :) = 1e-3.*t;
     
    -references = initializeReferences(stewart, 't', t, 'r', r);
    +references = initializeReferences(stewart, 't', t, 'r', r);
     
    @@ -506,11 +294,11 @@ The reference path is shown in Figure 4.

    -
    figure;
    -plot3(squeeze(references.r.Data(1,1,:)), squeeze(references.r.Data(2,1,:)), squeeze(references.r.Data(3,1,:)));
    -xlabel('X [m]');
    -ylabel('Y [m]');
    -zlabel('Z [m]');
    +
    figure;
    +plot3(squeeze(references.r.Data(1,1,:)), squeeze(references.r.Data(2,1,:)), squeeze(references.r.Data(3,1,:)));
    +xlabel('X [m]');
    +ylabel('Y [m]');
    +zlabel('Z [m]');
     
    @@ -522,19 +310,19 @@ zlabel('Z [m]');
    -
    controller = initializeController('type', 'ref-track-L');
    +
    controller = initializeController('type', 'ref-track-L');
     
    -
    set_param('stewart_platform_model', 'StopTime', '10')
    -sim('stewart_platform_model');
    +
    set_param('stewart_platform_model', 'StopTime', '10')
    +sim('stewart_platform_model');
     simout_D = simout;
     
    -
    save('./mat/control_tracking.mat', 'simout_D', '-append');
    +
    save('./mat/control_tracking.mat', 'simout_D', '-append');
     
    @@ -548,14 +336,14 @@ The reference path and the position of the mobile platform are shown in Figure <

    -
    figure;
    +
    figure;
     hold on;
    -plot3(simout_D.x.Xr.Data(:, 1), simout_D.x.Xr.Data(:, 2), simout_D.x.Xr.Data(:, 3), 'k-');
    -plot3(squeeze(references.r.Data(1,1,:)), squeeze(references.r.Data(2,1,:)), squeeze(references.r.Data(3,1,:)), '--');
    +plot3(simout_D.x.Xr.Data(:, 1), simout_D.x.Xr.Data(:, 2), simout_D.x.Xr.Data(:, 3), 'k-');
    +plot3(squeeze(references.r.Data(1,1,:)), squeeze(references.r.Data(2,1,:)), squeeze(references.r.Data(3,1,:)), '--');
     hold off;
    -xlabel('X [m]'); ylabel('Y [m]'); zlabel('Z [m]');
    +xlabel('X [m]'); ylabel('Y [m]'); zlabel('Z [m]');
     view([1,1,1])
    -zlim([0, inf]);
    +zlim([0, inf]);
     
    @@ -582,8 +370,8 @@ zlim([0, inf]);
    -
    -

    1.8 Conclusion

    +
    +

    1.8 Conclusion

    Such control architecture is easy to implement and give good results. @@ -604,8 +392,8 @@ However, as \(\mathcal{X}\) is not directly measured, it is possible that import

    -
    -

    2.1 Control Schematic

    +
    +

    2.1 Control Schematic

    The centralized controller takes the position error \(\bm{\epsilon}_\mathcal{X}\) as an inputs and generate actuator forces \(\bm{\tau}\) (see Figure 8). @@ -643,31 +431,31 @@ It is indeed a more complex computation explained in section -

    2.2 Initialize the Stewart platform

    +
    +

    2.2 Initialize the Stewart platform

    -
    % Stewart Platform
    +
    % Stewart Platform
     stewart = initializeStewartPlatform();
    -stewart = initializeFramesPositions(stewart, 'H', 90e-3, 'MO_B', 45e-3);
    +stewart = initializeFramesPositions(stewart, 'H', 90e-3, 'MO_B', 45e-3);
     stewart = generateGeneralConfiguration(stewart);
     stewart = computeJointsPose(stewart);
     stewart = initializeStrutDynamics(stewart);
    -stewart = initializeJointDynamics(stewart, 'type_F', 'universal_p', 'type_M', 'spherical_p');
    +stewart = initializeJointDynamics(stewart, 'type_F', 'universal_p', 'type_M', 'spherical_p');
     stewart = initializeCylindricalPlatforms(stewart);
     stewart = initializeCylindricalStruts(stewart);
     stewart = computeJacobian(stewart);
     stewart = initializeStewartPose(stewart);
    -stewart = initializeInertialSensor(stewart, 'type', 'accelerometer', 'freq', 5e3);
    +stewart = initializeInertialSensor(stewart, 'type', 'accelerometer', 'freq', 5e3);
     
    -% Ground and Payload
    -ground = initializeGround('type', 'rigid');
    -payload = initializePayload('type', 'none');
    +% Ground and Payload
    +ground = initializeGround('type', 'rigid');
    +payload = initializePayload('type', 'none');
     
    -% Controller
    -controller = initializeController('type', 'open-loop');
    +% Controller
    +controller = initializeController('type', 'open-loop');
     
    -% Disturbances and References
    +% Disturbances and References
     disturbances = initializeDisturbances();
     references = initializeReferences(stewart);
     
    @@ -675,25 +463,25 @@ references = initializeReferences(stewart);
    -
    -

    2.3 Identification of the plant

    +
    -
    -

    2.4.1 Control Architecture

    +
    +

    2.4.1 Control Architecture

    The pose error \(\bm{\epsilon}_\mathcal{X}\) is first converted in the frame of the leg by using the Jacobian matrix. @@ -728,16 +516,16 @@ Note here that the transformation from the pose error \(\bm{\epsilon}_\mathcal{X

    -
    -

    2.4.2 Plant Analysis

    +
    +

    2.4.2 Plant Analysis

    We now multiply the plant by the Jacobian matrix as shown in Figure 9 to obtain a more diagonal plant.

    -
    Gl = stewart.kinematics.J*G;
    -Gl.OutputName  = {'D1', 'D2', 'D3', 'D4', 'D5', 'D6'};
    +
    Gl = stewart.kinematics.J*G;
    +Gl.OutputName  = {'D1', 'D2', 'D3', 'D4', 'D5', 'D6'};
     
    @@ -751,7 +539,7 @@ This will simplify the design of the controller as all the elements of the diago

    plant_centralized_L.png

    -

    Figure 10: Diagonal and off-diagonal elements of the plant \(\bm{K}\bm{G}\) (png, pdf)

    +

    Figure 10: Diagonal and off-diagonal elements of the plant \(\bm{J}\bm{G}\) (png, pdf)

    @@ -769,8 +557,8 @@ Thus \(J \cdot G(\omega = 0) = J \cdot \frac{\delta\bm{\mathcal{X}}}{\delta\bm{\

    -
    -

    2.4.3 Controller Design

    +
    +

    2.4.3 Controller Design

    The controller consists of: @@ -785,8 +573,8 @@ The obtained loop gains corresponding to the diagonal elements are shown in Figu

    -
    wc = 2*pi*30;
    -Kl = diag(1./diag(abs(freqresp(Gl, wc)))) * wc/s * 1/(1 + s/3/wc);
    +
    wc = 2*pi*30;
    +Kl = diag(1./diag(abs(freqresp(Gl, wc)))) * wc/s * 1/(1 + s/3/wc);
     
    @@ -801,33 +589,33 @@ Kl = diag(1./diag(abs(freqresp(Gl, wc))))
    -
    K = Kl*stewart.kinematics.J;
    +
    K = Kl*stewart.kinematics.J;
     
    -
    -

    2.4.4 Simulation

    +
    +

    2.4.4 Simulation

    We specify the reference path to follow.

    -
    t = [0:1e-4:10];
    +
    t = [0:1e-4:10];
     
     r = zeros(6, length(t));
     
    -r(1, :) = 1e-3.*t.*sin(2*pi*t);
    -r(2, :) = 1e-3.*t.*cos(2*pi*t);
    -r(3, :) = 1e-3.*t;
    +r(1, :) = 1e-3.*t.*sin(2*pi*t);
    +r(2, :) = 1e-3.*t.*cos(2*pi*t);
    +r(3, :) = 1e-3.*t;
     
    -references = initializeReferences(stewart, 't', t, 'r', r);
    +references = initializeReferences(stewart, 't', t, 'r', r);
     
    -
    controller = initializeController('type', 'ref-track-X');
    +
    controller = initializeController('type', 'ref-track-X');
     
    @@ -835,10 +623,10 @@ references = initializeReferences(stewart, 't', We run the simulation and we save the results.

    -
    set_param('stewart_platform_model', 'StopTime', '10')
    -sim('stewart_platform_model')
    +
    set_param('stewart_platform_model', 'StopTime', '10')
    +sim('stewart_platform_model')
     simout_L = simout;
    -save('./mat/control_tracking.mat', 'simout_L', '-append');
    +save('./mat/control_tracking.mat', 'simout_L', '-append');
     
    @@ -852,8 +640,8 @@ save('./mat/control_tracking.mat',

    -
    -

    2.5.1 Control Architecture

    +
    +

    2.5.1 Control Architecture

    A diagonal controller \(\bm{K}_\mathcal{X}\) take the pose error \(\bm{\epsilon}_\mathcal{X}\) and generate cartesian forces \(\bm{\mathcal{F}}\) that are then converted to actuators forces using the Jacobian as shown in Figure e 12. @@ -872,16 +660,16 @@ The final implemented controller is \(\bm{K} = \bm{J}^{-T} \cdot \bm{K}_\mathcal

    -
    -

    2.5.2 Plant Analysis

    +
    +

    2.5.2 Plant Analysis

    We now multiply the plant by the Jacobian matrix as shown in Figure 12 to obtain a more diagonal plant.

    -
    Gx = G*inv(stewart.kinematics.J');
    -Gx.InputName  = {'Fx', 'Fy', 'Fz', 'Mx', 'My', 'Mz'};
    +
    Gx = G*inv(stewart.kinematics.J');
    +Gx.InputName  = {'Fx', 'Fy', 'Fz', 'Mx', 'My', 'Mz'};
     
    @@ -988,8 +776,8 @@ This control architecture can also give a dynamically decoupled plant if the Cen
    -
    -

    2.5.3 Controller Design

    +
    +

    2.5.3 Controller Design

    The controller consists of: @@ -1004,8 +792,8 @@ The obtained loop gains corresponding to the diagonal elements are shown in Figu

    -
    wc = 2*pi*30;
    -Kx = diag(1./diag(abs(freqresp(Gx, wc)))) * wc/s * 1/(1 + s/3/wc);
    +
    wc = 2*pi*30;
    +Kx = diag(1./diag(abs(freqresp(Gx, wc)))) * wc/s * 1/(1 + s/3/wc);
     
    @@ -1020,33 +808,33 @@ Kx = diag(1./diag(abs(freqresp(Gx, wc))))
    -
    K = inv(stewart.kinematics.J')*Kx;
    +
    K = inv(stewart.kinematics.J')*Kx;
     
    -
    -

    2.5.4 Simulation

    +
    +

    2.5.4 Simulation

    We specify the reference path to follow.

    -
    t = [0:1e-4:10];
    +
    t = [0:1e-4:10];
     
     r = zeros(6, length(t));
     
    -r(1, :) = 1e-3.*t.*sin(2*pi*t);
    -r(2, :) = 1e-3.*t.*cos(2*pi*t);
    -r(3, :) = 1e-3.*t;
    +r(1, :) = 1e-3.*t.*sin(2*pi*t);
    +r(2, :) = 1e-3.*t.*cos(2*pi*t);
    +r(3, :) = 1e-3.*t;
     
    -references = initializeReferences(stewart, 't', t, 'r', r);
    +references = initializeReferences(stewart, 't', t, 'r', r);
     
    -
    controller = initializeController('type', 'ref-track-X');
    +
    controller = initializeController('type', 'ref-track-X');
     
    @@ -1054,10 +842,10 @@ references = initializeReferences(stewart, 't', We run the simulation and we save the results.

    -
    set_param('stewart_platform_model', 'StopTime', '10')
    -sim('stewart_platform_model')
    +
    set_param('stewart_platform_model', 'StopTime', '10')
    +sim('stewart_platform_model')
     simout_X = simout;
    -save('./mat/control_tracking.mat', 'simout_X', '-append');
    +save('./mat/control_tracking.mat', 'simout_X', '-append');
     
    @@ -1071,8 +859,8 @@ save('./mat/control_tracking.mat',

    -
    -

    2.6.1 Control Architecture

    +
    +

    2.6.1 Control Architecture

    The plant \(\bm{G}\) is pre-multiply by \(\bm{G}^{-1}(\omega = 0)\) such that the “shaped plant” \(\bm{G}_0 = \bm{G} \bm{G}^{-1}(\omega = 0)\) is diagonal at low frequency. @@ -1095,8 +883,8 @@ The control architecture is shown in Figure 15.

    -
    -

    2.6.2 Plant Analysis

    +
    +

    2.6.2 Plant Analysis

    The plant is pre-multiplied by \(\bm{G}^{-1}(\omega = 0)\). @@ -1104,7 +892,7 @@ The diagonal and off-diagonal elements of the shaped plant are shown in Figure <

    -
    G0 = G*inv(freqresp(G, 0));
    +
    G0 = G*inv(freqresp(G, 0));
     
    @@ -1117,8 +905,8 @@ The diagonal and off-diagonal elements of the shaped plant are shown in Figure <
    -
    -

    2.6.3 Controller Design

    +
    +

    2.6.3 Controller Design

    We have that: @@ -1184,8 +972,8 @@ This error is much lower when using the diagonal control in the frame of the leg

    -
    -

    2.8 Conclusion

    +
    +

    2.8 Conclusion

    Both control architecture gives similar results even tough the control in the Leg’s frame gives slightly better results. @@ -1268,8 +1056,8 @@ Thus, this method should be quite robust against parameter variation (e.g. the p

    -
    -

    3.1 Control Schematic

    +
    +

    3.1 Control Schematic

    Let’s consider the control schematic shown in Figure 19. @@ -1310,31 +1098,31 @@ This second loop is responsible for the reference tracking.

    -
    -

    3.2 Initialize the Stewart platform

    +
    +

    3.2 Initialize the Stewart platform

    -
    % Stewart Platform
    +
    % Stewart Platform
     stewart = initializeStewartPlatform();
    -stewart = initializeFramesPositions(stewart, 'H', 90e-3, 'MO_B', 45e-3);
    +stewart = initializeFramesPositions(stewart, 'H', 90e-3, 'MO_B', 45e-3);
     stewart = generateGeneralConfiguration(stewart);
     stewart = computeJointsPose(stewart);
     stewart = initializeStrutDynamics(stewart);
    -stewart = initializeJointDynamics(stewart, 'type_F', 'universal_p', 'type_M', 'spherical_p');
    +stewart = initializeJointDynamics(stewart, 'type_F', 'universal_p', 'type_M', 'spherical_p');
     stewart = initializeCylindricalPlatforms(stewart);
     stewart = initializeCylindricalStruts(stewart);
     stewart = computeJacobian(stewart);
     stewart = initializeStewartPose(stewart);
    -stewart = initializeInertialSensor(stewart, 'type', 'accelerometer', 'freq', 5e3);
    +stewart = initializeInertialSensor(stewart, 'type', 'accelerometer', 'freq', 5e3);
     
    -% Ground and Payload
    -ground = initializeGround('type', 'rigid');
    -payload = initializePayload('type', 'none');
    +% Ground and Payload
    +ground = initializeGround('type', 'rigid');
    +payload = initializePayload('type', 'none');
     
    -% Controller
    -controller = initializeController('type', 'open-loop');
    +% Controller
    +controller = initializeController('type', 'open-loop');
     
    -% Disturbances and References
    +% Disturbances and References
     disturbances = initializeDisturbances();
     references = initializeReferences(stewart);
     
    @@ -1346,32 +1134,32 @@ references = initializeReferences(stewart);

    3.3 First Control Loop - \(\bm{K}_\mathcal{L}\)

    -
    -

    3.3.1 Identification

    +
    +

    3.3.1 Identification

    Let’s identify the transfer function from \(\bm{\tau}\) to \(\bm{L}\).

    -
    %% Name of the Simulink File
    -mdl = 'stewart_platform_model';
    +
    %% Name of the Simulink File
    +mdl = 'stewart_platform_model';
     
    -%% Input/Output definition
    +%% Input/Output definition
     clear io; io_i = 1;
    -io(io_i) = linio([mdl, '/Controller'],        1, 'openinput');  io_i = io_i + 1; % Actuator Force Inputs [N]
    -io(io_i) = linio([mdl, '/Stewart Platform'],  1, 'openoutput', [], 'dLm'); io_i = io_i + 1; % Relative Displacement Outputs [m]
    +io(io_i) = linio([mdl, '/Controller'],        1, 'openinput');  io_i = io_i + 1; % Actuator Force Inputs [N]
    +io(io_i) = linio([mdl, '/Stewart Platform'],  1, 'openoutput', [], 'dLm'); io_i = io_i + 1; % Relative Displacement Outputs [m]
     
    -%% Run the linearization
    +%% Run the linearization
     Gl = linearize(mdl, io);
    -Gl.InputName  = {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'};
    -Gl.OutputName = {'L1', 'L2', 'L3', 'L4', 'L5', 'L6'};
    +Gl.InputName  = {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'};
    +Gl.OutputName = {'L1', 'L2', 'L3', 'L4', 'L5', 'L6'};
     
    -
    -

    3.3.2 Obtained Plant

    +
    +

    3.3.2 Obtained Plant

    The obtained plant is shown in Figure 20. @@ -1386,8 +1174,8 @@ The obtained plant is shown in Figure 20.

    -
    -

    3.3.3 Controller Design

    +
    +

    3.3.3 Controller Design

    We apply a decentralized (diagonal) direct velocity feedback. @@ -1401,7 +1189,7 @@ The obtain loop gain is shown in Figure 21.

    -
    Kl = 1e4 * s / (1 + s/2/pi/1e4) * eye(6);
    +
    Kl = 1e4 * s / (1 + s/2/pi/1e4) * eye(6);
     
    @@ -1419,43 +1207,43 @@ The obtain loop gain is shown in Figure 21.

    3.4 Second Control Loop - \(\bm{K}_\mathcal{X}\)

    -
    -

    3.4.1 Identification

    +
    +

    3.4.1 Identification

    Kx = tf(zeros(6));
     
    -controller = initializeController('type', 'ref-track-hac-dvf');
    +controller = initializeController('type', 'ref-track-hac-dvf');
     
    -
    %% Name of the Simulink File
    -mdl = 'stewart_platform_model';
    +
    %% Name of the Simulink File
    +mdl = 'stewart_platform_model';
     
    -%% Input/Output definition
    +%% Input/Output definition
     clear io; io_i = 1;
    -io(io_i) = linio([mdl, '/Controller'],              1, 'input');  io_i = io_i + 1; % Actuator Force Inputs [N]
    -io(io_i) = linio([mdl, '/Relative Motion Sensor'],  1, 'openoutput'); io_i = io_i + 1; % Relative Displacement Outputs [m]
    +io(io_i) = linio([mdl, '/Controller'],              1, 'input');  io_i = io_i + 1; % Actuator Force Inputs [N]
    +io(io_i) = linio([mdl, '/Relative Motion Sensor'],  1, 'openoutput'); io_i = io_i + 1; % Relative Displacement Outputs [m]
     
    -%% Run the linearization
    +%% Run the linearization
     G = linearize(mdl, io);
    -G.InputName  = {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'};
    -G.OutputName = {'Dx', 'Dy', 'Dz', 'Rx', 'Ry', 'Rz'};
    +G.InputName  = {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'};
    +G.OutputName = {'Dx', 'Dy', 'Dz', 'Rx', 'Ry', 'Rz'};
     
    -
    -

    3.4.2 Obtained Plant

    +
    +

    3.4.2 Obtained Plant

    We use the Jacobian matrix to apply forces in the cartesian frame.

    -
    Gx = G*inv(stewart.kinematics.J');
    -Gx.InputName  = {'Fx', 'Fy', 'Fz', 'Mx', 'My', 'Mz'};
    +
    Gx = G*inv(stewart.kinematics.J');
    +Gx.InputName  = {'Fx', 'Fy', 'Fz', 'Mx', 'My', 'Mz'};
     
    @@ -1471,8 +1259,8 @@ The obtained plant is shown in Figure 22.
    -
    -

    3.4.3 Controller Design

    +
    +

    3.4.3 Controller Design

    The controller consists of: @@ -1485,14 +1273,14 @@ The controller consists of:

    -
    wc = 2*pi*200; % Bandwidth Bandwidth [rad/s]
    +
    wc = 2*pi*200; % Bandwidth Bandwidth [rad/s]
     
    -h = 3; % Lead parameter
    +h = 3; % Lead parameter
     
    -Kx = (1/h) * (1 + s/wc*h)/(1 + s/wc/h) * wc/s * ((s/wc*2 + 1)/(s/wc*2)) * (1/(1 + s/wc/3));
    +Kx = (1/h) * (1 + s/wc*h)/(1 + s/wc/h) * wc/s * ((s/wc*2 + 1)/(s/wc*2)) * (1/(1 + s/wc/3));
     
    -% Normalization of the gain of have a loop gain of 1 at frequency wc
    -Kx = Kx.*diag(1./diag(abs(freqresp(Gx*Kx, wc))));
    +% Normalization of the gain of have a loop gain of 1 at frequency wc
    +Kx = Kx.*diag(1./diag(abs(freqresp(Gx*Kx, wc))));
     
    @@ -1507,7 +1295,7 @@ Kx = Kx.*diag(1./dia Then we include the Jacobian in the controller matrix.

    -
    Kx = inv(stewart.kinematics.J')*Kx;
    +
    Kx = inv(stewart.kinematics.J')*Kx;
     
    @@ -1521,15 +1309,15 @@ Then we include the Jacobian in the controller matrix. We specify the reference path to follow.

    -
    t = [0:1e-4:10];
    +
    t = [0:1e-4:10];
     
     r = zeros(6, length(t));
     
    -r(1, :) = 1e-3.*t.*sin(2*pi*t);
    -r(2, :) = 1e-3.*t.*cos(2*pi*t);
    -r(3, :) = 1e-3.*t;
    +r(1, :) = 1e-3.*t.*sin(2*pi*t);
    +r(2, :) = 1e-3.*t.*cos(2*pi*t);
    +r(3, :) = 1e-3.*t;
     
    -references = initializeReferences(stewart, 't', t, 'r', r);
    +references = initializeReferences(stewart, 't', t, 'r', r);
     
    @@ -1537,10 +1325,10 @@ references = initializeReferences(stewart, 't', We run the simulation and we save the results.

    -
    set_param('stewart_platform_model', 'StopTime', '10')
    -sim('stewart_platform_model')
    +
    set_param('stewart_platform_model', 'StopTime', '10')
    +sim('stewart_platform_model')
     simout_H = simout;
    -save('./mat/control_tracking.mat', 'simout_H', '-append');
    +save('./mat/control_tracking.mat', 'simout_H', '-append');
     
    @@ -1557,8 +1345,8 @@ The obtained position error is shown in Figure 24.
    -
    -

    3.6 Conclusion

    +
    +

    3.6 Conclusion

    @@ -1573,7 +1361,7 @@ The obtained position error is shown in Figure 24. Let’s load the simulation results and compare them in Figure 25.

    -
    load('./mat/control_tracking.mat', 'simout_D', 'simout_L', 'simout_X', 'simout_H');
    +
    load('./mat/control_tracking.mat', 'simout_D', 'simout_L', 'simout_X', 'simout_H');
     
    @@ -1613,7 +1401,7 @@ Reference Position with respect to fixed frame {W}: \({}^WT_R\)
    Dxr = 0;
     Dyr = 0;
     Dzr = 0.1;
    -Rxr = pi;
    +Rxr = pi;
     Ryr = 0;
     Rzr = 0;
     
    @@ -1626,7 +1414,7 @@ Measured Position with respect to fixed frame {W}: \({}^WT_M\)
    Dxm = 0;
     Dym = 0;
     Dzm = 0;
    -Rxm = pi;
    +Rxm = pi;
     Rym = 0;
     Rzm = 0;
     
    @@ -1637,19 +1425,19 @@ We measure the position and orientation (pose) of the element represented by the Thus we can compute the Homogeneous transformation matrix \({}^WT_M\).

    -
    %% Measured Pose
    +
    %% Measured Pose
     WTm = zeros(4,4);
     
    -WTm(1:3, 1:3) = [cos(Rzm) -sin(Rzm) 0;
    +WTm(1:3, 1:3) = [cos(Rzm) -sin(Rzm) 0;
          sin(Rzm)  cos(Rzm) 0;
    -     0        0         1] * ...
    +     0        0         1] * ...
         [cos(Rym)  0        sin(Rym);
          0        1        0;
    -     -sin(Rym)  0        cos(Rym)] * ...
    +     -sin(Rym)  0        cos(Rym)] * ...
         [1        0        0;
    -     0        cos(Rxm) -sin(Rxm);
    +     0        cos(Rxm) -sin(Rxm);
          0        sin(Rxm)  cos(Rxm)];
    -WTm(1:4, 4) = [Dxm ; Dym ; Dzm; 1];
    +WTm(1:4, 4) = [Dxm ; Dym ; Dzm; 1];
     
    @@ -1657,19 +1445,19 @@ WTm(1:4, 4) = [Dxm ; Dym ; Dzm; 1]; We can also compute the Homogeneous transformation matrix \({}^WT_R\) corresponding to the transformation required to go from fixed frame \(\{W\}\) to the wanted frame \(\{R\}\).

    -
    %% Reference Pose
    +
    %% Reference Pose
     WTr = zeros(4,4);
     
    -WTr(1:3, 1:3) = [cos(Rzr) -sin(Rzr) 0;
    +WTr(1:3, 1:3) = [cos(Rzr) -sin(Rzr) 0;
          sin(Rzr)  cos(Rzr) 0;
    -     0        0         1] * ...
    +     0        0         1] * ...
         [cos(Ryr)  0        sin(Ryr);
          0        1        0;
    -     -sin(Ryr)  0        cos(Ryr)] * ...
    +     -sin(Ryr)  0        cos(Ryr)] * ...
         [1        0        0;
    -     0        cos(Rxr) -sin(Rxr);
    +     0        cos(Rxr) -sin(Rxr);
          0        sin(Rxr)  cos(Rxr)];
    -WTr(1:4, 4) = [Dxr ; Dyr ; Dzr; 1];
    +WTr(1:4, 4) = [Dxr ; Dyr ; Dzr; 1];
     
    @@ -1678,7 +1466,7 @@ We can also compute \({}^WT_V\).

    WTv = eye(4);
    -WTv(1:3, 4) = WTm(1:3, 4);
    +WTv(1:3, 4) = WTm(1:3, 4);
     
    @@ -1689,8 +1477,8 @@ This homogeneous transformation can be computed from the previously computed mat

    -
    %% Wanted pose expressed in a frame corresponding to the actual measured pose
    -MTr = [WTm(1:3,1:3)', -WTm(1:3,1:3)'*WTm(1:3,4) ; 0 0 0 1]*WTr;
    +
    %% Wanted pose expressed in a frame corresponding to the actual measured pose
    +MTr = [WTm(1:3,1:3)', -WTm(1:3,1:3)'*WTm(1:3,4) ; 0 0 0 1]*WTr;
     
    @@ -1699,22 +1487,22 @@ Now we want to express \({}^VT_R\): \[ {}^VT_R = ({{}^WT_V}^{-1}) {}^WT_R \]

    -
    %% Wanted pose expressed in a frame coincident with the actual position but with no rotation
    -VTr = [WTv(1:3,1:3)', -WTv(1:3,1:3)'*WTv(1:3,4) ; 0 0 0 1] * WTr;
    +
    %% Wanted pose expressed in a frame coincident with the actual position but with no rotation
    +VTr = [WTv(1:3,1:3)', -WTv(1:3,1:3)'*WTv(1:3,4) ; 0 0 0 1] * WTr;
     
    -
    %% Extract Translations and Rotations from the Homogeneous Matrix
    +
    %% Extract Translations and Rotations from the Homogeneous Matrix
     T = MTr;
     Edx = T(1, 4);
     Edy = T(2, 4);
     Edz = T(3, 4);
     
    -% The angles obtained are u-v-w Euler angles (rotations in the moving frame)
    -Ery = atan2( T(1, 3),          sqrt(T(1, 1)^2 + T(1, 2)^2));
    -Erx = atan2(-T(2, 3)/cos(Ery), T(3, 3)/cos(Ery));
    -Erz = atan2(-T(1, 2)/cos(Ery), T(1, 1)/cos(Ery));
    +% The angles obtained are u-v-w Euler angles (rotations in the moving frame)
    +Ery = atan2( T(1, 3),          sqrt(T(1, 1)^2 + T(1, 2)^2));
    +Erx = atan2(-T(2, 3)/cos(Ery), T(3, 3)/cos(Ery));
    +Erz = atan2(-T(1, 2)/cos(Ery), T(1, 1)/cos(Ery));
     
    @@ -1722,7 +1510,7 @@ Erz = atan2(-T(1, 2)/

    Author: Dehaeze Thomas

    -

    Created: 2020-03-16 lun. 11:22

    +

    Created: 2020-08-05 mer. 13:27

    diff --git a/docs/control-vibration-isolation.html b/docs/control-vibration-isolation.html index 3efa6fd..b791573 100644 --- a/docs/control-vibration-isolation.html +++ b/docs/control-vibration-isolation.html @@ -1,239 +1,27 @@ - - + - Stewart Platform - Vibration Isolation - - - - +
    @@ -249,28 +37,28 @@
  • 1. HAC-LAC (Cascade) Control - Integral Control
  • -
    -

    1.3.1 HAC - Without LAC

    +
    +

    1.3.1 HAC - Without LAC

    -
    controller = initializeController('type', 'open-loop');
    +
    controller = initializeController('type', 'open-loop');
     
    -
    %% Name of the Simulink File
    -mdl = 'stewart_platform_model';
    +
    %% Name of the Simulink File
    +mdl = 'stewart_platform_model';
     
    -%% Input/Output definition
    +%% Input/Output definition
     clear io; io_i = 1;
    -io(io_i) = linio([mdl, '/Controller'],              1, 'input');      io_i = io_i + 1; % Actuator Force Inputs [N]
    -io(io_i) = linio([mdl, '/Absolute Motion Sensor'],  1, 'openoutput'); io_i = io_i + 1; % Absolute Sensor [m, rad]
    +io(io_i) = linio([mdl, '/Controller'],              1, 'input');      io_i = io_i + 1; % Actuator Force Inputs [N]
    +io(io_i) = linio([mdl, '/Absolute Motion Sensor'],  1, 'openoutput'); io_i = io_i + 1; % Absolute Sensor [m, rad]
     
    -%% Run the linearization
    +%% Run the linearization
     G_ol = linearize(mdl, io);
    -G_ol.InputName  = {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'};
    -G_ol.OutputName = {'Dx', 'Dy', 'Dz', 'Rx', 'Ry', 'Rz'};
    +G_ol.InputName  = {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'};
    +G_ol.OutputName = {'Dx', 'Dy', 'Dz', 'Rx', 'Ry', 'Rz'};
     
    -
    -

    1.3.2 HAC - IFF

    +
    +

    1.3.2 HAC - IFF

    -
    controller = initializeController('type', 'iff');
    -K_iff = -(1e4/s)*eye(6);
    +
    controller = initializeController('type', 'iff');
    +K_iff = -(1e4/s)*eye(6);
     
    -
    %% Name of the Simulink File
    -mdl = 'stewart_platform_model';
    +
    %% Name of the Simulink File
    +mdl = 'stewart_platform_model';
     
    -%% Input/Output definition
    +%% Input/Output definition
     clear io; io_i = 1;
    -io(io_i) = linio([mdl, '/Controller'],              1, 'input');      io_i = io_i + 1; % Actuator Force Inputs [N]
    -io(io_i) = linio([mdl, '/Absolute Motion Sensor'],  1, 'openoutput'); io_i = io_i + 1; % Absolute Sensor [m, rad]
    +io(io_i) = linio([mdl, '/Controller'],              1, 'input');      io_i = io_i + 1; % Actuator Force Inputs [N]
    +io(io_i) = linio([mdl, '/Absolute Motion Sensor'],  1, 'openoutput'); io_i = io_i + 1; % Absolute Sensor [m, rad]
     
    -%% Run the linearization
    +%% Run the linearization
     G_iff = linearize(mdl, io);
    -G_iff.InputName  = {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'};
    -G_iff.OutputName = {'Dx', 'Dy', 'Dz', 'Rx', 'Ry', 'Rz'};
    +G_iff.InputName  = {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'};
    +G_iff.OutputName = {'Dx', 'Dy', 'Dz', 'Rx', 'Ry', 'Rz'};
     
    -
    -

    1.3.3 HAC - DVF

    +
    +

    1.3.3 HAC - DVF

    -
    controller = initializeController('type', 'dvf');
    -K_dvf = -1e4*s/(1+s/2/pi/5000)*eye(6);
    +
    controller = initializeController('type', 'dvf');
    +K_dvf = -1e4*s/(1+s/2/pi/5000)*eye(6);
     
    -
    %% Name of the Simulink File
    -mdl = 'stewart_platform_model';
    +
    %% Name of the Simulink File
    +mdl = 'stewart_platform_model';
     
    -%% Input/Output definition
    +%% Input/Output definition
     clear io; io_i = 1;
    -io(io_i) = linio([mdl, '/Controller'],              1, 'input');      io_i = io_i + 1; % Actuator Force Inputs [N]
    -io(io_i) = linio([mdl, '/Absolute Motion Sensor'],  1, 'openoutput'); io_i = io_i + 1; % Absolute Sensor [m, rad]
    +io(io_i) = linio([mdl, '/Controller'],              1, 'input');      io_i = io_i + 1; % Actuator Force Inputs [N]
    +io(io_i) = linio([mdl, '/Absolute Motion Sensor'],  1, 'openoutput'); io_i = io_i + 1; % Absolute Sensor [m, rad]
     
    -%% Run the linearization
    +%% Run the linearization
     G_dvf = linearize(mdl, io);
    -G_dvf.InputName  = {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'};
    -G_dvf.OutputName = {'Dx', 'Dy', 'Dz', 'Rx', 'Ry', 'Rz'};
    +G_dvf.InputName  = {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'};
    +G_dvf.OutputName = {'Dx', 'Dy', 'Dz', 'Rx', 'Ry', 'Rz'};
     
    @@ -497,14 +285,14 @@ We use the Jacobian to express the actuator forces in the cartesian frame, and t

    -
    Gc_ol = minreal(G_ol)/stewart.kinematics.J';
    -Gc_ol.InputName = {'Fx', 'Fy', 'Fz', 'Mx', 'My', 'Mz'};
    +
    Gc_ol = minreal(G_ol)/stewart.kinematics.J';
    +Gc_ol.InputName = {'Fx', 'Fy', 'Fz', 'Mx', 'My', 'Mz'};
     
    -Gc_iff = minreal(G_iff)/stewart.kinematics.J';
    -Gc_iff.InputName = {'Fx', 'Fy', 'Fz', 'Mx', 'My', 'Mz'};
    +Gc_iff = minreal(G_iff)/stewart.kinematics.J';
    +Gc_iff.InputName = {'Fx', 'Fy', 'Fz', 'Mx', 'My', 'Mz'};
     
    -Gc_dvf = minreal(G_dvf)/stewart.kinematics.J';
    -Gc_dvf.InputName = {'Fx', 'Fy', 'Fz', 'Mx', 'My', 'Mz'};
    +Gc_dvf = minreal(G_dvf)/stewart.kinematics.J';
    +Gc_dvf.InputName = {'Fx', 'Fy', 'Fz', 'Mx', 'My', 'Mz'};
     
    @@ -526,12 +314,12 @@ We then design a controller based on the transfer functions from \(\bm{\mathcal{
    -
    -

    1.6 HAC - DVF

    +
    +

    1.6 HAC - DVF

    -
    -

    1.6.1 Plant

    +
    +

    1.6.1 Plant

    @@ -542,8 +330,8 @@ We then design a controller based on the transfer functions from \(\bm{\mathcal{
    -
    -

    1.6.2 Controller Design

    +
    +

    1.6.2 Controller Design

    We design a diagonal controller with equal bandwidth for the 6 terms. @@ -551,12 +339,12 @@ The controller is a pure integrator with a small lead near the crossover.

    -
    wc = 2*pi*300; % Wanted Bandwidth [rad/s]
    +
    wc = 2*pi*300; % Wanted Bandwidth [rad/s]
     
     h = 1.2;
    -H_lead = 1/h*(1 + s/(wc/h))/(1 + s/(wc*h));
    +H_lead = 1/h*(1 + s/(wc/h))/(1 + s/(wc*h));
     
    -Kd_dvf = diag(1./abs(diag(freqresp(1/s*Gc_dvf, wc)))) .* H_lead .* 1/s;
    +Kd_dvf = diag(1./abs(diag(freqresp(1/s*Gc_dvf, wc)))) .* H_lead .* 1/s;
     
    @@ -572,37 +360,37 @@ Kd_dvf = diag(1./abs(diag(freqresp(1 -
    K_hac_dvf = inv(stewart.kinematics.J')*Kd_dvf;
    +
    K_hac_dvf = inv(stewart.kinematics.J')*Kd_dvf;
     
    -
    -

    1.6.3 Obtained Performance

    +
    +

    1.6.3 Obtained Performance

    We identify the transmissibility and compliance of the system.

    -
    controller = initializeController('type', 'open-loop');
    +
    controller = initializeController('type', 'open-loop');
     [T_ol, T_norm_ol, freqs] = computeTransmissibility();
    -[C_ol, C_norm_ol, ~] = computeCompliance();
    +[C_ol, C_norm_ol, ~] = computeCompliance();
     
    -
    controller = initializeController('type', 'dvf');
    -[T_dvf, T_norm_dvf, ~] = computeTransmissibility();
    -[C_dvf, C_norm_dvf, ~] = computeCompliance();
    +
    controller = initializeController('type', 'dvf');
    +[T_dvf, T_norm_dvf, ~] = computeTransmissibility();
    +[C_dvf, C_norm_dvf, ~] = computeCompliance();
     
    -
    controller = initializeController('type', 'hac-dvf');
    -[T_hac_dvf, T_norm_hac_dvf, ~] = computeTransmissibility();
    -[C_hac_dvf, C_norm_hac_dvf, ~] = computeCompliance();
    +
    controller = initializeController('type', 'hac-dvf');
    +[T_hac_dvf, T_norm_hac_dvf, ~] = computeTransmissibility();
    +[C_hac_dvf, C_norm_hac_dvf, ~] = computeCompliance();
     
    @@ -616,12 +404,12 @@ We identify the transmissibility and compliance of the system.
    -
    -

    1.7 HAC - IFF

    +
    +

    1.7 HAC - IFF

    -
    -

    1.7.1 Plant

    +
    +

    1.7.1 Plant

    @@ -632,8 +420,8 @@ We identify the transmissibility and compliance of the system.
    -
    -

    1.7.2 Controller Design

    +
    +

    1.7.2 Controller Design

    We design a diagonal controller with equal bandwidth for the 6 terms. @@ -641,12 +429,12 @@ The controller is a pure integrator with a small lead near the crossover.

    -
    wc = 2*pi*300; % Wanted Bandwidth [rad/s]
    +
    wc = 2*pi*300; % Wanted Bandwidth [rad/s]
     
     h = 1.2;
    -H_lead = 1/h*(1 + s/(wc/h))/(1 + s/(wc*h));
    +H_lead = 1/h*(1 + s/(wc/h))/(1 + s/(wc*h));
     
    -Kd_iff = diag(1./abs(diag(freqresp(1/s*Gc_iff, wc)))) .* H_lead .* 1/s;
    +Kd_iff = diag(1./abs(diag(freqresp(1/s*Gc_iff, wc)))) .* H_lead .* 1/s;
     
    @@ -662,37 +450,37 @@ Kd_iff = diag(1./abs(diag(freqresp(1 -
    K_hac_iff = inv(stewart.kinematics.J')*Kd_iff;
    +
    K_hac_iff = inv(stewart.kinematics.J')*Kd_iff;
     
    -
    -

    1.7.3 Obtained Performance

    +
    +

    1.7.3 Obtained Performance

    We identify the transmissibility and compliance of the system.

    -
    controller = initializeController('type', 'open-loop');
    +
    controller = initializeController('type', 'open-loop');
     [T_ol, T_norm_ol, freqs] = computeTransmissibility();
    -[C_ol, C_norm_ol, ~] = computeCompliance();
    +[C_ol, C_norm_ol, ~] = computeCompliance();
     
    -
    controller = initializeController('type', 'iff');
    -[T_iff, T_norm_iff, ~] = computeTransmissibility();
    -[C_iff, C_norm_iff, ~] = computeCompliance();
    +
    controller = initializeController('type', 'iff');
    +[T_iff, T_norm_iff, ~] = computeTransmissibility();
    +[C_iff, C_norm_iff, ~] = computeCompliance();
     
    -
    controller = initializeController('type', 'hac-iff');
    -[T_hac_iff, T_norm_hac_iff, ~] = computeTransmissibility();
    -[C_hac_iff, C_norm_hac_iff, ~] = computeCompliance();
    +
    controller = initializeController('type', 'hac-iff');
    +[T_hac_iff, T_norm_hac_iff, ~] = computeTransmissibility();
    +[C_hac_iff, C_norm_hac_iff, ~] = computeCompliance();
     
    @@ -825,24 +613,24 @@ Let’s define the system as shown in figure 13.
    -
    -

    2.1 Initialization

    +
    +

    2.1 Initialization

    We first initialize the Stewart platform.

    stewart = initializeStewartPlatform();
    -stewart = initializeFramesPositions(stewart, 'H', 90e-3, 'MO_B', 45e-3);
    +stewart = initializeFramesPositions(stewart, 'H', 90e-3, 'MO_B', 45e-3);
     stewart = generateGeneralConfiguration(stewart);
     stewart = computeJointsPose(stewart);
     stewart = initializeStrutDynamics(stewart);
    -stewart = initializeJointDynamics(stewart, 'type_F', 'universal', 'type_M', 'spherical');
    +stewart = initializeJointDynamics(stewart, 'type_F', 'universal', 'type_M', 'spherical');
     stewart = initializeCylindricalPlatforms(stewart);
     stewart = initializeCylindricalStruts(stewart);
     stewart = computeJacobian(stewart);
     stewart = initializeStewartPose(stewart);
    -stewart = initializeInertialSensor(stewart, 'type', 'none');
    +stewart = initializeInertialSensor(stewart, 'type', 'none');
     
    @@ -850,65 +638,65 @@ stewart = initializeInertialSensor(stewart, 'type'
    -
    ground = initializeGround('type', 'rigid', 'rot_point', stewart.platform_F.FO_A);
    -payload = initializePayload('type', 'none');
    +
    ground = initializeGround('type', 'rigid', 'rot_point', stewart.platform_F.FO_A);
    +payload = initializePayload('type', 'none');
     
    -
    -

    2.2 Identification

    +
    +

    2.2 Identification

    -
    -

    2.2.1 HAC - Without LAC

    +
    +

    2.2.1 HAC - Without LAC

    -
    controller = initializeController('type', 'open-loop');
    +
    controller = initializeController('type', 'open-loop');
     
    -
    %% Name of the Simulink File
    -mdl = 'stewart_platform_model';
    +
    %% Name of the Simulink File
    +mdl = 'stewart_platform_model';
     
    -%% Input/Output definition
    +%% Input/Output definition
     clear io; io_i = 1;
    -io(io_i) = linio([mdl, '/Controller'],              1, 'input');      io_i = io_i + 1; % Actuator Force Inputs [N]
    -io(io_i) = linio([mdl, '/Absolute Motion Sensor'],  1, 'openoutput'); io_i = io_i + 1; % Absolute Sensor [m, rad]
    +io(io_i) = linio([mdl, '/Controller'],              1, 'input');      io_i = io_i + 1; % Actuator Force Inputs [N]
    +io(io_i) = linio([mdl, '/Absolute Motion Sensor'],  1, 'openoutput'); io_i = io_i + 1; % Absolute Sensor [m, rad]
     
    -%% Run the linearization
    +%% Run the linearization
     G_ol = linearize(mdl, io);
    -G_ol.InputName  = {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'};
    -G_ol.OutputName = {'Dx', 'Dy', 'Dz', 'Rx', 'Ry', 'Rz'};
    +G_ol.InputName  = {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'};
    +G_ol.OutputName = {'Dx', 'Dy', 'Dz', 'Rx', 'Ry', 'Rz'};
     
    -
    -

    2.2.2 HAC - DVF

    +
    +

    2.2.2 HAC - DVF

    -
    controller = initializeController('type', 'dvf');
    -K_dvf = -1e4*s/(1+s/2/pi/5000)*eye(6);
    +
    controller = initializeController('type', 'dvf');
    +K_dvf = -1e4*s/(1+s/2/pi/5000)*eye(6);
     
    -
    %% Name of the Simulink File
    -mdl = 'stewart_platform_model';
    +
    %% Name of the Simulink File
    +mdl = 'stewart_platform_model';
     
    -%% Input/Output definition
    +%% Input/Output definition
     clear io; io_i = 1;
    -io(io_i) = linio([mdl, '/Controller'],              1, 'input');      io_i = io_i + 1; % Actuator Force Inputs [N]
    -io(io_i) = linio([mdl, '/Absolute Motion Sensor'],  1, 'openoutput'); io_i = io_i + 1; % Absolute Sensor [m, rad]
    +io(io_i) = linio([mdl, '/Controller'],              1, 'input');      io_i = io_i + 1; % Actuator Force Inputs [N]
    +io(io_i) = linio([mdl, '/Absolute Motion Sensor'],  1, 'openoutput'); io_i = io_i + 1; % Absolute Sensor [m, rad]
     
    -%% Run the linearization
    +%% Run the linearization
     G_dvf = linearize(mdl, io);
    -G_dvf.InputName  = {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'};
    -G_dvf.OutputName = {'Dx', 'Dy', 'Dz', 'Rx', 'Ry', 'Rz'};
    +G_dvf.InputName  = {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'};
    +G_dvf.OutputName = {'Dx', 'Dy', 'Dz', 'Rx', 'Ry', 'Rz'};
     
    @@ -918,11 +706,11 @@ G_dvf.OutputName = {'Dx', 2.2.3 Cartesian Frame
    -
    Gc_ol = minreal(G_ol)/stewart.kinematics.J';
    -Gc_ol.InputName = {'Fx', 'Fy', 'Fz', 'Mx', 'My', 'Mz'};
    +
    Gc_ol = minreal(G_ol)/stewart.kinematics.J';
    +Gc_ol.InputName = {'Fx', 'Fy', 'Fz', 'Mx', 'My', 'Mz'};
     
    -Gc_dvf = minreal(G_dvf)/stewart.kinematics.J';
    -Gc_dvf.InputName = {'Fx', 'Fy', 'Fz', 'Mx', 'My', 'Mz'};
    +Gc_dvf = minreal(G_dvf)/stewart.kinematics.J';
    +Gc_dvf.InputName = {'Fx', 'Fy', 'Fz', 'Mx', 'My', 'Mz'};
     
    @@ -943,17 +731,17 @@ U_dvf = zeros(6,6,length(freqs)); S_dvf = zeros(6,length(freqs)); V_dvf = zeros(6,6,length(freqs)); -for i = 1:length(freqs) - [U,S,V] = svd(freqresp(Gc_ol, freqs(i), 'Hz')); - U_ol(:,:,i) = U; - S_ol(:,i) = diag(S); - V_ol(:,:,i) = V; +for i = 1:length(freqs) + [U,S,V] = svd(freqresp(Gc_ol, freqs(i), 'Hz')); + U_ol(:,:,i) = U; + S_ol(:,i) = diag(S); + V_ol(:,:,i) = V; - [U,S,V] = svd(freqresp(Gc_dvf, freqs(i), 'Hz')); - U_dvf(:,:,i) = U; - S_dvf(:,i) = diag(S); - V_dvf(:,:,i) = V; -end + [U,S,V] = svd(freqresp(Gc_dvf, freqs(i), 'Hz')); + U_dvf(:,:,i) = U; + S_dvf(:,i) = diag(S); + V_dvf(:,:,i) = V; +end
    @@ -964,7 +752,7 @@ V_dvf = zeros(6,6,length(freqs));

    3 Diagonal Control based on the damped plant

    -From skogestad07_multiv_feedb_contr, a simple approach to multivariable control is the following two-step procedure: +From (Skogestad and Postlethwaite 2007), a simple approach to multivariable control is the following 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. @@ -986,24 +774,24 @@ There are mainly three different cases:
    -
    -

    3.1 Initialization

    +
    +

    3.1 Initialization

    We first initialize the Stewart platform.

    stewart = initializeStewartPlatform();
    -stewart = initializeFramesPositions(stewart, 'H', 90e-3, 'MO_B', 45e-3);
    +stewart = initializeFramesPositions(stewart, 'H', 90e-3, 'MO_B', 45e-3);
     stewart = generateGeneralConfiguration(stewart);
     stewart = computeJointsPose(stewart);
     stewart = initializeStrutDynamics(stewart);
    -stewart = initializeJointDynamics(stewart, 'type_F', 'universal', 'type_M', 'spherical');
    +stewart = initializeJointDynamics(stewart, 'type_F', 'universal', 'type_M', 'spherical');
     stewart = initializeCylindricalPlatforms(stewart);
     stewart = initializeCylindricalStruts(stewart);
     stewart = computeJacobian(stewart);
     stewart = initializeStewartPose(stewart);
    -stewart = initializeInertialSensor(stewart, 'type', 'none');
    +stewart = initializeInertialSensor(stewart, 'type', 'none');
     
    @@ -1011,35 +799,35 @@ stewart = initializeInertialSensor(stewart, 'type'
    -
    ground = initializeGround('type', 'rigid', 'rot_point', stewart.platform_F.FO_A);
    -payload = initializePayload('type', 'none');
    +
    ground = initializeGround('type', 'rigid', 'rot_point', stewart.platform_F.FO_A);
    +payload = initializePayload('type', 'none');
     
    -
    -

    3.2 Identification

    +
    +

    3.2 Identification

    -
    controller = initializeController('type', 'dvf');
    -K_dvf = -1e4*s/(1+s/2/pi/5000)*eye(6);
    +
    controller = initializeController('type', 'dvf');
    +K_dvf = -1e4*s/(1+s/2/pi/5000)*eye(6);
     
    -
    %% Name of the Simulink File
    -mdl = 'stewart_platform_model';
    +
    %% Name of the Simulink File
    +mdl = 'stewart_platform_model';
     
    -%% Input/Output definition
    +%% Input/Output definition
     clear io; io_i = 1;
    -io(io_i) = linio([mdl, '/Controller'],              1, 'input');      io_i = io_i + 1; % Actuator Force Inputs [N]
    -io(io_i) = linio([mdl, '/Absolute Motion Sensor'],  1, 'openoutput'); io_i = io_i + 1; % Absolute Sensor [m, rad]
    +io(io_i) = linio([mdl, '/Controller'],              1, 'input');      io_i = io_i + 1; % Actuator Force Inputs [N]
    +io(io_i) = linio([mdl, '/Absolute Motion Sensor'],  1, 'openoutput'); io_i = io_i + 1; % Absolute Sensor [m, rad]
     
    -%% Run the linearization
    +%% Run the linearization
     G_dvf = linearize(mdl, io);
    -G_dvf.InputName  = {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'};
    -G_dvf.OutputName = {'Dx', 'Dy', 'Dz', 'Rx', 'Ry', 'Rz'};
    +G_dvf.InputName  = {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'};
    +G_dvf.OutputName = {'Dx', 'Dy', 'Dz', 'Rx', 'Ry', 'Rz'};
     
    @@ -1064,7 +852,7 @@ We choose \(W_1 = G^{-1}(0)\). The (static) decoupled plant is \(G_s(s) = G(s) W_1\).

    -
    Gs = G_dvf*W1;
    +
    Gs = G_dvf*W1;
     
    @@ -1107,12 +895,12 @@ We design a diagonal controller \(K_s(s)\) that consist of a pure integrator and

    -
    wc = 2*pi*300; % Wanted Bandwidth [rad/s]
    +
    wc = 2*pi*300; % Wanted Bandwidth [rad/s]
     
     h = 1.5;
    -H_lead = 1/h*(1 + s/(wc/h))/(1 + s/(wc*h));
    +H_lead = 1/h*(1 + s/(wc/h))/(1 + s/(wc*h));
     
    -Ks_dvf = diag(1./abs(diag(freqresp(1/s*Gs, wc)))) .* H_lead .* 1/s;
    +Ks_dvf = diag(1./abs(diag(freqresp(1/s*Gs, wc)))) .* H_lead .* 1/s;
     
    @@ -1121,7 +909,7 @@ The overall controller is then \(K(s) = W_1 K_s(s)\) as shown in Figure
    -
    K_hac_dvf = W1 * Ks_dvf;
    +
    K_hac_dvf = W1 * Ks_dvf;
     
    @@ -1134,24 +922,24 @@ The overall controller is then \(K(s) = W_1 K_s(s)\) as shown in Figure
    -
    -

    3.3.3 Results

    +
    +

    3.3.3 Results

    We identify the transmissibility and compliance of the Stewart platform under open-loop and closed-loop control.

    -
    controller = initializeController('type', 'open-loop');
    +
    controller = initializeController('type', 'open-loop');
     [T_ol, T_norm_ol, freqs] = computeTransmissibility();
    -[C_ol, C_norm_ol, ~] = computeCompliance();
    +[C_ol, C_norm_ol, ~] = computeCompliance();
     
    -
    controller = initializeController('type', 'hac-dvf');
    -[T_hac_dvf, T_norm_hac_dvf, ~] = computeTransmissibility();
    -[C_hac_dvf, C_norm_hac_dvf, ~] = computeCompliance();
    +
    controller = initializeController('type', 'hac-dvf');
    +[T_hac_dvf, T_norm_hac_dvf, ~] = computeTransmissibility();
    +[C_hac_dvf, C_norm_hac_dvf, ~] = computeCompliance();
     
    @@ -1183,24 +971,24 @@ The results are shown in figure

    4 Time Domain Simulation

    -
    -

    4.1 Initialization

    +
    +

    4.1 Initialization

    We first initialize the Stewart platform.

    stewart = initializeStewartPlatform();
    -stewart = initializeFramesPositions(stewart, 'H', 90e-3, 'MO_B', 45e-3);
    +stewart = initializeFramesPositions(stewart, 'H', 90e-3, 'MO_B', 45e-3);
     stewart = generateGeneralConfiguration(stewart);
     stewart = computeJointsPose(stewart);
     stewart = initializeStrutDynamics(stewart);
    -stewart = initializeJointDynamics(stewart, 'type_F', 'universal', 'type_M', 'spherical');
    +stewart = initializeJointDynamics(stewart, 'type_F', 'universal', 'type_M', 'spherical');
     stewart = initializeCylindricalPlatforms(stewart);
     stewart = initializeCylindricalStruts(stewart);
     stewart = computeJacobian(stewart);
     stewart = initializeStewartPose(stewart);
    -stewart = initializeInertialSensor(stewart, 'type', 'none');
    +stewart = initializeInertialSensor(stewart, 'type', 'none');
     
    @@ -1208,13 +996,13 @@ stewart = initializeInertialSensor(stewart, 'type'
    -
    ground = initializeGround('type', 'rigid', 'rot_point', stewart.platform_F.FO_A);
    -payload = initializePayload('type', 'none');
    +
    ground = initializeGround('type', 'rigid', 'rot_point', stewart.platform_F.FO_A);
    +payload = initializePayload('type', 'none');
     
    -
    load('./mat/motion_error_ol.mat', 'Eg')
    +
    load('./mat/motion_error_ol.mat', 'Eg')
     
    @@ -1224,40 +1012,40 @@ payload = initializePayload('type', 4.2 HAC IFF
    -
    controller = initializeController('type', 'iff');
    -K_iff = -(1e4/s)*eye(6);
    +
    controller = initializeController('type', 'iff');
    +K_iff = -(1e4/s)*eye(6);
     
    -%% Name of the Simulink File
    -mdl = 'stewart_platform_model';
    +%% Name of the Simulink File
    +mdl = 'stewart_platform_model';
     
    -%% Input/Output definition
    +%% Input/Output definition
     clear io; io_i = 1;
    -io(io_i) = linio([mdl, '/Controller'],              1, 'input');      io_i = io_i + 1; % Actuator Force Inputs [N]
    -io(io_i) = linio([mdl, '/Absolute Motion Sensor'],  1, 'openoutput'); io_i = io_i + 1; % Absolute Sensor [m, rad]
    +io(io_i) = linio([mdl, '/Controller'],              1, 'input');      io_i = io_i + 1; % Actuator Force Inputs [N]
    +io(io_i) = linio([mdl, '/Absolute Motion Sensor'],  1, 'openoutput'); io_i = io_i + 1; % Absolute Sensor [m, rad]
     
    -%% Run the linearization
    +%% Run the linearization
     G_iff = linearize(mdl, io);
    -G_iff.InputName  = {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'};
    -G_iff.OutputName = {'Dx', 'Dy', 'Dz', 'Rx', 'Ry', 'Rz'};
    +G_iff.InputName  = {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'};
    +G_iff.OutputName = {'Dx', 'Dy', 'Dz', 'Rx', 'Ry', 'Rz'};
     
    -Gc_iff = minreal(G_iff)/stewart.kinematics.J';
    -Gc_iff.InputName = {'Fx', 'Fy', 'Fz', 'Mx', 'My', 'Mz'};
    +Gc_iff = minreal(G_iff)/stewart.kinematics.J';
    +Gc_iff.InputName = {'Fx', 'Fy', 'Fz', 'Mx', 'My', 'Mz'};
     
    -
    wc = 2*pi*100; % Wanted Bandwidth [rad/s]
    +
    wc = 2*pi*100; % Wanted Bandwidth [rad/s]
     
     h = 1.2;
    -H_lead = 1/h*(1 + s/(wc/h))/(1 + s/(wc*h));
    +H_lead = 1/h*(1 + s/(wc/h))/(1 + s/(wc*h));
     
    -Kd_iff = diag(1./abs(diag(freqresp(1/s*Gc_iff, wc)))) .* H_lead .* 1/s;
    -K_hac_iff = inv(stewart.kinematics.J')*Kd_iff;
    +Kd_iff = diag(1./abs(diag(freqresp(1/s*Gc_iff, wc)))) .* H_lead .* 1/s;
    +K_hac_iff = inv(stewart.kinematics.J')*Kd_iff;
     
    -
    controller = initializeController('type', 'hac-iff');
    +
    controller = initializeController('type', 'hac-iff');
     
    @@ -1267,69 +1055,69 @@ K_hac_iff = inv(stewart.kinematics.J')4.3 HAC-DVF
    -
    controller = initializeController('type', 'dvf');
    -K_dvf = -1e4*s/(1+s/2/pi/5000)*eye(6);
    +
    controller = initializeController('type', 'dvf');
    +K_dvf = -1e4*s/(1+s/2/pi/5000)*eye(6);
     
    -%% Name of the Simulink File
    -mdl = 'stewart_platform_model';
    +%% Name of the Simulink File
    +mdl = 'stewart_platform_model';
     
    -%% Input/Output definition
    +%% Input/Output definition
     clear io; io_i = 1;
    -io(io_i) = linio([mdl, '/Controller'],              1, 'input');      io_i = io_i + 1; % Actuator Force Inputs [N]
    -io(io_i) = linio([mdl, '/Absolute Motion Sensor'],  1, 'openoutput'); io_i = io_i + 1; % Absolute Sensor [m, rad]
    +io(io_i) = linio([mdl, '/Controller'],              1, 'input');      io_i = io_i + 1; % Actuator Force Inputs [N]
    +io(io_i) = linio([mdl, '/Absolute Motion Sensor'],  1, 'openoutput'); io_i = io_i + 1; % Absolute Sensor [m, rad]
     
    -%% Run the linearization
    +%% Run the linearization
     G_dvf = linearize(mdl, io);
    -G_dvf.InputName  = {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'};
    -G_dvf.OutputName = {'Dx', 'Dy', 'Dz', 'Rx', 'Ry', 'Rz'};
    +G_dvf.InputName  = {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'};
    +G_dvf.OutputName = {'Dx', 'Dy', 'Dz', 'Rx', 'Ry', 'Rz'};
     
    -Gc_dvf = minreal(G_dvf)/stewart.kinematics.J';
    -Gc_dvf.InputName = {'Fx', 'Fy', 'Fz', 'Mx', 'My', 'Mz'};
    +Gc_dvf = minreal(G_dvf)/stewart.kinematics.J';
    +Gc_dvf.InputName = {'Fx', 'Fy', 'Fz', 'Mx', 'My', 'Mz'};
     
    -
    wc = 2*pi*100; % Wanted Bandwidth [rad/s]
    +
    wc = 2*pi*100; % Wanted Bandwidth [rad/s]
     
     h = 1.2;
    -H_lead = 1/h*(1 + s/(wc/h))/(1 + s/(wc*h));
    +H_lead = 1/h*(1 + s/(wc/h))/(1 + s/(wc*h));
     
    -Kd_dvf = diag(1./abs(diag(freqresp(1/s*Gc_dvf, wc)))) .* H_lead .* 1/s;
    +Kd_dvf = diag(1./abs(diag(freqresp(1/s*Gc_dvf, wc)))) .* H_lead .* 1/s;
     
    -K_hac_dvf = inv(stewart.kinematics.J')*Kd_dvf;
    +K_hac_dvf = inv(stewart.kinematics.J')*Kd_dvf;
     
    -
    controller = initializeController('type', 'hac-dvf');
    +
    controller = initializeController('type', 'hac-dvf');
     
    -
    -

    4.4 Results

    +
    +

    4.4 Results

    -
    figure;
    +
    figure;
     subplot(1, 2, 1);
     hold on;
    -plot(Eg.Time, Eg.Data(:, 1), 'DisplayName', 'X');
    -plot(Eg.Time, Eg.Data(:, 2), 'DisplayName', 'Y');
    -plot(Eg.Time, Eg.Data(:, 3), 'DisplayName', 'Z');
    +plot(Eg.Time, Eg.Data(:, 1), 'DisplayName', 'X');
    +plot(Eg.Time, Eg.Data(:, 2), 'DisplayName', 'Y');
    +plot(Eg.Time, Eg.Data(:, 3), 'DisplayName', 'Z');
     hold off;
    -xlabel('Time [s]');
    -ylabel('Position error [m]');
    +xlabel('Time [s]');
    +ylabel('Position error [m]');
     legend();
     
     subplot(1, 2, 2);
     hold on;
    -plot(simout.Xa.Time, simout.Xa.Data(:, 1));
    -plot(simout.Xa.Time, simout.Xa.Data(:, 2));
    -plot(simout.Xa.Time, simout.Xa.Data(:, 3));
    +plot(simout.Xa.Time, simout.Xa.Data(:, 1));
    +plot(simout.Xa.Time, simout.Xa.Data(:, 2));
    +plot(simout.Xa.Time, simout.Xa.Data(:, 3));
     hold off;
    -xlabel('Time [s]');
    -ylabel('Orientation error [rad]');
    +xlabel('Time [s]');
    +ylabel('Orientation error [rad]');
     
    @@ -1352,13 +1140,13 @@ ylabel('Orientation error [rad]');

    Function description

    -
    function [controller] = initializeController(args)
    -% initializeController - Initialize the Controller
    -%
    -% Syntax: [] = initializeController(args)
    -%
    -% Inputs:
    -%    - args - Can have the following fields:
    +
    function [controller] = initializeController(args)
    +% initializeController - Initialize the Controller
    +%
    +% Syntax: [] = initializeController(args)
    +%
    +% Inputs:
    +%    - args - Can have the following fields:
     
    @@ -1369,8 +1157,8 @@ ylabel('Orientation error [rad]');
    arguments
    -  args.type   char   {mustBeMember(args.type, {'open-loop', 'iff', 'dvf', 'hac-iff', 'hac-dvf', 'ref-track-L', 'ref-track-X', 'ref-track-hac-dvf'})} = 'open-loop'
    -end
    +  args.type   char   {mustBeMember(args.type, {'open-loop', 'iff', 'dvf', 'hac-iff', 'hac-dvf', 'ref-track-L', 'ref-track-X', 'ref-track-hac-dvf'})} = 'open-loop'
    +end
     
    @@ -1390,26 +1178,31 @@ ylabel('Orientation error [rad]');

    Add Type

    @@ -1417,7 +1210,7 @@ ylabel('Orientation error [rad]');

    Author: Dehaeze Thomas

    -

    Created: 2020-03-16 lun. 11:21

    +

    Created: 2020-08-05 mer. 13:27

    diff --git a/docs/cubic-configuration.html b/docs/cubic-configuration.html index bed01ba..bac1f15 100644 --- a/docs/cubic-configuration.html +++ b/docs/cubic-configuration.html @@ -1,239 +1,27 @@ - - + - Cubic configuration for the Stewart Platform - - - - +

    -The Cubic configuration for the Stewart platform was first proposed in geng94_six_degree_of_freed_activ. +The Cubic configuration for the Stewart platform was first proposed in (Geng and Haynes 1994). This configuration is quite specific in the sense that the active struts are arranged in a mutually orthogonal configuration connecting the corners of a cube. -This configuration is now widely used (preumont07_six_axis_singl_stage_activ,jafari03_orthog_gough_stewar_platf_microm). +This configuration is now widely used ((Preumont et al. 2007; Jafari and McInroy 2003)).

    -According to preumont07_six_axis_singl_stage_activ, the cubic configuration offers the following advantages: +According to (Preumont et al. 2007), the cubic configuration offers the following advantages:

    @@ -389,21 +177,21 @@ The Jacobian matrix is estimated at the location of the center of the cube.

    -
    H = 100e-3;     % height of the Stewart platform [m]
    -MO_B = -H/2;     % Position {B} with respect to {M} [m]
    -Hc = H;         % Size of the useful part of the cube [m]
    -FOc = H + MO_B; % Center of the cube with respect to {F}
    +
    H = 100e-3;     % height of the Stewart platform [m]
    +MO_B = -H/2;     % Position {B} with respect to {M} [m]
    +Hc = H;         % Size of the useful part of the cube [m]
    +FOc = H + MO_B; % Center of the cube with respect to {F}
     
    stewart = initializeStewartPlatform();
    -stewart = initializeFramesPositions(stewart, 'H', H, 'MO_B', MO_B);
    -stewart = generateCubicConfiguration(stewart, 'Hc', Hc, 'FOc', FOc, 'FHa', 0, 'MHb', 0);
    +stewart = initializeFramesPositions(stewart, 'H', H, 'MO_B', MO_B);
    +stewart = generateCubicConfiguration(stewart, 'Hc', Hc, 'FOc', FOc, 'FHa', 0, 'MHb', 0);
     stewart = computeJointsPose(stewart);
    -stewart = initializeStrutDynamics(stewart, 'K', ones(6,1));
    +stewart = initializeStrutDynamics(stewart, 'K', ones(6,1));
     stewart = computeJacobian(stewart);
    -stewart = initializeCylindricalPlatforms(stewart, 'Fpr', 175e-3, 'Mpr', 150e-3);
    +stewart = initializeCylindricalPlatforms(stewart, 'Fpr', 175e-3, 'Mpr', 150e-3);
     
    @@ -498,21 +286,21 @@ The Jacobian matrix is not estimated at the location of the center of the cube.

    -
    H    = 100e-3; % height of the Stewart platform [m]
    -MO_B = 20e-3;  % Position {B} with respect to {M} [m]
    -Hc   = H;      % Size of the useful part of the cube [m]
    -FOc  = H/2;    % Center of the cube with respect to {F}
    +
    H    = 100e-3; % height of the Stewart platform [m]
    +MO_B = 20e-3;  % Position {B} with respect to {M} [m]
    +Hc   = H;      % Size of the useful part of the cube [m]
    +FOc  = H/2;    % Center of the cube with respect to {F}
     
    stewart = initializeStewartPlatform();
    -stewart = initializeFramesPositions(stewart, 'H', H, 'MO_B', MO_B);
    -stewart = generateCubicConfiguration(stewart, 'Hc', Hc, 'FOc', FOc, 'FHa', 0, 'MHb', 0);
    +stewart = initializeFramesPositions(stewart, 'H', H, 'MO_B', MO_B);
    +stewart = generateCubicConfiguration(stewart, 'Hc', Hc, 'FOc', FOc, 'FHa', 0, 'MHb', 0);
     stewart = computeJointsPose(stewart);
    -stewart = initializeStrutDynamics(stewart, 'K', ones(6,1));
    +stewart = initializeStrutDynamics(stewart, 'K', ones(6,1));
     stewart = computeJacobian(stewart);
    -stewart = initializeCylindricalPlatforms(stewart, 'Fpr', 175e-3, 'Mpr', 150e-3);
    +stewart = initializeCylindricalPlatforms(stewart, 'Fpr', 175e-3, 'Mpr', 150e-3);
     
    @@ -607,21 +395,21 @@ The Jacobian is estimated at the cube center.

    -
    H    = 80e-3; % height of the Stewart platform [m]
    -MO_B = -30e-3;  % Position {B} with respect to {M} [m]
    -Hc   = 100e-3;      % Size of the useful part of the cube [m]
    -FOc  = H + MO_B;    % Center of the cube with respect to {F}
    +
    H    = 80e-3; % height of the Stewart platform [m]
    +MO_B = -30e-3;  % Position {B} with respect to {M} [m]
    +Hc   = 100e-3;      % Size of the useful part of the cube [m]
    +FOc  = H + MO_B;    % Center of the cube with respect to {F}
     
    stewart = initializeStewartPlatform();
    -stewart = initializeFramesPositions(stewart, 'H', H, 'MO_B', MO_B);
    -stewart = generateCubicConfiguration(stewart, 'Hc', Hc, 'FOc', FOc, 'FHa', 0, 'MHb', 0);
    +stewart = initializeFramesPositions(stewart, 'H', H, 'MO_B', MO_B);
    +stewart = generateCubicConfiguration(stewart, 'Hc', Hc, 'FOc', FOc, 'FHa', 0, 'MHb', 0);
     stewart = computeJointsPose(stewart);
    -stewart = initializeStrutDynamics(stewart, 'K', ones(6,1));
    +stewart = initializeStrutDynamics(stewart, 'K', ones(6,1));
     stewart = computeJacobian(stewart);
    -stewart = initializeCylindricalPlatforms(stewart, 'Fpr', 175e-3, 'Mpr', 150e-3);
    +stewart = initializeCylindricalPlatforms(stewart, 'Fpr', 175e-3, 'Mpr', 150e-3);
     
    @@ -727,21 +515,21 @@ The center of the cube from the top platform is at \(z = 110 - 175 = -65\).

    -
    H    = 100e-3; % height of the Stewart platform [m]
    -MO_B = -H/2;  % Position {B} with respect to {M} [m]
    -Hc   = 1.5*H;      % Size of the useful part of the cube [m]
    -FOc  = H/2 + 10e-3;    % Center of the cube with respect to {F}
    +
    H    = 100e-3; % height of the Stewart platform [m]
    +MO_B = -H/2;  % Position {B} with respect to {M} [m]
    +Hc   = 1.5*H;      % Size of the useful part of the cube [m]
    +FOc  = H/2 + 10e-3;    % Center of the cube with respect to {F}
     
    stewart = initializeStewartPlatform();
    -stewart = initializeFramesPositions(stewart, 'H', H, 'MO_B', MO_B);
    -stewart = generateCubicConfiguration(stewart, 'Hc', Hc, 'FOc', FOc, 'FHa', 0, 'MHb', 0);
    +stewart = initializeFramesPositions(stewart, 'H', H, 'MO_B', MO_B);
    +stewart = generateCubicConfiguration(stewart, 'Hc', Hc, 'FOc', FOc, 'FHa', 0, 'MHb', 0);
     stewart = computeJointsPose(stewart);
    -stewart = initializeStrutDynamics(stewart, 'K', ones(6,1));
    +stewart = initializeStrutDynamics(stewart, 'K', ones(6,1));
     stewart = computeJacobian(stewart);
    -stewart = initializeCylindricalPlatforms(stewart, 'Fpr', 215e-3, 'Mpr', 195e-3);
    +stewart = initializeCylindricalPlatforms(stewart, 'Fpr', 215e-3, 'Mpr', 195e-3);
     
    @@ -827,8 +615,8 @@ stewart = initializeCylindricalPlatforms(stewart, 'Fpr'
    -
    -

    1.5 Conclusion

    +
    +

    1.5 Conclusion

    @@ -883,8 +671,8 @@ Thus, we want the cube’s center to be located above the top center. Let’s fix the Height of the Stewart platform and the position of frames \(\{A\}\) and \(\{B\}\):

    -
    H    = 100e-3; % height of the Stewart platform [m]
    -MO_B = 20e-3;  % Position {B} with respect to {M} [m]
    +
    H    = 100e-3; % height of the Stewart platform [m]
    +MO_B = 20e-3;  % Position {B} with respect to {M} [m]
     
    @@ -904,8 +692,8 @@ However, the rotational stiffnesses are increasing with the cube’s size bu

    -
    Hc   = 0.4*H;    % Size of the useful part of the cube [m]
    -FOc  = H + MO_B; % Center of the cube with respect to {F}
    +
    Hc   = 0.4*H;    % Size of the useful part of the cube [m]
    +FOc  = H + MO_B; % Center of the cube with respect to {F}
     
    @@ -990,8 +778,8 @@ FOc = H + MO_B; % Cente
    -
    Hc   = 1.5*H;    % Size of the useful part of the cube [m]
    -FOc  = H + MO_B; % Center of the cube with respect to {F}
    +
    Hc   = 1.5*H;    % Size of the useful part of the cube [m]
    +FOc  = H + MO_B; % Center of the cube with respect to {F}
     
    @@ -1077,8 +865,8 @@ FOc = H + MO_B; % Cente
    -
    Hc   = 2.5*H;    % Size of the useful part of the cube [m]
    -FOc  = H + MO_B; % Center of the cube with respect to {F}
    +
    Hc   = 2.5*H;    % Size of the useful part of the cube [m]
    +FOc  = H + MO_B; % Center of the cube with respect to {F}
     
    @@ -1256,8 +1044,8 @@ For a small cube:
    -
    -

    2.3 Conclusion

    +
    +

    2.3 Conclusion

    @@ -1282,12 +1070,12 @@ Depending on the cube’s size, we obtain 3 different configurations. Small -furutani04_nanom_cuttin_machin_using_stewar +(Furutani, Suzuki, and Kudoh 2004) Medium -yang19_dynam_model_decoup_contr_flexib +(Yang et al. 2019) @@ -1339,7 +1127,7 @@ We only vary the size of the cube. We initialize the wanted cube’s size.

    -
    Hcs = 1e-3*[250:20:350]; % Heights for the Cube [m]
    +
    Hcs = 1e-3*[250:20:350]; % Heights for the Cube [m]
     Ks = zeros(6, 6, length(Hcs));
     
    @@ -1348,7 +1136,7 @@ Ks = zeros(6, 6, length(Hcs)); The height of the Stewart platform is fixed:

    -
    H    = 100e-3; % height of the Stewart platform [m]
    +
    H    = 100e-3; % height of the Stewart platform [m]
     
    @@ -1356,8 +1144,8 @@ The height of the Stewart platform is fixed: The frames \(\{A\}\) and \(\{B\}\) are positioned at the Stewart platform center as well as the cube’s center:

    -
    MO_B = -50e-3;  % Position {B} with respect to {M} [m]
    -FOc  = H + MO_B; % Center of the cube with respect to {F}
    +
    MO_B = -50e-3;  % Position {B} with respect to {M} [m]
    +FOc  = H + MO_B; % Center of the cube with respect to {F}
     
    @@ -1375,8 +1163,8 @@ We also find that \(k_{\theta_x} = k_{\theta_y}\) and \(k_{\theta_z}\) are varyi
    -
    -

    3.2 Conclusion

    +
    +

    3.2 Conclusion

    We observe that \(k_{\theta_x} = k_{\theta_y}\) and \(k_{\theta_z}\) increase linearly with the cube size. @@ -1463,8 +1251,8 @@ Let’s create a Cubic Stewart Platform where the Center of Mass of the m We define the size of the Stewart platform and the position of frames \(\{A\}\) and \(\{B\}\).

    -
    H    = 200e-3; % height of the Stewart platform [m]
    -MO_B = -10e-3;  % Position {B} with respect to {M} [m]
    +
    H    = 200e-3; % height of the Stewart platform [m]
    +MO_B = -10e-3;  % Position {B} with respect to {M} [m]
     
    @@ -1472,18 +1260,18 @@ MO_B = -10e-3;
    -
    Hc   = 2.5*H;    % Size of the useful part of the cube [m]
    -FOc  = H + MO_B; % Center of the cube with respect to {F}
    +
    Hc   = 2.5*H;    % Size of the useful part of the cube [m]
    +FOc  = H + MO_B; % Center of the cube with respect to {F}
     
    stewart = initializeStewartPlatform();
    -stewart = initializeFramesPositions(stewart, 'H', H, 'MO_B', MO_B);
    -stewart = generateCubicConfiguration(stewart, 'Hc', Hc, 'FOc', FOc, 'FHa', 25e-3, 'MHb', 25e-3);
    +stewart = initializeFramesPositions(stewart, 'H', H, 'MO_B', MO_B);
    +stewart = generateCubicConfiguration(stewart, 'Hc', Hc, 'FOc', FOc, 'FHa', 25e-3, 'MHb', 25e-3);
     stewart = computeJointsPose(stewart);
    -stewart = initializeStrutDynamics(stewart, 'K', 1e6*ones(6,1), 'C', 1e1*ones(6,1));
    -stewart = initializeJointDynamics(stewart, 'type_F', 'universal', 'type_M', 'spherical');
    +stewart = initializeStrutDynamics(stewart, 'K', 1e6*ones(6,1), 'C', 1e1*ones(6,1));
    +stewart = initializeJointDynamics(stewart, 'type_F', 'universal', 'type_M', 'spherical');
     stewart = computeJacobian(stewart);
     stewart = initializeStewartPose(stewart);
     
    @@ -1493,10 +1281,10 @@ stewart = initializeStewartPose(stewart); Now we set the geometry and mass of the mobile platform such that its center of mass is coincident with \(\{A\}\) and \(\{B\}\).

    -
    stewart = initializeCylindricalPlatforms(stewart, 'Fpr', 1.2*max(vecnorm(stewart.platform_F.Fa)), ...
    -                                                  'Mpm', 10, ...
    -                                                  'Mph', 20e-3, ...
    -                                                  'Mpr', 1.2*max(vecnorm(stewart.platform_M.Mb)));
    +
    stewart = initializeCylindricalPlatforms(stewart, 'Fpr', 1.2*max(vecnorm(stewart.platform_F.Fa)), ...
    +                                                  'Mpm', 10, ...
    +                                                  'Mph', 20e-3, ...
    +                                                  'Mpr', 1.2*max(vecnorm(stewart.platform_M.Mb)));
     
    @@ -1504,7 +1292,7 @@ Now we set the geometry and mass of the mobile platform such that its center of And we set small mass for the struts.

    -
    stewart = initializeCylindricalStruts(stewart, 'Fsm', 1e-3, 'Msm', 1e-3);
    +
    stewart = initializeCylindricalStruts(stewart, 'Fsm', 1e-3, 'Msm', 1e-3);
     stewart = initializeInertialSensor(stewart);
     
    @@ -1513,9 +1301,9 @@ stewart = initializeInertialSensor(stewart); No flexibility below the Stewart platform and no payload.

    -
    ground = initializeGround('type', 'none');
    -payload = initializePayload('type', 'none');
    -controller = initializeController('type', 'open-loop');
    +
    ground = initializeGround('type', 'none');
    +payload = initializePayload('type', 'none');
    +controller = initializeController('type', 'open-loop');
     
    @@ -1534,24 +1322,24 @@ The obtain geometry is shown in figure 10. We now identify the dynamics from forces applied in each strut \(\bm{\tau}\) to the displacement of each strut \(d \bm{\mathcal{L}}\).

    -
    open('stewart_platform_model.slx')
    +
    open('stewart_platform_model.slx')
     
    -%% Options for Linearized
    +%% Options for Linearized
     options = linearizeOptions;
     options.SampleTime = 0;
     
    -%% Name of the Simulink File
    -mdl = 'stewart_platform_model';
    +%% Name of the Simulink File
    +mdl = 'stewart_platform_model';
     
    -%% Input/Output definition
    +%% Input/Output definition
     clear io; io_i = 1;
    -io(io_i) = linio([mdl, '/Controller'],        1, 'openinput');  io_i = io_i + 1; % Actuator Force Inputs [N]
    -io(io_i) = linio([mdl, '/Stewart Platform'],  1, 'openoutput', [], 'dLm'); io_i = io_i + 1; % Relative Displacement Outputs [m]
    +io(io_i) = linio([mdl, '/Controller'],        1, 'openinput');  io_i = io_i + 1; % Actuator Force Inputs [N]
    +io(io_i) = linio([mdl, '/Stewart Platform'],  1, 'openoutput', [], 'dLm'); io_i = io_i + 1; % Relative Displacement Outputs [m]
     
    -%% Run the linearization
    +%% Run the linearization
     G = linearize(mdl, io, options);
    -G.InputName  = {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'};
    -G.OutputName = {'Dm1', 'Dm2', 'Dm3', 'Dm4', 'Dm5', 'Dm6'};
    +G.InputName  = {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'};
    +G.OutputName = {'Dm1', 'Dm2', 'Dm3', 'Dm4', 'Dm5', 'Dm6'};
     
    @@ -1559,10 +1347,10 @@ G.OutputName = {'Dm1', Now, thanks to the Jacobian (Figure 9), we compute the transfer function from \(\bm{\mathcal{F}}\) to \(\bm{\mathcal{X}}\).

    -
    Gc = inv(stewart.kinematics.J)*G*inv(stewart.kinematics.J');
    -Gc = inv(stewart.kinematics.J)*G*stewart.kinematics.J;
    -Gc.InputName  = {'Fx', 'Fy', 'Fz', 'Mx', 'My', 'Mz'};
    -Gc.OutputName = {'Dx', 'Dy', 'Dz', 'Rx', 'Ry', 'Rz'};
    +
    Gc = inv(stewart.kinematics.J)*G*inv(stewart.kinematics.J');
    +Gc = inv(stewart.kinematics.J)*G*stewart.kinematics.J;
    +Gc.InputName  = {'Fx', 'Fy', 'Fz', 'Mx', 'My', 'Mz'};
    +Gc.OutputName = {'Dx', 'Dy', 'Dz', 'Rx', 'Ry', 'Rz'};
     
    @@ -1578,7 +1366,7 @@ The obtain dynamics \(\bm{G}_{c}(s) = \bm{J}^{-T} \bm{G}(s) \bm{J}^{-1}\) is sho

    -It is interesting to note here that the system shown in Figure 12 also yield a decoupled system (explained in section 1.3.3 in li01_simul_fault_vibrat_isolat_point). +It is interesting to note here that the system shown in Figure 12 also yield a decoupled system (explained in section 1.3.3 in (Li 2001)).

    @@ -1620,8 +1408,8 @@ This is because the Mass, Damping and Stiffness matrices are all diagonal. Let’s create a Stewart platform with a cubic architecture where the cube’s center is at the center of the Stewart platform.

    -
    H    = 200e-3; % height of the Stewart platform [m]
    -MO_B = -100e-3;  % Position {B} with respect to {M} [m]
    +
    H    = 200e-3; % height of the Stewart platform [m]
    +MO_B = -100e-3;  % Position {B} with respect to {M} [m]
     
    @@ -1629,18 +1417,18 @@ MO_B = -100e-3;
    -
    Hc   = 2.5*H;    % Size of the useful part of the cube [m]
    -FOc  = H + MO_B; % Center of the cube with respect to {F}
    +
    Hc   = 2.5*H;    % Size of the useful part of the cube [m]
    +FOc  = H + MO_B; % Center of the cube with respect to {F}
     
    stewart = initializeStewartPlatform();
    -stewart = initializeFramesPositions(stewart, 'H', H, 'MO_B', MO_B);
    -stewart = generateCubicConfiguration(stewart, 'Hc', Hc, 'FOc', FOc, 'FHa', 25e-3, 'MHb', 25e-3);
    +stewart = initializeFramesPositions(stewart, 'H', H, 'MO_B', MO_B);
    +stewart = generateCubicConfiguration(stewart, 'Hc', Hc, 'FOc', FOc, 'FHa', 25e-3, 'MHb', 25e-3);
     stewart = computeJointsPose(stewart);
    -stewart = initializeStrutDynamics(stewart, 'K', 1e6*ones(6,1), 'C', 1e1*ones(6,1));
    -stewart = initializeJointDynamics(stewart, 'type_F', 'universal', 'type_M', 'spherical');
    +stewart = initializeStrutDynamics(stewart, 'K', 1e6*ones(6,1), 'C', 1e1*ones(6,1));
    +stewart = initializeJointDynamics(stewart, 'type_F', 'universal', 'type_M', 'spherical');
     stewart = computeJacobian(stewart);
     stewart = initializeStewartPose(stewart);
     
    @@ -1650,10 +1438,10 @@ stewart = initializeStewartPose(stewart); However, the Center of Mass of the mobile platform is not located at the cube’s center.

    -
    stewart = initializeCylindricalPlatforms(stewart, 'Fpr', 1.2*max(vecnorm(stewart.platform_F.Fa)), ...
    -                                                  'Mpm', 10, ...
    -                                                  'Mph', 20e-3, ...
    -                                                  'Mpr', 1.2*max(vecnorm(stewart.platform_M.Mb)));
    +
    stewart = initializeCylindricalPlatforms(stewart, 'Fpr', 1.2*max(vecnorm(stewart.platform_F.Fa)), ...
    +                                                  'Mpm', 10, ...
    +                                                  'Mph', 20e-3, ...
    +                                                  'Mpr', 1.2*max(vecnorm(stewart.platform_M.Mb)));
     
    @@ -1661,7 +1449,7 @@ However, the Center of Mass of the mobile platform is not located at the And we set small mass for the struts.

    -
    stewart = initializeCylindricalStruts(stewart, 'Fsm', 1e-3, 'Msm', 1e-3);
    +
    stewart = initializeCylindricalStruts(stewart, 'Fsm', 1e-3, 'Msm', 1e-3);
     stewart = initializeInertialSensor(stewart);
     
    @@ -1670,9 +1458,9 @@ stewart = initializeInertialSensor(stewart); No flexibility below the Stewart platform and no payload.

    -
    ground = initializeGround('type', 'none');
    -payload = initializePayload('type', 'none');
    -controller = initializeController('type', 'open-loop');
    +
    ground = initializeGround('type', 'none');
    +payload = initializePayload('type', 'none');
    +controller = initializeController('type', 'open-loop');
     
    @@ -1690,24 +1478,24 @@ The obtain geometry is shown in figure 13. We now identify the dynamics from forces applied in each strut \(\bm{\tau}\) to the displacement of each strut \(d \bm{\mathcal{L}}\).

    -
    open('stewart_platform_model.slx')
    +
    open('stewart_platform_model.slx')
     
    -%% Options for Linearized
    +%% Options for Linearized
     options = linearizeOptions;
     options.SampleTime = 0;
     
    -%% Name of the Simulink File
    -mdl = 'stewart_platform_model';
    +%% Name of the Simulink File
    +mdl = 'stewart_platform_model';
     
    -%% Input/Output definition
    +%% Input/Output definition
     clear io; io_i = 1;
    -io(io_i) = linio([mdl, '/Controller'],        1, 'openinput');  io_i = io_i + 1; % Actuator Force Inputs [N]
    -io(io_i) = linio([mdl, '/Stewart Platform'],  1, 'openoutput', [], 'dLm'); io_i = io_i + 1; % Relative Displacement Outputs [m]
    +io(io_i) = linio([mdl, '/Controller'],        1, 'openinput');  io_i = io_i + 1; % Actuator Force Inputs [N]
    +io(io_i) = linio([mdl, '/Stewart Platform'],  1, 'openoutput', [], 'dLm'); io_i = io_i + 1; % Relative Displacement Outputs [m]
     
    -%% Run the linearization
    +%% Run the linearization
     G = linearize(mdl, io, options);
    -G.InputName  = {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'};
    -G.OutputName = {'Dm1', 'Dm2', 'Dm3', 'Dm4', 'Dm5', 'Dm6'};
    +G.InputName  = {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'};
    +G.OutputName = {'Dm1', 'Dm2', 'Dm3', 'Dm4', 'Dm5', 'Dm6'};
     
    @@ -1715,9 +1503,9 @@ G.OutputName = {'Dm1', And we use the Jacobian to compute the transfer function from \(\bm{\mathcal{F}}\) to \(\bm{\mathcal{X}}\).

    -
    Gc = inv(stewart.kinematics.J)*G*inv(stewart.kinematics.J');
    -Gc.InputName  = {'Fx', 'Fy', 'Fz', 'Mx', 'My', 'Mz'};
    -Gc.OutputName = {'Dx', 'Dy', 'Dz', 'Rx', 'Ry', 'Rz'};
    +
    Gc = inv(stewart.kinematics.J)*G*inv(stewart.kinematics.J');
    +Gc.InputName  = {'Fx', 'Fy', 'Fz', 'Mx', 'My', 'Mz'};
    +Gc.OutputName = {'Dx', 'Dy', 'Dz', 'Rx', 'Ry', 'Rz'};
     
    @@ -1745,8 +1533,8 @@ This was expected as the mass matrix is not diagonal (the Center of Mass of the
    -
    -

    4.3 Conclusion

    +
    +

    4.3 Conclusion

    @@ -1780,7 +1568,7 @@ To run the script, open the Simulink Project, and type run cubic_conf_coup

    -From preumont07_six_axis_singl_stage_activ, the cubic configuration “minimizes the cross-coupling amongst actuators and sensors of different legs (being orthogonal to each other)”. +From (Preumont et al. 2007), the cubic configuration “minimizes the cross-coupling amongst actuators and sensors of different legs (being orthogonal to each other)”.

    @@ -1800,27 +1588,27 @@ Let’s generate a Cubic architecture where the cube’s center and the

    -
    H    = 200e-3; % height of the Stewart platform [m]
    -MO_B = -10e-3;  % Position {B} with respect to {M} [m]
    -Hc   = 2.5*H;    % Size of the useful part of the cube [m]
    -FOc  = H + MO_B; % Center of the cube with respect to {F}
    +
    H    = 200e-3; % height of the Stewart platform [m]
    +MO_B = -10e-3;  % Position {B} with respect to {M} [m]
    +Hc   = 2.5*H;    % Size of the useful part of the cube [m]
    +FOc  = H + MO_B; % Center of the cube with respect to {F}
     
    stewart = initializeStewartPlatform();
    -stewart = initializeFramesPositions(stewart, 'H', H, 'MO_B', MO_B);
    -stewart = generateCubicConfiguration(stewart, 'Hc', Hc, 'FOc', FOc, 'FHa', 25e-3, 'MHb', 25e-3);
    +stewart = initializeFramesPositions(stewart, 'H', H, 'MO_B', MO_B);
    +stewart = generateCubicConfiguration(stewart, 'Hc', Hc, 'FOc', FOc, 'FHa', 25e-3, 'MHb', 25e-3);
     stewart = computeJointsPose(stewart);
    -stewart = initializeStrutDynamics(stewart, 'K', 1e6*ones(6,1), 'C', 1e1*ones(6,1));
    -stewart = initializeJointDynamics(stewart, 'type_F', 'universal', 'type_M', 'spherical');
    +stewart = initializeStrutDynamics(stewart, 'K', 1e6*ones(6,1), 'C', 1e1*ones(6,1));
    +stewart = initializeJointDynamics(stewart, 'type_F', 'universal', 'type_M', 'spherical');
     stewart = computeJacobian(stewart);
     stewart = initializeStewartPose(stewart);
    -stewart = initializeCylindricalPlatforms(stewart, 'Fpr', 1.2*max(vecnorm(stewart.platform_F.Fa)), ...
    -                                                  'Mpm', 10, ...
    -                                                  'Mph', 20e-3, ...
    -                                                  'Mpr', 1.2*max(vecnorm(stewart.platform_M.Mb)));
    -stewart = initializeCylindricalStruts(stewart, 'Fsm', 1e-3, 'Msm', 1e-3);
    +stewart = initializeCylindricalPlatforms(stewart, 'Fpr', 1.2*max(vecnorm(stewart.platform_F.Fa)), ...
    +                                                  'Mpm', 10, ...
    +                                                  'Mph', 20e-3, ...
    +                                                  'Mpr', 1.2*max(vecnorm(stewart.platform_M.Mb)));
    +stewart = initializeCylindricalStruts(stewart, 'Fsm', 1e-3, 'Msm', 1e-3);
     stewart = initializeInertialSensor(stewart);
     
    @@ -1829,9 +1617,9 @@ stewart = initializeInertialSensor(stewart); No flexibility below the Stewart platform and no payload.

    -
    ground = initializeGround('type', 'none');
    -payload = initializePayload('type', 'none');
    -controller = initializeController('type', 'open-loop');
    +
    ground = initializeGround('type', 'none');
    +payload = initializePayload('type', 'none');
    +controller = initializeController('type', 'open-loop');
     
    @@ -1876,25 +1664,25 @@ Now we generate a Stewart platform which is not cubic but with approximately the

    -
    H    = 200e-3; % height of the Stewart platform [m]
    -MO_B = -10e-3;  % Position {B} with respect to {M} [m]
    +
    H    = 200e-3; % height of the Stewart platform [m]
    +MO_B = -10e-3;  % Position {B} with respect to {M} [m]
     
    stewart = initializeStewartPlatform();
    -stewart = initializeFramesPositions(stewart, 'H', H, 'MO_B', MO_B);
    -stewart = generateGeneralConfiguration(stewart, 'FR', 250e-3, 'MR', 150e-3);
    +stewart = initializeFramesPositions(stewart, 'H', H, 'MO_B', MO_B);
    +stewart = generateGeneralConfiguration(stewart, 'FR', 250e-3, 'MR', 150e-3);
     stewart = computeJointsPose(stewart);
    -stewart = initializeStrutDynamics(stewart, 'K', 1e6*ones(6,1), 'C', 1e1*ones(6,1));
    -stewart = initializeJointDynamics(stewart, 'type_F', 'universal', 'type_M', 'spherical');
    +stewart = initializeStrutDynamics(stewart, 'K', 1e6*ones(6,1), 'C', 1e1*ones(6,1));
    +stewart = initializeJointDynamics(stewart, 'type_F', 'universal', 'type_M', 'spherical');
     stewart = computeJacobian(stewart);
     stewart = initializeStewartPose(stewart);
    -stewart = initializeCylindricalPlatforms(stewart, 'Fpr', 1.2*max(vecnorm(stewart.platform_F.Fa)), ...
    -                                                  'Mpm', 10, ...
    -                                                  'Mph', 20e-3, ...
    -                                                  'Mpr', 1.2*max(vecnorm(stewart.platform_M.Mb)));
    -stewart = initializeCylindricalStruts(stewart, 'Fsm', 1e-3, 'Msm', 1e-3);
    +stewart = initializeCylindricalPlatforms(stewart, 'Fpr', 1.2*max(vecnorm(stewart.platform_F.Fa)), ...
    +                                                  'Mpm', 10, ...
    +                                                  'Mph', 20e-3, ...
    +                                                  'Mpr', 1.2*max(vecnorm(stewart.platform_M.Mb)));
    +stewart = initializeCylindricalStruts(stewart, 'Fsm', 1e-3, 'Msm', 1e-3);
     stewart = initializeInertialSensor(stewart);
     
    @@ -1903,9 +1691,9 @@ stewart = initializeInertialSensor(stewart); No flexibility below the Stewart platform and no payload.

    -
    ground = initializeGround('type', 'none');
    -payload = initializePayload('type', 'none');
    -controller = initializeController('type', 'open-loop');
    +
    ground = initializeGround('type', 'none');
    +payload = initializePayload('type', 'none');
    +controller = initializeController('type', 'open-loop');
     
    @@ -1936,8 +1724,8 @@ And we identify the dynamics from the actuator forces \(\tau_{i}\) to the relati
    -
    -

    5.3 Conclusion

    +
    +

    5.3 Conclusion

    @@ -1973,24 +1761,24 @@ This Matlab function is accessible Function description

    -
    function [stewart] = generateCubicConfiguration(stewart, args)
    -% generateCubicConfiguration - Generate a Cubic Configuration
    -%
    -% Syntax: [stewart] = generateCubicConfiguration(stewart, args)
    -%
    -% Inputs:
    -%    - stewart - A structure with the following fields
    -%        - geometry.H [1x1] - Total height of the platform [m]
    -%    - args - Can have the following fields:
    -%        - Hc  [1x1] - Height of the "useful" part of the cube [m]
    -%        - FOc [1x1] - Height of the center of the cube with respect to {F} [m]
    -%        - FHa [1x1] - Height of the plane joining the points ai with respect to the frame {F} [m]
    -%        - MHb [1x1] - Height of the plane joining the points bi with respect to the frame {M} [m]
    -%
    -% Outputs:
    -%    - stewart - updated Stewart structure with the added fields:
    -%        - platform_F.Fa  [3x6] - Its i'th column is the position vector of joint ai with respect to {F}
    -%        - platform_M.Mb  [3x6] - Its i'th column is the position vector of joint bi with respect to {M}
    +
    function [stewart] = generateCubicConfiguration(stewart, args)
    +% generateCubicConfiguration - Generate a Cubic Configuration
    +%
    +% Syntax: [stewart] = generateCubicConfiguration(stewart, args)
    +%
    +% Inputs:
    +%    - stewart - A structure with the following fields
    +%        - geometry.H [1x1] - Total height of the platform [m]
    +%    - args - Can have the following fields:
    +%        - Hc  [1x1] - Height of the "useful" part of the cube [m]
    +%        - FOc [1x1] - Height of the center of the cube with respect to {F} [m]
    +%        - FHa [1x1] - Height of the plane joining the points ai with respect to the frame {F} [m]
    +%        - MHb [1x1] - Height of the plane joining the points bi with respect to the frame {M} [m]
    +%
    +% Outputs:
    +%    - stewart - updated Stewart structure with the added fields:
    +%        - platform_F.Fa  [3x6] - Its i'th column is the position vector of joint ai with respect to {F}
    +%        - platform_M.Mb  [3x6] - Its i'th column is the position vector of joint bi with respect to {M}
     
    @@ -2014,11 +1802,11 @@ This Matlab function is accessible
    arguments
         stewart
    -    args.Hc  (1,1) double {mustBeNumeric, mustBePositive} = 60e-3
    -    args.FOc (1,1) double {mustBeNumeric} = 50e-3
    -    args.FHa (1,1) double {mustBeNumeric, mustBeNonnegative} = 15e-3
    -    args.MHb (1,1) double {mustBeNumeric, mustBeNonnegative} = 15e-3
    -end
    +    args.Hc  (1,1) double {mustBeNumeric, mustBePositive} = 60e-3
    +    args.FOc (1,1) double {mustBeNumeric} = 50e-3
    +    args.FHa (1,1) double {mustBeNumeric, mustBeNonnegative} = 15e-3
    +    args.MHb (1,1) double {mustBeNumeric, mustBeNonnegative} = 15e-3
    +end
     
    @@ -2028,7 +1816,7 @@ This Matlab function is accessible Check the stewart structure elements
    -
    assert(isfield(stewart.geometry, 'H'),   'stewart.geometry should have attribute H')
    +
    assert(isfield(stewart.geometry, 'H'),   'stewart.geometry should have attribute H')
     H = stewart.geometry.H;
     
    @@ -2044,18 +1832,18 @@ We define the useful points of the cube with respect to the Cube’s center.

    -
    sx = [ 2; -1; -1];
    -sy = [ 0;  1; -1];
    +
    sx = [ 2; -1; -1];
    +sy = [ 0;  1; -1];
     sz = [ 1;  1;  1];
     
    -R = [sx, sy, sz]./vecnorm([sx, sy, sz]);
    +R = [sx, sy, sz]./vecnorm([sx, sy, sz]);
     
    -L = args.Hc*sqrt(3);
    +L = args.Hc*sqrt(3);
     
    -Cc = R'*[[0;0;L],[L;0;L],[L;0;0],[L;L;0],[0;L;0],[0;L;L]] - [0;0;1.5*args.Hc];
    +Cc = R'*[[0;0;L],[L;0;L],[L;0;0],[L;L;0],[0;L;0],[0;L;L]] - [0;0;1.5*args.Hc];
     
    -CCf = [Cc(:,1), Cc(:,3), Cc(:,3), Cc(:,5), Cc(:,5), Cc(:,1)]; % CCf(:,i) corresponds to the bottom cube's vertice corresponding to the i'th leg
    -CCm = [Cc(:,2), Cc(:,2), Cc(:,4), Cc(:,4), Cc(:,6), Cc(:,6)]; % CCm(:,i) corresponds to the top cube's vertice corresponding to the i'th leg
    +CCf = [Cc(:,1), Cc(:,3), Cc(:,3), Cc(:,5), Cc(:,5), Cc(:,1)]; % CCf(:,i) corresponds to the bottom cube's vertice corresponding to the i'th leg
    +CCm = [Cc(:,2), Cc(:,2), Cc(:,4), Cc(:,4), Cc(:,6), Cc(:,6)]; % CCm(:,i) corresponds to the top cube's vertice corresponding to the i'th leg
     
    @@ -2068,7 +1856,7 @@ CCm = [Cc(:,2), Cc(: We can compute the vector of each leg \({}^{C}\hat{\bm{s}}_{i}\) (unit vector from \({}^{C}C_{f}\) to \({}^{C}C_{m}\)).

    -
    CSi = (CCm - CCf)./vecnorm(CCm - CCf);
    +
    CSi = (CCm - CCf)./vecnorm(CCm - CCf);
     
    @@ -2076,8 +1864,8 @@ We can compute the vector of each leg \({}^{C}\hat{\bm{s}}_{i}\) (unit vector fr We now which to compute the position of the joints \(a_{i}\) and \(b_{i}\).

    -
    Fa = CCf + [0; 0; args.FOc] + ((args.FHa-(args.FOc-args.Hc/2))./CSi(3,:)).*CSi;
    -Mb = CCf + [0; 0; args.FOc-H] + ((H-args.MHb-(args.FOc-args.Hc/2))./CSi(3,:)).*CSi;
    +
    Fa = CCf + [0; 0; args.FOc] + ((args.FHa-(args.FOc-args.Hc/2))./CSi(3,:)).*CSi;
    +Mb = CCf + [0; 0; args.FOc-H] + ((H-args.MHb-(args.FOc-args.Hc/2))./CSi(3,:)).*CSi;
     
    @@ -2098,25 +1886,21 @@ stewart.platform_M.Mb = Mb;

    -

    Bibliography

    -
    • [geng94_six_degree_of_freed_activ] Geng & Haynes, Six Degree-Of-Freedom Active Vibration Control Using the Stewart Platforms, IEEE Transactions on Control Systems Technology, 2(1), 45-53 (1994). link. doi.
    • -
    • [preumont07_six_axis_singl_stage_activ] Preumont, Horodinca, Romanescu, de Marneffe, Avraam, Deraemaeker, Bossens & Abu Hanieh, A Six-Axis Single-Stage Active Vibration Isolator Based on Stewart Platform, Journal of Sound and Vibration, 300(3-5), 644-661 (2007). link. doi.
    • -
    • [jafari03_orthog_gough_stewar_platf_microm] Jafari & McInroy, Orthogonal Gough-Stewart Platforms for Micromanipulation, IEEE Transactions on Robotics and Automation, 19(4), 595-603 (2003). link. doi.
    • -
    • [furutani04_nanom_cuttin_machin_using_stewar] Katsushi Furutani, Michio Suzuki & Ryusei Kudoh, Nanometre-Cutting Machine Using a Stewart-Platform Parallel Mechanism, Measurement Science and Technology, 15(2), 467-474 (2004). link. doi.
    • -
    • [yang19_dynam_model_decoup_contr_flexib] Yang, Wu, Chen, Kang & Cheng, Dynamic Modeling and Decoupled Control of a Flexible Stewart Platform for Vibration Isolation, Journal of Sound and Vibration, 439, 398-412 (2019). link. doi.
    • -
    • [li01_simul_fault_vibrat_isolat_point] @phdthesisli01_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, -
    • -

    + +

    Bibliography

    +
    +
    Furutani, Katsushi, Michio Suzuki, and Ryusei Kudoh. 2004. “Nanometre-Cutting Machine Using a Stewart-Platform Parallel Mechanism.” Measurement Science and Technology 15 (2):467–74. https://doi.org/10.1088/0957-0233/15/2/022.
    +
    Geng, Z.J., and L.S. Haynes. 1994. “Six Degree-of-Freedom Active Vibration Control Using the Stewart Platforms.” IEEE Transactions on Control Systems Technology 2 (1):45–53. https://doi.org/10.1109/87.273110.
    +
    Jafari, F., and J.E. McInroy. 2003. “Orthogonal Gough-Stewart Platforms for Micromanipulation.” IEEE Transactions on Robotics and Automation 19 (4). Institute of Electrical and Electronics Engineers (IEEE):595–603. https://doi.org/10.1109/tra.2003.814506.
    +
    Li, Xiaochun. 2001. “Simultaneous, Fault-Tolerant Vibration Isolation and Pointing Control of Flexure Jointed Hexapods.” University of Wyoming.
    +
    Preumont, A., M. Horodinca, I. Romanescu, B. de Marneffe, M. Avraam, A. Deraemaeker, F. Bossens, and A. Abu Hanieh. 2007. “A Six-Axis Single-Stage Active Vibration Isolator Based on Stewart Platform.” Journal of Sound and Vibration 300 (3-5):644–61. https://doi.org/10.1016/j.jsv.2006.07.050.
    +
    Yang, XiaoLong, HongTao Wu, Bai Chen, ShengZheng Kang, and ShiLi Cheng. 2019. “Dynamic Modeling and Decoupled Control of a Flexible Stewart Platform for Vibration Isolation.” Journal of Sound and Vibration 439 (January). Elsevier BV:398–412. https://doi.org/10.1016/j.jsv.2018.10.007.
    +

    Author: Dehaeze Thomas

    -

    Created: 2020-03-12 jeu. 18:06

    +

    Created: 2020-08-05 mer. 13:27

    diff --git a/docs/dynamics-study.html b/docs/dynamics-study.html index ce9f527..fc51ac4 100644 --- a/docs/dynamics-study.html +++ b/docs/dynamics-study.html @@ -1,239 +1,27 @@ - - + - Stewart Platform - Dynamics Study - - - - +
    @@ -250,13 +38,13 @@
  • 2. Comparison of the static transfer function and the Compliance matrix
  • @@ -279,16 +67,16 @@ Let’s generate a Stewart platform.

    stewart = initializeStewartPlatform();
    -stewart = initializeFramesPositions(stewart, 'H', 90e-3, 'MO_B', 45e-3);
    +stewart = initializeFramesPositions(stewart, 'H', 90e-3, 'MO_B', 45e-3);
     stewart = generateGeneralConfiguration(stewart);
     stewart = computeJointsPose(stewart);
     stewart = initializeStrutDynamics(stewart);
    -stewart = initializeJointDynamics(stewart, 'type_F', 'universal_p', 'type_M', 'spherical_p');
    +stewart = initializeJointDynamics(stewart, 'type_F', 'universal_p', 'type_M', 'spherical_p');
     stewart = initializeCylindricalPlatforms(stewart);
     stewart = initializeCylindricalStruts(stewart);
     stewart = computeJacobian(stewart);
     stewart = initializeStewartPose(stewart);
    -stewart = initializeInertialSensor(stewart, 'type', 'none');
    +stewart = initializeInertialSensor(stewart, 'type', 'none');
     
    @@ -297,9 +85,9 @@ We don’t put any flexibility below the Stewart platform such that its b We also don’t put any payload on top of the Stewart platform.

    -
    ground = initializeGround('type', 'none');
    -payload = initializePayload('type', 'none');
    -controller = initializeController('type', 'open-loop');
    +
    ground = initializeGround('type', 'none');
    +payload = initializePayload('type', 'none');
    +controller = initializeController('type', 'open-loop');
     
    @@ -307,22 +95,22 @@ controller = initializeController('type',
    -
    %% Options for Linearized
    +
    %% Options for Linearized
     options = linearizeOptions;
     options.SampleTime = 0;
     
    -%% Name of the Simulink File
    -mdl = 'stewart_platform_model';
    +%% Name of the Simulink File
    +mdl = 'stewart_platform_model';
     
    -%% Input/Output definition
    +%% Input/Output definition
     clear io; io_i = 1;
    -io(io_i) = linio([mdl, '/Controller'],              1, 'openinput');  io_i = io_i + 1; % Actuator Force Inputs [N]
    -io(io_i) = linio([mdl, '/Relative Motion Sensor'],  1, 'openoutput'); io_i = io_i + 1; % Position/Orientation of {B} w.r.t. {A}
    +io(io_i) = linio([mdl, '/Controller'],              1, 'openinput');  io_i = io_i + 1; % Actuator Force Inputs [N]
    +io(io_i) = linio([mdl, '/Relative Motion Sensor'],  1, 'openoutput'); io_i = io_i + 1; % Position/Orientation of {B} w.r.t. {A}
     
    -%% Run the linearization
    +%% Run the linearization
     G = linearize(mdl, io, options);
    -G.InputName  = {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'};
    -G.OutputName = {'Edx', 'Edy', 'Edz', 'Erx', 'Ery', 'Erz'};
    +G.InputName  = {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'};
    +G.OutputName = {'Edx', 'Edy', 'Edz', 'Erx', 'Ery', 'Erz'};
     
    @@ -330,8 +118,8 @@ G.OutputName = {'Edx', Using the Jacobian matrix, we compute the transfer function from force/torques applied by the actuators on the frame \(\{B\}\) fixed to the mobile platform:

    -
    Gc = minreal(G*inv(stewart.kinematics.J'));
    -Gc.InputName = {'Fnx', 'Fny', 'Fnz', 'Mnx', 'Mny', 'Mnz'};
    +
    Gc = minreal(G*inv(stewart.kinematics.J'));
    +Gc.InputName = {'Fnx', 'Fny', 'Fnz', 'Mnx', 'Mny', 'Mnz'};
     
    @@ -339,15 +127,15 @@ Gc.InputName = {'Fnx', We also extract the transfer function from external forces \(\bm{\mathcal{F}}_{\text{ext}}\) on the frame \(\{B\}\) fixed to the mobile platform to the relative displacement \(\mathcal{\bm{X}}\) of \(\{B\}\) with respect to frame \(\{A\}\):

    -
    %% Input/Output definition
    +
    %% Input/Output definition
     clear io; io_i = 1;
    -io(io_i) = linio([mdl, '/Disturbances'], 1, 'openinput', [], 'F_ext');  io_i = io_i + 1; % External forces/torques applied on {B}
    -io(io_i) = linio([mdl, '/Relative Motion Sensor'],  1, 'openoutput'); io_i = io_i + 1; % Position/Orientation of {B} w.r.t. {A}
    +io(io_i) = linio([mdl, '/Disturbances'], 1, 'openinput', [], 'F_ext');  io_i = io_i + 1; % External forces/torques applied on {B}
    +io(io_i) = linio([mdl, '/Relative Motion Sensor'],  1, 'openoutput'); io_i = io_i + 1; % Position/Orientation of {B} w.r.t. {A}
     
    -%% Run the linearization
    +%% Run the linearization
     Gd = linearize(mdl, io, options);
    -Gd.InputName  = {'Fex', 'Fey', 'Fez', 'Mex', 'Mey', 'Mez'};
    -Gd.OutputName = {'Edx', 'Edy', 'Edz', 'Erx', 'Ery', 'Erz'};
    +Gd.InputName  = {'Fex', 'Fey', 'Fez', 'Mex', 'Mey', 'Mez'};
    +Gd.OutputName = {'Edx', 'Edy', 'Edz', 'Erx', 'Ery', 'Erz'};
     
    @@ -382,7 +170,7 @@ This can be understood from figure 2 where \(\mathcal{ We now add a flexible support under the Stewart platform.

    -
    ground = initializeGround('type', 'flexible');
    +
    ground = initializeGround('type', 'flexible');
     
    @@ -390,28 +178,28 @@ We now add a flexible support under the Stewart platform. And we perform again the identification.

    -
    %% Input/Output definition
    +
    %% Input/Output definition
     clear io; io_i = 1;
    -io(io_i) = linio([mdl, '/Controller'],              1, 'openinput');  io_i = io_i + 1; % Actuator Force Inputs [N]
    -io(io_i) = linio([mdl, '/Relative Motion Sensor'],  1, 'openoutput'); io_i = io_i + 1; % Position/Orientation of {B} w.r.t. {A}
    +io(io_i) = linio([mdl, '/Controller'],              1, 'openinput');  io_i = io_i + 1; % Actuator Force Inputs [N]
    +io(io_i) = linio([mdl, '/Relative Motion Sensor'],  1, 'openoutput'); io_i = io_i + 1; % Position/Orientation of {B} w.r.t. {A}
     
    -%% Run the linearization
    +%% Run the linearization
     G = linearize(mdl, io, options);
    -G.InputName  = {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'};
    -G.OutputName = {'Edx', 'Edy', 'Edz', 'Erx', 'Ery', 'Erz'};
    +G.InputName  = {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'};
    +G.OutputName = {'Edx', 'Edy', 'Edz', 'Erx', 'Ery', 'Erz'};
     
    -Gc = minreal(G*inv(stewart.kinematics.J'));
    -Gc.InputName = {'Fnx', 'Fny', 'Fnz', 'Mnx', 'Mny', 'Mnz'};
    +Gc = minreal(G*inv(stewart.kinematics.J'));
    +Gc.InputName = {'Fnx', 'Fny', 'Fnz', 'Mnx', 'Mny', 'Mnz'};
     
    -%% Input/Output definition
    +%% Input/Output definition
     clear io; io_i = 1;
    -io(io_i) = linio([mdl, '/Disturbances'], 1, 'openinput', [], 'F_ext');  io_i = io_i + 1; % External forces/torques applied on {B}
    -io(io_i) = linio([mdl, '/Relative Motion Sensor'],  1, 'openoutput'); io_i = io_i + 1; % Position/Orientation of {B} w.r.t. {A}
    +io(io_i) = linio([mdl, '/Disturbances'], 1, 'openinput', [], 'F_ext');  io_i = io_i + 1; % External forces/torques applied on {B}
    +io(io_i) = linio([mdl, '/Relative Motion Sensor'],  1, 'openoutput'); io_i = io_i + 1; % Position/Orientation of {B} w.r.t. {A}
     
    -%% Run the linearization
    +%% Run the linearization
     Gd = linearize(mdl, io, options);
    -Gd.InputName  = {'Fex', 'Fey', 'Fez', 'Mex', 'Mey', 'Mez'};
    -Gd.OutputName = {'Edx', 'Edy', 'Edz', 'Erx', 'Ery', 'Erz'};
    +Gd.InputName  = {'Fex', 'Fey', 'Fez', 'Mex', 'Mey', 'Mez'};
    +Gd.OutputName = {'Edx', 'Edy', 'Edz', 'Erx', 'Ery', 'Erz'};
     
    @@ -442,8 +230,8 @@ And thus \(\mathcal{F}_{x}\) and \(\mathcal{F}_{x,\text{ext}}\) have clearly
    -
    -

    1.3 Conclusion

    +
    +

    1.3 Conclusion

    @@ -471,16 +259,16 @@ Initialization of the Stewart platform.

    stewart = initializeStewartPlatform();
    -stewart = initializeFramesPositions(stewart, 'H', 90e-3, 'MO_B', 45e-3);
    +stewart = initializeFramesPositions(stewart, 'H', 90e-3, 'MO_B', 45e-3);
     stewart = generateGeneralConfiguration(stewart);
     stewart = computeJointsPose(stewart);
     stewart = initializeStrutDynamics(stewart);
    -stewart = initializeJointDynamics(stewart, 'type_F', 'universal_p', 'type_M', 'spherical_p');
    +stewart = initializeJointDynamics(stewart, 'type_F', 'universal_p', 'type_M', 'spherical_p');
     stewart = initializeCylindricalPlatforms(stewart);
     stewart = initializeCylindricalStruts(stewart);
     stewart = computeJacobian(stewart);
     stewart = initializeStewartPose(stewart);
    -stewart = initializeInertialSensor(stewart, 'type', 'none');
    +stewart = initializeInertialSensor(stewart, 'type', 'none');
     
    @@ -488,9 +276,9 @@ stewart = initializeInertialSensor(stewart, 'type'
    -
    ground = initializeGround('type', 'none');
    -payload = initializePayload('type', 'none');
    -controller = initializeController('type', 'open-loop');
    +
    ground = initializeGround('type', 'none');
    +payload = initializePayload('type', 'none');
    +controller = initializeController('type', 'open-loop');
     
    @@ -498,28 +286,28 @@ controller = initializeController('type',
    -
    %% Options for Linearized
    +
    %% Options for Linearized
     options = linearizeOptions;
     options.SampleTime = 0;
     
    -%% Name of the Simulink File
    -mdl = 'stewart_platform_model';
    +%% Name of the Simulink File
    +mdl = 'stewart_platform_model';
     
    -%% Input/Output definition
    +%% Input/Output definition
     clear io; io_i = 1;
    -io(io_i) = linio([mdl, '/Controller'],              1, 'openinput');  io_i = io_i + 1; % Actuator Force Inputs [N]
    -io(io_i) = linio([mdl, '/Relative Motion Sensor'],  1, 'openoutput'); io_i = io_i + 1; % Position/Orientation of {B} w.r.t. {A}
    +io(io_i) = linio([mdl, '/Controller'],              1, 'openinput');  io_i = io_i + 1; % Actuator Force Inputs [N]
    +io(io_i) = linio([mdl, '/Relative Motion Sensor'],  1, 'openoutput'); io_i = io_i + 1; % Position/Orientation of {B} w.r.t. {A}
     
    -%% Run the linearization
    +%% Run the linearization
     G = linearize(mdl, io, options);
    -G.InputName  = {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'};
    -G.OutputName = {'Edx', 'Edy', 'Edz', 'Erx', 'Ery', 'Erz'};
    +G.InputName  = {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'};
    +G.OutputName = {'Edx', 'Edy', 'Edz', 'Erx', 'Ery', 'Erz'};
     
    -
    Gc = minreal(G*inv(stewart.kinematics.J'));
    -Gc.InputName = {'Fnx', 'Fny', 'Fnz', 'Mnx', 'Mny', 'Mnz'};
    +
    Gc = minreal(G*inv(stewart.kinematics.J'));
    +Gc.InputName = {'Fnx', 'Fny', 'Fnz', 'Mnx', 'Mny', 'Mnz'};
     
    @@ -677,8 +465,8 @@ And now at the Compliance matrix.
    -
    -

    2.2 Conclusion

    +
    +

    2.2 Conclusion

    @@ -692,7 +480,7 @@ The low frequency transfer function matrix from \(\mathcal{\bm{F}}\) to \(\mathc

    Author: Dehaeze Thomas

    -

    Created: 2020-03-02 lun. 17:57

    +

    Created: 2020-08-05 mer. 13:27

    diff --git a/docs/flexible-stewart-platform.html b/docs/flexible-stewart-platform.html new file mode 100644 index 0000000..f2da633 --- /dev/null +++ b/docs/flexible-stewart-platform.html @@ -0,0 +1,472 @@ + + + + + + +Stewart Platform with Flexible Elements + + + + + + + + + + +
    + UP + | + HOME +
    +

    Stewart Platform with Flexible Elements

    + + +
    +

    1 Simscape Model

    +
    +
    +
    +

    1.1 Flexible APA

    +
    +
    +
    apa = load('./mat/APA300ML.mat', 'int_xyz', 'int_i', 'n_xyz', 'n_i', 'nodes', 'M', 'K');
    +
    +
    + + + + +++ ++ + + + + + + + + + + + + + + + + + + + + + +
    Total number of Nodes7
    Number of interface Nodes7
    Number of Modes6
    Size of M and K matrices48
    + + + + +++ ++ ++ ++ ++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Table 1: Coordinates of the interface nodes
    Node iNode Numberx [m]y [m]z [m]
    1.053917.00.0-0.0150.0
    2.053918.00.00.0150.0
    3.053919.0-0.03250.00.0
    4.053920.0-0.01250.00.0
    5.053921.0-0.00750.00.0
    6.053922.00.01250.00.0
    7.053923.00.03250.00.0
    +
    +
    + +
    +

    1.2 Flexible Joint

    +
    +
    +
    flex_joint = load('./mat/flexor_ID16.mat', 'int_xyz', 'int_i', 'n_xyz', 'n_i', 'nodes', 'M', 'K');
    +
    +
    + + + + +++ ++ + + + + + + + + + + + + + + + + + + + + + +
    Total number of Nodes2
    Number of interface Nodes2
    Number of Modes6
    Size of M and K matrices18
    + + + + +++ ++ ++ ++ ++ + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Table 2: Coordinates of the interface nodes
    Node iNode Numberx [m]y [m]z [m]
    1.0181278.00.00.00.0
    2.0181279.00.00.0-0.0
    + + + + +++ ++ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    CaracteristicValue
    Axial Stiffness [N/um]119
    Bending Stiffness [Nm/rad]33
    Bending Stiffness [Nm/rad]33
    Torsion Stiffness [Nm/rad]236
    +
    +
    + +
    +

    1.3 Identification

    +
    +

    +And we identify the dynamics from force actuators to force sensors. +

    +
    +
    %% Options for Linearized
    +options = linearizeOptions;
    +options.SampleTime = 0;
    +
    +%% Name of the Simulink File
    +mdl = 'stewart_platform_model';
    +
    +%% Input/Output definition
    +clear io; io_i = 1;
    +io(io_i) = linio([mdl, '/Controller'],        1, 'openinput');  io_i = io_i + 1; % Actuator Force Inputs [N]
    +io(io_i) = linio([mdl, '/Stewart Platform'],  1, 'openoutput', [], 'dLm'); io_i = io_i + 1; % Relative Displacement Outputs [m]
    +io(io_i) = linio([mdl, '/Stewart Platform'],  1, 'openoutput', [], 'Taum'); io_i = io_i + 1; % Force Sensors [N]
    +
    +
    + +
    +
    ground = initializeGround('type', 'none');
    +payload = initializePayload('type', 'rigid', 'm', 50);
    +controller = initializeController('type', 'open-loop');
    +
    +
    + +
    +
    disturbances = initializeDisturbances();
    +references = initializeReferences(stewart);
    +
    +
    +
    +
    + +
    +

    1.4 No Flexible Elements

    +
    +
    +
    stewart = initializeStewartPlatform();
    +stewart = initializeFramesPositions(stewart);
    +stewart = generateGeneralConfiguration(stewart);
    +stewart = computeJointsPose(stewart);
    +% stewart = initializeStrutDynamics(stewart, 'K', 1.8e6*ones(6,1));
    +stewart = initializeAmplifiedStrutDynamics(stewart, 'Kr', 0.9e6*ones(6,1), 'Ka', 0.9e6*ones(6,1));
    +stewart = initializeJointDynamics(stewart, 'Kf_M', 33*ones(6,1), 'Kt_M', 235*ones(6,1), 'Kf_F', 33*ones(6,1), 'Kt_F', 235*ones(6,1));
    +stewart = initializeCylindricalPlatforms(stewart);
    +stewart = initializeCylindricalStruts(stewart);
    +stewart = computeJacobian(stewart);
    +stewart = initializeStewartPose(stewart);
    +stewart = initializeInertialSensor(stewart);
    +
    +
    + +
    +
    %% Run the linearization
    +G = linearize(mdl, io, options);
    +G.InputName  = {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'};
    +G.OutputName = {'Dm1', 'Dm2', 'Dm3', 'Dm4', 'Dm5', 'Dm6', 'Fm1', 'Fm2', 'Fm3', 'Fm4', 'Fm5', 'Fm6'};
    +
    +
    +
    +
    + +
    +

    1.5 Flexible joints

    +
    +
    +
    stewart = initializeStewartPlatform();
    +stewart = initializeFramesPositions(stewart);
    +stewart = generateGeneralConfiguration(stewart);
    +stewart = computeJointsPose(stewart);
    +stewart = initializeAmplifiedStrutDynamics(stewart, 'Kr', 0.9e6*ones(6,1), 'Ka', 0.9e6*ones(6,1));
    +stewart = initializeJointDynamics(stewart, 'type_F', 'flexible', 'K_F', flex_joint.K, 'M_F', flex_joint.M, 'n_xyz_F', flex_joint.n_xyz, 'xi_F', 0.1, 'step_file_F', 'mat/flexor_ID16.STEP', 'type_M', 'flexible', 'K_M', flex_joint.K, 'M_M', flex_joint.M, 'n_xyz_M', flex_joint.n_xyz, 'xi_M', 0.1, 'step_file_M', 'mat/flexor_ID16.STEP');
    +stewart = initializeCylindricalPlatforms(stewart);
    +stewart = initializeCylindricalStruts(stewart);
    +stewart = computeJacobian(stewart);
    +stewart = initializeStewartPose(stewart);
    +stewart = initializeInertialSensor(stewart);
    +
    +
    + +
    +
    %% Run the linearization
    +Gj = linearize(mdl, io, options);
    +Gj.InputName  = {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'};
    +Gj.OutputName = {'Dm1', 'Dm2', 'Dm3', 'Dm4', 'Dm5', 'Dm6', 'Fm1', 'Fm2', 'Fm3', 'Fm4', 'Fm5', 'Fm6'};
    +
    +
    +
    +
    + +
    +

    1.6 Flexible APA

    +
    +
    +
    stewart = initializeStewartPlatform();
    +stewart = initializeFramesPositions(stewart);
    +stewart = generateGeneralConfiguration(stewart);
    +stewart = computeJointsPose(stewart);
    +stewart = initializeFlexibleStrutDynamics(stewart, 'H', 0.03, 'K', apa.K, 'M', apa.M, 'n_xyz', apa.n_xyz, 'xi', 0.1, 'step_file', 'mat/APA300ML.STEP');
    +stewart = initializeJointDynamics(stewart, 'Kf_M', 33*ones(6,1), 'Kt_M', 235, 'Kf_F', 33*ones(6,1), 'Kt_F', 235);
    +stewart = initializeCylindricalPlatforms(stewart);
    +stewart = initializeCylindricalStruts(stewart, 'type_F', 'none', 'type_M', 'none');
    +stewart = computeJacobian(stewart);
    +stewart = initializeStewartPose(stewart);
    +stewart = initializeInertialSensor(stewart);
    +
    +
    + +
    +
    %% Run the linearization
    +Ga = -linearize(mdl, io, options);
    +Ga.InputName  = {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'};
    +Ga.OutputName = {'Dm1', 'Dm2', 'Dm3', 'Dm4', 'Dm5', 'Dm6', 'Fm1', 'Fm2', 'Fm3', 'Fm4', 'Fm5', 'Fm6'};
    +
    +
    +
    +
    + +
    +

    1.7 Flexible Joints and APA

    +
    +
    +
    stewart = initializeStewartPlatform();
    +stewart = initializeFramesPositions(stewart);
    +stewart = generateGeneralConfiguration(stewart);
    +stewart = computeJointsPose(stewart);
    +stewart = initializeFlexibleStrutDynamics(stewart, 'H', 0.03, 'K', apa.K, 'M', apa.M, 'n_xyz', apa.n_xyz, 'xi', 0.1, 'step_file', 'mat/APA300ML.STEP');
    +stewart = initializeJointDynamics(stewart, 'type_F', 'flexible', 'K_F', flex_joint.K, 'M_F', flex_joint.M, 'n_xyz_F', flex_joint.n_xyz, 'xi_F', 0.1, 'step_file_F', 'mat/flexor_ID16.STEP', 'type_M', 'flexible', 'K_M', flex_joint.K, 'M_M', flex_joint.M, 'n_xyz_M', flex_joint.n_xyz, 'xi_M', 0.1, 'step_file_M', 'mat/flexor_ID16.STEP');
    +stewart = initializeCylindricalPlatforms(stewart);
    +stewart = initializeCylindricalStruts(stewart, 'type_F', 'none', 'type_M', 'none');
    +stewart = computeJacobian(stewart);
    +stewart = initializeStewartPose(stewart);
    +stewart = initializeInertialSensor(stewart);
    +
    +
    + +
    +
    Gf = -linearize(mdl, io, options);
    +Gf.InputName  = {'F1', 'F2', 'F3', 'F4', 'F5', 'F6'};
    +Gf.OutputName = {'Dm1', 'Dm2', 'Dm3', 'Dm4', 'Dm5', 'Dm6', 'Fm1', 'Fm2', 'Fm3', 'Fm4', 'Fm5', 'Fm6'};
    +
    +
    +
    +
    + +
    +

    1.8 Direct Velocity Feedback

    +
    + +
    +

    flexible_elements_effect_dvf.png +

    +

    Figure 1: Change of the DVF plant dynamics with the added flexible elements

    +
    +
    +
    + +
    +

    1.9 Integral Force Feedback

    +
    + +
    +

    flexible_elements_effect_iff.png +

    +

    Figure 2: Change of the IFF plant dynamics with the added flexible elements

    +
    +
    +
    +
    +
    +
    +

    Author: Dehaeze Thomas

    +

    Created: 2020-08-05 mer. 13:27

    +
    + + diff --git a/docs/identification.html b/docs/identification.html index 7c7bb09..090c1c3 100644 --- a/docs/identification.html +++ b/docs/identification.html @@ -1,239 +1,27 @@ - - + - Identification of the Stewart Platform using Simscape - - - - +
    @@ -257,13 +45,13 @@
  • 2. Transmissibility Analysis
  • 3. Compliance Analysis
  • @@ -271,18 +59,18 @@ @@ -317,7 +105,7 @@ stewart = initializeFramesPositions(stewart); stewart = generateGeneralConfiguration(stewart); stewart = computeJointsPose(stewart); stewart = initializeStrutDynamics(stewart); -stewart = initializeJointDynamics(stewart, 'type_F', 'universal_p', 'type_M', 'spherical_p'); +stewart = initializeJointDynamics(stewart, 'type_F', 'universal_p', 'type_M', 'spherical_p'); stewart = initializeCylindricalPlatforms(stewart); stewart = initializeCylindricalStruts(stewart); stewart = computeJacobian(stewart); @@ -327,9 +115,9 @@ stewart = initializeInertialSensor(stewart);
    -
    ground = initializeGround('type', 'none');
    -payload = initializePayload('type', 'none');
    -controller = initializeController('type', 'open-loop');
    +
    ground = initializeGround('type', 'none');
    +payload = initializePayload('type', 'none');
    +controller = initializeController('type', 'open-loop');
     
    @@ -339,23 +127,23 @@ controller = initializeController('type', 1.2 Identification
    -
    %% Options for Linearized
    +
    %% Options for Linearized
     options = linearizeOptions;
     options.SampleTime = 0;
     
    -%% Name of the Simulink File
    -mdl = 'stewart_platform_model';
    +%% Name of the Simulink File
    +mdl = 'stewart_platform_model';
     
    -%% Input/Output definition
    +%% Input/Output definition
     clear io; io_i = 1;
    -io(io_i) = linio([mdl, '/Controller'],              1, 'openinput');  io_i = io_i + 1; % Actuator Force Inputs [N]
    -io(io_i) = linio([mdl, '/Relative Motion Sensor'],  1, 'openoutput'); io_i = io_i + 1; % Position/Orientation of {B} w.r.t. {A}
    -io(io_i) = linio([mdl, '/Relative Motion Sensor'],  2, 'openoutput'); io_i = io_i + 1; % Velocity of {B} w.r.t. {A}
    +io(io_i) = linio([mdl, '/Controller'],              1, 'openinput');  io_i = io_i + 1; % Actuator Force Inputs [N]
    +io(io_i) = linio([mdl, '/Relative Motion Sensor'],  1, 'openoutput'); io_i = io_i + 1; % Position/Orientation of {B} w.r.t. {A}
    +io(io_i) = linio([mdl, '/Relative Motion Sensor'],  2, 'openoutput'); io_i = io_i + 1; % Velocity of {B} w.r.t. {A}
     
    -%% Run the linearization
    +%% Run the linearization
     G = linearize(mdl, io);
    -% G.InputName  = {'tau1', 'tau2', 'tau3', 'tau4', 'tau5', 'tau6'};
    -% G.OutputName = {'Xdx', 'Xdy', 'Xdz', 'Xrx', 'Xry', 'Xrz', 'Vdx', 'Vdy', 'Vdz', 'Vrx', 'Vry', 'Vrz'};
    +% G.InputName  = {'tau1', 'tau2', 'tau3', 'tau4', 'tau5', 'tau6'};
    +% G.OutputName = {'Xdx', 'Xdy', 'Xdz', 'Xrx', 'Xry', 'Xrz', 'Vdx', 'Vdy', 'Vdz', 'Vrx', 'Vry', 'Vrz'};
     
    @@ -419,9 +207,9 @@ The measurements are the 6 displacement and 6 velocities of mobile platform with We could perform the transformation by hand:

    -
    At = Gm.C*Gm.A*pinv(Gm.C);
    +
    At = Gm.C*Gm.A*pinv(Gm.C);
     
    -Bt = Gm.C*Gm.B;
    +Bt = Gm.C*Gm.B;
     
     Ct = eye(12);
     Dt = zeros(12, 6);
    @@ -515,23 +303,23 @@ Let’s first sort the modes and just take the modes corresponding to a eige
     
    ws = imag(diag(D));
     [ws,I] = sort(ws)
    -ws = ws(7:end); I = I(7:end);
    +ws = ws(7:end); I = I(7:end);
     
    -
    for i = 1:length(ws)
    +
    for i = 1:length(ws)
     
    -
    i_mode = I(i); % the argument is the i'th mode
    +
    i_mode = I(i); % the argument is the i'th mode
     
    lambda_i = D(i_mode, i_mode);
    -xi_i = V(:,i_mode);
    +xi_i = V(:,i_mode);
     
     a_i = real(lambda_i);
     b_i = imag(lambda_i);
    @@ -542,8 +330,8 @@ b_i = imag(lambda_i);
     Let do 10 periods of the mode.
     

    -
    t = linspace(0, 10/(imag(lambda_i)/2/pi), 1000);
    -U_i = pinv(Gt.B) * real(xi_i * lambda_i * (cos(b_i * t) + 1i*sin(b_i * t)));
    +
    t = linspace(0, 10/(imag(lambda_i)/2/pi), 1000);
    +U_i = pinv(Gt.B) * real(xi_i * lambda_i * (cos(b_i * t) + 1i*sin(b_i * t)));
     
    @@ -556,9 +344,9 @@ U_i = pinv(Gt.B) * real(xi_i -
    load('mat/conf_simscape.mat');
    -set_param(conf_simscape, 'StopTime', num2str(t(end)));
    -sim(mdl);
    +
    load('mat/conf_simscape.mat');
    +set_param(conf_simscape, 'StopTime', num2str(t(end)));
    +sim(mdl);
     
    @@ -566,15 +354,15 @@ Simulation: Save the movie of the mode shape.

    -
    smwritevideo(mdl, sprintf('figs/mode%i', i), ...
    -             'PlaybackSpeedRatio', 1/(b_i/2/pi), ...
    -             'FrameRate', 30, ...
    -             'FrameSize', [800, 400]);
    +
    smwritevideo(mdl, sprintf('figs/mode%i', i), ...
    +             'PlaybackSpeedRatio', 1/(b_i/2/pi), ...
    +             'FrameRate', 30, ...
    +             'FrameSize', [800, 400]);
     
    -
    end
    +
    end
     
    @@ -609,21 +397,21 @@ Save the movie of the mode shape.

    -
    -

    2.1 Initialize the Stewart platform

    +
    +

    2.1 Initialize the Stewart platform

    stewart = initializeStewartPlatform();
    -stewart = initializeFramesPositions(stewart, 'H', 90e-3, 'MO_B', 45e-3);
    +stewart = initializeFramesPositions(stewart, 'H', 90e-3, 'MO_B', 45e-3);
     stewart = generateGeneralConfiguration(stewart);
     stewart = computeJointsPose(stewart);
     stewart = initializeStrutDynamics(stewart);
    -stewart = initializeJointDynamics(stewart, 'type_F', 'universal_p', 'type_M', 'spherical_p');
    +stewart = initializeJointDynamics(stewart, 'type_F', 'universal_p', 'type_M', 'spherical_p');
     stewart = initializeCylindricalPlatforms(stewart);
     stewart = initializeCylindricalStruts(stewart);
     stewart = computeJacobian(stewart);
     stewart = initializeStewartPose(stewart);
    -stewart = initializeInertialSensor(stewart, 'type', 'accelerometer', 'freq', 5e3);
    +stewart = initializeInertialSensor(stewart, 'type', 'accelerometer', 'freq', 5e3);
     
    @@ -631,9 +419,9 @@ stewart = initializeInertialSensor(stewart, 'type'
    -
    ground = initializeGround('type', 'rigid', 'rot_point', stewart.platform_F.FO_A);
    -payload = initializePayload('type', 'rigid');
    -controller = initializeController('type', 'open-loop');
    +
    ground = initializeGround('type', 'rigid', 'rot_point', stewart.platform_F.FO_A);
    +payload = initializePayload('type', 'rigid');
    +controller = initializeController('type', 'open-loop');
     
    @@ -643,50 +431,50 @@ controller = initializeController('type', 2.2 Transmissibility
    -
    %% Options for Linearized
    +
    %% Options for Linearized
     options = linearizeOptions;
     options.SampleTime = 0;
     
    -%% Name of the Simulink File
    -mdl = 'stewart_platform_model';
    +%% Name of the Simulink File
    +mdl = 'stewart_platform_model';
     
    -%% Input/Output definition
    +%% Input/Output definition
     clear io; io_i = 1;
    -io(io_i) = linio([mdl, '/Disturbances/D_w'],        1, 'openinput');  io_i = io_i + 1; % Base Motion [m, rad]
    -io(io_i) = linio([mdl, '/Absolute Motion Sensor'],  1, 'openoutput'); io_i = io_i + 1; % Absolute Motion [m, rad]
    +io(io_i) = linio([mdl, '/Disturbances/D_w'],        1, 'openinput');  io_i = io_i + 1; % Base Motion [m, rad]
    +io(io_i) = linio([mdl, '/Absolute Motion Sensor'],  1, 'openoutput'); io_i = io_i + 1; % Absolute Motion [m, rad]
     
    -%% Run the linearization
    +%% Run the linearization
     T = linearize(mdl, io, options);
    -T.InputName = {'Wdx', 'Wdy', 'Wdz', 'Wrx', 'Wry', 'Wrz'};
    -T.OutputName = {'Edx', 'Edy', 'Edz', 'Erx', 'Ery', 'Erz'};
    +T.InputName = {'Wdx', 'Wdy', 'Wdz', 'Wrx', 'Wry', 'Wrz'};
    +T.OutputName = {'Edx', 'Edy', 'Edz', 'Erx', 'Ery', 'Erz'};
     
    freqs = logspace(1, 4, 1000);
     
    -figure;
    -for ix = 1:6
    -  for iy = 1:6
    -    subplot(6, 6, (ix-1)*6 + iy);
    +figure;
    +for ix = 1:6
    +  for iy = 1:6
    +    subplot(6, 6, (ix-1)*6 + iy);
         hold on;
    -    plot(freqs, abs(squeeze(freqresp(T(ix, iy), freqs, 'Hz'))), 'k-');
    -    set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
    -    ylim([1e-5, 10]);
    +    plot(freqs, abs(squeeze(freqresp(T(ix, iy), freqs, 'Hz'))), 'k-');
    +    set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
    +    ylim([1e-5, 10]);
         xlim([freqs(1), freqs(end)]);
    -    if ix < 6
    +    if ix < 6
           xticklabels({});
    -    end
    -    if iy > 1
    +    end
    +    if iy > 1
           yticklabels({});
    -    end
    -  end
    -end
    +    end
    +  end
    +end
     

    -From preumont07_six_axis_singl_stage_activ, one can use the Frobenius norm of the transmissibility matrix to obtain a scalar indicator of the transmissibility performance of the system: +From (Preumont et al. 2007), one can use the Frobenius norm of the transmissibility matrix to obtain a scalar indicator of the transmissibility performance of the system:

    \begin{align*} \| \bm{T}(\omega) \| &= \sqrt{\text{Trace}[\bm{T}(\omega) \bm{T}(\omega)^H]}\\ @@ -698,9 +486,9 @@ From T_norm = zeros(length(freqs), 1); -for i = 1:length(freqs) - T_norm(i) = sqrt(trace(freqresp(T, freqs(i), 'Hz')*freqresp(T, freqs(i), 'Hz')')); -end +for i = 1:length(freqs) + T_norm(i) = sqrt(trace(freqresp(T, freqs(i), 'Hz')*freqresp(T, freqs(i), 'Hz')')); +end
    @@ -710,14 +498,14 @@ And we normalize by a factor \(\sqrt{6}\) to obtain a performance metric compara

    -
    Gamma = T_norm/sqrt(6);
    +
    Gamma = T_norm/sqrt(6);
     
    -
    figure;
    +
    figure;
     plot(freqs, Gamma)
    -set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
    +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
     
    @@ -731,21 +519,21 @@ plot(freqs, Gamma)

    -
    -

    3.1 Initialize the Stewart platform

    +
    +

    3.1 Initialize the Stewart platform

    stewart = initializeStewartPlatform();
    -stewart = initializeFramesPositions(stewart, 'H', 90e-3, 'MO_B', 45e-3);
    +stewart = initializeFramesPositions(stewart, 'H', 90e-3, 'MO_B', 45e-3);
     stewart = generateGeneralConfiguration(stewart);
     stewart = computeJointsPose(stewart);
     stewart = initializeStrutDynamics(stewart);
    -stewart = initializeJointDynamics(stewart, 'type_F', 'universal_p', 'type_M', 'spherical_p');
    +stewart = initializeJointDynamics(stewart, 'type_F', 'universal_p', 'type_M', 'spherical_p');
     stewart = initializeCylindricalPlatforms(stewart);
     stewart = initializeCylindricalStruts(stewart);
     stewart = computeJacobian(stewart);
     stewart = initializeStewartPose(stewart);
    -stewart = initializeInertialSensor(stewart, 'type', 'accelerometer', 'freq', 5e3);
    +stewart = initializeInertialSensor(stewart, 'type', 'accelerometer', 'freq', 5e3);
     
    @@ -753,9 +541,9 @@ stewart = initializeInertialSensor(stewart, 'type'
    -
    ground = initializeGround('type', 'none');
    -payload = initializePayload('type', 'rigid');
    -controller = initializeController('type', 'open-loop');
    +
    ground = initializeGround('type', 'none');
    +payload = initializePayload('type', 'rigid');
    +controller = initializeController('type', 'open-loop');
     
    @@ -765,45 +553,45 @@ controller = initializeController('type', 3.2 Compliance
    -
    %% Options for Linearized
    +
    %% Options for Linearized
     options = linearizeOptions;
     options.SampleTime = 0;
     
    -%% Name of the Simulink File
    -mdl = 'stewart_platform_model';
    +%% Name of the Simulink File
    +mdl = 'stewart_platform_model';
     
    -%% Input/Output definition
    +%% Input/Output definition
     clear io; io_i = 1;
    -io(io_i) = linio([mdl, '/Disturbances/F_ext'],        1, 'openinput');  io_i = io_i + 1; % Base Motion [m, rad]
    -io(io_i) = linio([mdl, '/Absolute Motion Sensor'],  1, 'openoutput'); io_i = io_i + 1; % Absolute Motion [m, rad]
    +io(io_i) = linio([mdl, '/Disturbances/F_ext'],        1, 'openinput');  io_i = io_i + 1; % Base Motion [m, rad]
    +io(io_i) = linio([mdl, '/Absolute Motion Sensor'],  1, 'openoutput'); io_i = io_i + 1; % Absolute Motion [m, rad]
     
    -%% Run the linearization
    +%% Run the linearization
     C = linearize(mdl, io, options);
    -C.InputName = {'Fdx', 'Fdy', 'Fdz', 'Mdx', 'Mdy', 'Mdz'};
    -C.OutputName = {'Edx', 'Edy', 'Edz', 'Erx', 'Ery', 'Erz'};
    +C.InputName = {'Fdx', 'Fdy', 'Fdz', 'Mdx', 'Mdy', 'Mdz'};
    +C.OutputName = {'Edx', 'Edy', 'Edz', 'Erx', 'Ery', 'Erz'};
     
    freqs = logspace(1, 4, 1000);
     
    -figure;
    -for ix = 1:6
    -  for iy = 1:6
    -    subplot(6, 6, (ix-1)*6 + iy);
    +figure;
    +for ix = 1:6
    +  for iy = 1:6
    +    subplot(6, 6, (ix-1)*6 + iy);
         hold on;
    -    plot(freqs, abs(squeeze(freqresp(C(ix, iy), freqs, 'Hz'))), 'k-');
    -    set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
    -    ylim([1e-10, 1e-3]);
    +    plot(freqs, abs(squeeze(freqresp(C(ix, iy), freqs, 'Hz'))), 'k-');
    +    set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
    +    ylim([1e-10, 1e-3]);
         xlim([freqs(1), freqs(end)]);
    -    if ix < 6
    +    if ix < 6
           xticklabels({});
    -    end
    -    if iy > 1
    +    end
    +    if iy > 1
           yticklabels({});
    -    end
    -  end
    -end
    +    end
    +  end
    +end
     
    @@ -816,16 +604,16 @@ We can try to use the Frobenius norm to obtain a scalar value representing the 6 C_norm = zeros(length(freqs), 1); -for i = 1:length(freqs) - C_norm(i) = sqrt(trace(freqresp(C, freqs(i), 'Hz')*freqresp(C, freqs(i), 'Hz')')); -end +for i = 1:length(freqs) + C_norm(i) = sqrt(trace(freqresp(C, freqs(i), 'Hz')*freqresp(C, freqs(i), 'Hz')')); +end
    -
    figure;
    +
    figure;
     plot(freqs, C_norm)
    -set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
    +set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
     
    @@ -844,37 +632,37 @@ plot(freqs, C_norm)

    -
    -

    Function description

    -
    +
    +

    Function description

    +
    -
    function [T, T_norm, freqs] = computeTransmissibility(args)
    -% computeTransmissibility -
    -%
    -% Syntax: [T, T_norm, freqs] = computeTransmissibility(args)
    -%
    -% Inputs:
    -%    - args - Structure with the following fields:
    -%        - plots [true/false] - Should plot the transmissilibty matrix and its Frobenius norm
    -%        - freqs [] - Frequency vector to estimate the Frobenius norm
    -%
    -% Outputs:
    -%    - T      [6x6 ss] - Transmissibility matrix
    -%    - T_norm [length(freqs)x1] - Frobenius norm of the Transmissibility matrix
    -%    - freqs  [length(freqs)x1] - Frequency vector in [Hz]
    +
    function [T, T_norm, freqs] = computeTransmissibility(args)
    +% computeTransmissibility -
    +%
    +% Syntax: [T, T_norm, freqs] = computeTransmissibility(args)
    +%
    +% Inputs:
    +%    - args - Structure with the following fields:
    +%        - plots [true/false] - Should plot the transmissilibty matrix and its Frobenius norm
    +%        - freqs [] - Frequency vector to estimate the Frobenius norm
    +%
    +% Outputs:
    +%    - T      [6x6 ss] - Transmissibility matrix
    +%    - T_norm [length(freqs)x1] - Frobenius norm of the Transmissibility matrix
    +%    - freqs  [length(freqs)x1] - Frequency vector in [Hz]
     
    -
    -

    Optional Parameters

    -
    +
    +

    Optional Parameters

    +
    arguments
    -  args.plots logical {mustBeNumericOrLogical} = false
    +  args.plots logical {mustBeNumericOrLogical} = false
       args.freqs double {mustBeNumeric, mustBeNonnegative} = logspace(1,4,1000)
    -end
    +end
     
    @@ -889,22 +677,22 @@ plot(freqs, C_norm)

    Identification of the Transmissibility Matrix

    -
    %% Options for Linearized
    +
    %% Options for Linearized
     options = linearizeOptions;
     options.SampleTime = 0;
     
    -%% Name of the Simulink File
    -mdl = 'stewart_platform_model';
    +%% Name of the Simulink File
    +mdl = 'stewart_platform_model';
     
    -%% Input/Output definition
    +%% Input/Output definition
     clear io; io_i = 1;
    -io(io_i) = linio([mdl, '/Disturbances/D_w'],        1, 'openinput');  io_i = io_i + 1; % Base Motion [m, rad]
    -io(io_i) = linio([mdl, '/Absolute Motion Sensor'],  1, 'output'); io_i = io_i + 1; % Absolute Motion [m, rad]
    +io(io_i) = linio([mdl, '/Disturbances/D_w'],        1, 'openinput');  io_i = io_i + 1; % Base Motion [m, rad]
    +io(io_i) = linio([mdl, '/Absolute Motion Sensor'],  1, 'output'); io_i = io_i + 1; % Absolute Motion [m, rad]
     
    -%% Run the linearization
    +%% Run the linearization
     T = linearize(mdl, io, options);
    -T.InputName = {'Wdx', 'Wdy', 'Wdz', 'Wrx', 'Wry', 'Wrz'};
    -T.OutputName = {'Edx', 'Edy', 'Edz', 'Erx', 'Ery', 'Erz'};
    +T.InputName = {'Wdx', 'Wdy', 'Wdz', 'Wrx', 'Wry', 'Wrz'};
    +T.OutputName = {'Edx', 'Edy', 'Edz', 'Erx', 'Ery', 'Erz'};
     
    @@ -912,65 +700,65 @@ T.OutputName = {'Edx', If wanted, the 6x6 transmissibility matrix is plotted.

    -
    p_handle = zeros(6*6,1);
    +
    p_handle = zeros(6*6,1);
     
    -if args.plots
    -  fig = figure;
    -  for ix = 1:6
    -    for iy = 1:6
    -      p_handle((ix-1)*6 + iy) = subplot(6, 6, (ix-1)*6 + iy);
    +if args.plots
    +  fig = figure;
    +  for ix = 1:6
    +    for iy = 1:6
    +      p_handle((ix-1)*6 + iy) = subplot(6, 6, (ix-1)*6 + iy);
           hold on;
    -      plot(freqs, abs(squeeze(freqresp(T(ix, iy), freqs, 'Hz'))), 'k-');
    -      set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
    -      if ix < 6
    +      plot(freqs, abs(squeeze(freqresp(T(ix, iy), freqs, 'Hz'))), 'k-');
    +      set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
    +      if ix < 6
               xticklabels({});
    -      end
    -      if iy > 1
    +      end
    +      if iy > 1
               yticklabels({});
    -      end
    -    end
    -  end
    +      end
    +    end
    +  end
     
    -  linkaxes(p_handle, 'xy')
    +  linkaxes(p_handle, 'xy')
       xlim([freqs(1), freqs(end)]);
    -  ylim([1e-5, 1e2]);
    +  ylim([1e-5, 1e2]);
     
    -  han = axes(fig, 'visible', 'off');
    -  han.XLabel.Visible = 'on';
    -  han.YLabel.Visible = 'on';
    -  xlabel(han, 'Frequency [Hz]');
    -  ylabel(han, 'Transmissibility [m/m]');
    -end
    +  han = axes(fig, 'visible', 'off');
    +  han.XLabel.Visible = 'on';
    +  han.YLabel.Visible = 'on';
    +  xlabel(han, 'Frequency [Hz]');
    +  ylabel(han, 'Transmissibility [m/m]');
    +end
     
    -
    -

    Computation of the Frobenius norm

    -
    +
    +

    Computation of the Frobenius norm

    +
    T_norm = zeros(length(freqs), 1);
     
    -for i = 1:length(freqs)
    -  T_norm(i) = sqrt(trace(freqresp(T, freqs(i), 'Hz')*freqresp(T, freqs(i), 'Hz')'));
    -end
    +for i = 1:length(freqs)
    +  T_norm(i) = sqrt(trace(freqresp(T, freqs(i), 'Hz')*freqresp(T, freqs(i), 'Hz')'));
    +end
     
    -
    T_norm = T_norm/sqrt(6);
    +
    T_norm = T_norm/sqrt(6);
     
    -
    if args.plots
    -  figure;
    +
    if args.plots
    +  figure;
       plot(freqs, T_norm)
    -  set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
    -  xlabel('Frequency [Hz]');
    -  ylabel('Transmissibility - Frobenius Norm');
    -end
    +  set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
    +  xlabel('Frequency [Hz]');
    +  ylabel('Transmissibility - Frobenius Norm');
    +end
     
    @@ -985,37 +773,37 @@ If wanted, the 6x6 transmissibility matrix is plotted.

    -
    -

    Function description

    -
    +
    +

    Function description

    +
    -
    function [C, C_norm, freqs] = computeCompliance(args)
    -% computeCompliance -
    -%
    -% Syntax: [C, C_norm, freqs] = computeCompliance(args)
    -%
    -% Inputs:
    -%    - args - Structure with the following fields:
    -%        - plots [true/false] - Should plot the transmissilibty matrix and its Frobenius norm
    -%        - freqs [] - Frequency vector to estimate the Frobenius norm
    -%
    -% Outputs:
    -%    - C      [6x6 ss] - Compliance matrix
    -%    - C_norm [length(freqs)x1] - Frobenius norm of the Compliance matrix
    -%    - freqs  [length(freqs)x1] - Frequency vector in [Hz]
    +
    function [C, C_norm, freqs] = computeCompliance(args)
    +% computeCompliance -
    +%
    +% Syntax: [C, C_norm, freqs] = computeCompliance(args)
    +%
    +% Inputs:
    +%    - args - Structure with the following fields:
    +%        - plots [true/false] - Should plot the transmissilibty matrix and its Frobenius norm
    +%        - freqs [] - Frequency vector to estimate the Frobenius norm
    +%
    +% Outputs:
    +%    - C      [6x6 ss] - Compliance matrix
    +%    - C_norm [length(freqs)x1] - Frobenius norm of the Compliance matrix
    +%    - freqs  [length(freqs)x1] - Frequency vector in [Hz]
     
    -
    -

    Optional Parameters

    -
    +
    +

    Optional Parameters

    +
    arguments
    -  args.plots logical {mustBeNumericOrLogical} = false
    +  args.plots logical {mustBeNumericOrLogical} = false
       args.freqs double {mustBeNumeric, mustBeNonnegative} = logspace(1,4,1000)
    -end
    +end
     
    @@ -1030,22 +818,22 @@ If wanted, the 6x6 transmissibility matrix is plotted.

    Identification of the Compliance Matrix

    -
    %% Options for Linearized
    +
    %% Options for Linearized
     options = linearizeOptions;
     options.SampleTime = 0;
     
    -%% Name of the Simulink File
    -mdl = 'stewart_platform_model';
    +%% Name of the Simulink File
    +mdl = 'stewart_platform_model';
     
    -%% Input/Output definition
    +%% Input/Output definition
     clear io; io_i = 1;
    -io(io_i) = linio([mdl, '/Disturbances/F_ext'],      1, 'openinput');  io_i = io_i + 1; % External forces [N, N*m]
    -io(io_i) = linio([mdl, '/Absolute Motion Sensor'],  1, 'output'); io_i = io_i + 1; % Absolute Motion [m, rad]
    +io(io_i) = linio([mdl, '/Disturbances/F_ext'],      1, 'openinput');  io_i = io_i + 1; % External forces [N, N*m]
    +io(io_i) = linio([mdl, '/Absolute Motion Sensor'],  1, 'output'); io_i = io_i + 1; % Absolute Motion [m, rad]
     
    -%% Run the linearization
    +%% Run the linearization
     C = linearize(mdl, io, options);
    -C.InputName  = {'Fdx', 'Fdy', 'Fdz', 'Mdx', 'Mdy', 'Mdz'};
    -C.OutputName = {'Edx', 'Edy', 'Edz', 'Erx', 'Ery', 'Erz'};
    +C.InputName  = {'Fdx', 'Fdy', 'Fdz', 'Mdx', 'Mdy', 'Mdz'};
    +C.OutputName = {'Edx', 'Edy', 'Edz', 'Erx', 'Ery', 'Erz'};
     
    @@ -1053,63 +841,68 @@ C.OutputName = {'Edx', If wanted, the 6x6 transmissibility matrix is plotted.

    -
    p_handle = zeros(6*6,1);
    +
    p_handle = zeros(6*6,1);
     
    -if args.plots
    -  fig = figure;
    -  for ix = 1:6
    -    for iy = 1:6
    -      p_handle((ix-1)*6 + iy) = subplot(6, 6, (ix-1)*6 + iy);
    +if args.plots
    +  fig = figure;
    +  for ix = 1:6
    +    for iy = 1:6
    +      p_handle((ix-1)*6 + iy) = subplot(6, 6, (ix-1)*6 + iy);
           hold on;
    -      plot(freqs, abs(squeeze(freqresp(C(ix, iy), freqs, 'Hz'))), 'k-');
    -      set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
    -      if ix < 6
    +      plot(freqs, abs(squeeze(freqresp(C(ix, iy), freqs, 'Hz'))), 'k-');
    +      set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
    +      if ix < 6
               xticklabels({});
    -      end
    -      if iy > 1
    +      end
    +      if iy > 1
               yticklabels({});
    -      end
    -    end
    -  end
    +      end
    +    end
    +  end
     
    -  linkaxes(p_handle, 'xy')
    +  linkaxes(p_handle, 'xy')
       xlim([freqs(1), freqs(end)]);
     
    -  han = axes(fig, 'visible', 'off');
    -  han.XLabel.Visible = 'on';
    -  han.YLabel.Visible = 'on';
    -  xlabel(han, 'Frequency [Hz]');
    -  ylabel(han, 'Compliance [m/N, rad/(N*m)]');
    -end
    +  han = axes(fig, 'visible', 'off');
    +  han.XLabel.Visible = 'on';
    +  han.YLabel.Visible = 'on';
    +  xlabel(han, 'Frequency [Hz]');
    +  ylabel(han, 'Compliance [m/N, rad/(N*m)]');
    +end
     
    -
    -

    Computation of the Frobenius norm

    -
    +
    +

    Computation of the Frobenius norm

    +
    freqs = args.freqs;
     
     C_norm = zeros(length(freqs), 1);
     
    -for i = 1:length(freqs)
    -  C_norm(i) = sqrt(trace(freqresp(C, freqs(i), 'Hz')*freqresp(C, freqs(i), 'Hz')'));
    -end
    +for i = 1:length(freqs)
    +  C_norm(i) = sqrt(trace(freqresp(C, freqs(i), 'Hz')*freqresp(C, freqs(i), 'Hz')'));
    +end
     
    -
    if args.plots
    -  figure;
    +
    if args.plots
    +  figure;
       plot(freqs, C_norm)
    -  set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
    -  xlabel('Frequency [Hz]');
    -  ylabel('Compliance - Frobenius Norm');
    -end
    +  set(gca, 'XScale', 'log'); set(gca, 'YScale', 'log');
    +  xlabel('Frequency [Hz]');
    +  ylabel('Compliance - Frobenius Norm');
    +end
     
    + +

    Bibliography

    +
    +
    Preumont, A., M. Horodinca, I. Romanescu, B. de Marneffe, M. Avraam, A. Deraemaeker, F. Bossens, and A. Abu Hanieh. 2007. “A Six-Axis Single-Stage Active Vibration Isolator Based on Stewart Platform.” Journal of Sound and Vibration 300 (3-5):644–61. https://doi.org/10.1016/j.jsv.2006.07.050.
    +
    @@ -1117,7 +910,7 @@ C_norm = zeros(length(freqs), 1);

    Author: Dehaeze Thomas

    -

    Created: 2020-03-02 lun. 17:57

    +

    Created: 2020-08-05 mer. 13:27

    diff --git a/docs/index.html b/docs/index.html index c157c78..f208341 100644 --- a/docs/index.html +++ b/docs/index.html @@ -1,229 +1,19 @@ - - + - Stewart Platforms - -
    @@ -270,7 +60,7 @@ Such project is briefly presented here.

    2 Stewart Platform Architecture Definition (link)

    -The way the Stewart Platform is defined here. +The way the Stewart Platform is defined is explained here.

    @@ -416,7 +206,7 @@ Many text books, PhD thesis and articles related to parallel robots and Stewart

    Author: Dehaeze Thomas

    -

    Created: 2020-03-13 ven. 10:34

    +

    Created: 2020-08-05 mer. 13:27

    diff --git a/docs/kinematic-study.html b/docs/kinematic-study.html index 65d2d05..507f147 100644 --- a/docs/kinematic-study.html +++ b/docs/kinematic-study.html @@ -1,239 +1,27 @@ - - + - Kinematic Study of the Stewart Platform - - - - +
    @@ -267,14 +55,14 @@
  • 4. Estimation of the range validity of the approximate inverse kinematics
  • 5. Estimated required actuator stroke from specified platform mobility
  • -The kinematic analysis of a parallel manipulator is well described in taghirad13_paral: +The kinematic analysis of a parallel manipulator is well described in (Taghirad 2013):

    @@ -349,7 +142,7 @@ The current document is divided in the following sections:

    -From taghirad13_paral: +From (Taghirad 2013):

    @@ -478,6 +271,7 @@ As explain in this document, each Actuat

    • A spring with a stiffness \(k_{i}\)
    • A dashpot with a damping \(c_{i}\)
    • +
    • A force source \(\tau_i\)

    @@ -657,15 +451,15 @@ This will also gives us the range for which the approximate forward kinematic is

    -
    -

    4.1 Stewart architecture definition

    +
    +

    4.1 Stewart architecture definition

    We first define some general Stewart architecture.

    stewart = initializeStewartPlatform();
    -stewart = initializeFramesPositions(stewart, 'H', 90e-3, 'MO_B', 45e-3);
    +stewart = initializeFramesPositions(stewart, 'H', 90e-3, 'MO_B', 45e-3);
     stewart = generateGeneralConfiguration(stewart);
     stewart = computeJointsPose(stewart);
     stewart = initializeStewartPose(stewart);
    @@ -692,16 +486,16 @@ The estimate required strut stroke for both the approximate and exact solutions
     The relative strut length displacement is shown in Figure 2.
     

    -
    Xrs = logspace(-6, -1, 100); % Wanted X translation of the mobile platform [m]
    +
    Xrs = logspace(-6, -1, 100); % Wanted X translation of the mobile platform [m]
     
     Ls_approx = zeros(6, length(Xrs));
     Ls_exact = zeros(6, length(Xrs));
     
    -for i = 1:length(Xrs)
    -  Xr = Xrs(i);
    -  L_approx(:, i) = stewart.kinematics.J*[Xr; 0; 0; 0; 0; 0;];
    -  [~, L_exact(:, i)] = inverseKinematics(stewart, 'AP', [Xr; 0; 0]);
    -end
    +for i = 1:length(Xrs)
    +  Xr = Xrs(i);
    +  L_approx(:, i) = stewart.kinematics.J*[Xr; 0; 0; 0; 0; 0;];
    +  [~, L_exact(:, i)] = inverseKinematics(stewart, 'AP', [Xr; 0; 0]);
    +end
     
    @@ -758,15 +552,15 @@ This is what is analyzed in this section.

    -
    -

    5.1 Stewart architecture definition

    +
    +

    5.1 Stewart architecture definition

    Let’s first define the Stewart platform architecture that we want to study.

    stewart = initializeStewartPlatform();
    -stewart = initializeFramesPositions(stewart, 'H', 90e-3, 'MO_B', 45e-3);
    +stewart = initializeFramesPositions(stewart, 'H', 90e-3, 'MO_B', 45e-3);
     stewart = generateGeneralConfiguration(stewart);
     stewart = computeJointsPose(stewart);
     stewart = initializeStewartPose(stewart);
    @@ -787,12 +581,12 @@ stewart = computeJacobian(stewart);
     Let’s now define the wanted extreme translations and rotations.
     

    -
    Tx_max = 50e-6; % Translation [m]
    -Ty_max = 50e-6; % Translation [m]
    -Tz_max = 50e-6; % Translation [m]
    -Rx_max = 30e-6; % Rotation [rad]
    -Ry_max = 30e-6; % Rotation [rad]
    -Rz_max = 0;     % Rotation [rad]
    +
    Tx_max = 50e-6; % Translation [m]
    +Ty_max = 50e-6; % Translation [m]
    +Tz_max = 50e-6; % Translation [m]
    +Rx_max = 30e-6; % Rotation [rad]
    +Ry_max = 30e-6; % Rotation [rad]
    +Rz_max = 0;     % Rotation [rad]
     
    @@ -807,12 +601,12 @@ We do that using either the Inverse Kinematic solution or the Jacobian matrix as

    -
    LTx = stewart.kinematics.J*[Tx_max 0 0 0 0 0]';
    -LTy = stewart.kinematics.J*[0 Ty_max 0 0 0 0]';
    -LTz = stewart.kinematics.J*[0 0 Tz_max 0 0 0]';
    -LRx = stewart.kinematics.J*[0 0 0 Rx_max 0 0]';
    -LRy = stewart.kinematics.J*[0 0 0 0 Ry_max 0]';
    -LRz = stewart.kinematics.J*[0 0 0 0 0 Rz_max]';
    +
    LTx = stewart.kinematics.J*[Tx_max 0 0 0 0 0]';
    +LTy = stewart.kinematics.J*[0 Ty_max 0 0 0 0]';
    +LTz = stewart.kinematics.J*[0 0 Tz_max 0 0 0]';
    +LRx = stewart.kinematics.J*[0 0 0 Rx_max 0 0]';
    +LRy = stewart.kinematics.J*[0 0 0 0 Ry_max 0]';
    +LRz = stewart.kinematics.J*[0 0 0 0 0 Rz_max]';
     
    @@ -845,7 +639,7 @@ To do so, we may estimate the required actuator stroke for all possible combinat Let’s first generate all the possible combination of maximum translation and rotations.

    -
    Ps = [2*(dec2bin(0:5^2-1,5)-'0')-1, zeros(5^2, 1)].*[Tx_max Ty_max Tz_max Rx_max Ry_max Rz_max];
    +
    Ps = [2*(dec2bin(0:5^2-1,5)-'0')-1, zeros(5^2, 1)].*[Tx_max Ty_max Tz_max Rx_max Ry_max Rz_max];
     
    @@ -1110,29 +904,29 @@ For all possible combination, we compute the required actuator stroke using the
    L_min = 0;
     L_max = 0;
     
    -for i = 1:size(Ps,1)
    +for i = 1:size(Ps,1)
       Rx = [1 0        0;
    -        0 cos(Ps(i, 4)) -sin(Ps(i, 4));
    -        0 sin(Ps(i, 4))  cos(Ps(i, 4))];
    +        0 cos(Ps(i, 4)) -sin(Ps(i, 4));
    +        0 sin(Ps(i, 4))  cos(Ps(i, 4))];
     
    -  Ry = [ cos(Ps(i, 5)) 0 sin(Ps(i, 5));
    +  Ry = [ cos(Ps(i, 5)) 0 sin(Ps(i, 5));
             0        1 0;
    -        -sin(Ps(i, 5)) 0 cos(Ps(i, 5))];
    +        -sin(Ps(i, 5)) 0 cos(Ps(i, 5))];
     
    -  Rz = [cos(Ps(i, 6)) -sin(Ps(i, 6)) 0;
    -        sin(Ps(i, 6))  cos(Ps(i, 6)) 0;
    +  Rz = [cos(Ps(i, 6)) -sin(Ps(i, 6)) 0;
    +        sin(Ps(i, 6))  cos(Ps(i, 6)) 0;
             0        0       1];
     
    -  ARB = Rz*Ry*Rx;
    -  [~, Ls] = inverseKinematics(stewart, 'AP', Ps(i, 1:3)', 'ARB', ARB);
    +  ARB = Rz*Ry*Rx;
    +  [~, Ls] = inverseKinematics(stewart, 'AP', Ps(i, 1:3)', 'ARB', ARB);
     
    -  if min(Ls) < L_min
    +  if min(Ls) < L_min
         L_min = min(Ls)
    -  end
    -  if max(Ls) > L_max
    +  end
    +  if max(Ls) > L_max
         L_max = max(Ls)
    -  end
    -end
    +  end
    +end
     
    @@ -1178,15 +972,15 @@ However, for small displacements, we can use the Jacobian as an approximate solu

    -
    -

    6.1 Stewart architecture definition

    +
    +

    6.1 Stewart architecture definition

    Let’s first define the Stewart platform architecture that we want to study.

    stewart = initializeStewartPlatform();
    -stewart = initializeFramesPositions(stewart, 'H', 90e-3, 'MO_B', 45e-3);
    +stewart = initializeFramesPositions(stewart, 'H', 90e-3, 'MO_B', 45e-3);
     stewart = generateGeneralConfiguration(stewart);
     stewart = computeJointsPose(stewart);
     stewart = initializeStewartPose(stewart);
    @@ -1202,8 +996,8 @@ stewart = computeJacobian(stewart);
     Let’s now define the actuator stroke.
     

    -
    L_min = -50e-6; % [m]
    -L_max =  50e-6; % [m]
    +
    L_min = -50e-6; % [m]
    +L_max =  50e-6; % [m]
     
    @@ -1231,21 +1025,21 @@ To obtain the mobility “volume” attainable by the Stewart platform w For each possible value of \((\theta, \phi)\), we compute the maximum radius \(r\) attainable with the constraint that the stroke of each actuator should be between L_min and L_max.

    -
    thetas = linspace(0, pi, 50);
    -phis = linspace(0, 2*pi, 50);
    +
    thetas = linspace(0, pi, 50);
    +phis = linspace(0, 2*pi, 50);
     rs = zeros(length(thetas), length(phis));
     
    -for i = 1:length(thetas)
    -  for j = 1:length(phis)
    -    Tx = sin(thetas(i))*cos(phis(j));
    -    Ty = sin(thetas(i))*sin(phis(j));
    -    Tz = cos(thetas(i));
    +for i = 1:length(thetas)
    +  for j = 1:length(phis)
    +    Tx = sin(thetas(i))*cos(phis(j));
    +    Ty = sin(thetas(i))*sin(phis(j));
    +    Tz = cos(thetas(i));
     
    -    dL = stewart.kinematics.J*[Tx; Ty; Tz; 0; 0; 0;]; % dL required for 1m displacement in theta/phi direction
    +    dL = stewart.kinematics.J*[Tx; Ty; Tz; 0; 0; 0;]; % dL required for 1m displacement in theta/phi direction
     
    -    rs(i, j) = max([dL(dL<0)*L_min; dL(dL>0)*L_max]);
    -  end
    -end
    +    rs(i, j) = max([dL(dL<0)*L_min; dL(dL>0)*L_max]);
    +  end
    +end
     
    @@ -1291,16 +1085,77 @@ We can also approximate the mobility by a sphere with a radius equal to the mini
    -
    -

    7 Functions

    +
    +

    7 Estimation of the Joint required Stroke

    +
    +
    +

    7.1 Example of the initialization of a Stewart Platform

    +
    +

    +Let’s first define the Stewart Platform Geometry. +

    +
    +
    stewart = initializeStewartPlatform();
    +stewart = initializeFramesPositions(stewart, 'H', 90e-3, 'MO_B', 150e-3);
    +stewart = generateGeneralConfiguration(stewart);
    +stewart = computeJointsPose(stewart);
    +
    +As_init = stewart.geometry.As;
    +
    +
    + +
    +
    Tx_max = 50e-6; % Translation [m]
    +Ty_max = 50e-6; % Translation [m]
    +Tz_max = 50e-6; % Translation [m]
    +
    +
    + +
    +
    Ps = [2*(dec2bin(0:3^2-2,3)-'0')-1].*[Tx_max Ty_max Tz_max];
    +
    +
    + +
    +
    flex_ang = zeros(size(Ps, 1), 6);
    +
    +for Ps_i = 1:size(Ps, 1)
    +    stewart.geometry.FO_M = [0; 0; 90e-3] + Ps(Ps_i, :)';
    +
    +    stewart = generateGeneralConfiguration(stewart);
    +    stewart = computeJointsPose(stewart);
    +
    +    flex_ang(Ps_i, :) = acos(sum(As_init.*stewart.geometry.As));
    +end
    +
    +
    + +

    +And the maximum bending of the flexible joints is: (in [mrad]) +

    +
    +
    1e3*max(max(abs(flex_ang)))
    +
    +
    + +
    +0.90937
    +
    +
    +
    +
    + +
    +

    8 Functions

    +

    -

    7.1 computeJacobian: Compute the Jacobian Matrix

    -
    +

    8.1 computeJacobian: Compute the Jacobian Matrix

    +

    @@ -1310,42 +1165,42 @@ This Matlab function is accessible here.

    -
    -

    Function description

    -
    +
    +

    Function description

    +
    -
    function [stewart] = computeJacobian(stewart)
    -% computeJacobian -
    -%
    -% Syntax: [stewart] = computeJacobian(stewart)
    -%
    -% Inputs:
    -%    - stewart - With at least the following fields:
    -%      - geometry.As [3x6] - The 6 unit vectors for each strut expressed in {A}
    -%      - geometry.Ab [3x6] - The 6 position of the joints bi expressed in {A}
    -%      - actuators.K [6x1] - Total stiffness of the actuators
    -%
    -% Outputs:
    -%    - stewart - With the 3 added field:
    -%        - kinematics.J [6x6] - The Jacobian Matrix
    -%        - kinematics.K [6x6] - The Stiffness Matrix
    -%        - kinematics.C [6x6] - The Compliance Matrix
    +
    function [stewart] = computeJacobian(stewart)
    +% computeJacobian -
    +%
    +% Syntax: [stewart] = computeJacobian(stewart)
    +%
    +% Inputs:
    +%    - stewart - With at least the following fields:
    +%      - geometry.As [3x6] - The 6 unit vectors for each strut expressed in {A}
    +%      - geometry.Ab [3x6] - The 6 position of the joints bi expressed in {A}
    +%      - actuators.K [6x1] - Total stiffness of the actuators
    +%
    +% Outputs:
    +%    - stewart - With the 3 added field:
    +%        - kinematics.J [6x6] - The Jacobian Matrix
    +%        - kinematics.K [6x6] - The Stiffness Matrix
    +%        - kinematics.C [6x6] - The Compliance Matrix
     
    -
    -

    Check the stewart structure elements

    -
    +
    +

    Check the stewart structure elements

    +
    -
    assert(isfield(stewart.geometry, 'As'),   'stewart.geometry should have attribute As')
    +
    assert(isfield(stewart.geometry, 'As'),   'stewart.geometry should have attribute As')
     As = stewart.geometry.As;
     
    -assert(isfield(stewart.geometry, 'Ab'),   'stewart.geometry should have attribute Ab')
    +assert(isfield(stewart.geometry, 'Ab'),   'stewart.geometry should have attribute Ab')
     Ab = stewart.geometry.Ab;
     
    -assert(isfield(stewart.actuators, 'K'),   'stewart.actuators should have attribute K')
    +assert(isfield(stewart.actuators, 'K'),   'stewart.actuators should have attribute K')
     Ki = stewart.actuators.K;
     
    @@ -1357,7 +1212,7 @@ Ki = stewart.actuators.K;

    Compute Jacobian Matrix

    -
    J = [As' , cross(Ab, As)'];
    +
    J = [As' , cross(Ab, As)'];
     
    @@ -1367,7 +1222,7 @@ Ki = stewart.actuators.K;

    Compute Stiffness Matrix

    -
    K = J'*diag(Ki)*J;
    +
    K = J'*diag(Ki)*J;
     
    @@ -1398,8 +1253,8 @@ stewart.kinematics.C = C;
    -

    7.2 inverseKinematics: Compute Inverse Kinematics

    -
    +

    8.2 inverseKinematics: Compute Inverse Kinematics

    +

    @@ -1445,57 +1300,57 @@ Otherwise, when the limbs’ lengths derived yield complex numbers, then the
    -
    -

    Function description

    -
    +
    +

    Function description

    +
    -
    function [Li, dLi] = inverseKinematics(stewart, args)
    -% inverseKinematics - Compute the needed length of each strut to have the wanted position and orientation of {B} with respect to {A}
    -%
    -% Syntax: [stewart] = inverseKinematics(stewart)
    -%
    -% Inputs:
    -%    - stewart - A structure with the following fields
    -%        - geometry.Aa   [3x6] - The positions ai expressed in {A}
    -%        - geometry.Bb   [3x6] - The positions bi expressed in {B}
    -%        - geometry.l    [6x1] - Length of each strut
    -%    - args - Can have the following fields:
    -%        - AP   [3x1] - The wanted position of {B} with respect to {A}
    -%        - ARB  [3x3] - The rotation matrix that gives the wanted orientation of {B} with respect to {A}
    -%
    -% Outputs:
    -%    - Li   [6x1] - The 6 needed length of the struts in [m] to have the wanted pose of {B} w.r.t. {A}
    -%    - dLi  [6x1] - The 6 needed displacement of the struts from the initial position in [m] to have the wanted pose of {B} w.r.t. {A}
    +
    function [Li, dLi] = inverseKinematics(stewart, args)
    +% inverseKinematics - Compute the needed length of each strut to have the wanted position and orientation of {B} with respect to {A}
    +%
    +% Syntax: [stewart] = inverseKinematics(stewart)
    +%
    +% Inputs:
    +%    - stewart - A structure with the following fields
    +%        - geometry.Aa   [3x6] - The positions ai expressed in {A}
    +%        - geometry.Bb   [3x6] - The positions bi expressed in {B}
    +%        - geometry.l    [6x1] - Length of each strut
    +%    - args - Can have the following fields:
    +%        - AP   [3x1] - The wanted position of {B} with respect to {A}
    +%        - ARB  [3x3] - The rotation matrix that gives the wanted orientation of {B} with respect to {A}
    +%
    +% Outputs:
    +%    - Li   [6x1] - The 6 needed length of the struts in [m] to have the wanted pose of {B} w.r.t. {A}
    +%    - dLi  [6x1] - The 6 needed displacement of the struts from the initial position in [m] to have the wanted pose of {B} w.r.t. {A}
     
    -
    -

    Optional Parameters

    -
    +
    +

    Optional Parameters

    +
    arguments
         stewart
         args.AP  (3,1) double {mustBeNumeric} = zeros(3,1)
         args.ARB (3,3) double {mustBeNumeric} = eye(3)
    -end
    +end
     
    -
    -

    Check the stewart structure elements

    -
    +
    +

    Check the stewart structure elements

    +
    -
    assert(isfield(stewart.geometry, 'Aa'),   'stewart.geometry should have attribute Aa')
    +
    assert(isfield(stewart.geometry, 'Aa'),   'stewart.geometry should have attribute Aa')
     Aa = stewart.geometry.Aa;
     
    -assert(isfield(stewart.geometry, 'Bb'),   'stewart.geometry should have attribute Bb')
    +assert(isfield(stewart.geometry, 'Bb'),   'stewart.geometry should have attribute Bb')
     Bb = stewart.geometry.Bb;
     
    -assert(isfield(stewart.geometry, 'l'),   'stewart.geometry should have attribute l')
    +assert(isfield(stewart.geometry, 'l'),   'stewart.geometry should have attribute l')
     l = stewart.geometry.l;
     
    @@ -1507,12 +1362,12 @@ l = stewart.geometry.l;

    Compute

    -
    Li = sqrt(args.AP'*args.AP + diag(Bb'*Bb) + diag(Aa'*Aa) - (2*args.AP'*Aa)' + (2*args.AP'*(args.ARB*Bb))' - diag(2*(args.ARB*Bb)'*Aa));
    +
    Li = sqrt(args.AP'*args.AP + diag(Bb'*Bb) + diag(Aa'*Aa) - (2*args.AP'*Aa)' + (2*args.AP'*(args.ARB*Bb))' - diag(2*(args.ARB*Bb)'*Aa));
     
    -
    dLi = Li-l;
    +
    dLi = Li-l;
     
    @@ -1520,8 +1375,8 @@ l = stewart.geometry.l;
    -

    7.3 forwardKinematicsApprox: Compute the Approximate Forward Kinematics

    -
    +

    8.3 forwardKinematicsApprox: Compute the Approximate Forward Kinematics

    +

    @@ -1531,48 +1386,48 @@ This Matlab function is accessible he

    -
    -

    Function description

    -
    +
    +

    Function description

    +
    -
    function [P, R] = forwardKinematicsApprox(stewart, args)
    -% forwardKinematicsApprox - Computed the approximate pose of {B} with respect to {A} from the length of each strut and using
    -%                           the Jacobian Matrix
    -%
    -% Syntax: [P, R] = forwardKinematicsApprox(stewart, args)
    -%
    -% Inputs:
    -%    - stewart - A structure with the following fields
    -%        - kinematics.J  [6x6] - The Jacobian Matrix
    -%    - args - Can have the following fields:
    -%        - dL [6x1] - Displacement of each strut [m]
    -%
    -% Outputs:
    -%    - P  [3x1] - The estimated position of {B} with respect to {A}
    -%    - R  [3x3] - The estimated rotation matrix that gives the orientation of {B} with respect to {A}
    +
    function [P, R] = forwardKinematicsApprox(stewart, args)
    +% forwardKinematicsApprox - Computed the approximate pose of {B} with respect to {A} from the length of each strut and using
    +%                           the Jacobian Matrix
    +%
    +% Syntax: [P, R] = forwardKinematicsApprox(stewart, args)
    +%
    +% Inputs:
    +%    - stewart - A structure with the following fields
    +%        - kinematics.J  [6x6] - The Jacobian Matrix
    +%    - args - Can have the following fields:
    +%        - dL [6x1] - Displacement of each strut [m]
    +%
    +% Outputs:
    +%    - P  [3x1] - The estimated position of {B} with respect to {A}
    +%    - R  [3x3] - The estimated rotation matrix that gives the orientation of {B} with respect to {A}
     
    -
    -

    Optional Parameters

    -
    +
    +

    Optional Parameters

    +
    arguments
         stewart
         args.dL (6,1) double {mustBeNumeric} = zeros(6,1)
    -end
    +end
     
    -
    -

    Check the stewart structure elements

    -
    +
    +

    Check the stewart structure elements

    +
    -
    assert(isfield(stewart.kinematics, 'J'),   'stewart.kinematics should have attribute J')
    +
    assert(isfield(stewart.kinematics, 'J'),   'stewart.kinematics should have attribute J')
     J = stewart.kinematics.J;
     
    @@ -1588,7 +1443,7 @@ position and orientation of {B} with respect to {A} using the following formula: \[ d \bm{\mathcal{X}} = \bm{J}^{-1} d\bm{\mathcal{L}} \]

    -
    X = J\args.dL;
    +
    X = J\args.dL;
     
    @@ -1596,7 +1451,7 @@ position and orientation of {B} with respect to {A} using the following formula: The position vector corresponds to the first 3 elements.

    -
    P = X(1:3);
    +
    P = X(1:3);
     
    @@ -1605,8 +1460,8 @@ The next 3 elements are the orientation of {B} with respect to {A} expressed using the screw axis.

    -
    theta = norm(X(4:6));
    -s = X(4:6)/theta;
    +
    theta = norm(X(4:6));
    +s = X(4:6)/theta;
     
    @@ -1614,9 +1469,9 @@ s = X(4:6)/theta; We then compute the corresponding rotation matrix.

    -
    R = [s(1)^2*(1-cos(theta)) + cos(theta) ,        s(1)*s(2)*(1-cos(theta)) - s(3)*sin(theta), s(1)*s(3)*(1-cos(theta)) + s(2)*sin(theta);
    -     s(2)*s(1)*(1-cos(theta)) + s(3)*sin(theta), s(2)^2*(1-cos(theta)) + cos(theta),         s(2)*s(3)*(1-cos(theta)) - s(1)*sin(theta);
    -     s(3)*s(1)*(1-cos(theta)) - s(2)*sin(theta), s(3)*s(2)*(1-cos(theta)) + s(1)*sin(theta), s(3)^2*(1-cos(theta)) + cos(theta)];
    +
    R = [s(1)^2*(1-cos(theta)) + cos(theta) ,        s(1)*s(2)*(1-cos(theta)) - s(3)*sin(theta), s(1)*s(3)*(1-cos(theta)) + s(2)*sin(theta);
    +     s(2)*s(1)*(1-cos(theta)) + s(3)*sin(theta), s(2)^2*(1-cos(theta)) + cos(theta),         s(2)*s(3)*(1-cos(theta)) - s(1)*sin(theta);
    +     s(3)*s(1)*(1-cos(theta)) - s(2)*sin(theta), s(3)*s(2)*(1-cos(theta)) + s(1)*sin(theta), s(3)^2*(1-cos(theta)) + cos(theta)];
     
    @@ -1626,14 +1481,16 @@ We then compute the corresponding rotation matrix.

    -

    Bibliography

    -

    + +

    Bibliography

    +
    +
    Taghirad, Hamid. 2013. Parallel Robots : Mechanics and Control. Boca Raton, FL: CRC Press.
    +

    Author: Dehaeze Thomas

    -

    Created: 2020-03-02 lun. 17:57

    +

    Created: 2020-08-05 mer. 13:27

    diff --git a/docs/simscape-model.html b/docs/simscape-model.html index f610d31..63a179d 100644 --- a/docs/simscape-model.html +++ b/docs/simscape-model.html @@ -1,239 +1,27 @@ - - + - Stewart Platform - Simscape Model - - - - +
    @@ -255,16 +43,16 @@
    @@ -510,50 +298,50 @@ This Matlab function is accessible here

    -
    -

    Function description

    -
    +
    +

    Function description

    +
    -
    function [payload] = initializePayload(args)
    -% initializePayload - Initialize the Payload that can then be used for simulations and analysis
    -%
    -% Syntax: [payload] = initializePayload(args)
    -%
    -% Inputs:
    -%    - args - Structure with the following fields:
    -%        - type - 'none', 'rigid', 'flexible', 'cartesian'
    -%        - h [1x1] - Height of the CoM of the payload w.r.t {M} [m]
    -%                    This also the position where K and C are defined
    -%        - K [6x1] - Stiffness of the Payload [N/m, N/rad]
    -%        - C [6x1] - Damping of the Payload [N/(m/s), N/(rad/s)]
    -%        - m [1x1] - Mass of the Payload [kg]
    -%        - I [3x3] - Inertia matrix for the Payload [kg*m2]
    -%
    -% Outputs:
    -%    - payload - Struture with the following properties:
    -%        - type - 1 (none), 2 (rigid), 3 (flexible)
    -%        - h [1x1] - Height of the CoM of the payload w.r.t {M} [m]
    -%        - K [6x1] - Stiffness of the Payload [N/m, N/rad]
    -%        - C [6x1] - Stiffness of the Payload [N/(m/s), N/(rad/s)]
    -%        - m [1x1] - Mass of the Payload [kg]
    -%        - I [3x3] - Inertia matrix for the Payload [kg*m2]
    +
    function [payload] = initializePayload(args)
    +% initializePayload - Initialize the Payload that can then be used for simulations and analysis
    +%
    +% Syntax: [payload] = initializePayload(args)
    +%
    +% Inputs:
    +%    - args - Structure with the following fields:
    +%        - type - 'none', 'rigid', 'flexible', 'cartesian'
    +%        - h [1x1] - Height of the CoM of the payload w.r.t {M} [m]
    +%                    This also the position where K and C are defined
    +%        - K [6x1] - Stiffness of the Payload [N/m, N/rad]
    +%        - C [6x1] - Damping of the Payload [N/(m/s), N/(rad/s)]
    +%        - m [1x1] - Mass of the Payload [kg]
    +%        - I [3x3] - Inertia matrix for the Payload [kg*m2]
    +%
    +% Outputs:
    +%    - payload - Struture with the following properties:
    +%        - type - 1 (none), 2 (rigid), 3 (flexible)
    +%        - h [1x1] - Height of the CoM of the payload w.r.t {M} [m]
    +%        - K [6x1] - Stiffness of the Payload [N/m, N/rad]
    +%        - C [6x1] - Stiffness of the Payload [N/(m/s), N/(rad/s)]
    +%        - m [1x1] - Mass of the Payload [kg]
    +%        - I [3x3] - Inertia matrix for the Payload [kg*m2]
     
    -
    -

    Optional Parameters

    -
    +
    +

    Optional Parameters

    +
    arguments
    -  args.type char {mustBeMember(args.type,{'none', 'rigid', 'flexible', 'cartesian'})} = 'none'
    -  args.K (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e8*ones(6,1)
    -  args.C (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e1*ones(6,1)
    -  args.h (1,1) double {mustBeNumeric, mustBeNonnegative} = 100e-3
    +  args.type char {mustBeMember(args.type,{'none', 'rigid', 'flexible', 'cartesian'})} = 'none'
    +  args.K (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e8*ones(6,1)
    +  args.C (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e1*ones(6,1)
    +  args.h (1,1) double {mustBeNumeric, mustBeNonnegative} = 100e-3
       args.m (1,1) double {mustBeNumeric, mustBeNonnegative} = 10
    -  args.I (3,3) double {mustBeNumeric, mustBeNonnegative} = 1*eye(3)
    -end
    +  args.I (3,3) double {mustBeNumeric, mustBeNonnegative} = 1*eye(3)
    +end
     
    @@ -563,16 +351,16 @@ This Matlab function is accessible here

    Add Payload Type

    -
    switch args.type
    -  case 'none'
    +
    switch args.type
    +  case 'none'
         payload.type = 1;
    -  case 'rigid'
    +  case 'rigid'
         payload.type = 2;
    -  case 'flexible'
    +  case 'flexible'
         payload.type = 3;
    -  case 'cartesian'
    +  case 'cartesian'
         payload.type = 4;
    -end
    +end
     
    @@ -606,42 +394,42 @@ This Matlab function is accessible here.

    -
    -

    Function description

    -
    +
    +

    Function description

    +
    -
    function [ground] = initializeGround(args)
    -% initializeGround - Initialize the Ground that can then be used for simulations and analysis
    -%
    -% Syntax: [ground] = initializeGround(args)
    -%
    -% Inputs:
    -%    - args - Structure with the following fields:
    -%        - type - 'none', 'solid', 'flexible'
    -%        - rot_point [3x1] - Rotation point for the ground motion [m]
    -%        - K [3x1] - Translation Stiffness of the Ground [N/m]
    -%        - C [3x1] - Translation Damping of the Ground [N/(m/s)]
    -%
    -% Outputs:
    -%    - ground - Struture with the following properties:
    -%        - type - 1 (none), 2 (rigid), 3 (flexible)
    -%        - K [3x1] - Translation Stiffness of the Ground [N/m]
    -%        - C [3x1] - Translation Damping of the Ground [N/(m/s)]
    +
    function [ground] = initializeGround(args)
    +% initializeGround - Initialize the Ground that can then be used for simulations and analysis
    +%
    +% Syntax: [ground] = initializeGround(args)
    +%
    +% Inputs:
    +%    - args - Structure with the following fields:
    +%        - type - 'none', 'solid', 'flexible'
    +%        - rot_point [3x1] - Rotation point for the ground motion [m]
    +%        - K [3x1] - Translation Stiffness of the Ground [N/m]
    +%        - C [3x1] - Translation Damping of the Ground [N/(m/s)]
    +%
    +% Outputs:
    +%    - ground - Struture with the following properties:
    +%        - type - 1 (none), 2 (rigid), 3 (flexible)
    +%        - K [3x1] - Translation Stiffness of the Ground [N/m]
    +%        - C [3x1] - Translation Damping of the Ground [N/(m/s)]
     
    -
    -

    Optional Parameters

    -
    +
    +

    Optional Parameters

    +
    arguments
    -  args.type char {mustBeMember(args.type,{'none', 'rigid', 'flexible'})} = 'none'
    +  args.type char {mustBeMember(args.type,{'none', 'rigid', 'flexible'})} = 'none'
       args.rot_point (3,1) double {mustBeNumeric} = zeros(3,1)
    -  args.K (3,1) double {mustBeNumeric, mustBeNonnegative} = 1e8*ones(3,1)
    -  args.C (3,1) double {mustBeNumeric, mustBeNonnegative} = 1e1*ones(3,1)
    -end
    +  args.K (3,1) double {mustBeNumeric, mustBeNonnegative} = 1e8*ones(3,1)
    +  args.C (3,1) double {mustBeNumeric, mustBeNonnegative} = 1e1*ones(3,1)
    +end
     
    @@ -651,14 +439,14 @@ This Matlab function is accessible here.

    Add Ground Type

    -
    switch args.type
    -  case 'none'
    +
    switch args.type
    +  case 'none'
         ground.type = 1;
    -  case 'rigid'
    +  case 'rigid'
         ground.type = 2;
    -  case 'flexible'
    +  case 'flexible'
         ground.type = 3;
    -end
    +end
     
    @@ -694,33 +482,33 @@ ground.C = args.C;

    -
    -

    Function Declaration and Documentation

    -
    +
    +

    Function Declaration and Documentation

    +
    -
    function [disturbances] = initializeDisturbances(args)
    -% initializeDisturbances - Initialize the disturbances
    -%
    -% Syntax: [disturbances] = initializeDisturbances(args)
    -%
    -% Inputs:
    -%    - args -
    +
    function [disturbances] = initializeDisturbances(args)
    +% initializeDisturbances - Initialize the disturbances
    +%
    +% Syntax: [disturbances] = initializeDisturbances(args)
    +%
    +% Inputs:
    +%    - args -
     
     
    -
    -

    Optional Parameters

    -
    +
    +

    Optional Parameters

    +
    arguments
       args.Fd     double  {mustBeNumeric, mustBeReal} = zeros(6,1)
       args.Fd_t   double  {mustBeNumeric, mustBeReal} = 0
       args.Dw     double  {mustBeNumeric, mustBeReal} = zeros(6,1)
       args.Dw_t   double  {mustBeNumeric, mustBeReal} = 0
    -end
    +end
     
    @@ -766,32 +554,32 @@ ground.C = args.C;

    -
    -

    Function Declaration and Documentation

    -
    +
    +

    Function Declaration and Documentation

    +
    -
    function [references] = initializeReferences(stewart, args)
    -% initializeReferences - Initialize the references
    -%
    -% Syntax: [references] = initializeReferences(args)
    -%
    -% Inputs:
    -%    - args -
    +
    function [references] = initializeReferences(stewart, args)
    +% initializeReferences - Initialize the references
    +%
    +% Syntax: [references] = initializeReferences(args)
    +%
    +% Inputs:
    +%    - args -
     
     
    -
    -

    Optional Parameters

    -
    +
    +

    Optional Parameters

    +
    arguments
       stewart
       args.t double {mustBeNumeric, mustBeReal} = 0
       args.r double {mustBeNumeric, mustBeReal} = zeros(6, 1)
    -end
    +end
     
    @@ -803,20 +591,20 @@ ground.C = args.C;
    rL = zeros(6, length(args.t));
     
    -for i = 1:length(args.t)
    -  R = [cos(args.r(6,i)) -sin(args.r(6,i))  0;
    -       sin(args.r(6,i))  cos(args.r(6,i))  0;
    -       0           0           1] * ...
    -      [cos(args.r(5,i))  0           sin(args.r(5,i));
    +for i = 1:length(args.t)
    +  R = [cos(args.r(6,i)) -sin(args.r(6,i))  0;
    +       sin(args.r(6,i))  cos(args.r(6,i))  0;
    +       0           0           1] * ...
    +      [cos(args.r(5,i))  0           sin(args.r(5,i));
            0           1           0;
    -      -sin(args.r(5,i))  0           cos(args.r(5,i))] * ...
    +      -sin(args.r(5,i))  0           cos(args.r(5,i))] * ...
           [1           0           0;
    -       0           cos(args.r(4,i)) -sin(args.r(4,i));
    -       0           sin(args.r(4,i))  cos(args.r(4,i))];
    +       0           cos(args.r(4,i)) -sin(args.r(4,i));
    +       0           sin(args.r(4,i))  cos(args.r(4,i))];
     
    - [Li, dLi] = inverseKinematics(stewart, 'AP', [args.r(1,i); args.r(2,i); args.r(3,i)], 'ARB', R);
    - rL(:, i) = dLi;
    -end
    + [Li, dLi] = inverseKinematics(stewart, 'AP', [args.r(1,i); args.r(2,i); args.r(3,i)], 'ARB', R);
    + rL(:, i) = dLi;
    +end
     
    @@ -836,7 +624,7 @@ references.rL = timeseries(rL, args.t);

    Author: Dehaeze Thomas

    -

    Created: 2020-03-11 mer. 18:59

    +

    Created: 2020-08-05 mer. 13:27

    diff --git a/docs/simulink-project.html b/docs/simulink-project.html index dcbf91b..43fe36f 100644 --- a/docs/simulink-project.html +++ b/docs/simulink-project.html @@ -1,229 +1,19 @@ - - + - Simulink Project for the Stewart Simscape folder - -
    @@ -232,7 +22,6 @@ HOME

    Simulink Project for the Stewart Simscape folder

    -

    A Simulink Project is used for the study of Stewart platforms using Simscape.

    @@ -260,7 +49,7 @@ The project can be opened using the simulinkproject function:

    -
    simulinkproject('../');
    +
    simulinkproject('../');
     
    @@ -272,16 +61,16 @@ The startup script is defined below and is exported to the project_startup
    project = simulinkproject;
     projectRoot = project.RootFolder;
     
    -myCacheFolder = fullfile(projectRoot, '.SimulinkCache');
    -myCodeFolder = fullfile(projectRoot, '.SimulinkCode');
    +myCacheFolder = fullfile(projectRoot, '.SimulinkCache');
    +myCodeFolder = fullfile(projectRoot, '.SimulinkCode');
     
    -Simulink.fileGenControl('set',...
    -    'CacheFolder', myCacheFolder,...
    -    'CodeGenFolder', myCodeFolder,...
    -    'createDir', true);
    +Simulink.fileGenControl('set',...
    +    'CacheFolder', myCacheFolder,...
    +    'CodeGenFolder', myCodeFolder,...
    +    'createDir', true);
     
    -%% Load the Simscape Configuration
    -load('mat/conf_simscape.mat');
    +%% Load the Simscape Configuration
    +load('mat/conf_simscape.mat');
     
    @@ -289,7 +78,7 @@ load('mat/conf_simscape.mat'); When the project closes, it runs the project_shutdown.m script defined below.

    -
    Simulink.fileGenControl('reset');
    +
    Simulink.fileGenControl('reset');
     
    @@ -299,7 +88,7 @@ The project also permits to automatically add defined folder to the path when th

    Author: Dehaeze Thomas

    -

    Created: 2020-03-02 lun. 17:57

    +

    Created: 2020-08-05 mer. 13:27

    diff --git a/docs/static-analysis.html b/docs/static-analysis.html index 433eedb..8d88010 100644 --- a/docs/static-analysis.html +++ b/docs/static-analysis.html @@ -1,239 +1,27 @@ - - + - Stewart Platform - Static Analysis - - - - +
    @@ -281,7 +69,7 @@ Thus, the system is uncoupled if \(G\) and \(K\) are diagonal.

    Author: Dehaeze Thomas

    -

    Created: 2020-03-02 lun. 17:57

    +

    Created: 2020-08-05 mer. 13:27

    diff --git a/docs/stewart-architecture.html b/docs/stewart-architecture.html index e664ae7..114fca9 100644 --- a/docs/stewart-architecture.html +++ b/docs/stewart-architecture.html @@ -1,239 +1,27 @@ - - + - Stewart Platform - Definition of the Architecture - - - - +
    @@ -275,121 +63,130 @@ @@ -407,7 +204,7 @@ Some efforts has been made such that the procedure for the definition of the Ste

    -When possible, the notations are compatible with the one used in taghirad13_paral. +When possible, the notations are compatible with the one used in (Taghirad 2013).

    @@ -717,10 +514,10 @@ Let’s first define the Stewart Platform Geometry.

    stewart = initializeStewartPlatform();
    -stewart = initializeFramesPositions(stewart, 'H', 90e-3, 'MO_B', 45e-3);
    +stewart = initializeFramesPositions(stewart, 'H', 90e-3, 'MO_B', 45e-3);
     stewart = generateGeneralConfiguration(stewart);
     stewart = computeJointsPose(stewart);
    -stewart = initializeStewartPose(stewart, 'AP', [0;0;0], 'ARB', eye(3));
    +stewart = initializeStewartPose(stewart, 'AP', [0;0;0], 'ARB', eye(3));
     
    @@ -737,7 +534,7 @@ stewart = initializeCylindricalStruts(stewart); We initialize the strut stiffness and damping properties.

    -
    stewart = initializeStrutDynamics(stewart, 'K', 1e6*ones(6,1), 'C', 1e2*ones(6,1));
    +
    stewart = initializeStrutDynamics(stewart, 'K', 1e6*ones(6,1), 'C', 1e2*ones(6,1));
     stewart = initializeAmplifiedStrutDynamics(stewart);
     stewart = initializeJointDynamics(stewart);
     
    @@ -747,7 +544,7 @@ stewart = initializeJointDynamics(stewart); And finally the inertial sensors included in each strut.

    -
    stewart = initializeInertialSensor(stewart, 'type', 'none');
    +
    stewart = initializeInertialSensor(stewart, 'type', 'none');
     
    @@ -759,7 +556,7 @@ The obtained stewart Matlab structure contains all the information The function displayArchitecture can be used to display the current Stewart configuration:

    -
    displayArchitecture(stewart, 'views', 'all');
    +
    displayArchitecture(stewart, 'views', 'all');
     
    @@ -779,27 +576,27 @@ The documentation of the function is available here. Let’s now move a little bit the top platform and re-display the configuration:

    -
    tx = 0.1; % [rad]
    -ty = 0.2; % [rad]
    -tz = 0.05; % [rad]
    +
    tx = 0.1; % [rad]
    +ty = 0.2; % [rad]
    +tz = 0.05; % [rad]
     
     Rx = [1 0        0;
    -      0 cos(tx) -sin(tx);
    +      0 cos(tx) -sin(tx);
           0 sin(tx)  cos(tx)];
     
     Ry = [ cos(ty) 0 sin(ty);
           0        1 0;
    -      -sin(ty) 0 cos(ty)];
    +      -sin(ty) 0 cos(ty)];
     
    -Rz = [cos(tz) -sin(tz) 0;
    +Rz = [cos(tz) -sin(tz) 0;
           sin(tz)  cos(tz) 0;
           0        0       1];
     
    -ARB = Rz*Ry*Rx;
    -AP = [0.08; 0; 0]; % [m]
    +ARB = Rz*Ry*Rx;
    +AP = [0.08; 0; 0]; % [m]
     
    -displayArchitecture(stewart, 'AP', AP, 'ARB', ARB);
    -view([0 -1 0]);
    +displayArchitecture(stewart, 'AP', AP, 'ARB', ARB);
    +view([0 -1 0]);
     
    @@ -876,11 +673,11 @@ This Matlab function is accessible

    -
    -

    Documentation

    -
    +
    +

    Documentation

    +
    - -
    -

    Function description

    -
    + -
    -

    Documentation

    -
    +
    +

    Documentation

    +
    - -
    -

    Function description

    -
    +
    +

    Function description

    +
    -
    function [stewart] = initializeFramesPositions(stewart, args)
    -% initializeFramesPositions - Initialize the positions of frames {A}, {B}, {F} and {M}
    -%
    -% Syntax: [stewart] = initializeFramesPositions(stewart, args)
    -%
    -% Inputs:
    -%    - args - Can have the following fields:
    -%        - H    [1x1] - Total Height of the Stewart Platform (height from {F} to {M}) [m]
    -%        - MO_B [1x1] - Height of the frame {B} with respect to {M} [m]
    -%
    -% Outputs:
    -%    - stewart - A structure with the following fields:
    -%        - geometry.H      [1x1] - Total Height of the Stewart Platform [m]
    -%        - geometry.FO_M   [3x1] - Position of {M} with respect to {F} [m]
    -%        - platform_M.MO_B [3x1] - Position of {B} with respect to {M} [m]
    -%        - platform_F.FO_A [3x1] - Position of {A} with respect to {F} [m]
    +
    function [stewart] = initializeFramesPositions(stewart, args)
    +% initializeFramesPositions - Initialize the positions of frames {A}, {B}, {F} and {M}
    +%
    +% Syntax: [stewart] = initializeFramesPositions(stewart, args)
    +%
    +% Inputs:
    +%    - args - Can have the following fields:
    +%        - H    [1x1] - Total Height of the Stewart Platform (height from {F} to {M}) [m]
    +%        - MO_B [1x1] - Height of the frame {B} with respect to {M} [m]
    +%
    +% Outputs:
    +%    - stewart - A structure with the following fields:
    +%        - geometry.H      [1x1] - Total Height of the Stewart Platform [m]
    +%        - geometry.FO_M   [3x1] - Position of {M} with respect to {F} [m]
    +%        - platform_M.MO_B [3x1] - Position of {B} with respect to {M} [m]
    +%        - platform_F.FO_A [3x1] - Position of {A} with respect to {F} [m]
     
    -
    -

    Optional Parameters

    -
    + -
    -

    Populate the stewart structure

    -
    +
    +

    Populate the stewart structure

    +
    stewart.geometry.H      = H;
     stewart.geometry.FO_M   = FO_M;
    @@ -1042,9 +839,9 @@ This Matlab function is accessible 
    -

    Documentation

    -
    + -
    -

    Function description

    -
    +
    +

    Function description

    +
    -
    function [stewart] = generateGeneralConfiguration(stewart, args)
    -% generateGeneralConfiguration - Generate a Very General Configuration
    -%
    -% Syntax: [stewart] = generateGeneralConfiguration(stewart, args)
    -%
    -% Inputs:
    -%    - args - Can have the following fields:
    -%        - FH  [1x1] - Height of the position of the fixed joints with respect to the frame {F} [m]
    -%        - FR  [1x1] - Radius of the position of the fixed joints in the X-Y [m]
    -%        - FTh [6x1] - Angles of the fixed joints in the X-Y plane with respect to the X axis [rad]
    -%        - MH  [1x1] - Height of the position of the mobile joints with respect to the frame {M} [m]
    -%        - FR  [1x1] - Radius of the position of the mobile joints in the X-Y [m]
    -%        - MTh [6x1] - Angles of the mobile joints in the X-Y plane with respect to the X axis [rad]
    -%
    -% Outputs:
    -%    - stewart - updated Stewart structure with the added fields:
    -%        - platform_F.Fa  [3x6] - Its i'th column is the position vector of joint ai with respect to {F}
    -%        - platform_M.Mb  [3x6] - Its i'th column is the position vector of joint bi with respect to {M}
    +
    function [stewart] = generateGeneralConfiguration(stewart, args)
    +% generateGeneralConfiguration - Generate a Very General Configuration
    +%
    +% Syntax: [stewart] = generateGeneralConfiguration(stewart, args)
    +%
    +% Inputs:
    +%    - args - Can have the following fields:
    +%        - FH  [1x1] - Height of the position of the fixed joints with respect to the frame {F} [m]
    +%        - FR  [1x1] - Radius of the position of the fixed joints in the X-Y [m]
    +%        - FTh [6x1] - Angles of the fixed joints in the X-Y plane with respect to the X axis [rad]
    +%        - MH  [1x1] - Height of the position of the mobile joints with respect to the frame {M} [m]
    +%        - FR  [1x1] - Radius of the position of the mobile joints in the X-Y [m]
    +%        - MTh [6x1] - Angles of the mobile joints in the X-Y plane with respect to the X axis [rad]
    +%
    +% Outputs:
    +%    - stewart - updated Stewart structure with the added fields:
    +%        - platform_F.Fa  [3x6] - Its i'th column is the position vector of joint ai with respect to {F}
    +%        - platform_M.Mb  [3x6] - Its i'th column is the position vector of joint bi with respect to {M}
     
    -
    -

    Optional Parameters

    -
    +
    +

    Optional Parameters

    +
    arguments
         stewart
    -    args.FH  (1,1) double {mustBeNumeric, mustBePositive} = 15e-3
    -    args.FR  (1,1) double {mustBeNumeric, mustBePositive} = 115e-3;
    -    args.FTh (6,1) double {mustBeNumeric} = [-10, 10, 120-10, 120+10, 240-10, 240+10]*(pi/180);
    -    args.MH  (1,1) double {mustBeNumeric, mustBePositive} = 15e-3
    -    args.MR  (1,1) double {mustBeNumeric, mustBePositive} = 90e-3;
    -    args.MTh (6,1) double {mustBeNumeric} = [-60+10, 60-10, 60+10, 180-10, 180+10, -60-10]*(pi/180);
    -end
    +    args.FH  (1,1) double {mustBeNumeric, mustBePositive} = 15e-3
    +    args.FR  (1,1) double {mustBeNumeric, mustBePositive} = 115e-3;
    +    args.FTh (6,1) double {mustBeNumeric} = [-10, 10, 120-10, 120+10, 240-10, 240+10]*(pi/180);
    +    args.MH  (1,1) double {mustBeNumeric, mustBePositive} = 15e-3
    +    args.MR  (1,1) double {mustBeNumeric, mustBePositive} = 90e-3;
    +    args.MTh (6,1) double {mustBeNumeric} = [-60+10, 60-10, 60+10, 180-10, 180+10, -60-10]*(pi/180);
    +end
     
    @@ -1114,18 +911,18 @@ Mb = zeros(3,6);
    -
    for i = 1:6
    -  Fa(:,i) = [args.FR*cos(args.FTh(i)); args.FR*sin(args.FTh(i));  args.FH];
    -  Mb(:,i) = [args.MR*cos(args.MTh(i)); args.MR*sin(args.MTh(i)); -args.MH];
    -end
    +
    for i = 1:6
    +  Fa(:,i) = [args.FR*cos(args.FTh(i)); args.FR*sin(args.FTh(i));  args.FH];
    +  Mb(:,i) = [args.MR*cos(args.MTh(i)); args.MR*sin(args.MTh(i)); -args.MH];
    +end
     
    -
    -

    Populate the stewart structure

    -
    +
    +

    Populate the stewart structure

    +
    stewart.platform_F.Fa = Fa;
     stewart.platform_M.Mb = Mb;
    @@ -1147,9 +944,9 @@ This Matlab function is accessible here
     

    -
    -

    Documentation

    -
    +
    +

    Documentation

    +

    stewart-struts.png @@ -1159,58 +956,58 @@ This Matlab function is accessible here

    -
    -

    Function description

    -
    +
    +

    Function description

    +
    -
    function [stewart] = computeJointsPose(stewart)
    -% computeJointsPose -
    -%
    -% Syntax: [stewart] = computeJointsPose(stewart)
    -%
    -% Inputs:
    -%    - stewart - A structure with the following fields
    -%        - platform_F.Fa   [3x6] - Its i'th column is the position vector of joint ai with respect to {F}
    -%        - platform_M.Mb   [3x6] - Its i'th column is the position vector of joint bi with respect to {M}
    -%        - platform_F.FO_A [3x1] - Position of {A} with respect to {F}
    -%        - platform_M.MO_B [3x1] - Position of {B} with respect to {M}
    -%        - geometry.FO_M   [3x1] - Position of {M} with respect to {F}
    -%
    -% Outputs:
    -%    - stewart - A structure with the following added fields
    -%        - geometry.Aa    [3x6]   - The i'th column is the position of ai with respect to {A}
    -%        - geometry.Ab    [3x6]   - The i'th column is the position of bi with respect to {A}
    -%        - geometry.Ba    [3x6]   - The i'th column is the position of ai with respect to {B}
    -%        - geometry.Bb    [3x6]   - The i'th column is the position of bi with respect to {B}
    -%        - geometry.l     [6x1]   - The i'th element is the initial length of strut i
    -%        - geometry.As    [3x6]   - The i'th column is the unit vector of strut i expressed in {A}
    -%        - geometry.Bs    [3x6]   - The i'th column is the unit vector of strut i expressed in {B}
    -%        - struts_F.l     [6x1]   - Length of the Fixed part of the i'th strut
    -%        - struts_M.l     [6x1]   - Length of the Mobile part of the i'th strut
    -%        - platform_F.FRa [3x3x6] - The i'th 3x3 array is the rotation matrix to orientate the bottom of the i'th strut from {F}
    -%        - platform_M.MRb [3x3x6] - The i'th 3x3 array is the rotation matrix to orientate the top of the i'th strut from {M}
    +
    function [stewart] = computeJointsPose(stewart)
    +% computeJointsPose -
    +%
    +% Syntax: [stewart] = computeJointsPose(stewart)
    +%
    +% Inputs:
    +%    - stewart - A structure with the following fields
    +%        - platform_F.Fa   [3x6] - Its i'th column is the position vector of joint ai with respect to {F}
    +%        - platform_M.Mb   [3x6] - Its i'th column is the position vector of joint bi with respect to {M}
    +%        - platform_F.FO_A [3x1] - Position of {A} with respect to {F}
    +%        - platform_M.MO_B [3x1] - Position of {B} with respect to {M}
    +%        - geometry.FO_M   [3x1] - Position of {M} with respect to {F}
    +%
    +% Outputs:
    +%    - stewart - A structure with the following added fields
    +%        - geometry.Aa    [3x6]   - The i'th column is the position of ai with respect to {A}
    +%        - geometry.Ab    [3x6]   - The i'th column is the position of bi with respect to {A}
    +%        - geometry.Ba    [3x6]   - The i'th column is the position of ai with respect to {B}
    +%        - geometry.Bb    [3x6]   - The i'th column is the position of bi with respect to {B}
    +%        - geometry.l     [6x1]   - The i'th element is the initial length of strut i
    +%        - geometry.As    [3x6]   - The i'th column is the unit vector of strut i expressed in {A}
    +%        - geometry.Bs    [3x6]   - The i'th column is the unit vector of strut i expressed in {B}
    +%        - struts_F.l     [6x1]   - Length of the Fixed part of the i'th strut
    +%        - struts_M.l     [6x1]   - Length of the Mobile part of the i'th strut
    +%        - platform_F.FRa [3x3x6] - The i'th 3x3 array is the rotation matrix to orientate the bottom of the i'th strut from {F}
    +%        - platform_M.MRb [3x3x6] - The i'th 3x3 array is the rotation matrix to orientate the top of the i'th strut from {M}
     
    -
    -

    Check the stewart structure elements

    -
    +
    +

    Check the stewart structure elements

    +
    -
    assert(isfield(stewart.platform_F, 'Fa'),   'stewart.platform_F should have attribute Fa')
    +
    assert(isfield(stewart.platform_F, 'Fa'),   'stewart.platform_F should have attribute Fa')
     Fa = stewart.platform_F.Fa;
     
    -assert(isfield(stewart.platform_M, 'Mb'),   'stewart.platform_M should have attribute Mb')
    +assert(isfield(stewart.platform_M, 'Mb'),   'stewart.platform_M should have attribute Mb')
     Mb = stewart.platform_M.Mb;
     
    -assert(isfield(stewart.platform_F, 'FO_A'), 'stewart.platform_F should have attribute FO_A')
    +assert(isfield(stewart.platform_F, 'FO_A'), 'stewart.platform_F should have attribute FO_A')
     FO_A = stewart.platform_F.FO_A;
     
    -assert(isfield(stewart.platform_M, 'MO_B'), 'stewart.platform_M should have attribute MO_B')
    +assert(isfield(stewart.platform_M, 'MO_B'), 'stewart.platform_M should have attribute MO_B')
     MO_B = stewart.platform_M.MO_B;
     
    -assert(isfield(stewart.geometry,   'FO_M'), 'stewart.geometry should have attribute FO_M')
    +assert(isfield(stewart.geometry,   'FO_M'), 'stewart.geometry should have attribute FO_M')
     FO_M = stewart.geometry.FO_M;
     
    @@ -1221,11 +1018,11 @@ FO_M = stewart.geometry.FO_M;

    Compute the position of the Joints

    -
    Aa = Fa - repmat(FO_A, [1, 6]);
    -Bb = Mb - repmat(MO_B, [1, 6]);
    +
    Aa = Fa - repmat(FO_A, [1, 6]);
    +Bb = Mb - repmat(MO_B, [1, 6]);
     
    -Ab = Bb - repmat(-MO_B-FO_M+FO_A, [1, 6]);
    -Ba = Aa - repmat( MO_B+FO_M-FO_A, [1, 6]);
    +Ab = Bb - repmat(-MO_B-FO_M+FO_A, [1, 6]);
    +Ba = Aa - repmat( MO_B+FO_M-FO_A, [1, 6]);
     
    @@ -1235,14 +1032,14 @@ Ba = Aa - repmat( MO_B+Compute the strut length and orientation
    -
    As = (Ab - Aa)./vecnorm(Ab - Aa); % As_i is the i'th vector of As
    +
    As = (Ab - Aa)./vecnorm(Ab - Aa); % As_i is the i'th vector of As
     
    -l = vecnorm(Ab - Aa)';
    +l = vecnorm(Ab - Aa)';
     
    -
    Bs = (Bb - Ba)./vecnorm(Bb - Ba);
    +
    Bs = (Bb - Ba)./vecnorm(Bb - Ba);
     
    @@ -1255,21 +1052,21 @@ l = vecnorm(Ab - Aa)'FRa = zeros(3,3,6); MRb = zeros(3,3,6); -for i = 1:6 - FRa(:,:,i) = [cross([0;1;0], As(:,i)) , cross(As(:,i), cross([0;1;0], As(:,i))) , As(:,i)]; - FRa(:,:,i) = FRa(:,:,i)./vecnorm(FRa(:,:,i)); +for i = 1:6 + FRa(:,:,i) = [cross([0;1;0], As(:,i)) , cross(As(:,i), cross([0;1;0], As(:,i))) , As(:,i)]; + FRa(:,:,i) = FRa(:,:,i)./vecnorm(FRa(:,:,i)); - MRb(:,:,i) = [cross([0;1;0], Bs(:,i)) , cross(Bs(:,i), cross([0;1;0], Bs(:,i))) , Bs(:,i)]; - MRb(:,:,i) = MRb(:,:,i)./vecnorm(MRb(:,:,i)); -end + MRb(:,:,i) = [cross([0;1;0], Bs(:,i)) , cross(Bs(:,i), cross([0;1;0], Bs(:,i))) , Bs(:,i)]; + MRb(:,:,i) = MRb(:,:,i)./vecnorm(MRb(:,:,i)); +end
    -
    -

    Populate the stewart structure

    -
    +
    +

    Populate the stewart structure

    +
    stewart.geometry.Aa = Aa;
     stewart.geometry.Ab = Ab;
    @@ -1279,8 +1076,8 @@ stewart.geometry.As = As;
     stewart.geometry.Bs = Bs;
     stewart.geometry.l  = l;
     
    -stewart.struts_F.l  = l/2;
    -stewart.struts_M.l  = l/2;
    +stewart.struts_F.l  = l/2;
    +stewart.struts_M.l  = l/2;
     
     stewart.platform_F.FRa = FRa;
     stewart.platform_M.MRb = MRb;
    @@ -1302,41 +1099,41 @@ This Matlab function is accessible here
     

    -
    -

    Function description

    -
    +
    +

    Function description

    +
    -
    function [stewart] = initializeStewartPose(stewart, args)
    -% initializeStewartPose - Determine the initial stroke in each leg to have the wanted pose
    -%                         It uses the inverse kinematic
    -%
    -% Syntax: [stewart] = initializeStewartPose(stewart, args)
    -%
    -% Inputs:
    -%    - stewart - A structure with the following fields
    -%        - Aa   [3x6] - The positions ai expressed in {A}
    -%        - Bb   [3x6] - The positions bi expressed in {B}
    -%    - args - Can have the following fields:
    -%        - AP   [3x1] - The wanted position of {B} with respect to {A}
    -%        - ARB  [3x3] - The rotation matrix that gives the wanted orientation of {B} with respect to {A}
    -%
    -% Outputs:
    -%    - stewart - updated Stewart structure with the added fields:
    -%      - actuators.Leq [6x1] - The 6 needed displacement of the struts from the initial position in [m] to have the wanted pose of {B} w.r.t. {A}
    +
    function [stewart] = initializeStewartPose(stewart, args)
    +% initializeStewartPose - Determine the initial stroke in each leg to have the wanted pose
    +%                         It uses the inverse kinematic
    +%
    +% Syntax: [stewart] = initializeStewartPose(stewart, args)
    +%
    +% Inputs:
    +%    - stewart - A structure with the following fields
    +%        - Aa   [3x6] - The positions ai expressed in {A}
    +%        - Bb   [3x6] - The positions bi expressed in {B}
    +%    - args - Can have the following fields:
    +%        - AP   [3x1] - The wanted position of {B} with respect to {A}
    +%        - ARB  [3x3] - The rotation matrix that gives the wanted orientation of {B} with respect to {A}
    +%
    +% Outputs:
    +%    - stewart - updated Stewart structure with the added fields:
    +%      - actuators.Leq [6x1] - The 6 needed displacement of the struts from the initial position in [m] to have the wanted pose of {B} w.r.t. {A}
     
    -
    -

    Optional Parameters

    -
    + -
    -

    Populate the stewart structure

    -
    +
    +

    Populate the stewart structure

    +
    stewart.actuators.Leq = dLi;
     
    @@ -1375,55 +1172,55 @@ This Matlab function is accessible
    -

    Function description

    -
    +
    +

    Function description

    +
    -
    function [stewart] = initializeCylindricalPlatforms(stewart, args)
    -% initializeCylindricalPlatforms - Initialize the geometry of the Fixed and Mobile Platforms
    -%
    -% Syntax: [stewart] = initializeCylindricalPlatforms(args)
    -%
    -% Inputs:
    -%    - args - Structure with the following fields:
    -%        - Fpm [1x1] - Fixed Platform Mass [kg]
    -%        - Fph [1x1] - Fixed Platform Height [m]
    -%        - Fpr [1x1] - Fixed Platform Radius [m]
    -%        - Mpm [1x1] - Mobile Platform Mass [kg]
    -%        - Mph [1x1] - Mobile Platform Height [m]
    -%        - Mpr [1x1] - Mobile Platform Radius [m]
    -%
    -% Outputs:
    -%    - stewart - updated Stewart structure with the added fields:
    -%      - platform_F [struct] - structure with the following fields:
    -%        - type = 1
    -%        - M [1x1] - Fixed Platform Mass [kg]
    -%        - I [3x3] - Fixed Platform Inertia matrix [kg*m^2]
    -%        - H [1x1] - Fixed Platform Height [m]
    -%        - R [1x1] - Fixed Platform Radius [m]
    -%      - platform_M [struct] - structure with the following fields:
    -%        - M [1x1] - Mobile Platform Mass [kg]
    -%        - I [3x3] - Mobile Platform Inertia matrix [kg*m^2]
    -%        - H [1x1] - Mobile Platform Height [m]
    -%        - R [1x1] - Mobile Platform Radius [m]
    +
    function [stewart] = initializeCylindricalPlatforms(stewart, args)
    +% initializeCylindricalPlatforms - Initialize the geometry of the Fixed and Mobile Platforms
    +%
    +% Syntax: [stewart] = initializeCylindricalPlatforms(args)
    +%
    +% Inputs:
    +%    - args - Structure with the following fields:
    +%        - Fpm [1x1] - Fixed Platform Mass [kg]
    +%        - Fph [1x1] - Fixed Platform Height [m]
    +%        - Fpr [1x1] - Fixed Platform Radius [m]
    +%        - Mpm [1x1] - Mobile Platform Mass [kg]
    +%        - Mph [1x1] - Mobile Platform Height [m]
    +%        - Mpr [1x1] - Mobile Platform Radius [m]
    +%
    +% Outputs:
    +%    - stewart - updated Stewart structure with the added fields:
    +%      - platform_F [struct] - structure with the following fields:
    +%        - type = 1
    +%        - M [1x1] - Fixed Platform Mass [kg]
    +%        - I [3x3] - Fixed Platform Inertia matrix [kg*m^2]
    +%        - H [1x1] - Fixed Platform Height [m]
    +%        - R [1x1] - Fixed Platform Radius [m]
    +%      - platform_M [struct] - structure with the following fields:
    +%        - M [1x1] - Mobile Platform Mass [kg]
    +%        - I [3x3] - Mobile Platform Inertia matrix [kg*m^2]
    +%        - H [1x1] - Mobile Platform Height [m]
    +%        - R [1x1] - Mobile Platform Radius [m]
     
    -
    -

    Optional Parameters

    -
    + -
    -

    Populate the stewart structure

    -
    +
    +

    Populate the stewart structure

    +
    stewart.platform_F.type = 1;
     
    @@ -1486,54 +1283,56 @@ This Matlab function is accessible 
    -

    Function description

    -
    +
    +

    Function description

    +
    -
    function [stewart] = initializeCylindricalStruts(stewart, args)
    -% initializeCylindricalStruts - Define the mass and moment of inertia of cylindrical struts
    -%
    -% Syntax: [stewart] = initializeCylindricalStruts(args)
    -%
    -% Inputs:
    -%    - args - Structure with the following fields:
    -%        - Fsm [1x1] - Mass of the Fixed part of the struts [kg]
    -%        - Fsh [1x1] - Height of cylinder for the Fixed part of the struts [m]
    -%        - Fsr [1x1] - Radius of cylinder for the Fixed part of the struts [m]
    -%        - Msm [1x1] - Mass of the Mobile part of the struts [kg]
    -%        - Msh [1x1] - Height of cylinder for the Mobile part of the struts [m]
    -%        - Msr [1x1] - Radius of cylinder for the Mobile part of the struts [m]
    -%
    -% Outputs:
    -%    - stewart - updated Stewart structure with the added fields:
    -%      - struts_F [struct] - structure with the following fields:
    -%        - M [6x1]   - Mass of the Fixed part of the struts [kg]
    -%        - I [3x3x6] - Moment of Inertia for the Fixed part of the struts [kg*m^2]
    -%        - H [6x1]   - Height of cylinder for the Fixed part of the struts [m]
    -%        - R [6x1]   - Radius of cylinder for the Fixed part of the struts [m]
    -%      - struts_M [struct] - structure with the following fields:
    -%        - M [6x1]   - Mass of the Mobile part of the struts [kg]
    -%        - I [3x3x6] - Moment of Inertia for the Mobile part of the struts [kg*m^2]
    -%        - H [6x1]   - Height of cylinder for the Mobile part of the struts [m]
    -%        - R [6x1]   - Radius of cylinder for the Mobile part of the struts [m]
    +
    function [stewart] = initializeCylindricalStruts(stewart, args)
    +% initializeCylindricalStruts - Define the mass and moment of inertia of cylindrical struts
    +%
    +% Syntax: [stewart] = initializeCylindricalStruts(args)
    +%
    +% Inputs:
    +%    - args - Structure with the following fields:
    +%        - Fsm [1x1] - Mass of the Fixed part of the struts [kg]
    +%        - Fsh [1x1] - Height of cylinder for the Fixed part of the struts [m]
    +%        - Fsr [1x1] - Radius of cylinder for the Fixed part of the struts [m]
    +%        - Msm [1x1] - Mass of the Mobile part of the struts [kg]
    +%        - Msh [1x1] - Height of cylinder for the Mobile part of the struts [m]
    +%        - Msr [1x1] - Radius of cylinder for the Mobile part of the struts [m]
    +%
    +% Outputs:
    +%    - stewart - updated Stewart structure with the added fields:
    +%      - struts_F [struct] - structure with the following fields:
    +%        - M [6x1]   - Mass of the Fixed part of the struts [kg]
    +%        - I [3x3x6] - Moment of Inertia for the Fixed part of the struts [kg*m^2]
    +%        - H [6x1]   - Height of cylinder for the Fixed part of the struts [m]
    +%        - R [6x1]   - Radius of cylinder for the Fixed part of the struts [m]
    +%      - struts_M [struct] - structure with the following fields:
    +%        - M [6x1]   - Mass of the Mobile part of the struts [kg]
    +%        - I [3x3x6] - Moment of Inertia for the Mobile part of the struts [kg*m^2]
    +%        - H [6x1]   - Height of cylinder for the Mobile part of the struts [m]
    +%        - R [6x1]   - Radius of cylinder for the Mobile part of the struts [m]
     
    -
    -

    Optional Parameters

    -
    +
    +

    Optional Parameters

    +
    arguments
         stewart
    +    args.type_F    char   {mustBeMember(args.type_F,{'cylindrical', 'none'})} = 'cylindrical'
    +    args.type_M    char   {mustBeMember(args.type_M,{'cylindrical', 'none'})} = 'cylindrical'
         args.Fsm (1,1) double {mustBeNumeric, mustBePositive} = 0.1
    -    args.Fsh (1,1) double {mustBeNumeric, mustBePositive} = 50e-3
    -    args.Fsr (1,1) double {mustBeNumeric, mustBePositive} = 5e-3
    +    args.Fsh (1,1) double {mustBeNumeric, mustBePositive} = 50e-3
    +    args.Fsr (1,1) double {mustBeNumeric, mustBePositive} = 5e-3
         args.Msm (1,1) double {mustBeNumeric, mustBePositive} = 0.1
    -    args.Msh (1,1) double {mustBeNumeric, mustBePositive} = 50e-3
    -    args.Msr (1,1) double {mustBeNumeric, mustBePositive} = 5e-3
    -end
    +    args.Msh (1,1) double {mustBeNumeric, mustBePositive} = 50e-3
    +    args.Msr (1,1) double {mustBeNumeric, mustBePositive} = 5e-3
    +end
     
    @@ -1543,39 +1342,44 @@ This Matlab function is accessible
    Compute the properties of the cylindrical struts
    -
    Fsm = ones(6,1).*args.Fsm;
    -Fsh = ones(6,1).*args.Fsh;
    -Fsr = ones(6,1).*args.Fsr;
    +
    Fsm = ones(6,1).*args.Fsm;
    +Fsh = ones(6,1).*args.Fsh;
    +Fsr = ones(6,1).*args.Fsr;
     
    -Msm = ones(6,1).*args.Msm;
    -Msh = ones(6,1).*args.Msh;
    -Msr = ones(6,1).*args.Msr;
    +Msm = ones(6,1).*args.Msm;
    +Msh = ones(6,1).*args.Msh;
    +Msr = ones(6,1).*args.Msr;
     
    -
    I_F = zeros(3, 3, 6); % Inertia of the "fixed" part of the strut
    -I_M = zeros(3, 3, 6); % Inertia of the "mobile" part of the strut
    +
    I_F = zeros(3, 3, 6); % Inertia of the "fixed" part of the strut
    +I_M = zeros(3, 3, 6); % Inertia of the "mobile" part of the strut
     
    -for i = 1:6
    -  I_F(:,:,i) = diag([1/12 * Fsm(i) * (3*Fsr(i)^2 + Fsh(i)^2), ...
    -                     1/12 * Fsm(i) * (3*Fsr(i)^2 + Fsh(i)^2), ...
    -                     1/2  * Fsm(i) * Fsr(i)^2]);
    +for i = 1:6
    +  I_F(:,:,i) = diag([1/12 * Fsm(i) * (3*Fsr(i)^2 + Fsh(i)^2), ...
    +                     1/12 * Fsm(i) * (3*Fsr(i)^2 + Fsh(i)^2), ...
    +                     1/2  * Fsm(i) * Fsr(i)^2]);
     
    -  I_M(:,:,i) = diag([1/12 * Msm(i) * (3*Msr(i)^2 + Msh(i)^2), ...
    -                     1/12 * Msm(i) * (3*Msr(i)^2 + Msh(i)^2), ...
    -                     1/2  * Msm(i) * Msr(i)^2]);
    -end
    +  I_M(:,:,i) = diag([1/12 * Msm(i) * (3*Msr(i)^2 + Msh(i)^2), ...
    +                     1/12 * Msm(i) * (3*Msr(i)^2 + Msh(i)^2), ...
    +                     1/2  * Msm(i) * Msr(i)^2]);
    +end
     
    -
    -

    Populate the stewart structure

    -
    +
    +

    Populate the stewart structure

    +
    -
    stewart.struts_M.type = 1;
    +
    switch args.type_M
    +  case 'cylindrical'
    +    stewart.struts_M.type = 1;
    +  case 'none'
    +    stewart.struts_M.type = 2;
    +end
     
     stewart.struts_M.I = I_M;
     stewart.struts_M.M = Msm;
    @@ -1585,7 +1389,12 @@ stewart.struts_M.H = Msh;
     
    -
    -

    Documentation

    -
    +
    +

    Documentation

    +

    piezoelectric_stack.jpg @@ -1640,39 +1449,39 @@ A simplistic model of such amplified actuator is shown in Figure -

    Function description

    -
    +
    +

    Function description

    +
    -
    function [stewart] = initializeStrutDynamics(stewart, args)
    -% initializeStrutDynamics - Add Stiffness and Damping properties of each strut
    -%
    -% Syntax: [stewart] = initializeStrutDynamics(args)
    -%
    -% Inputs:
    -%    - args - Structure with the following fields:
    -%        - K [6x1] - Stiffness of each strut [N/m]
    -%        - C [6x1] - Damping of each strut [N/(m/s)]
    -%
    -% Outputs:
    -%    - stewart - updated Stewart structure with the added fields:
    -%      - actuators.type = 1
    -%      - actuators.K [6x1] - Stiffness of each strut [N/m]
    -%      - actuators.C [6x1] - Damping of each strut [N/(m/s)]
    +
    function [stewart] = initializeStrutDynamics(stewart, args)
    +% initializeStrutDynamics - Add Stiffness and Damping properties of each strut
    +%
    +% Syntax: [stewart] = initializeStrutDynamics(args)
    +%
    +% Inputs:
    +%    - args - Structure with the following fields:
    +%        - K [6x1] - Stiffness of each strut [N/m]
    +%        - C [6x1] - Damping of each strut [N/(m/s)]
    +%
    +% Outputs:
    +%    - stewart - updated Stewart structure with the added fields:
    +%      - actuators.type = 1
    +%      - actuators.K [6x1] - Stiffness of each strut [N/m]
    +%      - actuators.C [6x1] - Damping of each strut [N/(m/s)]
     
    -
    -

    Optional Parameters

    -
    +
    +

    Optional Parameters

    +
    arguments
         stewart
    -    args.K (6,1) double {mustBeNumeric, mustBeNonnegative} = 20e6*ones(6,1)
    -    args.C (6,1) double {mustBeNumeric, mustBeNonnegative} = 2e1*ones(6,1)
    -end
    +    args.K (6,1) double {mustBeNumeric, mustBeNonnegative} = 20e6*ones(6,1)
    +    args.C (6,1) double {mustBeNumeric, mustBeNonnegative} = 2e1*ones(6,1)
    +end
     
    @@ -1704,9 +1513,9 @@ This Matlab function is accessible
    -

    Documentation

    -
    +
    +

    Documentation

    +

    An amplified piezoelectric actuator is shown in Figure 13.

    @@ -1739,47 +1548,47 @@ A simplistic model of such amplified actuator is shown in Figure -

    Function description

    -
    +
    +

    Function description

    +
    -
    function [stewart] = initializeAmplifiedStrutDynamics(stewart, args)
    -% initializeAmplifiedStrutDynamics - Add Stiffness and Damping properties of each strut
    -%
    -% Syntax: [stewart] = initializeAmplifiedStrutDynamics(args)
    -%
    -% Inputs:
    -%    - args - Structure with the following fields:
    -%        - Ka [6x1] - Vertical stiffness contribution of the piezoelectric stack [N/m]
    -%        - Ca [6x1] - Vertical damping contribution of the piezoelectric stack [N/(m/s)]
    -%        - Kr [6x1] - Vertical (residual) stiffness when the piezoelectric stack is removed [N/m]
    -%        - Cr [6x1] - Vertical (residual) damping when the piezoelectric stack is removed [N/(m/s)]
    -%
    -% Outputs:
    -%    - stewart - updated Stewart structure with the added fields:
    -%      - actuators.type = 2
    -%      - actuators.K   [6x1] - Total Stiffness of each strut [N/m]
    -%      - actuators.C   [6x1] - Total Damping of each strut [N/(m/s)]
    -%      - actuators.Ka [6x1] - Vertical stiffness contribution of the piezoelectric stack [N/m]
    -%      - actuators.Ca [6x1] - Vertical damping contribution of the piezoelectric stack [N/(m/s)]
    -%      - actuators.Kr [6x1] - Vertical stiffness when the piezoelectric stack is removed [N/m]
    -%      - actuators.Cr [6x1] - Vertical damping when the piezoelectric stack is removed [N/(m/s)]
    +
    function [stewart] = initializeAmplifiedStrutDynamics(stewart, args)
    +% initializeAmplifiedStrutDynamics - Add Stiffness and Damping properties of each strut
    +%
    +% Syntax: [stewart] = initializeAmplifiedStrutDynamics(args)
    +%
    +% Inputs:
    +%    - args - Structure with the following fields:
    +%        - Ka [6x1] - Vertical stiffness contribution of the piezoelectric stack [N/m]
    +%        - Ca [6x1] - Vertical damping contribution of the piezoelectric stack [N/(m/s)]
    +%        - Kr [6x1] - Vertical (residual) stiffness when the piezoelectric stack is removed [N/m]
    +%        - Cr [6x1] - Vertical (residual) damping when the piezoelectric stack is removed [N/(m/s)]
    +%
    +% Outputs:
    +%    - stewart - updated Stewart structure with the added fields:
    +%      - actuators.type = 2
    +%      - actuators.K   [6x1] - Total Stiffness of each strut [N/m]
    +%      - actuators.C   [6x1] - Total Damping of each strut [N/(m/s)]
    +%      - actuators.Ka [6x1] - Vertical stiffness contribution of the piezoelectric stack [N/m]
    +%      - actuators.Ca [6x1] - Vertical damping contribution of the piezoelectric stack [N/(m/s)]
    +%      - actuators.Kr [6x1] - Vertical stiffness when the piezoelectric stack is removed [N/m]
    +%      - actuators.Cr [6x1] - Vertical damping when the piezoelectric stack is removed [N/(m/s)]
     
    -
    -

    Optional Parameters

    -
    + -
    -

    Populate the stewart structure

    -
    +
    +

    Populate the stewart structure

    +
    stewart.actuators.type = 2;
     
    @@ -1809,7 +1618,91 @@ stewart.actuators.Kr = args.Kr;
     stewart.actuators.Cr = args.Cr;
     
     stewart.actuators.K = K;
    -stewart.actuators.C = K;
    +stewart.actuators.C = C;
    +
    +
    +
    +
    +
    + +
    +

    5.10 initializeFlexibleStrutDynamics: Model each strut with a flexible element

    +
    +

    + +

    + +

    +This Matlab function is accessible here. +

    +
    + +
    +

    Function description

    +
    +
    +
    function [stewart] = initializeFlexibleStrutDynamics(stewart, args)
    +% initializeFlexibleStrutDynamics - Add Stiffness and Damping properties of each strut
    +%
    +% Syntax: [stewart] = initializeFlexibleStrutDynamics(args)
    +%
    +% Inputs:
    +%    - args - Structure with the following fields:
    +%        - K [nxn] - Vertical stiffness contribution of the piezoelectric stack [N/m]
    +%        - M [nxn] - Vertical damping contribution of the piezoelectric stack [N/(m/s)]
    +%        - xi        [1x1] - Vertical (residual) stiffness when the piezoelectric stack is removed [N/m]
    +%        - step_file [6x1] - Vertical (residual) damping when the piezoelectric stack is removed [N/(m/s)]
    +%
    +% Outputs:
    +%    - stewart - updated Stewart structure with the added fields:
    +
    +
    +
    +
    + +
    +

    Optional Parameters

    +
    +
    +
    arguments
    +    stewart
    +    args.K        double {mustBeNumeric} = zeros(6,6)
    +    args.M        double {mustBeNumeric} = zeros(6,6)
    +    args.H        double {mustBeNumeric} = 0
    +    args.n_xyz    double {mustBeNumeric} = zeros(2,3)
    +    args.xi       double {mustBeNumeric} = 0.1
    +    args.step_file char {} = ''
    +end
    +
    +
    +
    +
    + +
    +

    Compute the axial offset

    +
    +
    +
    stewart.actuators.ax_off = (stewart.geometry.l(1) - args.H)/2; % Axial Offset at the ends of the actuator
    +
    +
    +
    +
    + +
    +

    Populate the stewart structure

    +
    +
    +
    stewart.actuators.type = 3;
    +
    +stewart.actuators.Km = args.K;
    +stewart.actuators.Mm = args.M;
    +
    +stewart.actuators.n_xyz = args.n_xyz;
    +stewart.actuators.xi = args.xi;
    +
    +stewart.actuators.step_file = args.step_file;
    +
    +stewart.actuators.K = args.K(3,3); % Axial Stiffness
     
    @@ -1817,8 +1710,8 @@ stewart.actuators.C = K;
    -

    5.10 initializeJointDynamics: Add Stiffness and Damping properties for spherical joints

    -
    +

    5.11 initializeJointDynamics: Add Stiffness and Damping properties for spherical joints

    +

    @@ -1828,60 +1721,70 @@ This Matlab function is accessible he

    -
    -

    Function description

    -
    +
    +

    Function description

    +
    -
    function [stewart] = initializeJointDynamics(stewart, args)
    -% initializeJointDynamics - Add Stiffness and Damping properties for the spherical joints
    -%
    -% Syntax: [stewart] = initializeJointDynamics(args)
    -%
    -% Inputs:
    -%    - args - Structure with the following fields:
    -%        - type_F - 'universal', 'spherical', 'universal_p', 'spherical_p'
    -%        - type_M - 'universal', 'spherical', 'universal_p', 'spherical_p'
    -%        - Kf_M [6x1] - Bending (Rx, Ry) Stiffness for each top joints [(N.m)/rad]
    -%        - Kt_M [6x1] - Torsion (Rz) Stiffness for each top joints [(N.m)/rad]
    -%        - Cf_M [6x1] - Bending (Rx, Ry) Damping of each top joint [(N.m)/(rad/s)]
    -%        - Ct_M [6x1] - Torsion (Rz) Damping of each top joint [(N.m)/(rad/s)]
    -%        - Kf_F [6x1] - Bending (Rx, Ry) Stiffness for each bottom joints [(N.m)/rad]
    -%        - Kt_F [6x1] - Torsion (Rz) Stiffness for each bottom joints [(N.m)/rad]
    -%        - Cf_F [6x1] - Bending (Rx, Ry) Damping of each bottom joint [(N.m)/(rad/s)]
    -%        - Cf_F [6x1] - Torsion (Rz) Damping of each bottom joint [(N.m)/(rad/s)]
    -%
    -% Outputs:
    -%    - stewart - updated Stewart structure with the added fields:
    -%      - stewart.joints_F and stewart.joints_M:
    -%        - type - 1 (universal), 2 (spherical), 3 (universal perfect), 4 (spherical perfect)
    -%        - Kx, Ky, Kz [6x1] - Translation (Tx, Ty, Tz) Stiffness [N/m]
    -%        - Kf [6x1] - Flexion (Rx, Ry) Stiffness [(N.m)/rad]
    -%        - Kt [6x1] - Torsion (Rz) Stiffness [(N.m)/rad]
    -%        - Cx, Cy, Cz [6x1] - Translation (Rx, Ry) Damping [N/(m/s)]
    -%        - Cf [6x1] - Flexion (Rx, Ry) Damping [(N.m)/(rad/s)]
    -%        - Cb [6x1] - Torsion (Rz) Damping [(N.m)/(rad/s)]
    +
    function [stewart] = initializeJointDynamics(stewart, args)
    +% initializeJointDynamics - Add Stiffness and Damping properties for the spherical joints
    +%
    +% Syntax: [stewart] = initializeJointDynamics(args)
    +%
    +% Inputs:
    +%    - args - Structure with the following fields:
    +%        - type_F - 'universal', 'spherical', 'universal_p', 'spherical_p'
    +%        - type_M - 'universal', 'spherical', 'universal_p', 'spherical_p'
    +%        - Kf_M [6x1] - Bending (Rx, Ry) Stiffness for each top joints [(N.m)/rad]
    +%        - Kt_M [6x1] - Torsion (Rz) Stiffness for each top joints [(N.m)/rad]
    +%        - Cf_M [6x1] - Bending (Rx, Ry) Damping of each top joint [(N.m)/(rad/s)]
    +%        - Ct_M [6x1] - Torsion (Rz) Damping of each top joint [(N.m)/(rad/s)]
    +%        - Kf_F [6x1] - Bending (Rx, Ry) Stiffness for each bottom joints [(N.m)/rad]
    +%        - Kt_F [6x1] - Torsion (Rz) Stiffness for each bottom joints [(N.m)/rad]
    +%        - Cf_F [6x1] - Bending (Rx, Ry) Damping of each bottom joint [(N.m)/(rad/s)]
    +%        - Cf_F [6x1] - Torsion (Rz) Damping of each bottom joint [(N.m)/(rad/s)]
    +%
    +% Outputs:
    +%    - stewart - updated Stewart structure with the added fields:
    +%      - stewart.joints_F and stewart.joints_M:
    +%        - type - 1 (universal), 2 (spherical), 3 (universal perfect), 4 (spherical perfect)
    +%        - Kx, Ky, Kz [6x1] - Translation (Tx, Ty, Tz) Stiffness [N/m]
    +%        - Kf [6x1] - Flexion (Rx, Ry) Stiffness [(N.m)/rad]
    +%        - Kt [6x1] - Torsion (Rz) Stiffness [(N.m)/rad]
    +%        - Cx, Cy, Cz [6x1] - Translation (Rx, Ry) Damping [N/(m/s)]
    +%        - Cf [6x1] - Flexion (Rx, Ry) Damping [(N.m)/(rad/s)]
    +%        - Cb [6x1] - Torsion (Rz) Damping [(N.m)/(rad/s)]
     
    -
    -

    Optional Parameters

    -
    +
    +

    Optional Parameters

    +
    arguments
         stewart
    -    args.type_F     char   {mustBeMember(args.type_F,{'universal', 'spherical', 'universal_p', 'spherical_p'})} = 'universal'
    -    args.type_M     char   {mustBeMember(args.type_M,{'universal', 'spherical', 'universal_p', 'spherical_p'})} = 'spherical'
    -    args.Kf_M (6,1) double {mustBeNumeric, mustBeNonnegative} = 15*ones(6,1)
    -    args.Cf_M (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e-4*ones(6,1)
    -    args.Kt_M (6,1) double {mustBeNumeric, mustBeNonnegative} = 20*ones(6,1)
    -    args.Ct_M (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e-3*ones(6,1)
    -    args.Kf_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 15*ones(6,1)
    -    args.Cf_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e-4*ones(6,1)
    -    args.Kt_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 20*ones(6,1)
    -    args.Ct_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e-3*ones(6,1)
    -end
    +    args.type_F     char   {mustBeMember(args.type_F,{'universal', 'spherical', 'universal_p', 'spherical_p', 'flexible'})} = 'universal'
    +    args.type_M     char   {mustBeMember(args.type_M,{'universal', 'spherical', 'universal_p', 'spherical_p', 'flexible'})} = 'spherical'
    +    args.Kf_M (6,1) double {mustBeNumeric, mustBeNonnegative} = 15*ones(6,1)
    +    args.Cf_M (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e-4*ones(6,1)
    +    args.Kt_M (6,1) double {mustBeNumeric, mustBeNonnegative} = 20*ones(6,1)
    +    args.Ct_M (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e-3*ones(6,1)
    +    args.Kf_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 15*ones(6,1)
    +    args.Cf_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e-4*ones(6,1)
    +    args.Kt_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 20*ones(6,1)
    +    args.Ct_F (6,1) double {mustBeNumeric, mustBeNonnegative} = 1e-3*ones(6,1)
    +    args.K_M        double {mustBeNumeric} = zeros(6,6)
    +    args.M_M        double {mustBeNumeric} = zeros(6,6)
    +    args.n_xyz_M    double {mustBeNumeric} = zeros(2,3)
    +    args.xi_M       double {mustBeNumeric} = 0.1
    +    args.step_file_M char {} = ''
    +    args.K_F        double {mustBeNumeric} = zeros(6,6)
    +    args.M_F        double {mustBeNumeric} = zeros(6,6)
    +    args.n_xyz_F    double {mustBeNumeric} = zeros(2,3)
    +    args.xi_F       double {mustBeNumeric} = 0.1
    +    args.step_file_F char {} = ''
    +end
     
    @@ -1891,27 +1794,31 @@ This Matlab function is accessible
    he

    Add Actuator Type

    -
    switch args.type_F
    -  case 'universal'
    +
    switch args.type_F
    +  case 'universal'
         stewart.joints_F.type = 1;
    -  case 'spherical'
    +  case 'spherical'
         stewart.joints_F.type = 2;
    -  case 'universal_p'
    +  case 'universal_p'
         stewart.joints_F.type = 3;
    -  case 'spherical_p'
    +  case 'spherical_p'
         stewart.joints_F.type = 4;
    -end
    +  case 'flexible'
    +    stewart.joints_F.type = 5;
    +end
     
    -switch args.type_M
    -  case 'universal'
    +switch args.type_M
    +  case 'universal'
         stewart.joints_M.type = 1;
    -  case 'spherical'
    +  case 'spherical'
         stewart.joints_M.type = 2;
    -  case 'universal_p'
    +  case 'universal_p'
         stewart.joints_M.type = 3;
    -  case 'spherical_p'
    +  case 'spherical_p'
         stewart.joints_M.type = 4;
    -end
    +  case 'flexible'
    +    stewart.joints_M.type = 5;
    +end
     
    @@ -1965,7 +1872,6 @@ stewart.joints_F.Kt = args.Kf_F;
    -

    Rotational Damping

    @@ -1979,11 +1885,32 @@ stewart.joints_F.Ct = args.Cf_F;
    + +
    +

    Stiffness and Mass matrices for flexible joint

    +
    +
    +
    stewart.joints_F.M = args.M_F;
    +stewart.joints_F.K = args.K_F;
    +stewart.joints_F.n_xyz = args.n_xyz_F;
    +stewart.joints_F.xi = args.xi_F;
    +stewart.joints_F.xi = args.xi_F;
    +stewart.joints_F.step_file = args.step_file_F;
    +
    +stewart.joints_M.M = args.M_M;
    +stewart.joints_M.K = args.K_M;
    +stewart.joints_M.n_xyz = args.n_xyz_M;
    +stewart.joints_M.xi = args.xi_M;
    +stewart.joints_M.step_file = args.step_file_M;
    +
    +
    +
    +
    -

    5.11 initializeInertialSensor: Initialize the inertial sensor in each strut

    -
    +

    5.12 initializeInertialSensor: Initialize the inertial sensor in each strut

    +

    @@ -2067,44 +1994,44 @@ Note that there is trade-off between:
    -
    -

    Function description

    -
    +
    +

    Function description

    +
    -
    function [stewart] = initializeInertialSensor(stewart, args)
    -% initializeInertialSensor - Initialize the inertial sensor in each strut
    -%
    -% Syntax: [stewart] = initializeInertialSensor(args)
    -%
    -% Inputs:
    -%    - args - Structure with the following fields:
    -%        - type       - 'geophone', 'accelerometer', 'none'
    -%        - mass [1x1] - Weight of the inertial mass [kg]
    -%        - freq [1x1] - Cutoff frequency [Hz]
    -%
    -% Outputs:
    -%    - stewart - updated Stewart structure with the added fields:
    -%      - stewart.sensors.inertial
    -%        - type    - 1 (geophone), 2 (accelerometer), 3 (none)
    -%        - K [1x1] - Stiffness [N/m]
    -%        - C [1x1] - Damping [N/(m/s)]
    -%        - M [1x1] - Inertial Mass [kg]
    -%        - G [1x1] - Gain
    +
    function [stewart] = initializeInertialSensor(stewart, args)
    +% initializeInertialSensor - Initialize the inertial sensor in each strut
    +%
    +% Syntax: [stewart] = initializeInertialSensor(args)
    +%
    +% Inputs:
    +%    - args - Structure with the following fields:
    +%        - type       - 'geophone', 'accelerometer', 'none'
    +%        - mass [1x1] - Weight of the inertial mass [kg]
    +%        - freq [1x1] - Cutoff frequency [Hz]
    +%
    +% Outputs:
    +%    - stewart - updated Stewart structure with the added fields:
    +%      - stewart.sensors.inertial
    +%        - type    - 1 (geophone), 2 (accelerometer), 3 (none)
    +%        - K [1x1] - Stiffness [N/m]
    +%        - C [1x1] - Damping [N/(m/s)]
    +%        - M [1x1] - Inertial Mass [kg]
    +%        - G [1x1] - Gain
     
    -
    -

    Optional Parameters

    -
    +
    +

    Optional Parameters

    +
    arguments
         stewart
    -    args.type       char   {mustBeMember(args.type,{'geophone', 'accelerometer', 'none'})} = 'none'
    -    args.mass (1,1) double {mustBeNumeric, mustBeNonnegative} = 1e-2
    +    args.type       char   {mustBeMember(args.type,{'geophone', 'accelerometer', 'none'})} = 'none'
    +    args.mass (1,1) double {mustBeNumeric, mustBeNonnegative} = 1e-2
         args.freq (1,1) double {mustBeNumeric, mustBeNonnegative} = 1e3
    -end
    +end
     
    @@ -2116,31 +2043,31 @@ Note that there is trade-off between:
    sensor = struct();
     
    -switch args.type
    -  case 'geophone'
    +switch args.type
    +  case 'geophone'
         sensor.type = 1;
     
         sensor.M = args.mass;
    -    sensor.K = sensor.M * (2*pi*args.freq)^2;
    -    sensor.C = 2*sqrt(sensor.M * sensor.K);
    -  case 'accelerometer'
    +    sensor.K = sensor.M * (2*pi*args.freq)^2;
    +    sensor.C = 2*sqrt(sensor.M * sensor.K);
    +  case 'accelerometer'
         sensor.type = 2;
     
         sensor.M = args.mass;
    -    sensor.K = sensor.M * (2*pi*args.freq)^2;
    -    sensor.C = 2*sqrt(sensor.M * sensor.K);
    -    sensor.G = -sensor.K/sensor.M;
    -  case 'none'
    +    sensor.K = sensor.M * (2*pi*args.freq)^2;
    +    sensor.C = 2*sqrt(sensor.M * sensor.K);
    +    sensor.G = -sensor.K/sensor.M;
    +  case 'none'
         sensor.type = 3;
    -end
    +end
     
    -
    -

    Populate the stewart structure

    -
    +
    +

    Populate the stewart structure

    +
    stewart.sensors.inertial = sensor;
     
    @@ -2150,8 +2077,8 @@ Note that there is trade-off between:
    -

    5.12 displayArchitecture: 3D plot of the Stewart platform architecture

    -
    +

    5.13 displayArchitecture: 3D plot of the Stewart platform architecture

    +

    @@ -2161,40 +2088,40 @@ This Matlab function is accessible here
    -
    -

    Function description

    -
    +
    +

    Function description

    +
    -
    function [] = displayArchitecture(stewart, args)
    -% displayArchitecture - 3D plot of the Stewart platform architecture
    -%
    -% Syntax: [] = displayArchitecture(args)
    -%
    -% Inputs:
    -%    - stewart
    -%    - args - Structure with the following fields:
    -%        - AP   [3x1] - The wanted position of {B} with respect to {A}
    -%        - ARB  [3x3] - The rotation matrix that gives the wanted orientation of {B} with respect to {A}
    -%        - ARB  [3x3] - The rotation matrix that gives the wanted orientation of {B} with respect to {A}
    -%        - F_color [color] - Color used for the Fixed elements
    -%        - M_color [color] - Color used for the Mobile elements
    -%        - L_color [color] - Color used for the Legs elements
    -%        - frames    [true/false] - Display the Frames
    -%        - legs      [true/false] - Display the Legs
    -%        - joints    [true/false] - Display the Joints
    -%        - labels    [true/false] - Display the Labels
    -%        - platforms [true/false] - Display the Platforms
    -%        - views     ['all', 'xy', 'yz', 'xz', 'default'] -
    -%
    -% Outputs:
    +
    function [] = displayArchitecture(stewart, args)
    +% displayArchitecture - 3D plot of the Stewart platform architecture
    +%
    +% Syntax: [] = displayArchitecture(args)
    +%
    +% Inputs:
    +%    - stewart
    +%    - args - Structure with the following fields:
    +%        - AP   [3x1] - The wanted position of {B} with respect to {A}
    +%        - ARB  [3x3] - The rotation matrix that gives the wanted orientation of {B} with respect to {A}
    +%        - ARB  [3x3] - The rotation matrix that gives the wanted orientation of {B} with respect to {A}
    +%        - F_color [color] - Color used for the Fixed elements
    +%        - M_color [color] - Color used for the Mobile elements
    +%        - L_color [color] - Color used for the Legs elements
    +%        - frames    [true/false] - Display the Frames
    +%        - legs      [true/false] - Display the Legs
    +%        - joints    [true/false] - Display the Joints
    +%        - labels    [true/false] - Display the Labels
    +%        - platforms [true/false] - Display the Platforms
    +%        - views     ['all', 'xy', 'yz', 'xz', 'default'] -
    +%
    +% Outputs:
     
    -
    -

    Optional Parameters

    -
    + -
    -

    Check the stewart structure elements

    -
    +
    +

    Check the stewart structure elements

    +
    -
    assert(isfield(stewart.platform_F, 'FO_A'), 'stewart.platform_F should have attribute FO_A')
    +
    assert(isfield(stewart.platform_F, 'FO_A'), 'stewart.platform_F should have attribute FO_A')
     FO_A = stewart.platform_F.FO_A;
     
    -assert(isfield(stewart.platform_M, 'MO_B'), 'stewart.platform_M should have attribute MO_B')
    +assert(isfield(stewart.platform_M, 'MO_B'), 'stewart.platform_M should have attribute MO_B')
     MO_B = stewart.platform_M.MO_B;
     
    -assert(isfield(stewart.geometry, 'H'),   'stewart.geometry should have attribute H')
    +assert(isfield(stewart.geometry, 'H'),   'stewart.geometry should have attribute H')
     H = stewart.geometry.H;
     
    -assert(isfield(stewart.platform_F, 'Fa'),   'stewart.platform_F should have attribute Fa')
    +assert(isfield(stewart.platform_F, 'Fa'),   'stewart.platform_F should have attribute Fa')
     Fa = stewart.platform_F.Fa;
     
    -assert(isfield(stewart.platform_M, 'Mb'),   'stewart.platform_M should have attribute Mb')
    +assert(isfield(stewart.platform_M, 'Mb'),   'stewart.platform_M should have attribute Mb')
     Mb = stewart.platform_M.Mb;
     
    @@ -2246,11 +2173,11 @@ Mb = stewart.platform_M.Mb; The reference frame of the 3d plot corresponds to the frame \(\{F\}\).

    -
    if ~strcmp(args.views, 'all')
    -  figure;
    -else
    -  f = figure('visible', 'off');
    -end
    +
    if ~strcmp(args.views, 'all')
    +  figure;
    +else
    +  f = figure('visible', 'off');
    +end
     
     hold on;
     
    @@ -2261,13 +2188,13 @@ We first compute homogeneous matrices that will be useful to position elements o

    FTa = [eye(3), FO_A; ...
    -       zeros(1,3), 1];
    +       zeros(1,3), 1];
     ATb = [args.ARB, args.AP; ...
    -       zeros(1,3), 1];
    -BTm = [eye(3), -MO_B; ...
    -       zeros(1,3), 1];
    +       zeros(1,3), 1];
    +BTm = [eye(3), -MO_B; ...
    +       zeros(1,3), 1];
     
    -FTm = FTa*ATb*BTm;
    +FTm = FTa*ATb*BTm;
     
    @@ -2275,7 +2202,7 @@ FTm = FTa*ATb*BTm; Let’s define a parameter that define the length of the unit vectors used to display the frames.

    -
    d_unit_vector = H/4;
    +
    d_unit_vector = H/4;
     
    @@ -2283,7 +2210,7 @@ Let’s define a parameter that define the length of the unit vectors used t Let’s define a parameter used to position the labels with respect to the center of the element.

    -
    d_label = H/20;
    +
    d_label = H/20;
     
    @@ -2297,16 +2224,16 @@ Let’s first plot the frame \(\{F\}\).

    Ff = [0, 0, 0];
    -if args.frames
    -  quiver3(Ff(1)*ones(1,3), Ff(2)*ones(1,3), Ff(3)*ones(1,3), ...
    -          [d_unit_vector 0 0], [0 d_unit_vector 0], [0 0 d_unit_vector], '-', 'Color', args.F_color)
    +if args.frames
    +  quiver3(Ff(1)*ones(1,3), Ff(2)*ones(1,3), Ff(3)*ones(1,3), ...
    +          [d_unit_vector 0 0], [0 d_unit_vector 0], [0 0 d_unit_vector], '-', 'Color', args.F_color)
     
    -  if args.labels
    -    text(Ff(1) + d_label, ...
    -        Ff(2) + d_label, ...
    -        Ff(3) + d_label, '$\{F\}$', 'Color', args.F_color);
    -  end
    -end
    +  if args.labels
    +    text(Ff(1) + d_label, ...
    +        Ff(2) + d_label, ...
    +        Ff(3) + d_label, '$\{F\}$', 'Color', args.F_color);
    +  end
    +end
     
    @@ -2314,16 +2241,16 @@ Let’s first plot the frame \(\{F\}\). Now plot the frame \(\{A\}\) fixed to the Base.

    -
    if args.frames
    -  quiver3(FO_A(1)*ones(1,3), FO_A(2)*ones(1,3), FO_A(3)*ones(1,3), ...
    -          [d_unit_vector 0 0], [0 d_unit_vector 0], [0 0 d_unit_vector], '-', 'Color', args.F_color)
    +
    if args.frames
    +  quiver3(FO_A(1)*ones(1,3), FO_A(2)*ones(1,3), FO_A(3)*ones(1,3), ...
    +          [d_unit_vector 0 0], [0 d_unit_vector 0], [0 0 d_unit_vector], '-', 'Color', args.F_color)
     
    -  if args.labels
    -    text(FO_A(1) + d_label, ...
    -         FO_A(2) + d_label, ...
    -         FO_A(3) + d_label, '$\{A\}$', 'Color', args.F_color);
    -  end
    -end
    +  if args.labels
    +    text(FO_A(1) + d_label, ...
    +         FO_A(2) + d_label, ...
    +         FO_A(3) + d_label, '$\{A\}$', 'Color', args.F_color);
    +  end
    +end
     
    @@ -2331,18 +2258,18 @@ Now plot the frame \(\{A\}\) fixed to the Base. Let’s then plot the circle corresponding to the shape of the Fixed base.

    -
    if args.platforms && stewart.platform_F.type == 1
    -  theta = [0:0.01:2*pi+0.01]; % Angles [rad]
    -  v = null([0; 0; 1]'); % Two vectors that are perpendicular to the circle normal
    -  center = [0; 0; 0]; % Center of the circle
    -  radius = stewart.platform_F.R; % Radius of the circle [m]
    +
    if args.platforms && stewart.platform_F.type == 1
    +  theta = [0:0.01:2*pi+0.01]; % Angles [rad]
    +  v = null([0; 0; 1]'); % Two vectors that are perpendicular to the circle normal
    +  center = [0; 0; 0]; % Center of the circle
    +  radius = stewart.platform_F.R; % Radius of the circle [m]
     
    -  points = center*ones(1, length(theta)) + radius*(v(:,1)*cos(theta) + v(:,2)*sin(theta));
    +  points = center*ones(1, length(theta)) + radius*(v(:,1)*cos(theta) + v(:,2)*sin(theta));
     
    -  plot3(points(1,:), ...
    -        points(2,:), ...
    -        points(3,:), '-', 'Color', args.F_color);
    -end
    +  plot3(points(1,:), ...
    +        points(2,:), ...
    +        points(3,:), '-', 'Color', args.F_color);
    +end
     
    @@ -2350,18 +2277,18 @@ Let’s then plot the circle corresponding to the shape of the Fixed base. Let’s now plot the position and labels of the Fixed Joints

    -
    if args.joints
    -  scatter3(Fa(1,:), ...
    -           Fa(2,:), ...
    -           Fa(3,:), 'MarkerEdgeColor', args.F_color);
    -  if args.labels
    -    for i = 1:size(Fa,2)
    -      text(Fa(1,i) + d_label, ...
    -           Fa(2,i), ...
    -           Fa(3,i), sprintf('$a_{%i}$', i), 'Color', args.F_color);
    -    end
    -  end
    -end
    +
    if args.joints
    +  scatter3(Fa(1,:), ...
    +           Fa(2,:), ...
    +           Fa(3,:), 'MarkerEdgeColor', args.F_color);
    +  if args.labels
    +    for i = 1:size(Fa,2)
    +      text(Fa(1,i) + d_label, ...
    +           Fa(2,i), ...
    +           Fa(3,i), sprintf('$a_{%i}$', i), 'Color', args.F_color);
    +    end
    +  end
    +end
     
    @@ -2374,19 +2301,19 @@ Let’s now plot the position and labels of the Fixed Joints Plot the frame \(\{M\}\).

    -
    Fm = FTm*[0; 0; 0; 1]; % Get the position of frame {M} w.r.t. {F}
    +
    Fm = FTm*[0; 0; 0; 1]; % Get the position of frame {M} w.r.t. {F}
     
    -if args.frames
    -  FM_uv = FTm*[d_unit_vector*eye(3); zeros(1,3)]; % Rotated Unit vectors
    -  quiver3(Fm(1)*ones(1,3), Fm(2)*ones(1,3), Fm(3)*ones(1,3), ...
    -          FM_uv(1,1:3), FM_uv(2,1:3), FM_uv(3,1:3), '-', 'Color', args.M_color)
    +if args.frames
    +  FM_uv = FTm*[d_unit_vector*eye(3); zeros(1,3)]; % Rotated Unit vectors
    +  quiver3(Fm(1)*ones(1,3), Fm(2)*ones(1,3), Fm(3)*ones(1,3), ...
    +          FM_uv(1,1:3), FM_uv(2,1:3), FM_uv(3,1:3), '-', 'Color', args.M_color)
     
    -  if args.labels
    -    text(Fm(1) + d_label, ...
    -         Fm(2) + d_label, ...
    -         Fm(3) + d_label, '$\{M\}$', 'Color', args.M_color);
    -  end
    -end
    +  if args.labels
    +    text(Fm(1) + d_label, ...
    +         Fm(2) + d_label, ...
    +         Fm(3) + d_label, '$\{M\}$', 'Color', args.M_color);
    +  end
    +end
     
    @@ -2394,19 +2321,19 @@ Plot the frame \(\{M\}\). Plot the frame \(\{B\}\).

    -
    FB = FO_A + args.AP;
    +
    FB = FO_A + args.AP;
     
    -if args.frames
    -  FB_uv = FTm*[d_unit_vector*eye(3); zeros(1,3)]; % Rotated Unit vectors
    -  quiver3(FB(1)*ones(1,3), FB(2)*ones(1,3), FB(3)*ones(1,3), ...
    -          FB_uv(1,1:3), FB_uv(2,1:3), FB_uv(3,1:3), '-', 'Color', args.M_color)
    +if args.frames
    +  FB_uv = FTm*[d_unit_vector*eye(3); zeros(1,3)]; % Rotated Unit vectors
    +  quiver3(FB(1)*ones(1,3), FB(2)*ones(1,3), FB(3)*ones(1,3), ...
    +          FB_uv(1,1:3), FB_uv(2,1:3), FB_uv(3,1:3), '-', 'Color', args.M_color)
     
    -  if args.labels
    -    text(FB(1) - d_label, ...
    -         FB(2) + d_label, ...
    -         FB(3) + d_label, '$\{B\}$', 'Color', args.M_color);
    -  end
    -end
    +  if args.labels
    +    text(FB(1) - d_label, ...
    +         FB(2) + d_label, ...
    +         FB(3) + d_label, '$\{B\}$', 'Color', args.M_color);
    +  end
    +end
     
    @@ -2414,18 +2341,18 @@ Plot the frame \(\{B\}\). Let’s then plot the circle corresponding to the shape of the Mobile platform.

    -
    if args.platforms && stewart.platform_M.type == 1
    -  theta = [0:0.01:2*pi+0.01]; % Angles [rad]
    -  v = null((FTm(1:3,1:3)*[0;0;1])'); % Two vectors that are perpendicular to the circle normal
    -  center = Fm(1:3); % Center of the circle
    -  radius = stewart.platform_M.R; % Radius of the circle [m]
    +
    if args.platforms && stewart.platform_M.type == 1
    +  theta = [0:0.01:2*pi+0.01]; % Angles [rad]
    +  v = null((FTm(1:3,1:3)*[0;0;1])'); % Two vectors that are perpendicular to the circle normal
    +  center = Fm(1:3); % Center of the circle
    +  radius = stewart.platform_M.R; % Radius of the circle [m]
     
    -  points = center*ones(1, length(theta)) + radius*(v(:,1)*cos(theta) + v(:,2)*sin(theta));
    +  points = center*ones(1, length(theta)) + radius*(v(:,1)*cos(theta) + v(:,2)*sin(theta));
     
    -  plot3(points(1,:), ...
    -        points(2,:), ...
    -        points(3,:), '-', 'Color', args.M_color);
    -end
    +  plot3(points(1,:), ...
    +        points(2,:), ...
    +        points(3,:), '-', 'Color', args.M_color);
    +end
     
    @@ -2433,21 +2360,21 @@ Let’s then plot the circle corresponding to the shape of the Mobile platfo Plot the position and labels of the rotation joints fixed to the mobile platform.

    -
    if args.joints
    -  Fb = FTm*[Mb;ones(1,6)];
    +
    if args.joints
    +  Fb = FTm*[Mb;ones(1,6)];
     
    -  scatter3(Fb(1,:), ...
    -           Fb(2,:), ...
    -           Fb(3,:), 'MarkerEdgeColor', args.M_color);
    +  scatter3(Fb(1,:), ...
    +           Fb(2,:), ...
    +           Fb(3,:), 'MarkerEdgeColor', args.M_color);
     
    -  if args.labels
    -    for i = 1:size(Fb,2)
    -      text(Fb(1,i) + d_label, ...
    -           Fb(2,i), ...
    -           Fb(3,i), sprintf('$b_{%i}$', i), 'Color', args.M_color);
    -    end
    -  end
    -end
    +  if args.labels
    +    for i = 1:size(Fb,2)
    +      text(Fb(1,i) + d_label, ...
    +           Fb(2,i), ...
    +           Fb(3,i), sprintf('$b_{%i}$', i), 'Color', args.M_color);
    +    end
    +  end
    +end
     
    @@ -2460,82 +2387,82 @@ Plot the position and labels of the rotation joints fixed to the mobile platform Plot the legs connecting the joints of the fixed base to the joints of the mobile platform.

    -
    if args.legs
    -  for i = 1:6
    -    plot3([Fa(1,i), Fb(1,i)], ...
    -          [Fa(2,i), Fb(2,i)], ...
    -          [Fa(3,i), Fb(3,i)], '-', 'Color', args.L_color);
    +
    if args.legs
    +  for i = 1:6
    +    plot3([Fa(1,i), Fb(1,i)], ...
    +          [Fa(2,i), Fb(2,i)], ...
    +          [Fa(3,i), Fb(3,i)], '-', 'Color', args.L_color);
     
    -    if args.labels
    -      text((Fa(1,i)+Fb(1,i))/2 + d_label, ...
    -           (Fa(2,i)+Fb(2,i))/2, ...
    -           (Fa(3,i)+Fb(3,i))/2, sprintf('$%i$', i), 'Color', args.L_color);
    -    end
    -  end
    -end
    +    if args.labels
    +      text((Fa(1,i)+Fb(1,i))/2 + d_label, ...
    +           (Fa(2,i)+Fb(2,i))/2, ...
    +           (Fa(3,i)+Fb(3,i))/2, sprintf('$%i$', i), 'Color', args.L_color);
    +    end
    +  end
    +end
     
    -

    5.12.1 Figure parameters

    -
    +

    5.13.1 Figure parameters

    +
    -
    switch args.views
    -  case 'default'
    -      view([1 -0.6 0.4]);
    -  case 'xy'
    +
    switch args.views
    +  case 'default'
    +      view([1 -0.6 0.4]);
    +  case 'xy'
           view([0 0 1]);
    -  case 'xz'
    -      view([0 -1 0]);
    -  case 'yz'
    +  case 'xz'
    +      view([0 -1 0]);
    +  case 'yz'
           view([1 0 0]);
    -end
    -axis equal;
    -axis off;
    +end
    +axis equal;
    +axis off;
     
    -

    5.12.2 Subplots

    -
    +

    5.13.2 Subplots

    +
    -
    if strcmp(args.views, 'all')
    -  hAx = findobj('type', 'axes');
    +
    if strcmp(args.views, 'all')
    +  hAx = findobj('type', 'axes');
     
    -  figure;
    +  figure;
       s1 = subplot(2,2,1);
    -  copyobj(get(hAx(1), 'Children'), s1);
    +  copyobj(get(hAx(1), 'Children'), s1);
       view([0 0 1]);
    -  axis equal;
    -  axis off;
    -  title('Top')
    +  axis equal;
    +  axis off;
    +  title('Top')
     
       s2 = subplot(2,2,2);
    -  copyobj(get(hAx(1), 'Children'), s2);
    -  view([1 -0.6 0.4]);
    -  axis equal;
    -  axis off;
    +  copyobj(get(hAx(1), 'Children'), s2);
    +  view([1 -0.6 0.4]);
    +  axis equal;
    +  axis off;
     
       s3 = subplot(2,2,3);
    -  copyobj(get(hAx(1), 'Children'), s3);
    +  copyobj(get(hAx(1), 'Children'), s3);
       view([1 0 0]);
    -  axis equal;
    -  axis off;
    -  title('Front')
    +  axis equal;
    +  axis off;
    +  title('Front')
     
       s4 = subplot(2,2,4);
    -  copyobj(get(hAx(1), 'Children'), s4);
    -  view([0 -1 0]);
    -  axis equal;
    -  axis off;
    -  title('Side')
    +  copyobj(get(hAx(1), 'Children'), s4);
    +  view([0 -1 0]);
    +  axis equal;
    +  axis off;
    +  title('Side')
     
       close(f);
    -end
    +end
     
    @@ -2544,8 +2471,8 @@ Plot the legs connecting the joints of the fixed base to the joints of the mobil
    -

    5.13 describeStewartPlatform: Display some text describing the current defined Stewart Platform

    -
    +

    5.14 describeStewartPlatform: Display some text describing the current defined Stewart Platform

    +
    -
    -

    Function description

    -
    +
    +

    Function description

    +
    -
    function [] = describeStewartPlatform(stewart)
    -% describeStewartPlatform - Display some text describing the current defined Stewart Platform
    -%
    -% Syntax: [] = describeStewartPlatform(args)
    -%
    -% Inputs:
    -%    - stewart
    -%
    -% Outputs:
    +
    function [] = describeStewartPlatform(stewart)
    +% describeStewartPlatform - Display some text describing the current defined Stewart Platform
    +%
    +% Syntax: [] = describeStewartPlatform(args)
    +%
    +% Inputs:
    +%    - stewart
    +%
    +% Outputs:
     
    -
    -

    Optional Parameters

    -
    +
    +

    Optional Parameters

    +
    arguments
         stewart
    -end
    +end
     
    -

    5.13.1 Geometry

    -
    +

    5.14.1 Geometry

    +
    -
    fprintf('GEOMETRY:\n')
    -fprintf('- The height between the fixed based and the top platform is %.3g [mm].\n', 1e3*stewart.geometry.H)
    +
    fprintf('GEOMETRY:\n')
    +fprintf('- The height between the fixed based and the top platform is %.3g [mm].\n', 1e3*stewart.geometry.H)
     
    -if stewart.platform_M.MO_B(3) > 0
    -  fprintf('- Frame {A} is located %.3g [mm] above the top platform.\n',  1e3*stewart.platform_M.MO_B(3))
    -else
    -  fprintf('- Frame {A} is located %.3g [mm] below the top platform.\n', - 1e3*stewart.platform_M.MO_B(3))
    -end
    +if stewart.platform_M.MO_B(3) > 0
    +  fprintf('- Frame {A} is located %.3g [mm] above the top platform.\n',  1e3*stewart.platform_M.MO_B(3))
    +else
    +  fprintf('- Frame {A} is located %.3g [mm] below the top platform.\n', - 1e3*stewart.platform_M.MO_B(3))
    +end
     
    -fprintf('- The initial length of the struts are:\n')
    -fprintf('\t %.3g, %.3g, %.3g, %.3g, %.3g, %.3g [mm]\n', 1e3*stewart.geometry.l)
    -fprintf('\n')
    +fprintf('- The initial length of the struts are:\n')
    +fprintf('\t %.3g, %.3g, %.3g, %.3g, %.3g, %.3g [mm]\n', 1e3*stewart.geometry.l)
    +fprintf('\n')
     
    -

    5.13.2 Actuators

    -
    +

    5.14.2 Actuators

    +
    -
    fprintf('ACTUATORS:\n')
    -if stewart.actuators.type == 1
    -    fprintf('- The actuators are classical.\n')
    -    fprintf('- The Stiffness and Damping of each actuators is:\n')
    -    fprintf('\t k = %.0e [N/m] \t c = %.0e [N/(m/s)]\n', stewart.actuators.K(1), stewart.actuators.C(1))
    -elseif stewart.actuators.type == 2
    -    fprintf('- The actuators are mechanicaly amplified.\n')
    -    fprintf('- The vertical stiffness and damping contribution of the piezoelectric stack is:\n')
    -    fprintf('\t ka = %.0e [N/m] \t ca = %.0e [N/(m/s)]\n', stewart.actuators.Ka(1), stewart.actuators.Ca(1))
    -    fprintf('- Vertical stiffness when the piezoelectric stack is removed is:\n')
    -    fprintf('\t kr = %.0e [N/m] \t cr = %.0e [N/(m/s)]\n', stewart.actuators.Kr(1), stewart.actuators.Cr(1))
    -end
    -fprintf('\n')
    +
    fprintf('ACTUATORS:\n')
    +if stewart.actuators.type == 1
    +    fprintf('- The actuators are classical.\n')
    +    fprintf('- The Stiffness and Damping of each actuators is:\n')
    +    fprintf('\t k = %.0e [N/m] \t c = %.0e [N/(m/s)]\n', stewart.actuators.K(1), stewart.actuators.C(1))
    +elseif stewart.actuators.type == 2
    +    fprintf('- The actuators are mechanicaly amplified.\n')
    +    fprintf('- The vertical stiffness and damping contribution of the piezoelectric stack is:\n')
    +    fprintf('\t ka = %.0e [N/m] \t ca = %.0e [N/(m/s)]\n', stewart.actuators.Ka(1), stewart.actuators.Ca(1))
    +    fprintf('- Vertical stiffness when the piezoelectric stack is removed is:\n')
    +    fprintf('\t kr = %.0e [N/m] \t cr = %.0e [N/(m/s)]\n', stewart.actuators.Kr(1), stewart.actuators.Cr(1))
    +end
    +fprintf('\n')
     
    -

    5.13.3 Joints

    -
    +

    5.14.3 Joints

    +
    -
    fprintf('JOINTS:\n')
    +
    fprintf('JOINTS:\n')
     
    @@ -2640,16 +2567,16 @@ fprintf('\n') Type of the joints on the fixed base.

    -
    switch stewart.joints_F.type
    -  case 1
    -    fprintf('- The joints on the fixed based are universal joints\n')
    -  case 2
    -    fprintf('- The joints on the fixed based are spherical joints\n')
    -  case 3
    -    fprintf('- The joints on the fixed based are perfect universal joints\n')
    -  case 4
    -    fprintf('- The joints on the fixed based are perfect spherical joints\n')
    -end
    +
    switch stewart.joints_F.type
    +  case 1
    +    fprintf('- The joints on the fixed based are universal joints\n')
    +  case 2
    +    fprintf('- The joints on the fixed based are spherical joints\n')
    +  case 3
    +    fprintf('- The joints on the fixed based are perfect universal joints\n')
    +  case 4
    +    fprintf('- The joints on the fixed based are perfect spherical joints\n')
    +end
     
    @@ -2657,16 +2584,16 @@ Type of the joints on the fixed base. Type of the joints on the mobile platform.

    -
    switch stewart.joints_M.type
    -  case 1
    -    fprintf('- The joints on the mobile based are universal joints\n')
    -  case 2
    -    fprintf('- The joints on the mobile based are spherical joints\n')
    -  case 3
    -    fprintf('- The joints on the mobile based are perfect universal joints\n')
    -  case 4
    -    fprintf('- The joints on the mobile based are perfect spherical joints\n')
    -end
    +
    switch stewart.joints_M.type
    +  case 1
    +    fprintf('- The joints on the mobile based are universal joints\n')
    +  case 2
    +    fprintf('- The joints on the mobile based are spherical joints\n')
    +  case 3
    +    fprintf('- The joints on the mobile based are perfect universal joints\n')
    +  case 4
    +    fprintf('- The joints on the mobile based are perfect spherical joints\n')
    +end
     
    @@ -2674,8 +2601,8 @@ Type of the joints on the mobile platform. Position of the fixed joints

    -
    fprintf('- The position of the joints on the fixed based with respect to {F} are (in [mm]):\n')
    -fprintf('\t % .3g \t % .3g \t % .3g\n', 1e3*stewart.platform_F.Fa)
    +
    fprintf('- The position of the joints on the fixed based with respect to {F} are (in [mm]):\n')
    +fprintf('\t % .3g \t % .3g \t % .3g\n', 1e3*stewart.platform_F.Fa)
     
    @@ -2683,29 +2610,29 @@ fprintf('\t % .3g \t % .3g \t % .3g\n', 1e3
    -
    fprintf('- The position of the joints on the mobile based with respect to {M} are (in [mm]):\n')
    -fprintf('\t % .3g \t % .3g \t % .3g\n', 1e3*stewart.platform_M.Mb)
    -fprintf('\n')
    +
    fprintf('- The position of the joints on the mobile based with respect to {M} are (in [mm]):\n')
    +fprintf('\t % .3g \t % .3g \t % .3g\n', 1e3*stewart.platform_M.Mb)
    +fprintf('\n')