Andrew Bernas built a quadcopter that navigates where GPS is unavailable, working out its position from a camera instead. A RealSense D435i depth camera feeds NVIDIA Isaac ROS Visual SLAM on a Jetson Orin Nano, and the pose goes to a PX4 flight controller that flies set patterns on its own.[1][3] The project is open source under the MIT licence, with a parts list, wiring tables, every PX4 parameter and a method to check accuracy against motion capture.[1][2][4][5] Here is the build, with the manufacturer specs for the two key parts.
The project at a glance
| Item | Detail |
|---|---|
| Built by | Andrew Bernas; the project ran from August 2024 to June 2025[1] |
| Published | Hackster.io, 22 June 2025, rated Advanced, about 7 days of work; full tutorial on the author's site[6][1] |
| Licence | MIT[5] |
| Goal | Fly autonomously with no GPS, using visual-inertial odometry for position[1][3] |
| Brain | NVIDIA Jetson Orin Nano Developer Kit, JetPack 6.2[2] |
| Eyes | RealSense D435i depth camera with built-in IMU[1] |
Parts list
| Qty | Part, as listed by the author[1] |
|---|---|
| 1 | F450 quadcopter kit |
| 1 | NVIDIA Jetson Orin Nano Developer Kit |
| 1 | Intel RealSense D435i depth camera |
| 1 | PX4 flight controller: Pixhawk 2.1 Cube Blue |
| 1 | Pololu 9 V, 5 A voltage regulator |
| 1 | USB to UART converter |
Two more things the setup guide relies on: an NVMe SSD in the Jetson, for container images and recorded data, and a separate 7 to 20 V supply for the Jetson, which the author gives a maximum draw of 36 W.[2]
The camera: RealSense D435i
From RealSense's own product page:[7]
| Spec | D435i |
|---|---|
| Depth technology | Stereo, global shutter |
| Ideal range | 0.3 m to 3 m |
| Depth accuracy | Under 2% at 2 m |
| Depth field of view | 87° × 58° |
| Depth output | Up to 1280 × 720, up to 90 fps |
| Colour camera | 1920 × 1080 at 30 fps, rolling shutter |
| Motion sensor | BMI055 IMU, time-stamped to line up with the depth data |
| Connector, size | USB-C (USB 3.1 Gen 1), 90 × 25 × 25 mm |
The computer: Jetson Orin Nano
NVIDIA rates the Jetson Orin Nano Super Developer Kit at 67 INT8 TOPS, with a 1024-core Ampere GPU, a 6-core Arm Cortex-A78AE CPU, 8 GB of LPDDR5 at 102 GB/s, and 7 to 25 W.[8] NVIDIA says owners of the original Orin Nano Developer Kit get the Super performance with a JetPack software update.[8] The author switches it on with the MAXN SUPER power mode, below.[2]
Wiring
- Camera to Jetson: USB.[2]
- Flight controller to Jetson: the flight controller's TELEM2 port through a USB to UART adapter. TELEM2 pin 2 (UART5_TX) goes to the adapter's RXD, pin 3 (UART5_RX) to its TXD.[2]
- Why not the Jetson's own pins? In the author's tests the Jetson's GPIO serial link to the flight controller was unreliable, possibly from a noisy data line, so the tutorial recommends the USB adapter.[2]
Jetson setup
-
Install JetPack 6.2.
cat /etc/nv_tegra_releaseshould show release R36, revision 4.3.[2] -
Maximum performance:
sudo /usr/bin/jetson_clocks, thensudo /usr/sbin/nvpmodel -m 2for MAXN SUPER mode.[2] -
Docker without sudo: add your user to the
dockergroup.[2] -
SSD: fit the NVMe drive, format it as ext4, mount it at
/ssdthrough/etc/fstab, and move Docker's data directory onto it.[2] -
Isaac ROS: clone
isaac_ros_commonatrelease-3.2, set the image toros2_humble.realsense, generate the GPU CDI spec, clone the VSLAM-UAV repository and build the container.[2] -
Camera firmware: the tutorial requires RealSense firmware 5.13.0.50 and warns that other versions may not work with the Isaac ROS image. Test the camera with
realsense-viewer.[2]
Tune the camera's IMU
-
Calibrate (optional): librealsense's
rs-imu-calibrationtool walks you through six positions of the camera. Write the result to the camera's EEPROM.[2] - Measure the noise: record the IMU standing still for at least 3 hours, then run an Allan variance analysis with allan_ros2 on a desktop computer. Copy the four values it gives (gyro and accelerometer noise density and random walk) into the VSLAM launch script.[2]
PX4 parameters
Set in QGroundControl on PX4 v1.15.4:[2]
| Parameter | Value | Purpose |
|---|---|---|
MAV_1_CONFIG |
TELEM2 | Talk to the Jetson over TELEM2 |
UXRCE_DDS_CFG |
0 | |
SER_TEL2_BAUD |
921600 | |
EKF2_HGT_REF |
Vision | Use the camera pose instead of GPS |
EKF2_EV_DELAY |
50.0 ms | |
EKF2_GPS_CTRL |
0 | |
EKF2_BARO_CTRL |
Disabled | |
EKF2_RNG_CTRL |
Disable range fusion | |
EKF2_REQ_NSATS |
5 | |
MAV_USEHILGPS |
Enabled | |
EKF2_MAG_TYPE |
None |
To check the link, add your user to the dialout group, reboot, and connect with MAVProxy on /dev/ttyUSB0 at 921600 baud.[2]
First flight
- Start the Isaac ROS container and run
vslam_launch.sh.[3] - In a second terminal, start the mavrospy container and launch
mavrospy.launch.py.[3] - Optional: watch
/mavros/vision_pose/pose_covto see the pose coming in, and test fly in POSITION mode first.[3] - Switch to OFFBOARD and the drone flies the pattern on its own. The default is a square; the others are circle, figure8 and spiral, each also in a "_head" version where the drone faces the way it moves.[3]
In the author's demo video, motion-capture cameras are visible, but they only record the true position for checking afterwards. In flight the drone relies on visual-inertial odometry and the flight controller's own IMU, fused in an extended Kalman filter.[3]
Check the accuracy
If you have a motion-capture system, the repository includes a validation routine. The author uses Qualisys; the configuration also supports VICON, OptiTrack, NOKOV, VRPN and Motion Analysis. You record the VSLAM pose and the motion-capture pose during a flight, convert both to CSV, and a script plots them in 3D and reports the root mean square error for position and orientation.[4] The tutorial does not publish the author's own error figures.[4]
Want to build it?
We don't stock the Jetson Orin Nano or the RealSense D435i yet. Ask us and we will quote the parts in the author's list.
Credit: project, tutorial and code by Andrew Bernas (MIT licence). Diagrams are our own drawings of the published setup.
Sources
- Andrew Bernas, GPS-Denied UAV with Visual SLAM: overview and components
- Andrew Bernas, VSLAM UAV: Hardware Setup
- Andrew Bernas, VSLAM UAV: Flight Demo
- Andrew Bernas, VSLAM UAV: Validation
- Andrew Bernas, bandofpv/VSLAM-UAV (GitHub, MIT licence)
- Andrew Bernas, GPS-Denied Drone with NVIDIA Jetson Orin Nano (Hackster.io)
- RealSense, RealSense Depth Camera D435i: details and tech specs
- NVIDIA, Jetson Orin Nano Super Developer Kit