概述
最近有使用千寻位置的产品来通过GNSS获取实际环境中的坐标位置信息,记录在使用过程中遇到的问题和解决方案。
使用千寻魔方MC120M获取定位数据后,文件里保存的是MNEA 协议格式的定位数据。
NMEA(National Marine Electronics Association)是美国国家海洋电子协会为海用电子设备制定的标准格式。NMEA-0183协议定义的语句非常多,常用的或者说兼容性广的语句有$GPGGA、$GPGSA、$GPGSA、$GPGSV、$GPRMC、$GPRMC、GPVTG、$GPGLL等。
下图就是获取得到的MNEA 协议格式的定位数据文件。
其中GPGGA是GPS数据输出格式语句,意思是一帧GPS定位的主要数据,是NMEA格式中使用最广的数据之一,具体格式有很多博文都进行了详细叙述。
我最终是在GPGGA语句中得到经纬高信息,因此就先将包含$GPGGA语句中数据筛选提取出来,这里使用matlab软件。
1、导入matlab中
Ga = importdata('nmea_output_20210618-160410.log'); % 导入log文件,导入后为cell类型文件
2、处理文中数据
将导入文件中的每行数据以string的类型提取出来,利用matlab中string相关函数判断是否是GPGGA语句,由于GPGGA数据有固定的格式,所以就可以很方便地从提取出来的GPGGA语句的数据中再提取出所需要的经纬度和高程信息。
Gp_count=1; %记录有多少条 GPGGA数据
for i=1:size(Ga,1)
str=string(Ga{i,1}); %将导入的cell类型数据一行一行地提取出来 提取为string类型
IsGPGGA=contains(str,"GPGGA"); %判断提取的string数据中是否包含有GPGGA 包含返回1 不包含返回0
if IsGPGGA
GP(:,Gp_count)=split(str,","); %将筛选得到的GPGGA数据以,为分割,打断拆分字符串
Gp_count=Gp_count+1; %GPGGA数据条数+1
end
end
pos(1,:)=(str2double(GP(5,:)))/100; %经度 提取筛选的GP中的第5行
pos(2,:)=(str2double(GP(3,:)))/100; %纬度 提取筛选的GP中的第三行
pos(3,:)=str2double(GP(10,:)); %高度 m
for i=1:size(pos,2)
pos(1,i)=floor(pos(1,i))+(pos(1,i)-floor(pos(1,i)))/60*100; %将其格式转为度
pos(2,i)=floor(pos(2,i))+(pos(2,i)-floor(pos(2,i)))/60*100; %将其格式转为度
end
提取出GPGGA语句后,按“,”将数据分割打断,最后第三行就是纬度,第五行为经度,如左下图所示。其中经纬度的格式和期望的不一致,如应为106°25010286'而实际上是10625.010286,因此多了一步将该数据转为正常的以°为单位的数据,所以上图中程序的后半段正是完成此工作。最后提取出来的经纬度如右下图所示。
3、绘制结果图
figure(1); %2d x-y平面路径图
plot(pos(1,:),pos(2,:),'k','LineWidth',2);
figure(2); %3d x-y-z三维路径图
plot3(pos(1,:),pos(2,:),pos(3,:),'k','LineWidth',2);
经过上述处理后得到的是 WGS-84 坐标系下的经度、纬度和高程信息,我期望能得到当地水平坐标系下的坐标信息,因此将其转化为东北天坐标系。
转换的公式可以参考此博客:https://www.cnblogs.com/long5683/p/13831605.html
实现的代码就是将这几个公式翻译一下就行,带入具体数据进行计算,我就不放上来了!
最后
以上就是矮小世界为你收集整理的使用Matlab提取接收到的log文件中的GNSS坐标信息的全部内容,希望文章能够帮你解决使用Matlab提取接收到的log文件中的GNSS坐标信息所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复