Beyond Fail-Safe: Designing Fail-Operational State Machines for Physical AI
When encountering a fault, physical AI cannot return error codes or reset. It must be fail-operational to safely degrade functionality and maintain physical control.
Join the DZone community and get the full member experience.
Join For FreeThe Physics of Failure: Why We Can't Just 'Reboot' Physical AI
Imagine you are browsing an e-commerce website when a back-end AI service crashes. It causes the load balancer to catch the fault and leads to your request getting dropped. As a user, you are served a 500 Internal Server Error. You infer it must be a straightforward networking issue; refresh the page and continue shopping. In this case, the system gracefully protected itself by halting execution.
This is the standard fail-safe design of software engineering. It assumes that when encountering an error, the safest response is to stop further execution. It aborts the affected process entirely to prevent data corruption or an unwanted systemic collapse.
On the flip side, consider a typical safety-critical physical AI application, such as an autonomous vehicle (AV). A neural network deployed on an AV cannot rely on a fail-safe. It ingests a continuous stream of raw sensor data to calculate trajectories with low latency and high speed. If a perception node misses its compute deadline, the system cannot afford to return an error code and restart. This is because this physical AI is potentially in control of a vehicle traveling at 65 mph on a busy highway, and control execution simply cannot be halted.
Therefore, there is a need to go beyond the fail-safe architecture design when physical AI systems are involved. Such systems bound by the laws of physics must be fail-operational. A fail-operational design assumes that an abrupt stop or reset is inherently dangerous. In such a case, the system needs to appropriately respond to a fault of a given severity while maintaining essential physical control using either degraded systems or entirely redundant secondary systems. The overarching architecture must guarantee a valid and safe control signal continuously, even if internal modules experience critical faults.
The Reality of Sensor Degradation
The software AI industry focuses heavily on scaling models and optimizing inference times. That works beautifully in simulation.
Engineering for physical AI, such as autonomy, is about managing hardware reality. In the real world, sensor data streams can degrade or fail due to a variety of reasons. Physical occlusion occurs when a mud splat covers a camera lens. Another example is a plastic bag blowing across the highway and sticking directly to the LiDAR fascia. Yet another major cause is environmental attenuation, which occurs when a vehicle enters dense fog, heavy rain, or similar weather-related events. Extreme glare from a low winter sun can completely wash out an optical camera. A rock pellet striking a radar, lidar, or camera unit can permanently shatter the sensor face and lead to outright sensor stream loss.
In any of these situations, a naive fail-safe software AI might detect the occluded LiDAR as an error and immediately trigger a restart to see if the error goes away. A fail-operational human driver, however, understands context. If a human driver gets a sudden smudge on their windshield, they do not slam on the brakes. They slow down, increase their following distance, and rely more heavily on their other senses while assessing the situation.
The above real-world examples shed light on the need to architect physical AI systems that mimic this cautious and safe operation even when in a degraded or failed state.
The Architectural Solution: The Hierarchical State Machine
When developing a physical AI architecture, we must wrap our probabilistic AI planners in deterministic logic. I have explored this concept in detail in a previous article I wrote called ‘Why End-to-End AI Will Always Need Deterministic Guardrails.’ To summarize here, we cannot allow a single dropped frame to dictate physical behavior. Instead, we use a Hierarchical State Machine (HSM) equipped with a fault accumulator.
Such an architecture balances the risk of reacting to a false positive against the risk of operating blind. In general terms, an HSM utilizes three primary states:
- Nominal: Full physical AI control where sensors are clear and the system optimizes for its primary task safely and efficiently.
- Degraded mode: Due to certain internal or external conditions, the physical AI system’s capabilities are degraded. These conditions can, by nature, be temporary or permanent. This is typically detected when a fault threshold is reached, and the system actively limits functionality. For example, an AV might cap its maximum velocity at 35 mph and double its required following distance.
- Minimal risk maneuver (MRM): Extending on the degraded mode, in this mode, the physical AI system determines that the fault is severe or permanent. In such a situation, the system executes a hard-coded safety protocol. For example, an AV changes its lanes until it enters the shoulder and brings itself to a safe stop while simultaneously informing emergency services.
State Machine Implementation: A Simple Example
Let us look at what this concept could look like in practice. The following Python script simulates a System Arbitrator utilizing a hysteresis loop. The high-level arbitration is enforced via the StateMachineArbitrator class. To emulate the hysteresis, it accumulates a fault score over multiple timestamps rather than reacting instantly.
To correlate to the three primary states discussed in the previous section, let us look at three distinct physical scenarios for an autonomous vehicle, detailed below:
- Scenario A — Nominal Operation: The sensors are unobstructed, the onboard computer is operating within latency budgets, and the controls are performing as expected. In this case, the fault score rests at zero, allowing the physical AI-based AV to operate nominally
- Scenario B — Transient Fault: A plastic bag flies from the road and temporarily occludes a sensor on the AV. The system detects this occlusion, starts accumulating the fault score, and enters a degraded state. After a few seconds, the plastic bag blows away on its own, thus leading to the sensor becoming unobstructed. As the physical AI system detects this, the arbitrator allows the fault score to decay back to zero. This allows the AV to recover and continue nominal operation.
- Scenario C — Permanent Fault: A rock pellet flies from a vehicle in the front, hits the sensor pod, and shatters the camera lens and radar fascia. The system detects loss of sensing leading to the fault score rapidly accumulating past the secondary threshold, forcing the system to execute a Minimal Risk Maneuver.
class SystemState:
NOMINAL = "NOMINAL (Nominal Physical AI Operation)"
DEGRADED = "DEGRADED (Limp Mode: Reduced Speed)"
MRM = "MRM (Emergency Stop on Shoulder)"
class StateMachineArbitrator:
def __init__(self, fault_threshold=3.0, decay_rate=1.0):
self.state = SystemState.NOMINAL
self.fault_score = 0.0
self.threshold = fault_threshold
self.decay_rate = decay_rate
def evaluate_tick(self, sensor_fault_active: bool, dt: float):
"""
Input: Boolean indicating if a sensor is currently reporting an error, and time delta.
Output: The determined safe operating state of the system.
"""
# Build up fault score if error is active, otherwise let it decay
if sensor_fault_active:
self.fault_score += 1.5 * dt
else:
self.fault_score = max(0.0, self.fault_score - (self.decay_rate * dt))
# State Transition Logic
if self.fault_score >= self.threshold * 2:
self.state = SystemState.MRM
elif self.fault_score >= self.threshold:
self.state = SystemState.DEGRADED
elif self.fault_score == 0.0 and self.state == SystemState.DEGRADED:
# Only return to Nominal when fault score is completely cleared
self.state = SystemState.NOMINAL
return self.state, round(self.fault_score, 2)
# --- Scenario Runner ---
def run_scenarios():
arbitrator = StateMachineArbitrator(fault_threshold=3.0)
print("Scenario A: Clear Weather (Nominal Operation)")
for tick in range(1, 4):
state, score = arbitrator.evaluate_tick(sensor_fault_active=False, dt=1.0)
print(f"Timestep {tick}: Sensor OK. Score: {score} -> State: {state}")
print("\n")
print("Scenario B: Sensor Occlusion (Transient Fault with Recovery)")
# Bag sticks to LiDAR for 3 seconds, then blows away.
arbitrator = StateMachineArbitrator(fault_threshold=3.0)
for tick in range(1, 10):
bag_present = True if tick <= 3 else False
state, score = arbitrator.evaluate_tick(sensor_fault_active=bag_present, dt=1.0)
print(f"Timestep {tick}: Sensor Occlusion: {bag_present}. Score: {score} -> State: {state}")
print("\n")
print("Scenario C: Rock Pellet Damages Sensors (Permanent Fault)")
# Camera and Radar is permanently damaged.
arbitrator = StateMachineArbitrator(fault_threshold=3.0)
for tick in range(1, 6):
state, score = arbitrator.evaluate_tick(sensor_fault_active=True, dt=1.0)
print(f"Timestep {tick}: Sensor Damaged. Score: {score} -> State: {state}")
if __name__ == "__main__":
run_scenarios()
Beyond Autonomous Vehicles: The Universal Need for Fail-Operational Design
Autonomous vehicles are a prime example of the successful implementation of physical AI. However, the fail-operational architecture discussed above is not limited to only AVs. Rather, it is applicable for any system where physical hardware intersects with AI-based decision-making. The concept of a Hierarchical State Machine is domain agnostic. The focus lies with maintaining safe operation when one or more components of the same degrade or fail.
Autonomous Delivery Drones
Consider an autonomous delivery drone navigating a geofenced service area. Let us assume that in one of the delivery runs, it encounters unexpected heavy rain. While environmental attenuation can cause severe degradation of perception and odometry, the autonomous drone cannot result in the flight controller rebooting in mid-air. An HSM-based architecture might allow the drone's degraded state to temporarily switch over to relying solely on GPS and inertial sensors while lowering its altitude. If the fault threshold continues to build and breaches the MRM threshold, it executes a slow, vertical emergency landing.
Humanoid Robots
The same principle governs safe architectural design for humanoid robotics. A humanoid carrying a heavy payload might suffer a sudden actuator encoder failure in one of its joints. A fail-safe shutdown would cause the robot to collapse, potentially destroying the payload or injuring a bystander. However, a fail-operational state machine catches the error. Its degraded state of operation restricts movement speed while maintaining balance using the remaining healthy joints. If the fault score continues to accumulate and breaches the MRM threshold, the system locks the joints into a stable and safe static position.
Surgical Robots
Modern surgical robots are also a promising application of physical AI. A temporary loss of perception or tracking cannot result in the robotic arm dropping its instruments. Rather, if the system encounters a fault, the degraded mode freezes the arm perfectly in place to avoid causing any unintentional motion.
Conclusion: Architecting for the Inevitable
The defining challenge of physical AI is to incrementally train models on novel edge cases until the system becomes extremely robust to them in a statistical sense. However, until then, we must architect strict fail-operational state machines around such probabilistic AI models. This ensures that when the hardware encounters limitations, the system is able to degrade safely. It also ensures that an autonomous agent does not throw an exception when the environment becomes unpredictable.
We cannot prevent the physical world from interfering with our systems. However, we can control how the physical AI systems we build respond to that interference gracefully and safely.
Opinions expressed by DZone contributors are their own.
Comments