最终呈现效果
目标
使用一个三维动态动画来表现倾角传感器的角度变化。
方法
倾角传感器可以获取三个方向的角度信息:方位角、俯仰角和航向角。首先获取倾角传感器得到的角度信息,然后动态绘制茶壶来表现角度信息。
技术
Python
相关包:
serial(串口读取)
OpenGL(用来绘制三维图形)
旋转原理
在OpenGL三维空间中,飞机可以绕x、y或z轴旋转。倾角传感器可以方位角、俯仰角和横滚角信息。方位角对应绕y轴旋转,俯仰角对应绕z轴旋转,横滚角对应绕x轴旋转。
方位角获取范围:0°~+180°, 0°~-180°
俯仰角获取范围:0°~+90°, 0°~-90°
横滚角获取范围:0°~+180°, 0°~-180°
在Python代码里,绕某个轴旋转可表示为:
glRotatef(ang_fw, 0, 1, 0) # 绕y轴旋转
glRotatef(ang_fy, 0, 0, 1) # 绕z轴旋转
glRotatef(ang_hg, 1, 0, 0) # 绕x轴旋转
旋转角度为正数时,表示绕逆时针旋转。例:绕y轴旋转30°,表示飞机绕着y轴逆时针旋转30°。
异常数据处理
接收到的倾角传感器数据可能有异常,异常数据就不能要,需要丢弃。
# 记录上一次获取的值
if first_flag:
last_fw = ang_fw
last_fy = ang_fy
last_hg = ang_hg
first_flag = False
# 后面获取的值和上一次的值进行比较
error = 3
if abs(last_fw - ang_fw) > error or abs(last_fy - ang_fy) > error or abs(last_hg - ang_hg) > error:
error_times += 1
#print('第%d次异常数据:%.2f %.2f %.2f' % (error_times, ang_fw, ang_fy, ang_hg))
# 连续三次和last变量比较,如果都不符合要求,说明之前的last变量初值是错误数据
if error_times >= 3:
last_fw = ang_fw
last_fy = ang_fy
last_hg = ang_hg
error_times = 0
else:
ang_fw = last_fw
ang_fy = last_fy
ang_hg = last_hg
else:
last_fw = ang_fw
last_fy = ang_fy
last_hg = ang_hg
error_times = 0
源代码
# sudo apt-get install python3-opengl
# pip3 install pyserial
# -*- coding: utf-8 -*-
from OpenGL.GL import *
from OpenGL.GLU import *
from OpenGL.GLUT import *
import time, random
import serial
# ser = serial.Serial( '/dev/ttyUSB0', 9600, timeout=0 )
ser = serial.Serial("COM3"