Add magnetic field vector (#1416)

This commit is contained in:
Aleksandra M
2025-05-12 18:59:44 +03:00
committed by GitHub
parent a35d2a77a2
commit 91ce0ed734
5 changed files with 70 additions and 17 deletions

View File

@@ -28,12 +28,20 @@ export function TrackerModel({ model }: { model: string }) {
function SceneRenderer({
quat,
vec,
mag,
model,
}: {
quat: QuatObject;
vec: Vector3Object;
mag: Vector3Object;
model: string;
}) {
const magDir = new Vector3(mag.x, mag.y, mag.z);
const magLen = magDir.length();
const magMag = Math.sqrt(magLen / 100); // normalize magnituge
if (magLen > 0)
magDir.multiplyScalar(1/ magLen);
return (
<Canvas
className="container"
@@ -61,6 +69,14 @@ function SceneRenderer({
Math.sqrt(Vector3FromVec3fT(vec).length()) * 2,
]}
/>
<arrowHelper
args={[
magDir,
magDir.clone().multiplyScalar(-magMag),
2 * magMag,
THREE.Color.NAMES.aqua,
]}
/>
<mesh position={[0, -3, 0]} rotation={[-Math.PI / 2, 0, 0]}>
<planeGeometry args={[50, 50, 10, 10]} />
@@ -102,6 +118,9 @@ export function IMUVisualizerWidget({ tracker }: { tracker: TrackerDataT }) {
tracker?.linearAcceleration ||
tracker?.rawAcceleration ||
new THREE.Vector3();
const mag =
tracker?.rawMagneticVector ||
new THREE.Vector3();
return (
<div className="bg-background-70 flex flex-col p-3 rounded-lg gap-2">
@@ -143,6 +162,17 @@ export function IMUVisualizerWidget({ tracker }: { tracker: TrackerDataT }) {
</div>
)}
{tracker.rawMagneticVector && (
<div className="flex justify-between">
<Typography color="secondary">
{l10n.getString('tracker-infos-magnetometer')}
</Typography>
<Typography>
{formatVector3(tracker.rawMagneticVector, 1)}
</Typography>
</div>
)}
{!enabled && (
<Button
variant="secondary"
@@ -175,6 +205,7 @@ export function IMUVisualizerWidget({ tracker }: { tracker: TrackerDataT }) {
<SceneRenderer
quat={{ ...quat }}
vec={{ ...vec }}
mag={{ ...mag }}
model={
isExtension ? '/models/extension.gltf' : '/models/tracker.gltf'
}

View File

@@ -17,6 +17,7 @@ export function useDataFeedConfig() {
trackerData.rotationReferenceAdjusted = true;
trackerData.rotationIdentityAdjusted = true;
trackerData.tps = true;
trackerData.rawMagneticVector = true;
const dataMask = new DeviceDataMaskT();
dataMask.deviceData = true;

View File

@@ -3,6 +3,7 @@ package dev.slimevr.protocol.datafeed;
import com.google.flatbuffers.FlatBufferBuilder;
import dev.slimevr.tracking.trackers.Device;
import dev.slimevr.tracking.trackers.Tracker;
import dev.slimevr.tracking.trackers.udp.MagnetometerStatus;
import dev.slimevr.tracking.trackers.udp.UDPDevice;
import io.github.axisangles.ktmath.Quaternion;
import io.github.axisangles.ktmath.Vector3;
@@ -80,6 +81,16 @@ public class DataFeedBuilder {
return TrackerId.endTrackerId(fbb);
}
public static int createVec3(FlatBufferBuilder fbb, Vector3 vec) {
return Vec3f
.createVec3f(
fbb,
vec.getX(),
vec.getY(),
vec.getZ()
);
}
public static int createQuat(FlatBufferBuilder fbb, Quaternion quaternion) {
return Quat
.createQuat(
@@ -146,14 +157,7 @@ public class DataFeedBuilder {
}
public static int createTrackerPosition(FlatBufferBuilder fbb, Tracker tracker) {
Vector3 pos = tracker.getPosition();
return Vec3f
.createVec3f(
fbb,
pos.getX(),
pos.getY(),
pos.getZ()
);
return createVec3(fbb, tracker.getPosition());
}
public static int createTrackerRotation(FlatBufferBuilder fbb, Tracker tracker) {
@@ -161,14 +165,11 @@ public class DataFeedBuilder {
}
public static int createTrackerAcceleration(FlatBufferBuilder fbb, Tracker tracker) {
Vector3 accel = tracker.getAcceleration();
return Vec3f
.createVec3f(
fbb,
accel.getX(),
accel.getY(),
accel.getZ()
);
return createVec3(fbb, tracker.getAcceleration());
}
public static int createTrackerMagneticVector(FlatBufferBuilder fbb, Tracker tracker) {
return createVec3(fbb, tracker.getMagVector());
}
public static int createTrackerTemperature(FlatBufferBuilder fbb, Tracker tracker) {
@@ -233,6 +234,9 @@ public class DataFeedBuilder {
if (mask.getTps()) {
TrackerData.addTps(fbb, (int) tracker.getTps());
}
if (mask.getRawMagneticVector() && tracker.getMagStatus() == MagnetometerStatus.ENABLED) {
TrackerData.addRawMagneticVector(fbb, createTrackerMagneticVector(fbb, tracker));
}
return TrackerData.endTrackerData(fbb);
}

View File

@@ -92,6 +92,7 @@ class Tracker @JvmOverloads constructor(
private var timeAtLastUpdate: Long = System.currentTimeMillis()
private var _rotation = Quaternion.IDENTITY
private var _acceleration = Vector3.NULL
private var _magVector = Vector3.NULL
var position = Vector3.NULL
val resetsHandler: TrackerResetsHandler = TrackerResetsHandler(this)
val filteringHandler: TrackerFilteringHandler = TrackerFilteringHandler()
@@ -424,6 +425,22 @@ class Tracker @JvmOverloads constructor(
}
}
/**
* Gets the magnetic field vector, in mGauss.
*/
fun getMagVector() = if (needsReset) {
resetsHandler.getReferenceAdjustedAccel(_rotation, _magVector)
} else {
_magVector
}
/**
* Sets the magnetic field vector.
*/
fun setMagVector(vec: Vector3) {
this._magVector = vec
}
/**
* Gets the current TPS of the tracker
*/