本文主要分为两个部分,第一部分使用Matlab Mobile记录传感器数据,第二部分是在PC端或移动端进行轨迹参数的分析。甚至还可以对运动数据进行机器学习建模,预测你的动作(run、walk、jump,...)!无需matlab licence! 无需matlab licence! 无需matlab licence!你只需要注册一个MathWorks账号保存手机传感器数据到云端即可!
一、Matlab Mobile
手机端下载好matlab mobile app,登录自己注册的账号,可以无需“连接到MathWorks Clound",因为该App支持记录离线的传感器数据(包括加速度、磁场、方向、角速度、位置五大类数据)。本文只使用位置(Position)类别数据,这里面又细分为纬度,经度,海拔高度,速度,水平定位精度,方位角,时间戳等。点击传感器
记录好你个人的运动数据后,可以设置自动/手动上传.mat数据到matlab drive云端。过后你可以自己下载到本地进行分析使用。(有个小缺点就是数据不能通过微信分享出去。。。)
二、PC端地理图轨迹实时分析
看效果图:
上面只显示了'satellite'、'streets'两种基础图层,更丰富的参考这里。
code:
%% matlab mobile传感器数据,从手机导入到本地即可
clear;close all;clc;
load('sensorlog_20200402_193813.mat');
latitude = Position.latitude;
longtitude = Position.longitude;
altitude = Position.altitude;
timestamp = Position.Timestamp;
speed = Position.speed;
course = Position.course;
nums = length(latitude);
%% 画二维图全局配置
basemap = 'satellite';% 设置基础图层为卫星地图
f = figure('OuterPosition',get(groot,'ScreenSize'));% figure最大化
gx = geoaxes(f);
h = animatedline(gx,'MaximumNumPoints',Inf,...
'Color','g','LineWidth',4);
geobasemap(gx,basemap);
text(gx,latitude(1),longtitude(1),'Start','Color','b','FontSize',30);%起点
t = text(gx,latitude(1),longtitude(1),'Start',...
'Color','r',...
'FontSize',30,...
'FontWeight','bold',...
'FontAngle','italic');
InSet = get(gx, 'TightInset');% 获取axes尺寸
set(gx, 'Position', [InSet(1:2), 1-InSet(1)-InSet(3), 1-InSet(2)-InSet(4)]);% axes 填充整个figure
%% 实时画二维图
isSaveGIF = 0;
isSaveVideo = 0;
if isSaveGIF
[A,map] = rgb2ind(imresize(frame2im(getframe),[320,640]),256);
imwrite(A,map,'runParams.gif','LoopCount',Inf,'DelayTime',0.1);
end
if isSaveVideo
v = VideoWriter('runParams.avi');
open(v);
end
cumSumDistance = 0;% 累计距离(km)
cumLatitude=[];
cumLongtitude = [];
index = 2;%从第二个记录数据开始,第一个为起点
while isvalid(gx)&&(index<=nums) % 关闭窗口或者数据循环完毕为结束
% 当前经纬度
currentLatitude = latitude(index);
currentLongtitude = longtitude(index);
cumLatitude = [cumLatitude;currentLatitude];
cumLongtitude = [cumLongtitude;currentLongtitude];
addpoints(h,currentLatitude,currentLongtitude)
pt1 = [latitude(index-1,:),longtitude(index-1,:)];
pt2 = [latitude(index,:),longtitude(index,:)];
cumSumDistance = cumSumDistance + deg2km(distance(pt1,pt2));
t.Position = [currentLatitude,currentLongtitude];
t.String = sprintf('时间:%s\n累计距离:%.2f km\n当前速度:%.2fm/s\n海拔高度:%3g米\n方位角:%.2f度',...
datestr(timestamp(index)),cumSumDistance,speed(index),altitude(index),course(index));
% 显示合理的坐标范围
rangeLatitude = max(cumLatitude)-min(cumLatitude);
rangeLongtitude = max(cumLongtitude)-min(cumLongtitude);
geolimits(gx,[min(cumLatitude)-0.5*rangeLatitude,max(cumLatitude)+0.5*rangeLatitude],...
[min(cumLongtitude)-0.5*rangeLongtitude, max(cumLongtitude)+0.5*rangeLongtitude]);%自适应调整地理图范围
drawnow
% 保存动画
if isSaveGIF
if(mod(index,10)==0)
[A,map] = rgb2ind(imresize(frame2im(getframe),[320,640]),256);
imwrite(A,map,'runParams.gif','WriteMode','append','DelayTime',0.2);
end
end
if isSaveVideo
writeVideo(v,getframe(gx));
end
index = index+1;
end
if isSaveVideo
close(v);
end
%% 画三维图
uif = uifigure('Position',get(groot,'ScreenSize'));
g = geoglobe(uif);
geoplot3(g,latitude,longtitude,altitude,'c')
三、Reference