Skip to content

Commit 845a1bf

Browse files
Merge pull request #7 from astomodynamics/ros_integration_test
Ros integration test
2 parents 60133ed + 7401cfc commit 845a1bf

File tree

4 files changed

+62
-37
lines changed

4 files changed

+62
-37
lines changed

include/cddp/cddp_core/CDDPProblem.hpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ struct CDDPOptions {
4747

4848
class CDDPProblem {
4949
public:
50-
CDDPProblem(DynamicalSystem* system, const Eigen::VectorXd& initialState, int horizon, double dt);
50+
CDDPProblem(const Eigen::VectorXd& initial_state, const Eigen::VectorXd& goal_state, int horizon, double dt);
5151

5252
// Problem Setup
5353
void setInitialState(const Eigen::VectorXd& x0);
@@ -59,6 +59,7 @@ class CDDPProblem {
5959
void setOptions(const CDDPOptions& opts);
6060
void setInitialTrajectory(const std::vector<Eigen::VectorXd>& X, const std::vector<Eigen::VectorXd>& U);
6161
void initializeCost();
62+
void setDynamicalSystem(std::unique_ptr<DynamicalSystem> dynamics);
6263
void setObjective(std::unique_ptr<Objective> objective);
6364
void addConstraint(std::unique_ptr<Constraint> constraint);
6465
Eigen::VectorXd getInitialState() { return initial_state_; }
@@ -98,7 +99,7 @@ class CDDPProblem {
9899

99100
private:
100101
// Problem Data
101-
DynamicalSystem* dynamics_;
102+
std::unique_ptr<DynamicalSystem> dynamics_;
102103
Eigen::VectorXd initial_state_;
103104
Eigen::VectorXd goal_state_;
104105
int horizon_;

include/cddp/model/DubinsCar.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
#include "Eigen/Dense"
55
#include <vector>
6-
#include "../cddp_core/DynamicalSystem.hpp"
6+
#include "cddp_core/DynamicalSystem.hpp"
77

88
namespace cddp {
99

src/cddp_core/CDDPProblem.cpp

Lines changed: 45 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
#include <iostream>
2+
#include <chrono>
23
#include <vector>
34
#include "Eigen/Dense"
45
#include "Eigen/Sparse"
@@ -19,32 +20,15 @@ TODO
1920
namespace cddp {
2021

2122
// Constructor
22-
CDDPProblem::CDDPProblem(cddp::DynamicalSystem* system, const Eigen::VectorXd& initialState, int horizon, double timestep) :
23-
dynamics_(system),
24-
initial_state_(initialState),
25-
goal_state_(initialState), // Pre-allocate goal to initialState
23+
CDDPProblem::CDDPProblem(const Eigen::VectorXd& initial_state, const Eigen::VectorXd& goal_state, int horizon, double timestep) :
24+
initial_state_(initial_state),
25+
goal_state_(goal_state), // Pre-allocate goal to initialState
2626
horizon_(horizon),
2727
dt_(timestep)
2828
{
2929
// Initialize Trajectory
30-
X_.resize(horizon + 1, initial_state_);
31-
U_.resize(horizon, Eigen::VectorXd::Zero(system->control_size_));
32-
33-
// Initialize Intermediate Cost
34-
J_ = 0.0;
35-
36-
k_.resize(horizon, Eigen::VectorXd::Zero(system->control_size_));
37-
K_.resize(horizon, Eigen::MatrixXd::Zero(system->control_size_, system->state_size_));
38-
39-
// Initialize Intermediate value function
40-
V_.resize(horizon + 1, 0.0);
41-
V_X_.resize(horizon + 1, Eigen::VectorXd::Zero(system->state_size_));
42-
V_XX_.resize(horizon + 1, Eigen::MatrixXd::Zero(system->state_size_, system->state_size_));
43-
44-
// Initialize Q-function Matrices
45-
Q_UU_.resize(horizon, Eigen::MatrixXd::Zero(system->control_size_, system->control_size_));
46-
Q_UX_.resize(horizon, Eigen::MatrixXd::Zero(system->control_size_, system->state_size_));
47-
Q_U_.resize(horizon, Eigen::VectorXd::Zero(system->control_size_));
30+
// X_.resize(horizon + 1, initial_state_);
31+
// U_.resize(horizon, Eigen::VectorXd::Zero(system->control_size_));
4832
}
4933

5034
// Setup Methods
@@ -83,6 +67,32 @@ void CDDPProblem::setOptions(const CDDPOptions& opts) {
8367
options_ = opts;
8468
}
8569

70+
void CDDPProblem::setDynamicalSystem(std::unique_ptr<DynamicalSystem> dynamics) {
71+
dynamics_ = std::move(dynamics);
72+
73+
// Initialize Trajectory
74+
X_.resize(horizon_ + 1, initial_state_);
75+
U_.resize(horizon_, Eigen::VectorXd::Zero(dynamics_->control_size_));
76+
77+
// Initialize Intermediate Cost
78+
J_ = 0.0;
79+
80+
// Initialize Control Gains
81+
k_.resize(horizon_, Eigen::VectorXd::Zero(dynamics_->control_size_));
82+
K_.resize(horizon_, Eigen::MatrixXd::Zero(dynamics_->control_size_, dynamics_->state_size_));
83+
84+
// Initialize Intermediate value function
85+
V_.resize(horizon_ + 1, 0.0);
86+
V_X_.resize(horizon_ + 1, Eigen::VectorXd::Zero(dynamics_->state_size_));
87+
V_XX_.resize(horizon_ + 1, Eigen::MatrixXd::Zero(dynamics_->state_size_, dynamics_->state_size_));
88+
89+
// Initialize Q-function Matrices
90+
Q_UU_.resize(horizon_, Eigen::MatrixXd::Zero(dynamics_->control_size_, dynamics_->control_size_));
91+
Q_UX_.resize(horizon_, Eigen::MatrixXd::Zero(dynamics_->control_size_, dynamics_->state_size_));
92+
Q_U_.resize(horizon_, Eigen::VectorXd::Zero(dynamics_->control_size_));
93+
94+
}
95+
8696
void CDDPProblem::setObjective(std::unique_ptr<Objective> objective) {
8797
objective_ = std::move(objective);
8898
}
@@ -160,10 +170,13 @@ std::vector<Eigen::VectorXd> CDDPProblem::solve() {
160170
double J = std::numeric_limits<double>::infinity();
161171
double gradientNorm = std::numeric_limits<double>::infinity();
162172

173+
// Start the timer
174+
auto start_time = std::chrono::high_resolution_clock::now();
175+
163176
// 2. Main CDDP Iterative Loop
164177
for (int iter = 0; iter < options_.max_iterations; ++iter) {
165178
std::cout << "Iteration: " << iter << std::endl;
166-
std::cout << "Cost " << J_ << std::endl;
179+
std::cout << "Cost " << J_ << std::endl;
167180
double J_old = J;
168181
// 3. Backward
169182
bool backward_pass_done = solveBackwardPass();
@@ -200,6 +213,15 @@ std::cout << "Cost " << J_ << std::endl;
200213

201214
}
202215

216+
// Stop the timer
217+
auto end_time = std::chrono::high_resolution_clock::now();
218+
219+
// Calculate the elapsed time
220+
auto duration = std::chrono::duration_cast<std::chrono::milliseconds>(end_time - start_time);
221+
222+
// Print the elapsed time
223+
std::cout << "Solver time: " << duration.count() << " ms" << std::endl;
224+
203225
// 6. Return Optimal Control Sequence
204226
// place holder
205227
return U_;

test/CDDPProblemTests.cpp

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -10,22 +10,25 @@ using namespace cddp;
1010
bool testBasicCDDP() {
1111
int state_dim = 3;
1212
int control_dim = 2;
13-
double dt = 0.05;
13+
double dt = 0.03;
1414
int horizon = 100;
1515
int integration_type = 0; // 0 for Euler, 1 for Heun, 2 for RK3, 3 for RK4
1616

1717
// Problem Setup
18-
Eigen::VectorXd initialState(state_dim);
19-
initialState << 0.0, 0.0, 0.0; // Initial state
18+
Eigen::VectorXd initial_state(state_dim);
19+
initial_state << 0.0, 0.0, M_PI/4.0; // Initial state
2020

21-
DubinsCar system(state_dim, control_dim, dt, integration_type); // Your DoubleIntegrator instance
22-
CDDPProblem cddp_solver(&system, initialState, horizon, dt);
23-
24-
// Set goal state if needed
21+
// Set goal state
2522
Eigen::VectorXd goal_state(state_dim);
2623
goal_state << 2.0, 2.0, M_PI/2.0;
27-
cddp_solver.setGoalState(goal_state);
2824

25+
DubinsCar system(state_dim, control_dim, dt, integration_type); // Your DoubleIntegrator instance
26+
CDDPProblem cddp_solver(initial_state, goal_state, horizon, dt);
27+
28+
// Set dynamical system
29+
cddp_solver.setDynamicalSystem(std::make_unique<DubinsCar>(system));
30+
31+
2932
// Simple Cost Matrices
3033
Eigen::MatrixXd Q(state_dim, state_dim);
3134
Q << 0e-2, 0, 0,
@@ -43,10 +46,10 @@ bool testBasicCDDP() {
4346

4447
// Add constraints
4548
Eigen::VectorXd lower_bound(control_dim);
46-
lower_bound << -0.1, -M_PI;
49+
lower_bound << -1.0, -M_PI;
4750

4851
Eigen::VectorXd upper_bound(control_dim);
49-
upper_bound << 0.1, M_PI;
52+
upper_bound << 1.0, M_PI;
5053

5154
ControlBoxConstraint control_constraint(lower_bound, upper_bound);
5255
cddp_solver.addConstraint(std::make_unique<ControlBoxConstraint>(control_constraint));
@@ -64,7 +67,6 @@ bool testBasicCDDP() {
6467
// Set initial trajectory if needed
6568
std::vector<Eigen::VectorXd> X = std::vector<Eigen::VectorXd>(horizon + 1, Eigen::VectorXd::Zero(state_dim));
6669
std::vector<Eigen::VectorXd> U = std::vector<Eigen::VectorXd>(horizon, Eigen::VectorXd::Zero(control_dim));
67-
// X.front() = initialState;
6870
cddp_solver.setInitialTrajectory(X, U);
6971

7072
// Solve!

0 commit comments

Comments
 (0)