This page is the higher-level “what’s installed where, and what talks to what” reference for the ArduPilot SITL side of the simulation. The hands-on install walkthrough is on ArduPilot install (Aleks’s notes).
Component layout
~/ardupilot/ ← ArduPilot source + SITL build artifacts
└── Tools/autotest/ ← sim_vehicle.py entry point
~/ardupilot_gazebo/ ← plugin: links ArduPilot to Gazebo
~/git/proj/aerosearch/
└── claudedrone-git/
└── simulation/
├── config/
│ └── ardupilot/
│ └── indoor.parm ← our parameter overrides
├── help_scripts/
│ └── launch.sh ← orchestrates everything
└── src/drone_sim/
├── models/ ← Gazebo models (iris_claudedrone)
├── worlds/ ← Gazebo worlds
└── launch/ ← ROS 2 launch files
What talks to what
sim_vehicle.py
├── starts ArduCopter binary ────[UDP 9002/9003]──→ Gazebo (ardupilot_gazebo plugin)
└── exposes MAVLink TCP 5760 ────[TCP]─────────────→ MAVROS
│
└── ROS 2 topics (/mavros/state etc.)
Parameter files
ArduPilot defaults are designed for outdoor flight. For indoor work, we override a chunk of them in indoor.parm — sub-meter tuning, EKF source preferences, arming-check relaxation. The detailed parameter-by-parameter breakdown is in ArduCopter indoor.parm.
Critical: the .parm file must be ASCII only, no non-ASCII characters in comments, and no comment line longer than ~80 characters. The reason is the AP_Param 100-byte parser buffer — see SITL “Waiting for heartbeat” cause 2 for the full incident report.
Smoke test
cd ~/git/proj/aerosearch/claudedrone-git/simulation
./help_scripts/launch.sh --sim --headless -d -log
Within ~30 seconds: AP: ArduCopter V… Frame: QUAD/X, mode STABILIZE, MAVLink heartbeat at ~1 Hz. If that doesn’t happen, go straight to SITL “Waiting for heartbeat”.
Where to go next
- ArduPilot install (Aleks) — hands-on install
- Parallel SITL instances — running two SITL stacks on one host
- Network routing — the MAVLink → MAVROS → ROS 2 path