IMU Norden kann kalibriert werden
This commit is contained in:
+74
-1
@@ -138,6 +138,24 @@
|
||||
<span class="sr-key">RPY</span>
|
||||
<strong id="imu_roll_pitch_yaw" class="sr-val">-</strong>
|
||||
</div>
|
||||
<div class="sr">
|
||||
<span class="sr-led led-blue"></span>
|
||||
<span class="sr-key">Heading roh</span>
|
||||
<strong id="imu_heading_raw" class="sr-val">-</strong>
|
||||
</div>
|
||||
<div class="sr">
|
||||
<span class="sr-led led-ok"></span>
|
||||
<span class="sr-key">Heading korr.</span>
|
||||
<strong id="imu_heading_corrected" class="sr-val">-</strong>
|
||||
</div>
|
||||
<div class="sr">
|
||||
<span class="sr-led led-off"></span>
|
||||
<span class="sr-key">Nord-Offset</span>
|
||||
<strong id="imu_heading_offset" class="sr-val">-</strong>
|
||||
</div>
|
||||
<div class="act-grid">
|
||||
<button class="act-btn subtle full" onclick="setImuNorth()">Aktuelle Richtung als Norden setzen</button>
|
||||
</div>
|
||||
<div class="sr">
|
||||
<span class="sr-led led-off"></span>
|
||||
<span class="sr-key">Hinweis</span>
|
||||
@@ -942,6 +960,9 @@
|
||||
magnetic: '--',
|
||||
quaternion: '--',
|
||||
rollPitchYaw: '--',
|
||||
headingRawDeg: null,
|
||||
headingCorrectedDeg: null,
|
||||
headingOffsetDeg: 0,
|
||||
error: '--',
|
||||
lastDataAt: 0,
|
||||
lastMagAt: 0,
|
||||
@@ -1049,6 +1070,8 @@
|
||||
imuRosState.magnetic = '--';
|
||||
imuRosState.quaternion = '--';
|
||||
imuRosState.rollPitchYaw = '--';
|
||||
imuRosState.headingRawDeg = null;
|
||||
imuRosState.headingCorrectedDeg = null;
|
||||
imuRosState.error = 'Keine ROS-Verbindung';
|
||||
imuRosState.lastDataAt = 0;
|
||||
imuRosState.lastMagAt = 0;
|
||||
@@ -1279,6 +1302,23 @@
|
||||
'Yaw ' + Number(values[2]).toFixed(1) + '°';
|
||||
}
|
||||
|
||||
function normalizeHeadingDeg(value) {
|
||||
var heading = Number(value || 0) % 360;
|
||||
if (heading < 0) heading += 360;
|
||||
return heading;
|
||||
}
|
||||
|
||||
function formatHeadingDeg(value) {
|
||||
if (typeof value !== 'number' || isNaN(value)) return '--';
|
||||
return normalizeHeadingDeg(value).toFixed(1).replace('.', ',') + '°';
|
||||
}
|
||||
|
||||
function formatHeadingOffsetDeg(value) {
|
||||
if (typeof value !== 'number' || isNaN(value)) return '--';
|
||||
var prefix = value >= 0 ? '+' : '';
|
||||
return prefix + Number(value).toFixed(1).replace('.', ',') + '°';
|
||||
}
|
||||
|
||||
function renderImuRosState() {
|
||||
var now = Date.now();
|
||||
var dataFresh = imuRosState.lastDataAt && (now - imuRosState.lastDataAt) < 3000;
|
||||
@@ -1307,6 +1347,9 @@
|
||||
setText('imu_magnetic', magFresh ? imuRosState.magnetic : '--');
|
||||
setText('imu_quaternion', dataFresh ? imuRosState.quaternion : '--');
|
||||
setText('imu_roll_pitch_yaw', dataFresh ? imuRosState.rollPitchYaw : '--');
|
||||
setText('imu_heading_raw', dataFresh ? formatHeadingDeg(imuRosState.headingRawDeg) : '--');
|
||||
setText('imu_heading_corrected', dataFresh ? formatHeadingDeg(imuRosState.headingCorrectedDeg) : '--');
|
||||
setText('imu_heading_offset', formatHeadingOffsetDeg(imuRosState.headingOffsetDeg));
|
||||
setText('imu_error', error || '-');
|
||||
}
|
||||
|
||||
@@ -2614,7 +2657,12 @@
|
||||
Number(angularVelocity.z || 0)
|
||||
], 'rad/s', 3);
|
||||
imuRosState.quaternion = formatImuQuaternion(quaternion);
|
||||
imuRosState.rollPitchYaw = formatRollPitchYaw(quaternionToEulerDeg(quaternion));
|
||||
var eulerDeg = quaternionToEulerDeg(quaternion);
|
||||
imuRosState.rollPitchYaw = formatRollPitchYaw(eulerDeg);
|
||||
imuRosState.headingRawDeg = Array.isArray(eulerDeg) ? normalizeHeadingDeg(eulerDeg[2]) : null;
|
||||
imuRosState.headingCorrectedDeg = Array.isArray(eulerDeg)
|
||||
? normalizeHeadingDeg(eulerDeg[2] + Number(imuRosState.headingOffsetDeg || 0))
|
||||
: null;
|
||||
imuRosState.lastDataAt = Date.now();
|
||||
if (!imuRosState.error || imuRosState.error === 'Keine ROS-Verbindung' || imuRosState.error === 'Noch keine frischen IMU-Daten') {
|
||||
imuRosState.error = '';
|
||||
@@ -2660,6 +2708,10 @@
|
||||
function renderStatus(data) {
|
||||
var system = data.system || {};
|
||||
var services = data.services || {};
|
||||
var imuHeading = data.imu_heading || {};
|
||||
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;
|
||||
setAdminStatus(data.status || 'Bereit');
|
||||
setText('info_ips', system.ips);
|
||||
setText('info_wifi', system.wifi);
|
||||
@@ -2695,6 +2747,7 @@
|
||||
setServiceState('camera_service_state', services.camera);
|
||||
setServiceState('service_admin_api', services.admin_api);
|
||||
setServiceState('service_exomy', services.exomy);
|
||||
renderImuRosState();
|
||||
}
|
||||
|
||||
async function fetchStatus() {
|
||||
@@ -2733,6 +2786,26 @@
|
||||
}
|
||||
}
|
||||
|
||||
async function setImuNorth() {
|
||||
if (!window.confirm('Rover jetzt wirklich sauber nach Norden ausgerichtet?')) return;
|
||||
setAdminStatus('Speichere Nordrichtung...');
|
||||
try {
|
||||
var response = await fetch(adminApiBase + '/api/imu/set-north', { method: 'POST' });
|
||||
var data = await response.json();
|
||||
if (!response.ok) throw new Error(data.status || ('status ' + response.status));
|
||||
var imuHeading = data.imu_heading || {};
|
||||
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;
|
||||
renderImuRosState();
|
||||
setAdminStatus(data.status || 'Nordrichtung gespeichert');
|
||||
window.setTimeout(fetchStatus, 500);
|
||||
} catch (error) {
|
||||
setAdminStatus('Nord-Kalibrierung fehlgeschlagen');
|
||||
alert(error.message || 'Nordrichtung konnte nicht gespeichert werden.');
|
||||
}
|
||||
}
|
||||
|
||||
async function fetchDelay() {
|
||||
try {
|
||||
var response = await fetch(adminApiBase + '/api/delay');
|
||||
|
||||
Reference in New Issue
Block a user