diff --git a/gui/public/i18n/en-x-owo/translation.ftl b/gui/public/i18n/en-x-owo/translation.ftl index 5c95a7f6fb..495023b98d 100644 --- a/gui/public/i18n/en-x-owo/translation.ftl +++ b/gui/public/i18n/en-x-owo/translation.ftl @@ -128,11 +128,14 @@ tracker-settings-assignment_section-edit = ewdit assiwnment tracker-settings-mounting_section = meownting pawsition tracker-settings-mounting_section-description = whewe is the twackaw mownted? tracker-settings-mounting_section-edit = edit meownting +tracker-settings-drift_compensation_section = awwow dwift compensation +tracker-settings-drift_compensation_section-description = shouwd this twackew compensate fow its dwift when dwift compensation is enabwed? +tracker-settings-drift_compensation_section-edit = awwow dwift compensation # The . means it's an attribute and it's related to the top key. # In this case that is the settings for the assignment section. tracker-settings-name_section = twackaw name -tracker-settings-name_section-placeholder = ewimewl's weft pawb tracker-settings-name_section-description = owo whats dis? +tracker-settings-name_section-placeholder = ewimewl's weft pawb ## Tracker part card info tracker-part_card-no_name = no name @@ -213,19 +216,27 @@ settings-general-steamvr-trackers-hands = Hands ## Tracker mechanics settings-general-tracker_mechanics = twayckaw mechanics~ -settings-general-tracker_mechanics-subtitle = fiwtering~ +settings-general-tracker_mechanics-filtering = fiwtering~ # This also cares about multilines -settings-general-tracker_mechanics-description = +settings-general-tracker_mechanics-filtering-description = chooce teh fiwwtewing type fow youw twackaws. pwediction pwedicts movment while smowthing smowthens movment. -settings-general-tracker_mechanics-filtering_type = fiwtewing type~ -settings-general-tracker_mechanics-filtering_type-none = no fiwwtewing~ -settings-general-tracker_mechanics-filtering_type-none-description = use wowtations as is. wiw nawt do any fiwwtewing. -settings-general-tracker_mechanics-filtering_type-smoothing = smowthing -settings-general-tracker_mechanics-filtering_type-smoothing-description = smowthes movements but adds some watency~ -settings-general-tracker_mechanics-filtering_type-prediction = pwediction~ -settings-general-tracker_mechanics-filtering_type-prediction-description = wowduces wowcyancy and makes wowvements mowe wowappy, but may incwease jiwitty -settings-general-tracker_mechanics-amount = amownt +settings-general-tracker_mechanics-filtering-type = fiwtewing type~ +settings-general-tracker_mechanics-filtering-type-none = no fiwwtewing~ +settings-general-tracker_mechanics-filtering-type-none-description = use wowtations as is. wiw nawt do any fiwwtewing. +settings-general-tracker_mechanics-filtering-type-smoothing = smowthing +settings-general-tracker_mechanics-filtering-type-smoothing-description = smowthes movements but adds some watency~ +settings-general-tracker_mechanics-filtering-type-prediction = pwediction~ +settings-general-tracker_mechanics-filtering-type-prediction-description = wowduces wowcyancy and makes wowvements mowe wowappy, but may incwease jiwitty +settings-general-tracker_mechanics-filtering-amount = amownt +settings-general-tracker_mechanics-drift_compensation = dwift compensation +# This cares about multilines +settings-general-tracker_mechanics-drift_compensation-description = + compensates imu yaw dwift by appwying an invewse wotation. + change amownt of compensation and how many wesets awe taken into accouwnt. +settings-general-tracker_mechanics-drift_compensation-enabled-label = dwift compensation +settings-general-tracker_mechanics-drift_compensation-amount-label = compensation amownt +settings-general-tracker_mechanics-drift_compensation-max_resets-label = nuwmbew of wesets uwsed ## FK/Tracking settings settings-general-fk_settings = fk sewttings diff --git a/gui/public/i18n/en/translation.ftl b/gui/public/i18n/en/translation.ftl index f0cc7ab50e..a3a449654a 100644 --- a/gui/public/i18n/en/translation.ftl +++ b/gui/public/i18n/en/translation.ftl @@ -128,11 +128,14 @@ tracker-settings-assignment_section-edit = Edit assignment tracker-settings-mounting_section = Mounting position tracker-settings-mounting_section-description = Where is the tracker mounted? tracker-settings-mounting_section-edit = Edit mounting +tracker-settings-drift_compensation_section = Allow drift compensation +tracker-settings-drift_compensation_section-description = Should this tracker compensate for its drift when drift compensation is enabled? +tracker-settings-drift_compensation_section-edit = Allow drift compensation # The . means it's an attribute and it's related to the top key. # In this case that is the settings for the assignment section. tracker-settings-name_section = Tracker name -tracker-settings-name_section-placeholder = NightyBeast's left leg tracker-settings-name_section-description = Give it a cute nickname :) +tracker-settings-name_section-placeholder = NightyBeast's left leg ## Tracker part card info tracker-part_card-no_name = No name @@ -187,7 +190,7 @@ mounting_selection_menu-close = Close settings-sidebar-title = Settings settings-sidebar-general = General settings-sidebar-tracker_mechanics = Tracker mechanics -settings-sidebar-fk_settings = FK settings +settings-sidebar-fk_settings = Tracking settings settings-sidebar-gesture_control = Gesture control settings-sidebar-interface = Interface settings-sidebar-osc_router = OSC router @@ -213,19 +216,27 @@ settings-general-steamvr-trackers-hands = Hands ## Tracker mechanics settings-general-tracker_mechanics = Tracker mechanics -settings-general-tracker_mechanics-subtitle = Filtering +settings-general-tracker_mechanics-filtering = Filtering # This also cares about multilines -settings-general-tracker_mechanics-description = +settings-general-tracker_mechanics-filtering-description = Choose the filtering type for your trackers. Prediction predicts movement while smoothing smoothens movement. -settings-general-tracker_mechanics-filtering_type = Filtering type -settings-general-tracker_mechanics-filtering_type-none = No filtering -settings-general-tracker_mechanics-filtering_type-none-description = Use rotations as is. Will not do any filtering. -settings-general-tracker_mechanics-filtering_type-smoothing = Smoothing -settings-general-tracker_mechanics-filtering_type-smoothing-description = Smooths movements but adds some latency. -settings-general-tracker_mechanics-filtering_type-prediction = Prediction -settings-general-tracker_mechanics-filtering_type-prediction-description = Reduces latency and makes movements more snappy, but may increase jitter. -settings-general-tracker_mechanics-amount = Amount +settings-general-tracker_mechanics-filtering-type = Filtering type +settings-general-tracker_mechanics-filtering-type-none = No filtering +settings-general-tracker_mechanics-filtering-type-none-description = Use rotations as is. Will not do any filtering. +settings-general-tracker_mechanics-filtering-type-smoothing = Smoothing +settings-general-tracker_mechanics-filtering-type-smoothing-description = Smooths movements but adds some latency. +settings-general-tracker_mechanics-filtering-type-prediction = Prediction +settings-general-tracker_mechanics-filtering-type-prediction-description = Reduces latency and makes movements more snappy, but may increase jitter. +settings-general-tracker_mechanics-filtering-amount = Amount +settings-general-tracker_mechanics-drift_compensation = Drift compensation +# This cares about multilines +settings-general-tracker_mechanics-drift_compensation-description = + Compensates IMU yaw drift by applying an inverse rotation. + Change amount of compensation and up to how many resets are taken into account. +settings-general-tracker_mechanics-drift_compensation-enabled-label = Drift compensation +settings-general-tracker_mechanics-drift_compensation-amount-label = Compensation amount +settings-general-tracker_mechanics-drift_compensation-max_resets-label = Use up to x last resets ## FK/Tracking settings settings-general-fk_settings = Tracking settings diff --git a/gui/public/i18n/es-419/translation.ftl b/gui/public/i18n/es-419/translation.ftl index 76a103a7da..f5fd495d20 100644 --- a/gui/public/i18n/es-419/translation.ftl +++ b/gui/public/i18n/es-419/translation.ftl @@ -128,11 +128,14 @@ tracker-settings-assignment_section-edit = Editar asignación tracker-settings-mounting_section = Posición de montura tracker-settings-mounting_section-description = ¿Dónde está montado el sensor? tracker-settings-mounting_section-edit = Editar montura +tracker-settings-drift_compensation_section = Allow drift compensation +tracker-settings-drift_compensation_section-description = Should this tracker compensate for its drift when drift compensation is enabled? +tracker-settings-drift_compensation_section-edit = Allow drift compensation # The . means it's an attribute and it's related to the top key. # In this case that is the settings for the assignment section. tracker-settings-name_section = Nombre del sensor -tracker-settings-name_section-placeholder = Pierna izquierda de NightyBeast tracker-settings-name_section-description = Dale un apodo bonito :) +tracker-settings-name_section-placeholder = Pierna izquierda de NightyBeast ## Tracker part card info tracker-part_card-no_name = Sin nombre @@ -213,19 +216,27 @@ settings-general-steamvr-trackers-hands = Manos ## Tracker mechanics settings-general-tracker_mechanics = Mecánicas del sensor -settings-general-tracker_mechanics-subtitle = Filtrado +settings-general-tracker_mechanics-filtering = Filtrado # This also cares about multilines -settings-general-tracker_mechanics-description = +settings-general-tracker_mechanics-filtering-description = Selecciona un tipo de filtro para tus sensores. Predicción predice el movimiento mientras que el suavizado suaviza el movimiento. -settings-general-tracker_mechanics-filtering_type = Tipos de filtro -settings-general-tracker_mechanics-filtering_type-none = Sin filtro -settings-general-tracker_mechanics-filtering_type-none-description = Usa las rotaciones como son. No se realizará ningún filtrado. -settings-general-tracker_mechanics-filtering_type-smoothing = Suavizado -settings-general-tracker_mechanics-filtering_type-smoothing-description = Suaviza los movimientos pero añade algo de latencia. -settings-general-tracker_mechanics-filtering_type-prediction = Predicción -settings-general-tracker_mechanics-filtering_type-prediction-description = Reduce la latencia y los movimientos serán más inmediatos, pero puede incrementar la inestabilidad. -settings-general-tracker_mechanics-amount = Cantidad +settings-general-tracker_mechanics-filtering-type = Tipos de filtro +settings-general-tracker_mechanics-filtering-type-none = Sin filtro +settings-general-tracker_mechanics-filtering-type-none-description = Usa las rotaciones como son. No se realizará ningún filtrado. +settings-general-tracker_mechanics-filtering-type-smoothing = Suavizado +settings-general-tracker_mechanics-filtering-type-smoothing-description = Suaviza los movimientos pero añade algo de latencia. +settings-general-tracker_mechanics-filtering-type-prediction = Predicción +settings-general-tracker_mechanics-filtering-type-prediction-description = Reduce la latencia y los movimientos serán más inmediatos, pero puede incrementar la inestabilidad. +settings-general-tracker_mechanics-filtering-amount = Cantidad +settings-general-tracker_mechanics-drift_compensation = Drift compensation +# This cares about multilines +settings-general-tracker_mechanics-drift_compensation-description = + Compensates IMU yaw drift by applying an inverse rotation. + Change amount of compensation and up to how many resets are taken into account. +settings-general-tracker_mechanics-drift_compensation-enabled-label = Drift compensation +settings-general-tracker_mechanics-drift_compensation-amount-label = Compensation amount +settings-general-tracker_mechanics-drift_compensation-max_resets-label = Use up to x last resets ## FK/Tracking settings settings-general-fk_settings = Ajustes de sensores diff --git a/gui/public/i18n/fr/translation.ftl b/gui/public/i18n/fr/translation.ftl index 1ce5f6c09f..bf62d47298 100644 --- a/gui/public/i18n/fr/translation.ftl +++ b/gui/public/i18n/fr/translation.ftl @@ -128,11 +128,14 @@ tracker-settings-assignment_section-edit = Ré-assigner tracker-settings-mounting_section = Orientation du capteur tracker-settings-mounting_section-description = Dans quelle direction pointe le capteur? tracker-settings-mounting_section-edit = Changer l'orientation +tracker-settings-drift_compensation_section = Permettre la compensation de la dérive +tracker-settings-drift_compensation_section-description = Ce capteur devrait-il compenser pour sa dérive si l'option est activée? +tracker-settings-drift_compensation_section-edit = Permettre la compensation de la dérive # The . means it's an attribute and it's related to the top key. # In this case that is the settings for the assignment section. tracker-settings-name_section = Nom personalisé -tracker-settings-name_section-placeholder = Patte gauche d'Erimel tracker-settings-name_section-description = Donnez-lui un joli surnom :3 +tracker-settings-name_section-placeholder = Patte gauche d'Erimel ## Tracker part card info tracker-part_card-no_name = Sans nom @@ -213,19 +216,27 @@ settings-general-steamvr-trackers-hands = Mains ## Tracker mechanics settings-general-tracker_mechanics = Paramètres des capteurs -settings-general-tracker_mechanics-subtitle = Filtrage +settings-general-tracker_mechanics-filtering = Filtrage # This also cares about multilines -settings-general-tracker_mechanics-description = +settings-general-tracker_mechanics-filtering-description = Choisissez le type de filtrage pour vos capteurs. La prédiction prédit les mouvements tandis que la fluidification rend les mouvements plus fluides. -settings-general-tracker_mechanics-filtering_type = Type de filtrage -settings-general-tracker_mechanics-filtering_type-none = Pas de filtrage -settings-general-tracker_mechanics-filtering_type-none-description = Utilisez les rotations telles quelles. -settings-general-tracker_mechanics-filtering_type-smoothing = Fluidification -settings-general-tracker_mechanics-filtering_type-smoothing-description = Fluidifie les mouvements mais ajoute un peu de latence. -settings-general-tracker_mechanics-filtering_type-prediction = Prédiction -settings-general-tracker_mechanics-filtering_type-prediction-description = Réduit la latence et rend les mouvements plus vifs, mais moins fluides. -settings-general-tracker_mechanics-amount = Intensité du filtrage +settings-general-tracker_mechanics-filtering-type = Type de filtrage +settings-general-tracker_mechanics-filtering-type-none = Pas de filtrage +settings-general-tracker_mechanics-filtering-type-none-description = Utilisez les rotations telles quelles. +settings-general-tracker_mechanics-filtering-type-smoothing = Fluidification +settings-general-tracker_mechanics-filtering-type-smoothing-description = Fluidifie les mouvements mais ajoute un peu de latence. +settings-general-tracker_mechanics-filtering-type-prediction = Prédiction +settings-general-tracker_mechanics-filtering-type-prediction-description = Réduit la latence et rend les mouvements plus vifs, mais moins fluides. +settings-general-tracker_mechanics-filtering-amount = Intensité du filtrage +settings-general-tracker_mechanics-drift_compensation = Compensation de la dérive +# This cares about multilines +settings-general-tracker_mechanics-drift_compensation-description = + Compense la dérive des gyroscopes en appliquant une rotation inverse. + Modifier la force de la compensation et le nombre de réinitialisations prises en compte. +settings-general-tracker_mechanics-drift_compensation-enabled-label = Compensation de la dérive +settings-general-tracker_mechanics-drift_compensation-amount-label = Force de la compensation +settings-general-tracker_mechanics-drift_compensation-max_resets-label = Nombre de réinitialisations prises en compte ## FK/Tracking settings settings-general-fk_settings = Paramètres de la capture diff --git a/gui/public/i18n/it/translation.ftl b/gui/public/i18n/it/translation.ftl index cdcffb17bb..8194b954e8 100644 --- a/gui/public/i18n/it/translation.ftl +++ b/gui/public/i18n/it/translation.ftl @@ -128,11 +128,14 @@ tracker-settings-assignment_section-edit = Cambia assegnazione tracker-settings-mounting_section = posizionamento di montaggio tracker-settings-mounting_section-description = Come è posizionato il tracker? tracker-settings-mounting_section-edit = Cambia posizionamento +tracker-settings-drift_compensation_section = Allow drift compensation +tracker-settings-drift_compensation_section-description = Should this tracker compensate for its drift when drift compensation is enabled? +tracker-settings-drift_compensation_section-edit = Allow drift compensation # The . means it's an attribute and it's related to the top key. # In this case that is the settings for the assignment section. tracker-settings-name_section = Nome del tracker -tracker-settings-name_section-placeholder = Gamba destra di NightyQueer tracker-settings-name_section-description = Scegli un nomignolo carino :) +tracker-settings-name_section-placeholder = Gamba destra di NightyQueer ## Tracker part card info tracker-part_card-no_name = Nessun nome @@ -213,19 +216,27 @@ settings-general-steamvr-trackers-hands = Mani ## Tracker mechanics settings-general-tracker_mechanics = Comportamento del tracker -settings-general-tracker_mechanics-subtitle = Filtro movimenti +settings-general-tracker_mechanics-filtering = Filtro movimenti # This also cares about multilines -settings-general-tracker_mechanics-description = +settings-general-tracker_mechanics-filtering-description = Scegli la tipologia di filtraggio movimenti per il tuo tracker. Predizione anticipa i movimenti, mentre Attenuazione attenua movimenti eccessivi. -settings-general-tracker_mechanics-filtering_type = Tipologia di filtraggio -settings-general-tracker_mechanics-filtering_type-none = Non usare alcun filtraggio -settings-general-tracker_mechanics-filtering_type-none-description = Usa le rotazioni così come sono. Non eseguirà alcun filtro. -settings-general-tracker_mechanics-filtering_type-smoothing = Attenuazione -settings-general-tracker_mechanics-filtering_type-smoothing-description = Attenua movimenti eccessivi ma aggiunge ritardo. -settings-general-tracker_mechanics-filtering_type-prediction = Predizione -settings-general-tracker_mechanics-filtering_type-prediction-description = Riduce ritardo e rende movimenti più istantanei, ma può introdurre tremolio. -settings-general-tracker_mechanics-amount = Quantità +settings-general-tracker_mechanics-filtering-type = Tipologia di filtraggio +settings-general-tracker_mechanics-filtering-type-none = Non usare alcun filtraggio +settings-general-tracker_mechanics-filtering-type-none-description = Usa le rotazioni così come sono. Non eseguirà alcun filtro. +settings-general-tracker_mechanics-filtering-type-smoothing = Attenuazione +settings-general-tracker_mechanics-filtering-type-smoothing-description = Attenua movimenti eccessivi ma aggiunge ritardo. +settings-general-tracker_mechanics-filtering-type-prediction = Predizione +settings-general-tracker_mechanics-filtering-type-prediction-description = Riduce ritardo e rende movimenti più istantanei, ma può introdurre tremolio. +settings-general-tracker_mechanics-filtering-amount = Quantità +settings-general-tracker_mechanics-drift_compensation = Drift compensation +# This cares about multilines +settings-general-tracker_mechanics-drift_compensation-description = + Compensates IMU yaw drift by applying an inverse rotation. + Change amount of compensation and up to how many resets are taken into account. +settings-general-tracker_mechanics-drift_compensation-enabled-label = Drift compensation +settings-general-tracker_mechanics-drift_compensation-amount-label = Compensation amount +settings-general-tracker_mechanics-drift_compensation-max_resets-label = Use up to x last resets ## FK/Tracking settings settings-general-fk_settings = Impostazioni FK diff --git a/gui/public/i18n/ja/translation.ftl b/gui/public/i18n/ja/translation.ftl index 3f54119b03..ebefd06ef8 100644 --- a/gui/public/i18n/ja/translation.ftl +++ b/gui/public/i18n/ja/translation.ftl @@ -128,11 +128,14 @@ tracker-settings-assignment_section-edit = 割り当ての編集 tracker-settings-mounting_section = 装着方向 tracker-settings-mounting_section-description = トラッカーをどの方向に装着していますか? tracker-settings-mounting_section-edit = 装着向きの編集 +tracker-settings-drift_compensation_section = Allow drift compensation +tracker-settings-drift_compensation_section-description = Should this tracker compensate for its drift when drift compensation is enabled? +tracker-settings-drift_compensation_section-edit = Allow drift compensation # The . means it's an attribute and it's related to the top key. # In this case that is the settings for the assignment section. tracker-settings-name_section = トラッカー名称 -tracker-settings-name_section-placeholder = NightyBeast's left leg tracker-settings-name_section-description = 自由に名称をつけてください +tracker-settings-name_section-placeholder = NightyBeast's left leg ## Tracker part card info tracker-part_card-no_name = 名称無し @@ -213,19 +216,27 @@ settings-general-steamvr-trackers-hands = Hands ## Tracker mechanics settings-general-tracker_mechanics = トラッカーメカニズム -settings-general-tracker_mechanics-subtitle = フィルター機能 +settings-general-tracker_mechanics-filtering = フィルター機能 # This also cares about multilines -settings-general-tracker_mechanics-description = +settings-general-tracker_mechanics-filtering-description = トラッカーのフィルタリングの種類を選択します。 Predictionは動きを予測し、Smoothingは動きを滑らかにする。 -settings-general-tracker_mechanics-filtering_type = フィルタータイプ -settings-general-tracker_mechanics-filtering_type-none = No filtering -settings-general-tracker_mechanics-filtering_type-none-description = トラッカーの値をそのまま使用します。フィルタリングは行いません。 -settings-general-tracker_mechanics-filtering_type-smoothing = Smoothing -settings-general-tracker_mechanics-filtering_type-smoothing-description = 動きを滑らかにしますが、若干の遅れが発生します -settings-general-tracker_mechanics-filtering_type-prediction = Prediction -settings-general-tracker_mechanics-filtering_type-prediction-description = レイテンシーを減らし、動きをよりキビキビさせますが、ジッターが増加する場合があります。 -settings-general-tracker_mechanics-amount = 数値 +settings-general-tracker_mechanics-filtering-type = フィルタータイプ +settings-general-tracker_mechanics-filtering-type-none = No filtering +settings-general-tracker_mechanics-filtering-type-none-description = トラッカーの値をそのまま使用します。フィルタリングは行いません。 +settings-general-tracker_mechanics-filtering-type-smoothing = Smoothing +settings-general-tracker_mechanics-filtering-type-smoothing-description = 動きを滑らかにしますが、若干の遅れが発生します +settings-general-tracker_mechanics-filtering-type-prediction = Prediction +settings-general-tracker_mechanics-filtering-type-prediction-description = レイテンシーを減らし、動きをよりキビキビさせますが、ジッターが増加する場合があります。 +settings-general-tracker_mechanics-filtering-amount = 数値 +settings-general-tracker_mechanics-drift_compensation = Drift compensation +# This cares about multilines +settings-general-tracker_mechanics-drift_compensation-description = + Compensates IMU yaw drift by applying an inverse rotation. + Change amount of compensation and up to how many resets are taken into account. +settings-general-tracker_mechanics-drift_compensation-enabled-label = Drift compensation +settings-general-tracker_mechanics-drift_compensation-amount-label = Compensation amount +settings-general-tracker_mechanics-drift_compensation-max_resets-label = Use up to x last resets ## FK settings settings-general-fk_settings = FK設定 diff --git a/gui/public/i18n/ko/translation.ftl b/gui/public/i18n/ko/translation.ftl index f621a71d52..e6d2b3a45c 100644 --- a/gui/public/i18n/ko/translation.ftl +++ b/gui/public/i18n/ko/translation.ftl @@ -128,11 +128,14 @@ tracker-settings-assignment_section-edit = 위치 수정 tracker-settings-mounting_section = 착용 방향 tracker-settings-mounting_section-description = 트래커는 어디에 착용하나요? tracker-settings-mounting_section-edit = 방향 수정 +tracker-settings-drift_compensation_section = Allow drift compensation +tracker-settings-drift_compensation_section-description = Should this tracker compensate for its drift when drift compensation is enabled? +tracker-settings-drift_compensation_section-edit = Allow drift compensation # The . means it's an attribute and it's related to the top key. # In this case that is the settings for the assignment section. tracker-settings-name_section = 트래커 이름 -tracker-settings-name_section-placeholder = NightyBeast's left leg tracker-settings-name_section-description = 귀여운 이름을 지어주세요! >_< +tracker-settings-name_section-placeholder = NightyBeast's left leg ## Tracker part card info tracker-part_card-no_name = 이름 없음 @@ -213,19 +216,27 @@ settings-general-steamvr-trackers-hands = Hands ## Tracker mechanics settings-general-tracker_mechanics = 트래커 역학 -settings-general-tracker_mechanics-subtitle = 필터링 +settings-general-tracker_mechanics-filtering = 필터링 # This also cares about multilines -settings-general-tracker_mechanics-description = +settings-general-tracker_mechanics-filtering-description = 트래커의 필터링 유형을 선택하세요. Prediction은 움직임을 예측하고 Smoothing은 움직임을 부드럽게 해요. -settings-general-tracker_mechanics-filtering_type = 필터링 타입 -settings-general-tracker_mechanics-filtering_type-none = 필터링 없음 -settings-general-tracker_mechanics-filtering_type-none-description = 어떠한 필터링도 사용하지 않아요. 있는 그대로의 회전 값을 사용해요. -settings-general-tracker_mechanics-filtering_type-smoothing = Smoothing -settings-general-tracker_mechanics-filtering_type-smoothing-description = 움직임을 부드럽게 하지만 약간의 대기 시간이 추가돼요. -settings-general-tracker_mechanics-filtering_type-prediction = Prediction -settings-general-tracker_mechanics-filtering_type-prediction-description = 대기 시간이 줄어들고 움직임이 더 빨라지지만 지터가 증가할 수 있어요. -settings-general-tracker_mechanics-amount = 강도 +settings-general-tracker_mechanics-filtering-type = 필터링 타입 +settings-general-tracker_mechanics-filtering-type-none = 필터링 없음 +settings-general-tracker_mechanics-filtering-type-none-description = 어떠한 필터링도 사용하지 않아요. 있는 그대로의 회전 값을 사용해요. +settings-general-tracker_mechanics-filtering-type-smoothing = Smoothing +settings-general-tracker_mechanics-filtering-type-smoothing-description = 움직임을 부드럽게 하지만 약간의 대기 시간이 추가돼요. +settings-general-tracker_mechanics-filtering-type-prediction = Prediction +settings-general-tracker_mechanics-filtering-type-prediction-description = 대기 시간이 줄어들고 움직임이 더 빨라지지만 지터가 증가할 수 있어요. +settings-general-tracker_mechanics-filtering-amount = 강도 +settings-general-tracker_mechanics-drift_compensation = Drift compensation +# This cares about multilines +settings-general-tracker_mechanics-drift_compensation-description = + Compensates IMU yaw drift by applying an inverse rotation. + Change amount of compensation and up to how many resets are taken into account. +settings-general-tracker_mechanics-drift_compensation-enabled-label = Drift compensation +settings-general-tracker_mechanics-drift_compensation-amount-label = Compensation amount +settings-general-tracker_mechanics-drift_compensation-max_resets-label = Use up to x last resets ## FK/Tracking settings settings-general-fk_settings = FK 설정 diff --git a/gui/public/i18n/pl/translation.ftl b/gui/public/i18n/pl/translation.ftl index 81bb00f181..1d8e62c38c 100644 --- a/gui/public/i18n/pl/translation.ftl +++ b/gui/public/i18n/pl/translation.ftl @@ -128,11 +128,14 @@ tracker-settings-assignment_section-edit = Edytuj tracker-settings-mounting_section = Położenie Trackera tracker-settings-mounting_section-description = Gdzie jest Tracker zamontowany? tracker-settings-mounting_section-edit = Edytuj +tracker-settings-drift_compensation_section = Allow drift compensation +tracker-settings-drift_compensation_section-description = Should this tracker compensate for its drift when drift compensation is enabled? +tracker-settings-drift_compensation_section-edit = Allow drift compensation # The . means it's an attribute and it's related to the top key. # In this case that is the settings for the assignment section. tracker-settings-name_section = Nazwa Trackera -tracker-settings-name_section-placeholder = Lewa noga Yexo tracker-settings-name_section-description = Daj mu słodką nazwę :) +tracker-settings-name_section-placeholder = Lewa noga Yexo ## Tracker part card info tracker-part_card-no_name = Brak Nazwy @@ -213,19 +216,27 @@ settings-general-steamvr-trackers-hands = Ręce ## Tracker mechanics settings-general-tracker_mechanics = Tracker mechanics -settings-general-tracker_mechanics-subtitle = Filtrowanie +settings-general-tracker_mechanics-filtering = Filtrowanie # This also cares about multilines -settings-general-tracker_mechanics-description = +settings-general-tracker_mechanics-filtering-description = Wybierz Filtry dla twoich trackerów. Przewidywanie przewiduje ruchy a Wygładzanie stara się wygładzić ruchy. -settings-general-tracker_mechanics-filtering_type = Filtry -settings-general-tracker_mechanics-filtering_type-none = Brak Filtrów -settings-general-tracker_mechanics-filtering_type-none-description = Używa rotacji takimi jakimi są. -settings-general-tracker_mechanics-filtering_type-smoothing = Wygładzanie -settings-general-tracker_mechanics-filtering_type-smoothing-description = Wygładza ruchy lecz dodaje trochę opóźnienia. -settings-general-tracker_mechanics-filtering_type-prediction = Przewidywanie -settings-general-tracker_mechanics-filtering_type-prediction-description = Zmniejsza opóźnienie i robi ruchy trochę ostrzejszymi, ale może dodać trochę drgań. -settings-general-tracker_mechanics-amount = Ilość +settings-general-tracker_mechanics-filtering-type = Filtry +settings-general-tracker_mechanics-filtering-type-none = Brak Filtrów +settings-general-tracker_mechanics-filtering-type-none-description = Używa rotacji takimi jakimi są. +settings-general-tracker_mechanics-filtering-type-smoothing = Wygładzanie +settings-general-tracker_mechanics-filtering-type-smoothing-description = Wygładza ruchy lecz dodaje trochę opóźnienia. +settings-general-tracker_mechanics-filtering-type-prediction = Przewidywanie +settings-general-tracker_mechanics-filtering-type-prediction-description = Zmniejsza opóźnienie i robi ruchy trochę ostrzejszymi, ale może dodać trochę drgań. +settings-general-tracker_mechanics-filtering-amount = Ilość +settings-general-tracker_mechanics-drift_compensation = Drift compensation +# This cares about multilines +settings-general-tracker_mechanics-drift_compensation-description = + Compensates IMU yaw drift by applying an inverse rotation. + Change amount of compensation and up to how many resets are taken into account. +settings-general-tracker_mechanics-drift_compensation-enabled-label = Drift compensation +settings-general-tracker_mechanics-drift_compensation-amount-label = Compensation amount +settings-general-tracker_mechanics-drift_compensation-max_resets-label = Use up to x last resets ## FK settings settings-general-fk_settings = Tracking settings diff --git a/gui/public/i18n/pt-BR/translation.ftl b/gui/public/i18n/pt-BR/translation.ftl index e8219ffa22..c4ef6645b4 100644 --- a/gui/public/i18n/pt-BR/translation.ftl +++ b/gui/public/i18n/pt-BR/translation.ftl @@ -128,11 +128,14 @@ tracker-settings-assignment_section-edit = Editar atribuição tracker-settings-mounting_section = Posicionamento tracker-settings-mounting_section-description = Aonde o tracker está posicionado? tracker-settings-mounting_section-edit = Editar posição +tracker-settings-drift_compensation_section = Allow drift compensation +tracker-settings-drift_compensation_section-description = Should this tracker compensate for its drift when drift compensation is enabled? +tracker-settings-drift_compensation_section-edit = Allow drift compensation # The . means it's an attribute and it's related to the top key. # In this case that is the settings for the assignment section. tracker-settings-name_section = Nome do tracker -tracker-settings-name_section-placeholder = Coxa esquerda de NightyBeast tracker-settings-name_section-description = Dê um apelido fofo :) +tracker-settings-name_section-placeholder = Coxa esquerda de NightyBeast ## Tracker part card info tracker-part_card-no_name = Sem nome @@ -213,19 +216,27 @@ settings-general-steamvr-trackers-hands = Mãos ## Tracker mechanics settings-general-tracker_mechanics = Mecânicas do Tracker -settings-general-tracker_mechanics-subtitle = Filtros +settings-general-tracker_mechanics-filtering = Filtros # This also cares about multilines -settings-general-tracker_mechanics-description = +settings-general-tracker_mechanics-filtering-description = Escolha o tipo de filtro para seus trackers. Predição prediz movimentação enquanto suavização suaviza o movimento. -settings-general-tracker_mechanics-filtering_type = Tipo de filtro -settings-general-tracker_mechanics-filtering_type-none = Sem filtro -settings-general-tracker_mechanics-filtering_type-none-description = Utiliza as rotações como registradas. Sem qualquer tipo de filtro. -settings-general-tracker_mechanics-filtering_type-smoothing = Suavização -settings-general-tracker_mechanics-filtering_type-smoothing-description = Suaviza o movimento porém introduz um pouco de latência. -settings-general-tracker_mechanics-filtering_type-prediction = Predição -settings-general-tracker_mechanics-filtering_type-prediction-description = Reduz latência e torna os movimentos mais responsivos, porém aumenta tremulação (Jitter). -settings-general-tracker_mechanics-amount = Quantidade +settings-general-tracker_mechanics-filtering-type = Tipo de filtro +settings-general-tracker_mechanics-filtering-type-none = Sem filtro +settings-general-tracker_mechanics-filtering-type-none-description = Utiliza as rotações como registradas. Sem qualquer tipo de filtro. +settings-general-tracker_mechanics-filtering-type-smoothing = Suavização +settings-general-tracker_mechanics-filtering-type-smoothing-description = Suaviza o movimento porém introduz um pouco de latência. +settings-general-tracker_mechanics-filtering-type-prediction = Predição +settings-general-tracker_mechanics-filtering-type-prediction-description = Reduz latência e torna os movimentos mais responsivos, porém aumenta tremulação (Jitter). +settings-general-tracker_mechanics-filtering-amount = Quantidade +settings-general-tracker_mechanics-drift_compensation = Drift compensation +# This cares about multilines +settings-general-tracker_mechanics-drift_compensation-description = + Compensates IMU yaw drift by applying an inverse rotation. + Change amount of compensation and up to how many resets are taken into account. +settings-general-tracker_mechanics-drift_compensation-enabled-label = Drift compensation +settings-general-tracker_mechanics-drift_compensation-amount-label = Compensation amount +settings-general-tracker_mechanics-drift_compensation-max_resets-label = Use up to x last resets ## FK/Tracking settings settings-general-fk_settings = Opções de Tracker diff --git a/gui/public/i18n/vi/translation.ftl b/gui/public/i18n/vi/translation.ftl index f59a8907df..cfabfbfe64 100644 --- a/gui/public/i18n/vi/translation.ftl +++ b/gui/public/i18n/vi/translation.ftl @@ -128,11 +128,14 @@ tracker-settings-assignment_section-edit = Chỉnh lại giao bộ phận tracker-settings-mounting_section = Vị trí đặt bộ phận tracker-settings-mounting_section-description = Tracker đặt ở đâu? tracker-settings-mounting_section-edit = Chỉnh lại chỗ đặt +tracker-settings-drift_compensation_section = Allow drift compensation +tracker-settings-drift_compensation_section-description = Should this tracker compensate for its drift when drift compensation is enabled? +tracker-settings-drift_compensation_section-edit = Allow drift compensation # The . means it's an attribute and it's related to the top key. # In this case that is the settings for the assignment section. tracker-settings-name_section = Tên tracker -tracker-settings-name_section-placeholder = Menaced's left leg tracker-settings-name_section-description = Hãy cho một tên đẹp :) +tracker-settings-name_section-placeholder = Menaced's left leg ## Tracker part card info tracker-part_card-no_name = Không tên @@ -213,19 +216,27 @@ settings-general-steamvr-trackers-hands = Hands ## Tracker mechanics settings-general-tracker_mechanics = Cơ khí tracker -settings-general-tracker_mechanics-subtitle = Lọc rung +settings-general-tracker_mechanics-filtering = Lọc rung # This also cares about multilines -settings-general-tracker_mechanics-description = +settings-general-tracker_mechanics-filtering-description = Chọn kiểu lọc rung cho tracker. Dự đoán đoán cử động trong khi lọc rung cử động. -settings-general-tracker_mechanics-filtering_type = Kiểu lọc -settings-general-tracker_mechanics-filtering_type-none = Không lọc -settings-general-tracker_mechanics-filtering_type-none-description = Để đo chiều chuyển y nguyên. Không sử dụlọclọc. -settings-general-tracker_mechanics-filtering_type-smoothing = Làm mượt -settings-general-tracker_mechanics-filtering_type-smoothing-description = Lọc cử động mượt nhưng tạo ít chậm rễ. -settings-general-tracker_mechanics-filtering_type-prediction = Dự đoán -settings-general-tracker_mechanics-filtering_type-prediction-description = Giảm chậm trê và để cử động gọn hơn, nhưng có thể tăng độ rung. -settings-general-tracker_mechanics-amount = Số luọng +settings-general-tracker_mechanics-filtering-type = Kiểu lọc +settings-general-tracker_mechanics-filtering-type-none = Không lọc +settings-general-tracker_mechanics-filtering-type-none-description = Để đo chiều chuyển y nguyên. Không sử dụlọclọc. +settings-general-tracker_mechanics-filtering-type-smoothing = Làm mượt +settings-general-tracker_mechanics-filtering-type-smoothing-description = Lọc cử động mượt nhưng tạo ít chậm rễ. +settings-general-tracker_mechanics-filtering-type-prediction = Dự đoán +settings-general-tracker_mechanics-filtering-type-prediction-description = Giảm chậm trê và để cử động gọn hơn, nhưng có thể tăng độ rung. +settings-general-tracker_mechanics-filtering-amount = Số luọng +settings-general-tracker_mechanics-drift_compensation = Drift compensation +# This cares about multilines +settings-general-tracker_mechanics-drift_compensation-description = + Compensates IMU yaw drift by applying an inverse rotation. + Change amount of compensation and up to how many resets are taken into account. +settings-general-tracker_mechanics-drift_compensation-enabled-label = Drift compensation +settings-general-tracker_mechanics-drift_compensation-amount-label = Compensation amount +settings-general-tracker_mechanics-drift_compensation-max_resets-label = Use up to x last resets ## FK/Tracking settings settings-general-fk_settings = Cài đặt FK diff --git a/gui/public/i18n/zh-Hans/translation.ftl b/gui/public/i18n/zh-Hans/translation.ftl index 9cf9662057..d551951604 100644 --- a/gui/public/i18n/zh-Hans/translation.ftl +++ b/gui/public/i18n/zh-Hans/translation.ftl @@ -128,11 +128,14 @@ tracker-settings-assignment_section-edit = 编辑分配 tracker-settings-mounting_section = 佩戴位置 tracker-settings-mounting_section-description = 该追踪器被佩戴在哪里? tracker-settings-mounting_section-edit = 编辑佩戴 +tracker-settings-drift_compensation_section = Allow drift compensation +tracker-settings-drift_compensation_section-description = Should this tracker compensate for its drift when drift compensation is enabled? +tracker-settings-drift_compensation_section-edit = Allow drift compensation # The . means it's an attribute and it's related to the top key. # In this case that is the settings for the assignment section. tracker-settings-name_section = 追踪器名称 -tracker-settings-name_section-placeholder = CC 封印着漆黑之力的漆黑左臂 tracker-settings-name_section-description = 给它起一个可爱的名字吧=w=~ +tracker-settings-name_section-placeholder = CC 封印着漆黑之力的漆黑左臂 ## Tracker part card info tracker-part_card-no_name = 未命名 @@ -213,19 +216,27 @@ settings-general-steamvr-trackers-hands = 手部 ## Tracker mechanics settings-general-tracker_mechanics = 追踪器设置 -settings-general-tracker_mechanics-subtitle = 滤波 +settings-general-tracker_mechanics-filtering = 滤波 # This also cares about multilines -settings-general-tracker_mechanics-description = +settings-general-tracker_mechanics-filtering-description = 选择追踪器的滤波类型。 预测型将会对你的运动加以预测,而平滑型将会让你的运动更加平滑。 -settings-general-tracker_mechanics-filtering_type = 滤波类型 -settings-general-tracker_mechanics-filtering_type-none = 无滤波 -settings-general-tracker_mechanics-filtering_type-none-description = 使用原始数据,不会进行任何过滤。 -settings-general-tracker_mechanics-filtering_type-smoothing = 平滑型 -settings-general-tracker_mechanics-filtering_type-smoothing-description = 让运动更加平滑,但会增加一些延迟。 -settings-general-tracker_mechanics-filtering_type-prediction = 预测型 -settings-general-tracker_mechanics-filtering_type-prediction-description = 减少延迟并使移动更敏捷,但可能会增加一些抖动。 -settings-general-tracker_mechanics-amount = 滤波强度 +settings-general-tracker_mechanics-filtering-type = 滤波类型 +settings-general-tracker_mechanics-filtering-type-none = 无滤波 +settings-general-tracker_mechanics-filtering-type-none-description = 使用原始数据,不会进行任何过滤。 +settings-general-tracker_mechanics-filtering-type-smoothing = 平滑型 +settings-general-tracker_mechanics-filtering-type-smoothing-description = 让运动更加平滑,但会增加一些延迟。 +settings-general-tracker_mechanics-filtering-type-prediction = 预测型 +settings-general-tracker_mechanics-filtering-type-prediction-description = 减少延迟并使移动更敏捷,但可能会增加一些抖动。 +settings-general-tracker_mechanics-filtering-amount = 滤波强度 +settings-general-tracker_mechanics-drift_compensation = Drift compensation +# This cares about multilines +settings-general-tracker_mechanics-drift_compensation-description = + Compensates IMU yaw drift by applying an inverse rotation. + Change amount of compensation and up to how many resets are taken into account. +settings-general-tracker_mechanics-drift_compensation-enabled-label = Drift compensation +settings-general-tracker_mechanics-drift_compensation-amount-label = Compensation amount +settings-general-tracker_mechanics-drift_compensation-max_resets-label = Use up to x last resets ## FK/Tracking settings settings-general-fk_settings = FK 设置 diff --git a/gui/src/components/settings/pages/GeneralSettings.tsx b/gui/src/components/settings/pages/GeneralSettings.tsx index cd78a25271..2e144f7531 100644 --- a/gui/src/components/settings/pages/GeneralSettings.tsx +++ b/gui/src/components/settings/pages/GeneralSettings.tsx @@ -13,6 +13,7 @@ import { SettingsResponseT, SteamVRTrackersSettingT, TapDetectionSettingsT, + DriftCompensationSettingsT, } from 'solarxr-protocol'; import { useConfig } from '../../../hooks/config'; import { useWebsocketAPI } from '../../../hooks/websocket-api'; @@ -40,6 +41,11 @@ interface SettingsForm { type: number; amount: number; }; + driftCompensation: { + enabled: boolean; + amount: number; + maxResets: number; + }; toggles: { extendedSpine: boolean; extendedPelvis: boolean; @@ -88,6 +94,11 @@ const defaultValues = { viveEmulation: false, }, filtering: { amount: 0.1, type: FilteringType.NONE }, + driftCompensation: { + enabled: false, + amount: 0.1, + maxResets: 1, + }, tapDetection: { tapMountingResetEnabled: false, tapQuickResetEnabled: false, @@ -165,6 +176,12 @@ export function GeneralSettings() { filtering.amount = values.filtering.amount; settings.filtering = filtering; + const driftCompensation = new DriftCompensationSettingsT(); + driftCompensation.enabled = values.driftCompensation.enabled; + driftCompensation.amount = values.driftCompensation.amount; + driftCompensation.maxResets = values.driftCompensation.maxResets; + settings.driftCompensation = driftCompensation; + sendRPCPacket(RpcMessage.ChangeSettingsRequest, settings); setConfig({ @@ -194,6 +211,10 @@ export function GeneralSettings() { formData.filtering = settings.filtering; } + if (settings.driftCompensation) { + formData.driftCompensation = settings.driftCompensation; + } + if (settings.steamVrTrackers) { formData.trackers = settings.steamVrTrackers; } @@ -340,12 +361,14 @@ export function GeneralSettings() { {l10n.getString('settings-general-tracker_mechanics')} - {l10n.getString('settings-general-tracker_mechanics-subtitle')} + {l10n.getString('settings-general-tracker_mechanics-filtering')}
<> {l10n - .getString('settings-general-tracker_mechanics-description') + .getString( + 'settings-general-tracker_mechanics-filtering-description' + ) .split('\n') .map((line, i) => ( @@ -356,7 +379,7 @@ export function GeneralSettings() {
{l10n.getString( - 'settings-general-tracker_mechanics-filtering_type' + 'settings-general-tracker_mechanics-filtering-type' )}
@@ -364,10 +387,10 @@ export function GeneralSettings() { control={control} name="filtering.type" label={l10n.getString( - 'settings-general-tracker_mechanics-filtering_type-none' + 'settings-general-tracker_mechanics-filtering-type-none' )} desciption={l10n.getString( - 'settings-general-tracker_mechanics-filtering_type-none-description' + 'settings-general-tracker_mechanics-filtering-type-none-description' )} value={FilteringType.NONE} > @@ -375,10 +398,10 @@ export function GeneralSettings() { control={control} name="filtering.type" label={l10n.getString( - 'settings-general-tracker_mechanics-filtering_type-smoothing' + 'settings-general-tracker_mechanics-filtering-type-smoothing' )} desciption={l10n.getString( - 'settings-general-tracker_mechanics-filtering_type-smoothing-description' + 'settings-general-tracker_mechanics-filtering-type-smoothing-description' )} value={FilteringType.SMOOTHING} > @@ -386,10 +409,10 @@ export function GeneralSettings() { control={control} name="filtering.type" label={l10n.getString( - 'settings-general-tracker_mechanics-filtering_type-prediction' + 'settings-general-tracker_mechanics-filtering-type-prediction' )} desciption={l10n.getString( - 'settings-general-tracker_mechanics-filtering_type-prediction-description' + 'settings-general-tracker_mechanics-filtering-type-prediction-description' )} value={FilteringType.PREDICTION} > @@ -399,7 +422,49 @@ export function GeneralSettings() { control={control} name="filtering.amount" label={l10n.getString( - 'settings-general-tracker_mechanics-amount' + 'settings-general-tracker_mechanics-filtering-amount' + )} + valueLabelFormat={(value) => `${Math.round(value * 100)} %`} + min={0.1} + max={1.0} + step={0.1} + /> +
+
+ + {l10n.getString( + 'settings-general-tracker_mechanics-drift_compensation' + )} + +
+ + {l10n + .getString( + 'settings-general-tracker_mechanics-drift_compensation-description' + ) + .split('\n') + .map((line, i) => ( + + {line} + + ))} + +
+ +
+ `${Math.round(value * 100)} %`} min={0.1} @@ -407,6 +472,18 @@ export function GeneralSettings() { step={0.1} />
+
+ +
} id="fksettings"> @@ -457,7 +534,6 @@ export function GeneralSettings() { step={0.1} /> - {l10n.getString('settings-general-fk_settings-arm_fk')} diff --git a/gui/src/components/tracker/TrackerSettings.tsx b/gui/src/components/tracker/TrackerSettings.tsx index 5ce24e02ab..445c70a46c 100644 --- a/gui/src/components/tracker/TrackerSettings.tsx +++ b/gui/src/components/tracker/TrackerSettings.tsx @@ -17,6 +17,7 @@ import { Typography } from '../commons/Typography'; import { MountingSelectionMenu } from '../onboarding/pages/mounting/MountingSelectionMenu'; import { SingleTrackerBodyAssignmentMenu } from './SingleTrackerBodyAssignmentMenu'; import { TrackerCard } from './TrackerCard'; +import { CheckBox } from '../commons/Checkbox'; import { useLocalization } from '@fluent/react'; export const rotationToQuatMap = { @@ -44,13 +45,17 @@ export function TrackerSettingsPage() { trackernum: string; deviceid: string; }>(); - const { register, watch, reset, handleSubmit } = useForm<{ + const { control, register, watch, reset, handleSubmit } = useForm<{ trackerName: string | null; + allowDriftCompensation: boolean | null; }>({ - defaultValues: { trackerName: null }, + defaultValues: { + trackerName: null, + allowDriftCompensation: null, + }, reValidateMode: 'onSubmit', }); - const { trackerName } = watch(); + const { trackerName, allowDriftCompensation } = watch(); const tracker = useTrackerFromId(trackernum, deviceid); @@ -69,6 +74,8 @@ export function TrackerSettingsPage() { ); assignreq.bodyPosition = tracker?.tracker.info?.bodyPart || BodyPart.NONE; assignreq.trackerId = tracker?.tracker.trackerId; + if (allowDriftCompensation != null) + assignreq.allowDriftCompensation = allowDriftCompensation; sendRPCPacket(RpcMessage.AssignTrackerRequest, assignreq); setSelectRotation(false); }; @@ -79,6 +86,8 @@ export function TrackerSettingsPage() { const assignreq = new AssignTrackerRequestT(); assignreq.bodyPosition = role; assignreq.trackerId = tracker?.tracker.trackerId; + if (allowDriftCompensation != null) + assignreq.allowDriftCompensation = allowDriftCompensation; sendRPCPacket(RpcMessage.AssignTrackerRequest, assignreq); setSelectBodypart(false); }; @@ -89,28 +98,42 @@ export function TrackerSettingsPage() { : rotationToQuatMap.FRONT; }, [tracker?.tracker.info?.mountingOrientation]); - const updateTrackerName = () => { + const updateTrackerSettings = () => { if (!tracker) return; - if (trackerName == tracker.tracker.info?.customName) return; + if (allowDriftCompensation == null) return; + if ( + trackerName == tracker.tracker.info?.customName && + allowDriftCompensation == tracker.tracker.info?.allowDriftCompensation + ) + return; const assignreq = new AssignTrackerRequestT(); assignreq.bodyPosition = tracker?.tracker.info?.bodyPart || BodyPart.NONE; + assignreq.mountingOrientation = assignreq.mountingOrientation = + QuaternionToQuatT( + Quaternion.fromEuler(0, 0, FixEuler(+currRotation) * DEG_TO_RAD, 'XZY') + ); assignreq.displayName = trackerName; assignreq.trackerId = tracker?.tracker.trackerId; + assignreq.allowDriftCompensation = allowDriftCompensation; sendRPCPacket(RpcMessage.AssignTrackerRequest, assignreq); }; const onSettingsSubmit = () => { - updateTrackerName(); + updateTrackerSettings(); }; useDebouncedEffect( () => { - updateTrackerName(); + updateTrackerSettings(); }, [trackerName], 1000 ); + useEffect(() => { + updateTrackerSettings(); + }, [allowDriftCompensation]); + useEffect(() => { if (tracker && !firstLoad) setFirstLoad(true); }, [tracker, firstLoad]); @@ -119,6 +142,7 @@ export function TrackerSettingsPage() { if (firstLoad) { reset({ trackerName: tracker?.tracker.info?.customName as string | null, + allowDriftCompensation: tracker?.tracker.info?.allowDriftCompensation, }); } }, [firstLoad]); @@ -259,6 +283,33 @@ export function TrackerSettingsPage() { + {tracker?.tracker.info?.isImu && ( + <> +
+ + {l10n.getString( + 'tracker-settings-drift_compensation_section' + )} + + + {l10n.getString( + 'tracker-settings-drift_compensation_section-description' + )} + +
+ +
+
+ + )}
{l10n.getString('tracker-settings-name_section')} diff --git a/server/src/main/java/com/jme3/math/Quaternion.java b/server/src/main/java/com/jme3/math/Quaternion.java index a5a17471d7..f2ce6b160a 100644 --- a/server/src/main/java/com/jme3/math/Quaternion.java +++ b/server/src/main/java/com/jme3/math/Quaternion.java @@ -36,6 +36,7 @@ import java.io.IOException; import java.io.ObjectInput; import java.io.ObjectOutput; +import java.util.AbstractList; import java.util.logging.Logger; @@ -351,7 +352,7 @@ public float getPitch() { /** * Returns Euler rotation angle around y axis (yaw). - * + * * @return * @see #toAngles(float[]) */ @@ -923,6 +924,74 @@ public void nlerp(Quaternion q2, float blend) { normalizeLocal(); } + /** + * Sets the values of this quaternion to the unit average of the given + * Quaternions and return itself + * + * @param qn list of all the Quaternions to average + * @return a new Quaternion resulting from the average of the given + * Quaternions + */ + public Quaternion fromAveragedQuaternions(AbstractList qn) { + if (qn.size() == 0) { + throw new IllegalArgumentException("qn's length can't be 0"); + } + + float sumX = 0f; + float sumY = 0f; + float sumZ = 0f; + float sumW = 0f; + for (Quaternion q : qn) { + sumX += q.x; + sumY += q.y; + sumZ += q.z; + sumW += q.w; + } + + x = sumX / qn.size(); + y = sumY / qn.size(); + z = sumZ / qn.size(); + w = sumW / qn.size(); + + return this; + } + + /** + * Sets the values of this quaternion to the unit average of the given + * Quaternions and return itself + * + * @param qn list of all the Quaternions to average + * @param tn 0-1, averaging weight for Quaternions (sum = 1) + * @return a new Quaternion resulting from the weighted average of the given + * Quaternions + */ + public Quaternion fromAveragedQuaternions(AbstractList qn, AbstractList tn) { + if (qn.size() == 0) { + throw new IllegalArgumentException("qn's length can't be 0"); + } + if (qn.size() != tn.size()) { + throw new IllegalArgumentException("qn and tn must have the same length"); + } + + float averagedX = 0f; + float averagedY = 0f; + float averagedZ = 0f; + float averagedW = 0f; + for (int i = 0; i < qn.size(); i++) { + averagedX += qn.get(i).x * tn.get(i); + averagedY += qn.get(i).y * tn.get(i); + averagedZ += qn.get(i).z * tn.get(i); + averagedW += qn.get(i).w * tn.get(i); + } + + x = averagedX; + y = averagedY; + z = averagedZ; + w = averagedW; + + return this; + } + /** * add adds the values of this quaternion to those of the * parameter quaternion. The result is returned as a new quaternion. diff --git a/server/src/main/java/dev/slimevr/config/DriftCompensationConfig.java b/server/src/main/java/dev/slimevr/config/DriftCompensationConfig.java new file mode 100644 index 0000000000..ff350ccfd3 --- /dev/null +++ b/server/src/main/java/dev/slimevr/config/DriftCompensationConfig.java @@ -0,0 +1,60 @@ +package dev.slimevr.config; + +import dev.slimevr.Main; +import dev.slimevr.vr.trackers.IMUTracker; +import dev.slimevr.vr.trackers.Tracker; + + +public class DriftCompensationConfig { + + // Is drift compensation enabled + private boolean enabled = false; + + // Amount of drift compensation applied + private float amount = 0.8f; + + // Max resets for the calculated average drift + private int maxResets = 6; + + public DriftCompensationConfig() { + } + + public void updateTrackersDriftCompensation() { + for (Tracker t : Main.getVrServer().getAllTrackers()) { + Tracker tracker = t.get(); + if (tracker instanceof IMUTracker imuTracker) { + imuTracker + .setDriftCompensationSettings( + getEnabled(), + getAmount(), + getMaxResets() + ); + } + } + } + + + public boolean getEnabled() { + return enabled; + } + + public void setEnabled(boolean enabled) { + this.enabled = enabled; + } + + public float getAmount() { + return amount; + } + + public void setAmount(float amount) { + this.amount = amount; + } + + public int getMaxResets() { + return maxResets; + } + + public void setMaxResets(int maxResets) { + this.maxResets = maxResets; + } +} diff --git a/server/src/main/java/dev/slimevr/config/TrackerConfig.java b/server/src/main/java/dev/slimevr/config/TrackerConfig.java index 38a9646882..97883eb417 100644 --- a/server/src/main/java/dev/slimevr/config/TrackerConfig.java +++ b/server/src/main/java/dev/slimevr/config/TrackerConfig.java @@ -4,6 +4,7 @@ import com.fasterxml.jackson.databind.node.JsonNodeFactory; import com.fasterxml.jackson.databind.node.ObjectNode; import com.jme3.math.Quaternion; +import dev.slimevr.vr.trackers.IMUTracker; import dev.slimevr.vr.trackers.Tracker; @@ -12,10 +13,10 @@ public class TrackerConfig { private String customName; private String designation; private boolean hide; - private Quaternion adjustment; - private Quaternion mountingOrientation; + private Boolean allowDriftCompensation; + public TrackerConfig() { } @@ -24,6 +25,7 @@ public TrackerConfig(Tracker tracker) { this.designation = tracker.getBodyPosition() != null ? tracker.getBodyPosition().designation : null; this.customName = tracker.getCustomName(); + allowDriftCompensation = tracker instanceof IMUTracker; } static JsonNode toV2(JsonNode v1, JsonNodeFactory factory) { @@ -80,4 +82,12 @@ public Quaternion getMountingOrientation() { public void setMountingOrientation(Quaternion mountingOrientation) { this.mountingOrientation = mountingOrientation; } + + public Boolean getAllowDriftCompensation() { + return allowDriftCompensation; + } + + public void setAllowDriftCompensation(Boolean allowDriftCompensation) { + this.allowDriftCompensation = allowDriftCompensation; + } } diff --git a/server/src/main/java/dev/slimevr/config/VRConfig.java b/server/src/main/java/dev/slimevr/config/VRConfig.java index ace2b03fc5..69822ac008 100644 --- a/server/src/main/java/dev/slimevr/config/VRConfig.java +++ b/server/src/main/java/dev/slimevr/config/VRConfig.java @@ -22,6 +22,8 @@ public class VRConfig { private final FiltersConfig filters = new FiltersConfig(); + private final DriftCompensationConfig driftCompensation = new DriftCompensationConfig(); + private final OSCConfig oscRouter = new OSCConfig(); private final OSCConfig vrcOSC = new OSCConfig(); @@ -81,6 +83,10 @@ public FiltersConfig getFilters() { return filters; } + public DriftCompensationConfig getDriftCompensation() { + return driftCompensation; + } + public OSCConfig getOscRouter() { return oscRouter; } diff --git a/server/src/main/java/dev/slimevr/protocol/datafeed/DataFeedBuilder.java b/server/src/main/java/dev/slimevr/protocol/datafeed/DataFeedBuilder.java index b37ed1cde4..a08a6a657f 100644 --- a/server/src/main/java/dev/slimevr/protocol/datafeed/DataFeedBuilder.java +++ b/server/src/main/java/dev/slimevr/protocol/datafeed/DataFeedBuilder.java @@ -90,7 +90,7 @@ public static int createTrackerInfos(FlatBufferBuilder fbb, boolean infoMask, Tr if (tracker.getBodyPosition() != null) TrackerInfo.addBodyPart(fbb, tracker.getBodyPosition().bodyPart); TrackerInfo.addEditable(fbb, tracker.userEditable()); - TrackerInfo.addComputed(fbb, tracker.isComputed()); + TrackerInfo.addIsComputed(fbb, tracker.isComputed()); TrackerInfo.addDisplayName(fbb, displayNameOffset); TrackerInfo.addCustomName(fbb, customNameOffset); @@ -98,6 +98,8 @@ public static int createTrackerInfos(FlatBufferBuilder fbb, boolean infoMask, Tr // TODO need support: TrackerInfo.addPollRate(fbb, tracker.); if (tracker instanceof IMUTracker imuTracker) { + TrackerInfo.addIsImu(fbb, true); + if (imuTracker.getMountingOrientation() != null) { Quaternion quaternion = imuTracker.getMountingOrientation(); TrackerInfo @@ -113,7 +115,12 @@ public static int createTrackerInfos(FlatBufferBuilder fbb, boolean infoMask, Tr ) ); } + + TrackerInfo.addAllowDriftCompensation(fbb, imuTracker.getAllowDriftCompensation()); + } else { + TrackerInfo.addIsImu(fbb, false); } + return TrackerInfo.endTrackerInfo(fbb); } diff --git a/server/src/main/java/dev/slimevr/protocol/rpc/RPCHandler.java b/server/src/main/java/dev/slimevr/protocol/rpc/RPCHandler.java index 7ada2b664d..9acfa966a3 100644 --- a/server/src/main/java/dev/slimevr/protocol/rpc/RPCHandler.java +++ b/server/src/main/java/dev/slimevr/protocol/rpc/RPCHandler.java @@ -211,6 +211,10 @@ public void onAssignTrackerRequest(GenericConnection conn, RpcMessageHeader mess } } + if (tracker instanceof IMUTracker imu) { + imu.setAllowDriftCompensation(req.allowDriftCompensation()); + } + this.api.server.trackerUpdated(tracker); } diff --git a/server/src/main/java/dev/slimevr/protocol/rpc/settings/RPCSettingsBuilder.java b/server/src/main/java/dev/slimevr/protocol/rpc/settings/RPCSettingsBuilder.java index 76ca89c5b8..874cb31303 100644 --- a/server/src/main/java/dev/slimevr/protocol/rpc/settings/RPCSettingsBuilder.java +++ b/server/src/main/java/dev/slimevr/protocol/rpc/settings/RPCSettingsBuilder.java @@ -1,10 +1,7 @@ package dev.slimevr.protocol.rpc.settings; import com.google.flatbuffers.FlatBufferBuilder; -import dev.slimevr.config.FiltersConfig; -import dev.slimevr.config.LegTweaksConfig; -import dev.slimevr.config.OSCConfig; -import dev.slimevr.config.TapDetectionConfig; +import dev.slimevr.config.*; import dev.slimevr.filtering.TrackerFilters; import dev.slimevr.platform.SteamVRBridge; import dev.slimevr.vr.processor.skeleton.SkeletonConfig; @@ -89,6 +86,19 @@ public static int createFilterSettings( ); } + public static int createDriftCompensationSettings( + FlatBufferBuilder fbb, + DriftCompensationConfig driftCompensationConfig + ) { + return DriftCompensationSettings + .createDriftCompensationSettings( + fbb, + driftCompensationConfig.getEnabled(), + driftCompensationConfig.getAmount(), + driftCompensationConfig.getMaxResets() + ); + } + public static int createTapDetectionSettings( FlatBufferBuilder fbb, TapDetectionConfig tapDetectionConfig diff --git a/server/src/main/java/dev/slimevr/protocol/rpc/settings/RPCSettingsHandler.java b/server/src/main/java/dev/slimevr/protocol/rpc/settings/RPCSettingsHandler.java index 5002b16202..b2b4eac145 100644 --- a/server/src/main/java/dev/slimevr/protocol/rpc/settings/RPCSettingsHandler.java +++ b/server/src/main/java/dev/slimevr/protocol/rpc/settings/RPCSettingsHandler.java @@ -1,6 +1,7 @@ package dev.slimevr.protocol.rpc.settings; import com.google.flatbuffers.FlatBufferBuilder; +import dev.slimevr.config.DriftCompensationConfig; import dev.slimevr.config.FiltersConfig; import dev.slimevr.config.OSCConfig; import dev.slimevr.config.TapDetectionConfig; @@ -49,6 +50,11 @@ public void onSettingsRequest(GenericConnection conn, RpcMessageHeader messageHe fbb, this.api.server.getConfigManager().getVrConfig().getFilters() ), + RPCSettingsBuilder + .createDriftCompensationSettings( + fbb, + this.api.server.getConfigManager().getVrConfig().getDriftCompensation() + ), RPCSettingsBuilder .createOSCRouterSettings( fbb, @@ -113,6 +119,17 @@ public void onChangeSettingsRequest(GenericConnection conn, RpcMessageHeader mes } } + if (req.driftCompensation() != null) { + DriftCompensationConfig driftCompensationConfig = this.api.server + .getConfigManager() + .getVrConfig() + .getDriftCompensation(); + driftCompensationConfig.setEnabled(req.driftCompensation().enabled()); + driftCompensationConfig.setAmount(req.driftCompensation().amount()); + driftCompensationConfig.setMaxResets(req.driftCompensation().maxResets()); + driftCompensationConfig.updateTrackersDriftCompensation(); + } + if (req.vrcOsc() != null) { OSCConfig vrcOSCConfig = this.api.server .getConfigManager() diff --git a/server/src/main/java/dev/slimevr/vr/trackers/IMUTracker.java b/server/src/main/java/dev/slimevr/vr/trackers/IMUTracker.java index 223f381e6a..02593ef1e2 100644 --- a/server/src/main/java/dev/slimevr/vr/trackers/IMUTracker.java +++ b/server/src/main/java/dev/slimevr/vr/trackers/IMUTracker.java @@ -5,12 +5,14 @@ import com.jme3.math.Vector3f; import dev.slimevr.VRServer; import dev.slimevr.config.TrackerConfig; +import dev.slimevr.filtering.CircularArrayList; import dev.slimevr.filtering.QuaternionMovingAverage; import dev.slimevr.filtering.TrackerFilters; import dev.slimevr.vr.Device; import dev.slimevr.vr.trackers.udp.TrackersUDPServer; import dev.slimevr.vr.trackers.udp.UDPDevice; import io.eiren.util.BufferedTimer; +import io.eiren.util.collections.FastList; import java.util.Optional; @@ -57,6 +59,18 @@ public class IMUTracker protected boolean magnetometerCalibrated = false; protected BufferedTimer timer = new BufferedTimer(1f); protected QuaternionMovingAverage movingAverage; + protected boolean allowDriftCompensation = true; + protected boolean compensateDrift = false; + protected float driftAmount; + protected static long DRIFT_COOLDOWN_MS = 30000; + protected final Quaternion averagedDriftQuat = new Quaternion(); + private final FastList driftWeights = new FastList<>(); + private final static Quaternion rotationSinceReset = new Quaternion(); + private CircularArrayList driftQuats; + private CircularArrayList driftTimes; + private long totalDriftTime; + private long driftSince; + private long timeAtLastReset; public IMUTracker( UDPDevice device, @@ -80,6 +94,11 @@ public IMUTracker( vrserver.getConfigManager().getVrConfig().getFilters().enumGetType(), vrserver.getConfigManager().getVrConfig().getFilters().getAmount() ); + setDriftCompensationSettings( + vrserver.getConfigManager().getVrConfig().getDriftCompensation().getEnabled(), + vrserver.getConfigManager().getVrConfig().getDriftCompensation().getAmount(), + vrserver.getConfigManager().getVrConfig().getDriftCompensation().getMaxResets() + ); } } @@ -91,6 +110,7 @@ public void writeConfig(TrackerConfig config) { mounting != null ? mounting : new Quaternion().fromAngles(0, FastMath.PI, 0) ); config.setCustomName(customName); + config.setAllowDriftCompensation(allowDriftCompensation); } @Override @@ -113,6 +133,18 @@ public void readConfig(TrackerConfig config) { } else { bodyPosition = trackerPosition.get(); } + if (config.getAllowDriftCompensation() == null) { + // If value didn't exist, default to true and save + allowDriftCompensation = true; + vrserver + .getConfigManager() + .getVrConfig() + .getTracker(this.get()) + .setAllowDriftCompensation(true); + vrserver.getConfigManager().saveConfig(); + } else { + allowDriftCompensation = config.getAllowDriftCompensation(); + } } } @@ -129,6 +161,14 @@ public void setMountingOrientation(Quaternion mr) { } } + public boolean getAllowDriftCompensation() { + return allowDriftCompensation; + } + + public void setAllowDriftCompensation(boolean allowDriftCompensation) { + this.allowDriftCompensation = allowDriftCompensation; + } + @Override public void setFiltering(TrackerFilters type, float amount) { if (type != null) { @@ -151,6 +191,20 @@ public void setFiltering(TrackerFilters type, float amount) { } } + public void setDriftCompensationSettings(boolean enabled, float amount, int maxResets) { + compensateDrift = enabled; + driftAmount = amount; + if (enabled) { + if (driftQuats == null || maxResets != driftQuats.capacity()) { + driftQuats = new CircularArrayList<>(maxResets); + driftTimes = new CircularArrayList<>(maxResets); + } + } else { + driftQuats = null; + driftTimes = null; + } + } + @Override public void tick() { if (magnetometerCalibrated && hasNewCorrectionData) { @@ -198,6 +252,15 @@ public boolean getRotation(Quaternion store) { // prevent accidental errors while debugging other things store.multLocal(mountAdjust); adjustInternal(store); + if ((compensateDrift && allowDriftCompensation) && totalDriftTime > 0) { + store + .slerpLocal( + store.mult(averagedDriftQuat), + driftAmount + * ((float) (System.currentTimeMillis() - driftSince) + / totalDriftTime) + ); + } return true; } @@ -207,6 +270,30 @@ public boolean getRawRotation(Quaternion store) { return true; } + public Quaternion getAdjustedRawRotation() { + Quaternion rot = new Quaternion(rotQuaternion); + // correction.mult(store, store); // Correction is not used now to + // prevent accidental errors while debugging other things + rot.multLocal(mountAdjust); + adjustInternal(rot); + return rot; + } + + private Quaternion getMountedAdjustedRotation() { + Quaternion rot = new Quaternion(rotQuaternion); + rot.multLocal(mountAdjust); + if ((compensateDrift && allowDriftCompensation) && totalDriftTime > 0) { + rot + .slerpLocal( + rot.mult(averagedDriftQuat), + driftAmount + * ((float) (System.currentTimeMillis() - driftSince) + / totalDriftTime) + ); + } + return rot; + } + public void getCorrection(Quaternion store) { store.set(correction); } @@ -263,18 +350,17 @@ public void setBatteryVoltage(float voltage) { } /** - * Reset the tracker so that its current rotation is counted as (0, , 0). This allows the tracker to be strapped to body at any pitch and - * roll. - *

- * Performs {@link #resetYaw(Quaternion)} for yaw drift correction. + * Reset the tracker so that its current rotation is counted as (0, HMD Yaw, + * 0). This allows the tracker to be strapped to body at any pitch and roll. */ @Override public void resetFull(Quaternion reference) { + Quaternion rot = getAdjustedRawRotation(); fixGyroscope(getMountedAdjustedRotation()); fixAttachment(getMountedAdjustedRotation()); - - resetYaw(reference); + fixYaw(reference); + calibrateMag(); + calculateDrift(rot); } /** @@ -286,14 +372,10 @@ public void resetFull(Quaternion reference) { */ @Override public void resetYaw(Quaternion reference) { + Quaternion rot = getAdjustedRawRotation(); fixYaw(reference); - - if (magCalibrationStatus >= CalibrationAccuracy.HIGH.status) { - magnetometerCalibrated = true; - // During calibration set correction to match magnetometer readings - // TODO : Correct only yaw - correction.set(rotQuaternion).inverseLocal().multLocal(rotMagQuaternion); - } + calibrateMag(); + calculateDrift(rot); } protected void adjustInternal(Quaternion store) { @@ -303,10 +385,6 @@ protected void adjustInternal(Quaternion store) { yawFix.mult(store, store); } - private Quaternion getMountedAdjustedRotation() { - return rotQuaternion.mult(mountAdjust); - } - private void fixGyroscope(Quaternion sensorRotation) { sensorRotation.fromAngles(0, sensorRotation.getYaw(), 0); gyroFix.set(sensorRotation).inverseLocal(); @@ -362,6 +440,138 @@ private void fixYaw(Quaternion reference) { yawFix.set(sensorRotation).inverseLocal().multLocal(targetRotation); } + private void calibrateMag() { + if (magCalibrationStatus >= CalibrationAccuracy.HIGH.status) { + magnetometerCalibrated = true; + // During calibration set correction to match magnetometer readings + // TODO : Correct only yaw + correction.set(rotQuaternion).inverseLocal().multLocal(rotMagQuaternion); + } + } + + /** + * Calculates 1 since last reset and store the data related to it in + * driftQuat, timeAtLastReset and timeForLastReset + */ + synchronized public void calculateDrift(Quaternion beforeQuat) { + if (compensateDrift && allowDriftCompensation) { + Quaternion rotQuat = getAdjustedRawRotation(); + + if ( + driftSince > 0 + && System.currentTimeMillis() - timeAtLastReset > DRIFT_COOLDOWN_MS + ) { + // Check and remove from lists to keep them under the reset + // limit + if (driftQuats.size() == driftQuats.capacity()) { + driftQuats.removeLast(); + driftTimes.removeLast(); + } + + // Add new drift quaternion + driftQuats + .add( + new Quaternion() + .fromAngles( + 0f, + rotQuat.mult(beforeQuat.inverse()).getYaw(), + 0f + ) + ); + + // Add drift time to total + driftTimes.add(System.currentTimeMillis() - driftSince); + totalDriftTime = 0; + for (Long time : driftTimes) { + totalDriftTime += time; + } + + // Calculate drift Quaternions' weights + driftWeights.clear(); + for (Long time : driftTimes) { + driftWeights.add(((float) time) / ((float) totalDriftTime)); + } + // Make it so recent Quaternions weigh more + for (int i = driftWeights.size() - 1; i > 0; i--) { + // Add some of i-1's value to i + driftWeights + .set( + i, + driftWeights.get(i) + (driftWeights.get(i - 1) / driftWeights.size()) + ); + // Remove the value that was added to i from i-1 + driftWeights + .set( + i - 1, + driftWeights.get(i - 1) + - (driftWeights.get(i - 1) / driftWeights.size()) + ); + } + + // Set final averaged drift Quaternion + averagedDriftQuat.fromAveragedQuaternions(driftQuats, driftWeights); + + // Save tracker rotation and current time + rotationSinceReset.set(rotQuat.mult(beforeQuat.inverse())); + timeAtLastReset = System.currentTimeMillis(); + } else if ( + System.currentTimeMillis() - timeAtLastReset < DRIFT_COOLDOWN_MS + && driftQuats.size() > 0 + ) { + // Replace latest drift quaternion + rotationSinceReset.multLocal(beforeQuat.mult(rotQuat.inverse())); + driftQuats + .set( + driftQuats.size() - 1, + new Quaternion() + .fromAngles( + 0f, + rotationSinceReset.inverse().getYaw(), + 0f + ) + ); + + // Add drift time to total + driftTimes + .set( + driftTimes.size() - 1, + driftTimes.getLatest() + System.currentTimeMillis() - driftSince + ); + totalDriftTime = 0; + for (Long time : driftTimes) { + totalDriftTime += time; + } + + // Calculate drift Quaternions' weights + driftWeights.clear(); + for (Long time : driftTimes) { + driftWeights.add(((float) time) / ((float) totalDriftTime)); + } + // Make it so recent Quaternions weigh more + for (int i = driftWeights.size() - 1; i > 0; i--) { + driftWeights + .set( + i, + driftWeights.get(i) + (driftWeights.get(i - 1) / driftWeights.size()) + ); + driftWeights + .set( + i - 1, + driftWeights.get(i - 1) + - (driftWeights.get(i - 1) / driftWeights.size()) + ); + } + + // Set final averaged drift Quaternion + averagedDriftQuat.fromAveragedQuaternions(driftQuats, driftWeights); + } else { + timeAtLastReset = System.currentTimeMillis(); + } + + driftSince = System.currentTimeMillis(); + } + } + /** * Calculate correction between normal and magnetometer readings up to * accuracy threshold diff --git a/solarxr-protocol b/solarxr-protocol index d96bf2136f..3cb3e7aeea 160000 --- a/solarxr-protocol +++ b/solarxr-protocol @@ -1 +1 @@ -Subproject commit d96bf2136fd50b653799c9f3a925309798924272 +Subproject commit 3cb3e7aeea751239d4e7508ad4abeae4dc612298