cliff improvements

This commit is contained in:
legop3
2026-02-27 00:43:45 -05:00
parent e9e75b65ef
commit 985a2f966a
2 changed files with 32 additions and 19 deletions
+13 -5
View File
@@ -142,14 +142,22 @@ function buildRoverCtxSnapshot(roverId) {
(sensors?.bumpsAndWheelDrops?.bumpLeft ? 0.5 : 0) + (sensors?.bumpsAndWheelDrops?.bumpLeft ? 0.5 : 0) +
(sensors?.bumpsAndWheelDrops?.bumpRight ? 0.5 : 0); (sensors?.bumpsAndWheelDrops?.bumpRight ? 0.5 : 0);
const light = sensors?.lightBumper || {}; const light = sensors?.lightBumper || {};
const contactState = const contactState = docked
latestBumps >= 0.5 ? 'clear'
: latestBumps >= 0.5
? 'bumps_recent' ? 'bumps_recent'
: sensors?.wall || light.left || light.frontLeft || light.centerLeft || light.centerRight || light.frontRight || light.right : sensors?.wall ||
light.left ||
light.frontLeft ||
light.centerLeft ||
light.centerRight ||
light.frontRight ||
light.right
? 'wall_brush' ? 'wall_brush'
: 'clear'; : 'clear';
const hazardState = const hazardState = docked
sensors?.virtualWall ? 'normal'
: sensors?.virtualWall
? 'virtual_wall_seen' ? 'virtual_wall_seen'
: sensors?.cliffLeft || sensors?.cliffFrontLeft || sensors?.cliffFrontRight || sensors?.cliffRight : sensors?.cliffLeft || sensors?.cliffFrontLeft || sensors?.cliffFrontRight || sensors?.cliffRight
? 'cliff_alert' ? 'cliff_alert'
+10 -5
View File
@@ -279,6 +279,7 @@ function upsertActivityState(roverId) {
function onSensorEvent({ roverId, sensors, batteryState } = {}) { function onSensorEvent({ roverId, sensors, batteryState } = {}) {
if (!roverId || !sensors) return; if (!roverId || !sensors) return;
const nowMs = Date.now(); const nowMs = Date.now();
const dockedNow = Boolean(sensors?.chargingSources?.homeBase);
const bucketTs = Math.floor(nowMs / ACTIVITY_BUCKET_MS) * ACTIVITY_BUCKET_MS; const bucketTs = Math.floor(nowMs / ACTIVITY_BUCKET_MS) * ACTIVITY_BUCKET_MS;
const state = upsertActivityState(String(roverId)); const state = upsertActivityState(String(roverId));
pruneActivityBuckets(state, nowMs); pruneActivityBuckets(state, nowMs);
@@ -290,12 +291,14 @@ function onSensorEvent({ roverId, sensors, batteryState } = {}) {
bucket.turnDeg += Math.abs(Number(sensors.angleDeg) || 0); bucket.turnDeg += Math.abs(Number(sensors.angleDeg) || 0);
const bumpLeftNow = Boolean(sensors?.bumpsAndWheelDrops?.bumpLeft); const bumpLeftNow = Boolean(sensors?.bumpsAndWheelDrops?.bumpLeft);
const bumpRightNow = Boolean(sensors?.bumpsAndWheelDrops?.bumpRight); const bumpRightNow = Boolean(sensors?.bumpsAndWheelDrops?.bumpRight);
if (!dockedNow) {
if (bumpLeftNow && !state.bumpLeftActive) { if (bumpLeftNow && !state.bumpLeftActive) {
bucket.bumps += 0.5; bucket.bumps += 0.5;
} }
if (bumpRightNow && !state.bumpRightActive) { if (bumpRightNow && !state.bumpRightActive) {
bucket.bumps += 0.5; bucket.bumps += 0.5;
} }
}
state.bumpLeftActive = bumpLeftNow; state.bumpLeftActive = bumpLeftNow;
state.bumpRightActive = bumpRightNow; state.bumpRightActive = bumpRightNow;
@@ -303,7 +306,7 @@ function onSensorEvent({ roverId, sensors, batteryState } = {}) {
const activeDrivers = getActiveDrivers(); const activeDrivers = getActiveDrivers();
const driverSocketId = activeDrivers[roverKey] || null; const driverSocketId = activeDrivers[roverKey] || null;
const driverNickname = driverSocketId ? resolveDriverNickname(driverSocketId) : null; const driverNickname = driverSocketId ? resolveDriverNickname(driverSocketId) : null;
const docked = Boolean(sensors?.chargingSources?.homeBase); const docked = dockedNow;
const charging = isChargingFromSensors(sensors); const charging = isChargingFromSensors(sensors);
const wheelsOffGround = Boolean( const wheelsOffGround = Boolean(
sensors?.bumpsAndWheelDrops?.wheelDropLeft && sensors?.bumpsAndWheelDrops?.wheelDropRight, sensors?.bumpsAndWheelDrops?.wheelDropLeft && sensors?.bumpsAndWheelDrops?.wheelDropRight,
@@ -578,7 +581,8 @@ function compactRoverForContext(rover) {
}; };
} }
function deriveContactState(sensors = {}, activity30s = {}) { function deriveContactState(sensors = {}, activity30s = {}, docked = false) {
if (docked) return 'clear';
const bumps = Number(activity30s?.bumps) || 0; const bumps = Number(activity30s?.bumps) || 0;
const hasBump = bumps >= 0.5 || sensors?.bumpsAndWheelDrops?.bumpLeft || sensors?.bumpsAndWheelDrops?.bumpRight; const hasBump = bumps >= 0.5 || sensors?.bumpsAndWheelDrops?.bumpLeft || sensors?.bumpsAndWheelDrops?.bumpRight;
if (hasBump) return 'bumps_recent'; if (hasBump) return 'bumps_recent';
@@ -590,7 +594,8 @@ function deriveContactState(sensors = {}, activity30s = {}) {
return 'clear'; return 'clear';
} }
function deriveHazardState(sensors = {}) { function deriveHazardState(sensors = {}, docked = false) {
if (docked) return 'normal';
if (Boolean(sensors?.virtualWall)) return 'virtual_wall_seen'; if (Boolean(sensors?.virtualWall)) return 'virtual_wall_seen';
if ( if (
Boolean(sensors?.cliffLeft) || Boolean(sensors?.cliffLeft) ||
@@ -651,8 +656,8 @@ function buildRoversNow(nowMs = Date.now()) {
battery_low: Boolean(batteryState?.warnActive || batteryState?.urgentActive), battery_low: Boolean(batteryState?.warnActive || batteryState?.urgentActive),
activity_30s: activity30s, activity_30s: activity30s,
status_tag: statusTag, status_tag: statusTag,
contact_state: deriveContactState(sensors, activity30s), contact_state: deriveContactState(sensors, activity30s, docked),
hazard_state: deriveHazardState(sensors), hazard_state: deriveHazardState(sensors, docked),
mobility_state: deriveMobilityState(sensors, wheelsOffGround), mobility_state: deriveMobilityState(sensors, wheelsOffGround),
}; };
const currentBaseScore = computeBaseActivityScore(activity30s); const currentBaseScore = computeBaseActivityScore(activity30s);