
Robotics doesn't fail in the lab: it fails at the seams. Here's an honest map of where the stack breaks and what shipping teams do differently.
A deep read: the full picture, with the receipts.
The robotics stack is a integration problem disguised as an engineering problem. Each layer (sensors, compute, middleware, actuators) can be made to work in isolation, demonstrated cleanly, and benchmarked convincingly. The failure happens at the handoffs: the moment a LiDAR packet arrives 3 milliseconds late, the moment a DDS topic floods a constrained network, the moment a firmware update on a motor controller breaks an assumption baked into the abstraction layer six months ago. Teams that ship production robots have internalized one thing that demo teams haven't: the stack is only as strong as its worst seam.
The Sensor Layer: Timestamps, Dropouts, and the Illusion of Clean Data#
The first lie the sensor layer tells you is that data arrives cleanly and on time. In practice, every sensor class has a distinct failure personality.
The naive approach to all of this is to timestamp everything on receipt and assume synchrony. Production teams timestamp at the hardware interrupt level where possible, propagate uncertainty explicitly, and treat any sensor that misses more than a small number of consecutive packets as degraded, not absent.
Middleware in the Middle: ROS 2, DDS, and the Real-Time Ceiling#
ROS 2 is the closest thing robotics has to a lingua franca. It solves real problems: process isolation, a topic/service/action abstraction that maps naturally to robot architectures, a growing ecosystem of drivers and tools. If you're building a new robot system and you're not starting with ROS 2, you need a specific reason.
Under the hood, ROS 2 is built on DDS, Data Distribution Service, a publish-subscribe middleware standard from the Object Management Group. DDS handles discovery, serialization, transport, and quality-of-service policies. The ROS 2 abstraction layer sits on top of a DDS vendor implementation, and the choice is not cosmetic.
On a robot with a dozen nodes exchanging data at high frequency over localhost, the difference between vendors in latency, CPU overhead and discovery time is measurable in ways that affect control loop stability.
The real-time ceiling is where ROS 2's architectural compromise becomes unavoidable. ROS 2 nodes run in standard Linux processes. Linux is not a real-time operating system. Even with SCHED_FIFO scheduling, kernel preemption patches, and CPU isolation, you cannot guarantee sub-millisecond jitter in a ROS 2 node. For a path planner or a state estimator, this is acceptable. For a motor controller that needs to close a current loop at several kilohertz, it is not.
This is why micro-ROS exists. It runs a stripped-down ROS 2 client on a microcontroller, a Cortex-M4 or similar, using a bridge to connect to the main ROS 2 graph. The microcontroller runs an RTOS like FreeRTOS or Zephyr, which can meet hard real-time deadlines. The bridge (micro-ROS agent) runs on the host system and translates between the two worlds. It works, but the bridge is itself a point of failure: if it crashes or stalls, the microcontroller is isolated from the planner.
The Hard Boundary: Real-Time Control vs. High-Level Planning#
Every serious robot system has an architectural split between a low-level real-time controller and a high-level non-real-time planner. This isn't a design choice so much as a physical reality imposed by timing requirements.
The interface between these two worlds is where teams get into trouble. A common failure mode: the high-level planner sends a velocity command to the low-level controller, the command is delayed due to system load, and the low-level controller either holds the last command (which may now be wrong) or goes to a safe stop. Teams that have shipped reliable systems define this interface contract explicitly: what is the command rate, what is the timeout before the low-level system declares the high-level dead and enters a safe state, and what "safe" means for that specific platform.
The watchdog is not optional. Any low-level controller that can receive commands from a non-real-time system needs a hardware or firmware-level watchdog that triggers a known safe behavior (zero velocity, hold position, power-off) if commands stop arriving. This is not complex to implement but is frequently missing in systems that move from lab to deployment.
Fusion Without Fiction: Making Asynchronous Sensors Agree#
Sensor fusion is the process of combining multiple noisy, asynchronous data streams into a single consistent state estimate. The two dominant approaches in production systems are the Extended Kalman Filter (EKF) and factor graphs.
The cost of getting fusion wrong isn't just inaccurate state estimates. A fused pose that's wrong by a few centimeters at the wrong moment means a manipulator hits an obstacle the planner thought it had cleared, or a mobile robot chooses a path that doesn't exist. Silent fusion failures (where the filter remains confident while diverging from reality) are harder to detect than outright crashes and more dangerous in deployment.
Hardware Abstraction or Hardware Fragility#
Every sensor and actuator ships with a vendor API: a SDK, a ROS driver, or both. Every one of those APIs will change. The question is whether your system is designed so that change is contained.
This sounds obvious but requires discipline to maintain. The temptation, especially in early development, is to call vendor APIs directly because it's faster. The cost surfaces at exactly the wrong time: during integration testing at a customer site, or in a fleet of deployed robots that can't all be updated simultaneously.
A related practice: version-pin your driver layer and test firmware updates explicitly before pushing to production hardware. Vendor firmware updates have broken production robots. This is not rare.
From Demo to Deployment: What a Stack That Actually Ships Looks Like#
A robot that runs for twenty minutes in a controlled demo and a robot that runs an eight-hour shift in a warehouse are different systems. The gap is mostly in instrumentation, failure handling, and update infrastructure.
Key Takeaways#
- The stack fails at seams, not centers. Every layer works in isolation. Invest engineering effort in the interfaces between them.
- Timestamp everything at the hardware level. Software-assigned timestamps introduce jitter that fusion algorithms can't distinguish from real sensor noise.
- ROS 2 is the right starting point, but its real-time ceiling is real: plan the microcontroller/SBC split before you need it, not after.
- DDS vendor choice matters. Benchmark on your actual hardware and message patterns before assuming defaults are adequate.
- Build a HAL from day one. Vendor APIs will change; whether that change breaks your system is an architecture decision you make early.
- Graceful degradation and watchdog logic are not polish. They're the difference between a robot that demos and a robot that ships.
- Operational telemetry is how you learn from the field. You cannot debug a robot you can't observe.

Discussion