# Battery sag

URL: /rules/battery-sag

Flags a pack whose voltage drops faster than the configured rate while the vehicle is under load. It ships off by default at version 0.9, and it observes a voltage drop, not a failing cell.



<RuleHeader id="battery_sag" />

## What it reads [#what-it-reads]

The rule reads the battery lane of the flight log. PX4 logs the pack in the `battery_status` topic, where `voltage_v` is the battery voltage in volts and `current_a` the current in amperes. The rule compares the voltage over a short window with how hard the vehicle is working at that moment.

It is the one rule that ships **off**. The Rules page lists it as version 0.9 with **Applies to** set to **T4 vehicles**, and its **Results, 30 days** reads 0 because nothing runs it until an admin turns it on.

## When it fires [#when-it-fires]

A finding is produced when pack voltage falls by more than **2.0 V within 2 s** while the load is **above 70% track current**. Both parts must hold: a slow discharge over a long drive stays below the rate, and a sharp drop at idle stays below the load gate.

The event sits on the flight log's clock at the first sample of the drop, with its bound of ±40 ms in the example dataset. Its title gives the drop, for example **battery\_status: 49.8 V to 47.2 V in 1.8 s**.

| Value                   | Example from INC-0135                          |
| ----------------------- | ---------------------------------------------- |
| Voltage before the drop | 49.8 V                                         |
| Voltage after the drop  | 47.2 V                                         |
| Drop and time           | 2.6 V in 1.8 s                                 |
| Load                    | 82% track current                              |
| Threshold               | More than 2.0 V in 2 s above 70% track current |

## Wording and evidence level [#wording-and-evidence-level]

Every finding reads **Observed: battery voltage sagged**. The flight log records the voltage directly, so the level is observed. Why the voltage fell is a question the rule leaves open.

## What the finding does not mean [#what-the-finding-does-not-mean]

* **The pack is not necessarily failing.** Every pack sags under load. The rule only says this sag was faster than the configured rate at a high load.
* **It does not say which cell.** The rule reads the pack voltage. A weak cell, a warm pack and a high load can all produce the same drop.
* **It is not a PX4 battery failsafe.** PX4 raises its own battery warnings in `battery_status.warning`, from low to critical and emergency. Those are separate events on the timeline. In INC-0135 a low battery warning followed the sag 0.822 s later.
* **It does not mean the vehicle lost power.** A sag that recovers when the load eases leaves the vehicle driving.

## Threshold, scope and version [#threshold-scope-and-version]

The threshold reads **More than 2.0 V in 2 s above 70% track current**, applied to **T4 vehicles** in the example configuration. Because the rule is below version 1.0, check its threshold against your own packs before you turn it on: a 2.0 V drop means different things on different pack voltages.

Turn it on with the **Enabled** switch under **Rules**. The console confirms &#x2A;*Battery sag enabled. Applies to the next import.**, and the audit log records **Enabled rule** with the detail **Version 0.9**. A threshold change under **Edit** saves as `battery_sag 0.10`, and findings already produced keep version 0.9 and its threshold. See [Thresholds, scopes and overrides](/rules/configure).

## Example finding [#example-finding]

In INC-0135, UGV-03 climbed the north-east hill on run R-0915, a grade climb on pack 4. At 15:17:30.208 UTC on 18 Sep, pack voltage fell from 49.8 V to 47.2 V in 1.8 s at 82% track current, and the rule flagged it as **Voltage sag**. A low battery warning followed at 15:17:31.030.

The engineers' conclusion sits in the report, not in the finding: the pack was retired after an internal resistance check. The report is approved and the incident is closed.

## Related [#related]

* [How rules work](/rules) explains default states and versions.
* [PX4 ULog](/collect/formats/px4-ulog) lists the topics the flight log carries, including `battery_status`.
* [Ground robots](/platforms/ground-robots) covers the T4 platform this rule is scoped to.
