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.
107 lines
2.6 KiB
107 lines
2.6 KiB
#include <acado_code_generation.hpp>
|
|
#include "common/modeldata.h"
|
|
|
|
#define PI 3.1415926536
|
|
#define deg2rad(d) (d/180.0*PI)
|
|
|
|
const int N_steps = 16;
|
|
using namespace std;
|
|
|
|
int main( )
|
|
{
|
|
USING_NAMESPACE_ACADO
|
|
|
|
|
|
DifferentialEquation f;
|
|
|
|
DifferentialState xx; // x position
|
|
DifferentialState yy; // y position
|
|
DifferentialState psi; // vehicle heading
|
|
DifferentialState delta;
|
|
|
|
OnlineData curvature_factor;
|
|
OnlineData v_poly_r0, v_poly_r1, v_poly_r2, v_poly_r3;
|
|
OnlineData rotation_radius;
|
|
|
|
Control t;
|
|
|
|
auto poly_v = v_poly_r0*(xx*xx*xx) + v_poly_r1*(xx*xx) + v_poly_r2*xx + v_poly_r3;
|
|
|
|
// Equations of motion
|
|
f << dot(xx) == poly_v * cos(psi) - rotation_radius * sin(psi) * (poly_v * delta *curvature_factor);
|
|
f << dot(yy) == poly_v * sin(psi) + rotation_radius * cos(psi) * (poly_v * delta *curvature_factor);
|
|
f << dot(psi) == poly_v * delta * curvature_factor;
|
|
f << dot(delta) == t;
|
|
|
|
// Running cost
|
|
Function h;
|
|
|
|
// Distance errors
|
|
h << yy;
|
|
|
|
// Heading error
|
|
h << (v_poly_r3 + 1.0 ) * psi;
|
|
|
|
// Angular rate error
|
|
h << (v_poly_r3 + 1.0 ) * t;
|
|
|
|
BMatrix Q(3,3); Q.setAll(true);
|
|
// Q(0,0) = 1.0;
|
|
// Q(1,1) = 1.0;
|
|
// Q(2,2) = 1.0;
|
|
// Q(3,3) = 1.0;
|
|
// Q(4,4) = 2.0;
|
|
|
|
// Terminal cost
|
|
Function hN;
|
|
|
|
// Distance errors
|
|
hN << yy;
|
|
|
|
// Heading errors
|
|
hN << (2.0 * v_poly_r3 + 1.0 ) * psi;
|
|
|
|
BMatrix QN(2,2); QN.setAll(true);
|
|
// QN(0,0) = 1.0;
|
|
// QN(1,1) = 1.0;
|
|
// QN(2,2) = 1.0;
|
|
// QN(3,3) = 1.0;
|
|
|
|
double T_IDXS_ARR[N_steps + 1];
|
|
memcpy(T_IDXS_ARR, T_IDXS, (N_steps + 1) * sizeof(double));
|
|
Grid times(N_steps + 1, T_IDXS_ARR);
|
|
OCP ocp(times);
|
|
ocp.subjectTo(f);
|
|
|
|
ocp.minimizeLSQ(Q, h);
|
|
ocp.minimizeLSQEndTerm(QN, hN);
|
|
|
|
// car can't go backward to avoid "circles"
|
|
ocp.subjectTo( deg2rad(-90) <= psi <= deg2rad(90));
|
|
// more than absolute max steer angle
|
|
ocp.subjectTo( deg2rad(-50) <= delta <= deg2rad(50));
|
|
ocp.setNOD(6);
|
|
|
|
OCPexport mpc(ocp);
|
|
mpc.set( HESSIAN_APPROXIMATION, GAUSS_NEWTON );
|
|
mpc.set( DISCRETIZATION_TYPE, MULTIPLE_SHOOTING );
|
|
mpc.set( INTEGRATOR_TYPE, INT_RK4 );
|
|
mpc.set( NUM_INTEGRATOR_STEPS, 2500);
|
|
mpc.set( MAX_NUM_QP_ITERATIONS, 1000);
|
|
mpc.set( CG_USE_VARIABLE_WEIGHTING_MATRIX, YES);
|
|
|
|
mpc.set( SPARSE_QP_SOLUTION, CONDENSING );
|
|
mpc.set( QP_SOLVER, QP_QPOASES );
|
|
mpc.set( HOTSTART_QP, YES );
|
|
mpc.set( GENERATE_TEST_FILE, NO);
|
|
mpc.set( GENERATE_MAKE_FILE, NO );
|
|
mpc.set( GENERATE_MATLAB_INTERFACE, NO );
|
|
mpc.set( GENERATE_SIMULINK_INTERFACE, NO );
|
|
|
|
if (mpc.exportCode( "lib_mpc_export" ) != SUCCESSFUL_RETURN)
|
|
exit( EXIT_FAILURE );
|
|
|
|
mpc.printDimensionsQP( );
|
|
|
|
return EXIT_SUCCESS;
|
|
}
|
|
|