Files
RDC_Simulation/docs/ardupilot.md
2026-01-02 21:45:16 +00:00

7.5 KiB

ArduPilot SITL + Gazebo Integration

This guide explains how to run the drone simulation with ArduPilot Software-In-The-Loop (SITL) and MAVProxy, providing a realistic flight controller stack.

Overview

The ArduPilot integration replaces the simple velocity control with a full ArduPilot flight stack:

┌──────────────────┐     ┌─────────────────┐     ┌──────────────────┐
│  ArduPilot SITL  │◄───►│  Gazebo + Plugin │◄───►│  MAVLink Bridge  │
│  (Flight Control)│ JSON│  (Physics Sim)   │ ROS │  + Controllers   │
└──────────────────┘     └─────────────────┘     └──────────────────┘
        ▲                                                    │
        │ UDP                                               │
        │                                                    ▼
┌──────────────────┐                              ┌──────────────────┐
│    MAVProxy      │◄────────────────────────────►│ DroneController  │
│    (GCS)         │     MAVLink Commands         │ (Your Algorithm) │
└──────────────────┘                              └──────────────────┘

Components

Component Description
ArduPilot SITL Full autopilot firmware running in simulation
ardupilot_gazebo Plugin connecting Gazebo physics to ArduPilot
MAVProxy Ground Control Station for monitoring/commands
MAVLink Bridge ROS 2 node bridging MAVLink ↔ ROS topics
Drone Controller Your landing algorithm

Prerequisites

1. ArduPilot SITL

Install ArduPilot development environment:

# Ubuntu/Debian
git clone https://github.com/ArduPilot/ardupilot.git ~/ardupilot
cd ~/ardupilot
git submodule update --init --recursive
Tools/environment_install/install-prereqs-ubuntu.sh -y
. ~/.profile

# Set environment
echo 'export PATH=$PATH:$HOME/ardupilot/Tools/autotest' >> ~/.bashrc
echo 'export ARDUPILOT_HOME=$HOME/ardupilot' >> ~/.bashrc
source ~/.bashrc

2. ArduPilot Gazebo Plugin

Install the ardupilot_gazebo plugin:

# For Gazebo Garden/Harmonic
git clone https://github.com/ArduPilot/ardupilot_gazebo.git ~/ardupilot_gazebo
cd ~/ardupilot_gazebo
mkdir build && cd build
cmake .. -DCMAKE_BUILD_TYPE=Release
make -j4

# Add to Gazebo plugin path
echo 'export GZ_SIM_SYSTEM_PLUGIN_PATH=$HOME/ardupilot_gazebo/build:$GZ_SIM_SYSTEM_PLUGIN_PATH' >> ~/.bashrc
echo 'export GZ_SIM_RESOURCE_PATH=$HOME/ardupilot_gazebo/models:$HOME/ardupilot_gazebo/worlds:$GZ_SIM_RESOURCE_PATH' >> ~/.bashrc
source ~/.bashrc
pip install pymavlink

Quick Start

This starts everything together:

# Terminal 1: Start Gazebo
ros2 launch gazebo/launch/ardupilot_drone.launch.py

# Terminal 2: Start SITL
cd ~/ardupilot
sim_vehicle.py -v ArduCopter -f gazebo-iris --model JSON --console --map

# Terminal 3: Run bridge + controllers
python run_ardupilot.py --no-sitl --pattern circular

Option 2: Manual Setup

# Terminal 1: Start Gazebo world
gz sim -r gazebo/worlds/ardupilot_drone.sdf

# Terminal 2: Start ArduPilot SITL
cd ~/ardupilot
sim_vehicle.py -v ArduCopter -f gazebo-iris --model JSON --console

# Terminal 3: Run MAVLink bridge + controllers
python run_ardupilot.py --no-sitl

Option 3: Full Automatic

# Starts everything (requires SITL installed)
python run_ardupilot.py --pattern circular --console --map

Flight Operations

Using MAVProxy Commands

Once connected, use MAVProxy to control the drone:

# Set GUIDED mode for algorithm control
mode guided

# Arm motors
arm throttle

# Take off to 5 meters
takeoff 5

# Land
mode land

# Disarm
disarm

From Python, you can control the drone directly:

from mavlink_bridge import MAVLinkBridge

# Create bridge
bridge = MAVLinkBridge(sitl_port=14550)

# Arm and takeoff
bridge.set_mode('GUIDED')
bridge.arm()
bridge.takeoff(altitude=5.0)

# Land
bridge.land()

Files

File Description
mavlink_bridge.py ROS 2 ↔ MAVLink bridge
run_ardupilot.py Integrated launcher
gazebo/worlds/ardupilot_drone.sdf Gazebo world with ArduPilot plugin
gazebo/launch/ardupilot_drone.launch.py ROS 2 launch file

Configuration

Edit config.py to adjust ArduPilot settings:

ARDUPILOT = {
    "vehicle": "ArduCopter",      # ArduCopter, ArduPlane, APMrover2
    "frame": "gazebo-iris",       # Gazebo frame
    "sitl_host": "127.0.0.1",
    "sitl_port": 5760,
    "mavproxy_port": 14550,
}

MAVLINK = {
    "system_id": 1,
    "component_id": 191,
    "heartbeat_timeout": 5.0,
}

Telemetry Format

The MAVLink bridge publishes telemetry in the same format as other modes:

{
    "imu": {
        "orientation": {"roll": 0.0, "pitch": 0.0, "yaw": 0.0},
        "angular_velocity": {"x": 0.0, "y": 0.0, "z": 0.0}
    },
    "altimeter": {
        "altitude": 5.0,
        "vertical_velocity": 0.0
    },
    "velocity": {"x": 0.0, "y": 0.0, "z": 0.0},
    "position": {"x": 0.0, "y": 0.0, "z": 5.0},
    "landing_pad": {
        "relative_x": 0.5,
        "relative_y": 0.2,
        "distance": 4.8,
        "confidence": 0.95
    },
    "battery": {"voltage": 12.6, "remaining": 100},
    "armed": true,
    "flight_mode": "GUIDED",
    "connected": true
}

Troubleshooting

SITL Not Starting

# Check if SITL is installed
which sim_vehicle.py

# Set ArduPilot path
export ARDUPILOT_HOME=~/ardupilot
export PATH=$PATH:$ARDUPILOT_HOME/Tools/autotest

Gazebo Plugin Not Found

# Check plugin path
echo $GZ_SIM_SYSTEM_PLUGIN_PATH

# Verify plugin exists
ls ~/ardupilot_gazebo/build/libArduPilotPlugin.so
# Check if SITL is listening
netstat -tuln | grep 14550

# Test with mavlink console
python -c "from pymavlink import mavutil; c = mavutil.mavlink_connection('udpin:127.0.0.1:14550'); print(c.wait_heartbeat())"

Drone Won't Arm

Common issues:

  1. Pre-arm checks failing - Check MAVProxy console for errors
  2. GPS required - In simulation, you may need to wait for GPS lock
  3. EKF not ready - Wait for EKF to initialize

Disable pre-arm checks for testing (not recommended for real flights):

# In MAVProxy
param set ARMING_CHECK 0

Flight Modes

Mode Description
GUIDED Accept velocity/position commands from controller
LOITER Hold position (GPS required)
ALT_HOLD Maintain altitude, manual horizontal
LAND Automatic landing
STABILIZE Attitude stabilization only

For autonomous landing, use GUIDED mode.

Architecture Comparison

Feature Simple Gazebo ArduPilot + Gazebo
Flight Controller Velocity control Full ArduPilot
Stabilization Manual PD Inbuilt EKF + PID
Flight Modes None All ArduPilot modes
Arming Not required Safety checks
Failsafes None Battery, GPS, etc.
MAVLink No Full protocol
GCS Support No QGC, Mission Planner
Realism Low High