@@ -28,18 +28,48 @@ create_linear_lqr_ocp( int n_x, int n_u, double dt, int T )
2828 ocp.control_dim = n_u;
2929 ocp.dt = dt;
3030 ocp.horizon_steps = T;
31- ocp.initial_state = Eigen::VectorXd::Random ( n_x );
31+ Eigen::VectorXd initial_state = Eigen::VectorXd::Zero ( n_x );
32+ if ( n_x > 0 )
33+ initial_state[0 ] = 1.0 ;
34+ ocp.initial_state = initial_state;
3235
3336 Eigen::MatrixXd A = Eigen::MatrixXd::Identity ( n_x, n_x );
3437 Eigen::MatrixXd B = Eigen::MatrixXd::Identity ( n_x, n_u );
3538 ocp.dynamics = [A, B]( const State& x, const Control& u ) { return A * x + B * u; };
39+ ocp.dynamics_state_jacobian
40+ = [A]( const MotionModel&, const State&, const Control& ) { return A; };
41+ ocp.dynamics_control_jacobian
42+ = [B]( const MotionModel&, const State&, const Control& ) { return B; };
3643
3744 Eigen::MatrixXd Q = Eigen::MatrixXd::Identity ( n_x, n_x );
3845 Eigen::MatrixXd R = Eigen::MatrixXd::Identity ( n_u, n_u );
39- ocp.stage_cost = [Q, R]( const State& x, const Control& u, std::size_t ) {
46+ Eigen::MatrixXd Qf = Q;
47+ const Eigen::MatrixXd Qt = Q + Q.transpose ();
48+ const Eigen::MatrixXd Rt = R + R.transpose ();
49+ const Eigen::MatrixXd Qf_sym = Qf + Qf.transpose ();
50+ ocp.stage_cost = [Q, R]( const State& x, const Control& u, std::size_t ) {
4051 return ( x.transpose () * Q * x ).value () + ( u.transpose () * R * u ).value ();
4152 };
42- ocp.terminal_cost = []( const State& ) { return 0.0 ; };
53+ ocp.cost_state_gradient = [Qt]( const StageCostFunction&, const State& x, const Control&, std::size_t ) {
54+ return Qt * x;
55+ };
56+ ocp.cost_control_gradient = [Rt]( const StageCostFunction&, const State&, const Control& u, std::size_t ) {
57+ return Rt * u;
58+ };
59+ ocp.cost_state_hessian = [Qt]( const StageCostFunction&, const State&, const Control&, std::size_t ) {
60+ return Qt;
61+ };
62+ ocp.cost_control_hessian = [Rt]( const StageCostFunction&, const State&, const Control&, std::size_t ) {
63+ return Rt;
64+ };
65+ ocp.cost_cross_term = [n_x, n_u]( const StageCostFunction&, const State&, const Control&, std::size_t ) {
66+ return Eigen::MatrixXd::Zero ( n_u, n_x );
67+ };
68+ ocp.terminal_cost = [Qf]( const State& x ) { return ( x.transpose () * Qf * x ).value (); };
69+ ocp.terminal_cost_gradient
70+ = [Qf_sym]( const TerminalCostFunction&, const State& x ) { return Qf_sym * x; };
71+ ocp.terminal_cost_hessian
72+ = [Qf_sym]( const TerminalCostFunction&, const State& ) { return Qf_sym; };
4373
4474 ocp.initialize_problem ();
4575 ocp.verify_problem ();
0 commit comments