Skip to content

Commit c2cfb34

Browse files
committed
PdControl speedup
1 parent abe9ecf commit c2cfb34

File tree

1 file changed

+20
-14
lines changed

1 file changed

+20
-14
lines changed

include/ctrl_utils/control.h

Lines changed: 20 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -61,20 +61,23 @@ inline typename Derived1::PlainObject PdControl(
6161

6262
// Apply gains.
6363
if (Derived5::ColsAtCompileTime == 1) {
64-
x_err = -kp_kv(0) * x_err;
65-
dx_err = -kp_kv(1) * dx_err;
64+
x_err *= -kp_kv(0);
65+
dx_err *= -kp_kv(1);
6666
} else {
67-
x_err = -kp_kv.block(0, 0, x_err.size(), 1).array() * x_err.array();
68-
dx_err = -kp_kv.block(0, 1, dx_err.size(), 1).array() * dx_err.array();
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();
6969
}
7070

7171
// Limit maximum error
7272
if (ddx_max > 0.) {
73-
if (x_err.norm() > ddx_max) {
74-
x_err = ddx_max * x_err.normalized();
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);
7577
}
76-
if (dx_err.norm() > ddx_max) {
77-
dx_err = ddx_max * dx_err.normalized();
78+
const double dx_err_sq_norm = dx_err.squaredNorm();
79+
if (dx_err_sq_norm > ddx_max_sq) {
80+
dx_err *= ddx_max / std::sqrt(dx_err_sq_norm);
7881
}
7982
}
8083

@@ -183,16 +186,19 @@ inline typename Derived1::PlainObject PdControl(
183186
typename Derived1::PlainObject w_err = w;
184187

185188
// Apply kp .
186-
ori_err = -kp_kv(0) * ori_err;
187-
w_err = -kp_kv(1) * w_err;
189+
ori_err *= -kp_kv(0);
190+
w_err *= -kp_kv(1);
188191

189192
// Limit maximum error
190193
if (dw_max > 0.) {
191-
if (ori_err.norm() > dw_max) {
192-
ori_err = dw_max * ori_err.normalized();
194+
const double ori_err_sq_norm = ori_err.squaredNorm();
195+
const double dw_max_sq = dw_max * dw_max;
196+
if (ori_err_sq_norm > dw_max_sq) {
197+
ori_err *= dw_max / std::sqrt(ori_err_sq_norm);
193198
}
194-
if (w_err.norm() > dw_max) {
195-
w_err = dw_max * w_err.normalized();
199+
const double w_err_sq_norm = w_err.squaredNorm();
200+
if (w_err_sq_norm > dw_max_sq) {
201+
w_err *= dw_max / std::sqrt(w_err_sq_norm);
196202
}
197203
}
198204

0 commit comments

Comments
 (0)