3.9 KiB
3.9 KiB
ArduPilot + Gazebo Guide
Overview
This project uses:
- ArduPilot SITL: Software-in-the-loop flight controller
- Gazebo: 3D physics simulation
- MAVLink: Communication protocol
Architecture
┌─────────────┐ JSON (UDP 9002) ┌─────────────┐ MAVLink (TCP 5760) ┌─────────────┐
│ Gazebo │◄──────────────────────►│ ArduPilot │◄────────────────────────►│ Your │
│ (Physics) │ sensor data │ SITL │ commands/telemetry │ Controller │
└─────────────┘ └─────────────┘ └─────────────┘
Quick Start
Step 1: Start Gazebo
cd ~/RDC_Simulation
./scripts/run_ardupilot_sim.sh runway
Wait until the drone appears in the 3D view.
Step 2: Start SITL
source ~/venv-ardupilot/bin/activate
sim_vehicle.py -v ArduCopter -f gazebo-iris --model JSON --console
You should see telemetry scrolling (NOT "No JSON sensor message").
Step 3: Run Controller
source ~/venv-ardupilot/bin/activate
cd ~/RDC_Simulation
python scripts/run_ardupilot.py --pattern square
Flight Patterns
# Square pattern (5m sides, 5m altitude)
python scripts/run_ardupilot.py --pattern square --size 5 --altitude 5
# Circle pattern (5m radius)
python scripts/run_ardupilot.py --pattern circle --size 5
# Hover in place for testing
python scripts/run_ardupilot.py --pattern hover
# Larger pattern at higher altitude
python scripts/run_ardupilot.py --pattern square --size 10 --altitude 15
Controller Code
The flight controller is in src/drone_controller.py:
from src.drone_controller import DroneController
drone = DroneController()
drone.connect()
drone.set_mode("GUIDED")
drone.arm()
drone.takeoff(5.0)
drone.fly_square(size=5, altitude=5)
drone.land()
Key Methods
| Method | Description |
|---|---|
connect() |
Connect to SITL via MAVLink |
set_mode(mode) |
Set flight mode (GUIDED, LAND, etc.) |
arm() |
Arm motors (force arm) |
takeoff(alt) |
Take off to altitude |
goto(x, y, z) |
Go to position (NED frame) |
fly_to_and_wait(x, y, alt) |
Go to position and wait |
fly_square(size, alt) |
Fly square pattern |
fly_circle(radius, alt) |
Fly circle pattern |
land() |
Land the drone |
Available Worlds
# Outdoor runway (default)
./scripts/run_ardupilot_sim.sh runway
# Indoor warehouse
./scripts/run_ardupilot_sim.sh warehouse
MAVLink Connection
The controller connects via TCP port 5760:
# config.py
MAVLINK = {
"connection_string": "tcp:127.0.0.1:5760",
}
Troubleshooting
"No JSON sensor message received"
SITL isn't receiving data from Gazebo.
Fix:
- Make sure Gazebo is running FIRST
- Wait for the world to fully load
- Then start SITL
Drone won't arm
Fix:
# Check pre-arm status in MAVProxy
arm status
# Force arm
arm throttle force
Wrong Python environment
Fix:
source ~/venv-ardupilot/bin/activate
which python3 # Should be ~/venv-ardupilot/bin/python3
Gazebo plugin not loading
Fix:
# Check plugin exists
ls ~/ardupilot_gazebo/build/libArduPilotPlugin.so
# Check paths
echo $GZ_SIM_SYSTEM_PLUGIN_PATH
# Should include: ~/ardupilot_gazebo/build
Manual SITL Control
Use MAVProxy commands:
# In SITL console
mode GUIDED
arm throttle force
takeoff 5
# Move to position
guided 10 0 -5
# Land
mode LAND
Useful Commands
# List Gazebo topics
gz topic -l
# Check SITL status
sim_vehicle.py -v ArduCopter -f gazebo-iris --model JSON --console --map
# View camera (if available)
gz topic -e -t /camera