# include  <acado_code_generation.hpp> 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								const  int  controlHorizon  =  50 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								using  namespace  std ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								# define G 9.81 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								# define TR 1.8 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								# define RW(v_ego, v_l) (v_ego * TR - (v_l - v_ego) * TR + v_ego*v_ego / (2*G) - v_l*v_l  /  (2*G)) 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								# define NORM_RW_ERROR(v_ego, v_l, p) ((RW(v_ego, v_l) + 4.0 - p) / (sqrt(v_ego + 0.5) + 0.1)) 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								int  main (  ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  USING_NAMESPACE_ACADO 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  DifferentialEquation  f ; 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  DifferentialState  x_ego ,  v_ego ,  a_ego ; 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  OnlineData  x_l ,  v_l ; 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  Control  j_ego ; 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  auto  desired  =  4.0  +  RW ( v_ego ,  v_l ) ; 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  auto  d_l  =  x_l  -  x_ego ; 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  // Equations of motion
  
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  f  < <  dot ( x_ego )  = =  v_ego ; 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  f  < <  dot ( v_ego )  = =  a_ego ; 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  f  < <  dot ( a_ego )  = =  j_ego ; 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  // Running cost
  
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  Function  h ; 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  h  < <  exp ( 0.3  *  NORM_RW_ERROR ( v_ego ,  v_l ,  d_l ) )  -  1 ; 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  h  < <  ( d_l  -  desired )  /  ( 0.05  *  v_ego  +  0.5 ) ; 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  h  < <  a_ego  *  ( 0.1  *  v_ego  +  1.0 ) ; 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  h  < <  j_ego  *  ( 0.1  *  v_ego  +  1.0 ) ; 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  // Weights are defined in mpc.
  
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  BMatrix  Q ( 4 , 4 ) ;  Q . setAll ( true ) ; 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  // Terminal cost
  
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  Function  hN ; 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  hN  < <  exp ( 0.3  *  NORM_RW_ERROR ( v_ego ,  v_l ,  d_l ) )  -  1 ; 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  hN  < <  ( d_l  -  desired )  /  ( 0.05  *  v_ego  +  0.5 ) ; 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  hN  < <  a_ego  *  ( 0.1  *  v_ego  +  1.0 ) ; 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  // Weights are defined in mpc.
  
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  BMatrix  QN ( 3 , 3 ) ;  QN . setAll ( true ) ; 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  // Non uniform time grid
  
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  // First 5 timesteps are 0.2, after that it's 0.6
  
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  DMatrix  numSteps ( 20 ,  1 ) ; 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  for  ( int  i  =  0 ;  i  <  5 ;  i + + ) { 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    numSteps ( i )  =  1 ; 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  } 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  for  ( int  i  =  5 ;  i  <  20 ;  i + + ) { 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								    numSteps ( i )  =  3 ; 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  } 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  // Setup Optimal Control Problem
  
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  const  double  tStart  =  0.0 ; 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  const  double  tEnd    =  10.0 ; 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  OCP  ocp (  tStart ,  tEnd ,  numSteps ) ; 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  ocp . subjectTo ( f ) ; 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  ocp . minimizeLSQ ( Q ,  h ) ; 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  ocp . minimizeLSQEndTerm ( QN ,  hN ) ; 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
									
										 
									 
								
							 
							
								 
							 
							
							
								  ocp . subjectTo (  - 0.1  < =  v_ego ) ; 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  ocp . setNOD ( 2 ) ; 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  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 ,  controlHorizon ) ; 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  mpc . set (  MAX_NUM_QP_ITERATIONS ,  50 ) ; 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								  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 ; 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							 
							
							
								}