Moving average quaternions flip unintentionally #460

Closed
opened 2026-04-05 19:01:42 +02:00 by MrUnknownDE · 0 comments
Owner

Originally created by @ButterscotchV on 3/10/2025

Moved from Discord: https://discord.com/channels/817184208525983775/948579740225261598/1333736861293744138

It seems like in QuaternionMovingAverage, there's addQuaternion which happens every dataTick and then update that happens every tick, I think the desync between dataTick and tick could be causing the tracker's rotation to be inverted when big server slowdowns happen.

I'm not exactly sure that's what's happening as I can't actually recreate it myself, but I think that's a fairly plausible explanation, as the tracker's rotation only needs to change by 90 degrees in that time, which if you're stuttering badly, I could see easily happen when turning around or something. This is worsened when using smoothing or prediction, as it also adds the latency of smoothing or latency/overshoot from prediction into the 90 degree change required.

I propose that the tracker's positive/negative rotation should be tracked in dataTick, then non-tracked interpolation can be done from that on tick for smoothing/prediction. The range for swapping positive/negative could also be reduced, making it something more like a 100-135 degree angle required so that it's less likely to happen. Ideally we'd just track this on the tracker itself, but if we really need to track it in the server, then so-be-it.

We could probably also try to be smart and assume 180 degree bends in the body probably aren't quite right and correct for it, but idk about that.

This is still a big issue, we now have a minor workaround for waist interpolation, so we can handle inversion for it (though it still happens), but this code is now what's preventing foot plant and toe snap from functioning properly. This may also be related to full/yaw reset? Will need to be looked into further.

*Originally created by @ButterscotchV on 3/10/2025* Moved from Discord: https://discord.com/channels/817184208525983775/948579740225261598/1333736861293744138 > It seems like in `QuaternionMovingAverage`, there's `addQuaternion` which happens every `dataTick` and then `update` that happens every `tick`, I think the desync between `dataTick` and `tick` could be causing the tracker's rotation to be inverted when big server slowdowns happen. > > I'm not exactly sure that's what's happening as I can't actually recreate it myself, but I think that's a fairly plausible explanation, as the tracker's rotation only needs to change by 90 degrees in that time, which if you're stuttering badly, I could see easily happen when turning around or something. This is worsened when using smoothing or prediction, as it also adds the latency of smoothing or latency/overshoot from prediction into the 90 degree change required. > > I propose that the tracker's positive/negative rotation should be tracked in `dataTick`, then non-tracked interpolation can be done from that on `tick` for smoothing/prediction. The range for swapping positive/negative could also be reduced, making it something more like a 100-135 degree angle required so that it's less likely to happen. Ideally we'd just track this on the tracker itself, but if we really need to track it in the server, then so-be-it. > > We could probably also try to be smart and assume 180 degree bends in the body probably aren't quite right and correct for it, but idk about that. This is still a big issue, we now have a minor workaround for waist interpolation, so we can handle inversion for it (though it still happens), but this code is now what's preventing foot plant and toe snap from functioning properly. This may also be related to full/yaw reset? Will need to be looked into further.
MrUnknownDE added the Area: ServerPriority: LowType: BugArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerPriority: LowPriority: LowPriority: LowPriority: LowPriority: LowPriority: LowPriority: LowPriority: LowPriority: LowPriority: LowPriority: LowPriority: LowPriority: LowType: BugType: BugType: BugType: BugType: BugType: BugType: BugType: BugType: BugType: BugType: BugType: BugType: BugType: BugType: BugType: BugType: BugType: BugType: BugType: BugType: BugType: BugType: BugType: BugType: BugType: BugType: BugType: BugType: BugType: BugType: BugType: BugType: BugType: BugType: BugType: BugType: BugType: BugType: BugType: BugType: BugType: BugType: BugType: BugType: BugType: BugType: BugType: BugType: BugType: BugType: BugType: BugType: BugType: BugType: BugType: BugType: BugType: BugType: BugType: BugType: BugType: BugType: BugType: BugType: BugType: BugType: BugType: BugType: BugType: BugType: BugType: BugType: BugType: BugType: BugType: BugType: BugType: BugType: Bug labels 2026-04-05 19:02:05 +02:00
Sign in to join this conversation.
No Label Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Priority: Low Priority: Low Priority: Low Priority: Low Priority: Low Priority: Low Priority: Low Priority: Low Priority: Low Priority: Low Priority: Low Priority: Low Priority: Low Priority: Low Type: Bug Type: Bug Type: Bug Type: Bug Type: Bug Type: Bug Type: Bug Type: Bug Type: Bug Type: Bug Type: Bug Type: Bug Type: Bug Type: Bug Type: Bug Type: Bug Type: Bug Type: Bug Type: Bug Type: Bug Type: Bug Type: Bug Type: Bug Type: Bug Type: Bug Type: Bug Type: Bug Type: Bug Type: Bug Type: Bug Type: Bug Type: Bug Type: Bug Type: Bug Type: Bug Type: Bug Type: Bug Type: Bug Type: Bug Type: Bug Type: Bug Type: Bug Type: Bug Type: Bug Type: Bug Type: Bug Type: Bug Type: Bug Type: Bug Type: Bug Type: Bug Type: Bug Type: Bug Type: Bug Type: Bug Type: Bug Type: Bug Type: Bug Type: Bug Type: Bug Type: Bug Type: Bug Type: Bug Type: Bug Type: Bug Type: Bug Type: Bug Type: Bug Type: Bug Type: Bug Type: Bug Type: Bug Type: Bug Type: Bug Type: Bug Type: Bug Type: Bug Type: Bug Type: Bug Type: Bug
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: github/SlimeVR-Server#460