Ambiente containerizado com Podman para simulação de drones, integrando o controlador de voo ArduPilot SITL com o simulador 3D Gazebo Harmonic. Desenvolvido para funcionar em Linux, testado em ambientes Fedora.
- Visão Geral
- Pré-requisitos
- Instalação Rápida
- Uso
- Conectando um GCS Externo
- Streaming de Vídeo
- Personalização
- Build
- Estrutura do Projeto
- Solução de Problemas
O projeto executa dois contêineres dentro de um Pod:
┌─────────────────────────────── Pod (ardupilot-sim) ────────────────────────────────┐
│ │
│ ┌─────────────────────┐ UDP/JSON (9005) ┌────────────────────────────┐ │
│ │ ArduPilot SITL │◄─────────────────────►│ Gazebo Harmonic │ │
│ │ (controlador de │ │ (física, sensores, 3D) │ │
│ │ voo simulado) │ │ GPU (/dev/dri) │ │
│ └──────┬──────────────┘ └──────────┬─────────────────┘ │
│ │ TCP │ UDP │
│ │ 5760, 5762, 5763 │ 5600 │
└─────────┼─────────────────────────────────────────────────┼────────────────────┘
▼ ▼
GCS Externo Streaming de Vídeo
(Mission Planner, (GStreamer)
QGroundControl,
MAVProxy)
| Componente | Descrição |
|---|---|
| ArduPilot SITL | Simula o controlador de voo do drone. Recebe comandos MAVLink e envia estado do veículo. |
| Gazebo Harmonic | Simula a física, sensores (IMU, GPS, câmera) e renderiza o ambiente 3D. Comunica-se com o ArduPilot via JSON. |
| Porta | Protocolo | Uso |
|---|---|---|
5760 |
TCP | Conexão MAVLink primária (GCS externo) |
5762 |
TCP | Conexão MAVLink secundária |
5763 |
TCP | Conexão MAVLink terciária |
9005 |
UDP | Comunicação interna ArduPilot <-> Gazebo (JSON SITL) |
5600 |
UDP | Streaming de vídeo (GStreamer) |
- Linux ou WSL com passthrough de GPU
- GPU (necessária para o Gazebo Harmonic, mesmo que integrada)
Verifique se as seguintes ferramentas estão instaladas:
podman --version # Podman 4.0+
make --version # GNU Make
git --version # Git
envsubst --version # gettext (para substituição de variáveis nos YAMLs)Para instalar no Fedora/RHEL:
sudo dnf install podman make git gettextNo Ubuntu/Debian:
sudo apt update
sudo apt install podman make git gettextgit clone --recurse-submodules https://github.com/KaueAbade/ardupilot-sim.git
cd ardupilot-simEste é o modo principal. Inicia ambos os contêineres em um único Pod, com o ArduPilot conectado ao Gazebo:
make runEste comando faz o download dos conteineres do repositório
Você verá:
- Janela do Gazebo com o ambiente 3D e o drone Iris na pista
- Console do MAVProxy com informações de telemetria e prompt de comandos
Para testar um voo básico no console do MAVProxy:
STABILIZE> mode guided
GUIDED> arm throttle
GUIDED> takeoff 10
Ou inicie um vôo por meio de seu GCS Externo de preferência
Para testes de lógica de voo sem o simulador 3D (não requer GPU):
make run-ardupilotPara testar cenários e modelos 3D sem o controlador de voo:
make run-gazebomake stop| Comando | Descrição |
|---|---|
make help |
Lista todos os comandos disponíveis |
make run |
Inicia a simulação completa (Gazebo + ArduPilot) |
make run-ardupilot |
Inicia apenas o ArduPilot SITL |
make run-gazebo |
Inicia apenas o Gazebo Harmonic |
make build |
Builda todos os contêineres |
make build-ardupilot |
Builda apenas o contêiner do ArduPilot SITL |
make build-gazebo |
Builda apenas o contêiner do Gazebo Harmonic |
make stop |
Para todos os pods da simulação |
make clean |
Limpa todas as imagens geradas |
O ArduPilot SITL expõe portas MAVLink via TCP na rede local. Para conectar uma estação de controle terrestre:
- Abra o programa
- Conecte via TCP, endereço
127.0.0.1, porta5762
O console do MAVProxy já é iniciado automaticamente dentro do contêiner. Para conectar uma instância adicional da máquina host:
mavproxy.py --master=tcp:127.0.0.1:5762O streaming de video da câmera virtual do Gazebo é iniciado automaticamento pelo make run ou make run-gazebo.
A stream estará disponível na porta UDP 5600 no formato h.264.
Os mundos disponíveis estão em gazebo-harmonic/src/worlds/:
| Arquivo | Descrição |
|---|---|
iris_runway.sdf |
Drone Iris com gimbal em uma pista (padrão) |
iris_warehouse.sdf |
Drone Iris em um armazém |
gimbal.sdf |
Cenário de teste para gimbal |
zephyr_runway.sdf |
Asa-fixa Zephyr em uma pista |
zephyr_parachute.sdf |
Asa-fixa Zephyr com paraquedas |
Para alterar o mundo, edite o argumento args no arquivo drone_sim.yaml:
args: ["/usr/bin/gz", "sim", "-v4", "-r", "iris_warehouse.sdf"]
^^^^^^^^^^^^^^^^^^^^Os modelos disponíveis estão em gazebo-harmonic/src/models/:
iris_with_ardupilot/— Iris quadcopter com plugin ArduPilotiris_with_gimbal/— Iris com gimbal (usado no cenário padrão)iris_with_standoffs/— Iris com estrutura de suportezephyr_with_ardupilot/— Asa-fixa Zephyr com plugin ArduPilotzephyr_with_parachute/— Zephyr com paraquedasgimbal_small_1d/,gimbal_small_2d/,gimbal_small_3d/— Gimbals de 1, 2 e 3 graus de liberdade
Os modelos são referenciados nos arquivos .sdf dos mundos via <uri>model://nome_do_modelo</uri>.
Arquivos .parm ficam em gazebo-harmonic/src/config/:
gazebo-iris-gimbal.parm— Parâmetros do Iris com gimbal (tipo de frame, limites do gimbal, mapeamento RC)
Esses arquivos são montados no contêiner via volume e podem ser editados sem rebuild.
git clone --recurse-submodules https://github.com/KaueAbade/ardupilot-sim.git
cd ardupilot-simmake buildEsse comando faz o download da seguinte imagem:
gazebo:harmonic-full— Gazebo Harmonic (Imagem da comunidade)
E builda estas três:
ghcr.io/KaueAbade/ardupilot-sim/ardupilot:latest— Ambiente de Desenvolvimento Ardupilotghcr.io/KaueAbade/ardupilot-sim/ardupilot-sitl:latest— ArduPilot SITL (ArduCopter compilado para placa SITL)ghcr.io/KaueAbade/ardupilot-sim/gazebo-harmonic-ardupilot:latest— Gazebo Harmonic com plugin ardupilot_gazebo
Note
O primeiro build pode levar 30 minutos ou mais, pois compila o ArduPilot, baixa o toolchain ARM e builda o plugin do Gazebo. Builds seguintes utilizam cache do Podman e são muito mais rápidas.
