Linear Matrix Inequality (LMI) solver for Arduino. Allows the resolution of a set of simple standard LMI problems such as robust pole placement, robust stabilisation, gain-scheduled control.
If you use this code for research purposes, please cite the article Hiba Houmsi, Paolo Massioni, Federico Bribiesca Argomedo, Romain Delpoux. "Embedded controller optimization for efficient electric motor drive," 2023 IEEE Vehicle Power and Propulsion (VPPC 2023), Oct 2023, Milan, Italy. The article contains a description of the embedded implementation of the interior-point method solver used in this code.
For a general introduction on Linaear Matrix inequalities (LMI) problems, refer to Stephen Boyd, Laurent El Ghaoui, E. Feron, and V. Balakrishnan, "Linear Matrix Inequalities in System and Control Theory", Volume 15 of Studies in Applied Mathematics, Society for Industrial and Applied Mathematics (SIAM), 1994, which also provides a description of the interior point algorithm.
For the regional pole placement method, refer to M. Chilali, P. Gahinet and P. Apkarian, "Robust pole placement in LMI regions," IEEE Transactions on Automatic Control, vol. 44, no. 12, pp. 2257-2270, Dec. 1999.
Requires ArduinoEigen, so it will work only on architectures supporting c++ standard libraries (MBED_GIGA and SAMD). It might work on other architectures if you manage to install such libraries somehow, with a bit more effort.
The library provides an embedded implementation of controller synthesis problems requiring the solution of a Linear Matrix Inequality (LMI) feasibility problem. In general this can be made on a laptop computer, and the resulting gain can be just copied on the embedded controller; this library is aimed at applications where the controller needs to be recomputed on board, such as adaptive control, autonomous systems, etc. Please take into account that the solver will take a significant time to deliver a solution; I have tested it on an MKR1010 and on a GIGA R1; for the first one expect a few seconds or few tens of seconds for systems up to order four, whereas for the GIGA R1 it runs a lot faster.
Do not use this code for high-order system.
The functions return
Please see the example.ino for an example of application code.
Eigen::MatrixXf DecayRate(Eigen::MatrixXf& A, Eigen::MatrixXf& B, float amin)
Returns a MatriXf object containing a matrix
This is equivalent to imposing a minimum (positive) decay rate
Eigen::MatrixXf RegionalPolePlacement(Eigen::MatrixXf& A, Eigen::MatrixXf& B, float amax, float amin, float beta)
Returns a MatriXf object containing a matrix
This is equivalent to imposing a minimum (positive) decay rate
Eigen::MatrixXf DeacayRate1Param(Eigen::MatrixXf& A0, Eigen::MatrixXf& A1, Eigen::MatrixXf& B, float amin, float p1max, float p1min);
Returns a MatriXf object containing a matrix
for all values of the parameter
Eigen::MatrixXf RegionalPolePlacementRobust1Param(Eigen::MatrixXf& A0, Eigen::MatrixXf& A1, Eigen::MatrixXf& B, float amax, float amin, float beta, float p1max, float p1min);
Returns a MatriXf object containing a matrix
for all values of the parameter
Eigen::MatrixXf DecayRateRobustNormBound(Eigen::MatrixXf& A0, Eigen::MatrixXf& B, Eigen::MatrixXf& E, Eigen::MatrixXf& F, float amin);
Returns a MatriXf object containing a matrix
for all values of the
Eigen::MatrixXf** DecayRateGainScheduling1Param(Eigen::MatrixXf& A0, Eigen::MatrixXf& A1, Eigen::MatrixXf& B, float amin, float pmax, float pmin);
Returns a pointer to a two-dimensional array of MatriXf pointers object containing a matrix
for all values of the parameter
Eigen::MatrixXf** RegionalPolePlacementGainScheduling1Param(Eigen::MatrixXf& A0, Eigen::MatrixXf& A1, Eigen::MatrixXf& B, float amax, float amin, float beta, float pmax, float pmin);
Returns a pointer to a two-dimensional array of MatriXf pointers object containing a matrix
for all values of the parameter
GNU General Public License 3.0