From 4332818e021644aa716e7ef0cca774cab09f4860 Mon Sep 17 00:00:00 2001 From: Fun Maker Date: Sun, 21 Apr 2024 20:48:35 +0200 Subject: Fix joint limits not being flipped in one body constrains. (#549) --- src/dynamics/joint/generic_joint.rs | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) (limited to 'src/dynamics/joint') diff --git a/src/dynamics/joint/generic_joint.rs b/src/dynamics/joint/generic_joint.rs index 76a7fe1..98f9311 100644 --- a/src/dynamics/joint/generic_joint.rs +++ b/src/dynamics/joint/generic_joint.rs @@ -496,6 +496,26 @@ impl GenericJoint { self.motors[i].damping = damping; self } + + /// Flips the orientation of the joint, including limits and motors. + pub fn flip(&mut self) -> &mut Self { + std::mem::swap(&mut self.local_frame1, &mut self.local_frame2); + + let coupled_bits = self.coupled_axes.bits(); + + for dim in 0..SPATIAL_DIM { + if coupled_bits & (1 << dim) == 0 { + let limit = self.limits[dim]; + self.limits[dim].min = -limit.max; + self.limits[dim].max = -limit.min; + } + + self.motors[dim].target_vel = -self.motors[dim].target_vel; + self.motors[dim].target_pos = -self.motors[dim].target_pos; + } + + self + } } macro_rules! joint_conversion_methods( -- cgit