Skip to content

Commit f3ff481

Browse files
authored
Align multi-agent LQR example with analytic derivatives
1 parent 61aadf9 commit f3ff481

1 file changed

Lines changed: 33 additions & 3 deletions

File tree

examples/multi_agent_lqr.cpp

Lines changed: 33 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)