MATLAB Mobile 传感器数据

© 2022 pupububu.com 保留所有权利All Rights Reserved

很久很久以前,大概是2019年,我下载了MATLAB Mobile这个软件,当时觉得在移动设备上搞MATLAB很酷。前几天正好翻到iPad上的这个软件,发现这个软件还可以记录传感器数据。

iPad戴上盖子的时候,可能是因为磁铁的原因,方向之类的数据就没有了

试着记录了一下传感器数据,突然想试试看能不能用传感器数据来还原iPad的运动轨迹。

但是其实是不想自己写的…所以上网搜了半天,也没啥有用的。其中有一篇看起来很靠谱,但是基本上也是靠GPS的,主要还是经纬度的,而且他的加速度还是要手机绝对稳定,重力加速度就在\(z轴\)上(然鹅现实不太可能)

MATLAB官方声明加速度是包含重力加速度的,是\(9.81\),所以实际的加速度需要剔除重力加速度。

最后被迫自己写了一个代码,思路大概就是根据\(x、y、z\)的加速度,再去除重力加速度,算出来轨迹。

我们需要用到:加速度、方向

去除重力

MATLAB官网查询得知,加速度坐标定义如下:

方向包含三个量:方位、俯仰、滚转,在数据里存储为\(XYZ\),经过尝试对应之后,画了这个图:

通过一些物理知识,我们不难看出来,我们需要\(Y、Z\)这两个数据来计算重力在各个轴上的分量。我们建立一下坐标系:

通过尝试,我们找到了方向里的三个角度中的两个:\(Y、Z\)在坐标中的位置

所以我们不难看出,重力在各个轴上的分量为:

从而即可去除重力加速度,在使用的时候,因为\(\frac{1}{\tan{Z}}\)是朝向\(z轴\)负方向的,所以前面要加负号。

将iPad静止,并调整不同姿态,我们计算加速度:

静止时的加速度基本还算比较小,结果应该在误差范围内

计算轨迹

因为是浅写一下代码,所以就用最简单的知识来计算一下轨迹。

利用初中知识,位移为:

\(x=v_0t+\frac{1}{2}at^2\)

速度为:

\(v=v_0+at\)

因为采样率为\(10Hz\),我们可以认为在\(0.1S\)内加速度恒定,是刚测得的\(a\),所以就可以利用上面的公式得出下一采样时刻的初始速度,和\(0.1S\)的位移

MATLAB代码

于是下一步就是写MATLAB的代码了,主要问题在物理方面,实际代码很简单,好久没写MATLAB代码了,水平可能比较🌶️。

acc = timetable2table( Acceleration );
acc = table2array( acc(:,2:4) );

ort = timetable2table( Orientation );
ort = table2array( ort(:,3:4) );

[x,y] = size( acc );

grav = zeros( x, 3 );
grav(:,1) = ones( x, 1 );
grav(:,2) = tan( ort(:,1) * pi/180 ) ./ tan( ort(:,2) * pi/180 );
grav(:,3) = -1 ./ tan( ort(:,2) * pi/180 );


for i = 1:x
    n = norm( grav(i,:) );
    grav(i,1) = 9.81 * grav(i,1)/n;
    grav(i,2) = 9.81 * grav(i,2)/n;
    grav(i,3) = 9.81 * grav(i,3)/n;
end


for i = 1:x
    acc(i,1) = acc(i,1) + grav(i,1);
    acc(i,2) = acc(i,2) + grav(i,2);
    acc(i,3) = acc(i,3) + grav(i,3);
end

coord = zeros( x+1, 3 );

vx = 0;
vy = 0;
vz = 0;

for i = 1:x
    coord(i+1,1) = coord(i,1) + 0.1*vx + (1/2)*acc(i,1)*0.01;
    coord(i+1,2) = coord(i,2) + 0.1*vy + (1/2)*acc(i,2)*0.01;
    coord(i+1,3) = coord(i,3) + 0.1*vz + (1/2)*acc(i,3)*0.01;
    vx = vx + acc(i,1)*0.1;
    vy = vy + acc(i,2)*0.1;
    vz = vz + acc(i,3)*0.1;
end

plot3(coord(:,1),coord(:,2),coord(:,3));

MATLAB官方解释在设备置于平面的时候,\(z轴\)上的加速度是\(+9.81\),而我们刚刚计算的结果是默认重力向下,也就是负的,所以两个相加正好抵消掉重力加速度。(当然我也不是很确定➕,反正我看过数据之后,发现符号真就相反,就是应该加)

总结

最后画的图:

虽然看起来还🌟,但是其实和实际轨迹差不少,在大概了解一圈之后,发现手机传感器的结果精度确实不高,正如我们前面计算的静止时的加速度,也不完全为零,甚至数值有的还不小。好像这就是惯性导航的问题所在。

然鹅我本来就是想试试MATLAB Mobile 顺便瞎写点啥,这后面的问题就跟我没啥关系了。

其实最后还是想试试用Kalman滤波器搞一下的,但是要和GPS一起运算,因为测试都在室内小范围活动,GPS信号嘛…

就酱了

我存了一些测试时候用的数据,名字瞎起的,其中teststill是不同姿态静止测试。链接🔗

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据