|
20 | 20 | #include <string> |
21 | 21 | #include <memory> |
22 | 22 | #include "cddp.hpp" |
| 23 | +#include "cddp_example_utils.hpp" |
23 | 24 | #include "matplot/matplot.h" |
24 | 25 | #include <random> |
25 | 26 |
|
@@ -99,60 +100,30 @@ int main() { |
99 | 100 | // std::make_unique<cddp::ControlConstraint>( control_lower_bound, control_upper_bound)); |
100 | 101 |
|
101 | 102 | // Initial trajectory. |
102 | | - std::vector<Eigen::VectorXd> X(horizon + 1, Eigen::VectorXd::Zero(state_dim)); |
103 | | - std::vector<Eigen::VectorXd> U(horizon, Eigen::VectorXd::Zero(control_dim)); |
104 | | - // Generate initial trajectory by constant initial state |
105 | | - for (int i = 0; i < horizon + 1; ++i) { |
106 | | - X[i] = initial_state; |
107 | | - } |
108 | | - // // Generate initial trajectory by random |
109 | | - // for (int i = 0; i < horizon + 1; ++i) { |
110 | | - // std::random_device rd; |
111 | | - // std::mt19937 gen(rd()); |
112 | | - // std::uniform_real_distribution<double> dist(-0.025, 0.025); |
113 | | - // X[i] = initial_state; |
114 | | - // X[i](0) += dist(gen); |
115 | | - // X[i](1) += dist(gen); |
116 | | - // X[i](2) += dist(gen); |
117 | | - // X[i](3) += dist(gen); |
118 | | - // } |
119 | | - // for (int i = 0; i < horizon; ++i) { |
120 | | - // std::random_device rd; |
121 | | - // std::mt19937 gen(rd()); |
122 | | - // std::uniform_real_distribution<double> dist(-0.005, 0.005); |
123 | | - // U[i] = Eigen::VectorXd::Zero(control_dim); |
124 | | - // U[i](0) += dist(gen); |
125 | | - // } |
| 103 | + auto [X, U] = cddp::example::makeInitialTrajectory(initial_state, horizon, control_dim); |
126 | 104 | cddp_solver.setInitialTrajectory(X, U); |
127 | 105 |
|
128 | 106 | // Solve. |
129 | 107 | cddp::CDDPSolution solution = cddp_solver.solve(cddp::SolverType::IPDDP); |
130 | | - auto X_sol = std::any_cast<std::vector<Eigen::VectorXd>>(solution.at("state_trajectory")); |
131 | | - auto U_sol = std::any_cast<std::vector<Eigen::VectorXd>>(solution.at("control_trajectory")); |
132 | | - auto t_sol = std::any_cast<std::vector<double>>(solution.at("time_points")); |
| 108 | + const auto& X_sol = solution.state_trajectory; |
| 109 | + const auto& U_sol = solution.control_trajectory; |
| 110 | + const auto& t_sol = solution.time_points; |
133 | 111 |
|
134 | 112 | // Create plot directory. |
135 | 113 | const std::string plotDirectory = "../results/tests"; |
136 | | - if (!fs::exists(plotDirectory)) { |
137 | | - fs::create_directory(plotDirectory); |
138 | | - } |
| 114 | + cddp::example::ensurePlotDir(plotDirectory); |
139 | 115 |
|
140 | 116 | // Create a directory for frame images. |
141 | 117 | (void) std::system("mkdir -p frames"); |
142 | 118 |
|
143 | 119 | // Extract solution data. |
144 | | - std::vector<double> x_arr, x_dot_arr, theta_arr, theta_dot_arr, force_arr, time_arr, time_arr2; |
145 | | - for (size_t i = 0; i < X_sol.size(); ++i) { |
146 | | - time_arr.push_back(t_sol[i]); |
147 | | - x_arr.push_back(X_sol[i](0)); |
148 | | - theta_arr.push_back(X_sol[i](1)); |
149 | | - x_dot_arr.push_back(X_sol[i](2)); |
150 | | - theta_dot_arr.push_back(X_sol[i](3)); |
151 | | - } |
152 | | - for (size_t i = 0; i < U_sol.size(); ++i) { |
153 | | - force_arr.push_back(U_sol[i](0)); |
154 | | - time_arr2.push_back(t_sol[i]); |
155 | | - } |
| 120 | + auto x_arr = cddp::example::extractComponent(X_sol, 0); |
| 121 | + auto theta_arr = cddp::example::extractComponent(X_sol, 1); |
| 122 | + auto x_dot_arr = cddp::example::extractComponent(X_sol, 2); |
| 123 | + auto theta_dot_arr = cddp::example::extractComponent(X_sol, 3); |
| 124 | + auto force_arr = cddp::example::extractComponent(U_sol, 0); |
| 125 | + const auto& time_arr = t_sol; |
| 126 | + std::vector<double> time_arr2(t_sol.begin(), t_sol.begin() + U_sol.size()); |
156 | 127 |
|
157 | 128 | // --- Plot static results (2x2 plots for state trajectories) --- |
158 | 129 | auto fig1 = figure(); |
|
0 commit comments