@@ -9,16 +9,16 @@ namespace cddp {
9
9
class Objective {
10
10
public:
11
11
12
- virtual double calculateRunningCost (const Eigen::VectorXd& state, const Eigen::VectorXd& control) const = 0;
13
- virtual std::tuple<Eigen::MatrixXd, Eigen::MatrixXd> calculateRunningCostGradient (const Eigen::VectorXd& state, const Eigen::VectorXd& control) const = 0;
14
- virtual std::tuple<Eigen::MatrixXd, Eigen::MatrixXd, Eigen::MatrixXd> calculateRunningCostHessian (const Eigen::VectorXd& state, const Eigen::VectorXd& control) const = 0;
12
+ virtual double calculateRunningCost (const Eigen::VectorXd& state, const Eigen::VectorXd& control, int index ) const = 0;
13
+ virtual std::tuple<Eigen::MatrixXd, Eigen::MatrixXd> calculateRunningCostGradient (const Eigen::VectorXd& state, const Eigen::VectorXd& control, int index ) const = 0;
14
+ virtual std::tuple<Eigen::MatrixXd, Eigen::MatrixXd, Eigen::MatrixXd> calculateRunningCostHessian (const Eigen::VectorXd& state, const Eigen::VectorXd& control, int index ) const = 0;
15
15
virtual double calculateFinalCost (const Eigen::VectorXd& state) const = 0;
16
16
virtual Eigen::VectorXd calculateFinalCostGradient (const Eigen::VectorXd& state) const = 0;
17
17
virtual Eigen::MatrixXd calculateFinalCostHessian (const Eigen::VectorXd& state) const = 0;
18
- virtual double calculateCost (const Eigen::MatrixXd& state , const Eigen::MatrixXd& control ) const = 0;
18
+ virtual double calculateCost (const std::vector< Eigen::VectorXd>& X , const std::vector< Eigen::VectorXd>& U ) const = 0;
19
19
};
20
20
21
- // Example: Cost Function
21
+ // Example: Quadratic Cost Function
22
22
class QuadraticCost : public Objective {
23
23
private:
24
24
Eigen::MatrixXd Q_;
@@ -30,29 +30,29 @@ class QuadraticCost : public Objective{
30
30
public:
31
31
QuadraticCost (const Eigen::MatrixXd& Q, const Eigen::MatrixXd& R, const Eigen::MatrixXd &Qf, Eigen::VectorXd &goal_state, double timestep) : Q_(Q), R_(R), Qf_(Qf), goal_state_(goal_state), timestep_(timestep) {}
32
32
33
- double calculateCost (const Eigen::MatrixXd & X, const Eigen::MatrixXd & U) const override {
33
+ double calculateCost (const std::vector< Eigen::VectorXd> & X, const std::vector< Eigen::VectorXd> & U) const override {
34
34
double cost = 0.0 ;
35
- for (int i = 0 ; i < U.cols (); i++) {
36
- cost += calculateRunningCost (X. col (i) , U. col (i) );
35
+ for (int i = 0 ; i < U.size (); i++) {
36
+ cost += calculateRunningCost (X[i] , U[i], i );
37
37
}
38
- cost += calculateFinalCost (X. col (X. cols () - 1 ) );
38
+ cost += calculateFinalCost (X[X. size () - 1 ] );
39
39
return cost;
40
40
}
41
-
42
- double calculateRunningCost (const Eigen::VectorXd& x, const Eigen::VectorXd& u) const override {
41
+
42
+ double calculateRunningCost (const Eigen::VectorXd& x, const Eigen::VectorXd& u, int k ) const override {
43
43
double cost = 0.0 ; // Initialize cost to 0
44
44
cost += 0.5 * ((x - goal_state_).transpose () * Q_ * (x - goal_state_)).value () * timestep_;
45
45
cost += 0.5 * (u.transpose () * R_ * u).value () * timestep_;
46
46
return cost;
47
47
}
48
48
49
- std::tuple<Eigen::MatrixXd, Eigen::MatrixXd> calculateRunningCostGradient (const Eigen::VectorXd& x, const Eigen::VectorXd& u) const override {
49
+ std::tuple<Eigen::MatrixXd, Eigen::MatrixXd> calculateRunningCostGradient (const Eigen::VectorXd& x, const Eigen::VectorXd& u, int k ) const override {
50
50
Eigen::VectorXd l_x = Q_ * (x - goal_state_) * timestep_;
51
51
Eigen::VectorXd l_u = R_ * u * timestep_;
52
52
return std::make_tuple (l_x, l_u);
53
53
}
54
54
55
- std::tuple<Eigen::MatrixXd, Eigen::MatrixXd, Eigen::MatrixXd> calculateRunningCostHessian (const Eigen::VectorXd& x, const Eigen::VectorXd& u) const override {
55
+ std::tuple<Eigen::MatrixXd, Eigen::MatrixXd, Eigen::MatrixXd> calculateRunningCostHessian (const Eigen::VectorXd& x, const Eigen::VectorXd& u, int k ) const override {
56
56
Eigen::MatrixXd l_xx = Q_ * timestep_;
57
57
Eigen::MatrixXd l_ux = Eigen::MatrixXd::Zero (R_.rows (), Q_.rows ());
58
58
Eigen::MatrixXd l_uu = R_ * timestep_;
@@ -71,6 +71,62 @@ class QuadraticCost : public Objective{
71
71
return Qf_;
72
72
}
73
73
};
74
+
75
+ // Example: Quadratic Tracking Cost Function
76
+ class QuadraticTrackingCost : public Objective {
77
+ private:
78
+ Eigen::MatrixXd Q_;
79
+ Eigen::MatrixXd R_;
80
+ Eigen::MatrixXd Qf_;
81
+ std::vector<Eigen::VectorXd> X_ref_;
82
+ Eigen::VectorXd goal_state_;
83
+ double timestep_;
84
+
85
+ public:
86
+ QuadraticTrackingCost (const Eigen::MatrixXd& Q, const Eigen::MatrixXd& R, const Eigen::MatrixXd &Qf, std::vector<Eigen::VectorXd> &X_ref, Eigen::VectorXd &goal_state, double timestep) : Q_(Q), R_(R), Qf_(Qf), X_ref_(X_ref), goal_state_(goal_state), timestep_(timestep) {}
87
+
88
+ double calculateCost (const std::vector<Eigen::VectorXd>& X, const std::vector<Eigen::VectorXd>& U) const override {
89
+ double cost = 0.0 ;
90
+ for (int i = 0 ; i < U.size (); i++) {
91
+ cost += calculateRunningCost (X[i], U[i], i);
92
+ }
93
+ cost += calculateFinalCost (X[X.size () - 1 ]);
94
+ return cost;
95
+ }
96
+
97
+ double calculateRunningCost (const Eigen::VectorXd& x, const Eigen::VectorXd& u, int k) const override {
98
+ double cost = 0.0 ; // Initialize cost to 0
99
+ cost += 0.5 * ((x - X_ref_[k]).transpose () * Q_ * (x - X_ref_[k])).value () * timestep_;
100
+ cost += 0.5 * (u.transpose () * R_ * u).value () * timestep_;
101
+ return cost;
102
+ }
103
+
104
+ std::tuple<Eigen::MatrixXd, Eigen::MatrixXd> calculateRunningCostGradient (const Eigen::VectorXd& x, const Eigen::VectorXd& u, int k) const override {
105
+ Eigen::VectorXd l_x = Q_ * (x - X_ref_[k]) * timestep_;
106
+ Eigen::VectorXd l_u = R_ * u * timestep_;
107
+ return std::make_tuple (l_x, l_u);
108
+ }
109
+
110
+ std::tuple<Eigen::MatrixXd, Eigen::MatrixXd, Eigen::MatrixXd> calculateRunningCostHessian (const Eigen::VectorXd& x, const Eigen::VectorXd& u, int k) const override {
111
+ Eigen::MatrixXd l_xx = Q_ * timestep_;
112
+ Eigen::MatrixXd l_ux = Eigen::MatrixXd::Zero (R_.rows (), Q_.rows ());
113
+ Eigen::MatrixXd l_uu = R_ * timestep_;
114
+ return std::make_tuple (l_xx, l_ux, l_uu);
115
+ }
116
+
117
+ double calculateFinalCost (const Eigen::VectorXd& x) const override {
118
+ return 0.5 * ((x - goal_state_).transpose () * Qf_ * (x - goal_state_)).value ();
119
+ }
120
+
121
+ Eigen::VectorXd calculateFinalCostGradient (const Eigen::VectorXd& x) const override {
122
+ return Qf_ * (x - goal_state_);
123
+ }
124
+
125
+ Eigen::MatrixXd calculateFinalCostHessian (const Eigen::VectorXd& x) const override {
126
+ return Qf_;
127
+ }
128
+
129
+ };
74
130
} // namespace cddp
75
131
76
132
#endif // CDDP_OBJECTIVE_HPP
0 commit comments