GPS数据格式的分析

文章目录

  • 前言
  • 一、数据格式解析
    • 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数据输出的格式很多,如图所示
GPS数据格式的分析_第1张图片

一、数据格式解析

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
GPS数据格式的分析_第2张图片
GPS数据格式的分析_第3张图片
GPS数据格式的分析_第4张图片

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数据格式的分析_第5张图片


你可能感兴趣的:(自动驾驶)