[Stay Aligned] Add small yaw rotations to keep trackers aligned #508

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

Originally created by @jabberrock on 2/2/2025

Add small yaw rotations to keep trackers aligned. Stay Aligned applies small yaw corrects every server tick. It can successfully keep the user aligned in many poses including standing, sitting and lying down.

This feature has two primary ideas:

  1. If the player is not moving, the tracker yaws should not be changing.
  2. If the player is moving, on average, the player will be in their relaxed pose.

Every server tick, Stay Aligned picked a tracker, calculates an error based on 3 forces (locked trackers, centering force, and neighbor trackers), and uses gradient descent to nudge the tracker's yaw.

Main classes:

  1. StayAligned: Entry point of Stay Aligned that is called from HumanSkeleton
  2. AdjustTrackerYaw: Performs the gradient descent
  3. LockedErrorVisitor, CenterErrorVisitor and NeighborErrorVisitor calculates the errors for gradient descent
  4. StayAlignedTrackerState: Tracks the Stay Aligned state per tracker

Supporting classes:

  1. TrackerSkeleton: Visits trackers, while providing neighboring trackers
  2. TrackerPose and TrackerSkeletonPose: Detects the pose of the player from tracker orientations
  3. RestDetector: Detects when a tracker is at rest

image
image

TODO: For the actual release, we should make a wizard for detecting the relaxed body angles.

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

*Originally created by @jabberrock on 2/2/2025* Add small yaw rotations to keep trackers aligned. Stay Aligned applies small yaw corrects every server tick. It can successfully keep the user aligned in many poses including standing, sitting and lying down. This feature has two primary ideas: 1. If the player is not moving, the tracker yaws should not be changing. 2. If the player is moving, on average, the player will be in their relaxed pose. Every server tick, Stay Aligned picked a tracker, calculates an error based on 3 forces (locked trackers, centering force, and neighbor trackers), and uses gradient descent to nudge the tracker's yaw. Main classes: 1. `StayAligned`: Entry point of Stay Aligned that is called from `HumanSkeleton` 2. `AdjustTrackerYaw`: Performs the gradient descent 3. `LockedErrorVisitor`, `CenterErrorVisitor` and `NeighborErrorVisitor` calculates the errors for gradient descent 4. `StayAlignedTrackerState`: Tracks the Stay Aligned state per tracker Supporting classes: 1. `TrackerSkeleton`: Visits trackers, while providing neighboring trackers 2. `TrackerPose` and `TrackerSkeletonPose`: Detects the pose of the player from tracker orientations 3. `RestDetector`: Detects when a tracker is at rest ![image](https://github.com/user-attachments/assets/b35c4c14-cca7-4208-8e4d-5ad6b3f95184) ![image](https://github.com/user-attachments/assets/1ffecb31-08c4-48da-9afc-11f671afaadf) TODO: For the actual release, we should make a wizard for detecting the relaxed body angles. https://github.com/SlimeVR/SolarXR-Protocol/pull/157
MrUnknownDE added the Area: Application ProtocolArea: TranslationArea: GUIArea: ServerArea: Skeletal ModelArea: 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: 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: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: ServerArea: 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: 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: 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: 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: 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: TranslationArea: TranslationArea: TranslationArea: TranslationArea: TranslationArea: TranslationArea: TranslationArea: TranslationArea: TranslationArea: TranslationArea: TranslationArea: TranslationArea: TranslationArea: TranslationArea: TranslationArea: TranslationArea: TranslationArea: TranslationArea: TranslationArea: TranslationArea: TranslationArea: TranslationArea: TranslationArea: TranslationArea: Translation labels 2026-04-05 19:23:37 +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: 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: 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: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: Server Area: 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: 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 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#508