Bilel Khlaifia

Research note 004 · Embedded autonomy

Inside Redtail

How a Jetson-borne stack flew forest trails with TrailNet, stereo depth and PX4 control — and what preserving it honestly required.

Abstract

Redtail was NVIDIA’s research stack for low-flying autonomous navigation: a TrailNet deep network estimates a vehicle’s orientation and lateral offset relative to a forest trail from a single forward camera, stereo networks recover depth from a ZED pair, and a PX4/MAVROS controller converts those estimates into flight commands — all running onboard a Jetson with TensorRT acceleration. Upstream development stopped in 2020. This note documents the curated snapshot I maintain at khlaifiabilel/autonomous-uav-visual-navigation: what the system actually does node by node, what a “faithful snapshot” means in verifiable terms, and the 2026 modernization blueprint (ROS 2 Humble, CUDA 12.6, TensorRT 10, ONNX, PX4 ≥ 1.15) that ships alongside it. No historical performance figures are re-measured here, and none should be inferred: the legacy stack is preserved and audited, not re-benchmarked.

1. What Redtail is, and why preserve it

Between 2017 and 2020, Redtail demonstrated something that was far from obvious at the time: a complete perception-to-control loop for GPS-denied trail following, running entirely on an embedded GPU, with no offboard compute, lidar or prior map. The IROS 2017 paper [1] reported autonomous flights over kilometre-scale forest trails. The engineering interest today is less the headline result than the shape of the system: a small, legible set of ROS nodes with narrow contracts, each replaceable in isolation.

The repository this note documents is a curated historical snapshot of the final upstream tree, not a fork that pretends the project is alive. Three claims define it, and each is checkable:

  • Source fidelity: compared with the final upstream master, the imported source code is unchanged. Repository-specific divergences are enumerated exhaustively: two presentation PDFs removed, four PNGs losslessly optimised, governance and metadata files added, documentation added, and two recorded metadata corrections.
  • Verifiable assets: every pretrained artifact — TrailNet and split YOLO Caffe models, stereo checkpoints — carries a SHA-256 checksum in the model inventory.
  • Explicit versioning: tag v1.0.0 is the faithful legacy snapshot; main adds only a documentation and modernization layer on top of it.
Scope of claims

NVIDIA states Redtail has not been developed since 2020. The historical stack targets Ubuntu 16.04, ROS Kinetic, CUDA 9, TensorRT 3/4 and Jetson TX1/TX2. Nothing in the snapshot re-validates flight behaviour, and the repository is not safety-certified or suitable for operational autonomous flight without independent engineering and validation.

Forest trail seen with the camera rotated towards the left trail edge View rotated left
Forest trail seen with the camera aligned with the trail direction View centered
Forest trail seen with the camera rotated towards the right trail edge View rotated right
Street scene test frame used by the caffe_ros YOLO object detection tests YOLO test frame
Figure 1. Frames from the repository’s own caffe_ros integration tests. The three trail views correspond to the orientation hypotheses TrailNet is trained to separate; the street scene exercises the YOLO detection path. Images: NVIDIA Redtail test data, BSD-3-Clause.

2. Perception: a six-way softmax that steers

TrailNet is deliberately austere. A Caffe S-ResNet-18 consumes a single monocular RGB frame and emits six softmax outputs in two groups of three: view orientation relative to the trail (facing left, centered, facing right) and lateral position across it (offset left, centered, offset right). Training data was collected with multi-camera rigs whose geometry supplies the labels; the design and its loss terms are documented in the paper [1] rather than re-derived here.

The insight worth retaining is the output contract. Instead of regressing a steering angle end-to-end, the network produces two interpretable class posteriors, and the downstream controller — not the network — owns the mapping from posterior to yaw and lateral correction. That separation is what makes the DNN swappable: any model that emits the same six-channel contract on /trails_dnn/network/output can steer the vehicle.

caffe_ros wraps inference in a ROS node backed by TensorRT, with FP32, FP16 and INT8 execution paths, on-disk engine caching, and entropy calibration for INT8. The same node also serves a YOLO detector on /object_dnn/network/output; a detected person can trigger a safety stop in the controller. Both paths carry rostest/GoogleTest coverage in the snapshot — runnable only on the historical GPU/ROS stack.

Redtail dataflow diagram: forward camera, ZED stereo pair and joystick feed TrailNet, YOLO and stereo DNN nodes on the Jetson; px4_controller fuses DNN and joystick input into MAVROS setpoints for the PX4 or APM flight controller
Figure 2. Onboard dataflow as implemented by the ROS packages in the snapshot. Numbered wires are the actual topic contracts between nodes. Select the diagram to inspect it at full resolution ↗

3. Stereo depth without a lidar budget

The stereoDNN library is the second research artifact in the tree, matching the CVPR Workshops 2018 study on semi-supervised stereo depth [2]. It provides NVSmall and ResNet-18-based stereo networks as TensorFlow 1.5 checkpoints, conversion tooling to TensorRT, and — the technically interesting part — custom CUDA/TensorRT plugins for the operations TensorRT 3/4 lacked: 3D convolution, cost-volume construction and soft-argmax. Each plugin carries GoogleTest coverage over its tensor operations.

In the ROS graph, stereo_dnn_ros consumes the ZED left/right pair and publishes disparity; stereo_dnn_ros_viz renders it for inspection. The historical role was environmental awareness alongside TrailNet’s steering signal.

Left frame of the stereo sample pair shipped with the stereoDNN sample application Left frame
Right frame of the stereo sample pair shipped with the stereoDNN sample application Right frame
Figure 3. The stereo pair shipped with the stereoDNN sample application. The networks estimate a dense disparity map from this input; serialized TensorRT plans in the tree are tied to their TensorRT version and GPU and must not be assumed portable.

4. Control: posteriors in, setpoints out

px4_controller closes the loop. It subscribes to the TrailNet posterior, the YOLO detections and the joystick, and publishes position setpoints on /mavros/setpoint_position/local for PX4 OFFBOARD flight — or RC-override and waypoint commands for an APM rover. The six TrailNet channels become a yaw correction (from the orientation group) and a lateral correction (from the offset group); the joystick remains the human arbiter throughout, and a person detection can stop the vehicle.

Two properties deserve note. First, the controller is vehicle-agnostic in intent: the same node drives a drone through MAVROS/PX4 and a ground rover through APM, switched by configuration. Second, the launch files encode their era — fixed serial devices, camera paths and private-network addresses are hard-coded and must be reviewed line by line before any reuse.

5. What “faithful snapshot” means in practice

Preservation without provenance is just hosting. The snapshot treats provenance as a first-class deliverable:

  • Divergence ledger: the complete difference between this tree and the final upstream master is enumerated in the README and changelog — nothing else changed, and that claim is auditable by diff.
  • Model inventory: every pretrained artifact has a size and SHA-256 entry; the split YOLO Caffe model reassembles with a documented one-line cat, and its checksum can be verified afterwards.
  • Citable history: a Keep-a-Changelog history, CITATION.cff metadata binding the snapshot to the underlying papers, and immutable release tags replace the branch sprawl of the original project (former platform branches were consolidated into main after alignment with v1.0.0).
  • Attribution: NVIDIA’s BSD-3-Clause license, source headers and package metadata are preserved throughout.
What preservation does not claim

Snapshot fidelity is a statement about bytes, not behaviour. The historical test suites require the legacy GPU/ROS stack; no continuous integration re-runs them, and no flight or bench result in the original papers is re-validated by this repository.

6. The 2026 modernization blueprint

Alongside the frozen snapshot, the repository specifies a target stack for making the architecture — not necessarily the bytes — run on current hardware, with a phased migration plan and per-device Jetson strategy:

ComponentHistorical target2026 blueprint
Operating systemUbuntu 16.04Ubuntu 22.04 (containerised)
ROSKinetic (ROS 1)ROS 2 Humble
CUDA / cuDNN9.0 / 7.x12.6 / current
InferenceTensorRT 3.0 and 4.0.1.6, Caffe parserTensorRT 10, ONNX models
MAVLink bridgeMAVROS (ROS 1)MAVROS 2
Flight stackPX4 (2017-era) / APMPX4 v1.15+
HardwareJetson TX1/TX2 (sm_53/sm_62)Jetson Orin (JetPack 6); AGX Xavier at its JetPack 5 ceiling

A reproducible development environment ships in the tree: a Docker image built on CUDA 12.6, TensorRT 10 and ROS 2 Humble, with an L4T JetPack base argument for building directly on Jetson Orin. The blueprint is a specification and phase plan, not a completed port — the legacy Caffe models have not been re-validated under TensorRT 10 in this repository, and no modern flight results are claimed.

7. Limitations and safety boundaries

  • Legacy research software: unmaintained upstream since 2020; obsolete package repositories, legacy NVIDIA Docker workflows and broad X11 permissions appear in historical scripts.
  • No behavioural re-validation: nothing here re-measures TrailNet accuracy, stereo quality or flight performance; the papers remain the only performance evidence, on their original hardware.
  • Machine-specific configuration: launch files contain fixed serial devices, camera devices, checkout paths and private-network addresses.
  • Not flight-ready: no cybersecurity, functional-safety or aviation-compliance assessment exists; an independent manual override and applicable vehicle, airspace and radio regulations are mandatory for any experiment.
  • Non-portable engines: serialized TensorRT plans are bound to their TensorRT version and GPU; only the checksummed source models are portable artifacts.

The honest framing is that this repository is an archival and engineering-audit contribution: it makes a historically important autonomy stack legible, verifiable and citable, and it states exactly what would have to be rebuilt — and re-proven — to fly it again.

View the repository Back to portfolio

References

  1. Smolyanskiy, N., Kamenev, A., Smith, J. and Birchfield, S. “Toward Low-Flying Autonomous MAV Trail Navigation using Deep Neural Networks for Environmental Awareness.” IROS, 2017. arXiv:1705.02550.
  2. Smolyanskiy, N., Kamenev, A. and Birchfield, S. “On the Importance of Stereo for Accurate Depth Estimation: An Efficient Semi-Supervised Deep Neural Network Approach.” CVPR Workshops, 2018. arXiv:1803.09719.
  3. NVIDIA-AI-IOT. “Redtail,” original repository and wiki. GitHub.
  4. Khlaifia, B. “Autonomous UAV Visual Navigation — NVIDIA Redtail Legacy Snapshot,” release v1.0.0. Release record.

Attribution. Redtail source, models and the test/sample imagery reproduced in Figures 1 and 3 originate from NVIDIA’s Redtail project and are distributed under BSD-3-Clause with NVIDIA copyright notices preserved.