You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
119 lines
3.5 KiB
119 lines
3.5 KiB
#include "acado_common.h"
|
|
#include "acado_auxiliary_functions.h"
|
|
|
|
#include <stdio.h>
|
|
|
|
#define NX ACADO_NX /* Number of differential state variables. */
|
|
#define NXA ACADO_NXA /* Number of algebraic variables. */
|
|
#define NU ACADO_NU /* Number of control inputs. */
|
|
#define NOD ACADO_NOD /* Number of online data values. */
|
|
|
|
#define NY ACADO_NY /* Number of measurements/references on nodes 0..N - 1. */
|
|
#define NYN ACADO_NYN /* Number of measurements/references on node N. */
|
|
|
|
#define N ACADO_N /* Number of intervals in the horizon. */
|
|
|
|
ACADOvariables acadoVariables;
|
|
ACADOworkspace acadoWorkspace;
|
|
|
|
typedef struct {
|
|
double x, y, psi, delta, t;
|
|
} state_t;
|
|
|
|
|
|
typedef struct {
|
|
double x[N];
|
|
double y[N];
|
|
double psi[N];
|
|
double delta[N];
|
|
} log_t;
|
|
|
|
void init(double pathCost, double laneCost, double headingCost, double steerRateCost){
|
|
acado_initializeSolver();
|
|
int i;
|
|
const int STEP_MULTIPLIER = 3;
|
|
|
|
/* Initialize the states and controls. */
|
|
for (i = 0; i < NX * (N + 1); ++i) acadoVariables.x[ i ] = 0.0;
|
|
for (i = 0; i < NU * N; ++i) acadoVariables.u[ i ] = 0.1;
|
|
|
|
/* Initialize the measurements/reference. */
|
|
for (i = 0; i < NY * N; ++i) acadoVariables.y[ i ] = 0.0;
|
|
for (i = 0; i < NYN; ++i) acadoVariables.yN[ i ] = 0.0;
|
|
|
|
/* MPC: initialize the current state feedback. */
|
|
for (i = 0; i < NX; ++i) acadoVariables.x0[ i ] = 0.0;
|
|
|
|
for (i = 0; i < N; i++) {
|
|
int f = 1;
|
|
if (i > 4){
|
|
f = STEP_MULTIPLIER;
|
|
}
|
|
acadoVariables.W[25 * i + 0] = pathCost * f;
|
|
acadoVariables.W[25 * i + 6] = laneCost * f;
|
|
acadoVariables.W[25 * i + 12] = laneCost * f;
|
|
acadoVariables.W[25 * i + 18] = headingCost * f;
|
|
acadoVariables.W[25 * i + 24] = steerRateCost * f;
|
|
}
|
|
acadoVariables.WN[0] = pathCost * STEP_MULTIPLIER;
|
|
acadoVariables.WN[5] = laneCost * STEP_MULTIPLIER;
|
|
acadoVariables.WN[10] = laneCost * STEP_MULTIPLIER;
|
|
acadoVariables.WN[15] = headingCost * STEP_MULTIPLIER;
|
|
}
|
|
|
|
int run_mpc(state_t * x0, log_t * solution,
|
|
double l_poly[4], double r_poly[4], double p_poly[4],
|
|
double l_prob, double r_prob, double p_prob, double curvature_factor, double v_ref, double lane_width){
|
|
|
|
int i;
|
|
|
|
for (i = 0; i <= NOD * N; i+= NOD){
|
|
acadoVariables.od[i] = curvature_factor;
|
|
acadoVariables.od[i+1] = v_ref;
|
|
|
|
acadoVariables.od[i+2] = l_poly[0];
|
|
acadoVariables.od[i+3] = l_poly[1];
|
|
acadoVariables.od[i+4] = l_poly[2];
|
|
acadoVariables.od[i+5] = l_poly[3];
|
|
|
|
acadoVariables.od[i+6] = r_poly[0];
|
|
acadoVariables.od[i+7] = r_poly[1];
|
|
acadoVariables.od[i+8] = r_poly[2];
|
|
acadoVariables.od[i+9] = r_poly[3];
|
|
|
|
acadoVariables.od[i+10] = p_poly[0];
|
|
acadoVariables.od[i+11] = p_poly[1];
|
|
acadoVariables.od[i+12] = p_poly[2];
|
|
acadoVariables.od[i+13] = p_poly[3];
|
|
|
|
|
|
acadoVariables.od[i+14] = l_prob;
|
|
acadoVariables.od[i+15] = r_prob;
|
|
acadoVariables.od[i+16] = p_prob;
|
|
acadoVariables.od[i+17] = lane_width;
|
|
|
|
}
|
|
|
|
acadoVariables.x0[0] = x0->x;
|
|
acadoVariables.x0[1] = x0->y;
|
|
acadoVariables.x0[2] = x0->psi;
|
|
acadoVariables.x0[3] = x0->delta;
|
|
|
|
|
|
acado_preparationStep();
|
|
acado_feedbackStep();
|
|
/* printf("lat its: %d\n", acado_getNWSR()); */
|
|
|
|
for (i = 0; i <= N; i++){
|
|
solution->x[i] = acadoVariables.x[i*NX];
|
|
solution->y[i] = acadoVariables.x[i*NX+1];
|
|
solution->psi[i] = acadoVariables.x[i*NX+2];
|
|
solution->delta[i] = acadoVariables.x[i*NX+3];
|
|
}
|
|
|
|
acado_shiftStates(2, 0, 0);
|
|
acado_shiftControls( 0 );
|
|
|
|
|
|
return acado_getNWSR();
|
|
}
|
|
|