#include #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; }