@@ -61,20 +61,23 @@ inline typename Derived1::PlainObject PdControl(
61
61
62
62
// Apply gains.
63
63
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 );
66
66
} 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 ();
69
69
}
70
70
71
71
// Limit maximum error
72
72
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);
75
77
}
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);
78
81
}
79
82
}
80
83
@@ -183,16 +186,19 @@ inline typename Derived1::PlainObject PdControl(
183
186
typename Derived1::PlainObject w_err = w;
184
187
185
188
// 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 );
188
191
189
192
// Limit maximum error
190
193
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);
193
198
}
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);
196
202
}
197
203
}
198
204
0 commit comments