fix(battery): Add invalid sentinel for BatteryStatus remaining_capacity_wh and nominal_voltage (#27236)

This commit is contained in:
Hamish Willee
2026-04-30 18:19:12 +10:00
committed by GitHub
parent e161eb5ae7
commit 2857ad59dc
3 changed files with 6 additions and 3 deletions
+2 -2
View File
@@ -65,9 +65,9 @@ uint8 FAULT_FAILED_TO_ARM = 10 # Battery had a problem while arming
uint8 FAULT_COUNT = 11 # Counter. Keep this as last element
float32 full_charge_capacity_wh # [Wh] Compensated battery capacity
float32 remaining_capacity_wh # [Wh] Compensated battery capacity remaining
float32 remaining_capacity_wh # [Wh] [@invalid NaN] Compensated battery capacity remaining
uint16 over_discharge_count # [-] Number of battery overdischarge
float32 nominal_voltage # [V] Nominal voltage of the battery pack
float32 nominal_voltage # [V] [@invalid NaN] Nominal voltage of the battery pack
float32 internal_resistance_estimate # [Ohm] Internal resistance per cell estimate
float32 ocv_estimate # [V] Open circuit voltage estimate
+2 -1
View File
@@ -184,7 +184,8 @@ UavcanBatteryBridge::battery_aux_sub_cb(const uavcan::ReceivedDataStructure<ardu
_battery_status[instance].cell_count = math::min((uint8_t)msg.voltage_cell.size(), (uint8_t)14);
_battery_status[instance].cycle_count = msg.cycle_count;
_battery_status[instance].over_discharge_count = msg.over_discharge_count;
_battery_status[instance].nominal_voltage = msg.nominal_voltage;
// ArduPilot BatteryInfoAux convention: nominal_voltage == 0 means "not provided"
_battery_status[instance].nominal_voltage = (msg.nominal_voltage > FLT_EPSILON) ? msg.nominal_voltage : NAN;
_battery_status[instance].is_powering_off = msg.is_powering_off;
if (msg.nominal_voltage > FLT_EPSILON) {
+2
View File
@@ -184,6 +184,8 @@ battery_status_s Battery::getBatteryStatus()
battery_status.warning = _warning;
battery_status.timestamp = hrt_absolute_time();
battery_status.faults = determineFaults();
battery_status.remaining_capacity_wh = NAN; // not measured by dumb power module; smart-battery drivers overwrite
battery_status.nominal_voltage = NAN; // not measured by dumb power module; smart-battery drivers overwrite
battery_status.internal_resistance_estimate = _internal_resistance_estimate;
battery_status.ocv_estimate = _voltage_v + _internal_resistance_estimate * _params.n_cells * _current_a;
battery_status.ocv_estimate_filtered = _ocv_filter_v.getState();