BackDeployed
Deployed2026Robotics Software Intern — autonomy stack owner

SMR300

Autonomy stack for a 300 kg industrial AMR

A company's ROS 1 architecture replaced with a ROS 2 Humble stack written to be reused across a fleet, then validated over 300 logged trials on a live factory floor.

97%

Shelf docking success

Across 150 logged shelf-docking trials on a live factory floor.

2 cm

Mean docking error

Same 150-trial set.

3 cm

Point-to-point mismatch

Down from 5 cm, across 150 point-to-point runs.

Problem

The existing architecture was ROS 1 and had been written around one robot. A fleet needs a stack that can be configured rather than rewritten, and a factory floor needs one that degrades safely instead of stopping dead.

It also needed to be operable by engineers who do not write code, which rules out a system whose configuration surface is a set of YAML files and a terminal.

What I built

A layered stack — hardware, autonomy, operator — where each layer can be configured without editing the one below it.

  • Reusable ROS 2 autonomy stack integrating LiDAR, PGV, Nav2, an AI camera, CANopen and CiA 402
  • Reflective-marker shelf recognition for two- and four-legged shelves
  • PGV floor-tag localization with wheel-odometry fallback
  • Sector safety gating, safe aborts and alerts
  • Operator platform: mapping, map editing, URDF and sensor configuration, Nav2 tuning, mission control, deployment validation
  • Node-RED dashboard, evaluated by 5 operators and 2 engineers

Architecture

Three layers. The hardware layer speaks CANopen to Kinco servos through the full CiA 402 state machine. The autonomy layer runs Nav2 path planning, PGV localization with odometry fallback, shelf recognition and docking actions, sector safety gating and runtime diagnostics. The operator layer is the configuration and mission surface that sits on top of both.

CiA 402 that recovers instead of stopping

The ros2_control hardware plugin drives the servos through the full CiA 402 state machine with automatic fault reset, motor heartbeat monitoring, and command gating that refuses motion during initialization or error states. A separate lift-actuator driver enforces its limit switches independently, so a fault in one cannot move the other.

Localization that degrades rather than fails

PGV tag reads stream over RS-485 into a ROS 2 localization source backed by a tag map, with wheel-odometry fallback and explicit safety conditions when tag confidence drops. Getting there required URDF and sensor calibration, TF corrections, and confirmed SDO writes on the hardware interface.

Estimation tuned from measured noise

Allan variance analysis on the IMU produced real bias-instability and random-walk terms, which were injected as covariances into the IMU messages. The EKF then weights encoder against IMU corrections on measured uncertainty rather than assumed uniform reliability.

Failure diagnosis on a live floor

Intermittent docking failures were traced to direct sunlight entering through open factory doors and saturating the reflective-marker return. An environmental failure mode, not a software regression — which is the kind of answer that only comes from instrumenting the robot on the floor it actually runs on.

A docking attempt

The sequence that runs 97% of the time and, more importantly, what happens the other 3%. Nothing lifts until the pose has been validated.

  1. Approach the shelf

    Nav2 drives to the pre-dock pose.

  2. Cluster the LiDAR return

    Reflective-marker signatures isolated for two- and four-legged shelves.

  3. Is the approach corridor clean?

    No — sector safety gating blocks motion
    Yes — continue to the center check
  4. Center check on the computed pose

    Within tolerance — lift
    Out of tolerance — reposition and retry
    Retry exhausted — safe abort and alert
  5. Lift the shelf

    The lift actuator enforces its own limit switches, independently of the drives.

CiA 402, and how it recovers

The drive state machine the hardware interface drives over CANopen. The point of the diagram is the fault path: a fault resets automatically rather than stopping the robot for a person.

  1. Switch on disabled

  2. Ready to switch on

    Heartbeat monitoring confirms the drives are actually present.

  3. Operation enabled

    Velocity commands translated to Kinco CANopen frames over SocketCAN; position integrated from velocity feedback.

  4. Is the drive in fault?

    Yes — automatic fault reset sequence, then re-enable
    No — motion permitted
  5. Command gating

    Motion is refused during initialization or while any drive reports an error state.

The three layers

Each layer is configurable without editing the one below it. That is what makes the stack reusable across a fleet rather than tuned to one robot.

LayerWhat lives there
OperatorMission control and monitoring, map editor and zone management, URDF and sensor configuration, Nav2 parameter tuning, Node-RED dashboard, deployment validation
AutonomyNav2 planning and following, PGV localization with odometry fallback, shelf recognition and docking actions, sector safety gating and safe abort, obstacle detection, runtime diagnostics
Hardwareros2_control plugin, Kinco drives over CANopen, the CiA 402 state machine, lift actuator with independent limit switches, LiDAR and PGV interfaces

Validation on a live floor

300 logged trials, split across the two behaviours that matter. These are the numbers already published by the deployment.

TestTrialsResult
Shelf docking15097% success, 2 cm mean error
Point to point1503 cm mean mismatch, down from 5 cm
Operator platform5 operators, 2 engineersNode-RED dashboard evaluated in use

Limitations and failure modes

  • Reflective-marker docking is sensitive to direct sunlight on the approach corridor; mitigated by safe abort and retry rather than solved.
  • Validated on one platform. Fleet reuse is designed for and not yet demonstrated across differing hardware.

Gallery

Autonomous shelf docking — approach, align, lift
SMR300 on the factory floor, squaring up to a shelf
SMR300 on the factory floor, squaring up to a shelf
Operator control plane — live scan, path editor, safety groups
Operator control plane — live scan, path editor, safety groups
PGV mode — tag-referenced localization run
Operator control plane mid-run — live LiDAR return, planned path, saved zones, and the robot aligning to a shelf point under AUTO
Operator control plane mid-run — live LiDAR return, planned path, saved zones, and the robot aligning to a shelf point under AUTO

Not yet captured

  • Node-RED operator dashboard

Repository map

OpenRosWarehouse

The ROS 2 autonomy stack — navigation, docking, safety gating and bringup.

next_HI

The ros2_control hardware interface: CANopen and the CiA 402 state machine.

next_EKF

State estimation, with covariances derived from Allan variance analysis.

Attribution

My contribution within a team
Built at Next Robotics Lab. I architected and wrote the ROS 2 autonomy stack, the hardware interface, the localization and estimation work, and the operator platform, and ran the validation trials. The robot platform and the business context are the company's.

Related

  • RosScope

    ROS 2 fleet diagnostics — an oscilloscope for the graph

  • Ripple

    An always-on site engineer for Nav2 robots