int main( ) { USING_NAMESPACE_ACADO // DEFINE THE VARIABLES: // ---------------------------------------------------------- DifferentialState p ; // the trolley position DifferentialState v ; // the trolley velocity DifferentialState phi ; // the excitation angle DifferentialState omega; // the angular velocity Control a ; // the acc. of the trolley const double g = 9.81; // the gravitational constant const double b = 0.20; // the friction coefficient // ---------------------------------------------------------- // DEFINE THE MODEL EQUATIONS: // ---------------------------------------------------------- DifferentialEquation f; f << dot( p ) == v ; f << dot( v ) == a ; f << dot( phi ) == omega ; f << dot( omega ) == -g*sin(phi) - a*cos(phi) - b*omega; // ---------------------------------------------------------- // SETTING UP THE (SIMULATED) PROCESS: // ----------------------------------- OutputFcn identity; DynamicSystem dynamicSystem( f,identity ); Process process( dynamicSystem,INT_RK45 ); // SETTING UP THE MPC CONTROLLER: // ------------------------------ ExportedRTIscheme rtiScheme( 4,1, 10, 0.3 ); #ifdef USE_CVXGEN set_defaults( ); #endif Vector xuRef(5); xuRef.setZero( ); VariablesGrid reference; reference.addVector( xuRef, 0.0 ); reference.addVector( xuRef, 10.0 ); StaticReferenceTrajectory referenceTrajectory( reference ); Controller controller( rtiScheme,referenceTrajectory ); controller.set( USE_REFERENCE_PREDICTION,NO ); // SETTING UP THE SIMULATION ENVIRONMENT, RUN THE EXAMPLE... // ---------------------------------------------------------- SimulationEnvironment sim( 0.0,10.0, process,controller ); Vector x0(4); x0(0) = 1.0; x0(1) = 0.0; x0(2) = 0.0; x0(3) = 0.0; sim.init( x0 ); sim.run( ); // ... AND PLOT THE RESULTS // ------------------------ VariablesGrid diffStates; sim.getProcessDifferentialStates( diffStates ); VariablesGrid feedbackControl; sim.getFeedbackControl( feedbackControl ); GnuplotWindow window; window.addSubplot( diffStates(0), "p" ); window.addSubplot( diffStates(1), "v" ); window.addSubplot( diffStates(2), "phi" ); window.addSubplot( diffStates(3), "omega" ); window.addSubplot( feedbackControl(0), "a" ); window.plot( ); return 0; }
int main( ){ USING_NAMESPACE_ACADO; // VARIABLES: // ------------------------ DifferentialState x; // Position of the trolley DifferentialState v; // Velocity of the trolley DifferentialState phi; // excitation angle DifferentialState dphi; // rotational velocity Control ax; // trolley accelaration Disturbance W; // disturbance double L = 1.0 ; // length double m = 1.0 ; // mass double g = 9.81; // gravitational constant double b = 0.2 ; // friction coefficient // DIFFERENTIAL EQUATION: // ------------------------ DifferentialEquation f, fSim; // The model equations f << dot(x) == v; f << dot(v) == ax; f << dot(phi ) == dphi; f << dot(dphi) == -g/L*sin(phi) -ax/L*cos(phi) - b/(m*L*L)*dphi; L = 1.2; // introduce model plant mismatch fSim << dot(x) == v; fSim << dot(v) == ax + W; fSim << dot(phi ) == dphi; fSim << dot(dphi) == -g/L*sin(phi) -ax/L*cos(phi) - b/(m*L*L)*dphi; // DEFINE LEAST SQUARE FUNCTION: // ----------------------------- Function h; h << x; h << v; h << phi; h << dphi; DMatrix Q(4,4); // LSQ coefficient matrix Q.setIdentity(); DVector r(4); // Reference // DEFINE AN OPTIMAL CONTROL PROBLEM: // ---------------------------------- const double t_start = 0.0; const double t_end = 5.0; OCP ocp( t_start, t_end, 25 ); ocp.minimizeLSQ( Q, h, r ); ocp.subjectTo( f ); ocp.subjectTo( -5.0 <= ax <= 5.0 ); // SETTING UP THE (SIMULATED) PROCESS: // ----------------------------------- OutputFcn identity; DynamicSystem dynamicSystem( fSim,identity ); Process process( dynamicSystem,INT_RK45 ); VariablesGrid disturbance; disturbance.read( "dist.txt" ); if (process.setProcessDisturbance( disturbance ) != SUCCESSFUL_RETURN) exit( EXIT_FAILURE ); // SETTING UP THE MPC CONTROLLER: // ------------------------------ double samplingTime = 0.1; RealTimeAlgorithm alg( ocp, samplingTime ); // alg.set( USE_REALTIME_ITERATIONS,NO ); // alg.set( MAX_NUM_ITERATIONS,20 ); StaticReferenceTrajectory zeroReference; Controller controller( alg, zeroReference ); DVector x0(4); x0.setZero(); x0(3) = 1.0; double startTime = 0.0; double endTime = 20.0; DVector uCon; VariablesGrid ySim; if (controller.init( startTime,x0 ) != SUCCESSFUL_RETURN) exit( EXIT_FAILURE ); controller.getU( uCon ); if (process.init( startTime,x0,uCon ) != SUCCESSFUL_RETURN) exit( EXIT_FAILURE ); process.getY( ySim ); // hand-coding call to // sim.run( ) int nSteps = 0; double currentTime = startTime; while ( currentTime <= endTime ) { printf( "\n*** Simulation Loop No. %d (starting at time %.3f) ***\n",nSteps,currentTime ); if (controller.step( currentTime,ySim.getLastVector() ) != SUCCESSFUL_RETURN) exit( EXIT_FAILURE ); controller.getU( uCon ); if (process.step( currentTime,currentTime+samplingTime,uCon ) != SUCCESSFUL_RETURN) exit( EXIT_FAILURE ); process.getY( ySim ); ++nSteps; currentTime = (double)nSteps * samplingTime; } return EXIT_SUCCESS; }
int main( ){ USING_NAMESPACE_ACADO // INTRODUCE THE VARIABLES: // ------------------------ DifferentialState x; Control u; Disturbance w; // DEFINE A DIFFERENTIAL EQUATION: // ------------------------------- DifferentialEquation f, f2; f << dot(x) == -2.0*x + u; f2 << dot(x) == -2.0*x + u + 0.1*w; //- 0.000000000001*x*x // DEFINE LEAST SQUARE FUNCTION: // ----------------------------- Function h; h << x; h << u; Matrix Q(2,2); Q.setIdentity(); Vector r(2); r.setAll( 0.0 ); // DEFINE AN OPTIMAL CONTROL PROBLEM: // ---------------------------------- const double t_start = 0.0; const double t_end = 7.0; OCP ocp ( t_start, t_end, 14 ); ocp.minimizeLSQ( Q, h, r ); ocp.subjectTo ( f ); ocp.subjectTo( -1.0 <= u <= 2.0 ); //ocp.subjectTo( w == 0.0 ); // SETTING UP THE (SIMULATED) PROCESS: // ----------------------------------- OutputFcn identity; DynamicSystem dynamicSystem( f2,identity ); Process process( dynamicSystem,INT_RK45 ); VariablesGrid disturbance = fopen( "my_disturbance.txt", "r" ); // GnuplotWindow window2; // window2.addSubplot( disturbance, "my disturbance" ); // window2.plot(); process.setProcessDisturbance( disturbance ); // SETUP OF THE ALGORITHM AND THE TUNING OPTIONS: // ---------------------------------------------- double samplingTime = 0.5; RealTimeAlgorithm algorithm( ocp,samplingTime ); // // algorithm.set( HESSIAN_APPROXIMATION, BLOCK_BFGS_UPDATE ); algorithm.set( HESSIAN_APPROXIMATION, GAUSS_NEWTON ); // // // algorithm.set( ABSOLUTE_TOLERANCE , 1e-7 ); // // algorithm.set( INTEGRATOR_TOLERANCE, 1e-9 ); // // algorithm.set( KKT_TOLERANCE, 1e-4 ); algorithm.set( MAX_NUM_ITERATIONS,1 ); algorithm.set( USE_REALTIME_SHIFTS, YES ); // algorithm.set( USE_REALTIME_ITERATIONS,NO ); // algorithm.set( TERMINATE_AT_CONVERGENCE,YES ); // algorithm.set( PRINTLEVEL,HIGH ); Vector x0(1); x0(0) = 1.0; // // algorithm.solve( x0 ); // // GnuplotWindow window1; // window1.addSubplot( x, "DIFFERENTIAL STATE: x" ); // window1.addSubplot( u, "CONTROL: u" ); // window1.plot(); // // return 0; // SETTING UP THE NMPC CONTROLLER: // ------------------------------- VariablesGrid myReference = fopen( "my_reference.txt", "r" ); PeriodicReferenceTrajectory reference( myReference ); // GnuplotWindow window3; // window3.addSubplot( myReference(1), "my reference" ); // window3.plot(); Controller controller( algorithm,reference ); // SETTING UP THE SIMULATION ENVIRONMENT, RUN THE EXAMPLE... // ---------------------------------------------------------- double simulationStart = 0.0; double simulationEnd = 15.0; SimulationEnvironment sim( simulationStart, simulationEnd, process, controller ); sim.init( x0 ); sim.run( ); // ...AND PLOT THE RESULTS // ---------------------------------------------------------- VariablesGrid sampledProcessOutput; sim.getSampledProcessOutput( sampledProcessOutput ); VariablesGrid feedbackControl; sim.getFeedbackControl( feedbackControl ); GnuplotWindow window; window.addSubplot( sampledProcessOutput(0), "DIFFERENTIAL STATE: x" ); window.addSubplot( feedbackControl(0), "CONTROL: u" ); window.plot(); return 0; }
USING_NAMESPACE_ACADO int main( ) { // DIFFERENTIAL STATES : // ------------------------- DifferentialState r; // the length r of the cable DifferentialState phi; // the angle phi DifferentialState theta; // the angle theta (grosser wert- naeher am boden/kleiner wert - weiter oben) // ------------------------- // ------------------------------------------- DifferentialState dr; // first derivative of r0 with respect to t DifferentialState dphi; // first derivative of phi with respect to t DifferentialState dtheta; // first derivative of theta with respect to t // ------------------------- // ------------------------------------------- DifferentialState n; // winding number(rauslassen) // ------------------------- // ------------------------------------------- DifferentialState Psi; // the roll angle Psi DifferentialState CL; // the aerodynamic lift coefficient // ------------------------- // ------------------------------------------- DifferentialState W; // integral over the power at the generator // ( = ENERGY )(rauslassen) // MEASUREMENT FUNCTION : // ------------------------- Function model_response ; // the measurement function // CONTROL : // ------------------------- Control ddr0; // second derivative of r0 with respect to t Control dPsi; // first derivative of Psi with respect to t Control dCL; // first derivative of CL with respect to t Disturbance w_extra; // PARAMETERS : // ------------------------ // PARAMETERS OF THE KITE : // ----------------------------- double mk = 2000.00; // mass of the kite // [ kg ](maybe change to 5000kg) double A = 500.00; // effective area // [ m^2 ] double V = 720.00; // volume // [ m^3 ] double cd0 = 0.04; // aerodynamic drag coefficient // [ ] // ( cd0: without downwash ) double K = 0.04; // induced drag constant // [ ] // PHYSICAL CONSTANTS : // ----------------------------- double g = 9.81; // gravitational constant // [ m /s^2] double rho = 1.23; // density of the air // [ kg/m^3] // PARAMETERS OF THE CABLE : // ----------------------------- double rhoc = 1450.00; // density of the cable // [ kg/m^3] double cc = 1.00; // frictional constant // [ ] double dc = 0.05614; // diameter // [ m ] // PARAMETERS OF THE WIND : // ----------------------------- double w0 = 10.00; // wind velocity at altitude h0 // [ m/s ] double h0 = 100.00; // the altitude h0 // [ m ] double hr = 0.10; // roughness length // [ m ] // OTHER VARIABLES : // ------------------------ double AQ ; // cross sectional area IntermediateState mc; // mass of the cable IntermediateState m ; // effective inertial mass IntermediateState m_; // effective gravitational mass IntermediateState Cg; IntermediateState dm; // first derivative of m with respect to t // DEFINITION OF PI : // ------------------------ double PI = 3.1415926535897932; // ORIENTATION AND FORCES : // ------------------------ IntermediateState h ; // altitude of the kite IntermediateState w ; // the wind at altitude h IntermediateState we [ 3]; // effective wind vector IntermediateState nwe ; // norm of the effective wind vector IntermediateState nwep ; // - IntermediateState ewep [ 3]; // projection of ewe IntermediateState eta ; // angle eta: cf. [2] IntermediateState et [ 3]; // unit vector from the left to the right wing tip IntermediateState Caer ; IntermediateState Cf ; // simple constants IntermediateState CD ; // the aerodynamic drag coefficient IntermediateState Fg [ 3]; // the gravitational force IntermediateState Faer [ 3]; // the aerodynamic force IntermediateState Ff [ 3]; // the frictional force IntermediateState F [ 3]; // the total force // TERMS ON RIGHT-HAND-SIDE // OF THE DIFFERENTIAL // EQUATIONS : // ------------------------ IntermediateState a_pseudo [ 3]; // the pseudo accelaration IntermediateState dn ; // the time derivate of the kite's winding number IntermediateState ddr ; // second derivative of s with respect to t IntermediateState ddphi ; // second derivative of phi with respect to t IntermediateState ddtheta ; // second derivative of theta with respect to t IntermediateState power ; // the power at the generator // ------------------------ ------ // ---------------------------------------------- IntermediateState regularisation ; // regularisation of controls // MODEL EQUATIONS : // =============================================================== // SPRING CONSTANT OF THE CABLE : // --------------------------------------------------------------- AQ = PI*dc*dc/4.0 ; // THE EFECTIVE MASS' : // --------------------------------------------------------------- mc = rhoc*AQ*r ; // mass of the cable m = mk + mc / 3.0; // effective inertial mass m_ = mk + mc / 2.0; // effective gravitational mass // ----------------------------- // ---------------------------- dm = (rhoc*AQ/ 3.0)*dr; // time derivative of the mass // WIND SHEAR MODEL : // --------------------------------------------------------------- // for startup +60m h = r*cos(theta)+60.0 ; // h = r*cos(theta) ; w = log(h/hr) / log(h0/hr) *(w0+w_extra) ; // EFFECTIVE WIND IN THE KITE`S SYSTEM : // --------------------------------------------------------------- we[0] = w*sin(theta)*cos(phi) - dr ; we[1] = -w*sin(phi) - r*sin(theta)*dphi ; we[2] = -w*cos(theta)*cos(phi) + r *dtheta; // CALCULATION OF THE KITE`S TRANSVERSAL AXIS : // --------------------------------------------------------------- nwep = pow( we[1]*we[1] + we[2]*we[2], 0.5 ); nwe = pow( we[0]*we[0] + we[1]*we[1] + we[2]*we[2], 0.5 ); eta = asin( we[0]*tan(Psi)/ nwep ) ; // --------------------------------------------------------------- // ewep[0] = 0.0 ; ewep[1] = we[1] / nwep ; ewep[2] = we[2] / nwep ; // --------------------------------------------------------------- et [0] = sin(Psi) ; et [1] = (-cos(Psi)*sin(eta))*ewep[1] - (cos(Psi)*cos(eta))*ewep[2]; et [2] = (-cos(Psi)*sin(eta))*ewep[2] + (cos(Psi)*cos(eta))*ewep[1]; // CONSTANTS FOR SEVERAL FORCES : // --------------------------------------------------------------- Cg = (V*rho-m_)*g ; Caer = (rho*A/2.0 )*nwe ; Cf = (rho*dc/8.0)*r*nwe ; // THE DRAG-COEFFICIENT : // --------------------------------------------------------------- CD = cd0 + K*CL*CL ; // SUM OF GRAVITATIONAL AND LIFTING FORCE : // --------------------------------------------------------------- Fg [0] = Cg * cos(theta) ; // Fg [1] = Cg * 0.0 ; Fg [2] = Cg * sin(theta) ; // SUM OF THE AERODYNAMIC FORCES : // --------------------------------------------------------------- Faer[0] = Caer*( CL*(we[1]*et[2]-we[2]*et[1]) + CD*we[0] ) ; Faer[1] = Caer*( CL*(we[2]*et[0]-we[0]*et[2]) + CD*we[1] ) ; Faer[2] = Caer*( CL*(we[0]*et[1]-we[1]*et[0]) + CD*we[2] ) ; // THE FRICTION OF THE CABLE : // --------------------------------------------------------------- // Ff [0] = Cf * cc* we[0] ; Ff [1] = Cf * cc* we[1] ; Ff [2] = Cf * cc* we[2] ; // THE TOTAL FORCE : // --------------------------------------------------------------- F [0] = Fg[0] + Faer[0] ; F [1] = Faer[1] + Ff[1] ; F [2] = Fg[2] + Faer[2] + Ff[2] ; // THE PSEUDO ACCELERATION: // --------------------------------------------------------------- a_pseudo [0] = - ddr0 + r*( dtheta*dtheta + sin(theta)*sin(theta)*dphi *dphi ) - dm/m*dr ; a_pseudo [1] = - 2.0*cos(theta)/sin(theta)*dphi*dtheta - 2.0*dr/r*dphi - dm/m*dphi ; a_pseudo [2] = cos(theta)*sin(theta)*dphi*dphi - 2.0*dr/r*dtheta - dm/m*dtheta ; // THE EQUATIONS OF MOTION: // --------------------------------------------------------------- ddr = F[0]/m + a_pseudo[0] ; ddphi = F[1]/(m*r*sin(theta)) + a_pseudo[1] ; ddtheta = -F[2]/(m*r ) + a_pseudo[2] ; // THE DERIVATIVE OF THE WINDING NUMBER : // --------------------------------------------------------------- dn = ( dphi*ddtheta - dtheta*ddphi ) / (2.0*PI*(dphi*dphi + dtheta*dtheta) ) ; // THE POWER AT THE GENERATOR : // --------------------------------------------------------------- power = m*ddr*dr ; // REGULARISATION TERMS : // --------------------------------------------------------------- regularisation = 5.0e2 * ddr0 * ddr0 + 1.0e8 * dPsi * dPsi + 1.0e5 * dCL * dCL + 2.5e5 * dn * dn + 2.5e7 * ddphi * ddphi; + 2.5e7 * ddtheta * ddtheta; + 2.5e6 * dtheta * dtheta; // --------------------------- // REFERENCE TRAJECTORY: // --------------------------------------------------------------- VariablesGrid myReference; myReference.read( "ref_w_zeros.txt" );// read the measurements PeriodicReferenceTrajectory reference( myReference ); // THE "RIGHT-HAND-SIDE" OF THE ODE: // --------------------------------------------------------------- DifferentialEquation f; f << dot(r) == dr ; f << dot(phi) == dphi ; f << dot(theta) == dtheta ; f << dot(dr) == ddr0 ; f << dot(dphi) == ddphi ; f << dot(dtheta) == ddtheta ; f << dot(n) == dn ; f << dot(Psi) == dPsi ; f << dot(CL) == dCL ; f << dot(W) == (-power + regularisation)*1.0e-6; model_response << r ; // the state r is measured model_response << phi ; model_response << theta; model_response << dr ; model_response << dphi ; model_response << dtheta; model_response << ddr0; model_response << dPsi; model_response << dCL ; DVector x_scal(9); x_scal(0) = 60.0; x_scal(1) = 1.0e-1; x_scal(2) = 1.0e-1; x_scal(3) = 40.0; x_scal(4) = 1.0e-1; x_scal(5) = 1.0e-1; x_scal(6) = 60.0; x_scal(7) = 1.5e-1; x_scal(8) = 2.5; DMatrix Q(9,9); Q.setIdentity(); DMatrix Q_end(9,9); Q_end.setIdentity(); int i; for( i = 0; i < 6; i++ ){ Q(i,i) = (1.0e-1/x_scal(i))*(1.0e-1/x_scal(i)); Q_end(i,i) = (5.0e-1/x_scal(i))*(5.0e-1/x_scal(i)); } for( i = 6; i < 9; i++ ){ Q(i,i) = (1.0e-1/x_scal(i))*(1.0e-1/x_scal(i)); Q_end(i,i) = (5.0e-1/x_scal(i))*(5.0e-1/x_scal(i)); } DVector measurements(9); measurements.setAll( 0.0 ); // DEFINE AN OPTIMAL CONTROL PROBLEM: // ---------------------------------- const double t_start = 0.0; const double t_end = 10.0; OCP ocp( t_start, t_end, 10 ); ocp.minimizeLSQ( Q,model_response, measurements ) ; // fit h to the data ocp.minimizeLSQEndTerm( Q_end,model_response, measurements ) ; ocp.subjectTo( f ); ocp.subjectTo( -0.34 <= phi <= 0.34 ); ocp.subjectTo( 0.85 <= theta <= 1.45 ); ocp.subjectTo( -40.0 <= dr <= 10.0 ); ocp.subjectTo( -0.29 <= Psi <= 0.29 ); ocp.subjectTo( 0.1 <= CL <= 1.50 ); ocp.subjectTo( -0.7 <= n <= 0.90 ); ocp.subjectTo( -25.0 <= ddr0 <= 25.0 ); ocp.subjectTo( -0.065 <= dPsi <= 0.065 ); ocp.subjectTo( -3.5 <= dCL <= 3.5 ); ocp.subjectTo( -60.0 <= cos(theta)*r ); ocp.subjectTo( w_extra == 0.0 ); // SETTING UP THE (SIMULATED) PROCESS: // ----------------------------------- OutputFcn identity; DynamicSystem dynamicSystem( f,identity ); Process process( dynamicSystem,INT_RK45 ); VariablesGrid disturbance; disturbance.read( "my_wind_disturbance_controlsfree.txt" ); if (process.setProcessDisturbance( disturbance ) != SUCCESSFUL_RETURN) exit( EXIT_FAILURE ); // SETUP OF THE ALGORITHM AND THE TUNING OPTIONS: // ---------------------------------------------- double samplingTime = 1.0; RealTimeAlgorithm algorithm( ocp, samplingTime ); if (algorithm.initializeDifferentialStates("p_s_ref.txt" ) != SUCCESSFUL_RETURN) exit( EXIT_FAILURE ); if (algorithm.initializeControls ("p_c_ref.txt" ) != SUCCESSFUL_RETURN) exit( EXIT_FAILURE ); algorithm.set( MAX_NUM_ITERATIONS, 2 ); algorithm.set( KKT_TOLERANCE , 1e-4 ); algorithm.set( HESSIAN_APPROXIMATION,GAUSS_NEWTON); algorithm.set( INTEGRATOR_TOLERANCE, 1e-6 ); algorithm.set( GLOBALIZATION_STRATEGY,GS_FULLSTEP ); // algorithm.set( USE_IMMEDIATE_FEEDBACK, YES ); algorithm.set( USE_REALTIME_SHIFTS, YES ); algorithm.set(LEVENBERG_MARQUARDT, 1e-5); DVector x0(10); x0(0) = 1.8264164528775887e+03; x0(1) = -5.1770453309520573e-03; x0(2) = 1.2706440287266794e+00; x0(3) = 2.1977888424944396e+00; x0(4) = 3.1840786108641383e-03; x0(5) = -3.8281200674676448e-02; x0(6) = 0.0000000000000000e+00; x0(7) = -1.0372313936413566e-02; x0(8) = 1.4999999999999616e+00; x0(9) = 0.0000000000000000e+00; // SETTING UP THE NMPC CONTROLLER: // ------------------------------- Controller controller( algorithm, reference ); // SETTING UP THE SIMULATION ENVIRONMENT, RUN THE EXAMPLE... // ---------------------------------------------------------- double simulationStart = 0.0; double simulationEnd = 10.0; SimulationEnvironment sim( simulationStart, simulationEnd, process, controller ); if (sim.init( x0 ) != SUCCESSFUL_RETURN) exit( EXIT_FAILURE ); if (sim.run( ) != SUCCESSFUL_RETURN) exit( EXIT_FAILURE ); // ...AND PLOT THE RESULTS // ---------------------------------------------------------- VariablesGrid diffStates; sim.getProcessDifferentialStates( diffStates ); diffStates.print( "diffStates.txt" ); diffStates.print( "diffStates.m","DIFFSTATES",PS_MATLAB ); VariablesGrid interStates; sim.getProcessIntermediateStates( interStates ); interStates.print( "interStates.txt" ); interStates.print( "interStates.m","INTERSTATES",PS_MATLAB ); VariablesGrid sampledProcessOutput; sim.getSampledProcessOutput( sampledProcessOutput ); sampledProcessOutput.print( "sampledOut.txt" ); sampledProcessOutput.print( "sampledOut.m","OUT",PS_MATLAB ); VariablesGrid feedbackControl; sim.getFeedbackControl( feedbackControl ); feedbackControl.print( "controls.txt" ); feedbackControl.print( "controls.m","CONTROL",PS_MATLAB ); GnuplotWindow window; window.addSubplot( sampledProcessOutput(0), "DIFFERENTIAL STATE: r" ); window.addSubplot( sampledProcessOutput(1), "DIFFERENTIAL STATE: phi" ); window.addSubplot( sampledProcessOutput(2), "DIFFERENTIAL STATE: theta" ); window.addSubplot( sampledProcessOutput(3), "DIFFERENTIAL STATE: dr" ); window.addSubplot( sampledProcessOutput(4), "DIFFERENTIAL STATE: dphi" ); window.addSubplot( sampledProcessOutput(5), "DIFFERENTIAL STATE: dtheta" ); window.addSubplot( sampledProcessOutput(7), "DIFFERENTIAL STATE: Psi" ); window.addSubplot( sampledProcessOutput(8), "DIFFERENTIAL STATE: CL" ); window.addSubplot( sampledProcessOutput(9), "DIFFERENTIAL STATE: W" ); window.addSubplot( feedbackControl(0), "CONTROL 1 DDR0" ); window.addSubplot( feedbackControl(1), "CONTROL 1 DPSI" ); window.addSubplot( feedbackControl(2), "CONTROL 1 DCL" ); window.plot( ); GnuplotWindow window2; window2.addSubplot( interStates(1) ); window2.plot(); return 0; }
int main( ){ USING_NAMESPACE_ACADO // INTRODUCE THE VARIABLES: // ------------------------- DifferentialState x; DifferentialState l; AlgebraicState z; Control u; DifferentialEquation f; // Disturbance R; // DEFINE A DIFFERENTIAL EQUATION: // ------------------------------- f << dot(x) == -x + 0.5*x*x + u + 0.5*z ; f << dot(l) == x*x + 3.0*u*u ; f << 0 == z + exp(z) - 1.0 + x ; // DEFINE AN OPTIMAL CONTROL PROBLEM: // ---------------------------------- OCP ocp( 0.0, 5.0, 10 ); ocp.minimizeMayerTerm( l ); ocp.subjectTo( f ); // ocp.subjectTo( R == 0.0 ); // SETTING UP THE (SIMULATED) PROCESS: // ----------------------------------- OutputFcn identity; DynamicSystem dynamicSystem( f,identity ); Process process( dynamicSystem,INT_BDF ); //VariablesGrid disturbance = readFromFile( "dae_simulation_disturbance.txt" ); //process.setProcessDisturbance( disturbance ); // SETTING UP THE MPC CONTROLLER: // ------------------------------ RealTimeAlgorithm alg( ocp,0.5 ); StaticReferenceTrajectory zeroReference; Controller controller( alg,zeroReference ); // SETTING UP THE SIMULATION ENVIRONMENT, RUN THE EXAMPLE... // ---------------------------------------------------------- SimulationEnvironment sim( 0.0,15.0,process,controller ); Vector x0(2); x0(0) = 1; x0(1) = 0; sim.init( x0 ); sim.run( ); // ...AND PLOT THE RESULTS // ---------------------------------------------------------- VariablesGrid diffStates; sim.getProcessDifferentialStates( diffStates ); diffStates.printToFile( "diffStates.txt" ); diffStates.printToFile( "diffStates.m","DIFFSTATES",PS_MATLAB ); VariablesGrid sampledProcessOutput; sim.getSampledProcessOutput( sampledProcessOutput ); sampledProcessOutput.printToFile( "sampledOut.txt" ); sampledProcessOutput.printToFile( "sampledOut.m","OUT",PS_MATLAB ); VariablesGrid feedbackControl; sim.getFeedbackControl( feedbackControl ); feedbackControl.printToFile( "controls.txt" ); feedbackControl.printToFile( "controls.m","CONTROL",PS_MATLAB ); VariablesGrid algStates; sim.getProcessAlgebraicStates( algStates ); algStates.printToFile( "algStates.txt" ); algStates.printToFile( "algStates.m","ALGSTATES",PS_MATLAB ); GnuplotWindow window; window.addSubplot( diffStates(0), "DIFFERENTIAL STATE: x" ); window.addSubplot( diffStates(1), "DIFFERENTIAL STATE: l" ); window.addSubplot( algStates(0), "ALGEBRAIC STATE: z" ); window.addSubplot( feedbackControl(0), "CONTRUL: u" ); window.plot( ); return 0; }
int main( ){ USING_NAMESPACE_ACADO // INTRODUCE THE VARIABLES: // ------------------------- DifferentialState xB; DifferentialState xW; DifferentialState vB; DifferentialState vW; Control R; Control F; double mB = 350.0; double mW = 50.0; double kS = 20000.0; double kT = 200000.0; // DEFINE A DIFFERENTIAL EQUATION: // ------------------------------- DifferentialEquation f; f << dot(xB) == vB; f << dot(xW) == vW; f << dot(vB) == ( -kS*xB + kS*xW + F ) / mB; f << dot(vW) == ( kS*xB - (kT+kS)*xW + kT*R - F ) / mW; // DEFINE LEAST SQUARE FUNCTION: // ----------------------------- Function h; h << xB; h << xW; h << vB; h << vW; Matrix Q(4,4); Q.setIdentity(); Q(0,0) = 10.0; Q(1,1) = 10.0; Vector r(4); r.setAll( 0.0 ); // DEFINE AN OPTIMAL CONTROL PROBLEM: // ---------------------------------- const double t_start = 0.0; const double t_end = 1.0; OCP ocp( t_start, t_end, 20 ); ocp.minimizeLSQ( Q, h, r ); ocp.subjectTo( f ); ocp.subjectTo( -500.0 <= F <= 500.0 ); ocp.subjectTo( R == 0.0 ); // SETTING UP THE (SIMULATED) PROCESS: // ----------------------------------- OutputFcn identity; DynamicSystem dynamicSystem( f,identity ); Process process( dynamicSystem,INT_RK45 ); VariablesGrid disturbance = readFromFile( "road.txt" ); process.setProcessDisturbance( disturbance ); // SETTING UP THE MPC CONTROLLER: // ------------------------------ RealTimeAlgorithm alg( ocp,0.05 ); alg.set( MAX_NUM_ITERATIONS, 2 ); StaticReferenceTrajectory zeroReference; Controller controller( alg,zeroReference ); // SETTING UP THE SIMULATION ENVIRONMENT, RUN THE EXAMPLE... // ---------------------------------------------------------- SimulationEnvironment sim( 0.0,3.0,process,controller ); Vector x0(4); x0(0) = 0.01; x0(1) = 0.0; x0(2) = 0.0; x0(3) = 0.0; sim.init( x0 ); sim.run( ); // ...AND PLOT THE RESULTS // ---------------------------------------------------------- VariablesGrid sampledProcessOutput; sim.getSampledProcessOutput( sampledProcessOutput ); VariablesGrid feedbackControl; sim.getFeedbackControl( feedbackControl ); GnuplotWindow window; window.addSubplot( sampledProcessOutput(0), "Body Position [m]" ); window.addSubplot( sampledProcessOutput(1), "Wheel Position [m]" ); window.addSubplot( sampledProcessOutput(2), "Body Velocity [m/s]" ); window.addSubplot( sampledProcessOutput(3), "Wheel Velocity [m/s]" ); window.addSubplot( feedbackControl(1), "Damping Force [N]" ); window.addSubplot( feedbackControl(0), "Road Excitation [m]" ); window.plot( ); return 0; }
int main( ){ USING_NAMESPACE_ACADO // INTRODUCE THE VARIABLES: // ------------------------- DifferentialState x,y,z,vx,vy,vz,phi,theta,psi,p,q,r,u1,u2,u3,u4; // x, y, z : position // vx, vy, vz : linear velocity // phi, theta, psi : orientation (Yaw-Pitch-Roll = Euler(3,2,1)) // p, q, r : angular velocity // u1, u2, u3, u4 : velocity of the propellers Control vu1,vu2,vu3,vu4; // vu1, vu2, vu3, vu4 : derivative of u1, u2, u3, u4 DifferentialEquation f; // Quad constants const double c = 0.00001; const double Cf = 0.00065; const double d = 0.250; const double Jx = 0.018; const double Jy = 0.018; const double Jz = 0.026; const double Im = 0.0001; const double m = 0.9; const double g = 9.81; const double Cx = 0.1; // Minimization Weights double coeffX = .00001; double coeffU = coeffX*0.0001;//0.000000000000001; double coeffX2 = coeffX * 100.; double coeffX3 = coeffX * 0.00001; double coeffO = -coeffX * 0.1; // final position (used in the cost function) double xf = 0., yf = 0., zf = 20.; // double T = 8.; //length (in second) of the trajectory predicted in the MPC int nb_nodes = 20.; //number of nodes used in the Optimal Control Problem // 20 nodes means that the algorithm will discretized the trajectory equally into 20 pieces // If you increase the number of node, the solution will be more precise but calculation will take longer (~nb_nodes^2) // In ACADO, the commands are piecewise constant functions, constant between each node. double tmpc = 0.2; //time (in second) between two activation of the MPC algorithm // DEFINE A OPTIMAL CONTROL PROBLEM // ------------------------------- OCP ocp( 0.0, T, nb_nodes ); // DEFINE THE COST FUNCTION // ------------------------------- Function h, hf; h << x; h << y; h << z; h << vu1; h << vu2; h << vu3; h << vu4; h << p; h << q; h << r; hf << x; hf << y; hf << z; DMatrix Q(10,10), Qf(3,3); Q(0,0) = coeffX; Q(1,1) = coeffX; Q(2,2) = coeffX; Q(3,3) = coeffU; Q(4,4) = coeffU; Q(5,5) = coeffU; Q(6,6) = coeffU; Q(7,7) = coeffX2; Q(8,8) = coeffX2; Q(9,9) = coeffX2; Qf(0,0) = 1.; Qf(1,1) = 1.; Qf(2,2) = 1.; DVector reff(3), ref(10); ref(0) = xf; ref(1) = yf; ref(2) = zf; ref(3) = 58.; ref(4) = 58.; ref(5) = 58.; ref(6) = 58.; ref(7) = 0.; ref(8) = 0.; ref(9) = 0.; reff(0) = xf; reff(1) = yf; reff(2) = zf; // The cost function is define as : integrale from 0 to T { transpose(h(x,u,t)-ref)*Q*(h(x,u,t)-ref) } + transpose(hf(x,u,T))*Qf*hf(x,u,T) // == integrale cost (also called running cost or Lagrange Term) + final cost (Mayer Term) ocp.minimizeLSQ ( Q, h, ref); // ocp.minimizeLSQEndTerm(Qf, hf, reff); // When doing MPC, you need terms in the cost function to stabilised the system => p, q, r and vu1, vu2, vu3, vu4. You can check that if you reduce their weights "coeffX2" or "coeffU" too low, the optimization will crashed. // DEFINE THE DYNAMIC EQUATION OF THE SYSTEM: // ---------------------------------- f << dot(x) == vx; f << dot(y) == vy; f << dot(z) == vz; f << dot(vx) == Cf*(u1*u1+u2*u2+u3*u3+u4*u4)*sin(theta)/m; f << dot(vy) == -Cf*(u1*u1+u2*u2+u3*u3+u4*u4)*sin(psi)*cos(theta)/m; f << dot(vz) == Cf*(u1*u1+u2*u2+u3*u3+u4*u4)*cos(psi)*cos(theta)/m - g; f << dot(phi) == -cos(phi)*tan(theta)*p+sin(phi)*tan(theta)*q+r; f << dot(theta) == sin(phi)*p+cos(phi)*q; f << dot(psi) == cos(phi)/cos(theta)*p-sin(phi)/cos(theta)*q; f << dot(p) == (d*Cf*(u1*u1-u2*u2)+(Jy-Jz)*q*r)/Jx; f << dot(q) == (d*Cf*(u4*u4-u3*u3)+(Jz-Jx)*p*r)/Jy; f << dot(r) == (c*(u1*u1+u2*u2-u3*u3-u4*u4)+(Jx-Jy)*p*q)/Jz; f << dot(u1) == vu1; f << dot(u2) == vu2; f << dot(u3) == vu3; f << dot(u4) == vu4; // ---------------------------- DEFINE CONTRAINTES --------------------------------- // //Dynamic ocp.subjectTo( f ); //State constraints //Constraints on the velocity of each propeller ocp.subjectTo( 16 <= u1 <= 95 ); ocp.subjectTo( 16 <= u2 <= 95 ); ocp.subjectTo( 16 <= u3 <= 95 ); ocp.subjectTo( 16 <= u4 <= 95 ); //Command constraints //Constraints on the acceleration of each propeller ocp.subjectTo( -100 <= vu1 <= 100 ); ocp.subjectTo( -100 <= vu2 <= 100 ); ocp.subjectTo( -100 <= vu3 <= 100 ); ocp.subjectTo( -100 <= vu4 <= 100 ); #if AVOID_SINGULARITIES == 1 //Constraint to avoid singularity // In this example I used Yaw-Pitch-Roll convention to describe orientation of the quadrotor // when using Euler Angles representation, you always have a singularity, and we need to // avoid it otherwise the algorithm will crashed. ocp.subjectTo( -1. <= theta <= 1.); #endif //Example of Eliptic obstacle constraints (here, cylinders with eliptic basis) ocp.subjectTo( 16 <= ((x+3)*(x+3)+2*(z-5)*(z-5)) ); ocp.subjectTo( 16 <= ((x-3)*(x-3)+2*(z-9)*(z-9)) ); ocp.subjectTo( 16 <= ((x+3)*(x+3)+2*(z-15)*(z-15)) ); // SETTING UP THE (SIMULATED) PROCESS: // ----------------------------------- OutputFcn identity; // The next line define the equation used to simulate the system : // here "f" is used (=the same as the one used for the ocp) so the trajectory simulated // from the commands will be exactly the same as the one calculated by the MPC. // If for instance you want to test robusness, you can define an other dynamic equation "f2" // with changed parameters and put it here. DynamicSystem dynamicSystem( f,identity ); Process process( dynamicSystem,INT_RK45 ); // SETTING UP THE MPC CONTROLLER: // ------------------------------ RealTimeAlgorithm alg( ocp, tmpc ); //Usually, you do only one step of the optimisation algorithm (~Gauss-Newton here) //at each activation of the MPC, that way the delay between getting the state and //sending a command is as quick as possible. alg.set( MAX_NUM_ITERATIONS, 1 ); StaticReferenceTrajectory zeroReference; Controller controller( alg,zeroReference ); // SET AN INITIAL GUESS FOR THE FIRST MPC LOOP (NEXT LOOPS WILL USE AS INITIAL GUESS THE SOLUTION FOUND AT THE PREVIOUS MPC LOOP) Grid timeGrid(0.0,T,nb_nodes+1); VariablesGrid x_init(16, timeGrid); // init with static for (int i = 0 ; i<nb_nodes+1 ; i++ ) { x_init(i,0) = 0.; x_init(i,1) = 0.; x_init(i,2) = 0.; x_init(i,3) = 0.; x_init(i,4) = 0.; x_init(i,5) = 0.; x_init(i,6) = 0.; x_init(i,7) = 0.; x_init(i,8) = 0.; x_init(i,9) = 0.; x_init(i,10) = 0.; x_init(i,11) = 0.; x_init(i,12) = 58.; //58. is the propeller rotation speed so the total thrust balance the weight of the quad x_init(i,13) = 58.; x_init(i,14) = 58.; x_init(i,15) = 58.; } alg.initializeDifferentialStates(x_init); // SET OPTION AND PLOTS WINDOW // --------------------------- // Linesearch is an algorithm which will try several points along the descent direction to choose a better step length. // It looks like activating this option produice more stable trajectories.198 alg.set( GLOBALIZATION_STRATEGY, GS_LINESEARCH ); alg.set(INTEGRATOR_TYPE, INT_RK45); // You can uncomment those lines to see how the predicted trajectory involve along time // (but be carefull because you will have 1 ploting window per MPC loop) // GnuplotWindow window1(PLOT_AT_EACH_ITERATION); // window1.addSubplot( z,"DifferentialState z" ); // window1.addSubplot( x,"DifferentialState x" ); // window1.addSubplot( theta,"DifferentialState theta" ); // window1.addSubplot( 16./((x+3)*(x+3)+4*(z-5)*(z-5)),"Dist obs1" ); // window1.addSubplot( 16./((x-3)*(x-3)+4*(z-9)*(z-9)),"Dist obs2" ); // window1.addSubplot( 16./((x+2)*(x+2)+4*(z-15)*(z-15)),"Dist obs3" ); // alg<<window1; // SETTING UP THE SIMULATION ENVIRONMENT, RUN THE EXAMPLE... // ---------------------------------------------------------- // The first argument is the starting time, the second the end time. SimulationEnvironment sim( 0.0,10.,process,controller ); //Setting the state of the sytem at the beginning of the simulation. DVector x0(16); x0.setZero(); x0(0) = 0.; x0(12) = 58.; x0(13) = 58.; x0(14) = 58.; x0(15) = 58.; t = clock(); if (sim.init( x0 ) != SUCCESSFUL_RETURN) exit( EXIT_FAILURE ); if (sim.run( ) != SUCCESSFUL_RETURN) exit( EXIT_FAILURE ); t = clock() - t; std::cout << "total time : " << (((float)t)/CLOCKS_PER_SEC)<<std::endl; // ...SAVE THE RESULTS IN FILES // ---------------------------------------------------------- std::ofstream file; file.open("/tmp/log_state.txt",std::ios::out); std::ofstream file2; file2.open("/tmp/log_control.txt",std::ios::out); VariablesGrid sampledProcessOutput; sim.getSampledProcessOutput( sampledProcessOutput ); sampledProcessOutput.print(file); VariablesGrid feedbackControl; sim.getFeedbackControl( feedbackControl ); feedbackControl.print(file2); // ...AND PLOT THE RESULTS // ---------------------------------------------------------- GnuplotWindow window; window.addSubplot( sampledProcessOutput(0), "x " ); window.addSubplot( sampledProcessOutput(1), "y " ); window.addSubplot( sampledProcessOutput(2), "z " ); window.addSubplot( sampledProcessOutput(6),"phi" ); window.addSubplot( sampledProcessOutput(7),"theta" ); window.addSubplot( sampledProcessOutput(8),"psi" ); window.plot( ); graphics::corbaServer::ClientCpp client = graphics::corbaServer::ClientCpp(); client.createWindow("window"); return 0; }
int main( ) { USING_NAMESPACE_ACADO // INTRODUCE THE VARIABLES: // ------------------------- DifferentialState xB; //Body Position DifferentialState xW; //Wheel Position DifferentialState vB; //Body Velocity DifferentialState vW; //Wheel Velocity Disturbance R; Control F; double mB = 350.0; double mW = 50.0; double kS = 20000.0; double kT = 200000.0; // DEFINE A DIFFERENTIAL EQUATION: // ------------------------------- DifferentialEquation f; f << dot(xB) == vB; f << dot(xW) == vW; f << dot(vB) == ( -kS*xB + kS*xW + F ) / mB; f << dot(vW) == ( kS*xB - (kT+kS)*xW + kT*R - F ) / mW; // SETTING UP THE (SIMULATED) PROCESS: // ----------------------------------- OutputFcn identity; DynamicSystem dynamicSystem( f,identity ); Process process( dynamicSystem,INT_RK45 ); VariablesGrid disturbance = readFromFile( "road.txt" ); if (process.setProcessDisturbance( disturbance ) != SUCCESSFUL_RETURN) exit( EXIT_FAILURE ); // DEFINE AN OPTIMAL CONTROL PROBLEM: // ---------------------------------- Function h; h << xB; h << xW; h << vB; h << vW; h << F; Matrix Q = zeros(5,5); // LSQ coefficient matrix Q(0,0) = 10.0; Q(1,1) = 10.0; Q(2,2) = 1.0; Q(3,3) = 1.0; Q(4,4) = 1.0e-8; Vector r(5); // Reference r.setAll( 0.0 ); const double tStart = 0.0; const double tEnd = 1.0; OCP ocp( tStart, tEnd, 20 ); ocp.minimizeLSQ( Q, h, r ); ocp.subjectTo( f ); ocp.subjectTo( -200.0 <= F <= 200.0 ); ocp.subjectTo( R == 0.0 ); // SETTING UP THE MPC CONTROLLER: // ------------------------------ RealTimeAlgorithm alg( ocp,0.05 ); alg.set( INTEGRATOR_TYPE, INT_RK78 ); alg.set( DYNAMIC_SENSITIVITY,FORWARD_SENSITIVITY ); // alg.set( MAX_NUM_ITERATIONS, 2 ); // alg.set( USE_IMMEDIATE_FEEDBACK,YES ); StaticReferenceTrajectory zeroReference; Controller controller( alg,zeroReference ); // SETTING UP THE SIMULATION ENVIRONMENT, RUN THE EXAMPLE... // ---------------------------------------------------------- SimulationEnvironment sim( 0.0,2.5,process,controller ); Vector x0(4); x0.setZero(); if (sim.init( x0 ) != SUCCESSFUL_RETURN) exit( EXIT_FAILURE ); if (sim.run( ) != SUCCESSFUL_RETURN) exit( EXIT_FAILURE ); // ... AND PLOT THE RESULTS // ------------------------ VariablesGrid diffStates; sim.getProcessDifferentialStates( diffStates ); VariablesGrid feedbackControl; sim.getFeedbackControl( feedbackControl ); GnuplotWindow window; window.addSubplot( diffStates(0), "Body Position [m]" ); window.addSubplot( diffStates(1), "Wheel Position [m]" ); window.addSubplot( diffStates(2), "Body Velocity [m/s]" ); window.addSubplot( diffStates(3), "Wheel Velocity [m/s]" ); window.addSubplot( feedbackControl, "Damping Force [N]" ); window.addSubplot( disturbance, "Road Excitation [m]" ); window.plot( ); return EXIT_SUCCESS; }