<aside> 💡 Vamos instalar o Gazebo11, o Ardupilot SITL e o plugin ardupilot_gazebo que faz a ponte entre os dois. Vamos baixar também o QGroundControl e rodar tudo em conjunto. Vamos controlar o drone através de um script em python usando Dronekit e vamos ler o feed da câmera simulada em tempo real através de tópicos ROS.
</aside>
⚠️⚠️⚠️ ATENÇÃO ⚠️⚠️⚠️
**Todos os comandos foram testados no sistema operacional Linux Ubuntu 22.04
Se você usa Windows, MacOS ou outro sistema operacional, considere fazer um dual boot em seu computador! Talvez seja possível realizar o desafio em outros sistemas operacionais, mas o único que damos suporte é o ubuntu 22.04**
Esse é o software Ground Station que utilizamos. Ele nos permite visualizar a posição atual do drone e outras informações a seu respeito, além de nos permitir dar comandos diretos ao mesmo. É útil para monitoramento do drone e envio de comandos simples para teste.
Baixe o AppImage do site QGroundControl.com ou clique nesse link direto para baixar o arquivo.
Abra o terminal, vá para o diretório em que o arquivo foi baixado:
# dê ao arquivo permissão de execução
chmod +x QGroundControl.AppImage
# execute o programa
./QGroundControl
# Em caso de erro do tipo: "AppImages require FUSE to run.",
# instale o libfuse2:
sudo apt update
sudo apt install libfuse2
# execute o programa
./QGroundControl
# se não conseguir executar, rode os comandos
sudo apt install gstreamer1.0-plugins-bad gstreamer1.0-libav gstreamer1.0-gl -y
sudo apt install libqt5gui5 -y
# e faça logout e login
O drone possui uma placa controladora, responsável por interfacear diretamente com componentes como o motor. O software que roda nessa placa controladora é chamado de firmware e pode ser um dentre vários que existem; vamos utilizar o Ardupilot. Como estamos fazendo o setup de um ambiente para simulação, o software Ardupilot irá rodar localmente em nosso computador em um modo especial, conhecido como SITL (Software In The Loop), que irá simular as características de um drone real em vôo, permitindo interfacear com um ambiente de simulação.
# clone o repositório do ardupilot e entre
git clone <https://github.com/ArduPilot/ardupilot>
cd ardupilot
# mude para a branch da última release do arducopter
# (O Ardupilot funciona com vários tipos de veículos, até mesmo submarinos, por exemplo, então precisamos escolher a versão do ardupilot correta para drones, que se chama de ArduCopter)
git checkout Copter-4.3.2
# clone os submódulos
git submodule update --init --recursive
# rode o script de setup das dependências e
./Tools/environment_install/install-prereqs-ubuntu.sh -y
# rode o seguinte comando, faça logout e login (ou reinicie o computador) antes de continuar
. ~/.profile
# se não conseguir executar, rode os comandos
sudo apt install gstreamer1.0-plugins-bad gstreamer1.0-libav gstreamer1.0-gl -y
sudo apt install libqt5gui5 -y
# e faça logout e login
# vamos executar o programa uma primeira vez para buildar algumas coisas automaticamente
cd
sim_vehicle.py -w
# dica: adicione o sim_vehicle.py ao PATH, no .bashrc para pode executar de qualquer lugar
# para fazer isso, abra ~/.bashrc e adicione uma linha ao fim contendo:
source <PATH_ABSOLUTO>/ardupilot/Tools/completion/completion.bash
# no meu caso, <PATH_ABSOLUTO> é /home/mateus/Projects/robocin/drones, adapte com o seu.
# salve o arquivo, feche o terminal e abra outro terminal. A partir de agora, você poderá rodar sim_vehicle.py de qualquer diretório.
Gazebo é o simulador que vamos utilizar. Nele é possível carregar modelos 3D para representar o mundo no qual o drone está inserido e objetos móveis ou imóveis com os quais ele pode interagir. Ele que nos permitirá visualizar o drone em movimento.
Rode os comandos:
# Instalação de dependências e do Gazebo11
sudo apt install gazebo
# Instale também as seguintes libs de utilizades do gazebo
sudo apt install libgazebo-dev
sudo apt install libgazebo11
# Para rodar o gazebo, o Ubuntu 22.04 deve estar usando X11(ou xorg) e não Wayland como compositor
# Você não precisa se preocupar com o que isso significa, mas se quiser aprender sobre: <https://diolinux.com.br/editorial/xorg-e-wayland-o-que-sao.html>
# Para checar qual seu ubuntu está utilizando, rode num terminal:
echo $XDG_SESSION_TYPE
# se o output for x11, está tudo certo, vá para a seção 4 do tutorial.
# se o output for wayland, precisamos mudar para x11, da seguinte forma:
# abra o arquivo /etc/gdm3/custom.conf com algum editor de texto e descomente a linha "WaylandEnable=false" (retire o #). Salve o arquivo.
# faça logout, e antes de fazer login, clique na engrenagem no canto inferior direito e clique em "ubuntu on xorg" ou "ubuntu", qualquer um desses. O importante é não clicar em "ubuntu on wayland"
# rode novamente o comando echo $XDG_SESSION_TYPE para checar se está com x11. Se sim, tudo ok.
# (se vc tiver placa de vídeo dedicada, pode instalar os drivers agora se quiser. não é algo necessário, no entanto).
Precisamos fazer uma ponte entre as simulações do ArdupilotSITL e a do Gazebo, para que as duas funcionem em conjunto. Para isso, vamos instalar um plugin.
# clone o repositório
git clone <https://github.com/khancyr/ardupilot_gazebo>
# build the project
cd ardupilot_gazebo
mkdir build && cd build
cmake ..
make -j4
sudo make install
# rode os seguintes comandos, adaptando o path de acordo com onde está localizado a sua pasta ardupilot_gazebo
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
O firmware Ardupilot aceita comandos externos via o protocolo MAVLINK. Mensagens MAVLINK são conjuntos de bytes que dizem ao Ardupilot coisas como “me diga a posição atual do drone” ou “se desloque 2 metros na direção norte” ou “mude o modo de vôo para modo guided” ou “me informe a altitude do drone”, etc; ou seja, permite o recebimento de informações sobre o estado atual do drone e o envio de comandos que serão executados.
Existem bibliotecas que abstraem o envio de mensagens MAVLINK e tornam mais simples o processo de interfacear com o drone. Uma dessas bibliotecas é o Dronekit. Vamos utilizá-la.
# O dronekit via pip install está desatualizado, então vamos instalar direto do repositório do projeto
git clone <https://github.com/dronekit/dronekit-python>
sudo python setup.py install
# teste se o dronekit foi instalado corretamente
python
import dronekit