Files
RDC_Simulation/docs/ardupilot.md

4.8 KiB

ArduPilot + Gazebo Simulation

Prerequisites

Before running, ensure your environment is set up:

source activate.sh
# or
source ~/.ardupilot_env && source ~/venv-ardupilot/bin/activate

Quick Start (2 Terminals)

Terminal 1 - Start Gazebo:

./scripts/run_ardupilot_sim.sh runway

Terminal 2 - Start Controller:

./scripts/run_ardupilot_controller.sh

Architecture

┌─────────────────┐     ┌─────────────────┐     ┌─────────────────┐
│ Gazebo          │◄───►│ ArduPilot SITL  │◄───►│ run_ardupilot.py│
│ (Physics)       │JSON │ (Flight Ctrl)   │MAV  │ (Your Logic)    │
└─────────────────┘     └─────────────────┘     └─────────────────┘

Communication:

  • Gazebo ↔ SITL: JSON sensor data over UDP (port 9002)
  • SITL ↔ Your Code: MAVLink over TCP (port 5760)

World Options

./scripts/run_ardupilot_sim.sh runway     # Default (outdoor runway)
./scripts/run_ardupilot_sim.sh warehouse  # Indoor warehouse
./scripts/run_ardupilot_sim.sh gimbal     # With camera gimbal
./scripts/run_ardupilot_sim.sh zephyr     # Fixed-wing aircraft
./scripts/run_ardupilot_sim.sh custom     # Your custom world
./scripts/run_ardupilot_sim.sh my_world   # gazebo/worlds/my_world.sdf

GPS-Denied Mode

The simulation runs in GPS-denied mode by default. The controller disables GPS checks and uses visual navigation.

For manual debugging with MAVProxy:

sim_vehicle.py -v ArduCopter -f gazebo-iris --model JSON --console

# In MAVProxy console:
param set ARMING_CHECK 0
mode stabilize
arm throttle force
rc 3 1500  # Throttle up

Controller Options

./scripts/run_ardupilot_controller.sh                 # Auto takeoff
./scripts/run_ardupilot_controller.sh --no-takeoff    # Manual control
./scripts/run_ardupilot_controller.sh -a 10           # 10m altitude

Files

File Purpose
scripts/run_ardupilot_sim.sh Gazebo launcher with GPU detection
scripts/run_ardupilot_controller.sh SITL + Controller launcher
scripts/run_ardupilot.py MAVLink interface script
src/drone_controller.py Your landing algorithm

Environment Variables

The scripts automatically set these, but for manual runs:

# ArduPilot tools
export PATH=$PATH:~/ardupilot/Tools/autotest

# ArduPilot venv (has empy, pymavlink, etc.)
source ~/venv-ardupilot/bin/activate

# Gazebo plugin paths
export GZ_SIM_SYSTEM_PLUGIN_PATH=~/ardupilot_gazebo/build:$GZ_SIM_SYSTEM_PLUGIN_PATH
export GZ_SIM_RESOURCE_PATH=~/ardupilot_gazebo/models:~/ardupilot_gazebo/worlds:$GZ_SIM_RESOURCE_PATH

Troubleshooting

"No JSON sensor message" or "No heartbeat"

Cause: Gazebo isn't running or ArduPilot plugin isn't loaded.

Fix:

  1. Start Gazebo first (Terminal 1)
  2. Wait for world to fully load
  3. Then start controller (Terminal 2)

"sim_vehicle.py not found"

Cause: ArduPilot tools not in PATH.

Fix:

source ~/.ardupilot_env
# or
export PATH=$PATH:~/ardupilot/Tools/autotest

"empy not found" during waf build

Cause: Wrong Python environment.

Fix:

source ~/venv-ardupilot/bin/activate
pip install empy==3.3.4
cd ~/ardupilot
./waf configure --board sitl
./waf copter

Drone doesn't respond to commands

Possible causes:

  1. Not in GUIDED mode - check MAVProxy: mode
  2. Not armed - run: arm throttle force
  3. Pre-arm checks failing - run: param set ARMING_CHECK 0

Drone immediately crashes in Gazebo

Cause: Usually a physics/plugin issue.

Fix:

# Rebuild the ArduPilot Gazebo plugin
cd ~/ardupilot_gazebo/build
cmake .. -DCMAKE_BUILD_TYPE=Release
make -j4

Simulation is laggy

Cause: Software rendering or GPU not detected.

Check:

glxinfo | grep "OpenGL renderer"

Should show your GPU name, not "llvmpipe" or "software".

Fix for WSL:

MAVProxy console not opening

Cause: Missing --console flag or display issues.

Fix:

# Run directly
sim_vehicle.py -v ArduCopter -f gazebo-iris --model JSON --console --map

# If display errors:
export DISPLAY=:0  # Linux/WSL with X server

Advanced: Custom Takeoff

To customize the takeoff behavior, edit scripts/run_ardupilot.py:

# Change altitude
TAKEOFF_ALTITUDE = 15  # meters

# Change timeout
CONNECTION_TIMEOUT = 60  # seconds

Logs

ArduPilot logs are saved to:

~/ardupilot/logs/
~/ardupilot/build/sitl/logs/

View with:

mavlogdump.py --types GPS,ATT ~/ardupilot/logs/LASTLOG.BIN