Ardupilot Update
This commit is contained in:
@@ -62,6 +62,34 @@ Data flow:
|
||||
- DroneController receives telemetry, publishes to `/cmd_vel`
|
||||
- GazeboBridge forwards to `/drone/cmd_vel` → Gazebo moves drone
|
||||
|
||||
### 4. ArduPilot SITL + Gazebo Mode (Three Terminals, Linux/WSL2)
|
||||
|
||||
```
|
||||
Terminal 1 Terminal 2 Terminal 3
|
||||
┌──────────────┐ ┌─────────────────┐ ┌────────────────────────┐
|
||||
│ Gazebo + │ │ ArduPilot SITL │ │ run_ardupilot.py │
|
||||
│ ArduPilot │◄──►│ sim_vehicle.py │ │ ┌──────────────────┐ │
|
||||
│ Plugin │JSON│ + MAVProxy │◄───►│ │ MAVLinkBridge │ │
|
||||
│ │ │ │ UDP │ │ DroneController │ │
|
||||
│ ardupilot_ │ │ Flight Control │ │ │ RoverController │ │
|
||||
│ drone.sdf │ │ + GCS │ │ └──────────────────┘ │
|
||||
└──────────────┘ └─────────────────┘ └────────────────────────┘
|
||||
```
|
||||
|
||||
Data flow:
|
||||
- ArduPilot SITL sends motor commands → Gazebo plugin controls drone
|
||||
- Gazebo plugin sends sensor data → ArduPilot SITL for state estimation
|
||||
- MAVProxy outputs telemetry → MAVLinkBridge converts to ROS telemetry
|
||||
- DroneController receives telemetry, publishes velocity commands
|
||||
- MAVLinkBridge sends MAVLink commands → ArduPilot SITL executes
|
||||
|
||||
Key differences from simple Gazebo mode:
|
||||
- Full ArduPilot flight controller (EKF, stabilization, failsafes)
|
||||
- Real MAVLink protocol for commands and telemetry
|
||||
- Support for all ArduPilot flight modes (GUIDED, LAND, etc.)
|
||||
- Arming checks and safety features
|
||||
- Compatible with ground control stations (QGroundControl, Mission Planner)
|
||||
|
||||
## Components
|
||||
|
||||
| File | Description |
|
||||
@@ -71,12 +99,16 @@ Data flow:
|
||||
| `simulation_host.py` | PyBullet physics server (UDP) |
|
||||
| `run_bridge.py` | PyBullet bridge + controllers |
|
||||
| `run_gazebo.py` | Gazebo bridge + controllers |
|
||||
| `run_ardupilot.py` | **ArduPilot SITL** + MAVLink bridge |
|
||||
| `mavlink_bridge.py` | MAVLink ↔ ROS 2 bridge |
|
||||
| `drone_controller.py` | **Your landing algorithm** |
|
||||
| `rover_controller.py` | Moving landing pad |
|
||||
| `ros_bridge.py` | ROS-UDP bridge (used by run_bridge.py) |
|
||||
| `gazebo_bridge.py` | Gazebo-ROS bridge (used by run_gazebo.py) |
|
||||
| `gazebo/launch/drone_landing.launch.py` | ROS 2 launch file for Gazebo |
|
||||
| `gazebo/worlds/drone_landing.sdf` | Gazebo world with drone + rover |
|
||||
| `gazebo/launch/ardupilot_drone.launch.py` | ROS 2 launch file for ArduPilot |
|
||||
| `gazebo/worlds/drone_landing.sdf` | Gazebo world with simple velocity control |
|
||||
| `gazebo/worlds/ardupilot_drone.sdf` | Gazebo world with ArduPilot plugin |
|
||||
|
||||
## ROS 2 Topics
|
||||
|
||||
|
||||
285
docs/ardupilot.md
Normal file
285
docs/ardupilot.md
Normal file
@@ -0,0 +1,285 @@
|
||||
# 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:
|
||||
|
||||
```bash
|
||||
# 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:
|
||||
|
||||
```bash
|
||||
# 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
|
||||
```
|
||||
|
||||
### 3. pymavlink
|
||||
|
||||
```bash
|
||||
pip install pymavlink
|
||||
```
|
||||
|
||||
## Quick Start
|
||||
|
||||
### Option 1: Integrated Launch (Recommended)
|
||||
|
||||
This starts everything together:
|
||||
|
||||
```bash
|
||||
# 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
|
||||
|
||||
```bash
|
||||
# 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
|
||||
|
||||
```bash
|
||||
# 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:
|
||||
|
||||
```bash
|
||||
# Set GUIDED mode for algorithm control
|
||||
mode guided
|
||||
|
||||
# Arm motors
|
||||
arm throttle
|
||||
|
||||
# Take off to 5 meters
|
||||
takeoff 5
|
||||
|
||||
# Land
|
||||
mode land
|
||||
|
||||
# Disarm
|
||||
disarm
|
||||
```
|
||||
|
||||
### Using the MAVLink Bridge API
|
||||
|
||||
From Python, you can control the drone directly:
|
||||
|
||||
```python
|
||||
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:
|
||||
|
||||
```python
|
||||
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:
|
||||
|
||||
```json
|
||||
{
|
||||
"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
|
||||
|
||||
```bash
|
||||
# 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
|
||||
|
||||
```bash
|
||||
# Check plugin path
|
||||
echo $GZ_SIM_SYSTEM_PLUGIN_PATH
|
||||
|
||||
# Verify plugin exists
|
||||
ls ~/ardupilot_gazebo/build/libArduPilotPlugin.so
|
||||
```
|
||||
|
||||
### No MAVLink Connection
|
||||
|
||||
```bash
|
||||
# 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 |
|
||||
@@ -7,6 +7,7 @@ Setup instructions for all supported platforms.
|
||||
| Platform | Command |
|
||||
|----------|---------|
|
||||
| Ubuntu/Debian | `./setup/install_ubuntu.sh` |
|
||||
| Ubuntu + ArduPilot | `./setup/install_ubuntu.sh --with-ardupilot` |
|
||||
| Arch Linux | `./setup/install_arch.sh` |
|
||||
| macOS | `./setup/install_macos.sh` |
|
||||
| Windows | `.\setup\install_windows.ps1` |
|
||||
@@ -28,6 +29,7 @@ python standalone_simulation.py
|
||||
| **Standalone Simulation** | ✅ | ✅ | ✅ | ✅ | ✅ |
|
||||
| **ROS 2** | ✅ | ⚠️ AUR | ❌ | ❌ | ✅ |
|
||||
| **Gazebo** | ✅ | ⚠️ AUR | ❌ | ❌ | ✅ |
|
||||
| **ArduPilot SITL** | ✅ | ⚠️ Manual | ❌ | ❌ | ✅ |
|
||||
| **Full Mode** | ✅ | ⚠️ | ❌ | ❌ | ✅ |
|
||||
| **GUI Support** | ✅ | ✅ | ✅ | ✅ | ✅ WSLg |
|
||||
|
||||
@@ -58,7 +60,18 @@ python standalone_simulation.py
|
||||
**Installs:**
|
||||
- ROS 2 (Humble or Jazzy based on Ubuntu version)
|
||||
- Gazebo (ros-gz)
|
||||
- Python packages: pybullet, numpy, pillow, pyinstaller
|
||||
- Python packages: pybullet, numpy, pillow, pyinstaller, pymavlink
|
||||
|
||||
**With ArduPilot SITL (full flight controller):**
|
||||
```bash
|
||||
# Run installer with ArduPilot
|
||||
./setup/install_ubuntu.sh --with-ardupilot
|
||||
|
||||
# This will also install:
|
||||
# - ArduPilot SITL (~15-20 min build)
|
||||
# - ArduPilot Gazebo plugin
|
||||
# - MAVProxy
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
@@ -407,6 +420,84 @@ After installation, verify packages:
|
||||
python -c "import pybullet; print('PyBullet OK')"
|
||||
python -c "import numpy; print('NumPy OK')"
|
||||
python -c "from PIL import Image; print('Pillow OK')"
|
||||
python -c "from pymavlink import mavutil; print('pymavlink OK')"
|
||||
```
|
||||
|
||||
All should print "OK".
|
||||
|
||||
---
|
||||
|
||||
## ArduPilot SITL Manual Setup
|
||||
|
||||
If you want to install ArduPilot SITL manually (without the install script):
|
||||
|
||||
### 1. Install ArduPilot
|
||||
|
||||
```bash
|
||||
# Clone ArduPilot
|
||||
git clone --recurse-submodules https://github.com/ArduPilot/ardupilot.git ~/ardupilot
|
||||
cd ~/ardupilot
|
||||
|
||||
# Install prerequisites (Ubuntu)
|
||||
Tools/environment_install/install-prereqs-ubuntu.sh -y
|
||||
|
||||
# Reload profile
|
||||
. ~/.profile
|
||||
|
||||
# Build ArduCopter SITL
|
||||
./waf configure --board sitl
|
||||
./waf copter
|
||||
```
|
||||
|
||||
### 2. Install ArduPilot Gazebo Plugin
|
||||
|
||||
```bash
|
||||
# Clone plugin
|
||||
git clone https://github.com/ArduPilot/ardupilot_gazebo.git ~/ardupilot_gazebo
|
||||
cd ~/ardupilot_gazebo
|
||||
|
||||
# Build
|
||||
mkdir build && cd build
|
||||
cmake .. -DCMAKE_BUILD_TYPE=Release
|
||||
make -j$(nproc)
|
||||
```
|
||||
|
||||
### 3. Set Environment Variables
|
||||
|
||||
Add to `~/.bashrc`:
|
||||
|
||||
```bash
|
||||
# ArduPilot
|
||||
export ARDUPILOT_HOME=$HOME/ardupilot
|
||||
export PATH=$PATH:$ARDUPILOT_HOME/Tools/autotest
|
||||
|
||||
# ArduPilot Gazebo Plugin
|
||||
export GZ_SIM_SYSTEM_PLUGIN_PATH=$HOME/ardupilot_gazebo/build:$GZ_SIM_SYSTEM_PLUGIN_PATH
|
||||
export GZ_SIM_RESOURCE_PATH=$HOME/ardupilot_gazebo/models:$HOME/ardupilot_gazebo/worlds:$GZ_SIM_RESOURCE_PATH
|
||||
```
|
||||
|
||||
### 4. Test SITL
|
||||
|
||||
```bash
|
||||
# Test ArduCopter SITL
|
||||
cd ~/ardupilot
|
||||
sim_vehicle.py -v ArduCopter --console --map
|
||||
```
|
||||
|
||||
### 5. Run with Gazebo
|
||||
|
||||
```bash
|
||||
# Terminal 1: Launch 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
|
||||
|
||||
# Terminal 3: Run controllers
|
||||
cd ~/simulation
|
||||
source activate.sh
|
||||
python run_ardupilot.py --no-sitl --pattern circular
|
||||
```
|
||||
|
||||
For more details, see [ArduPilot Guide](ardupilot.md).
|
||||
|
||||
Reference in New Issue
Block a user