Projeto

Geral

Perfil

Ações

Main

EAS_>Significa “Escrever Algo Sobre” Ou seja explicar

arquivo: main_INTEL_humanoid_2020

É subdividido em três partes:
Bibliotecas:
Setando configurações iniciais:
Função Main:

  • Bibliotecas:
    As seguintes bibliotecas serão utilizadas:

time - usada para fazer com que o script dê pausas
serial - usada para configurar a porta que se comunica com a myrio
math - usada para fazer algumas contas operações matematicas
RTIMU - biblioteca do sensor giroscopio
get_yaw - biblioteca que contém UMA FUNCAO (quero aglutinar em outra) relacionada ao ângulo
RPi.GPIO - biblioteca da rasp
classes_funcoes_INTEL_humanoide - contem a representação dos estados e funções auxiliares (checar se nao seria bom elas estarem em outras bibliotecas)
VL53L0X

  • Setando configurações iniciais
    • Relacionadas a Rasp:”Acho eu, verificar depois”
      • Porta Utilizada
        channel = 18
        “EAS”
      • Não é a porta AMA0** “O que diabos é isso”
        porta = “/det/ttyAMA0
        “EAS”
      • Deve igualar a da myrio
        baudrate = 230400
        “EAS”
      • Configurações das rasp
        GPIO.setmode(GPIO.BCM)
        GPIO.setup(channel, GPIO.OUT)

        “EAS”
    • Relacionadas ao sensor VL530X
      • Criando o objeto associado ao sensor VL53L0X
        tof = VL53L0X.VL53L0X
      • Configurando alcance e precisao do sensor
        tof.start_ranging(VL53L0X.VL53L0X_BETTER_ACCURACY_MODE)
        “EAS”
    • Relacionadas ao giroscópio
      • Iniciando o sensor giroscopio
        SETTINGS_FILE = "/home/pi/IMU/RTEllipsoidFit/RTIMULib.ini"
        s = RTIMU.Settings(SETTINGS_FILE)

        imu = RTIMU.RTIMU
        “EAS”
      • Confirgurações giroscopio
        imu.IMUInit()
        imu.setSlerpPower(0.02)
        imu.setGyroEnable(True)
        imu.setAccelEnable(True)
        imu.setCompassEnable(True)

        “EAS”
      • Configuraçao de intervalo de giroscopio
        poll_interval = imu.IMUGetPollInterval()
        “EAS”
    • Variáveis
      intervalo - intervalo entre as leituras de obstaculo (como assim? quer dizer leitura da camera?) e direção
      dt - variável usada nos testes da main (acredito que deva ser retirada na situação real)
      Tmed - tempo equivalente a um deslocamento de 2cm (TEM QUE SER ATUALIZADO PARA O NOVO ROBO)
      Dmin - inteiro que guarda a distancia em cm minima a um obstáculo para ser iniciado um desvio de obstáculo
      yaw_0 - guarda um inteiro equivalente ao ângulo inicial
      limDyaw - diferença aceitável em relação a direção inicial
      Yaw - lista de direções instantâneas
      Dist - lista de menores distâncias instantâneas obtidas
      Atual - armazena em qual estado do diagrama de estados estamos.
  • Função Main (Controla o diagrama de estados)
  • Descrição das funções utilizadas:
    • Decisao_desvio(): Obtém o lado para o qual o robô deve girar e retorna 1, 2 ou 0 (esquerda, direita ou para frente)
    • direcao_desvio(): Função que mantém o robô girando até atingir a direção correta pra realizar o desvio e retorna 3 (parar)
    • Walk_Detour(): Função que mantém o robô andando até ultrapassar o obstáculo desviado e retorna 3 (parar)
    • giro(): Função que mantém o robô girando até voltar para a direção padrão da pista e retorna 3 (parar)
  • Trechos comuns:
    • Atual = Estado.estado("x") - Seta o estado atual do robô para 0(andar), 1(girar para a esquerda), 2(girar para a direita) ou 3(parar) e o guarda na variável "Atual"
    • Ser.write(Atual.getName()) - Obtém o estado atual e o envia para porta serial, para ser lido depois pela myrio(nossa placa).
    • Dist [0] = tof.get_distance()/10 - Converte a distância obtida pelo sensor VL53L0X em centimetros e guarda na posiçao 0 da lista Dist
    • Yaw [0] = (Direcao.get_yaw(intervalo)-yaw_0) - Obtém o desvio em radianos com a direção da pista (yaw_0) e guarda na posição 0 da lista Yaw em um intervalo de tempo "intervalo"
    • time.sleep(dt) - função que espera passar um intervalo de tempo "dt" e depois continua o código
  • Funcionamento em pseudocódigo:

Atual = estado("Parar")
#Depois, possibilita-se o código a ser interrompido com um "Ctrl+C" usando "try" e "except":
try:

(loop principal)

except KeyboardInterrupt:

print("CTRL+C detectado. O loop foi interrompido.")

Atual = estado("Parar") #parar os motores por questao de segurança

  • Loop principal em pseudocódigo:
    while True:

Atual = estado("Andar")
ser.write(Atual)

Dist = get_distance()
yaw = get_yaw()

if Dist <= Dmin: #obstáculo detectado

Atual = estado("Parar")
ser.write(Atual)

Atual = estado(Decisao_desvio())
ser.write(Atual)

if Atual = "Girar para a esquerda" || Atual = "Girar para a direita": #Se nao for um ou dois, basta seguir em frente

Atual = estado(direcao_desvio(Yaw,Dist))
ser.write(Atual)

Atual = estado("Andar") #volta a andar pra ultrapassar o obstáculo
ser.write(Atual)

Atual = estado(Walk_Detour(Dist,Yaw))
ser.write(Atual)

if yaw) < -limDyaw: #direção incorreta: virado para à direita

Atual = estado("Girar para a direita")
ser.write(Atual)

Atual = estado(giro(limDyaw))
ser.write(Atual)

if yaw > -limDyaw: #direção incorreta: virado para à esquerda

Atual = estado("Girar para a direita")
ser.write(Atual)

Atual = estado(giro(limDyaw))
ser.write(Atual)

Atualizado por Ebert Meloquase 3 anos · 5 revisões