diff options
| author | Sébastien Crozet <sebcrozet@dimforge.com> | 2023-07-10 09:14:16 +0200 |
|---|---|---|
| committer | Sébastien Crozet <sebcrozet@dimforge.com> | 2023-12-10 12:43:13 +0100 |
| commit | a05622cfe995cb681f01bc22956addf99c208cc6 (patch) | |
| tree | 3dcd4ad86677d3c39faccbb4efbc211abc4b0b78 /src/utils.rs | |
| parent | 9f3b5c86421e957e94f14e23b7e9912ada88d7e2 (diff) | |
| download | rapier-a05622cfe995cb681f01bc22956addf99c208cc6.tar.gz rapier-a05622cfe995cb681f01bc22956addf99c208cc6.tar.bz2 rapier-a05622cfe995cb681f01bc22956addf99c208cc6.zip | |
fix: avoid perpetual movement when the target ang motor position is overshot
Diffstat (limited to 'src/utils.rs')
| -rw-r--r-- | src/utils.rs | 10 |
1 files changed, 10 insertions, 0 deletions
diff --git a/src/utils.rs b/src/utils.rs index 4cbc398..90401a4 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -804,3 +804,13 @@ impl<T> IndexMut2<usize> for [T] { } } } + +/// Calculate the difference with smallest absolute value between the two given values. +pub fn smallest_abs_diff_between_sin_angles<N: WReal>(a: N, b: N) -> N { + // Select the smallest path among the two angles to reach the target. + let s_err = a - b; + let sgn = s_err.simd_signum(); + let s_err_complement = s_err - sgn * N::splat(2.0); + let s_err_is_smallest = s_err.simd_abs().simd_lt(s_err_complement.simd_abs()); + s_err.select(s_err_is_smallest, s_err_complement) +} |
