Main » Histórico » Versão 5
Ebert Melo, 21/08/2021 16:49 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 | 5 | Ebert Melo | >>if Atual = "Girar para a esquerda" || Atual = "Girar para a direita": #Se nao for um ou dois, basta seguir em frente |
111 | 4 | Ebert Melo | >>>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) |