2021-04-16 15:38:21 +02:00
|
|
|
//LQR-stuff
|
2021-04-17 13:23:26 +02:00
|
|
|
//#include "Arduino_skal.h"
|
2021-04-16 15:38:21 +02:00
|
|
|
|
|
|
|
// | ///////////////////////////////////
|
|
|
|
// | //Row 24-52 in Arduino_skal_data.cpp
|
|
|
|
// v ///////////////////////////////////
|
|
|
|
|
|
|
|
// Expression: A
|
|
|
|
// Referenced by: '<Root>/Gain4'
|
|
|
|
|
2021-04-19 17:21:58 +02:00
|
|
|
const double matrix_A [16] = { 0.0, 0.0, 0.0, 0.0,
|
2021-04-19 17:14:25 +02:00
|
|
|
1.0, -0.20780947085442231, 0.0, -0.52810302415000854,
|
|
|
|
0.0, 13.239785742831822, 0.0, 58.601480177829842,
|
|
|
|
0.0, 0.0, 1.0, 0.0 };
|
|
|
|
|
2021-04-19 17:21:58 +02:00
|
|
|
//const double matrix_A [16] = {0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0};
|
2021-04-16 15:38:21 +02:00
|
|
|
|
|
|
|
// Expression: C
|
|
|
|
// Referenced by: '<Root>/Gain6'
|
|
|
|
|
2021-04-19 17:21:58 +02:00
|
|
|
const double matrix_C [8] = { 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0 };
|
|
|
|
//const double matrix_C [8] = { 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0 };
|
2021-04-16 15:38:21 +02:00
|
|
|
|
|
|
|
// Expression: L
|
|
|
|
// Referenced by: '<Root>/Gain2'
|
|
|
|
|
2021-04-20 13:28:01 +02:00
|
|
|
const double matrix_L [8] = { 56.7847, 799.5294, -1.4914, -57.4160,
|
|
|
|
-1.0363, -16.1071, 57.0075, 870.8172 };
|
|
|
|
const double matrix_L_old [8] = { 116.63033952875418, 3387.8673967111704, -1.4473912197449676,
|
2021-04-16 15:38:21 +02:00
|
|
|
-115.34372132703447, -1.0534041975488044, -48.223441605702455,
|
2021-04-17 13:22:12 +02:00
|
|
|
117.16185100039935, 3490.0480780568214 };
|
2021-04-19 17:21:58 +02:00
|
|
|
//const double matrix_L [8] = { 116.63033952875418, 338.78673967111704, -1.4473912197449676,
|
2021-04-19 17:14:25 +02:00
|
|
|
// -115.34372132703447, -1.0534041975488044, -48.223441605702455,
|
|
|
|
// 117.16185100039935, 34.900480780568214 };
|
2021-04-16 15:38:21 +02:00
|
|
|
|
|
|
|
// Expression: B
|
|
|
|
// Referenced by: '<Root>/Gain3'
|
|
|
|
|
2021-04-19 17:21:58 +02:00
|
|
|
const double matrix_B [4] = { 0.0, 2.078094708544223, 0.0, 5.2810302415000852 };
|
2021-04-17 13:22:12 +02:00
|
|
|
|
2021-04-16 15:38:21 +02:00
|
|
|
|
2021-04-20 13:28:01 +02:00
|
|
|
const double matrix_K_old [4] = {-31.622776601683942, -21.286439360075747, 80.789376267003959, 13.42463576551093};
|
|
|
|
const double matrix_K [4] = {-0.0316, -0.3938, 22.9455, 3.0629};
|
|
|
|
|
2021-04-16 15:38:21 +02:00
|
|
|
// | ///////////////////////////////////
|
|
|
|
// | //Row 261-264 in Arduino_skal.cpp
|
|
|
|
// v ///////////////////////////////////
|
2021-04-17 13:22:12 +02:00
|
|
|
double Integrator1_CSTATE [4] = {0.0, 0.0, 0.0, 0.0};
|
2021-04-19 17:21:58 +02:00
|
|
|
double Sum3[4];
|
2021-04-17 13:22:12 +02:00
|
|
|
double Sum4[4];
|
2021-04-16 15:38:21 +02:00
|
|
|
|
|
|
|
// | ///////////////////////////////////
|
|
|
|
// | //Row 123-124 in Arduino_skal.cpp
|
|
|
|
// v ///////////////////////////////////
|
|
|
|
|
2021-04-17 13:22:12 +02:00
|
|
|
double tmp[2];
|
2021-04-19 17:14:25 +02:00
|
|
|
double rtb_Saturation = 0.0;
|
2021-04-16 15:38:21 +02:00
|
|
|
|
|
|
|
// | ///////////////////////////////////
|
|
|
|
// | //Row 140-143 in Arduino_skal.cpp
|
|
|
|
// v ///////////////////////////////////
|
|
|
|
|
|
|
|
// Denna funktion bör anropas när styrka + riktning till motorer ska bestämmas.
|
2021-04-19 17:14:25 +02:00
|
|
|
double saturatedSignalToMotors(){
|
2021-04-20 13:28:01 +02:00
|
|
|
rtb_Saturation = ((matrix_K[0] * Integrator1_CSTATE[0] +
|
|
|
|
matrix_K[1] * Integrator1_CSTATE[1]) +
|
|
|
|
matrix_K[2] * Integrator1_CSTATE[2]) +
|
|
|
|
matrix_K[3] * Integrator1_CSTATE[3];
|
2021-04-16 15:38:21 +02:00
|
|
|
|
|
|
|
if (0.0 - rtb_Saturation > 11.5) {
|
2021-04-20 13:28:01 +02:00
|
|
|
rtb_Saturation = 3.0;
|
2021-04-16 15:38:21 +02:00
|
|
|
} else if (0.0 - rtb_Saturation < -11.5) {
|
2021-04-20 13:28:01 +02:00
|
|
|
rtb_Saturation = -3.0;
|
2021-04-16 15:38:21 +02:00
|
|
|
} else {
|
|
|
|
rtb_Saturation = 0.0 - rtb_Saturation;
|
|
|
|
}
|
2021-04-19 17:14:25 +02:00
|
|
|
Serial.print("Saturation = "); Serial.println(rtb_Saturation);
|
2021-04-16 15:38:21 +02:00
|
|
|
return rtb_Saturation;
|
|
|
|
}
|
|
|
|
// | ///////////////////////////////////
|
|
|
|
// | //Row 165-188 in Arduino_skal.cpp
|
|
|
|
// v ///////////////////////////////////
|
2021-04-19 17:14:25 +02:00
|
|
|
double inputToControlSystem(float position_m, float angle_r){
|
2021-04-16 15:38:21 +02:00
|
|
|
float posAndAng[] = {position_m, angle_r};
|
2021-04-17 13:22:12 +02:00
|
|
|
for (int i = 0; i < 2; i++) {
|
2021-04-19 17:21:58 +02:00
|
|
|
tmp[i] = posAndAng[i] - (((matrix_C[i + 2] *
|
|
|
|
Integrator1_CSTATE[1] + matrix_C[i] *
|
|
|
|
Integrator1_CSTATE[0]) + matrix_C[i + 4] *
|
|
|
|
Integrator1_CSTATE[2]) + matrix_C[i + 6] *
|
2021-04-17 13:22:12 +02:00
|
|
|
Integrator1_CSTATE[3]);
|
2021-04-16 15:38:21 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
// End of Sum: '<Root>/Sum2'
|
2021-04-17 13:22:12 +02:00
|
|
|
for (int i = 0; i < 4; i++) {
|
2021-04-16 15:38:21 +02:00
|
|
|
// Sum: '<Root>/Sum4' incorporates:
|
|
|
|
// Gain: '<Root>/Gain2'
|
|
|
|
// Gain: '<Root>/Gain3'
|
|
|
|
// Gain: '<Root>/Gain4'
|
|
|
|
// Integrator: '<Root>/Integrator1'
|
|
|
|
// Sum: '<Root>/Sum3'
|
2021-04-19 17:21:58 +02:00
|
|
|
|
|
|
|
|
|
|
|
Sum3[i] = ((matrix_L[i + 4] * tmp[1] + matrix_L[i]
|
|
|
|
* tmp[0]) + matrix_B[i] * rtb_Saturation);
|
|
|
|
|
|
|
|
Sum4[i] = Sum3[i] +
|
|
|
|
(matrix_A[i + 12] * Integrator1_CSTATE[3] +
|
|
|
|
(matrix_A[i + 8] * Integrator1_CSTATE[2] +
|
|
|
|
(matrix_A[i + 4] * Integrator1_CSTATE[1] +
|
|
|
|
matrix_A[i] * Integrator1_CSTATE[0])));
|
2021-04-16 15:38:21 +02:00
|
|
|
}
|
2021-04-19 17:21:58 +02:00
|
|
|
Serial.print("Sum3 0 = "); Serial.println(Sum3[0]);
|
|
|
|
Serial.print("Sum3 1 = "); Serial.println(Sum3[1]);
|
|
|
|
Serial.print("Sum3 2 = "); Serial.println(Sum3[2]);
|
|
|
|
Serial.print("Sum3 3 = "); Serial.println(Sum3[3]);
|
|
|
|
|
2021-04-19 17:14:25 +02:00
|
|
|
Serial.print("Sum4 0 = "); Serial.println(Sum4[0]);
|
|
|
|
Serial.print("Sum4 1 = "); Serial.println(Sum4[1]);
|
|
|
|
Serial.print("Sum4 2 = "); Serial.println(Sum4[2]);
|
|
|
|
Serial.print("Sum4 3 = "); Serial.println(Sum4[3]);
|
2021-04-19 17:21:58 +02:00
|
|
|
|
2021-04-17 14:05:54 +02:00
|
|
|
Arduino_skal_derivatives();
|
2021-04-16 15:38:21 +02:00
|
|
|
return saturatedSignalToMotors();
|
|
|
|
}
|
|
|
|
|
|
|
|
// | ///////////////////////////////////
|
|
|
|
// | //Row 215-225 in Arduino_skal.cpp
|
|
|
|
// v ///////////////////////////////////
|
2021-04-17 14:05:54 +02:00
|
|
|
|
|
|
|
void Arduino_skal_derivatives()
|
2021-04-19 17:14:25 +02:00
|
|
|
{
|
|
|
|
/*
|
2021-04-17 14:05:54 +02:00
|
|
|
XDot *_rtXdot;
|
2021-04-16 15:38:21 +02:00
|
|
|
_rtXdot = ((XDot *) (&rtM)->derivs);
|
2021-04-19 17:14:25 +02:00
|
|
|
// Derivatives for Integrator: '<Root>/Integrator1'
|
|
|
|
_rtXdot->Integrator1_CSTATE[0] = Sum4[0];
|
|
|
|
_rtXdot->Integrator1_CSTATE[1] = Sum4[1];
|
|
|
|
_rtXdot->Integrator1_CSTATE[2] = Sum4[2];
|
|
|
|
_rtXdot->Integrator1_CSTATE[3] = Sum4[3];
|
|
|
|
|
|
|
|
Integrator1_CSTATE[0] = Sum4[0] * (fastTimer/1000.0);
|
|
|
|
Integrator1_CSTATE[1] = Sum4[1] * (fastTimer/1000.0);
|
|
|
|
Integrator1_CSTATE[2] = Sum4[2] * (fastTimer/1000.0);
|
|
|
|
Integrator1_CSTATE[3] = Sum4[3] * (fastTimer/1000.0);
|
|
|
|
*/
|
2021-04-16 15:38:21 +02:00
|
|
|
// Derivatives for Integrator: '<Root>/Integrator1'
|
2021-04-19 17:14:25 +02:00
|
|
|
for (int i = 0; i < 4; i++) {
|
2021-04-20 13:28:01 +02:00
|
|
|
Integrator1_CSTATE[i] = Sum4[i] * fastTimer/1000.0;
|
2021-04-19 17:14:25 +02:00
|
|
|
Serial.print("Integrator: "); Serial.println(Integrator1_CSTATE[i]);
|
|
|
|
}
|
2021-04-17 14:05:54 +02:00
|
|
|
}
|