今天新到一个G70 RTK定位模块,它支持多种卫星导航系统,包括中国BDS北斗,美国GPS,俄罗斯GLONASS、欧洲Galileo,日本QZSS卫星定位系统。G70内置RTCM更正,通过本地基站或网络 RTK设置中的虚拟参考站(VRS),可以支持厘米级定位。
本文就带大家一起验证下它的定位效果。
一、概述
1. GNSS定位原理与RTK简介
1.1 GNSS定位原理
GPS 的工作原理是使用绕地球运行的卫星将信号传输到地面上的 GPS 接收器,然后接收器根据信号从卫星传输到接收器所需的时间计算其位置。通过接收来自三个或更多卫星的信号,接收器可以确定其纬度、经度和高度。
1.2 RTK差分定位
RTK(Real-Time Kinematic)差分技术是一种基于卫星的精密定位技术,可提供高精度的实时定位。RTK 通过使用两个 GPS(或 GNSS)接收器、一个位于已知位置的参考接收器和一个四处移动并收集数据的流动站接收器来工作。通过基准站播发的差分矫正报文(RTCM)来实现厘米级高精度定位。为获得厘米级精度的定位结果,通常需要用到 RTK 算法引擎。
在已知精确位置的地点设置基准站接收机,基准站接收机播发差分数据(包含基准站接收机的类型、位置、观测数据),流动站接收机实时接收差分数据和卫星信号,进行 RTK 解算,当流动站接收机消除观测数据中的误差,并且“固定”载波相位观测量的整周数,获得厘米级位置信息时,即实现了 RTK 固定解算。只要流动站准确的进入固定解算状态,并且跟踪的卫星没有失锁,差分数据没有中断,那么流动站就可以持续的提供厘米级的位置信息。但如果流动站最初的固定解算位置有偏差,或者因为环境遮挡等原因导致卫星信号失锁,或者因为数据传输链路导致差分数据中断,那么流动站提供的位置信息可能是分米级或者米级。
1.3 CORS简述
CORS(Continuously Operating Reference Stations,连续运行参考站)是一种基于全球定位系统(GPS)和其他卫星导航系统(如 GLONASS、Galileo 和北斗等)的高精度定位技术。通过在地面上建立一系列固定的参考站点,将这些站点的观测数据实时传输到中心控制站进行处理和分析,从而提供高精度的定位、导航和时间服务。可以将 CORS 定义为一个或若干个固定的、连续运行的 GNSS
参考站或基准站。
G70 支持用户通过移动 CORS 账号或千寻账号使用 CORS 系统,获得 RTK 差分信号以提高模块的定位精度。
千寻CORS是一款高可用、高并发、云端一体的覆盖全国的厘米级高精度定位服务,由阿里巴巴集团和中国兵器工业集团共同打造,依托国家北斗地基增强系统“全国一张网”、定位算法及大规模互联网服务平台,可以实现7✕24小时,为十亿级用户提供水平精度2厘米、高程精度5厘米的实时定位数据。可以实现全国任意覆盖地区使用不受限制。 原理:普通的支持卫星定位的终端,通过接收卫星信号,获得所在地点的粗位置数据(非精准),通过互联网,将这个位置数据(GGA)上传到CORS平台,一同上传的还有Ntrip协议参数。千寻CORS平台获得您的数据后,通过互联网下播您所在大致位置的差分数据。这个时候需用到设备的差分解算功能,结合原始观测值和差分数据,进行解算,实现纠偏。来达到高精度的位置坐标。
1.4 NTRIP 简述
RTK 技术被许多现代 GNSS 接收器采用,支持 RTCM 3.3 协议。RTCM 3.3消息中包含的数据包括基站进行的载波相位和伪距测量。RTCM 3.3 数据从 GNSS基站传输到 GNSS 流动站,使该接收器能够补偿其测量误差,从而提高其定位精度。
NTRIP 是一种用于实时差分定位的协议,通过 TCP/IP 网络获取来自基站的实时差分定位数据(一般是传输 RTCM 数据)传输到 NTRIP 服务器,用户通过互联网连接到这些 NTRIP 服务器,下载实时差分数据,传输给 GPS 接收器以提高其定位精度。
NTRIP 系统由三个主要软件组件组成:caster、server base 和 client rover。
- Ntrip Source 用于生成 GNSS 差分修正数据,并将其发送到 Ntrip Server。
- Ntrip Server 将 GNSS 差分校正数据发送到 Ntrip Caster。
- Ntrip Caster 是一种 HTTP 互联网服务,作为差分修正数据的中心,负责 GNSS差分修正数据的接收和发送,充当在 NTRIP 服务器和 NTRIP 客户端之间传输GRSS 连接数据的通信线路。
用户通过互联网登录 Ntrip Caster 后,Ntrip Client 接收 Ntrip Caster的 GNSS 差分改正数据或 RTK 定位进行实时校正。
2. G70产品参数
3. 串口引脚
G70 模块引出 12 个调试引脚,其中串口 2 为 232 电平输入输出,RXD1/TXD1 为 TTL 电平输出输出。调试引脚线序图如下所示。
二、配置
1. G70 模块初始化
1.1 上位机工具
本文使用u-center对G70和4GDTU进行配置。u-center是瑞士 u-blox 公司开发的一款强大的GNSS评估和可视化工具,为系用户提供了一种快速、简单的方法来连接u‑blox的GNSS模块,对其进行评估、性能测试、开发和调试,并提供一套用于查看、记录和分析性能的功能,可以通过官网免费下载,只能在windows电脑上运行。
常见名词含义:
- Longitude-经度
- Latitude-纬度
- Altitude-海拔高度
- Altitude (msl)-基于平均海平面的海拔高度
- TTFF-首次定位时间
- FixMode-定位模式/定位状态
- 3DAcc-三维定位精度
- 2Dacc-二维定位精度
- PDOP-位置精度因子
- HDOP-水平精度因子
- satellites-卫星状态
1.2 连接
物理连线:
- G70与蘑菇头天线连接
- G70通过TypeC转USB与Win电脑连接
软件连接
- 打开u-center软件,点击左上角通信工具栏中,选择GNSS模块的COM端口(通过插拔可以确认是哪个)
- 然后点击右侧第二个选项,选择GNSS模块的波特率,默认为9600,成功连接后图标会变为绿⾊。
1.3 模块初始化
- 打开MessageViews界面,左侧菜单树形双击展开UBX,依次点击UBX->CFG->CFG,在显示界面中选择Revert to default configuration,在Devices区域全选,点击左下角的【Send】按钮进行初始化。模块初始化后,默认为移动站配置。
- 点击工具栏断开G70连接,并重新连接
1.4 调试
- 打开View->Docking Windows->Data 或 View->Text Control 即可看到定位数据
- NMEA消息显示为标题$Gxyyy,其中x代表卫星系统(P=GPS、SBAS、QZSS、L=伽利略、B=北斗、N=GNSS的任何组合),yyy代表消息类型(如ZDA=时间和日期)。
*注:冷启动初始化时间20s左右,卫星信号有遮挡时也可能无法定位,看不到数据不用着急,可以诶拿到室外看。
模块状态指示灯:
1.5 修改定位频率
G70模块默认定位频率为1,支持定位频率为1-20HZ,但是最好不要超过5HZ,否则会存在丢包情况。
- 修改波特率,打开View->Messages View->UBX->CFG->RATE 页面修改,将Measurement Period 改为 200ms,对应的频率将变为5HZ。设置完成点击【Send】按钮。
- 按照同样的步骤,分别选择界面上第一个Timesource下拉选项的0-4,都分别Send一下。
- 到在Messages->UBX->CFG->CFG页面,选择Save current confiuration,点击Send保存配置。
1.6 修改NMEA语句为高精度输出
- 点击Messages->NMEA->GXGLL,鼠标右键点击 GXGLL,设置【enable message】。
- 打开MessagesView->UBX->CFG->NMEA 页面,勾选【Highprecisionmode】后,点击【Send】发送配置。
- 到在MessagesView->UBX->CFG->CFG页面,选择Save current confiuration,点击Send保存配置。
2. 4G DTU初始化
在PC端联网的前提下,使用u-center上位机接入RTK,需要先申请一个CORS账号。G70作为移动站,连接并接收千寻位置(中国境内使用)或其它参考基站服务商的RTCM3数据,实现高精度厘米级定位。
2.1 购买CORS账号
千寻CORS账号是一款精度在厘米级的高精度定位服务产品,基于双频RTK(载波相位差分)技术开发,通过互联网提供7×24小时的高可用播发。千寻CORS账号能够为全国地区(除西部无人区及台湾地区)提供位置数据服务。购买地址:千寻CORS账号,单个账号,包月400,包年3600。
从千寻控制台拿到用户名和密码:
激活账号:
调整为设备连接后自动绑定和激活:(或在账号操作列找到绑定按钮,手动输入设备SN和设备类型进行绑定和激活。建议前期调试改为自动即可)
2.2 G70上位机连接千寻(验证用)
- 打开Receiver–>NTRIP Client弹窗
- 根据购买的CORS账号输入地址、端口号、账号密码等信息
- 点击弹窗中部的Update source table按钮刷新Mountpoint/源/挂载点,然后在 NTPIPmount point 下拉框选择AUTO
- 点击OK保存数据,即可接入RTK服务
2.3 检查连接状态(验证用)
成功接入RTK后,u-center下边的菜单栏会显示Ntrip的连接状态,右边数据栏FixMode会显示Fixed,且模块的RTK灯会常亮,如果是Float状态时,RTK灯会闪烁。
3. 4G DTU 连接 G70
3.1 插入SIM上网卡
将图示箭头处往里戳,可以弹出模块的卡托,该模块为全网通4G,接入能正常联网的电
话卡(标准SIM规格尺寸)后可正常使用。
*注:在 DTU 通电的情况下严禁插拔 SIM 卡。
3.2 物理连线
4G模块串口转换器的线分别接入模块的A+、B+端口,另一端USB口接入调试使用的笔记本。将4G模块电源DC头接入4GDTU的接线端子中,DC端接适配器连接电源,此时4G模块的指示灯会亮起。
配置4GDTU时,请断开与G70连接。
3.3 配置4GDTU连接千寻(正式用法)
- 打开4G终端Ntrip千寻-配置调试工具。选择COM串口号,波特率默认为115200,点击【打开串口】。
- 配置CORS相关信息:填写Nrtip服务地址、端口号、Nrtip用户名、密码和挂载点,点击【设置】按钮保存参数,点击【查询】按钮确认写入成功。
成功接入RTK后,在右下角一栏会返回状态信息:STATUS:6001,表示配置成功。也可以点击右上角【查在线状态】获取当前4G通信模块的服务状态。此时4G通信模块的亮灯情况为:NET、SVR、DATA灯闪烁。(实际自测是NET闪烁,SVR常亮、DATA灯不亮,DATA灯要到后边连上G70后才会亮)
*注:如果没插SIM卡,设置时会报sim read error报警,网上买个n-sim卡托插上手机卡即可正常。
3.4 修改G70配置用于连接4GDTU
- 拔掉4GDTU,重新用TypeC-USB线连接G70和PC。
- 打开U-center上位机。
- 打开Messages->UBX->CFG 窗口,选择PRT页面,用于配置串口输出。
- 在Target 下拉选项选中 2-UART2,设置为5-RTCM3格式输入,1-NMEA输出,波特率为115200。如下图所示。点击【Send】发送配置。
- Messages->UBX->CFG->CFG页面,选择Save current confiuration,点击Send保存配置。
3.5 连接G70和4GDTU
G70与4GDTU的接线端口:
对照下图,可以看到G70的232RX、232TX、GND对应的线束为棕色、橙色、红色,接到4G DTU的对应TXD、RXD、GND口上即可。
三、验证
1. ROS1 SDK
1.1 准备工作
# 设备识别
lsusb |grep GNSS
Bus 001 Device 005: ID 1546:01a9 U-Blox AG u-blox GNSS receiver
# 配置别名
sudo echo 'KERNEL=="ttyACM*", ATTRS{idVendor}=="1546", ATTRS{idProduct}=="01a9", MODE:="0777", GROUP:="dialout", SYMLINK+="wheeltec_gnss"' >/etc/udev/rules.d/wheeltec_gnss.rules
sudo service udev reload
sleep 2
sudo service udev restart
# 检查(需重新插拔G70才能生效)
ll /dev/wheeltec_gnss
lrwxrwxrwx 1 root root 7 Nov 19 14:28 /dev/wheeltec_gnss -> ttyACM0
# 依赖
sudo apt install -y ros-noetic-nmea-msgs ros-noetic-rtcm-msgs
1.2 NMEA183格式解析(推荐)
需要设置模块输出 NMEA->GXGLL 消息数据。则点击Messages->NMEA->GXGLL,鼠标右键点击 GXGLL,设置【enable message】。
设置完成需要在 Messages->UBX->CFG->CFG 页面保存配置。
# 下载源码
cd ~/catkin_g70/src
git clone git@github.com:yanjingang/g70_gps_driver.git -b ros1-noetic-nmea
chmod +x ./g70_gps_driver/wheeltec_gps_driver/scripts/*
# 编译
cd ~/catkin_g70
catkin_make
# python -m pip install --upgrade pip
# python -m pip install pandas
# 运行
source devel/setup.bash
roslaunch wheeltec_gps_driver wheeltec_nmea_driver.launch
# 查看数据输出
rostopic info /fix
Type: sensor_msgs/NavSatFix
rostopic hz /fix
topic rate min_delta max_delta std_dev window
/fix 5.0 0.1954 0.2051 0.003199 16
rostopic echo /fix
header:
seq: 23
stamp:
secs: 1732022598
nsecs: 676532506
frame_id: "navsat_link"
status:
status: 2
service: 1
latitude: 40.04855052166667
longitude: 116.26010044166667
altitude: 44.197
position_covariance: [11.289599999999998, 0.0, 0.0, 0.0, 11.289599999999998, 0.0, 0.0, 0.0, 180.63359999999997]
position_covariance_type: 1
sensor_msgs/NavSatFix 数据格式定义:
std_msgs/Header header # 标准header头
uint32 seq
time stamp
string frame_id
sensor_msgs/NavSatStatus status # GPS信号质量信息
int8 status # 是否输出增强的定位 取决于定位类型和最后一次收到差分校正的时间(当状态 >= 0 STATUS_FIX时,此定位才有效;-1 NO_FIX,0 FIX,1 SBAS_FIX,2 GBAS_FIX)
uint16 service # 接收机使用了哪种全球导航卫星系统信号(1 GPS,2 GLONASS,4 北斗,8 伽利略)
float64 latitude # 以度为单位的浮点数,表示纬度
float64 longitude # 以度为单位的浮点数,表示经度
float64 altitude # 以米为单位的浮点数,表示相对于海平面的高度
float64[9] position_covariance # 以协方差矩阵表示的位置不确定性。是一个长度为9的一维数组,按照 [covariance_xx, covariance_yy, covariance_zz, covariance_xy, covariance_xz, covariance_yz, covariance_roll, covariance_pitch, covariance_yaw] 的顺序排列。(协方差的开平方是数据波动的范围)
uint8 position_covariance_type # 表示 position_covariance 中协方差的类型
1.3 UBLOX格式解析(不推荐)
需要设置模块输出 UBX->RXM->RAWX 消息数据。点击Messages->UBX->RXM->RAWX,鼠标右键点击 RAWX,设置【enable message】。
设置完成需要在 Messages->UBX->CFG->CFG 页面保存配置。
# 下载源码
cd ~/catkin_g70/src
git clone git@github.com:yanjingang/g70_gps_driver.git -b ros1-noetic-ublox
# 编译
cd ~/catkin_g70
catkin_make
# 运行
source devel/setup.bash
roslaunch wheeltec_gps_driver wheeltec_ublox_driver.launch
# 查看数据输出
rostopic info /ublox_gps_node/fix
Type: sensor_msgs/NavSatFix
rostopic hz /ublox_gps_node/fix
topic rate min_delta max_delta std_dev window
/ublox_gps_node/fix 4.998 0.1969 0.2041 0.002649 5
rostopic echo /ublox_gps_node/fix
header:
seq: 3894
stamp:
secs: 1731999364
nsecs: 405819267
frame_id: "navsat_link"
status:
status: -1
service: 1
latitude: 0.0 # 室内为0,到室外就好了
longitude: 0.0
altitude: 0.0
position_covariance: [18446744065119.617, 0.0, 0.0, 0.0, 18446744065119.617, 0.0, 0.0, 0.0, 14063604981705.541]
position_covariance_type: 2
2. RVIZ中记录轨迹
将 GPS 的位置数据可视化,需要进行坐标系转换,将 lla 数据从经纬度WGS-84 坐标转换到真实世界 xyz 坐标系下,从而通过 rviz 显示路径,模拟出GPS 的轨迹。通过 rviz 可视化描绘 gps 轨迹图,运行指令:
#使用 nmea 协议解析时启动
roslaunch wheeltec_gps_driver nmea_gps_path.launch
#使用 ublox 协议解析时启动
roslaunch wheeltec_gps_driver ublox_gps_path.launch
nmea_gps_path.launch 文件使用 nmea 协议启动 nmea_serial_driver_node 节点解析 GPS 数据,获得经纬度信息。
ublox_gps_path.launch 文件使用 ublox 协议启动 ublox_gps 节点解析 GPS 数据获得经纬度信息。
gps_path_node 节点实现 WGS-84 坐标转换到真实世界 xyz 坐标系的功能,源码在 src/gps_path.cpp 路径下。其中 x, y, z 坐标是基于初始 GPS 位置(init_pose) 相对于当前 GPS 位置的差异计算出来的。x 和 y 是在地球表面平面上的位移,z 是海拔高度的差异。
关于 rviz 中显示的坐标系解释如下:
- 原点:在第一次接收到 GPS 数据时的地理位置。
- x 轴:沿着纬度的变化方向(南北方向)。
- y 轴:沿着经度的变化方向(东西方向)。
- z 轴:表示高度变化(海拔)。
在 rviz 实现 GPS 轨迹可视化效果如图所示。
四、其他
1. 千寻差分状态
如果差分数据有异常可以通过千寻差分控制台左上角的“排障工具”,输入差分账号,查询工作情况:
2. 时钟同步
之前用的Lidar/IMU使用的时间戳为系统时间,而G70数据使用GPS时间系统,因此在联合使用前需要先做时间同步。
简易方法,运行以下指令同步系统时间到网络时间服务器:
sudo timedatectl set-ntp true
实际上通过ntp同步的时间与gps时间是存在gap的,可以使用gps时间来同步系统时间。
五、总结
好了,前些天忙着LIO-SAM和NDT建图,G70拖拖拉拉了好些天,都快落灰了,今天总算是抽空跑起来了,下一次,就带大家一起把RTK融入到建图和定位导航中(Lidar+IMU+GNSS)。
参考:
省CORS、千寻CORS(全国cors)、移动CORS账号的区别,如何选择? – 知乎