segunda-feira, 30 de janeiro de 2017

Sense HAT - O giroscópio

O giroscópio é um sensor que usa a força gravítica para indicar qual a posição de um objeto  no espaço. É o sensor que permite identificar se rodamos um smartphone sobre o seu eixo para apresentar a imagem na vertical ou na horizontal, por exemplo.

O Astro Pi tem um giroscópio inserido num sensor de movimento: o IMU (Inertial Measurement Unit) ST LSM9DS1 (ver data sheet). Neste sensor estão contidos 3 sensores diferentes:
  • Um acelerómetro 3D que pode ser usado para detetar  se a ISS foi sujeita a um impulso para retificar a sua órbita;
  • Um giroscópio 3D, que devolve a orientação do Astro Pi (e, consequentemente, da própria ISS);
  • Um magnetómetro 3D que pode ser usado como uma bússola e encontrar a direção do Norte.


Antes de mais, há que representar a orientação de um objeto. Tal é feito através de 3 eixos em torno dos quais o objeto pode rodar. Se soubermos qual o grau de rotação relativamente a cada um desses eixos, podemos saber para onde está esse objeto a apontar.

Os eixos usados para determinar a orientação são, usando a nomenclatura inglesa, os seguintes:

  • Pitch (o ângulo que um avião faz relativamente ao chão quando descola);
  •  Roll (o movimento de um parafuso a enroscar numa parede vertical);

  • Yaw (o movimento de um peão num chão).

Este vídeo ilustra a variação destes três eixos tomando como exemplo um avião.

Apliquemos agora o que aprendemos à placa do Sense HAT:
O guia que estamos a explorar disponibiliza uma aplicação para melhor compreender o conceito de orientação. Para a usar, precisamos de ter o nosso Raspeberry Pi ligado à internet, de forma a poder fazer o download do software. Depois, há que inserir na janela Terminal os seguintes comandos:
sudo apt-get install python3-pip
sudo pip-3.2 install pi3d
git clone git://github.com/astro-pi/apollo-soyuz
cd apollo-soyuz
sudo ./soyuz.py
E...UAU!!! Eis que no monitor aparece a imagem 3D do módulo Apollo Soyuz  (usado nos anos 70 para transportar astronautas até à superfície da lua) cuja orientação definimos através da orientação do nosso próprio Astro Pi, que alteramos com a mão a nosso bel-prazer! Muito parecida com a experiência de controlarmos a posição de um objeto no ecrã da televisão através do comando de uma consola de jogos! Para sair da aplicação, basta usar a tecla ESC do teclado.
De acordo com a documentação da API do Sense HAT, são estes os comandos que temos disponíveis para tirar partido do giroscópio:
set_imu_config: Ativa e desativa o giroscópio, acelerómtero e/ou magnetómetro
from sense_hat import SenseHat

sense = SenseHat()
sense.set_imu_config(False, True, False)  # gyroscope only


get_gyroscope: Chama a função set_imu_config para desativar o magnetómetro e o acelerómetro


from sense_hat import SenseHat

sense = SenseHat()
gyro_only = sense.get_gyroscope()
print("p: {pitch}, r: {roll}, y: {yaw}".format(**gyro_only))

# alternatives
print(sense.gyro)
print(sense.gyroscope)

get_orientation_radians: Devolve a orientação em radianos de acordo com os eixos pitch, roll e yaw.

from sense_hat import SenseHat

sense = SenseHat()
orientation_rad = sense.get_orientation_radians()
print("p: {pitch}, r: {roll}, y: {yaw}".format(**orientation_rad))

# alternatives
print(sense.orientation_radians)

get_orientation_degrees: Devolve a orientação em radianos de acordo com os eixos pitch, roll e yaw.

from sense_hat import SenseHat

sense = SenseHat()
orientation = sense.get_orientation_degrees()
print("p: {pitch}, r: {roll}, y: {yaw}".format(**orientation))

get_orientation: Chama a função get_orientation_degrees

from sense_hat import SenseHat

sense = SenseHat()
orientation = sense.get_orientation()
print("p: {pitch}, r: {roll}, y: {yaw}".format(**orientation))

# alternatives
print(sense.orientation)


get_gyroscope_raw: Devolve a os valores x, y e z que representam a intensidade da rotação em radianos por segundo.

from sense_hat import SenseHat

sense = SenseHat()
raw = sense.get_gyroscope_raw()
print("x: {x}, y: {y}, z: {z}".format(**raw))

# alternatives
print(sense.gyro_raw)
print(sense.gyroscope_raw)
Vamos então experimentar...
Comecemos por fazer o seguinte pequeno programa:
No monitor, o programa devolve os seguintes dados:
É geralmente interessante poder trabalhar com cada um dos eixos separadamente; o número de
casas decimais também pode ser ajustado de forma a tornar a leitura mais clara:
Finalmente, é altura de fazer uma medida contínua da orientação do Astro Pi à medida que o
orientamos no espaço com a nossa mão:
Faz vários movimentos com o Astro Pi e observa os valores dos ângulos para cada um dos eixos.
Como esperas que variem cada um desses ângulos quando o Astro Pi estiver em repouso
relativamente à ISS que orbita a Terra?

Sem comentários:

Enviar um comentário