10 #ifndef CTRL_UTILS_CONTROL_H_
11 #define CTRL_UTILS_CONTROL_H_
13 #include "ctrl_utils/eigen.h"
14 #include "ctrl_utils/euclidian.h"
42 template <
typename Derived1,
typename Derived2,
typename Derived3,
45 const ::Eigen::MatrixBase<Derived1>& x,
46 const ::Eigen::MatrixBase<Derived2>& x_des,
47 const ::Eigen::MatrixBase<Derived3>& dx,
48 const ::Eigen::MatrixBase<Derived5>& kp_kv,
double ddx_max = 0.,
49 typename Derived1::PlainObject* x_err_out =
nullptr) {
51 Derived5::ColsAtCompileTime == 2 || (Derived5::ColsAtCompileTime == 1 &&
52 Derived5::RowsAtCompileTime == 2),
53 "kp_kv must be a vector of size 2 or a matrix of size x.rows() x 2.");
56 typename Derived1::PlainObject x_err = x - x_des;
57 if (x_err_out !=
nullptr) {
60 typename Derived3::PlainObject dx_err = dx;
63 if (Derived5::ColsAtCompileTime == 1) {
67 x_err.array() *= -kp_kv.block(0, 0, x_err.size(), 1).array();
68 dx_err.array() *= -kp_kv.block(0, 1, dx_err.size(), 1).array();
73 const double x_err_sq_norm = x_err.squaredNorm();
74 const double ddx_max_sq = ddx_max * ddx_max;
75 if (x_err_sq_norm > ddx_max_sq) {
76 x_err *= ddx_max / std::sqrt(x_err_sq_norm);
80 return x_err + dx_err;
83 template <
typename Derived1,
typename Derived2,
typename Derived3,
84 typename Derived4,
typename Derived5>
85 inline typename Derived1::PlainObject
PdControl(
86 const ::Eigen::MatrixBase<Derived1>& x,
87 const ::Eigen::MatrixBase<Derived2>& x_des,
88 const ::Eigen::MatrixBase<Derived3>& dx,
89 const ::Eigen::MatrixBase<Derived4>& dx_des,
90 const ::Eigen::MatrixBase<Derived5>& kp_kv,
double ddx_max = 0.,
91 typename Derived1::PlainObject* x_err_out =
nullptr,
92 typename Derived3::PlainObject* dx_err_out =
nullptr) {
94 Derived5::ColsAtCompileTime == 2 || (Derived5::ColsAtCompileTime == 1 &&
95 Derived5::RowsAtCompileTime == 2),
96 "kp_kv must be a vector of size 2 or a matrix of size x.rows() x 2.");
99 typename Derived1::PlainObject x_err = x - x_des;
100 if (x_err_out !=
nullptr) {
103 typename Derived3::PlainObject dx_err = dx - dx_des;
104 if (dx_err_out !=
nullptr) {
105 *dx_err_out = dx_err;
109 if (Derived5::ColsAtCompileTime == 1) {
110 x_err = -kp_kv(0) * x_err;
111 dx_err = -kp_kv(1) * dx_err;
113 x_err = -kp_kv.block(0, 0, x_err.size(), 1).array() * x_err.array();
114 dx_err = -kp_kv.block(0, 1, dx_err.size(), 1).array() * dx_err.array();
119 const double x_err_sq_norm = x_err.squaredNorm();
120 const double ddx_max_sq = ddx_max * ddx_max;
121 if (x_err_sq_norm > ddx_max_sq) {
122 x_err *= ddx_max / std::sqrt(x_err_sq_norm);
126 return x_err + dx_err;
164 template <
typename Derived1,
typename Derived3>
166 const ::Eigen::Quaterniond& quat, const ::Eigen::Quaterniond& quat_des,
167 const ::Eigen::MatrixBase<Derived1>& w,
168 const ::Eigen::MatrixBase<Derived3>& kp_kv,
double dw_max = 0.,
169 typename Derived1::PlainObject* ori_err_out =
nullptr) {
171 (Derived3::RowsAtCompileTime == 3 && Derived3::ColsAtCompileTime == 2) ||
172 (Derived3::RowsAtCompileTime == 2 &&
173 Derived3::ColsAtCompileTime == 1),
174 "kp_kv must be a vector of size 2 or a matrix of size x.rows() x 2.");
178 if (ori_err_out !=
nullptr) {
179 *ori_err_out = ori_err;
181 typename Derived1::PlainObject w_err = w;
184 ori_err *= -kp_kv(0);
189 const double ori_err_sq_norm = ori_err.squaredNorm();
190 const double dw_max_sq = dw_max * dw_max;
191 if (ori_err_sq_norm > dw_max_sq) {
192 ori_err *= dw_max / std::sqrt(ori_err_sq_norm);
196 return ori_err + w_err;
199 template <
typename Derived1,
typename Derived2,
typename Derived3>
200 inline typename Derived1::PlainObject
PdControl(
201 const ::Eigen::Quaterniond& quat, const ::Eigen::Quaterniond& quat_des,
202 const ::Eigen::MatrixBase<Derived1>& w,
203 const ::Eigen::MatrixBase<Derived2>& w_des,
204 const ::Eigen::MatrixBase<Derived3>& kp_kv,
double dw_max = 0.,
205 typename Derived1::PlainObject* ori_err_out =
nullptr,
206 typename Derived2::PlainObject* w_err_out =
nullptr) {
208 (Derived3::RowsAtCompileTime == 3 && Derived3::ColsAtCompileTime == 2) ||
209 (Derived3::RowsAtCompileTime == 2 &&
210 Derived3::ColsAtCompileTime == 1),
211 "kp_kv must be a vector of size 2 or a matrix of size x.rows() x 2.");
215 if (ori_err_out !=
nullptr) {
216 *ori_err_out = ori_err;
218 typename Derived1::PlainObject w_err = w - w_des;
219 if (w_err_out !=
nullptr) {
224 ori_err = -kp_kv(0) * ori_err;
225 w_err = -kp_kv(1) * w_err;
229 const double ori_err_sq_norm = ori_err.squaredNorm();
230 const double dw_max_sq = dw_max * dw_max;
231 if (ori_err_sq_norm > dw_max_sq) {
232 ori_err *= dw_max / std::sqrt(ori_err_sq_norm);
236 return ori_err + w_err;
239 template <
typename Derived1,
typename Derived2,
typename Derived3,
241 inline typename Derived1::PlainObject LookatPdControl(
242 const ::Eigen::MatrixBase<Derived1>& vec,
243 const ::Eigen::MatrixBase<Derived2>& vec_des,
244 const ::Eigen::MatrixBase<Derived3>& w,
245 const ::Eigen::MatrixBase<Derived4>& kp_kv,
double dw_max = 0.,
246 typename Derived1::PlainObject* ori_err_out =
nullptr) {
248 (Derived4::RowsAtCompileTime == 3 && Derived4::ColsAtCompileTime == 2) ||
249 (Derived4::RowsAtCompileTime == 2 &&
250 Derived4::ColsAtCompileTime == 1),
251 "kp_kv must be a vector of size 2 or a matrix of size x.rows() x 2.");
254 typename Derived1::PlainObject ori_err;
256 if (ori_err_out !=
nullptr) {
257 *ori_err_out = ori_err;
261 ori_err = -kp_kv(0) * ori_err;
264 if (dw_max > 0. && ori_err.norm() > dw_max) {
265 ori_err = dw_max * ori_err.normalized();
269 return ori_err - kp_kv(1) * w;
Definition: ctrl_utils.cc:18
Eigen::Vector3d OrientationError(const Eigen::Quaterniond &quat, const Eigen::Quaterniond &quat_des)
Definition: euclidian.h:215
Derived1::PlainObject PdControl(const ::Eigen::MatrixBase< Derived1 > &x, const ::Eigen::MatrixBase< Derived2 > &x_des, const ::Eigen::MatrixBase< Derived3 > &dx, const ::Eigen::MatrixBase< Derived5 > &kp_kv, double ddx_max=0., typename Derived1::PlainObject *x_err_out=nullptr)
Definition: control.h:44
Eigen::Vector3d LookatError(const Eigen::Vector3d &vec, const Eigen::Vector3d &vec_des)
Definition: euclidian.h:224