将陀螺仪采集数据动态可视化


将测量的数据动态表现可以比较形象传递对比信息。下面通过TEASOFT软件绘制出数据的动态过程。

数据来自于惯性测量单元(IMU),它输出四路信号:一路是陀螺仪,三路是加速度计。

01惯性单元的基本情况


这是一款模拟输出的惯性测量传感器单元。

其中集成了陀螺仪:JPN MB 326;三轴加速度计:7260

▲ 陀螺仪和加速度计模块

▲ 陀螺仪和加速度计模块

工作电压5V。

在其保持垂直状态下,使用 八通道AD7606数据采集模块 采集陀螺仪,加速度计的输出电压信号,估计对应的均值和噪声情况。

▲ 保持垂直状态测量输出电压值

▲ 保持垂直状态测量输出电压值

采集10秒中的数据,采样率1kHz。统计输出信号的均值和方差。▲ 静态时输出的陀螺仪和一路加速度计的信号

▲ 静态时输出的陀螺仪和一路加速度计的信号

  • 陀螺仪输出的均值:1.7056V;方差:3.9857×10-5
  • 加速度计输出均值:1.7561V;方程:6.0229×10-5

02采集动态数据显示


通过手持IMU左右晃动,同时使用 基于AD7606八通道高速数据采集模块 采集IMU输出的四路模拟信号。

▲ 采集IMU的输出数据

▲ 采集IMU的输出数据

八秒中的信号的波形如下图所示:
▲ 采集到的惯性传感器的数据

▲ 采集到的惯性传感器的数据

通过TEASOFT软件可以将动态过程与数据的变化有效的结合在一起。在TEASOFT软件建立起显示数据的坐标系。同时使用长度为500的四种颜色的曲线来显示采集的实时数据。

▲ TEASOFT软件的界面

▲ TEASOFT软件的界面

通过PlotGIF()录制在采集框内的所有对象,最后生成动态的GIF图像。下面给出了对应的生成结果:

▲ 惯性传感器数据可视化

▲ 惯性传感器数据可视化

▲ 惯性传感器数据可视化2

▲ 惯性传感器数据可视化2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#!/usr/local/bin/python
# -*- coding: gbk -*-
#============================================================
# DRAW1.PY                     -- by Dr. ZhuoQing 2020-06-05
#
# Note:
#============================================================
from headm import *
from tsmodule.tsdraw        import *
pltgif = PlotGIF()
xyc = XYCoor(3, 4, 22, 21, 200, 3)
#------------------------------------------------------------
data = tspload('data9', 'data')
rangeid = 38
gifid = tspgetgifid()[0]
curve = [9, 10, 11, 12]
#------------------------------------------------------------
gifpages = tspgetgifpage(gifid)
data = [d-0.5 for d in data]
gyro = data[0::4]
accz = data[1::4]
accx = data[2::4]
accy = data[3::4]
datalen = len(gyro)
curvelen = tspgetcurvelength(curve[0])
printff('Gif:%d pages, Data %d, Curve:%d'%(gifpages, datalen, curvelen))
#------------------------------------------------------------
gyrodata = [0] * curvelen
acczdata = [0] * curvelen
accxdata = [0] * curvelen
accydata = [0] * curvelen
#------------------------------------------------------------
def buf2data(buf, buflen, datalen, begin):
    data = buf[0] * datalen
    if begin >= datalen and begin < buflen:
        data = buf[begin - datalen:begin]
    elif begin < datalen and begin >= 0:
        data = [buf[0]] * datalen
        start = datalen - begin
        data[start:datalen] = buf[0:begin]
    elif begin > buflen and begin < buflen + datalen:
        data = [buf[-1]] * datalen
        endn = begin - datalen
        data[0:endn] = buf[end:]
    return data
def setcurvedata(begin):
    global gyrodata, acczdata, accxdata, accydata
    gyrodata = buf2data(gyro, datalen, curvelen, begin)
    acczdata = buf2data(accz, datalen, curvelen, begin)
    accxdata = buf2data(accx, datalen, curvelen, begin)
    accydata = buf2data(accy, datalen, curvelen, begin)
def page2begin(page):
    if page < 0: return 0
    if page >= gifpages: return datalen
    return int(page * (datalen - curvelen) / gifpages)
def begin2page(begin):
    return int(begin * gifpages * 0.95 /datalen)
#------------------------------------------------------------
#gifpages = int(gifpages * .8)
steps = 200
for i in range(steps):
#    begin = page2begin(i)
#    printf('Gif:%d, Begin:%d'%(i, begin))
    begin = int(i * datalen / steps)
    page = begin2page(begin)
    printf("Gif:%d, Begin:%d"%(page, begin))
    setcurvedata(begin)
    xyc.SetCurveY(gyrodata, curve[0])
    xyc.SetCurveY(acczdata, curve[1])
    xyc.SetCurveY(accxdata, curve[2])
    xyc.SetCurveY(accydata, curve[3])
    tspgotogifpage(gifid, page)
    tsprv()
    pltgif.appendrange(rangeid)
#pltgif.save(r'd:\temp\1.gif', 35, 35)
#------------------------------------------------------------
printf('\a')
#------------------------------------------------------------
#        END OF FILE : DRAW1.PY
#============================================================

结论


由于数据采集和GIF的录制是同时异步进行的,从显示的结果来看,数据的变化与GIF图像之间还是有一些不同步的地方。这就大大限制了动图可视化的效果。

至于为什么在同时录制的过程中出现了这样的异步情况,现在还不得而知。