1. 简介
过去,提起高精度厘米级RTK定位,人们的第一印象是专业领域和高昂的价格,行业内用户可能会想到全站仪,测绘仪,手持高精度设备等等,且专业领域才会使用。但是,如今随着技术的发展和更新,RTK高精度定位技术被越来越多的人熟知和应用到各种场景中,传统的GPS和GNSS定位精度已经不能满足于现有的一些应用场景,基于此,DFRobot推出了一款入门级的RTK定位套件,其采用移远的LC29HDA移动站模块和LC29HBS基站模块,结合LoRa无线传输,可实现半径1.5KM,空旷地带的高精度厘米级定位。
基站移动站都是L1/L5双频模块,支持同时接收GNSS,GPS,GLONASS,Galileo,BDS和QZSS卫星,同时跟踪GPS L1 C/A,GLONASS L1,Galileo E1,BDS B1I,QZSS L1 C/A,GPS L5,GalileoE5a,BDS B2a and QZSS L5频带。移动站上电可快速获取经纬度、时间、高度等信息;基站上电可快速收敛,提供校准数据。基站通过LoRa无线传输RTCM数据,移动站接受RTCM数据后,经过差分运算后,在空旷地段可快速实现厘米级定位。
不同于市面上常见高精度定位模块,入手后还需要去搭建数据链,仅仅数据链的搭建可能就会劝退大部分新手玩家,该款套件已经配置好完整的数据链。作为开箱即用的套件,您可用该套件用于RTK高精度定位入门学习,空旷地带设备跟踪,轨迹绘制,人员定位等等。
注:由于GNSS天线和Lora天线的特性,使用时,需处于空旷地带,且Lora天线的高度尽量大于2m,否则会影响定位精度和定位的范围!!!
2.外观接口介绍
2.1 移动站

| 名称 | 介绍 |
|---|---|
| RTK | RTK状态指示灯,RTK Float(浮点解,对应值为5),1s闪烁一次;RTK Fixed(固定解,对应值为4),常亮;其余定位状态,灭 |
| PWR | 电源指示灯 |
| UART I2C | 移动站通讯接口UART/I2C输出切换开关 |
| Gravity I2C&UART | 移动站数据输出Gravity接口 |
2.2 基站

| 名称 | 介绍 |
|---|---|
| Type-C | Type-C供电接口 |
| PWR | 电源指示灯 |
| PWR IN | 外部接线端子供电接口(5~10V) |
3. 定位基础知识
3.1 常见的定位系统
GPS
利用GPS进行定位的基本原理就是四颗卫星定位地面一个标的物的三维坐标。
由于信号传输过程中会经过电离层、对流层,导致信号的传播路径并非遵循两点之间直线最近的原则,因此又会产生对流层和电离层误差。这就导致仅仅利用GPS的四颗定位卫星无法准确的获得标的物的位置信息(误差通常在10米这个量级)。
GNSS
全球导航卫星系统(英文:Global Navigation Satellite System ,缩写:GNSS ,又称全球卫星导航系统),是能在地球表面或近地空间的任何地点为用户提供全天候的3维坐标和速度以及时间信息的空基无线电导航定位系统
BDS(中国)
北斗卫星导航系统(英文名称:BeiDou Navigation Satellite System,简称BDS),是中国自行研制的全球卫星导航系统 北斗卫星导航系统由空间段、地面段和用户段三部分组成,可在全球范围内全天候、全天时为各类用户提供高精度、高可靠定位、导航、授时服务,并且具备短报文通信能力,已经初步具备区域导航、定位和授时能力,定位精度为分米、厘米级别,测速精度0.2米/秒,授时精度10纳秒。
GPS(美国)
全球定位系统(Global Positioning System,GPS),是一种以人造地球卫星为基础的高精度无线电导航的定位系统,它在全球任何地方以及近地空间都能够提供准确的地理位置、车行速度及精确的时间信息。
GLONASS (俄罗斯)
格洛纳斯(GLONASS),是俄语“全球卫星导航系统GLOBAL NAVIGATION SATELLITE SYSTEM”的缩写 ,格洛纳斯卫星导航系统作用类似于美国的GPS、欧洲的伽利略卫星定位系统和中国的北斗卫星导航系统。
Galileo(欧盟)
伽利略卫星导航系统(Galileo satellite navigation system),是由欧盟研制和建立的全球卫星导航定位系统
QZSS(日本)
准天顶卫星系统(日语:准天顶卫星システム,英文:Quasi-Zenith Satellite System;缩写:QZSS)是以三颗人造卫星透过时间转移完成全球定位系统区域性功能的卫星扩增系统 。其发射信号与 GPS L1 C/A、L1C、L2C 和 L5 信号兼容,覆盖包括日本和澳洲在内的太平洋地区。模块可同时接收和跟踪 QZSS 与 GPS L1 C/A 和 L5 信号,因而具有更强 的可用性,特别是在诸如城市峡谷等弱信号环境下
RTK
RTK定位技术是一种基于高精度载波相位观测值的实时动态差分定位技术(Real Time Kinematic,RTK ),基准站首先将自己获得的载波相位观测值及站点坐标,通过数据通信链实时发送给周围工作的动态用户。流动站数据处理模块使用动态差分定位的方法确定流动站相对基准站的坐标,然后根据基准站的坐标反算自身的瞬时坐标。
RTK的英文全称是(Real Time Kinematic,RTK)是实时动态载波相位差分技术的简称,是一种通过基准站和流动站的同步观测,利用载波相位观测值实现快速高精度定位功能的差分测量技术。
3.2 RTK数据传输示意图

3.3 RTK技术定位常见应用场景
- 测绘工程:地形图、工程放样、管线探测
- 精准农业:自动播种、施肥、收割
- 自动驾驶:无人车、低速配送
3.4 定位数据解析
模块支持的标准NMEA 0183数据包含RMC、GGA、GSV、GSA、VTG、GLL、ZDA、GRS、GST
$后跟随的字符代表国家或地区或GNSS系统,比如GPGGA代表美国GPS ,GD/BDGGA代表中国北斗 ,GLGGA代表俄罗斯GLONASS ,GAGGA代表欧盟Galileo,GNGGA代表多星联合定位。
此处以GGA数据为例分析,更多数据分析 参考NMEA 0183数据解析 2.2. Standard Messages部分
以下是一组GGA数据解析
$GNGGA,063924.000,3037.643956,N,10348.010829,E,5,34,0.46,507.909,M,-32.181,M,1.0,3335*76
| 字段序号 | 字段名称 | 说明 | 示例值 |
|---|---|---|---|
| 0 | 标识符 | 每个NMEA数据的起始符) | $ |
| 1 | 区域或系统 | 固定为 $GP(GPS)或 $GL(GLONASS)或$GN(GNSS)等 |
$GNGGA |
| 2 | 语句标识符 | 全球定位系统修正数据 | GGA |
| 1 | UTC 时间 | 定位UTC时间 (hhmmss.sss格式) | 063924.000 |
| 2 | 纬度 | 纬度值 (ddmm.mmmmmm格式) | 3037.643956 |
| 3 | 纬度半球 | N=北纬, S=南纬 | N |
| 4 | 经度 | 经度值 (dddmm.mmmmmm格式) | 10348.010829 |
| 5 | 经度半球 | E=东经, W=西经 | E |
| 6 | 定位状态 | 0=无效1=GPS定位2=差分定位4=RTK固定解5=RTK浮点解6=估算值 |
5 |
| 7 | 使用卫星数 | 参与解算的卫星数量 | 34 |
| 8 | HDOP | 水平精度因子 (值越小精度越高) • <1:极好 • 0-2:很好 • 2-5:好 • 5-10:中等 • >10:较差 |
0.46 |
| 9 | 海拔高度 | 天线海拔高度 (米,相对于平均海平面MSL) | 507.909 |
| 10 | 高度单位 | 固定为 M (米) |
M |
| 11 | 大地水准面高度 | 大地水准面与WGS84椭球面的高度差 (米) • 正值:大地水准面高于椭球面 • 负值:大地水准面低于椭球面 |
-32.181 |
| 12 | 高度差单位 | 固定为 M (米) |
M |
| 13 | 差分数据龄期 | 仅RTK固定解或浮点解有效 | 1 |
| 14 | 差分参考站ID | 仅RTK固定解或浮点解有效 | 3335 |
| 15 | 校验和 | *后的十六进制校验值 |
*76 |
4. 产品特点
- Lora传输数据
- 使用简单易上手
- 使用成本低
- 空旷地带厘米级定位精度
- 可单基站对应多移动站
5. 产品性能参数
5.1基站
- 供电方式
- type-c
- 接线柱: 5~10V
- GNSS天线接口:SMA
- 接收频段
- GPS/QZSS:L1 C/A,L5
- GLONASS:L1
- Galileo:E1,E5a
- BDS:B1l,B2a
- 默认星系:GPS+GLONASS+Galileo+BDS+QZSS
- 并发接收星系数量:4+QGNSS
- 功能:基站
- 灵敏度
- 捕获:-147dBm
- 跟踪:-165dBm
- 重捕获:-159dBm
- 动态性能
- 最高海拔:10000m
- 最大速率:500m/s
- 最大加速度:4g
- 原始数据更新频率:1Hz
- 协议:NMEA 0183/RTCM 3.x
- 尺寸:92×58×31mm
5.2 移动站
- 工作电压:3.3V~5V
- 输出信号:I2C/UART
- 天线接口:SMA
- 接收频段
- GPS/QZSS:L1 C/A,L5
- GLONASS:L1
- Galileo:E1,E5a
- BDS:B1l,B2a
- 默认星系:GPS+GLONASS+Galileo+BDS+QZSS
- 并发接收星系数量:4+QGNSS
- SBAS:WAAS、EGNOS、MSAS、GAGAN
- 功能:RTK
- 水平定位精度
- 自主定位:1m
- RTK:5cm+1ppm
- 速度精度:0.03m/s
- 1pps精度:20ns
- RTK收敛时间:RTK<10s
- 灵敏度
- 捕获:-145dBm
- 跟踪:-165dBm
- 重捕获:-157dBm
- 动态性能
- 最高海拔:10000m
- 最大速率:500m/s
- 最大加速度:4g
- 导航更新频率:RTK:1Hz
- 原始数据更新频率:GNSS:1Hz
- 协议:NMEA 0183/RTCM 3.x
- 尺寸:92×58×31mm
5.3 Lora模块参数
- 射频芯片:LLCC68
- 工作频率:433MHz
- 调制方式:Lora扩频
- 最大发射功率:22dBm
- 接收灵敏度:-129dBm
6 使用教程
6.1 Arduino IDE使用教程
6.1.1硬件准备
-
GNSS-RTK高精度定位套件 x1
6.1.2 软件准备
6.1.3 API接口
/**
* @fn getUTC
* @brief Get UTC, standard time
* @return sTim_t type, represents the returned hour, minute and second
* @retval sTim_t.hour hour
* @retval sTim_t.minute minute
* @retval sTim_t.second second
*/
sTim_t getUTC(void);
/**
* @fn getDate
* @brief Get date information, year, month, day
* @return sTim_t type, represents the returned year, month, day
* @retval sTim_t.year year
* @retval sTim_t.month month
* @retval sTim_t.day day
*/
sTim_t getDate(void);
/**
* @fn getLat
* @brief Get latitude
* @return sLonLat_t type, represents the returned latitude
* @retval sLonLat_t.latDD Latitude degree(0-90)
* @retval sLonLat_t.latMM The first and second digits behind the decimal point
* @retval sLonLat_t.latMMMMM Latitude The third and seventh digits behind the decimal point
* @retval sLonLat_t.latitude Latitude value with 7 decimal digits
* @retval sLonLat_t.latDirection Direction of latitude
*/
sLonLat_t getLat(void);
/**
* @fn getLon
* @brief Get longitude
* @return sLonLat_t Type, represents the returned longitude
* @retval sLonLat_t.lonDDD Longitude degree(0-90)
* @retval sLonLat_t.lonMM Longitude The first and second digits behind the decimal point
* @retval sLonLat_t.lonMMMMM Longitude The third and seventh digits behind the decimal point
* @retval sLonLat_t.lonitude Longitude value with 7 decimal digits
* @retval sLonLat_t.lonDirection Direction of longitude
*/
sLonLat_t getLon(void);
/**
* @fn getNumSatUsed
* @brief Get the number of the used satellite used
* @return uint8_t type, represents the number of the used satellite
*/
uint8_t getNumSatUsed(void);
/**
* @fn getAlt
* @brief Altitude information
* @return double type, represents altitude
*/
double getAlt(void);
/**
* @fn getSep
* @brief At the height of geoid
* @return double
*/
double getSep(void);
/**
* @fn getHdop
* @brief Indicates the horizontal accuracy of positioning
* @return double
*/
double getHdop(void);
/**
* @fn getQuality
* @brief message Quality
* @return uint8_t
*/
uint8_t getQuality(void);
/**
* @fn getSiteID
* @brief The site id of differential gps data, commonly used for differential gps positioning
* @return uint16_t
*/
uint16_t getSiteID(void);
/**
* @fn getDifTime
* @brief The number of seconds in which a differential signal was last received
* @return double
*/
double getDifTime(void);
/**
* @fn setModule
* @brief Set the Module
* @param mode 4G or lora
*/
void setModule(eModuleMode_t mode);
/**
* @fn getModule
* @brief Get the Module run mode
* @return eModuleMode_t
*/
eModuleMode_t getModule(void);
/**
* @fn transmitAT
* @brief Interface for transparent transmission of gnss commands
* @return char * return commands
*/
char * transmitAT(const char* cmd);
/**
* @fn getGnssMessage
* @brief Get different types of gps data
* @param mode eGnssData_t type
* @return char*
*/
char * getGnssMessage(eGnssData_t mode);
/**
* @fn getAllGnss
* @brief Get GNSS data, call back and receive
* @return null
*/
void getAllGnss(void);
/**
* @fn setModuleBaud
* @brief Set the Module Baud rate
* @param baud eModuleBaud_t
*/
void setModuleBaud(eModuleBaud_t baud);
/**
* @fn setLoraBaud
* @brief Set the recevie Lora Baud rate
* @param baud eModuleBaud_t
*/
void setLoraBaud(eModuleBaud_t baud);
/**
* @fn getModuleBaud
* @brief Get the Module Baud rate
* @return uint32_t Baud rate of serial communication
*/
uint32_t getModuleBaud(void);
/**
* @fn getLoraBaud
* @brief Get the Lora Baud rate
* @return uint32_t Baud rate of serial communication
*/
uint32_t getLoraBaud(void);
/**
* @fn setCallback
* @brief Set callback function type
* @param call function name
* @return null
*/
void setCallback(void (*call)(char *, uint8_t));
6.1.4 使用I2C读取数据NMEA数据
移动站接线图

- 将产品取出,按照上图方式移动站与Arduino按照上方的连线图相连
- 将移动站上的选择开关,拨到I2C一侧。
- 下载并安装RTK库如何安装库?
- 打开Arduino IDE,将下面的代码上传到Arduino UNO。
- 将基站和移动站都置于室外空旷地带,基站上电后保持天线位置不移动
- 打开Arduino IDE的串口监控视器,把波特率调至115200,观察串口打印结果。
/*!
* @file getAllGNSS.ino
* @brief read all gnss data
* @copyright Copyright (c) 2010 DFRobot Co.Ltd (http://www.dfrobot.com)
* @license The MIT License (MIT)
* @author ZhixinLiu(zhixin.liu@dfrobot.com)
* @version V0.5.0
* @date 2024-04-23
* @url https://github.com/DFRobot/DFRobot_RTK_LoRa
*/
#include "DFRobot_RTK_LoRa.h"
void callback(char *data, uint8_t len)
{
for(uint8_t i = 0; i < len; i++){
Serial.print((char)data[i]);
}
}
#define I2C_COMMUNICATION //use I2C for communication, but use the serial port for communication if the line of codes were masked
#ifdef I2C_COMMUNICATION
DFRobot_RTK_LoRa_I2C rtk(&Wire ,DEVICE_ADDR);
#else
/* -----------------------------------------------------------------------------------------------------
* | Sensor | Connect line | Leonardo/Mega2560/M0 | UNO | ESP8266 | ESP32 | microbit | m0 |
* | VCC |=============>| VCC | VCC | VCC | VCC | X | vcc |
* | GND |=============>| GND | GND | GND | GND | X | gnd |
* | RX |=============>| Serial1 TX1 | 5 | 5/D6 | D2 | X | tx1 |
* | TX |=============>| Serial1 RX1 | 4 | 4/D7 | D3 | X | rx1 |
* ----------------------------------------------------------------------------------------------------*/
/* Baud rate cannot be changed */
#if defined(ARDUINO_AVR_UNO) || defined(ESP8266)
SoftwareSerial mySerial(4, 5);
DFRobot_RTK_LoRa_UART rtk(&mySerial, 57600);
#elif defined(ESP32)
DFRobot_RTK_LoRa_UART rtk(&Serial1, 115200 ,/*rx*/D2 ,/*tx*/D3);
#else
DFRobot_RTK_LoRa_UART rtk(&Serial1, 115200);
#endif
#endif
void setup()
{
Serial.begin(115200);
while(!rtk.begin()){
Serial.println("NO Deivces !");
delay(1000);
}
Serial.println("Device connected !");
rtk.setModule(eMoudleLora);
while(rtk.getModule() != eMoudleLora){
Serial.println("Module type is not lora! please wait!");
delay(1000);
}
rtk.setCallback(callback);
}
void loop()
{
rtk.getAllGnss();
}
更多数据分析 参考NMEA 0183数据解析 2.2. Standard Messages部分
6.1.5 使用UART读取解析后的数据
6.1.5.1 修改波特率
注:如使用UNO,需要使用库文件里面的configparam例程,需先调到I2C模式配置移动站模块波特率修改为57600,使用如MEGA2560、ESP32等UART接口无需修改波特率
移动站接线图

-
将模块与Arduino按照上方的连线图相连
-
将传感器上的选择开关,拨到I2C一侧。
-
下载并安装库文件
-
打开Arduino IDE,将下面的代码上传到Arduino UNO。
-
打开Arduino IDE的串口监控视器,把波特率调至57600,观察串口打印结果。
-
注:配置模式只支持I2C模式,运行该示例需拨到I2C
参数配置样例代码
/*!
* @file configParam.ino
* @brief config moudle param
* @copyright Copyright (c) 2010 DFRobot Co.Ltd (http://www.dfrobot.com)
* @license The MIT License (MIT)
* @author ZhixinLiu(zhixin.liu@dfrobot.com)
* @version V0.5.0
* @date 2024-04-24
* @url https://github.com/DFRobot/DFRobot_RTK_LoRa
*/
#include "DFRobot_RTK_LoRa.h"
// must use iic config parameter
DFRobot_RTK_LoRa_I2C rtk(&Wire ,DEVICE_ADDR);
void setup()
{
Serial.begin(115200);
while(!rtk.begin()){
Serial.println("NO Deivces !");
delay(1000);
}
Serial.println("Device connected !");
/**
* | Support Baud | UNO/ESP8266 | Leonardo/Mega2560 | ESP32 | M0 |
* | eBaud9600 | √ | √ | √ | √ |
* | eBaud14400 | √ | √ | √ | √ |
* | eBaud19200 | √ | √ | √ | √ |
* | eBaud38400 | √ | √ | √ | √ |
* | eBaud56000 | √ | √ | √ | √ |
* | eBaud57600 | √ | √ | √ | √ |
* | eBaud115200 | | √ | √ | √ |
* | eBaud256000 | | | √ | √ |
* | eBaud512000 | | | √ | √ |
* | eBaud921600 | | | √ | √ |
*/
rtk.setModuleBaud(eBaud115200);
Serial.print("module mode = ");
Serial.println(rtk.getModule());
Serial.print("moudle buad = ");
Serial.println(rtk.getModuleBaud());
}
void loop()
{
// Reserved interface, direct communication with gnss firmware, use with the original factory data manual
Serial.println(rtk.transmitAT("$PQTMVERNO*58\r\n"));
delay(2000);
}
打开串口监视器,按下复位按钮查看当前通信波特率

6.1.5.2 UART模式获取经纬度和定位状态
移动站接线图

UART模式样例代码
- 将产品取出,按照上图方式移动站与Arduino按照上方的连线图相连
- 将移动站上的选择开关,拨到UART一侧。
- 下载并安装RTK库如何安装库?
- 打开Arduino IDE,将下面的代码上传到Arduino UNO
- 将基站和移动站都置于室外空旷地带,基站上电后保持天线位置不移动
- 打开Arduino IDE的串口监控视器,把波特率调至115200,观察串口打印结果
/*!
* @file getAllGNSS.ino
* @brief read all gnss data
* @copyright Copyright (c) 2010 DFRobot Co.Ltd (http://www.dfrobot.com)
* @license The MIT License (MIT)
* @author ZhixinLiu(zhixin.liu@dfrobot.com)
* @version V0.5.0
* @date 2024-04-23
* @url https://github.com/DFRobot/DFRobot_RTK_LoRa
*/
#include "DFRobot_RTK_LoRa.h"
void callback(char *data, uint8_t len)
{
for(uint8_t i = 0; i < len; i++){
Serial.print((char)data[i]);
}
}
// #define I2C_COMMUNICATION //use I2C for communication, but use the serial port for communication if the line of codes were masked
#ifdef I2C_COMMUNICATION
DFRobot_RTK_LoRa_I2C rtk(&Wire ,DEVICE_ADDR);
#else
/* -----------------------------------------------------------------------------------------------------
* | Sensor | Connect line | Leonardo/Mega2560/M0 | UNO | ESP8266 | ESP32 | microbit | m0 |
* | VCC |=============>| VCC | VCC | VCC | VCC | X | vcc |
* | GND |=============>| GND | GND | GND | GND | X | gnd |
* | RX |=============>| Serial1 TX1 | 5 | 5/D6 | D2 | X | tx1 |
* | TX |=============>| Serial1 RX1 | 4 | 4/D7 | D3 | X | rx1 |
* ----------------------------------------------------------------------------------------------------*/
/* Baud rate cannot be changed */
#if defined(ARDUINO_AVR_UNO) || defined(ESP8266)
SoftwareSerial mySerial(4, 5);
DFRobot_RTK_LoRa_UART rtk(&mySerial, 57600);
#elif defined(ESP32)
DFRobot_RTK_LoRa_UART rtk(&Serial1, 115200 ,/*rx*/D2 ,/*tx*/D3);
#else
DFRobot_RTK_LoRa_UART rtk(&Serial1, 115200);
#endif
#endif
void setup()
{
Serial.begin(115200);
while(!rtk.begin()){
Serial.println("NO Deivces !");
delay(1000);
}
Serial.println("Device connected !");
rtk.setModule(eMoudleLora);
while(rtk.getModule() != eMoudleLora){
Serial.println("Module type is not lora! please wait!");
delay(1000);
}
rtk.setCallback(callback);
}
void loop()
{
rtk.getAllGnss();
}
结果和解析

| 数据 | 含义 | 备注 |
|---|---|---|
| N | 北纬 | 纬度半球 |
| E | 东经 | 经度半球 |
| lat degree | 纬度 | |
| lon degree | 经度 | |
| star | 移动站搜索到的卫星数量 | 包含GNSS,GPS,GLONASS,Galileo,BDS |
| alt high | 海拔高度 | GNSS天线相当于海平面 |
| sep | 大地水准面与WGS84椭球面的高度差 (米) | 正值:大地水准面高于椭球面;负值:大地水准面低于椭球面 |
| hdop | 水平精度因子 | 值越小精度越高 |
| message mode | 定位状态 | 1=GPS定位;2=差分定位;4=RTK固定解;5=RTK浮点解 |
| siteID | 差分参考站ID | 仅RTK固定解或浮点解有效 |
| diftime | 数据差分龄期 | 仅RTK固定解或浮点解有效 |
| $GNGGA | NMEA数据 | 请参考 NMEA 0183数据解析部分 |
| $GNRMC | NMEA数据 | 请参考 NMEA 0183数据解析部分 |
| $GNGLL | NMEA数据 | 请参考 NMEA 0183数据解析部分 |
| $GNVTG | NMEA数据 | 请参考 NMEA 0183数据解析部分 |
6.2 树莓派4B使用教程
6.2.1 硬件准备
- 树莓派4B主控板
- DFR0566 树莓派4B/3B+ IO扩展板
- RTK高精度定位套件
6.2.2 软件准备
6.2.3 I2C使用教程
移动站接线图

使用前,请先确认I2C速率为400k,配置如下

**下载库文件并运行,默认为I2C模式
将硬件拨码开关拨到I2C模式,注意:波动拨码开关时设备时上电状态,请拨码后断电重启设备以生效。
##新建文件获取库文件
cd ~
cd Desktop
mkdir df ##创建文件夹
cd df ##切换到文件夹
git clone https://github.com/DFRobot/DFRobot_RTK_LoRa ##获取库文件
cd DFRobot_RTK_LoRa/python/raspberrypi/examples ##切换到例程文件
sudo python3 get_gnss.py
6.2.4 UART教程
移动站接线图

- 修改为UART模式
##新建文件获取库文件
cd ~
cd Desktop
mkdir df ##创建文件夹
cd df ##切换到文件夹
git clone https://github.com/DFRobot/DFRobot_RTK_LoRa ##获取库文件
cd DFRobot_RTK_LoRa/python/raspberrypi/examples ##切换到例程文件
sudo vi get_gnss.py ##选择要运行的程序修改为UART模式

将硬件拨码开关拨到UART模式,注意:波动拨码开关时设备时上电状态,请拨码后断电重启设备以生效。
sudo python3 get_gnss.py
7 常见问题
Q1:RTK 是什么?和普通 GPS 定位有什么区别?
A: RTK(Real-Time Kinematic,实时动态差分定位)是一种通过差分校正实现厘米级定位精度的技术。普通 GPS 定位精度通常在 2~5 米,而 RTK 通过一个已知坐标的基准站(Base)向移动站(Rover)实时发送差分校正数据,消除大气延迟、轨道误差等因素,将精度提升到厘米级。
Q2:什么是 RTK Fix 和 RTK Float?
A:
RTK Float(浮点解): 差分计算已经开始但载波相位模糊度尚未完全解算,精度通常在 10~50 厘米 之间。
RTK Fix(固定解): 载波相位模糊度完全解算成功,此时精度可达 10厘米内。这是 RTK 的最佳工作状态。
从冷启动到获得 Fix 解通常需要 30~60 秒,具体取决于卫星可见数量和环境条件。
Q3:套件中的移动站支持哪些卫星系统?
A:支持同时接收以下四大卫星系统的双频信号:
GPS/QZSS: L1 C/A, L5
GLONASS: L1
Galileo: E1, E5a
BDS (BeiDou): B1l, B2a
多星座多频段意味着在任何时间和地点都能跟踪到更多卫星,提高定位可靠性和 Fix 率。
Q4:LoRa 433MHz、915MHz 和 868MHz 版本功能一样吗?可以混用吗?
A: 三者硬件功能和定位性能完全一致,唯一区别是 LoRa 模块的工作频段不同。不可以混用——基站和移动站必须使用相同频段才能正常通信。客户需根据所在国家/地区的 ISM 频段法规选择:
915MHz: 美国、加拿大、澳大利亚、巴西等
868MHz: 欧盟、英国、印度、俄罗斯等
433MHz:中国、部分亚洲及南美国家
Q5:LoRa 版的基站和移动站之间最远能通信多少距离?
A:当前使用的Lora天线在开阔无遮挡的环境下,通信距离可达 1.5Km左右。
如想测试更远的距离,应从以下方面进行考虑
- 天线高度和增益
- 周围建筑物/树木/地形遮挡
- LoRa 扩频因子和带宽设置
- 当地电磁环境干扰
需要注意:基站与移动站距离越远,RTK 定位精度也会下降(1ppm 意味着每增加 1km 距离,误差增加 1mm)。通常建议基线长度控制在 10km 以内。
Q6:LoRa 版本的基站需要放在已知坐标点上吗?
A:
取决于使用场景:
相对定位(大多数开发者场景): 基站不需要放在已知精确坐标点上。基站开机后会自行进行 Survey-in(自测量),自动确定自身坐标。此时移动站获得的是相对于基站的高精度位置。
绝对定位(测量测绘场景):如果需要移动站的坐标在全球坐标系下也精确到厘米级,基站需要架设在已知精确坐标的控制点上,或通过长时间 Survey-in(如 24 小时)来提高基站坐标精度。
Q7:一个基站可以同时给多个移动站提供差分数据吗?
A:可以。LoRa 基站以广播模式 发送 RTCM 差分数据,理论上在通信范围内的所有移动站(配置相同频段和通信参数)都可以接收。但需注意 LoRa 带宽有限,建议不要在同一频点上部署过多设备以避免干扰。
Q8:实际使用中真的能达到 5cm 精度吗?
A:在以下条件满足时可以达到:
- 空开阔,可见卫星数量充足(通常 > 20 颗,正常套件天线空旷地带可见卫星数会大于30颗)
- 使用套件配套的高质量多频 GNSS 天线
- 天线正确安装(避免多径干扰,天线接地面良好)
- 差分数据链路稳定(LoRa 或 4G 连接正常)
- 基线长度合理(LoRa 版基站与移动站距离适当)
在以下环境中精度可能下降或无法获得 Fix 解:
- 城市峡谷(高楼密集区)
- 茂密树林下
- 室内或半室内环境
- 天线附近有大面积金属反射面
Q9:RTK 定位的更新频率是多少?
A:支持1Hz的输出频率
Q10:套件精度和专业测绘 RTK(如 Trimble、Leica)相比如何?
A:核心定位芯片的性能指标(实测5cm左右)与专业测绘级RTK接收机(1~2cm)在水平精度上略微低一点,软件功能也有差异。差异主要体现在:
- 专业设备通常配备更高增益的测绘级天线(抗多径能力更强)
- 专业设备有更完善的防水防尘外壳(IP67+)
- 专业设备有内置倾斜补偿、惯性导航等高级功能
- 专业设备有全套后处理软件和技术支持
DFRobot 套件的优势在于 成本低、开源灵活、适合开发集成,适合精度要求高但预算有限的项目。
相关资料
Quectel_L89_R2.0&LC29H&LC79H_AGNSS_Application_Note_V1.0.pdf
Quectel_LC29H_GNSS_Specification_V1.1.pdf