文章目录

  • 前言
  • 一、数据格式解析
    • 1、GPGGA
    • 2、GPRMC
    • 3、GPCHC
    • 4、Kitti数据集oxts数据
  • 二、驱动
    • 1、功能包
      • 1.1 解析GPGGA
      • 1.2 华测GPCHC
    • 2、ROS相关消息类型
      • 2.1 sensor_msgs::NavSatFix
      • 2.2 gps_common::GPSFix
      • 2.3 sensor_msgs::Imu
    • 3、驱动思路
  • 三、时间
    • 1、UTC时间
    • 2、时间戳

前言

GPS数据输出的格式很多,如图所示

一、数据格式解析

1、GPGGA

GPGGA是GPS数据输出格式语句,意思是一帧GPS定位的主要数据,是NMEA格式中使用最广的数据之一。该语句包括17个字段。

GPGGA 语句包括17个字段:
1语句标识头,2世界时间,3纬度,4纬度半球,5经度,6经度半球,7定位质量指示,8使用卫星数量,9HDOP-水平精度因子,10椭球高,11高度单位,12大地水准面高度异常差值,13高度单位,14差分GPS数据期限,15差分参考基站标号,16、17校验和结束标记(用回车符和换行符),分别用14个逗号进行分隔。
格式示例:$GPGGA,014434.70,3817.13334637,N,12139.72994196,E,4,07,1.5,6.571,M,8.942,M,0.7,0016*79
该数据帧的结构及各字段释义如下:
$GPGGA,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>,M,<10>,M,<11>,<12>*xx CR LF

$GPGGA:起始引导符及语句格式说明(本句为GPS定位数据);
<1> UTC时间,格式为hhmmss.sss;
<2> 纬度,格式为ddmm.mmmm(第一位是零也将传送);
<3> 纬度半球,N或S(北纬或南纬)
<4> 经度,格式为dddmm.mmmm(第一位零也将传送);
<5> 经度半球,E或W(东经或西经)
<6> GPS状态, 0初始化, 1单点定位, 2码差分, 3无效PPS, 4固定解, 5浮点解, 6正在估算 7,人工输入固定值, 8模拟模式, 9WAAS差分
<7> 使用卫星数量,从00到12(第一个零也将传送)
<8> HDOP-水平精度因子,0.5到99.9,一般认为HDOP越小,质量越好。
<9> 海拔高度,-9999.9到9999.9米
M 指单位米
<10> 大地水准面高度异常差值,-9999.9到9999.9米
M 指单位米
<11> 差分GPS数据期限(RTCM SC-104),最后设立RTCM传送的秒数量,如不是差分定位则为空
<12> 差分参考基站标号,从0000到1023(首位0也将传送)。

*语句结束标志符

xx 从$开始到*之间的所有ASCII码的异或校验
CR 回车符,结束标记
LF 换行符,结束标记

2、GPRMC

推荐定位信息(GPRMC)
$ GPRMC,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>,<10>,<11>,<12>*hh
<1> UTC时间,hhmmss.sss(时分秒.毫秒)格式
<2> 定位状态,A=有效定位,V=无效定位
<3> 纬度ddmm.mmmm(度分)格式(前面的0也将被传输)
<4> 纬度半球N(北半球)或S(南半球)
<5> 经度dddmm.mmmm(度分)格式(前面的0也将被传输)
<6> 经度半球E(东经)或W(西经)
<7> 地面速率(000.0~999.9节,前面的0也将被传输)
<8> 地面航向(000.0~359.9度,以正北为参考基准,前面的0也将被传输)
<9> UTC日期,ddmmyy(日月年)格式
<10> 磁偏角(000.0~180.0度,前面的0也将被传输)
<11> 磁偏角方向,E(东)或W(西)
<12> 模式指示(仅NMEA0183 3.00版本输出,A=自主定位,D=差分,E=估算,N=数据无效)
*后hh为$到*所有字符的异或和

3、GPCHC

华测导航GPCHC协议
$GPCHC,GPSWeek,GPSTime,Heading,Pitch,Roll,gyro x,gyro y,gyro z,acc x,acc y,acc
z,Lattitude,Longitude,Altitude,Ve,Vn,Vu,Baseline,NSV1,NSV2,Status,Age,Warming,Cs,CR,LF


4、Kitti数据集oxts数据

以2011_10_03_drive_0034_extract/oxts为例
dataformat.txt文件如下所示:
lat:oxts-unit的纬度
lon:oxts-unit的经度
alt: oxts-unit的海拔高度(m)

滚转:滚转角(rad),0=水平,正=左侧向上,范围:-π ~ π
俯仰:俯仰角(rad),0=水平,正=前向下,范围:-π/2 ~ π/2
偏航:航向(rad),0=东,正=逆时针,范围:-π ~ π 东北天坐标系

vn:向北的速度(m/s)
ve:向东速度(m/s)
vf:向前速度,即平行于地球表面(m/s)
vl:向左的速度,即平行于地球表面的速度(m/s)
vu:向上速度,即垂直于地表的速度(m/s)

ax:x方向的加速度,即车辆前方方向的加速度(m/s ^2)
ay:y方向的加速度,即车辆左侧方向的加速度(m/s ^2)
ay:z方向的加速度,即车辆顶部方向的加速度(m/s ^2)

af:向前加速度(m/s ^2)
al:向左加速度(m/s ^2)
au:向上加速度(m/s ^2)

wx:x周围的角速率(rad/s)
wy:y周围的角速率(rad/s)
wz:z周围的角速率(rad/s)

wf:围绕前向轴的角速率(rad/s)
wl:围绕左轴的角速率(rad/s)
wu:围绕向上轴的角速率(rad/s)

pos_accurcy:速度精度(以米为单位的北/东)
vel_accurcy:速度精度(以m/s为单位的北/东)

navstat:导航状态(请参阅navstat_to_string)
numsats:主GPS接收机跟踪的卫星数量
posmode:主GPS接收器的位置模式(请参阅GPS_mode_to_string)
velmode:主GPS接收器的速度模式(请参阅GPS_mode_to_string)
orimode:主GPS接收器的定向模式(参见GPS_mode_to_string)

单帧数据为:
48.987561046718 8.4696952979239 121.09180450439 // 经纬高
-0.020584 -0.000149 0.9367463267949 // 姿态 以东北天坐标系(ENU)
12.185641878808 8.8969705123207 15.087834393646 -0.057134398032698 0.17450967757564 // 速度
-0.31633682509644 -0.15393105646804 9.6145580368715 // 加速度计量测
-0.32811003609922 0.038528529255041 9.6154003554783 // 前左上加速度
-0.009921332362868 0.018688044825555 0.0071581383104018 // 陀螺量测
-0.0099284648375718 0.018828223646961 0.0067743562588337 // 前左上角速度
0.15566630977832 0.021931712199461 // 精度
4 9 5 5 0 // 其他

二、驱动

1、功能包

1.1 解析GPGGA

wiki网址:https://wiki.ros.org/nmea_navsat_driver

1.2 华测GPCHC

官方已出demo,没有的留个邮箱发你。

2、ROS相关消息类型

2.1 sensor_msgs::NavSatFix

官方:sensor_msgs/NavSatFix
其中的子消息类型:sensor_msgs::NavSatStatus
官方:sensor_msgs/NavSatStatus

2.2 gps_common::GPSFix

官方:gps_common/GPSFix

2.3 sensor_msgs::Imu

官方:sensor_msgs/Imu

3、驱动思路

字段分割函数,把GPCHC数据流分割成一个一个的字段,然后进行相应的定义
代码如下(示例):

void supersplit(const std::string& s, std::vector<std::string>& v, const std::string& c)
{std::string::size_type pos1, pos2;size_t len = s.length();pos2 = s.find(c);pos1 = 0;while(std::string::npos != pos2){if("" == s.substr(pos1, pos2-pos1)){v.emplace_back("0");}else{v.emplace_back(s.substr(pos1, pos2-pos1));}pos1 = pos2 + c.size();pos2 = s.find(c, pos1);}if(pos1 != len)v.emplace_back(s.substr(pos1));
}
typedef enum GNSS_GPCHC_INDEX{GNSS_GPCHC_INDEX_HEADER = 0,GNSS_GPCHC_INDEX_GPSWEEK,GNSS_GPCHC_INDEX_GPSTime,GNSS_GPCHC_INDEX_HEADING,GNSS_GPCHC_INDEX_PICH,GNSS_GPCHC_INDEX_ROLL,GNSS_GPCHC_INDEX_GRRO_X,GNSS_GPCHC_INDEX_GRRO_Y,GNSS_GPCHC_INDEX_GRRO_Z,GNSS_GPCHC_INDEX_ACC_X,GNSS_GPCHC_INDEX_ACC_Y,GNSS_GPCHC_INDEX_ACC_Z,GNSS_GPCHC_INDEX_LAT,GNSS_GPCHC_INDEX_LON,GNSS_GPCHC_INDEX_ALT,GNSS_GPCHC_INDEX_VE,GNSS_GPCHC_INDEX_VN,GNSS_GPCHC_INDEX_VU,GNSS_GPCHC_INDEX_SPEED,GNSS_GPCHC_INDEX_NSV1,GNSS_GPCHC_INDEX_NSV2,GNSS_GPCHC_INDEX_STATUS,GNSS_GPCHC_INDEX_AGE,GNSS_GPCHC_INDEX_WARMING,GNSS_GPCHC_INDEX_MAX
}GNSS_GPCHC_INDEX;

定义五种格式:

sensor_msgs::NavSatFix message_NavSatFix;
gps_common::GPSFix message_gpsfix;
sensor_msgs::Imu message_imu;
geometry_msgs::PoseStamped angle_qua; //欧拉角和四元数
geometry_msgs::PoseStamped lla_qua; //经纬高和四元数

发布ROS话题

 imu_raw_pub = nh_.advertise<sensor_msgs::Imu>("/imu_raw", 500);nav_sat_fix_pub = nh_.advertise<sensor_msgs::NavSatFix>("/nav_sat_fix", 500);gps_fix_pub = nh_.advertise<gps_common::GPSFix>("/gps_fix", 500);angle_qua_pub = nh_.advertise<geometry_msgs::PoseStamped>("/angle_qua", 500);lla_qua_pub = nh_.advertise<geometry_msgs::PoseStamped>("/lla_qua", 500);

参考博文:https://blog.csdn.net/abanchao/article/details/129096713

三、时间

1、UTC时间

1、UTC是协调世界时,又称世界统一时间、世界标准时间、国际协调时间。

2、协调世界时是以原子时秒长为基础,在时刻上尽量接近于世界时的一种时间计量系统。

3、国际原子时的准确度为每日数纳秒,而世界时的准确度为每日数毫秒。许多应用部门要求时间系统接近世界时UT,对于这种情况,一种称为协调世界时的折衷时标于1972年面世。为确保协调世界时与世界时相差不会超过0.9秒,在有需要的情况下会在协调世界时内加上正或负闰秒。

2、时间戳

时间戳是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数。Unix 时间戳是从1970年1月1日(UTC/GMT的午夜)开始所经过的秒数,不考虑闰秒。
  1.自建时间戳:此类时间戳是通过时间接收设备(如GPS,CDMA,北斗卫星)来获取时间到时间戳服务器上,并通过时间戳服务器签发时间戳证书。此种时间戳可用来企业内部责任认定,在法庭认证时并不具备法律效力。因其在通过时间接收设备接收时间时存在被篡改的可能,故此不能做为法律依据。


GPS数据格式的分析相关推荐

  1. c语言gps数据类型,GPS数据格式

    该协议信息包括GGA位置测定系统的定位资料.GSV导航卫星资料.RMC导 航卫星特定精简资料.VTG方向及速度等相关资料.这里以接收GGA数据为例, 给出的格式如下: $GPGGA, hhmmss,d ...

  2. android gps磁偏角,GPS数据格式解析

    GPS数据格式解析 简介 GPS发送数据以行为单位,数据格式如下: $信息类型,x,x,x,x,x,x,x,x,x,x,x,x,x 每行以字符"$"开头,以为结尾,CR-Carri ...

  3. ADS-B及其GPS数据异常分析

    paper:Analysis of anomalies in ADS-B and its GPS data 通过对比ADS-B数据及GPS数据来分析ADS-B系统存在的一些缺陷. 一.摘要 传统上,空 ...

  4. 【转载】噪声基底的计算和GPS接收机灵敏度分析

    [噪声基底计算:http://blog.sina.com.cn/s/blog_6b5d9a650100tyql.html] [GPS接收机灵敏度分析:http://bbs.ednchina.com/B ...

  5. IIQ文件内gps信息的分析

    版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的. 近日有网友咨询,使用<vb.net 教程 5-7 Bitmap类 3 获得图片信息Exif ...

  6. android gps源码分析,Android编程之Android GPS ——AGPS源码分析及配置

    本文主要介绍了Android编程的Android GPS --AGPS源码分析及配置,通过具体的分析以及源码,向大家展示了这些,希望对大家学习Android编程有所帮助. 1:冷启动指令: locat ...

  7. GPS数据格式 GPRMC 解析

    nmealib是一个基于C语言的用于nmea协议的开源库. 在http://nmea.sourceforge.net/上下载的. 部分文件分析: 在头文件info.h中定义了NMEA解码需要的关键变量 ...

  8. 移远EC20 4G模块的GPS部件刷新率修改方法,附GPS数据格式说明

    关键词:移远  EC20  全功能版  CE FAG  GPS  GNSS  GLONASS  全球定位系统  刷新率  Quectel_EC20_GNSS_AT_Commands_Manual_V1 ...

  9. 关于gps测量精度的分析

    2014年7月9日,本人在使用gps放样时按常规复核就近控制点,无意中发现gps高程精度竟然可达6mm,遂考虑将其 用在低精度的高程测量作业中. 然而在7月11日解算参数后复核高等级水准点时却出现8c ...

最新文章

  1. Nginx命令与配置详解
  2. Java中装箱与拆箱
  3. 第一百六十三节,jQuery,基础核心
  4. 关于elastic-job 分片与线程问题
  5. C语言初学者学习资料分享
  6. 秋招银行类金融科技岗笔试面试经验
  7. 20220117 matlab 全局变量调试
  8. Building a Hypermedia-Driven RESTful Web Service
  9. win10 docker镜像导入导出
  10. 深度学习(一、入门)
  11. SQL SERVER DAY函数
  12. linux菜鸟入门命令——自我学习
  13. [工具]Chrome(Google浏览器)常用插件
  14. 【高光谱、多光谱和全色图像融合】
  15. Spring Boot Admin监控中心详细讲解
  16. 操作系统——MFC实现进程创建和通信4
  17. EChar中的柱状图如何设置柱子的最大宽度和刻度的最小间隔
  18. 如何在面试中介绍自己的项目经验(面向java改进版)
  19. 潇洒郎: PostgreSQL学习——安装、启动、执行sql,修改数据库密码
  20. JBPM(二)---JBPM工作流基本操作

热门文章

  1. OpenCV中的5种平滑滤波操作
  2. wumei-smart 生活物联网平台
  3. jq循环给指定键赋值
  4. img图片标签更改src并刷新
  5. 清华大学计算机系 贾珈老师,清华大学计算机科学与技术系60周年系庆代际创新论坛...
  6. 硬件产品的三个验证阶段(EVT/DVT/PVT)
  7. 中文LLaMA模型和指令精调的Alpaca大模型:中文数据进行二次预训练,进一步提升了中文基础语义理解能力
  8. 高低温测试检测项目及标准
  9. css设置三角形的旋转方法2以及箭头三角形的设置和旋转
  10. Python+Appium APP自动化环境搭建