Skip to content

Commit 86a257d

Browse files
authored
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
1 parent 9c9ba45 commit 86a257d

File tree

1 file changed

+12
-2
lines changed

1 file changed

+12
-2
lines changed

src/dynamics/solver/joint_constraint/joint_constraint_builder.rs

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -753,10 +753,20 @@ impl<N: SimdRealCopy> JointTwoBodyConstraintHelper<N> {
753753

754754
let mut rhs_wo_bias = N::zero();
755755
if motor_params.erp_inv_dt != N::zero() {
756+
let ang_dist;
757+
756758
#[cfg(feature = "dim2")]
757-
let ang_dist = self.ang_err.angle();
759+
{
760+
ang_dist = self.ang_err.angle();
761+
}
762+
758763
#[cfg(feature = "dim3")]
759-
let ang_dist = self.ang_err.imag()[_motor_axis].simd_asin() * N::splat(2.0);
764+
{
765+
// Clamp the component from -1.0 to 1.0 to account for slight imprecision
766+
let clamped_err = self.ang_err.imag()[_motor_axis].simd_clamp(-N::one(), N::one());
767+
ang_dist = clamped_err.simd_asin() * N::splat(2.0);
768+
}
769+
760770
let target_ang = motor_params.target_pos;
761771
rhs_wo_bias += utils::smallest_abs_diff_between_angles(ang_dist, target_ang)
762772
* motor_params.erp_inv_dt;

0 commit comments

Comments
 (0)