Program Listing for File LQRController.cpp
↰ Return to documentation for file (src/LouLib/Controllers/LQRController.cpp
)
#include "LQRController.hpp"
namespace LouLib {
namespace Controllers {
LQRController::LQRController(const Math::Matrix &a, const Math::Matrix &b,
const Math::Matrix &q, const Math::Matrix &r) : A(a), B(b), Q(q), R(r) {}
void LQRController::setReference(const Math::Vector &_reference) {
reference = _reference;
}
void LQRController::solveDARE() {
double tolerance = 1E-5;
double iter_max = 1000;
P = Q;
Math::Matrix P_next(0,0);
Math::Matrix At = A.transpose();
Math::Matrix Bt = B.transpose();
Math::Matrix Rinv = R.inverse();
double diff;
for(int i = 0; i < iter_max; i++){
P_next = At * P * A -
At * P * B * (R + Bt * P * B).inverse() * Bt * P * A + Q;
diff = fabs((P_next - P).norm());
P = P_next;
if(diff < tolerance) break;
}
K = (R + Bt * P * B).inverse() * (Bt * P * A);
}
Math::Matrix LQRController::getK() {
return K;
}
Math::Vector LQRController::computeControl(Math::Vector x) {
return -1*K * (reference - x);
}
} // LouLib
} // Controllers