Projeto

Geral

Perfil

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)