Research Assistant · GRASP Lab, University of Pennsylvania

Ground Autonomy for the DARPA Triage Challenge

Sole developer of the goal-to-goal autonomy driving a Clearpath Jackal through unstructured outdoor terrain — a 4.5K-line C++ planner, a learned terrain model, and a BEV segmentation network that took road IoU from 0.00 to 0.86.

Period

Jan 2026 – Present

Stack

ROS 2 · C++ · Motion Planning · Traversability · BEV Segmentation

Highlights

  • 01Sole developer of the autonomy stack driving a Clearpath Jackal goal-to-goal through unstructured outdoor terrain
  • 02Adapted a spline-based aerial planner to a ground robot — reused only its Hermite-spline trajectory representation and wrote the 4.5K-line C++ / ROS 2 planner around it
  • 03A* over a live traversability grid with footprint inflation and clearance shaping, safe-corridor extraction and spline optimization
  • 04Kanayama spline-tracking controller with curvature-based speed capping, slew limiting, and stuck/boxed-in recovery
  • 05Replaced three inconsistent step-height heuristics with a single terrain model reducing the LiDAR elevation map to per-cell traversability and wheel-geometry speed limits — giving curb, gutter and negative-obstacle detection
  • 06Replaced a per-cell logistic-regression terrain classifier with a 1.5M-parameter BEV U-Net over LiDAR: mIoU 25 → 63, road IoU 0.00 → 0.86, exported to ONNX at ~32 ms/scan

Demo video

Curb avoidance — the terrain model keeping the robot off the drop-off

From the robot

The heterogeneous fleet the challenge is run with — Boston Dynamics Spots alongside Clearpath Jackals. My work is the ground autonomy on the Jackal.
The heterogeneous fleet the challenge is run with — Boston Dynamics Spots alongside Clearpath Jackals. My work is the ground autonomy on the Jackal.
The Jackal and its sensor payload: the Ouster LiDAR that feeds the elevation map and the BEV segmentation network, a forward camera, GPS antennas, and the E-stop that makes outdoor testing survivable.
The Jackal and its sensor payload: the Ouster LiDAR that feeds the elevation map and the BEV segmentation network, a forward camera, GPS antennas, and the E-stop that makes outdoor testing survivable.
The terrain field cloud coloured by per-cell speed limit. Magenta is full speed on road; red is the surface the wheel-geometry model caps the robot down to. Alongside it in Foxglove: the traversability cloud, spline and seed-path viz, and the negative-obstacle layer.
The terrain field cloud coloured by per-cell speed limit. Magenta is full speed on road; red is the surface the wheel-geometry model caps the robot down to. Alongside it in Foxglove: the traversability cloud, spline and seed-path viz, and the negative-obstacle layer.
Curb and gutter. The elevation-map terrain model has to separate the drivable road from the drop-off beside it — the case three disagreeing step-height heuristics used to get wrong.
Curb and gutter. The elevation-map terrain model has to separate the drivable road from the drop-off beside it — the case three disagreeing step-height heuristics used to get wrong.
An open depot lot with sunken manhole covers. Features like these are exactly what the elevation map smooths away, which is why a separate point-cloud layer feeds the traversability grid.
An open depot lot with sunken manhole covers. Features like these are exactly what the elevation map smooths away, which is why a separate point-cloud layer feeds the traversability grid.

Write-up

The DARPA Triage Challenge asks robots to search a disaster scene and assess casualties without a human driving each platform. I own the ground autonomy: everything that takes a Clearpath Jackal from a goal request to actually arriving, across terrain that has no map, no lane structure, and plenty of ways to get stuck.

The planner started from a spline-based planner written for aerial robots. I kept only its Hermite-spline trajectory representation — the part that generalizes — and wrote the rest around it: roughly 4.5K lines of C++ and ROS 2 covering A* search over a live traversability grid with footprint inflation and clearance shaping, safe-corridor extraction, and spline optimization inside that corridor. Tracking is a Kanayama controller with curvature-based speed capping and slew limiting, plus explicit stuck and boxed-in recovery, because outdoors the interesting failures are the ones where the robot is technically fine but no longer making progress.

The bigger win was upstream, in what the planner is allowed to believe about the ground. Three separate step-height heuristics had accumulated, each disagreeing about what counted as an obstacle. I replaced them with one terrain model that reduces the LiDAR elevation map to per-cell traversability and a speed limit derived from wheel geometry — which is what finally gave the robot curbs, gutters and negative obstacles as first-class concepts, plus a point-cloud layer for thin objects the elevation map smooths away entirely.

Semantics came next. A per-cell logistic-regression terrain classifier was doing the surface labelling and doing it badly. I trained a 1.5M-parameter BEV U-Net over LiDAR on RELLIS-3D plus on-robot data, which raised mIoU from 25 to 63 and road IoU from 0.00 to 0.86 — the road class had simply never been recovered before. It runs at about 32 ms/scan through ONNX and feeds per-surface controller gain switching, so the robot drives differently on road than it does on grass.