Fix NaN resulting from non-clamped input to simd_asin in angular motor solver (#840)
* Fix non-clamped input to simd_asin in motor_angular * Fix implementation & cleanup * Cleanup * Fix formatting
This commit is contained in:
@@ -753,10 +753,20 @@ impl<N: SimdRealCopy> JointTwoBodyConstraintHelper<N> {
|
|||||||
|
|
||||||
let mut rhs_wo_bias = N::zero();
|
let mut rhs_wo_bias = N::zero();
|
||||||
if motor_params.erp_inv_dt != N::zero() {
|
if motor_params.erp_inv_dt != N::zero() {
|
||||||
|
let ang_dist;
|
||||||
|
|
||||||
#[cfg(feature = "dim2")]
|
#[cfg(feature = "dim2")]
|
||||||
let ang_dist = self.ang_err.angle();
|
{
|
||||||
|
ang_dist = self.ang_err.angle();
|
||||||
|
}
|
||||||
|
|
||||||
#[cfg(feature = "dim3")]
|
#[cfg(feature = "dim3")]
|
||||||
let ang_dist = self.ang_err.imag()[_motor_axis].simd_asin() * N::splat(2.0);
|
{
|
||||||
|
// Clamp the component from -1.0 to 1.0 to account for slight imprecision
|
||||||
|
let clamped_err = self.ang_err.imag()[_motor_axis].simd_clamp(-N::one(), N::one());
|
||||||
|
ang_dist = clamped_err.simd_asin() * N::splat(2.0);
|
||||||
|
}
|
||||||
|
|
||||||
let target_ang = motor_params.target_pos;
|
let target_ang = motor_params.target_pos;
|
||||||
rhs_wo_bias += utils::smallest_abs_diff_between_angles(ang_dist, target_ang)
|
rhs_wo_bias += utils::smallest_abs_diff_between_angles(ang_dist, target_ang)
|
||||||
* motor_params.erp_inv_dt;
|
* motor_params.erp_inv_dt;
|
||||||
|
|||||||
Reference in New Issue
Block a user