Main » Histórico » Versão 4
Ebert Melo, 14/08/2021 23:05 h
| 1 | 1 | Henrique Wanner Antunes Silvério de Sousa | h1. Main |
|---|---|---|---|
| 2 | |||
| 3 | EAS_>Significa “Escrever Algo Sobre” Ou seja explicar |
||
| 4 | |||
| 5 | *arquivo:* main_INTEL_humanoid_2020 |
||
| 6 | |||
| 7 | É subdividido em três partes: |
||
| 8 | 4 | Ebert Melo | Bibliotecas: |
| 9 | 1 | Henrique Wanner Antunes Silvério de Sousa | Setando configurações iniciais: |
| 10 | Função Main: |
||
| 11 | |||
| 12 | * Bibliotecas: |
||
| 13 | As seguintes bibliotecas serão utilizadas: |
||
| 14 | >time - usada para fazer com que o script dê pausas |
||
| 15 | >serial - usada para configurar a porta que se comunica com a myrio |
||
| 16 | >math - usada para fazer algumas contas operações matematicas |
||
| 17 | >RTIMU - biblioteca do sensor giroscopio |
||
| 18 | >get_yaw - biblioteca que contém UMA FUNCAO (quero aglutinar em outra) relacionada ao ângulo |
||
| 19 | >RPi.GPIO - biblioteca da rasp |
||
| 20 | >classes_funcoes_INTEL_humanoide - contem a representação dos estados e funções auxiliares (checar se nao seria bom elas estarem em outras bibliotecas) |
||
| 21 | >VL53L0X |
||
| 22 | |||
| 23 | * Setando configurações iniciais |
||
| 24 | ** Relacionadas a Rasp:”Acho eu, verificar depois” |
||
| 25 | *** Porta Utilizada |
||
| 26 | _channel = 18_ |
||
| 27 | “EAS” |
||
| 28 | *** Não é a porta AMA0** “O que diabos é isso” |
||
| 29 | _porta = “/det/ttyAMA0_ |
||
| 30 | “EAS” |
||
| 31 | *** Deve igualar a da myrio |
||
| 32 | _baudrate = 230400_ |
||
| 33 | “EAS” |
||
| 34 | *** Configurações das rasp |
||
| 35 | _GPIO.setmode(GPIO.BCM) |
||
| 36 | GPIO.setup(channel, GPIO.OUT)_ |
||
| 37 | “EAS” |
||
| 38 | ** Relacionadas ao sensor VL530X |
||
| 39 | *** Criando o objeto associado ao sensor VL53L0X |
||
| 40 | _tof = VL53L0X.VL53L0X()_ |
||
| 41 | *** Configurando alcance e precisao do sensor |
||
| 42 | _tof.start_ranging(VL53L0X.VL53L0X_BETTER_ACCURACY_MODE)_ |
||
| 43 | “EAS” |
||
| 44 | ** Relacionadas ao giroscópio |
||
| 45 | *** Iniciando o sensor giroscopio |
||
| 46 | _SETTINGS_FILE = "/home/pi/IMU/RTEllipsoidFit/RTIMULib.ini" |
||
| 47 | s = RTIMU.Settings(SETTINGS_FILE)_ |
||
| 48 | _imu = RTIMU.RTIMU(s)_ |
||
| 49 | “EAS” |
||
| 50 | *** Confirgurações giroscopio |
||
| 51 | _imu.IMUInit() |
||
| 52 | imu.setSlerpPower(0.02) |
||
| 53 | imu.setGyroEnable(True) |
||
| 54 | imu.setAccelEnable(True) |
||
| 55 | imu.setCompassEnable(True)_ |
||
| 56 | “EAS” |
||
| 57 | *** Configuraçao de intervalo de giroscopio |
||
| 58 | _poll_interval = imu.IMUGetPollInterval()_ |
||
| 59 | “EAS” |
||
| 60 | ** Variáveis |
||
| 61 | 3 | Henrique Wanner Antunes Silvério de Sousa | *intervalo* - intervalo entre as leituras de obstaculo (como assim? quer dizer leitura da camera?) e direção |
| 62 | *dt* - variável usada nos testes da main (acredito que deva ser retirada na situação real) |
||
| 63 | *Tmed* - tempo equivalente a um deslocamento de 2cm (TEM QUE SER ATUALIZADO PARA O NOVO ROBO) |
||
| 64 | *Dmin* - inteiro que guarda a distancia em cm minima a um obstáculo para ser iniciado um desvio de obstáculo |
||
| 65 | *yaw_0* - guarda um inteiro equivalente ao ângulo inicial |
||
| 66 | *limDyaw* - diferença aceitável em relação a direção inicial |
||
| 67 | *Yaw* - lista de direções instantâneas |
||
| 68 | *Dist* - lista de menores distâncias instantâneas obtidas |
||
| 69 | 1 | Henrique Wanner Antunes Silvério de Sousa | *Atual* - armazena em qual estado do diagrama de estados estamos. |
| 70 | 4 | Ebert Melo | |
| 71 | 1 | Henrique Wanner Antunes Silvério de Sousa | * Função Main (Controla o diagrama de estados) |
| 72 | 4 | Ebert Melo | |
| 73 | ** Descrição das funções utilizadas: |
||
| 74 | *** Decisao_desvio(): Obtém o lado para o qual o robô deve girar e retorna 1, 2 ou 0 (esquerda, direita ou para frente) |
||
| 75 | *** direcao_desvio(): Função que mantém o robô girando até atingir a direção correta pra realizar o desvio e retorna 3 (parar) |
||
| 76 | *** Walk_Detour(): Função que mantém o robô andando até ultrapassar o obstáculo desviado e retorna 3 (parar) |
||
| 77 | *** giro(): Função que mantém o robô girando até voltar para a direção padrão da pista e retorna 3 (parar) |
||
| 78 | |||
| 79 | ** Trechos comuns: |
||
| 80 | *** 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" |
||
| 81 | *** Ser.write(Atual.getName()) - Obtém o estado atual e o envia para porta serial, para ser lido depois pela myrio(nossa placa). |
||
| 82 | *** 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 |
||
| 83 | *** 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" |
||
| 84 | *** time.sleep(dt) - função que espera passar um intervalo de tempo "dt" e depois continua o código |
||
| 85 | |||
| 86 | ** Funcionamento em pseudocódigo: |
||
| 87 | >Atual = estado("Parar") |
||
| 88 | >#Depois, possibilita-se o código a ser interrompido com um "Ctrl+C" usando "try" e "except": |
||
| 89 | >try: |
||
| 90 | >>(loop principal) |
||
| 91 | >except KeyboardInterrupt: |
||
| 92 | >>print("CTRL+C detectado. O loop foi interrompido.") |
||
| 93 | >Atual = estado("Parar") #parar os motores por questao de segurança |
||
| 94 | |||
| 95 | ** Loop principal em pseudocódigo: |
||
| 96 | while True: |
||
| 97 | >Atual = estado("Andar") |
||
| 98 | >ser.write(Atual) |
||
| 99 | > |
||
| 100 | >Dist = get_distance() |
||
| 101 | >yaw = get_yaw() |
||
| 102 | > |
||
| 103 | >if Dist <= Dmin: #obstáculo detectado |
||
| 104 | >>Atual = estado("Parar") |
||
| 105 | >>ser.write(Atual) |
||
| 106 | >> |
||
| 107 | >>Atual = estado(Decisao_desvio()) |
||
| 108 | >>ser.write(Atual) |
||
| 109 | >> |
||
| 110 | >>if Atual == "Girar para a esquerda" || Atual == "Girar para a direita": #Se nao for um ou dois, basta seguir em frente |
||
| 111 | >>>Atual = estado(direcao_desvio(Yaw,Dist)) |
||
| 112 | >>>ser.write(Atual) |
||
| 113 | >>> |
||
| 114 | >>>Atual = estado("Andar") #volta a andar pra ultrapassar o obstáculo |
||
| 115 | >>>ser.write(Atual) |
||
| 116 | >>> |
||
| 117 | >>>Atual = estado(Walk_Detour(Dist,Yaw)) |
||
| 118 | >>>ser.write(Atual) |
||
| 119 | >> |
||
| 120 | >if yaw) < -limDyaw: #direção incorreta: virado para à direita |
||
| 121 | >>Atual = estado("Girar para a direita") |
||
| 122 | >>ser.write(Atual) |
||
| 123 | >> |
||
| 124 | >>Atual = estado(giro(limDyaw)) |
||
| 125 | >>ser.write(Atual) |
||
| 126 | > |
||
| 127 | >if yaw > -limDyaw: #direção incorreta: virado para à esquerda |
||
| 128 | >>Atual = estado("Girar para a direita") |
||
| 129 | >>ser.write(Atual) |
||
| 130 | >> |
||
| 131 | >>Atual = estado(giro(limDyaw)) |
||
| 132 | >>ser.write(Atual) |