2026-02-09 04:20:22 +00:00
2026-02-09 03:39:49 +00:00
2026-02-09 03:43:10 +00:00
2026-02-09 03:39:49 +00:00
2026-02-09 04:20:22 +00:00
2026-02-09 03:39:49 +00:00
2026-02-09 04:20:22 +00:00
2026-02-09 03:39:49 +00:00
2026-02-09 03:39:49 +00:00
2026-02-09 04:20:22 +00:00
2026-02-09 04:00:11 +00:00
2026-02-09 03:39:49 +00:00
2026-02-09 04:20:22 +00:00
2026-02-09 03:39:49 +00:00
2026-02-09 03:39:49 +00:00
2026-02-09 04:20:22 +00:00
2026-02-09 04:00:11 +00:00

UAV-UGV Gazebo SITL Simulation

GPS-Denied Navigation with Geofencing

A production-ready simulation environment for UAV (drone) and UGV (ground vehicle) development using GPS-denied navigation with vision-based localization, while maintaining GPS-based geofencing for safety.

Key Feature: GPS-Denied Navigation

Navigation Mode: All vehicles navigate using relative positioning only:

  • Visual odometry from cameras
  • Optical flow sensors
  • IMU integration
  • Visual landmark tracking
  • Local coordinate frames

GPS Usage: GPS is ONLY used for:

  • Geofencing (safety boundaries)
  • NOT used for waypoint navigation
  • NOT used for position control

System Requirements

  • Ubuntu 22.04 LTS (or 24.04)
  • 16GB RAM recommended (8GB minimum)
  • 50GB disk space (for ArduPilot + Gazebo)
  • NVIDIA GPU recommended but not required

Supported Platforms

  • Native Ubuntu Linux
  • Windows WSL2 with Ubuntu 22.04

Installation (One Command)

# Clone the repository
git clone https://git.sirblob.co/SirBlob/simulation.git
cd simulation

# Run the complete setup (installs everything)
bash setup.sh

The setup script installs:

  • ROS 2 Humble
  • Gazebo 11
  • ArduPilot SITL
  • ardupilot_gazebo plugin
  • MAVROS
  • Python dependencies

Note: Full installation takes 20-40 minutes depending on your internet speed.

Quick Start

# Navigate to project
cd ~/simulation  # or wherever you cloned it

# Activate environment (sets up ROS 2, Gazebo, ArduPilot, Python)
source activate_venv.sh

# Run simulation
bash scripts/run_simulation.sh

# For WSL (if graphics issues):
bash scripts/run_simulation.sh --software-render

Controlling the UAV

Once the simulation is running, control via ROS 2:

# Arm the drone
ros2 service call /mavros/cmd/arming mavros_msgs/srv/CommandBool "{value: true}"

# Set GUIDED mode (allows position control)
ros2 service call /mavros/set_mode mavros_msgs/srv/SetMode "{custom_mode: 'GUIDED'}"

# Takeoff to 5 meters
ros2 service call /mavros/cmd/takeoff mavros_msgs/srv/CommandTOL "{altitude: 5}"

# Fly to position (LOCAL coordinates - no GPS!)
ros2 topic pub /mavros/setpoint_position/local geometry_msgs/PoseStamped \
  "{header: {frame_id: 'map'}, pose: {position: {x: 10, y: 5, z: 5}}}"

# Land
ros2 service call /mavros/cmd/land mavros_msgs/srv/CommandTOL "{}"

Features

  • Iris quadcopter with dual cameras (forward + downward)
  • Ground vehicle (UGV) with vision sensors
  • Visual odometry - camera-based position estimation
  • Optical flow - velocity estimation from downward camera
  • GPS geofencing - safety boundaries only
  • ArduPilot SITL - real flight controller firmware
  • MAVROS - ROS 2 interface for MAVLink
  • Multiple worlds - indoor warehouse, urban canyon

GPS-Denied Navigation Architecture

┌─────────────────────────────────────────────────────┐
│              Vision Sensors                         │
│  Forward Camera + Downward Camera + Optical Flow    │
└─────────────────┬───────────────────────────────────┘
                  │
                  ▼
┌─────────────────────────────────────────────────────┐
│         Visual Odometry & Feature Tracking          │
│  Estimates relative position from camera motion     │
└─────────────────┬───────────────────────────────────┘
                  │
                  ▼
┌─────────────────────────────────────────────────────┐
│         Position Estimator (EKF Fusion)             │
│  Fuses: Visual Odom + Optical Flow + IMU            │
│  Output: Local position estimate (relative)         │
└─────────────────┬───────────────────────────────────┘
                  │
                  ▼
┌─────────────────────────────────────────────────────┐
│         ArduPilot Flight Controller                 │
│  Receives position via MAVROS (external nav)       │
│  Controls motors based on local setpoints           │
└─────────────────────────────────────────────────────┘

Project Structure

simulation/
├── setup.sh                 # One-command installation
├── activate_venv.sh         # Environment activation
├── scripts/
│   ├── run_simulation.sh    # Launch full simulation
│   └── kill_simulation.sh   # Stop all processes
├── worlds/                  # Gazebo world files
├── models/                  # UAV and UGV models
├── src/
│   ├── vision/              # Visual odometry, optical flow
│   ├── localization/        # EKF sensor fusion
│   ├── navigation/          # Path planning
│   ├── control/             # UAV/UGV controllers
│   └── safety/              # Geofencing
├── config/                  # Configuration files
└── docs/                    # Documentation

Documentation

Simulation Options

# Default (ArduPilot Iris world)
bash scripts/run_simulation.sh

# Custom world
bash scripts/run_simulation.sh --world worlds/indoor_warehouse.world

# Rover instead of copter
bash scripts/run_simulation.sh --vehicle rover

# Software rendering (WSL/no GPU)
bash scripts/run_simulation.sh --software-render

Key Differences from GPS Navigation

Aspect GPS Navigation This Project (GPS-Denied)
Position Source GPS satellites Visual odometry + sensors
Waypoint Type GPS coordinates Relative coordinates (x,y,z)
Reference Frame Global (lat/lon) Local (relative to start)
Indoor Capability No Yes
Drift Minimal Accumulates over time
Geofencing GPS-based GPS-based (safety only)
Description
No description provided
Readme 646 KiB
Languages
Python 78.7%
Shell 21.3%