Main » Histórico » Revisão 4
Revisão 3 (Henrique Wanner Antunes Silvério de Sousa, 13/08/2021 21:53 h) → Revisão 4/5 (Ebert Melo, 14/08/2021 23:05 h)
h1. Main EAS_>Significa “Escrever Algo Sobre” Ou seja explicar *arquivo:* main_INTEL_humanoid_2020 É subdividido em três partes: Bibliotecas: Biblioteca: 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(s)_ “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)