Notifications
Clear all

[Closed] Radial Limit/Preventing IK popping

Greetings

I’m onto my next big project which involves controlling some rather large robot arms…

What is the best way to prevent the snapping, or ‘popping into position’ which happens as the bones in an HI IK solver approach 0/180 degrees? I’m aiming to do an FK/IK/IK rig on a 2 joint solver (one IK solver that bends upwards, and one that bends downwards, as well as FK. This is because the second joint in the arm can rotate more than 180 degrees)

As the real world control system I’m designing this 3ds rig to interface with only supports instantaneous switching between solvers, rather than blends, I was really hoping to be able to reach this straight out position, as it is a valid position common to both solvers. However, the resulting snap when approaching this straight out position is keeping this from being safely applicable in the real world.

If I restrict* the reach of the arm under IK control by 50mm (out of roughly 24m) The acceleration caused by the popping into position drops from 150degrees/s/s to 20degrees/s/s, but this would leave this position unreachable by the other solver, without significant rotation of the joints necessitating a transition between IK up and IK down using FK control. This is entirely possible, but will add a lot of slow programming time I’m trying to avoid.

Restricting the motion another 50mm halves that acceleration again.

If it sounds like what I am trying is not possible, I have some contingency plans, including going down the road of investing in a custom solver. So would be happy for general advice, and any solutions which may not be obvious. Playing with threshold, and solver Iterations has negligible effect.

Cheers

Mikie

  • A clean way of implementing limits like the below will be my next goal. So far, all I can think of is adding a position list/with an extra pos expression controller to the IK control helpers, which doesn’t seem ideal?

maxReach = 23850;
$IK_UP_TGT.pos = ((normalize ($IK_UP_TGT.pos – $Arm_Base.pos)) * maxReach ) + $Arm_Base.pos