模式指示(仅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::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
参考博文: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,北斗卫星)来获取时间到时间戳服务器上,并通过时间戳服务器签发时间戳证书。此种时间戳可用来企业内部责任认定,在法庭认证时并不具备法律效力。因其在通过时间接收设备接收时间时存在被篡改的可能,故此不能做为法律依据。