admin verbessert
This commit is contained in:
+176
-17
@@ -816,6 +816,9 @@
|
||||
var roverCommandTopic = null;
|
||||
var motorCommandsTopic = null;
|
||||
var gpsFixTopic = null;
|
||||
var imuDataTopic = null;
|
||||
var imuMagTopic = null;
|
||||
var imuStatusTopic = null;
|
||||
var gpsStatusTopic = null;
|
||||
var gpsDiagnosticsTopic = null;
|
||||
var pageConnection = {
|
||||
@@ -930,6 +933,20 @@
|
||||
selectedSatellitePrn: null,
|
||||
plottedSatellites: []
|
||||
};
|
||||
var imuRosState = {
|
||||
state: 'unknown',
|
||||
status: '-',
|
||||
address: '0x4A',
|
||||
acceleration: '--',
|
||||
gyro: '--',
|
||||
magnetic: '--',
|
||||
quaternion: '--',
|
||||
rollPitchYaw: '--',
|
||||
error: '--',
|
||||
lastDataAt: 0,
|
||||
lastMagAt: 0,
|
||||
lastStatusAt: 0
|
||||
};
|
||||
|
||||
function submitPassword() {
|
||||
var input = document.getElementById('auth_input');
|
||||
@@ -982,14 +999,6 @@
|
||||
setServiceState('camera_service_state', '-');
|
||||
setServiceState('service_admin_api', '-');
|
||||
setServiceState('service_exomy', '-');
|
||||
setStateText('imu_state', 'unknown', '-');
|
||||
setText('imu_address', '--');
|
||||
setText('imu_acceleration', '--');
|
||||
setText('imu_gyro', '--');
|
||||
setText('imu_magnetic', '--');
|
||||
setText('imu_quaternion', '--');
|
||||
setText('imu_roll_pitch_yaw', '--');
|
||||
setText('imu_error', '--');
|
||||
var bar = document.getElementById('bar-temp-adm');
|
||||
if (bar) bar.style.width = '0%';
|
||||
}
|
||||
@@ -1032,6 +1041,19 @@
|
||||
gpsDiagnosticsState.utcTime = null;
|
||||
gpsDiagnosticsState.lastFixAgeS = null;
|
||||
gpsDiagnosticsState.satellites = [];
|
||||
imuRosState.state = 'unknown';
|
||||
imuRosState.status = 'ROS getrennt';
|
||||
imuRosState.address = '0x4A';
|
||||
imuRosState.acceleration = '--';
|
||||
imuRosState.gyro = '--';
|
||||
imuRosState.magnetic = '--';
|
||||
imuRosState.quaternion = '--';
|
||||
imuRosState.rollPitchYaw = '--';
|
||||
imuRosState.error = 'Keine ROS-Verbindung';
|
||||
imuRosState.lastDataAt = 0;
|
||||
imuRosState.lastMagAt = 0;
|
||||
imuRosState.lastStatusAt = 0;
|
||||
renderImuRosState();
|
||||
updateGpsDiagnosticsPanel();
|
||||
}
|
||||
|
||||
@@ -1213,6 +1235,81 @@
|
||||
node.classList.add('state_unknown');
|
||||
}
|
||||
|
||||
function formatImuVector(values, unit, decimals) {
|
||||
if (!Array.isArray(values) || values.length < 3) return '--';
|
||||
var digits = typeof decimals === 'number' ? decimals : 2;
|
||||
return 'X ' + Number(values[0]).toFixed(digits) +
|
||||
' | Y ' + Number(values[1]).toFixed(digits) +
|
||||
' | Z ' + Number(values[2]).toFixed(digits) + ' ' + unit;
|
||||
}
|
||||
|
||||
function formatImuQuaternion(values) {
|
||||
if (!Array.isArray(values) || values.length < 4) return '--';
|
||||
return 'I ' + Number(values[0]).toFixed(3) +
|
||||
' | J ' + Number(values[1]).toFixed(3) +
|
||||
' | K ' + Number(values[2]).toFixed(3) +
|
||||
' | R ' + Number(values[3]).toFixed(3);
|
||||
}
|
||||
|
||||
function quaternionToEulerDeg(values) {
|
||||
if (!Array.isArray(values) || values.length < 4) return null;
|
||||
var x = Number(values[0]);
|
||||
var y = Number(values[1]);
|
||||
var z = Number(values[2]);
|
||||
var w = Number(values[3]);
|
||||
var sinrCosp = 2 * (w * x + y * z);
|
||||
var cosrCosp = 1 - 2 * (x * x + y * y);
|
||||
var roll = Math.atan2(sinrCosp, cosrCosp);
|
||||
var sinp = 2 * (w * y - z * x);
|
||||
var pitch = Math.abs(sinp) >= 1 ? Math.sign(sinp) * (Math.PI / 2) : Math.asin(sinp);
|
||||
var sinyCosp = 2 * (w * z + x * y);
|
||||
var cosyCosp = 1 - 2 * (y * y + z * z);
|
||||
var yaw = Math.atan2(sinyCosp, cosyCosp);
|
||||
return [
|
||||
roll * 180 / Math.PI,
|
||||
pitch * 180 / Math.PI,
|
||||
yaw * 180 / Math.PI
|
||||
];
|
||||
}
|
||||
|
||||
function formatRollPitchYaw(values) {
|
||||
if (!Array.isArray(values) || values.length < 3) return '--';
|
||||
return 'Roll ' + Number(values[0]).toFixed(1) + '° | ' +
|
||||
'Pitch ' + Number(values[1]).toFixed(1) + '° | ' +
|
||||
'Yaw ' + Number(values[2]).toFixed(1) + '°';
|
||||
}
|
||||
|
||||
function renderImuRosState() {
|
||||
var now = Date.now();
|
||||
var dataFresh = imuRosState.lastDataAt && (now - imuRosState.lastDataAt) < 3000;
|
||||
var magFresh = imuRosState.lastMagAt && (now - imuRosState.lastMagAt) < 3000;
|
||||
var statusFresh = imuRosState.lastStatusAt && (now - imuRosState.lastStatusAt) < 5000;
|
||||
var state = imuRosState.state;
|
||||
var status = imuRosState.status;
|
||||
var error = imuRosState.error;
|
||||
|
||||
if (!pageConnection.rosOk) {
|
||||
state = 'unknown';
|
||||
status = 'ROS getrennt';
|
||||
error = 'Keine ROS-Verbindung';
|
||||
} else if (!dataFresh) {
|
||||
state = 'unknown';
|
||||
status = 'Warte auf IMU-Daten';
|
||||
if (!error || error === '--') error = 'Noch keine frischen IMU-Daten';
|
||||
} else if (!statusFresh && (!status || status === '-')) {
|
||||
status = 'Verbunden';
|
||||
}
|
||||
|
||||
setStateText('imu_state', state, status || '-');
|
||||
setText('imu_address', imuRosState.address);
|
||||
setText('imu_acceleration', dataFresh ? imuRosState.acceleration : '--');
|
||||
setText('imu_gyro', dataFresh ? imuRosState.gyro : '--');
|
||||
setText('imu_magnetic', magFresh ? imuRosState.magnetic : '--');
|
||||
setText('imu_quaternion', dataFresh ? imuRosState.quaternion : '--');
|
||||
setText('imu_roll_pitch_yaw', dataFresh ? imuRosState.rollPitchYaw : '--');
|
||||
setText('imu_error', error || '-');
|
||||
}
|
||||
|
||||
function formatNumber(value, digits) {
|
||||
return Number(value || 0).toLocaleString('de-DE', {
|
||||
minimumFractionDigits: digits,
|
||||
@@ -2432,6 +2529,12 @@
|
||||
ros = null;
|
||||
roverCommandTopic = null;
|
||||
motorCommandsTopic = null;
|
||||
gpsFixTopic = null;
|
||||
gpsStatusTopic = null;
|
||||
gpsDiagnosticsTopic = null;
|
||||
imuDataTopic = null;
|
||||
imuMagTopic = null;
|
||||
imuStatusTopic = null;
|
||||
window.setTimeout(connectDriveEstimatorRos, 3000);
|
||||
});
|
||||
ros.on('error', function() {
|
||||
@@ -2482,6 +2585,69 @@
|
||||
messageType: 'std_msgs/String'
|
||||
});
|
||||
gpsDiagnosticsTopic.subscribe(handleGpsDiagnostics);
|
||||
|
||||
imuDataTopic = new ROSLIB.Topic({
|
||||
ros: ros,
|
||||
name: '/imu/data',
|
||||
messageType: 'sensor_msgs/Imu'
|
||||
});
|
||||
imuDataTopic.subscribe(function(message) {
|
||||
var linearAcceleration = message.linear_acceleration || {};
|
||||
var angularVelocity = message.angular_velocity || {};
|
||||
var orientation = message.orientation || {};
|
||||
var quaternion = [
|
||||
Number(orientation.x || 0),
|
||||
Number(orientation.y || 0),
|
||||
Number(orientation.z || 0),
|
||||
Number(orientation.w || 1)
|
||||
];
|
||||
imuRosState.state = 'active';
|
||||
imuRosState.address = '0x4A';
|
||||
imuRosState.acceleration = formatImuVector([
|
||||
Number(linearAcceleration.x || 0),
|
||||
Number(linearAcceleration.y || 0),
|
||||
Number(linearAcceleration.z || 0)
|
||||
], 'm/s^2', 2);
|
||||
imuRosState.gyro = formatImuVector([
|
||||
Number(angularVelocity.x || 0),
|
||||
Number(angularVelocity.y || 0),
|
||||
Number(angularVelocity.z || 0)
|
||||
], 'rad/s', 3);
|
||||
imuRosState.quaternion = formatImuQuaternion(quaternion);
|
||||
imuRosState.rollPitchYaw = formatRollPitchYaw(quaternionToEulerDeg(quaternion));
|
||||
imuRosState.lastDataAt = Date.now();
|
||||
if (!imuRosState.error || imuRosState.error === 'Keine ROS-Verbindung' || imuRosState.error === 'Noch keine frischen IMU-Daten') {
|
||||
imuRosState.error = '';
|
||||
}
|
||||
});
|
||||
|
||||
imuMagTopic = new ROSLIB.Topic({
|
||||
ros: ros,
|
||||
name: '/imu/mag',
|
||||
messageType: 'sensor_msgs/MagneticField'
|
||||
});
|
||||
imuMagTopic.subscribe(function(message) {
|
||||
var magneticField = message.magnetic_field || {};
|
||||
imuRosState.magnetic = formatImuVector([
|
||||
Number(magneticField.x || 0) * 1000000,
|
||||
Number(magneticField.y || 0) * 1000000,
|
||||
Number(magneticField.z || 0) * 1000000
|
||||
], 'uT', 2);
|
||||
imuRosState.lastMagAt = Date.now();
|
||||
});
|
||||
|
||||
imuStatusTopic = new ROSLIB.Topic({
|
||||
ros: ros,
|
||||
name: '/imu/status',
|
||||
messageType: 'std_msgs/String'
|
||||
});
|
||||
imuStatusTopic.subscribe(function(message) {
|
||||
var text = String((message && message.data) || '').trim();
|
||||
imuRosState.status = text || 'Verbunden';
|
||||
imuRosState.state = text.indexOf('Fehler') === 0 ? 'unknown' : 'active';
|
||||
imuRosState.error = text.indexOf('Fehler') === 0 ? text : '';
|
||||
imuRosState.lastStatusAt = Date.now();
|
||||
});
|
||||
}
|
||||
|
||||
function temperatureToWidth(value) {
|
||||
@@ -2494,7 +2660,6 @@
|
||||
function renderStatus(data) {
|
||||
var system = data.system || {};
|
||||
var services = data.services || {};
|
||||
var imu = data.imu || {};
|
||||
setAdminStatus(data.status || 'Bereit');
|
||||
setText('info_ips', system.ips);
|
||||
setText('info_wifi', system.wifi);
|
||||
@@ -2530,14 +2695,6 @@
|
||||
setServiceState('camera_service_state', services.camera);
|
||||
setServiceState('service_admin_api', services.admin_api);
|
||||
setServiceState('service_exomy', services.exomy);
|
||||
setStateText('imu_state', imu.state || 'unknown', imu.status || '-');
|
||||
setText('imu_address', imu.address);
|
||||
setText('imu_acceleration', imu.acceleration);
|
||||
setText('imu_gyro', imu.gyro);
|
||||
setText('imu_magnetic', imu.magnetic);
|
||||
setText('imu_quaternion', imu.quaternion);
|
||||
setText('imu_roll_pitch_yaw', imu.roll_pitch_yaw);
|
||||
setText('imu_error', imu.error || '-');
|
||||
}
|
||||
|
||||
async function fetchStatus() {
|
||||
@@ -3109,6 +3266,7 @@
|
||||
renderWaypointList();
|
||||
applyWaypointPlanningState();
|
||||
renderDriveEstimator();
|
||||
renderImuRosState();
|
||||
updateGpsDiagnosticsPanel();
|
||||
refreshCameraPreview();
|
||||
window.setInterval(fetchStatus, 10000);
|
||||
@@ -3116,6 +3274,7 @@
|
||||
window.setInterval(fetchDelay, 5000);
|
||||
window.setInterval(fetchSpeedLimit, 5000);
|
||||
window.setInterval(fetchMotorTestStatus, 4000);
|
||||
window.setInterval(renderImuRosState, 750);
|
||||
window.setInterval(renderDriveEstimator, 250);
|
||||
window.setInterval(updatePageConnectionState, 1000);
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user