上篇讲了力/力矩传感器——机器人"触觉"的实现方案,从应变片原理到六维力传感器解耦,再到力控策略和ROS2集成。今天从室内转到室外,讲GPS和RTK定位原理——这是室外移动机器人(无人车、农业机器人、物流AGV)实现精确定位的核心技术。

面试时候被问"室外机器人怎么定位",很多人会说"用GPS"。但面试官想听的是更工程化的内容:GPS定位精度到底是多少?RTK是怎么把精度从米级提升到厘米级的?NMEA协议怎么解析?在ROS2中怎么集成GPS模块?GPS信号丢失了怎么办?

GPS定位原理

GPS(Global Positioning System)的基本原理是"距离交会"。每颗GPS卫星不断广播自己的位置和时间信息,接收器通过测量信号传播时间计算出到每颗卫星的距离,然后用三球交会确定自己的三维位置。

关键公式很简单:距离 = 光速 × 传播时间。但实际中,传播时间的测量受到很多因素影响——卫星钟差、接收器钟差、电离层延迟、对流层延迟、多径效应。这些误差叠加在一起,导致标准GPS的定位精度只有3-10米。

import numpy as np

def gps_pseudorange_position(satellite_positions, pseudoranges):
    """GPS伪距定位(最小二乘法)
    satellite_positions: Nx3数组,每颗卫星的ECEF坐标
    pseudoranges: N维向量,到每颗卫星的伪距
    至少需要4颗卫星(3个位置未知数+1个钟差未知数)
    """
    n_sats = len(pseudoranges)
    if n_sats < 4:
        raise ValueError("至少需要4颗卫星")
    
    # 初始估计(地球中心)
    x = np.array([0.0, 0.0, 0.0, 0.0])  # [x, y, z, dt]
    
    for iteration in range(10):
        H = np.zeros((n_sats, 4))  # 设计矩阵
        residual = np.zeros(n_sats)
        
        for i in range(n_sats):
            dx = satellite_positions[i] - x[:3]
            geometric_range = np.linalg.norm(dx)
            predicted_range = geometric_range + x[3]  # 加上钟差
            
            residual[i] = pseudoranges[i] - predicted_range
            
            # 几何距离对位置的偏导数
            H[i, :3] = -dx / geometric_range
            H[i, 3] = 1.0  # 对钟差的偏导
        
        # 最小二乘更新
        delta_x = np.linalg.lstsq(H, residual, rcond=None)[0]
        x += delta_x
        
        if np.linalg.norm(delta_x) < 1e-6:
            break
    
    return x[:3], x[3]  # 位置(ECEF), 钟差

标准GPS的误差来源需要了解一下。电离层延迟(2-8米)是最大的误差源,因为GPS信号穿过电离层时速度会变慢。对流层延迟(0.5-2米)次之。卫星轨道误差(1-2米)和卫星钟差(1-2米)也贡献了不少误差。多径效应(信号被建筑物反射后到达接收器)在城市环境中尤其严重,可能导致几米甚至十几米的误差。

还有一个很多人忽略的误差源:卫星几何分布。DOP(Dilution of Precision,精度衰减因子)反映了卫星几何分布对定位精度的影响。如果可见卫星都集中在天空的一侧,定位精度会很差(HDOP可能到5-10)。如果卫星均匀分布在天空各处,精度就好(HDOP接近1)。选型GPS模块时,要关注HDOP值——HDOP大于3的时候,定位结果就不可靠了。

GPS使用的坐标系是WGS84(World Geodetic System 1984),输出的位置是经纬度+海拔。但机器人系统通常用的是局部平面坐标系(比如UTM投影),所以GPS数据需要经过坐标转换才能在导航中使用。这个转换在ROS2的navsat_transform_node中已经实现了,但面试时候经常被问到原理。

实际选型GPS模块时,除了关注定位精度,还要看更新频率(5Hz/10Hz/20Hz)、冷启动时间、天线增益这些参数。农业机器人一般用5Hz就够了,但无人配送车至少需要10Hz才能保证高速运动时的定位平滑度。天线安装位置也有讲究——天线正上方不能有金属遮挡,否则会影响卫星信号接收。工程上通常会把GPS天线装在机器人最高点,并且使用有源天线来增强信号接收能力。

这就是为什么标准GPS对机器人来说不够用。一辆自动驾驶车如果定位精度只有5米,它根本不知道自己在哪条车道上。

RTK基站部署实践

RTK系统由基准站(Base Station)和流动站(Rover)组成。基准站固定在已知坐标的点上,接收GPS信号后计算误差修正量,通过无线电或网络发送给流动站。流动站用这些修正量来校正自己的定位结果,从而实现厘米级精度。

基准站的选址很重要。基准站天线要架设在开阔位置,上方无遮挡,远离反射面(建筑物、水面)。基准站的坐标精度直接影响流动站的精度,所以基准站坐标要通过长时间静态观测或者已知控制点来确定。

通信链路方面,基准站和流动站之间需要实时传输修正数据。短距离(几公里内)可以用UHF电台,延迟低、稳定。长距离可以用4G/5G网络,通过NTRIP协议传输修正数据。但网络延迟不稳定时,RTK初始化时间会变长,甚至无法维持固定解。实际项目中,建议用有线网络或者专用数传电台,比公网更可靠。

面试中怎么聊

面试官问GPS/RTK定位,按这个顺序回答:先说GPS基本原理(距离交会)和误差来源(电离层、对流层、多径),再说RTK差分定位的原理(基准站校正+载波相位模糊度解算),然后说NMEA协议解析和ROS2集成,最后说GPS信号丢失的应对策略。

如果面试官追问"RTK的固定解和浮点解有什么区别",你可以说:载波相位模糊度是整数,如果能正确解算出这个整数(固定解),定位精度就是厘米级。如果解算不出来,只能用浮点数近似(浮点解),精度下降到分米级。固定解需要至少连续跟踪几秒的信号,如果信号被遮挡导致卫星数不够,就会退化到浮点解甚至失去定位。

如果面试官追问"GPS坐标怎么转换到机器人局部坐标系",你可以说:GPS输出的是WGS84经纬度,需要投影到平面坐标系。常用的是UTM投影(Universal Transverse Mercator),把经纬度转换成米为单位的平面坐标。在ROS2中,robot_localization包的navsat_transform_node可以自动完成这个转换——它接收NavSatFix消息,输出UTM坐标系下的里程计。

如果面试官追问"有没有比RTK更好的方案",你可以说:RTK在开阔环境下精度最高(厘米级),但在城市环境中因为多径和信号遮挡,表现会下降。这时候可以考虑RTK+视觉定位融合——用视觉SLAM在GPS信号好的区域建图,在GPS信号差的区域用视觉定位。这种方案在无人配送车领域用得越来越多。另外,PPP(Precise Point Positioning)技术也在发展,它不需要基准站,通过卫星播发的精密星历和钟差产品实现分米级定位,适合大范围作业的场景。

补充一个RTK调试的实用建议:在正式部署之前,先用RTK的原始数据做离线精度评估。记录一天的定位数据,和已知坐标的参考点对比,计算水平和垂直精度的统计值。很多厂家标称的精度是在理想条件下的,实际在你的使用环境中可能差不少。提前做离线评估能帮你判断RTK方案是否满足需求,避免上线后才发现精度不够。

下一篇讲超声波与红外传感器——近距离避障的低成本方案。GPS解决的是"我在哪"的问题,超声波和红外解决的是"前面有没有障碍物"的问题。


如果这篇文章对你有帮助,欢迎点赞、在看、转发三连。 你的支持是我持续更新的最大动力。

「机器人软件开发面试·从入门到精通」连载系列 上一篇:第161篇 力/力矩传感器——机器人"触觉"的实现方案 下一篇预告:第163篇 超声波与红外传感器——近距离避障的低成本方案

有任何问题欢迎评论区留言,我会尽量回复。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐