Stay Aligned #383

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

Originally created by @jabberrock on 4/29/2025

Keeps your trackers aligned by slowly adjusting the yaw of your trackers to correct for drift.

Every tick, Stay Aligned adjusts the yaw of one tracker. It looks at the player's current pose, and adjusts the yaw of the tracker by a tiny amount, in the direction which is closest to the relaxed pose that the player set up. Over time, this has the effect of keeping all the trackers in a human-like pose.

  1. When a tracker is at rest, we "lock" the tracker and try to maintain its yaw. This is very useful when sitting or lying down because the player is rarely moving. They shouldn't drift at all.
  2. When a tracker is moving, we try to match the tracker to the player's current pose. For example, let's say the player is standing and talking to friends. On average, we expect the player to return to their relaxed standing pose. So, we try to rotate the trackers towards the relaxed standing pose. However, we also try to balance a tracker between its above and below trackers, so that the skeleton remains realistic when, for example, the player has their legs in a wide stance.

Main flow

  1. HumanSkeleton calls StayAligned.adjustNextTracker every server tick
  2. StayAligned.adjustNextTracker picks the next tracker, and calls AdjustTrackerYaw.adjust
  3. AdjustTrackerYaw.adjust calculates the error between the tracker's rotation, and its ideal rotation, then uses gradient descent to adjust a yaw correction to reduce the error
  4. Calculating the error is handled by one of LockedErrorVisitor, CenterErrorVisitor or NeighborErrorVisitor
  5. Tracker.getRotation/getIdentityAdjustedRotation applies the yaw correction to the raw rotation, before applying all the other full and mounting adjustments. This is because drift happens in the tracker's raw rotation space.

Home
image

Stay Aligned Settings
image
image

Setup Stay Aligned
image
image
image
image

SolarXR-Protocol: https://github.com/SlimeVR/SolarXR-Protocol/pull/170

*Originally created by @jabberrock on 4/29/2025* Keeps your trackers aligned by slowly adjusting the yaw of your trackers to correct for drift. Every tick, Stay Aligned adjusts the yaw of one tracker. It looks at the player's current pose, and adjusts the yaw of the tracker by a tiny amount, in the direction which is closest to the relaxed pose that the player set up. Over time, this has the effect of keeping all the trackers in a human-like pose. 1. When a tracker is at rest, we "lock" the tracker and try to maintain its yaw. This is very useful when sitting or lying down because the player is rarely moving. They shouldn't drift at all. 2. When a tracker is moving, we try to match the tracker to the player's current pose. For example, let's say the player is standing and talking to friends. On average, we expect the player to return to their relaxed standing pose. So, we try to rotate the trackers towards the relaxed standing pose. However, we also try to balance a tracker between its above and below trackers, so that the skeleton remains realistic when, for example, the player has their legs in a wide stance. Main flow 1. `HumanSkeleton` calls `StayAligned.adjustNextTracker` every server tick 3. `StayAligned.adjustNextTracker` picks the next tracker, and calls `AdjustTrackerYaw.adjust` 4. `AdjustTrackerYaw.adjust` calculates the error between the tracker's rotation, and its ideal rotation, then uses gradient descent to adjust a yaw correction to reduce the error 5. Calculating the error is handled by one of `LockedErrorVisitor`, `CenterErrorVisitor` or `NeighborErrorVisitor` 6. `Tracker.getRotation/getIdentityAdjustedRotation` applies the yaw correction to the raw rotation, before applying all the other full and mounting adjustments. This is because drift happens in the tracker's raw rotation space. Home ![image](https://github.com/user-attachments/assets/c727c91e-6334-40d7-9a7a-4385441ec95c) Stay Aligned Settings ![image](https://github.com/user-attachments/assets/6d685164-b9b3-4f8c-ae1b-9af43d8eabca) ![image](https://github.com/user-attachments/assets/0738ee96-f071-4e63-890f-2f1d0cb95da5) Setup Stay Aligned ![image](https://github.com/user-attachments/assets/17904fcc-d619-43ce-978d-522b7d8169aa) ![image](https://github.com/user-attachments/assets/a2468201-3ebd-46a2-b037-336edc897c7a) ![image](https://github.com/user-attachments/assets/5504b1e0-d1a9-4ad5-88b8-38ba24640505) ![image](https://github.com/user-attachments/assets/a6759f17-7074-42d4-b596-b839cf09a983) SolarXR-Protocol: https://github.com/SlimeVR/SolarXR-Protocol/pull/170
MrUnknownDE added the Area: Skeletal ModelArea: GUIArea: Application ProtocolArea: TranslationArea: ServerArea: Skeletal ModelArea: Skeletal ModelArea: Skeletal ModelArea: Skeletal ModelArea: Skeletal ModelArea: Skeletal ModelArea: Skeletal ModelArea: Skeletal ModelArea: Skeletal ModelArea: Skeletal ModelArea: Skeletal ModelArea: Skeletal ModelArea: Skeletal ModelArea: Skeletal ModelArea: Skeletal ModelArea: Skeletal ModelArea: Skeletal ModelArea: Skeletal ModelArea: Skeletal ModelArea: Skeletal ModelArea: Skeletal ModelArea: Skeletal ModelArea: Skeletal ModelArea: Skeletal ModelArea: Skeletal ModelArea: Skeletal ModelArea: Skeletal ModelArea: Skeletal ModelArea: Skeletal ModelArea: Skeletal ModelArea: Skeletal ModelArea: Skeletal ModelArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: GUIArea: TranslationArea: TranslationArea: TranslationArea: TranslationArea: TranslationArea: TranslationArea: TranslationArea: TranslationArea: TranslationArea: TranslationArea: TranslationArea: TranslationArea: TranslationArea: TranslationArea: TranslationArea: TranslationArea: TranslationArea: TranslationArea: TranslationArea: TranslationArea: TranslationArea: TranslationArea: TranslationArea: TranslationArea: TranslationArea: TranslationArea: TranslationArea: TranslationArea: TranslationArea: TranslationArea: TranslationArea: TranslationArea: TranslationArea: TranslationArea: TranslationArea: TranslationArea: TranslationArea: TranslationArea: TranslationArea: TranslationArea: TranslationArea: TranslationArea: TranslationArea: TranslationArea: TranslationArea: TranslationArea: TranslationArea: TranslationArea: TranslationArea: TranslationArea: TranslationArea: TranslationArea: TranslationArea: TranslationArea: TranslationArea: TranslationArea: TranslationArea: TranslationArea: TranslationArea: TranslationArea: TranslationArea: TranslationArea: TranslationArea: TranslationArea: TranslationArea: TranslationArea: TranslationArea: Application ProtocolArea: Application ProtocolArea: Application ProtocolArea: Application ProtocolArea: Application ProtocolArea: Application ProtocolArea: Application ProtocolArea: Application ProtocolArea: Application ProtocolArea: Application ProtocolArea: Application ProtocolArea: Application ProtocolArea: Application ProtocolArea: Application ProtocolArea: Application ProtocolArea: Application ProtocolArea: Application ProtocolArea: Application ProtocolArea: Application ProtocolArea: Application ProtocolArea: Application ProtocolArea: Application ProtocolArea: Application ProtocolArea: Application ProtocolArea: Application ProtocolArea: Application ProtocolArea: Application ProtocolArea: Application ProtocolArea: Application ProtocolArea: Application ProtocolArea: Application ProtocolArea: Application ProtocolArea: Application ProtocolArea: Application ProtocolArea: Application ProtocolArea: Application ProtocolArea: Application ProtocolArea: Application ProtocolArea: Application ProtocolArea: Application ProtocolArea: Application ProtocolArea: Application ProtocolArea: 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: Server labels 2026-04-05 18:38:36 +02:00
Sign in to join this conversation.
No Label Area: Application Protocol Area: Application Protocol Area: Application Protocol Area: Application Protocol Area: Application Protocol Area: Application Protocol Area: Application Protocol Area: Application Protocol Area: Application Protocol Area: Application Protocol Area: Application Protocol Area: Application Protocol Area: Application Protocol Area: Application Protocol Area: Application Protocol Area: Application Protocol Area: Application Protocol Area: Application Protocol Area: Application Protocol Area: Application Protocol Area: Application Protocol Area: Application Protocol Area: Application Protocol Area: Application Protocol Area: Application Protocol Area: Application Protocol Area: Application Protocol Area: Application Protocol Area: Application Protocol Area: Application Protocol Area: Application Protocol Area: Application Protocol Area: Application Protocol Area: Application Protocol Area: Application Protocol Area: Application Protocol Area: Application Protocol Area: Application Protocol Area: Application Protocol Area: Application Protocol Area: Application Protocol Area: Application Protocol Area: Application Protocol Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI Area: GUI 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: Skeletal Model Area: Skeletal Model Area: Skeletal Model Area: Skeletal Model Area: Skeletal Model Area: Skeletal Model Area: Skeletal Model Area: Skeletal Model Area: Skeletal Model Area: Skeletal Model Area: Skeletal Model Area: Skeletal Model Area: Skeletal Model Area: Skeletal Model Area: Skeletal Model Area: Skeletal Model Area: Skeletal Model Area: Skeletal Model Area: Skeletal Model Area: Skeletal Model Area: Skeletal Model Area: Skeletal Model Area: Skeletal Model Area: Skeletal Model Area: Skeletal Model Area: Skeletal Model Area: Skeletal Model Area: Skeletal Model Area: Skeletal Model Area: Skeletal Model Area: Skeletal Model Area: Skeletal Model Area: Skeletal Model Area: Translation Area: Translation Area: Translation Area: Translation Area: Translation Area: Translation Area: Translation Area: Translation Area: Translation Area: Translation Area: Translation Area: Translation Area: Translation Area: Translation Area: Translation Area: Translation Area: Translation Area: Translation Area: Translation Area: Translation Area: Translation Area: Translation Area: Translation Area: Translation Area: Translation Area: Translation Area: Translation Area: Translation Area: Translation Area: Translation Area: Translation Area: Translation Area: Translation Area: Translation Area: Translation Area: Translation Area: Translation Area: Translation Area: Translation Area: Translation Area: Translation Area: Translation Area: Translation Area: Translation Area: Translation Area: Translation Area: Translation Area: Translation Area: Translation Area: Translation Area: Translation Area: Translation Area: Translation Area: Translation Area: Translation Area: Translation Area: Translation Area: Translation Area: Translation Area: Translation Area: Translation Area: Translation Area: Translation Area: Translation Area: Translation Area: Translation Area: Translation Area: Translation
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: github/SlimeVR-Server#383