dies und das
This commit is contained in:
@@ -285,6 +285,7 @@ var roverCommandListener = null;
|
||||
var motorCommandsListener = null;
|
||||
var gpsFixListener = null;
|
||||
var gpsStatusListener = null;
|
||||
var gpsDiagnosticsListener = null;
|
||||
var publishTimer = null;
|
||||
var statusTimer = null;
|
||||
var axes = [0, 0, 0, 0, 0, 0];
|
||||
@@ -294,6 +295,7 @@ var motorsEnabled = true;
|
||||
var inputMode = "joystick";
|
||||
var metBase = Date.now();
|
||||
var dragging = false;
|
||||
var lastGpsDiagnostics = null;
|
||||
var REQUIRED_CALIBRATION_POINTS = [0, 20, 30, 40, 50, 60, 80, 100];
|
||||
var driveEstimator = {
|
||||
drivePwmNeutralAverage: 307,
|
||||
@@ -603,41 +605,86 @@ function updateAxesDisplay(x, y) {
|
||||
setText("dpy", formatAxis(y));
|
||||
}
|
||||
|
||||
function setGpsAccuracyDisplay(valueMeters) {
|
||||
function setGpsAccuracyDisplay(label) {
|
||||
var node = document.getElementById("gps-accuracy");
|
||||
if (!node) return;
|
||||
|
||||
node.classList.remove("gps-quality-good", "gps-quality-mid", "gps-quality-bad");
|
||||
if (typeof valueMeters !== "number" || isNaN(valueMeters) || valueMeters <= 0) {
|
||||
if (typeof label !== "string" || !label) {
|
||||
node.textContent = "--";
|
||||
return;
|
||||
}
|
||||
|
||||
node.textContent = formatNumber(valueMeters, 1) + " m";
|
||||
if (valueMeters <= 1.0) {
|
||||
node.textContent = label;
|
||||
}
|
||||
|
||||
function setGpsAccuracyState(label, tone) {
|
||||
var node = document.getElementById("gps-accuracy");
|
||||
if (!node) return;
|
||||
|
||||
node.classList.remove("gps-quality-good", "gps-quality-mid", "gps-quality-bad");
|
||||
node.textContent = label || "--";
|
||||
if (tone === "good") {
|
||||
node.classList.add("gps-quality-good");
|
||||
} else if (valueMeters <= 3.0) {
|
||||
} else if (tone === "mid") {
|
||||
node.classList.add("gps-quality-mid");
|
||||
} else {
|
||||
} else if (tone === "bad") {
|
||||
node.classList.add("gps-quality-bad");
|
||||
}
|
||||
}
|
||||
|
||||
function updateGpsAccuracyFromDiagnostics() {
|
||||
if (!lastGpsDiagnostics || !lastGpsDiagnostics.connected || !lastGpsDiagnostics.valid) {
|
||||
setGpsAccuracyState("--", "");
|
||||
return;
|
||||
}
|
||||
|
||||
var fixQuality = Number(lastGpsDiagnostics.fix_quality || 0);
|
||||
var hdop = Number(lastGpsDiagnostics.hdop);
|
||||
var pdop = Number(lastGpsDiagnostics.pdop);
|
||||
var satellitesUsed = Number(lastGpsDiagnostics.satellites_used || 0);
|
||||
var lastFixAge = Number(lastGpsDiagnostics.last_fix_age_s || 0);
|
||||
|
||||
if (fixQuality <= 0 || isNaN(hdop)) {
|
||||
setGpsAccuracyState("schlecht", "bad");
|
||||
return;
|
||||
}
|
||||
|
||||
var label = "schlecht";
|
||||
var tone = "bad";
|
||||
|
||||
if (hdop <= 1.2 && (isNaN(pdop) || pdop <= 2.0) && satellitesUsed >= 10 && lastFixAge <= 2.0) {
|
||||
label = "sehr gut";
|
||||
tone = "good";
|
||||
} else if (hdop <= 2.5 && (isNaN(pdop) || pdop <= 4.0) && satellitesUsed >= 6 && lastFixAge <= 4.0) {
|
||||
label = "gut";
|
||||
tone = "good";
|
||||
} else if (hdop <= 4.5 && (isNaN(pdop) || pdop <= 7.0) && satellitesUsed >= 4 && lastFixAge <= 8.0) {
|
||||
label = "mäßig";
|
||||
tone = "mid";
|
||||
}
|
||||
|
||||
if (satellitesUsed < 5 || lastFixAge > 8.0) {
|
||||
label = "schlecht";
|
||||
tone = "bad";
|
||||
}
|
||||
|
||||
setGpsAccuracyState(label, tone);
|
||||
}
|
||||
|
||||
function updateGpsOverlayFromFix(message) {
|
||||
if (!message) return;
|
||||
markGpsFresh();
|
||||
|
||||
var hasFix = message.status && message.status.status >= 0;
|
||||
if (!hasFix) {
|
||||
setGpsAccuracyDisplay(NaN);
|
||||
setGpsAccuracyState("--", "");
|
||||
setText("gps-lat", "--");
|
||||
setText("gps-lon", "--");
|
||||
return;
|
||||
}
|
||||
|
||||
var covariance = Array.isArray(message.position_covariance) ? Number(message.position_covariance[0]) : NaN;
|
||||
var accuracyMeters = covariance > 0 ? Math.sqrt(covariance) : NaN;
|
||||
setGpsAccuracyDisplay(accuracyMeters);
|
||||
updateGpsAccuracyFromDiagnostics();
|
||||
setText("gps-lat", formatNumber(Number(message.latitude || 0), 5));
|
||||
setText("gps-lon", formatNumber(Number(message.longitude || 0), 5));
|
||||
}
|
||||
@@ -648,6 +695,15 @@ function updateGpsOverlayFromStatus(text) {
|
||||
setText("gps-state", value);
|
||||
}
|
||||
|
||||
function updateGpsOverlayFromDiagnostics(text) {
|
||||
try {
|
||||
lastGpsDiagnostics = JSON.parse(String(text || "{}"));
|
||||
} catch (error) {
|
||||
lastGpsDiagnostics = null;
|
||||
}
|
||||
updateGpsAccuracyFromDiagnostics();
|
||||
}
|
||||
|
||||
function updateModeDisplay() {
|
||||
var label = "Ackermann";
|
||||
if (driveMode === "turn-on-point") {
|
||||
@@ -748,7 +804,7 @@ function clearRosLiveDisplay() {
|
||||
liveIndicator.classList.add("is-offline");
|
||||
}
|
||||
setText("gps-state", "Offline");
|
||||
setGpsAccuracyDisplay(NaN);
|
||||
setGpsAccuracyState("--", "");
|
||||
setText("gps-lat", "--");
|
||||
setText("gps-lon", "--");
|
||||
setText("overlay-speed", "--");
|
||||
@@ -1226,6 +1282,15 @@ window.addEventListener("load", function () {
|
||||
updateGpsOverlayFromStatus(message.data);
|
||||
});
|
||||
|
||||
gpsDiagnosticsListener = new ROSLIB.Topic({
|
||||
ros: ros,
|
||||
name: "/gps/diagnostics_json",
|
||||
messageType: "std_msgs/String"
|
||||
});
|
||||
gpsDiagnosticsListener.subscribe(function (message) {
|
||||
updateGpsOverlayFromDiagnostics(message.data);
|
||||
});
|
||||
|
||||
var joySubscriber = new ROSLIB.Topic({
|
||||
ros: ros,
|
||||
name: "/joy",
|
||||
|
||||
Reference in New Issue
Block a user