Skip to content

Voando sem sair do chão

O que esse vamos ver neste lab?

  • Decolando sem sair do chão
    • Configuração da infraestrutura
      • Boot do SSD no notebook
      • clone do repositório
      • Configurações iniciais com o drone
    • Conexão entre PC e Drone
      • Ajustando a conexão entre o drone e o notebook
      • Analisando tópicos, nodes e imagem
    • Primeiro projeto
      • Entendo o código Python/ROS
      • Rodando o código no Drone
  • Desafio1
    • chegou a hora de criar asas e voar!

Configuração da Infraestrura

Boot do SSD

Vamos utilizar o SSD do 3°semestre de engenharia de computação para nossa atividade.

Se você possui o SSD do 3°sem. faça o boot no seu PC. Caso não tenha, não tem problema, vamos emprestar um SSD para usar durante a aula.

Exercise

Faça o Boot do SSD no seu PC, caso tenha dificuldades peça ajuda. O usuário e senha padrão do SSD é: user: borg senha: fl1pfl0p

Clone do repositório

Vamos utilizar alguns exemplos durante a aula que estão neste repositório, nosso próximo passo clonar esse repositório.

Exercise

Faça clone deste repositório no diretório ~/catkin_ws/src os comandos para isso estão abaixo, abra um terminal e digite:

   cd ~/catkin_ws/src
   git clone https://github.com/arnaldojr/ac-drone
   cd ~/catkin_ws
   catkin_make

Warning

Avalie o log do terminal para saber se deu tudo certo.

Conexão entre PC e o DRONE

Warning

AINDA NAO É HORA DE DECOLAR, O DRONE DEVE ESTAR SEM HELICES!!

Como o vou comunicar o meu código do pc com o drone

A topologia que vamos utilizar em nossa aplicação será:

  • O drone está configurado como Acess Point, ou seja o drone irá fornecer um ponto de rede Wifi para que outros dispositivos se conectem a ele.
  • O nome desta rede é `bebop seguida do serial number do drone
  • Vamos conectar o Wifi do nosso computador na rede criada pelo drone do drone.

Warning

A rede do bebop não tem senha, basta se conectar. Esta rede não possui acesso internet, se precisar usar internet terá que trocar a rede wifi.

Exercise

  • Identifique o serial number do drone que vai usar, tem uma etiqueta colada informando o numero;
  • ligue o drone e conecte seu notebook na rede wifi do drone;
  • Abra um terminal novo e digite:
    • ./bebop.sh
  • A conexão irá acontecer, monitore o log do terminal;
  • Se tudo deu certo, o drone o PC estão conectados e pronto para ser utilizado.

Warning

AINDA NAO É HORA DE DECOLAR, O DRONE DEVE ESTAR SEM HELICES!!

Analisando tópicos, nodes e imagem

Agora que já temos o drone o PC conectados, vamos aprender alguns comandos de ROS:

Warning

No ROS é comum trabalhar com multiplos terminais abertos, cada terminal terá uma função especifica, por essa razão tenha cuidado para não fechar o terminal errado.

Abra um terminal novo, não feche o terminal anterior, vamos explorar os principais comados:

Listar os tópicos do drone:

rostopic list

Abrir a camera do drone:

rqt_image_view

Visualizar a msg de um tópico:

rostopic echo /debop/odom

Decolar(takeoff) o drone: ***com o drone sem helices, cuidado os motores vão ligar**

rostopic pub --once /bebop/takeoff std_msgs/Empty

Pousar (land) o drone:

rostopic pub --once /bebop/land std_msgs/Empty

Legal, estamos começando a entender como as coisas funcionam. Podemos controlar o drone com os comandos do terminal, mas não é eficiente. Vamos criar um script python para isso.

Progress

Continuar...

Entendo o código Python/ROS

Existem algumas formas de criar um script python, Vamos dar uma olhada em um código pronto e análisar a sua estrutura.

Vamos avaliar o código print_odom.py que está neste repositório na pasta exemplos_drone/scripts/print_odom.py

Este código irá exibir no terminal o valor da odometria (distância percorrida) pelo drone nas coordenadas lineares x, y e z.

#! /usr/bin/env python3
# -*- coding:utf-8 -*-

import rospy 

from std_msgs.msg import Empty
from nav_msgs.msg import Odometry


# Apenas valores para inicializar
x = -1000
y = -1000
z = -1000

def recebeu_leitura(dado):
    """
        Grava nas variáveis x,y,z a posição extraída da odometria
        Atenção: *não coincidem* com o x,y,z locais do drone
    """
    global x
    global y 
    global z 

    x = dado.pose.pose.position.x
    y = dado.pose.pose.position.y
    z = dado.pose.pose.position.z


if __name__=="__main__":

    rospy.init_node("print_odom")

    # Cria um subscriber que chama recebeu_leitura sempre que houver nova odometria
    recebe_odom = rospy.Subscriber("bebop/odom", Odometry , recebeu_leitura)


    try:
        while not rospy.is_shutdown():
            ## Código principal
            print("x {} y {} z {}".format(x, y, z))
            rospy.sleep(2)

    except rospy.ROSInterruptException:
        rospy.sleep(1.0)

Vamos avaliar o código por partes.

Começamos informando que vamos usar python3 no nosso código e que realizamos o importe das bibliotecas da ROS e da ROS Msg para compreender o formato das mensagens que vamos utilizar. Esses importes variam conforme o tópico que vamos utilizar

#! /usr/bin/env python3
# -*- coding:utf-8 -*-

import rospy 

from std_msgs.msg import Empty
from nav_msgs.msg import Odometry

Criamos e inicializamos as variaveis x, y e z. Criamos uma função de callback chamada `recebeu_leitura que será chamada toda a vez que houver um dado novo do tópico da odometria (que é configurado mais abaixo).

Note que e ROS as chamadas são baseadas das funções de callback ocorrem por evento, de forma assincrona. Ou seja, não serão feitas pelo código principal.

# Apenas valores para inicializar
x = -1000
y = -1000
z = -1000

def recebeu_leitura(dado):
    """
        Grava nas variáveis x,y,z a posição extraída da odometria
        Atenção: *não coincidem* com o x,y,z locais do drone
    """
    global x
    global y 
    global z 

    x = dado.pose.pose.position.x
    y = dado.pose.pose.position.y
    z = dado.pose.pose.position.z

Inicializa o node "print_odom" para ser identificado pelo ROS master. Subscreve (esculta) o tópico de odometria e realiza a chamada da função de callback "recebeu_leitura"

if __name__=="__main__":

    rospy.init_node("print_odom")

    # Cria um subscriber que chama recebeu_leitura sempre que houver nova odometria
    recebe_odom = rospy.Subscriber("bebop/odom", Odometry , recebeu_leitura)

Nosso laço principal, o while é executdo de forma infinita até o usuário fechar o programa. O rospy.sleep(2) executa um loop a cada 2 segundos.

    try:
        while not rospy.is_shutdown():
            ## Código principal
            print("x {} y {} z {}".format(x, y, z))
            rospy.sleep(2)

    except rospy.ROSInterruptException:
        rospy.sleep(1.0)

Agora que já entendemos, de forma breve, como o código funciona vamos rodar nosso código com o drone.

Rodando o código no drone

Vamso rodar o nosso exemplo print_odom.py.

Rodar um script python é um pouco diferente de rodar um código ROS em python, isso por que o ROS cria um ecosistema para rodar esse código, então a forma que vamos invocar o código será:

Em um novo terminal, digite:

rosrun exemplo_drone print_odom.py

Para dar certo, o nosso notebook e o drone devem estar na mesma rede wifi e o comando bebop.sh tambem já está rodando.

Caso o valores de odometria não atualize, faça o takeoff do drone (sem helice) antes e rode novamente.


Last update: May 27, 2023