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”
- Porta Utilizada
- 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”
- Criando o objeto associado ao sensor VL53L0X
- 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”
- Iniciando o sensor giroscopio
- 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.
- Relacionadas a Rasp:”Acho eu, verificar depois”
- 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 Melo há mais de 3 anos · 5 revisões