IMU kann genullt werden
This commit is contained in:
@@ -153,8 +153,24 @@
|
||||
<span class="sr-key">Nord-Offset</span>
|
||||
<strong id="imu_heading_offset" class="sr-val">-</strong>
|
||||
</div>
|
||||
<div class="sr">
|
||||
<span class="sr-led led-ok"></span>
|
||||
<span class="sr-key">Roll korr.</span>
|
||||
<strong id="imu_roll_corrected" class="sr-val">-</strong>
|
||||
</div>
|
||||
<div class="sr">
|
||||
<span class="sr-led led-ok"></span>
|
||||
<span class="sr-key">Pitch korr.</span>
|
||||
<strong id="imu_pitch_corrected" class="sr-val">-</strong>
|
||||
</div>
|
||||
<div class="sr">
|
||||
<span class="sr-led led-off"></span>
|
||||
<span class="sr-key">Neig.-Offset</span>
|
||||
<strong id="imu_tilt_offset" class="sr-val">-</strong>
|
||||
</div>
|
||||
<div class="act-grid">
|
||||
<button class="act-btn subtle full" onclick="setImuNorth()">Aktuelle Richtung als Norden setzen</button>
|
||||
<button class="act-btn subtle full" onclick="setImuLevel()">Aktuelle Neigung als Null setzen</button>
|
||||
</div>
|
||||
<div class="sr">
|
||||
<span class="sr-led led-off"></span>
|
||||
@@ -963,6 +979,10 @@
|
||||
headingRawDeg: null,
|
||||
headingCorrectedDeg: null,
|
||||
headingOffsetDeg: 0,
|
||||
rollRawDeg: null,
|
||||
pitchRawDeg: null,
|
||||
rollOffsetDeg: 0,
|
||||
pitchOffsetDeg: 0,
|
||||
error: '--',
|
||||
lastDataAt: 0,
|
||||
lastMagAt: 0,
|
||||
@@ -1072,6 +1092,8 @@
|
||||
imuRosState.rollPitchYaw = '--';
|
||||
imuRosState.headingRawDeg = null;
|
||||
imuRosState.headingCorrectedDeg = null;
|
||||
imuRosState.rollRawDeg = null;
|
||||
imuRosState.pitchRawDeg = null;
|
||||
imuRosState.error = 'Keine ROS-Verbindung';
|
||||
imuRosState.lastDataAt = 0;
|
||||
imuRosState.lastMagAt = 0;
|
||||
@@ -1350,6 +1372,11 @@
|
||||
setText('imu_heading_raw', dataFresh ? formatHeadingDeg(imuRosState.headingRawDeg) : '--');
|
||||
setText('imu_heading_corrected', dataFresh ? formatHeadingDeg(imuRosState.headingCorrectedDeg) : '--');
|
||||
setText('imu_heading_offset', formatHeadingOffsetDeg(imuRosState.headingOffsetDeg));
|
||||
var corrRoll = dataFresh && imuRosState.rollRawDeg !== null ? imuRosState.rollRawDeg + imuRosState.rollOffsetDeg : null;
|
||||
var corrPitch = dataFresh && imuRosState.pitchRawDeg !== null ? imuRosState.pitchRawDeg + imuRosState.pitchOffsetDeg : null;
|
||||
setText('imu_roll_corrected', corrRoll !== null ? corrRoll.toFixed(1) + '°' : '--');
|
||||
setText('imu_pitch_corrected', corrPitch !== null ? corrPitch.toFixed(1) + '°' : '--');
|
||||
setText('imu_tilt_offset', 'R ' + imuRosState.rollOffsetDeg.toFixed(1) + '° | P ' + imuRosState.pitchOffsetDeg.toFixed(1) + '°');
|
||||
setText('imu_error', error || '-');
|
||||
}
|
||||
|
||||
@@ -2663,6 +2690,8 @@
|
||||
imuRosState.headingCorrectedDeg = Array.isArray(eulerDeg)
|
||||
? normalizeHeadingDeg(eulerDeg[2] + Number(imuRosState.headingOffsetDeg || 0))
|
||||
: null;
|
||||
imuRosState.rollRawDeg = Array.isArray(eulerDeg) ? eulerDeg[0] : null;
|
||||
imuRosState.pitchRawDeg = Array.isArray(eulerDeg) ? eulerDeg[1] : null;
|
||||
imuRosState.lastDataAt = Date.now();
|
||||
if (!imuRosState.error || imuRosState.error === 'Keine ROS-Verbindung' || imuRosState.error === 'Noch keine frischen IMU-Daten') {
|
||||
imuRosState.error = '';
|
||||
@@ -2712,6 +2741,11 @@
|
||||
if (typeof imuHeading.offset_deg === 'number') imuRosState.headingOffsetDeg = imuHeading.offset_deg;
|
||||
if (typeof imuHeading.raw_heading_deg === 'number') imuRosState.headingRawDeg = imuHeading.raw_heading_deg;
|
||||
if (typeof imuHeading.corrected_heading_deg === 'number') imuRosState.headingCorrectedDeg = imuHeading.corrected_heading_deg;
|
||||
var imuTilt = data.imu_tilt || {};
|
||||
if (typeof imuTilt.roll_offset_deg === 'number') imuRosState.rollOffsetDeg = imuTilt.roll_offset_deg;
|
||||
if (typeof imuTilt.pitch_offset_deg === 'number') imuRosState.pitchOffsetDeg = imuTilt.pitch_offset_deg;
|
||||
if (typeof imuTilt.raw_roll_deg === 'number') imuRosState.rollRawDeg = imuTilt.raw_roll_deg;
|
||||
if (typeof imuTilt.raw_pitch_deg === 'number') imuRosState.pitchRawDeg = imuTilt.raw_pitch_deg;
|
||||
setAdminStatus(data.status || 'Bereit');
|
||||
setText('info_ips', system.ips);
|
||||
setText('info_wifi', system.wifi);
|
||||
@@ -2806,6 +2840,27 @@
|
||||
}
|
||||
}
|
||||
|
||||
async function setImuLevel() {
|
||||
if (!window.confirm('Rover jetzt wirklich waagerecht aufgestellt?')) return;
|
||||
setAdminStatus('Speichere Neigungsoffset...');
|
||||
try {
|
||||
var response = await fetch(adminApiBase + '/api/imu/set-level', { method: 'POST' });
|
||||
var data = await response.json();
|
||||
if (!response.ok) throw new Error(data.status || ('status ' + response.status));
|
||||
var imuTilt = data.imu_tilt || {};
|
||||
if (typeof imuTilt.roll_offset_deg === 'number') imuRosState.rollOffsetDeg = imuTilt.roll_offset_deg;
|
||||
if (typeof imuTilt.pitch_offset_deg === 'number') imuRosState.pitchOffsetDeg = imuTilt.pitch_offset_deg;
|
||||
if (typeof imuTilt.raw_roll_deg === 'number') imuRosState.rollRawDeg = imuTilt.raw_roll_deg;
|
||||
if (typeof imuTilt.raw_pitch_deg === 'number') imuRosState.pitchRawDeg = imuTilt.raw_pitch_deg;
|
||||
renderImuRosState();
|
||||
setAdminStatus(data.status || 'Neigung genullt');
|
||||
window.setTimeout(fetchStatus, 500);
|
||||
} catch (error) {
|
||||
setAdminStatus('Neigungskalibrierung fehlgeschlagen');
|
||||
alert(error.message || 'Neigung konnte nicht genullt werden.');
|
||||
}
|
||||
}
|
||||
|
||||
async function fetchDelay() {
|
||||
try {
|
||||
var response = await fetch(adminApiBase + '/api/delay');
|
||||
|
||||
+12
-3
@@ -324,6 +324,8 @@ var imuOverlayState = {
|
||||
pitchDeg: 0,
|
||||
yawDeg: 0,
|
||||
yawOffsetDeg: 0,
|
||||
rollOffsetDeg: 0,
|
||||
pitchOffsetDeg: 0,
|
||||
lastUpdateAt: 0
|
||||
};
|
||||
|
||||
@@ -992,12 +994,19 @@ function updateServiceState(payload) {
|
||||
var system = payload.system || {};
|
||||
var services = payload.services || {};
|
||||
var imuHeading = payload.imu_heading || {};
|
||||
var imuTilt = payload.imu_tilt || {};
|
||||
var cameraServiceState = String(services.camera || "");
|
||||
var cameraSettingsVersion = Number(services.camera_settings_version || 0);
|
||||
if (typeof imuHeading.offset_deg === "number" && !isNaN(imuHeading.offset_deg)) {
|
||||
imuOverlayState.yawOffsetDeg = Number(imuHeading.offset_deg);
|
||||
updateImuOverlaySvg();
|
||||
}
|
||||
if (typeof imuTilt.roll_offset_deg === "number" && !isNaN(imuTilt.roll_offset_deg)) {
|
||||
imuOverlayState.rollOffsetDeg = Number(imuTilt.roll_offset_deg);
|
||||
}
|
||||
if (typeof imuTilt.pitch_offset_deg === "number" && !isNaN(imuTilt.pitch_offset_deg)) {
|
||||
imuOverlayState.pitchOffsetDeg = Number(imuTilt.pitch_offset_deg);
|
||||
}
|
||||
updateImuOverlaySvg();
|
||||
updateUndervoltageDisplay(system.undervoltage || "unbekannt", system.undervoltage_state || "unknown");
|
||||
if (cameraServiceState === "active" && lastCameraServiceState && lastCameraServiceState !== "active") {
|
||||
setText("cam-state", "Verbinde...");
|
||||
@@ -1709,8 +1718,8 @@ window.addEventListener("load", function () {
|
||||
Number(orientation.z || 0),
|
||||
Number(orientation.w || 1)
|
||||
]);
|
||||
imuOverlayState.rollDeg = euler.rollDeg;
|
||||
imuOverlayState.pitchDeg = euler.pitchDeg;
|
||||
imuOverlayState.rollDeg = euler.rollDeg + imuOverlayState.rollOffsetDeg;
|
||||
imuOverlayState.pitchDeg = euler.pitchDeg + imuOverlayState.pitchOffsetDeg;
|
||||
imuOverlayState.yawDeg = euler.yawDeg;
|
||||
imuOverlayState.lastUpdateAt = Date.now();
|
||||
updateImuOverlaySvg();
|
||||
|
||||
Reference in New Issue
Block a user