GPS模块设计思路与学习总结
1.组成结构
- Drivers/src\ (驱动程序资源包)
- gps_helper (GPS助手)
- ubx (UBX协议)
- RTCM\
- RTCMMavlink (RTCM微型无人机连接)
- definitions (项目管理的定义)
- GPSManagers (GPS管理器)
- GPSPositionMessage (GPS位置信息)
- GPSProvider (GPS提供商)
- satellite_info (卫星信息)
- vehicle_ gps_ position (飞行器GPS位置)
2.实现思路
2.1. gps_helper (GPS助手)
定义枚举类GPSCallbackType,包含:
- readDeviceData (从设备读取数据) 这是一个封闭的超时操作。
- data1:指向一个被写入的缓冲区。当调用该方法时第一个sizeof(int)字节包含超时毫秒。
- data2:字节在缓冲区的长度。比这更少的字节也可以阅读。
- return:读取的字节数,该方法也可以在超时发生之前返回0 。
- writeDeviceData (写入数据到设备)
- data1:被写入的数据。
- data2:写入数据的字节数。
- return:返回被写入的字节数。
- setBaudrate (设置传输速率)
- data1:忽略。
- data2:传输速率。
- 成功是返回0。
- gotRTCMMessage (从设备获取一个RTCM消息)
- data1:指针指向的信息。
- data2:信息的长度。
- return:忽略。
- surveyInStatus (当前调查状态的信息)
- data1:指向一个SurveyInStatus(调查现状)结构。
- data2:忽略。
- return:忽略。
- setClock (可用于设置当前时钟准确)
- data1:时间语音预测编码结构体的指针。
- data2:忽略。
- return:忽略。
定义surveyInStatus结构体,包含主要精度,持续时间,标记值三个成员,标记值为0时有效,为1时活跃。
定义GPSHelper类,包含一个OutputMode(输出模式)枚举类:
- GPS (正常的GPS输出)
- RTCM (请求RTCM输出,这是用于基站定位的)
定义几个虚函数:
- virtual ~GPSHelper();
- virtual int configure(unsigned &baud, OutputMode output_mode) = 0; (配置设置) 波特将设置波特率(输出参数)。
- virtual int receive(unsigned timeout) = 0; (从设备接收和处理新数据) bit等于0时有GPS位置更新,bit等于1时有卫星信息更新。
- virtual int restartSurveyIn() { return 0; } (重新启动调查过程)只是用于RTCM输出模式。它被称为后自动配置。
以及其他成员函数:
- float getPositionUpdateRate() { return _rate _lat _lon; } (获取位置更新率)
- float getVelocityUpdateRate() { return _rate _vel; } (获取速度更新率)
- void resetUpdateRates(); (重设更新率)
- void storeUpdateRates(); (存储更新率)
- int read(uint8_ t *buf, int buf_ length, int timeout) (从设备读取) buf为指针读取缓冲区,buf_ length为读取缓冲区的大小,timeout为超时的毫秒,返回值为0的话,说明没有读取到或者调查显示超时,小于0为错误,大于0返回读取的字节数。
- int write(const void *buf, int buf_ length) (写入到设备)
- int setBaudrate(int baudrate) (设置传输速率)
- void surveyInStatus(SurveyInStatus &status) (当前调查状态的信息)
- void gotRTCMMessage(uint8_t *buf, int buf_ length) (从设备获取一个RTCM消息)
- void setClock(timespec &t) (设置计时器)
- void GPSHelper::resetUpdateRates() (重设更新率)
- void GPSHelper::storeUpdateRates() (存储更新率)
2.2. ubx (UBX协议)
使用宏定义以下常量:
- 消息类
#define UBX_CLASS_NAV 0x01 // 导航
#define UBX_CLASS_INF 0x04 // 干扰素/无穷大
#define UBX_CLASS_ACK 0x05 // 确认符
#define UBX_CLASS_CFG 0x06 // 控制流图
#define UBX_CLASS_MON 0x0A
#define UBX_CLASS_RTCM3 0xF5 /*< This is undocumented (?) 这是非法的/
- 消息ID
#define UBX_ID_NAV_POSLLH 0x02
#define UBX_ID_NAV_DOP 0x04
#define UBX_ID_NAV_SOL 0x06
#define UBX_ID_NAV_PVT 0x07
#define UBX_ID_NAV_VELNED 0x12
#define UBX_ID_NAV_TIMEUTC 0x21
#define UBX_ID_NAV_SVINFO 0x30
#define UBX_ID_NAV_SAT 0x35
#define UBX_ID_NAV_SVIN 0x3B
#define UBX_ID_NAV_RELPOSNED 0x3C
#define UBX_ID_INF_DEBUG 0x04
#define UBX_ID_INF_ERROR 0x00
#define UBX_ID_INF_NOTICE 0x02
#define UBX_ID_INF_WARNING 0x01
#define UBX_ID_ACK_NAK 0x00
#define UBX_ID_ACK_ACK 0x01
#define UBX_ID_CFG_PRT 0x00
#define UBX_ID_CFG_MSG 0x01
#define UBX_ID_CFG_RATE 0x08
#define UBX_ID_CFG_NAV5 0x24
#define UBX_ID_CFG_SBAS 0x16
#define UBX_ID_CFG_TMODE3 0x71
#define UBX_ID_MON_VER 0x04
#define UBX_ID_MON_HW 0x09
#define UBX_ID_RTCM3_1005 0x05
#define UBX_ID_RTCM3_1077 0x4D
#define UBX_ID_RTCM3_1087 0x57
- 消息类和ID
#define UBX_MSG_NAV_POSLLH ((UBX_CLASS_NAV) | UBX_ID_NAV_POSLLH << 8)
#define UBX_MSG_NAV_SOL ((UBX_CLASS_NAV) | UBX_ID_NAV_SOL << 8)
#define UBX_MSG_NAV_DOP ((UBX_CLASS_NAV) | UBX_ID_NAV_DOP << 8)
#define UBX_MSG_NAV_PVT ((UBX_CLASS_NAV) | UBX_ID_NAV_PVT << 8)
#define UBX_MSG_NAV_VELNED ((UBX_CLASS_NAV) | UBX_ID_NAV_VELNED << 8)
#define UBX_MSG_NAV_TIMEUTC ((UBX_CLASS_NAV) | UBX_ID_NAV_TIMEUTC << 8)
#define UBX_MSG_NAV_SVINFO ((UBX_CLASS_NAV) | UBX_ID_NAV_SVINFO << 8)
#define UBX_MSG_NAV_SAT ((UBX_CLASS_NAV) | UBX_ID_NAV_SAT << 8)
#define UBX_MSG_NAV_SVIN ((UBX_CLASS_NAV) | UBX_ID_NAV_SVIN << 8)
#define UBX_MSG_NAV_RELPOSNED ((UBX_CLASS_NAV) | UBX_ID_NAV_RELPOSNED << 8)
#define UBX_MSG_INF_DEBUG ((UBX_CLASS_INF) | UBX_ID_INF_DEBUG << 8)
#define UBX_MSG_INF_ERROR ((UBX_CLASS_INF) | UBX_ID_INF_ERROR << 8)
#define UBX_MSG_INF_NOTICE ((UBX_CLASS_INF) | UBX_ID_INF_NOTICE << 8)
#define UBX_MSG_INF_WARNING ((UBX_CLASS_INF) | UBX_ID_INF_WARNING << 8)
#define UBX_MSG_ACK_NAK ((UBX_CLASS_ACK) | UBX_ID_ACK_NAK << 8)
#define UBX_MSG_ACK_ACK ((UBX_CLASS_ACK) | UBX_ID_ACK_ACK << 8)
#define UBX_MSG_CFG_PRT ((UBX_CLASS_CFG) | UBX_ID_CFG_PRT << 8)
#define UBX_MSG_CFG_MSG ((UBX_CLASS_CFG) | UBX_ID_CFG_MSG << 8)
#define UBX_MSG_CFG_RATE ((UBX_CLASS_CFG) | UBX_ID_CFG_RATE << 8)
#define UBX_MSG_CFG_NAV5 ((UBX_CLASS_CFG) | UBX_ID_CFG_NAV5 << 8)
#define UBX_MSG_CFG_SBAS ((UBX_CLASS_CFG) | UBX_ID_CFG_SBAS << 8)
#define UBX_MSG_CFG_TMODE3 ((UBX_CLASS_CFG) | UBX_ID_CFG_TMODE3 << 8)
#define UBX_MSG_MON_HW ((UBX_CLASS_MON) | UBX_ID_MON_HW << 8)
#define UBX_MSG_MON_VER ((UBX_CLASS_MON) | UBX_ID_MON_VER << 8)
#define UBX_MSG_RTCM3_1005 ((UBX_CLASS_RTCM3) | UBX_ID_RTCM3_1005 << 8)
#define UBX_MSG_RTCM3_1077 ((UBX_CLASS_RTCM3) | UBX_ID_RTCM3_1077 << 8)
#define UBX_MSG_RTCM3_1087 ((UBX_CLASS_RTCM3) | UBX_ID_RTCM3_1087 << 8)
- RX NAV-PVT消息内容的细节
#define UBX_RX_NAV_PVT_VALID_VALIDDATE 0x01 /*< 有效的UTC日期 /
#define UBX_RX_NAV_PVT_VALID_VALIDTIME 0x02 /*< 有效的UTC时间 /
#define UBX_RX_NAV_PVT_VALID_FULLYRESOLVED 0x04 // 1 = UTC时间已经完全解决(没有秒不确定性)
- 设置标志掩码
#define UBX_RX_NAV_PVT_FLAGS_GNSSFIXOK 0x01 /*< 一个有效的修复/
#define UBX_RX_NAV_PVT_FLAGS_DIFFSOLN 0x02 /*< 1如果应用微分修正 /
#define UBX_RX_NAV_PVT_FLAGS_PSMSTATE 0x1C /*< 省电模式状态(见电源管理) /
#define UBX_RX_NAV_PVT_FLAGS_HEADVEHVALID 0x20 /*< 飞行器是有效的信头 /
#define UBX_RX_NAV_PVT_FLAGS_CARRSOLN 0xC0 /*< (RTK mode) 载波相位范围的解决方案 /
- RX NAV-TIMEUTC消息内容的细节
#define UBX_RX_NAV_TIMEUTC_VALID_VALIDTOW 0x01 /*< 有效时间周期 /
#define UBX_RX_NAV_TIMEUTC_VALID_VALIDKWN 0x02 /*< 有效的周数 /
#define UBX_RX_NAV_TIMEUTC_VALID_VALIDUTC 0x04 /*< 有效的UTC时间 /
#define UBX_RX_NAV_TIMEUTC_VALID_UTCSTANDARD 0xF0 /*< UTC标准标识符 /
- TX CFG-PRT消息内容
#define UBX_TX_CFG_PRT_PORTID 0x01 /*< UART1 串口 /
#define UBX_TX_CFG_PRT_PORTID_USB 0x03 /*< USB 通用串行总线 /
#define UBX_TX_CFG_PRT_MODE 0x000008D0 /*< 0b0000100011010000: 8N1 /
#define UBX_TX_CFG_PRT_BAUDRATE 38400 /*< choose 38400 as GPS baudrate 选择38400作为GPS传输速率/
#define UBX_TX_CFG_PRT_INPROTOMASK_GPS ((1<<5) | 0x01) /*< RTCM3 in and UBX in /
#define UBX_TX_CFG_PRT_INPROTOMASK_RTCM (0x01) /*< UBX in /
#define UBX_TX_CFG_PRT_OUTPROTOMASK_GPS (0x01) /*< UBX out /
#define UBX_TX_CFG_PRT_OUTPROTOMASK_RTCM ((1<<5) | 0x01) /*< RTCM3 out and UBX out /
- TX CFG-RATE消息内容
#define UBX_TX_CFG_RATE_MEASINTERVAL 200 /*< 200ms for 5Hz /
#define UBX_TX_CFG_RATE_NAVRATE 1 /*< cannot be changed /
#define UBX_TX_CFG_RATE_TIMEREF 0 /*< 0: UTC, 1: GPS time /
- TX CFG-NAV5消息内容
#define UBX_TX_CFG_NAV5_MASK 0x0005 /*< Only update dynamic model and fix mode 只有更新动态模型和修复模式 /
#define UBX_TX_CFG_NAV5_DYNMODEL 7 /*< 0 Portable 移动的, 2 Stationary 固定的, 3 Pedestrian 徒步的, 4 Automotive 自动的, 5 Sea 海上的, 6 Airborne 空运<1g, 7 Airborne <2g, 8 Airborne <4g /
#define UBX_TX_CFG_NAV5_DYNMODEL_RTCM 2
#define UBX_TX_CFG_NAV5_FIXMODE 2 /*< 1 2D only, 2 3D only, 3 Auto 2D/3D /
- TX CFG-SBAS消息内容
#define UBX_TX_CFG_SBAS_MODE_ENABLED 1 /*< SBAS enabled 基于卫星的增强系统启用/
#define UBX_TX_CFG_SBAS_MODE_DISABLED 0 /*< SBAS disabled 禁用/
#define UBX_TX_CFG_SBAS_MODE UBX_TX_CFG_SBAS_MODE_DISABLED /*< SBAS enabled or disabled /
- TX CFG-TMODE3消息内容
#define UBX_TX_CFG_TMODE3_FLAGS 1 /*< start survey-in 开始合作 /
#define UBX_TX_CFG_TMODE3_SVINMINDUR (3*60) /*< survey-in: minimum duration 最短时间[s] (higher=higher precision) 高精度 /
#define UBX_TX_CFG_TMODE3_SVINACCLIMIT (10000) /*< survey-in: position accuracy limit 0.1[mm] 位置精度限制0.1 /
定义以下多个结构体、联合以及枚举
rtcm_ message_ t (RTCM消息):
typedef struct { uint8_t *buffer; uint16_t buffer_len; uint16_t pos; ///< 下一个位置缓冲区 uint16_t message_length; ///< 消息长度没有头和CRC(3字节) } rtcm_message_t;
ubx_ header_ t (UBX信头):
typedef struct {
uint8_t sync1;
uint8_t sync2;
uint16_t msg;
uint16_t length;
} ubx_header_t;ubx_ checksum_ t (UBX校验码):
typedef struct {
uint8_t ck_a;
uint8_t ck_b;
} ubx_checksum_t ;ubx_ payload_ rx_ nav_ posllh_ t (ubx有效负载接收器导航):
typedef struct {
uint32_t iTOW; /*< GPS Time of Week GPS的关闭时间 [ms] /
int32_t lon; /*< Longitude 经度 [1e-7 deg] /
int32_t lat; /*< Latitude 纬度 [1e-7 deg] /
int32_t height; /*< Height above ellipsoid 椭球上的高度 [mm] /
int32_t hMSL; /*< Height above mean sea level 平均海平面上的高度 [mm] /
uint32_t hAcc; /*< Horizontal accuracy estimate 水平进度估算 [mm] /
uint32_t vAcc; /*< Vertical accuracy estimate 垂直精度估算 [mm] /
} ubx_payload_rx_nav_posllh_t; // ubx有效负载接收器导航ubx_ payload_ rx_ nav_ dop_ t (导航接收器精度因子):
typedef struct {
uint32_t iTOW; /*< GPS Time of Week [ms] /
uint16_t gDOP; /*< Geometric DOP [0.01] /
uint16_t pDOP; /*< Position DOP [0.01] /
uint16_t tDOP; /*< Time DOP [0.01] /
uint16_t vDOP; /*< Vertical DOP [0.01] /
uint16_t hDOP; /*< Horizontal DOP [0.01] /
uint16_t nDOP; /*< Northing DOP [0.01] /
uint16_t eDOP; /*< Easting DOP [0.01] /
} ubx_payload_rx_nav_dop_t;ubx_ payload_ rx_ nav_ sol_ t:
typedef struct {
uint32_t iTOW; /*< GPS Time of Week [ms] /
int32_t fTOW; /*< Fractional part of iTOW 小数部分的iTOW (range: +/-500000) [ns] /
int16_t week; /*< GPS week /
uint8_t gpsFix; /*< GPSfix type GPS定位类型: 0 = No fix 无定位, 1 = Dead Reckoning only 只推算轨迹, 2 = 2D fix 2D定位, 3 = 3d-fix 3D定位, 4 = GPS + dead reckoning 全球定位加轨迹推算, 5 = time only fix 只定位时间/
uint8_t flags;
int32_t ecefX;
int32_t ecefY;
int32_t ecefZ;
uint32_t pAcc;
int32_t ecefVX;
int32_t ecefVY;
int32_t ecefVZ;
uint32_t sAcc;
uint16_t pDOP; /*< Position DOP [0.01] 位置精度因子/
uint8_t reserved1;
uint8_t numSV; /*< 用于导航的每搏输出量的数量的解决方案/
uint32_t reserved2;
} ubx_payload_rx_nav_sol_t;ubx_ payload_ rx_ nav_ pvt_ t (参数变数表):
typedef struct {
uint32_t iTOW; /*< GPS Time of Week [ms] /
uint16_t year; /*< Year (UTC)/
uint8_t month; /*< Month, range 1..12 (UTC) /
uint8_t day; /*< Day of month, range 1..31 (UTC) /
uint8_t hour; /*< Hour of day, range 0..23 (UTC) /
uint8_t min; /*< Minute of hour, range 0..59 (UTC) /
uint8_t sec; /*< Seconds of minute, range 0..60 (UTC) /
uint8_t valid; /*< Validity flags (see UBX_RX_NAV_PVT_VALID_…) 有效的标志 /
uint32_t tAcc; /*< Time accuracy estimate (UTC) [ns] 时间精度估算 /
int32_t nano; /*< Fraction of second (UTC) [-1e9…1e9 ns] 秒的分数部分 /
uint8_t fixType; /*< GNSSfix type 高精度卫星导航定位: 0 = No fix, 1 = Dead Reckoning only, 2 = 2D fix, 3 = 3d-fix, 4 = GNSS + dead reckoning, 5 = time only fix /
uint8_t flags; /*< Fix Status Flags 定位状态标记 (see UBX_RX_NAV_PVT_FLAGS_…) /
uint8_t reserved1;
uint8_t numSV; /*< Number of SVs used in Nav Solution 讯控用于解决方案的数量/
int32_t lon; /*< Longitude [1e-7 deg] /
int32_t lat; /*< Latitude [1e-7 deg] /
int32_t height; /*< Height above ellipsoid [mm] 地球椭球的高/
int32_t hMSL; /*< Height above mean sea level [mm] 水平面的高/
uint32_t hAcc; /*< Horizontal accuracy estimate 水平精度估算 [mm] /
uint32_t vAcc; /*< Vertical accuracy estimate 垂直精度估算 [mm] /
int32_t velN; /*< NED north velocity [mm/s] 北方向的速度 /
int32_t velE; /*< NED east velocity [mm/s] 东方向的速度 /
int32_t velD; /*< NED down velocity [mm/s] 下方向的速度 /
int32_t gSpeed; /*< Ground Speed (2-D) [mm/s] 対地速度 /
int32_t headMot; /*< Heading of motion (2-D) [1e-5 deg] 运动的前进方向 /
uint32_t sAcc; /*< Speed accuracy estimate [mm/s] 速度精度估算 /
uint32_t headAcc; /*< Heading accuracy estimate (motion and vehicle) [1e-5 deg] 航向精度估计(运动和飞行器)/
uint16_t pDOP; /*< Position DOP [0.01] 位置精度因子/
uint16_t reserved2; // 预留
uint32_t reserved3;
int32_t headVeh; /*< (ubx8+ only) Heading of vehicle (2-D) [1e-5 deg] /
uint32_t reserved4; /*< (ubx8+ only) /
} ubx_payload_rx_nav_pvt_t; // 参数变数表ubx_ payload_ rx_ nav_ timeutc_ t (国际时间):
typedef struct {
uint32_t iTOW; /*< GPS Time of Week [ms] /
uint32_t tAcc; /*< Time accuracy estimate (UTC) [ns] /
int32_t nano; /*< Fraction of second, range -1e9 .. 1e9 (UTC) [ns] /
uint16_t year; /*< Year, range 1999..2099 (UTC) /
uint8_t month; /*< Month, range 1..12 (UTC) /
uint8_t day; /*< Day of month, range 1..31 (UTC) /
uint8_t hour; /*< Hour of day, range 0..23 (UTC) /
uint8_t min; /*< Minute of hour, range 0..59 (UTC) /
uint8_t sec; /*< Seconds of minute, range 0..60 (UTC) /
uint8_t valid; /*< Validity Flags (see UBX_RX_NAV_TIMEUTC_VALID_…) /
} ubx_payload_rx_nav_timeutc_t;ubx_ payload_ rx_ nav_ svinfo_ part1_ t:
typedef struct {
uint32_t iTOW; /*< GPS Time of Week [ms] /
uint8_t numCh; /*< Number of channels 信道数量 /
uint8_t globalFlags;
uint16_t reserved2;
} ubx_payload_rx_nav_svinfo_part1_t;ubx_ payload_ rx_ nav_ svinfo_ part2_ t:
typedef struct {
uint8_t chn; /*< Channel number, 255 for SVs not assigned to a channel 通道数,255 每搏输出量不分配给一个频道/
uint8_t svid; /*< Satellite ID 卫星ID/
uint8_t flags;
uint8_t quality;
uint8_t cno; /*< Carrier to Noise Ratio (Signal Strength) 航空噪声比(信号强度) [dbHz] /
int8_t elev; /*< Elevation [deg] 海拔高度 /
int16_t azim; /*< Azimuth [deg] 方位角/偏振角/
int32_t prRes; /*< Pseudo range residual 伪范围残留[cm] /
} ubx_payload_rx_nav_svinfo_part2_t;ubx_ payload_ rx_ nav_ svin_ t:
typedef struct {
uint8_t version;
uint8_t reserved1[3];
uint32_t iTOW;
uint32_t dur;
int32_t meanX;
int32_t meanY;
int32_t meanZ;
int8_t meanXHP;
int8_t meanYHP;
int8_t meanZHP;
int8_t reserved2;
uint32_t meanAcc;
uint32_t obs;
uint8_t valid;
uint8_t active;
uint8_t reserved3[2];
} ubx_payload_rx_nav_svin_t;ubx_ payload_ rx_ nav_ velned_ t(三向速率):
typedef struct {
uint32_t iTOW; /*< GPS Time of Week [ms] /
int32_t velN; /*< North velocity component [cm/s]/
int32_t velE; /*< East velocity component [cm/s]/
int32_t velD; /*< Down velocity component [cm/s]/
uint32_t speed; /*< Speed (3-D) [cm/s] /
uint32_t gSpeed; /*< Ground speed (2-D) [cm/s] /
int32_t heading; /*< Heading of motion 2-D [1e-5 deg] /
uint32_t sAcc; /*< Speed accuracy estimate [cm/s] /
uint32_t cAcc; /*< Course / Heading accuracy estimate [1e-5 deg] /
} ubx_payload_rx_nav_velned_t;ubx_ payload_ rx_ mon_ hw_ ubx6_ t:
typedef struct {
uint32_t pinSel;
uint32_t pinBank;
uint32_t pinDir;
uint32_t pinVal;
uint16_t noisePerMS;
uint16_t agcCnt;
uint8_t aStatus;
uint8_t aPower;
uint8_t flags;
uint8_t reserved1;
uint32_t usedMask;
uint8_t VP[25];
uint8_t jamInd;
uint16_t reserved3;
uint32_t pinIrq;
uint32_t pullH;
uint32_t pullL;
} ubx_payload_rx_mon_hw_ubx6_t;ubx_ payload_ rx_ mon_ hw_ ubx7_ t:
typedef struct {
uint32_t pinSel;
uint32_t pinBank;
uint32_t pinDir;
uint32_t pinVal;
uint16_t noisePerMS;
uint16_t agcCnt;
uint8_t aStatus;
uint8_t aPower;
uint8_t flags;
uint8_t reserved1;
uint32_t usedMask;
uint8_t VP[17];
uint8_t jamInd;
uint16_t reserved3;
uint32_t pinIrq;
uint32_t pullH;
uint32_t pullL;
} ubx_payload_rx_mon_hw_ubx7_t;ubx_ payload_ rx_ mon_ ver_ part1_ t:
typedef struct {
uint8_t swVersion[30];
uint8_t hwVersion[10];
} ubx_payload_rx_mon_ver_part1_t;ubx_ payload_ rx_ mon_ ver_ part2_ t:
typedef struct {
uint8_t extension[30];
} ubx_payload_rx_mon_ver_part2_t;ubx _payload _rx _ack _ack _t:
typedef union {
uint16_t msg;
struct {
uint8_t clsID;
uint8_t msgID;
};
} ubx_payload_rx_ack_ack_t;ubx _payload _rx _ack _nak _t:
typedef union {
uint16_t msg;
struct {
uint8_t clsID;
uint8_t msgID;
};
} ubx_payload_rx_ack_nak_t;ubx _payload _tx _cfg _prt _t:
typedef struct {
uint8_t portID;
uint8_t reserved0;
uint16_t txReady;
uint32_t mode;
uint32_t baudRate;
uint16_t inProtoMask;
uint16_t outProtoMask;
uint16_t flags;
uint16_t reserved5;
} ubx_payload_tx_cfg_prt_t;ubx _payload _tx _cfg _rate _t:
typedef struct {
uint16_t measRate; /*< 测量速度,GPS测量每measRate毫秒 Measurement Rate, GPS measurements are taken every measRate milliseconds /
uint16_t navRate; /*< 导航速度,测量的循环次数。该参数不能改变,必须设置为1 Navigation Rate, in number of measurement cycles. This parameter cannot be changed, and must be set to 1 /
uint16_t timeRef; /*< 对齐参考时间:0 = UTC时间,1 = GPS时间 Alignment to reference time: 0 = UTC time, 1 = GPS time /
} ubx_payload_tx_cfg_rate_t;ubx _payload _tx _cfg _nav5 _t:
typedef struct {
uint16_t mask;
uint8_t dynModel; /*< 动态平台模型:0便携式,2固定,3人行,4汽车,5,6机载< 1 g,7机载< 2 g,8机载< 4 g Dynamic Platform model: 0 Portable, 2 Stationary, 3 Pedestrian, 4 Automotive, 5 Sea, 6 Airborne <1g, 7 Airborne <2g, 8 Airborne <4g /
uint8_t fixMode; /*< Position Fixing Mode: 1 2D only, 2 3D only, 3 Auto 2D/3D /
int32_t fixedAlt;
uint32_t fixedAltVar;
int8_t minElev;
uint8_t drLimit;
uint16_t pDop;
uint16_t tDop;
uint16_t pAcc;
uint16_t tAcc;
uint8_t staticHoldThresh;
uint8_t dgpsTimeOut;
uint8_t cnoThreshNumSVs; /*< (ubx7+ only, else 0) /
uint8_t cnoThresh; /*< (ubx7+ only, else 0) /
uint16_t reserved;
uint16_t staticHoldMaxDist; /*< (ubx8+ only, else 0) /
uint8_t utcStandard; /*< (ubx8+ only, else 0) /
uint8_t reserved3;
uint32_t reserved4;
} ubx_payload_tx_cfg_nav5_t;ubx _payload _tx _cfg _sbas _t:
typedef struct {
uint8_t mode;
uint8_t usage;
uint8_t maxSBAS;
uint8_t scanmode2;
uint32_t scanmode1;
} ubx_payload_tx_cfg_sbas_t;ubx _payload _tx _cfg _msg _t:
typedef struct {
union {
uint16_t msg;
struct {
uint8_t msgClass;
uint8_t msgID;
};
};
uint8_t rate;
} ubx_payload_tx_cfg_msg_t;ubx _payload _tx _cfg _tmode3 _t:
typedef struct {
uint8_t version;
uint8_t reserved1;
uint16_t flags;
int32_t ecefXOrLat;
int32_t ecefYOrLon;
int32_t ecefZOrAlt;
int8_t ecefXOrLatHP;
int8_t ecefYOrLonHP;
int8_t ecefZOrAltHP;
uint8_t reserved2;
uint32_t fixedPosAcc;
uint32_t svinMinDur;
uint32_t svinAccLimit;
uint8_t reserved3[8];
} ubx_payload_tx_cfg_tmode3_t;ubx _buf _t (一般信息和有效载荷缓冲联合):
typedef union {
ubx_payload_rx_nav_pvt_t payload_rx_nav_pvt;
ubx_payload_rx_nav_posllh_t payload_rx_nav_posllh;
ubx_payload_rx_nav_sol_t payload_rx_nav_sol;
ubx_payload_rx_nav_dop_t payload_rx_nav_dop;
ubx_payload_rx_nav_timeutc_t payload_rx_nav_timeutc;
ubx_payload_rx_nav_svinfo_part1_t payload_rx_nav_svinfo_part1;
ubx_payload_rx_nav_svinfo_part2_t payload_rx_nav_svinfo_part2;
ubx_payload_rx_nav_svin_t payload_rx_nav_svin;
ubx_payload_rx_nav_velned_t payload_rx_nav_velned;
ubx_payload_rx_mon_hw_ubx6_t payload_rx_mon_hw_ubx6;
ubx_payload_rx_mon_hw_ubx7_t payload_rx_mon_hw_ubx7;
ubx_payload_rx_mon_ver_part1_t payload_rx_mon_ver_part1;
ubx_payload_rx_mon_ver_part2_t payload_rx_mon_ver_part2;
ubx_payload_rx_ack_ack_t payload_rx_ack_ack;
ubx_payload_rx_ack_nak_t payload_rx_ack_nak;
ubx_payload_tx_cfg_prt_t payload_tx_cfg_prt;
ubx_payload_tx_cfg_rate_t payload_tx_cfg_rate;
ubx_payload_tx_cfg_nav5_t payload_tx_cfg_nav5;
ubx_payload_tx_cfg_sbas_t payload_tx_cfg_sbas;
ubx_payload_tx_cfg_msg_t payload_tx_cfg_msg;
ubx_payload_tx_cfg_tmode3_t payload_tx_cfg_tmode3;
} ubx_buf_t;ubx _decode _state _t (译码器状态):
typedef enum {
UBX_DECODE_SYNC1 = 0,
UBX_DECODE_SYNC2,
UBX_DECODE_CLASS,
UBX_DECODE_ID,
UBX_DECODE_LENGTH1,
UBX_DECODE_LENGTH2,
UBX_DECODE_PAYLOAD,
UBX_DECODE_CHKSUM1,
UBX_DECODE_CHKSUM2,UBX_DECODE_RTCM3
} ubx_decode_state_t;
ubx _rxmsg _state _t (接收器消息状态):
typedef enum {
UBX_RXMSG_IGNORE = 0,
UBX_RXMSG_HANDLE,
UBX_RXMSG_DISABLE,
UBX_RXMSG_ERROR_LENGTH
} ubx_rxmsg_state_t;ubx _ack _state _t (应答状态):
typedef enum {
UBX_ACK_IDLE = 0,
UBX_ACK_WAITING,
UBX_ACK_GOT_ACK,
UBX_ACK_GOT_NAK
} ubx_ack_state_t;
GPSDriverUBX类
继承GPSHelper类,添加以下成员函数:
- int configure(unsigned &baudrate, OutputMode output_mode) (配置函数) 尝试不同的传输速率,检查协议版本,刷新输入和等待至少20 ms。发送CFG-PRT消息改变波特率,发送CFG-RATE消息定义更新率,发送一个NAV5消息内部过滤器设置选项。然后配置消息速率,请求模块版本信息通过发送一个空MON-VER消息。
- int restartSurveyIn() (重新启动测绘) 禁用RTCM输出,然后首先停止它,停止合作过程不工作。重设各结构体,然后启用状态的输出合作。
- int receive(unsigned timeout) () 对超时额外的调查,如果已经收到某物,只等待UBX_PACKET_TIMEOUT,对轮询或阅读时发生的一些错误进行处理,如果准备完成则返回成功。通过接收字节包解码器解码,中止超时后如果没有收到有用的包,发出超时的debug信息并返回。
-
- int parseChar(const uint8 _t b); (分析二进制的UBX数据包) 通过switch判断解码状态,并作出相应的处理,达到解码的目的。
- int payloadRxInit(void); (开始有效载荷接收器) 同样使用switch判断接收器信息并处理。
- int payloadRxAdd(const uint8 _t b); (添加有效载荷接收器字节)
- int payloadRxAddNavSvinfo(const uint8 _t b); (添加NAV-SVINFO有效负载接收器字节) 先将第一部分填满缓冲区,再将第二部分填满缓冲区。当负载索引大于负载长度时,负载完全收到,并返回。
- int payloadRxAddMonVer(const uint8 _t b); (添加MON-VER有效负载接收器字节) 填充第一部分缓冲区,并计算散列SW&HW版本字符串,再填充第二部分缓冲区。
- int payloadRxDone(void); (结束有效载荷接收器) 使用switch对接收器消息进行判断,对GPS的各项参数赋值,检查日期和时间固定标志是否是好的。
- void decodeInit(void); (重置解析状态机的一个全新的开始) 对有效负载接收器初始化,以及输出模式的判断,将相应的RTCM信息存入缓存。
- void addByteToChecksum(const uint8 _t); (在解析添加每个字节到校验码(除了同步字节))
- bool sendMessage(const uint16 _t msg, const uint8 _t *payload, const uint16 _t length); 计算校验和,并发送消息。
- bool configureMessageRate(const uint16 _t msg, const uint8 _t rate); (配置消息比率) 允许交叉操作,发送配置消息。
- void calcChecksum(const uint8 _t *buffer, const uint16 _t length, ubx _checksum _t *checksum); (计算和添加给定的缓冲区校验码)
- int waitForAck(const uint16 _t msg, const unsigned timeout, const bool report); (等待消息确认)
- inline bool configureMessageRateAndAck(uint16 _t msg, uint8 _t rate, bool report _ack _error = false); (确认配置消息比率)
- uint32 _t fnv1_32_str(uint8 _t *str, uint32 _t hval); (计算FNV1散列) 通过:
hval += (hval << 1) + (hval << 4) + (hval << 7) + (hval << 8) + (hval << 24);
来计算FNV1散列值,然后返回。
初始化函数调用decodeInit,并将各参数初始化。
定义以下参数:
struct vehicle_gps_position_s *_gps_position;
struct satellite_info_s *_satellite_info;
uint64_t _last_timestamp_time;
bool _configured;
ubx_ack_state_t _ack_state;
bool _got_posllh;
bool _got_velned;
ubx_decode_state_t _decode_state;
uint16_t _rx_msg;
ubx_rxmsg_state_t _rx_state;
uint16_t _rx_payload_length;
uint16_t _rx_payload_index;
uint8_t _rx_ck_a;
uint8_t _rx_ck_b;
gps_abstime _disable_cmd_last;
uint16_t _ack_waiting_msg;
ubx_buf_t _buf;
uint32_t _ubx_version;
bool _use_nav_pvt;
OutputMode _output_mode = OutputMode::GPS;rtcm_message_t *_rtcm_message = nullptr;
2.3. RTCMMavlink (RTCM微型无人机连接)
定义RTCMMavlink类,包括一个槽:
- void RTCMDataUpdate(QByteArray message); (RTCM数据更新) 将信息的大小存入频带宽度字节计数器bandwidthByteCounter,如果事件过去1000,输出RTCM频带宽度,重启计时器,并将频带宽度字节计数器清零。定义一个常量最大消息长度,如果信息大小小于最大消息长度,发送该信息到飞行器,否则寻找我们需要的信息片段,
一个私有函数:
- void sendMessageToVehicle(const mavlink_gps_rtcm_data_t& msg); (发送消息到飞行器) 通过mavlink_msg_gps_rtcm_data_encode_chan将信息发送出去。
三个参数:
- QGCToolbox& _toolbox;
- QElapsedTimer _bandwidthTimer; // 已经过的时间类型
- int _bandwidthByteCounter = 0; // 频带字节计数器
初始化时启动bandwidthTimer计时器。
2.4. definitions (项目管理的定义)
宏定义:
- #define GPS_READ_BUFFER_SIZE 1024 (读取缓冲区大小)
- #define GPS _INFO(…) qInfo( VA _ARGS ) (GPS信息)
- #define GPS _WARN(…) qWarning( VA _ARGS ) (GPS警告)
- #define GPS _ERR(…) qCritical( VA _ARGS ) (GPS错误)
- #define M _DEG _TO _RAD _F 0.01745329251994f
- #define M _RAD _TO _DEG _F 57.2957795130823f
定义一个继承QThread的Sleeper类:
包含一个静态函数:static void usleep(unsigned long usecs) { QThread::usleep(usecs); }
类外的一个静态函数gps_absolute_time (GPS绝对时间):
static inline gps_abstime gps_absolute_time() {
//FIXME: is there something with microsecond accuracy?
// 微秒级精度有什么用?
return QDateTime::currentMSecsSinceEpoch() * 1000;
}timespec(时间规格)结构体:包含两个参数time _t tv _sec;以及long tv _nsec;
2.5. GPSManager (GPS管理器)
新建继承QGCTool的GPSManager类:
两个槽:
- void GPSPositionUpdate(GPSPositionMessage msg);
- void GPSSatelliteUpdate(GPSSatelliteMessage msg);
以及成员函数:
void connectGPS(const QString& device); (连接到GPS) 调用cleanup先进行清除,然后创建RTCM设备,通过以下方式与GPS连接:
connect(_gpsProvider, SIGNAL(RTCMDataUpdate(QByteArray)), _rtcmMavlink,
SLOT(RTCMDataUpdate(QByteArray)));// 测试:连接位置更新 connect(_gpsProvider, SIGNAL(positionUpdate(GPSPositionMessage)), this, SLOT(GPSPositionUpdate(GPSPositionMessage))); connect(_gpsProvider, SIGNAL(satelliteInfoUpdate(GPSSatelliteMessage)), this, SLOT(GPSSatelliteUpdate(GPSSatelliteMessage)));
bool connected(void) const { return _gpsProvider != nullptr; }
- void cleanup(); (清除函数) 如果GPS提供者存在,将GPS停止请求设为true,注意,我们需要一个相对较高的逾时确保GPS线程完成。如果GPS提供者等待时间不到2000,发出‘没有等待GPS线程退出。考虑增加超时’的警告。然后删除gpsProvider以及rtcmMavlink。
初始化:通过qRegisterMetaType将GPS位置信息和卫星信息初始化。
2.6. GPSPositionMessage (GPS位置信息)
定义两个结构体:
- GPSPositionMessage(GPS位置信息) 包含一个结构体类型vehicle_gps_position_s 。
- GPSSatelliteMessage(GPS卫星信息) 包含一个结构体类型satellite_info_s 。
2.7. GPSProvider (GPS供应者)
定义三个信号:
- void positionUpdate(GPSPositionMessage message); (位置更新)
- void satelliteInfoUpdate(GPSSatelliteMessage message); (卫星信息更新)
- void RTCMDataUpdate(QByteArray message); (RTCM数据更新)
成员函数:
- run() 定义一个串行端口,设置它的波特率,数据位数,校验值,终止位数,流控制。添加一个基于UBS协议的GPS助手,当请求没有终止且重试次数小于3次时,对helperRet进行判断处理。如果串行端口不为NoError或TimeoutError,那么break,退出GPS线程。
- GPSProvider::GPSProvider(const QString& device, bool enableSatInfo, const std::atomic_bool& requestStop) (初始化) 初始化设备和请求停机,如果启用了状态信息,那么新建一个卫星状态信息。
- GPSProvider::~GPSProvider() (析构函数) 删除状态信息和串行端口。
- void GPSProvider::publishGPSPosition() (发布GPS位置) 将位置信息数据保存到GPS位置信息并发出位置更新的信号。以下方法类似。
- void GPSProvider::publishGPSSatellite() (发布GPS卫星)
- void GPSProvider::gotRTCMData(uint8_t* data, size_t len) (获取RTCM数据)
- int GPSProvider::callbackEntry(GPSCallbackType type, void *data1, int data2, void *user) (回调入口)
- int GPSProvider::callback(GPSCallbackType type, void *data1, int data2) (回调) 对传入的type进行判断,如果是读取设备数据且没有超时,那么读取传入的数据及大小。如果是写入设备数据且调用write函数写入的两个数据的返回值大于等于0,则返回数据的大小。如果是设置传输速率,对数据大小进行判断返回0或-1 。如果是获取RTCM数据,调用gotRTCMData并break,如果是状态的测量,定义一个状态的对象赋值为传入的数据,显示它的持续时间、平均精度以及标记然后break。
2.8. satellite\_info\_s (卫星信息)
定义一个卫星信息结构体satellite_info_s:
struct satellite_info_s {
uint64_t timestamp; (事件印记)
uint8_t count; (计数)
uint8_t svid[20]; (接口定义)
uint8_t used[20]; (使用过的)
uint8_t elevation[20]; (海拔)
uint8_t azimuth[20]; (方位角)
uint8_t snr[20]; (信噪比)
以及定义常量卫星最大信息的值为20 。
2.9. vehicle\_gps\_position\_s (飞行器GPS位置)
定义一个vehicle_gps_position_s结构体,包括以下变量:
- uint64_t timestamp; (时间标记)
- uint64_t time_utc_usec; (世界调整时间 微秒)
- int32_t lat; (纬度)
- int32_t lon; (经度)
- int32_t alt; (高度)
- int32_t alt_ellipsoid; (地球椭球体高度)
- float s_variance_m_s; (方差/变异数 m s)
- float c_variance_rad; (方差/变异数 弧度)
- float eph; (水平定位精度参数)
- float epv; (垂直定位精度参数)
- float hdop; (水平精度因子)
- float vdop; (垂直精度因子)
- int32_t noise_per_ms; (每毫秒的杂讯)
- int32_t jamming_indicator; (干扰指示器)
- float vel_m_s; (速度)
- float vel_n_m_s; (北速度)三向速度
- float vel_e_m_s; (东速度)
- float ve_d_m_s; (下速度)
- float cog_rad;
- int32_t timestamp_time_relative; (相对时间的时间标记)
- uint8_t fix_type; (固定类型)
- bool vel_ned_valid; (三向速度是否有效)
- uint8_t satellites_used; (使用的卫星)
3.GPS相关资料
以下资料取自百度百科。
3.1. 概述
- 定义
利用GPS定位卫星,在全球范围内实时进行定位、导航的系统,称为全球卫星定位系统,简称GPS。GPS是由美国国防部研制建立的一种具有全方位、全天候、全时段、高精度的卫星导航系统,能为全球用户提供低成本、高精度的三维位置、速度和精确定时等导航信息,是卫星通信技术在导航领域的应用典范,它极大地提高了地球社会的信息化水平,有力地推动了数字经济的发展。
- 简介
GPS可以提供车辆定位、防盗、反劫、行驶路线监控及呼叫指挥等功能。要实现以上所有功能必须具备GPS终端、传输网络和监控平台三个要素。
3.2. 工作原理
定位原理
GPS导航系统的基本原理是测量出已知位置的卫星到用户接收机之间的距离,然后综合多颗卫星的数据就可知道接收机的具体位置。要达到这一目的,卫星的位置可以根据星载时钟所记录的时间在卫星星历中查出。而用户到卫星的距离则通过记录卫星信号传播到用户所经历的时间,再将其乘以光速得到(由于大气层电离层的干扰,这一距离并不是用户与卫星之间的真实距离,而是伪距(PR,):当GPS卫星正常工作时,会不断地用1和0二进制码元组成的伪随机码(简称伪码)发射导航电文。GPS系统使用的伪码一共有两种,分别是民用的C/A码和军用的P(Y)码。C/A码频率1.023MHz,重复周期一毫秒,码间距1微秒,相当于300m;P码频率10.23MHz,重复周期266.4天,码间距0.1微秒,相当于30m。而Y码是在P码的基础上形成的,保密性能更佳。导航电文包括卫星星历、工作状况、时钟改正、电离层时延修正、大气折射修正等信息。它是从卫星信号中解调制出来,以50b/s调制在载频上发射的。导航电文每个主帧中包含5个子帧每帧长6s。前三帧各10个字码;每三十秒重复一次,每小时更新一次。后两帧共15000b。导航电文中的内容主要有遥测码、转换码、第1、2、3数据块,其中最重要的则为星历数据。当用户接受到导航电文时,提取出卫星时间并将其与自己的时钟做对比便可得知卫星与用户的距离,再利用导航电文中的卫星星历数据推算出卫星发射电文时所处位置,用户在WGS-84大地坐标系中的位置速度等信息便可得知。
可见GPS导航系统卫星部分的作用就是不断地发射导航电文。然而,由于用户接受机使用的时钟与卫星星载时钟不可能总是同步,所以除了用户的三维坐标x、y、z外,还要引进一个Δt即卫星与接收机之间的时间差作为未知数,然后用4个方程将这4个未知数解出来。所以如果想知道接收机所处的位置,至少要能接收到4个卫星的信号。
GPS接收机可接收到可用于授时的准确至纳秒级的时间信息;用于预报未来几个月内卫星所处概略位置的预报星历;用于计算定位时所需卫星坐标的广播星历,精度为几米至几十米(各个卫星不同,随时变化);以及GPS系统信息,如卫星状况等。
GPS接收机对码的量测就可得到卫星到接收机的距离,由于含有接收机卫星钟的误差及大气传播误差,故称为伪距。对 CA码测得的伪距称为CA码伪距,精度约为20米左右,对P码测得的伪距称为P码伪距,精度约为2米左右。
GPS接收机对收到的卫星信号,进行解码或采用其它技术,将调制在载波上的信息去掉后,就可以恢复载波。严格而言,载波相位应被称为载波拍频相位,它是收到的受多普勒频 移影响的卫星信号载波相位与接收机本机振荡产生信号相位之差。一般在接收机钟确定的历元时刻量测,保持对卫星信号的跟踪,就可记录下相位的变化值,但开始观测时的接收机和卫星振荡器的相位初值是不知道的,起始历元的相位整数也是不知道的,即整周模糊度,只能在数据处理中作为参数解算。相位观测值的精度高至毫米,但前提是解出整周模糊度,因此只有在相对定位、并有一段连续观测值时才能使用相位观测值,而要达到优于米级的定位 精度也只能采用相位观测值。
按定位方式,GPS定位分为单点定位和相对定位(差分定位)。单点定位就是根据一台接收机的观测数据来确定接收机位置的方式,它只能采用伪距观测量,可用于车船等的概略导航定位。相对定位(差分定位)是根据两台以上接收机的观测数据来确定观测点之间的相对位置的方法,它既可采用伪距观测量也可采用相位观测量,大地测量或工程测量均应采用相位观测值进行相对定位。
在GPS观测量中包含了卫星和接收机的钟差、大气传播延迟、多路径效应等误差,在定位计算时还要受到卫星广播星历误差的影响,在进行相对定位时大部分公共误差被抵消或削弱,因此定位精度将大大提高,双频接收机可以根据两个频率的观测量抵消大气中电离层误差的主要部分,在精度要求高,接收机间距离较远时(大气有明显差别),应选用双频接收机。
GPS定位的基本原理是根据高速运动的卫星瞬间位置作为已知的起算数据,采用空间距离后方交会的方法,确定待测点的位置。如图所示,假设t时刻在地面待测点上安置GPS接收机,可以测定GPS信号到达接收机的时间△t,再加上接收机所接收到的卫星星历等其它数据可以确定以下四个方程式。
定位精度
28颗卫星(其中4颗备用)早已升空,分布在6条交点互隔60度的轨道面上,距离地面约20000千米。已经实现单机导航精度约为10米,综合定位的话,精度可达厘米级和毫米级。但民用领域开放的精度约为10米。
GPS 设置
GPS 拿到手,如果是新机器要定位,已经提到了。另外,还有一些设置,常用的有坐标系、地图基准、参考方位、公制/英制、数据接口格式什么的。
坐标系:常用的是 LAT/LON 和 UTM。LAT/LON 就是经纬度表示,UTM 在这里就不管他了。
地图基准:一般用 WGS84。
参考方位:实际上有两个北,磁北和真北呀(简称 CB 和 ZBY)。指南针指的北就是磁北,北斗星指的北就是真北。两者在不同地区相差的角度不一样的,地图上的北是真北。
公制/英制:自选。
数据接口格式:这得细谈谈。GPS 可以输出实时定位数据让其他的设备使用,这就牵扯到了数据交换协议。几乎所有的 GPS 接收机都遵循美国国家海洋电子协会(National Marine Electronics Association)所指定的标准规格,这一标准制订所有航海电子仪器间的通讯标准,其中包含传输资料的格式以及传输资料的通讯协议。NMEA 协议有 0180、0182 和 0183 三种,0183 可以认为是前两种的超集,现在正广泛的使用。
经纬度的表示
再讲讲数据表示。一般从 GPS 得到的数据是经纬度。经纬度有多种表示方法。
1.)ddd.ddddd, 度.度的十进制小数部分(5 位)
2.)ddd.mm.mmm,度.分.分的十进制小数部分(3 位)
3.) ddd.mm.ss, 度.分.秒
不是所有的 GPS 都有这几种显示, GPS315 只能选择第二种和第三种。
在 LAT/LON 坐标系里,纬度是平均分配的,从南极到北极一共 180 个纬度。地球直径 12756KM,周长就是12756*PI,一个纬度是 12756×PI /360 = 111.133 KM (不精确)。
经度就不是这样,只有在纬度为零的时候,就是在赤道上,一个经度之间的距离是 111.319KM,经线随着纬度的增加,距离越来越近,最后交汇于南北极。所以经度的单位距离和确定经度所在的纬度是密切相关的,简单的公式是:
经度 1°长度=111.413cosφ,在纬度φ处。 (公式不精确)
3.3. GPS组成部分
空间部分
GPS的空间部分是由24颗卫星组成(21颗工作卫星;3颗备用卫星),它位于距地表20200km的上空,运行周期为12h。卫星均匀分布在6个轨道面上(每个轨道面4颗),轨道倾角为55°。卫星的分布使得在全球任何地方、任何时间都可观测到4 颗以上的卫星,并能在卫星中预存导航信息,GPS的卫星因为大气摩擦等问题,随着时间的推移,导航精度会逐渐降低。
地面控制系统
地面控制系统由监测站(Monitor Station)、主控制站(Master Monitor Station)、地面天线(Ground Antenna)所组成,主控制站位于美国科罗拉多州春田市(Colorado. Springfield)。地面控制站负责收集由卫星传回之讯息,并计算卫星星历、相对距离,大气校正等数据。
用户设备部分
用户设备部分即GPS信号接收机。其主要功能是能够捕获到按一定卫星截止角所选择的待测卫星,并跟踪这些卫星的运行。当接收机捕获到跟踪的卫星信号后,就可测量出接收天线至卫星的伪距离和距离的变化率,解调出卫星轨道参数等数据。根据这些数据,接收机中的微处理计算机就可按定位解算方法进行定位计算,计算出用户所在地理位置的经纬度、高度、速度、时间等信息。接收机硬件和机内软件以及GPS 数据的后处理软件包构成完整的GPS 用户设备。GPS接收机的结构分为天线单元和接收单元两部分。接收机一般采用机内和机外两种直流电源。设置机内电源的目的在于更换外电源时不中断连续观测。在用机外电源时机内电池自动充电。关机后机内电池为RAM存储器供电,以防止数据丢失。各种类型的接受机体积越来越小,重量越来越轻,便于野外观测使用。其次则为使用者接收器,现有单频与双频两种,但由于价格因素,一般使用者所购买的多为单频接收器。
3.4. 主要模块
GPS模块系统采用第三代高线式GPS模块接受SiRF StarⅢGPS模块SiRF灵活性。该芯片是小于10米的定位精度,能够同时追踪20个卫星信道。其内部的可充电电池,可以保持星历数据,快速定位。对于数据的输出电平的串行数据格式,通信速度。
波特率4800,每名GPS数据输出。该模块采用MMCX GPS天线接口,为6线连接器,数据线接口电缆输出,使用简单,一般情况下只需要使用三个输出线,第一连接3.5 ~ 5.5V的直流供电,第五脚是电源,脚的第二行是GPS测量输出的是TTL电平信号,串行端口,高大于2.4V,低小于400mV,输出驱动器的启动,直接与单片机的接口。如果只使用默认设置,单片机读取数据只能从模块可以。
3.5. GPS特点
全球全天候定位
GPS卫星的数目较多,且分布均匀,保证了地球上任何地方任何时间至少可以同时观测到4颗GPS卫星,确保实现全球全天候连续的导航定位服务(除打雷闪电不宜观测外)。
定位精度高
应用实践已经证明,GPS相对定位精度在50km以内可达10-6m,100-500km可达10-7m,1000km可达10-9m。在300-1500m工程精密定位中,1小时以上观测时解其平面位置误差小于1mm,与ME-5000电磁波测距仪测定的边长比较,其边长较差最大为0.5mm,校差中误差为0.3mm。
实时单点定位(用于导航):P码1~2m ;C/A码5~10m。
静态相对定位:50km之内误差为几mm+(1~2ppm*D);50km以上可达0.1~0.01ppm。
实时伪距差分(RTD):精度达分米级。
实时相位差分(RTK):精度达1~2cm。
观测时间短
随着GPS系统的不断完善,软件的不断更新,20km以内相对静态定位,仅需15-20分钟;快速静态相对定位测量时,当每个流动站与基准站相距在15KM以内时,流动站观测时间只需1-2分钟;采取实时动态定位模式时,每站观测仅需几秒钟。
测站间无需通视
GPS测量只要求测站上空开阔,不要求测站之间互相通视,因而不再需要建造觇标。这一优点既可大大减少测量工作的经费和时间(一般造标费用约占总经费的30%~50%),同时也使选点工作变得非常灵活,也可省去经典测量中的传算点、过渡点的测量工作。
仪器操作简便
随着GPS接收机的不断改进,GPS测量的自动化程度越来越高,有的已趋于“傻瓜化”。在观测中测量员只需安置仪器,连接电缆线,量取天线高,监视仪器的工作状态,而其它观测工作,如卫星的捕获,跟踪观测和记录等均由仪器自动完成。结束测量时,仅需关闭电源,收好接收机,便完成了野外数据采集任务。
如果在一个测站上需作长时间的连续观测,还可以通过数据通讯方式,将所采集的数据传送到数据处理中心,实现全自动化的数据采集与处理。另外,接收机体积也越来越小,相应的重量也越来越轻,极大地减轻了测量工作者的劳动强度。
可提供全球统一的三维地心坐标
GPS测量可同时精确测定测站平面位置和大地高程。GPS水准可满足四等水准测量的精度,另外,GPS定位是在全球统一的WGS-84坐标系统中计算的,因此全球不同地点的测量成果是相互关联的。
3.6. 市场发展
中国GPS导航的市场潜力巨大。截至到2005年底,中国拥有车载导航设备的车辆不足10万辆,相对于3000万辆的汽车总数来说,普及率不到1%。而日本的汽车车载导航安装率高达59%,欧美约占25%。2006年便携导航市场应该有近5亿元的规模,而随着市场的高速发展及新品牌的层出不穷,预计2009年中国汽车GPS导航系统终端的销售额将接近100亿元。
2008年,被人们称为中国的“3G元年”。众所周知,在国内通信领域,最火的就是正在试运行的TD-SCDMA——3G标准。作为新一代的通信技术,3G带给人们非常多的期许。3G牌照的全面发放,也成了人们共同关注的焦点。其实在国内的GPS导航领域也在经历着一场蜕变,第三代PND类导航产品的应运而生,已经把人们带进了全新的导航时代。
卫星导航应用产业在国民经济中发挥着越来越重要的作用,将成为十一五”发展的亮点。在“十一五”期间,卫星导航在其它领域如航空、海路、铁路、建筑、电信、电力等方面的应用都会有很大的发展空间。
卫星导航技术的发展趋势主要表现在三方面:一是卫星导航的多系统并存,使系统可用性得以提高,应用领域将更广阔;二是多元组合导航技术正在得到推广应用,主要有GPS与移动通信基站定位、陀螺、航位推算技术等的组合应用;三是卫星导航与无线通信等其它高技术相结合,如GPS接收机嵌入到蜂窝电话、便携式PC、PDA和手表等通信、安全和消费类电子产品中,从根本上促进了IT技术的整体发展。
3.7. 四大导航
美国全球定位系统(GPS)。由24颗卫星组成,分布在6条交点互隔60度的轨道面上,精度约为10米,军民两用,正在试验第二代卫星系统;
俄罗斯“格洛纳斯”系统。由24颗卫星组成,精度在10米左右,军民两用,设计2009年底服务范围拓展到全球;
欧洲“伽利略”系统。由30颗卫星组成,定位误差不超过1米,主要为民用。2005年首颗试验卫星已成功发射。预计2008年前开通定位服务;
中国“北斗”系统。由5颗静止轨道卫星和30颗非静止轨道卫星组成。“北斗一号”精确度在10米之内,而“北斗二号”可以精确到“厘米”之内。计划2008年左右覆盖中国及周边地区,然后逐步扩展为全球卫星导航系统。2012年10月25日23时33分,我国在西昌卫星发射中心用“长征三号丙”火箭,成功将第16颗北斗导航卫星送入预定轨道。这是我国二代北斗导航工程的最后一颗卫星,这是长征系列运载火箭的第170次发射。至此,我国北斗导航工程区域组网顺利完成。
全球定位系统(Global Positioning System)是美国第二代卫星导航系统。是在子午仪卫星导航系统的基础上发展起来的,它采纳了子午仪系统的成功经验。和子午仪系统一样,全球定位系统由空间部分、地面监控部分和用户接收机三大部分组成。全球定位系统的空间部分使用24颗高度约2.02万千米的卫星组成卫星星座。21+3颗卫星均为近圆形轨道,运行周期约为11小时58分,分布在六个轨道面上(每轨道面四颗),轨道倾角为55度。卫星的分布使得在全球的任何地方,任何时间都可观测到四颗以上的卫星,并能保持良好定位解算精度的几何图形(DOP)。这就提供了在时间上连续的全球导航能力。
地面监控部分包括四个监控站、一个上行注入站和一个主控站。监控站设有GPS用户接收机、原子钟、收集当地气象数据的传感器和进行数据初步处理的计算机。监控站的主要任务是取得卫星观测数据并将这些数据传送至主控站。主控站设在范登堡空军基地。它对地面监控部实行全面控制。主控站主要任务是收集各监控站对GPS卫星的全部观测数据,利用这些数据计算每颗GPS卫星的轨道和卫星钟改正值。上行注入站也设在范登堡空军基地。它的任务主要是在每颗卫星运行至上空时把这类导航数据及主控站的指令注入到卫星。这种注入对每颗GPS卫星每天进行一次,并在卫星离开注入站作用范围之前进行最后的注入。
3.8. 定位系统
定义
GPS定位系统是指利用卫星,在全球范围内实时进行定位、导航的系统,简称GPS(Global Positioning System)。GPS定位系统功能必须具备GPS终端、传输网络和监控平台三个要素;这三个要素缺一不可;通过这三个要素,可以提供车辆防盗、反劫、行驶路线监控及呼叫指挥等功能。
构成
- 空间部分
GPS定位系统的空间部分是由24颗GPS工作卫星所组成,这些GPS工作卫星共同组成了GPS卫星星座,其中21颗为可用于导航的卫星,3颗为活动的备用卫星。这24颗卫星分布在6个倾角为55°的轨道上绕地球运行。卫星的运行周期约为12恒星时。每颗GPS工作卫星都发出用于导航定位的信号。GPS用户正是利用这些信号来进行工作的。可见,GPS定位系统卫星部分的作用就是不断地发射导航电文。
- 控制部分
GPS定位系统的控制部分由分布在全球的由若干个跟踪站所组成的监控系统所构成,根据其作用的不同,这些跟踪站又被分为主控站、监控站和注入站。主控站的作用是根据各监控站对GPS的观测数据,计算出卫星的星历和卫星钟的改正参数等,并将这些数据通过注入站注入到卫星中去;同时,它还对卫星进行控制,向卫星发布指令,当工作卫星出现故障时,调度备用卫星,替代失效的工作卫星工作;另外,主控站也具有监控站的功能。注入站的作用是将主控站计算出的卫星星历和卫星钟的改正数等注入到卫星中去。
- 用户部分
GPS定位系统的用户部分由GPS接收机、数据处理软件及相应的用户设备如计算机气象仪器等所组成。它的作用是接收GPS卫星所发出的信号,利用这些信号进行导航定位等工作。
以上这三个部分共同组成了一个完整的GPS定位系统。
4.总结
在该模块中接触了GPS的各项参数的设置以及信息的传递,还有UBX协议的实现方法,对GPS模块的工作原理有了初步的了解。但是UBX协议里定义了大量看不懂的宏和结构体,基本都是单词的缩写组成,对阅读产生障碍,勉强算是看完了。
补充
UBX大概就是用串口来控制模块的一种协议,对模块进行软硬件及功能方面的控制,如启动模式的选择,刷新速率,波特率,定位精度,天线检测等等,均可以通过UBX代码来对模块进行控制。
波特率是单片机或计算机在串口通信时的速率,指的是信号被调制以后在单位时间内的变化,即单位时间内载波参数变化的次数。