NMEA0183的六种输出协议:GPGGA、GPGLL、GPGSA、GPGSV、GPRMC、GPVTG。
/* * * NMEA library * URL: http://nmea.sourceforge.net * Author: Tim (xtimor@gmail.com) * Licence \file */ //该函数主要是对于nmea时间的处理 #ifndef __NMEA_TIME_H__ #define __NMEA_TIME_H__ #include "config.h" #ifdef __cplusplus extern "C" { #endif /** * Date and time data * @see nmea_time_now */ typedef struct (nmeaTIME *t); //获得这个格式的时间 #ifdef __cplusplus } #endif #endif /* __NMEA_TIME_H__ */ /* * * NMEA library \file time.h */ #include "nmea/time.h" #ifdef NMEA_WIN # pragma warning(disable: 4201) //对于这个用法不熟的可参考
Published Topics: nmea_sentence (nmea_msgs/Sentence) : A single time-stamped NMEA sentence NMEA GPS Serial driver node. NMEA GPS Topic driver node. Subscribed Topics nmea_sentence (nmea_msgs/Sentence) NMEA sentences, 1 per message. -- rosrun nmea_navsat_driver nmea_topic_driver --> <!
GPS NEMA 0183协议 一、 NMEA0183标准语句(GPS常用语句) GPGGA 例:GPGGA,092204.999,4250.5589,S,14718.5084,E,1,04,24.4,19.7
一、GPS数据格式介绍 GPS(全球定位系统)数据格式常见的是NMEA 0183格式,NMEA 0183格式是一种用于导航设备间传输数据的标准格式,定义了一套规范,使得不同厂商的设备可以通过串行通信接口 这个标准最初由美国航海电子协会(National Marine Electronics Association,简称NMEA)在1980年推出,并被广泛应用于全球的导航系统。 NMEA 0183格式的数据通常以ASCII字符流的形式传输,每条数据都以$开始,以回车符(\r)和换行符(\n)结束。数据被分为不同的消息类型,每个消息类型都有特定的字段和含义。 NMEA 0183格式的数据通常由GPS接收器、导航仪、自动驾驶系统等设备产生,并通过串口输出。其他设备可以通过读取串口数据,并按照NMEA 0183的规范解析数据。 随着技术的发展,新一代的GPS设备也开始采用更高级的数据格式,例如NMEA 2000。然而,由于广泛应用和兼容性的要求,NMEA 0183仍然被广泛支持,并被许多设备和导航系统所使用。
需要安装如下功能包: ~$ sudo apt-get install ros-indigo-nmea-* 安装完成后,启动roscore,需要用到下面命令: ~$ rosrun nmea_navsat_driver nmea_serial_driver _port:=/dev/rfcomm0 _baud:=115200 ~$ rostopic echo /fix ? ~$ rosrun nmea_navsat_driver nmea_topic_serial_reader _port:=/dev/rfcomm0 _baud:=115200 ~$ rostopic echo /nmea_sentence ?
所以用这个sscanf来解析NMEA语句也是可以的,类似上述例子的处理方式就可以,有一点和使用strtok函数一样,要注意处理连续逗号的情况,也可以采用先将连续逗号之间插入特殊字符再解析的办法。 /nmea/files/latest/download 我之前听说过有GPS相关的开源代码,正好就借机去学习了下,这个库用起来挺简单的,我花了点时间将它应用到了ARM Linux下。 2) 传入解析函数nmea_parse的数组必须是\r\n结尾,否则也无法正常解析。 3) 解析得到的经纬度格式是度分格式,如果需要使用其他格式,自己得再换算一次。 第三个要分享的是,还有一个网友建议去了解minmea,该源码在:https://github.com/kosma/minmea GitHub上介绍: a lightweight GPS NMEA 0183 我在它的README文件里看到一句话:Good documentation on NMEA is at https://gpsd.gitlab.io/gpsd/NMEA.html ,提到了一个NEMA
0x00 GPS NMEA GPS模块在定位后会输出含有各项定位信息的NMEA语句,其中包括经纬度 信息。 3,2,10,02,17,252,38,08,14,192,41,09,12,195,38,23,07,108,3574 详细的NEMA 0183协议解析访问网页NEMA 0183查询 0x01 经纬度转换 以NMEA
对于GPS的具体实现,需要跟具体的GPS驱动来定,因为某些GPS设备能直接输出所需要的NMEA数据,有的则需要自己实现解析才能得到。 GpsStatus* status); typedef void (* gps_sv_status_callback)(GpsSvStatus* sv_info); typedef void (* gps_nmea_callback )(GpsUtcTime timestamp, const char* nmea, int length); typedef void (* gps_set_capabilities)(uint32_t gps_location_callback location_cb; gps_status_callback status_cb; gps_sv_status_callback sv_status_cb; gps_nmea_callback nmea_cb; gps_set_capabilities set_capabilities_cb; gps_acquire_wakelock acquire_wakelock_cb;
nmea apt安装:sudo apt-get install ros-kinetic-nmea-navsat-driver libgps-dev 运行:roslaunch nmea_navsat_driver nmea_serial_driver.launch 源码:https://github.com/ros-drivers/nmea_navsat_driver gps坐标转换&rviz显示 源码
/ttyUSB1 /dev/ttyUSB2 /dev/ttyUSB3 ms@ubuntu:~$ Interface Description: DM Interface Diagnose port NMEA Interface For GPS NMEA message output AT Interface For AT commands Modem Interface For PPP connections Information: Product Driver Interface UC20 VID:0x05c6 PID:0x9003 USB Serial ttyUSB0 -> DM ttyUSB1 -> NMEA ttyUSB3 -> Modem ttyUSB4 -> Reserved EC20 VID:0x05c6 PID:0x9215 USB Serial ttyUSB0 -> DM ttyUSB1 -> NMEA
NMEA是美国国家海洋电子协会的简称,现在是GPS导航设备统一的RTCM标准协议。 demo用gps定位,但是handbook例子只用ndt-matching 雷达和地图匹配的不是很好啊! ? 上面差异一个tf: nmea2tfpose; 下面的位置就出现了很大的偏差 ? 14771 84757 ? ? 上面对比发现位置发生了很大的改变
基本思路是从NMEA018 3数据中提取时间信息,通过PPS信号来保证高精度。具体实现方法是采用GPS接收模块G591来构造硬件电路,软件部分需要NTP服务器软件和GPS的正确安装和配置。 这种方式继承了NMEA串行校时方式可以获取时间信息的优势,同时利用了PPS脉冲校时延时估计误差小、精度高的特点,是一种简便有效的校时方案。 硬件平台搭建好了之后,本文对PPS信号和NMEA0183串行数据进行了相应的调试。 若由于天线或气象原因,G591模块没有接收到信号,则不会产生PPS信号,同时NMEA0183语句中的GPRMC语句的标志位也会变成无效。 ,稳定性差,主要的原因是硬件资源分配过程中存在的随机性,使得NMEA串行数据的处理速度有随机偏差;本文采用的NMEA和PPS综合校时方案取得了较为理想的效果。
Install dependencies for Ubuntu 14.04 indigo % sudo apt-get install ros-indigo-desktop-full ros-indigo-nmea-msgs ros-indigo-nmea-navsat-driver ros-indigo-sound-play ros-indigo-jsk-visualization ros-indigo-grid-map Install dependencies for Ubuntu 15.04 jade % sudo apt-get install ros-jade-desktop-full ros-jade-nmea-msgs ros-jade-nmea-navsat-driver ros-jade-sound-play % sudo apt-get install ros-jade-controller-manager ros-jade-ros-control
pbSrc+i)-'0'); tmp = tmp*10; } } 效果:字符串:”123” 转为 123 第三种:包含转为浮点数 //m^n函数 //返回值:m^n次方. u32 NMEA_Pow =m; return result; } //str转换为数字,以','或者'*'结束 //buf:数字存储区 //dx:小数点位数,返回给调用函数 //返回值:转换后的数值 int NMEA_Str2num p++; } if(mask&0X02)buf++; //去掉负号 for(i=0;i<ilen;i++) //得到整数部分数据 { ires+=NMEA_Pow //最多取5位小数 *dx=flen; //小数点位数 for(i=0;i<flen;i++) //得到小数部分数据 { fres+=NMEA_Pow (10,flen-1-i)*(buf[ilen+1+i]-'0'); } res=ires*NMEA_Pow(10,flen)+fres; if(mask&0X02)res=-
pbSrc+i)-'0'); tmp = tmp*10; } } 效果:字符串:”123” 转为 123 第三种:包含转为浮点数: //m^n函数 //返回值:m^n次方. u32 NMEA_Pow =m; return result; } //str转换为数字,以','或者'*'结束 //buf:数字存储区 //dx:小数点位数,返回给调用函数 //返回值:转换后的数值 int NMEA_Str2num p++; } if(mask&0X02)buf++; //去掉负号 for(i=0;i<ilen;i++) //得到整数部分数据 { ires+=NMEA_Pow //最多取5位小数 *dx=flen; //小数点位数 for(i=0;i<flen;i++) //得到小数部分数据 { fres+=NMEA_Pow (10,flen-1-i)*(buf[ilen+1+i]-'0'); } res=ires*NMEA_Pow(10,flen)+fres; if(mask&0X02)res=-
其中ASCII码为NMEA-0183,NMEA-0183是美国国家海洋电子协会为海用电子设备制定的标准格式. 前面的0也将被传输) <9> UTC日期,ddmmyy(日月年)格式; <10> 磁偏角(000.0~180.0度,前面的0也将被传输) <11> 磁偏角方向,E(东)或W(西) <12> 模式指示(仅NMEA0183 000~359度,前面的0也将被传输) <3> 地面速率(000.0~999.9节,前面的0也将被传输) <4> 地面速率(0000.0~1851.8公里/小时,前面的0也将被传输) <5> 模式指示(仅NMEA0183
Install dependencies for Ubuntu 14.04 indigo % sudo apt-get install ros-indigo-desktop-full ros-indigo-nmea-msgs ros-indigo-nmea-navsat-driver ros-indigo-sound-play ros-indigo-jsk-visualization ros-indigo-grid-map Install dependencies for Ubuntu 16.04 kinetic % sudo apt-get install ros-kinetic-desktop-full ros-kinetic-nmea-msgs ros-kinetic-nmea-navsat-driver ros-kinetic-sound-play ros-kinetic-jsk-visualization ros-kinetic-grid-map
install ros-noetic-jsk-recognition-msgs ros-noetic-jsk-rviz-plugins ros-noetic-lanelet2* ros-noetic-nmea
减少布线复杂性:传统的点对点布线系统需要在每个相关节点之间设置专用线路,这使得系统成本高昂且不够灵活——一个很好的例子是NMEA 0183与NMEA 2000的对比。