第七篇:RTK + 地图 + 机器人:完整定位系统架构解析
上一篇我们讲了:
《Android / IoT 如何接入 RTK 模块?——串口、蓝牙、TCP 工程实践》
很多人已经知道:
RTK 模块会输出 NMEA Android / IoT 可以通过串口、蓝牙、TCP 接收数据 上层系统需要解析经纬度、Fix 状态、卫星数量、HDOP但问题来了:
拿到 RTK 经纬度之后,机器人就能正常跑了吗?
答案是:还远远不够
因为真实机器人需要的,
不是单纯的:
经度 纬度而是:
我在哪里? 我朝哪个方向? 我有没有越界? 我该往哪里走? 我能不能继续运动?所以:
RTK 只是定位系统的入口。
真正的机器人定位系统,
一定是:
RTK + 地图 + 围栏 + 路径规划 + 控制系统
共同工作。
今天这一篇,我们就从工程视角,真正讲透:
RTK 在机器人中的完整系统架构
一、先理解一个核心问题
很多人第一次做机器人定位时,容易把问题想简单。
他们以为:
RTK 输出经纬度 ↓ 地图上显示一个点 ↓ 机器人就能跑但真实工程不是这样。
因为机器人真正需要的是:
可用于控制的位姿
也就是:
x y heading speed status而不仅仅是:
latitude longitude二、为什么经纬度不能直接给机器人用?
因为经纬度是地理坐标。
例如:
经度:120.123456 纬度:31.123456它表示的是:
地球上的位置
但机器人运动控制更关心:
向前多少米 向左多少米 距离边界多少米 距离目标点多少米这些都是:
平面坐标问题
所以在真实工程中,通常需要把经纬度转换成:
局部地图坐标例如:
x = 12.5m y = 8.3m这样机器人才能真正使用。
三、机器人最终需要的不是 Location,而是 Pose
这是一个非常关键的工程认知。
普通定位系统关心:
Location也就是:
在哪里但机器人系统关心:
Pose也就是:
在哪里 + 朝向哪里通常表示为:
Pose = (x, y, theta)其中:
- x:地图坐标 X
- y:地图坐标 Y
- theta:机器人朝向角
所以:
RTK 解决的是位置问题
但:机器人还需要朝向问题
这也是为什么 RTK 通常会结合:
- IMU
- 电子罗盘
- 双天线 RTK
- 编码器
- 轮速计
一起使用。
四、完整定位系统长什么样?
真实机器人系统中,
完整链路通常是:
RTK 模块 ↓ NMEA 定位数据 ↓ 定位数据解析 ↓ 定位质量判断 ↓ 坐标转换 ↓ 地图坐标 ↓ 电子围栏判断 ↓ 路径规划 ↓ 运动控制 ↓ 机器人执行如果有多传感器融合,
还会加入:
IMU 编码器 轮速计 SLAM 激光雷达最终输出:
机器人当前位姿 Pose五、第一层:RTK 数据接入层
这一层就是前面第六篇讲的内容。
RTK 模块通过:
- 串口
- 蓝牙
- USB
- TCP
不断输出:
NMEA 数据例如:
$GNGGA,... $GNRMC,...上层系统负责:
读取数据流 解析 NMEA 提取经纬度 提取 Fix 状态 提取卫星数量 提取 HDOP这一层的目标是:
拿到原始定位数据
六、第二层:定位质量判断层
拿到经纬度之后,不能直接用。
必须判断:
这条定位数据是否可信
因为 RTK 会出现:
- 无定位
- 普通 GPS
- Float
- Fix
- 跳点
- 数据超时
- 卫星数量不足
所以系统必须做过滤。
常见判断指标
通常包括:
Fix 状态 卫星数量 HDOP 时间戳 位置连续性 速度是否异常例如:
如果当前状态是:
RTK_FIX说明可信度高。
如果是:
RTK_FLOAT说明精度下降。
如果是:
GPS NONE就不能作为高精度定位使用。
七、第三层:坐标转换层
这是很多 Android / IoT 开发容易忽略的地方。
RTK 输出的是:
WGS84 经纬度但地图系统和机器人控制,通常需要:
平面坐标例如:
x y所以需要坐标转换。
常见坐标体系
工程里经常会遇到:
WGS84 GCJ-02 BD-09 UTM ENU 局部地图坐标简单理解
WGS84:
卫星定位原始坐标GCJ-02:
国内地图常用坐标BD-09:
百度地图坐标ENU / 局部坐标:
机器人内部使用的平面坐标八、为什么机器人更适合用局部坐标?
因为机器人运动控制,通常关心的是:
距离 角度 方向 边界 路径例如:
目标点在前方 3 米 边界在左侧 0.5 米 机器人需要右转 15 度这些都不适合直接用经纬度算。
所以真实机器人里,通常会定义一个地图原点:
originLat originLng然后把 RTK 经纬度转换成:
x y最终机器人内部使用:
局部地图坐标系九、第四层:地图系统
定位数据进入地图之后,
地图系统要负责:
显示机器人位置 管理边界 管理禁区 管理路径点 管理任务区域比如割草机器人:
地图中可能包含:
- 草坪边界
- 禁区
- 充电桩位置
- 起点
- 路径
- 已完成区域
- 未完成区域
所以:
RTK 只是告诉系统:
机器人在哪里地图系统还要知道:
这个位置属于哪里十、第五层:电子围栏判断
第四篇我们讲过:
电子围栏的核心是:
Point-In-Polygon
也就是:
判断机器人当前位置是否在多边形区域内在完整系统中,
它通常位于:
定位系统 ↓ 地图系统 ↓ 电子围栏判断 ↓ 运动控制如果机器人当前位置:
不在允许区域内系统就要:
- 停止
- 回退
- 告警
- 重新规划
所以:
RTK 负责定位
PIP 负责判断是否越界
十一、第六层:路径规划
当系统知道机器人当前位置后,
下一步就是:
规划机器人怎么走
比如:
- 从当前位置到目标点
- 沿边界行走
- 覆盖整个草坪
- 绕开禁区
- 返回充电桩
路径规划需要不断读取:
当前位姿 目标点 地图边界 障碍物 任务状态然后输出:
下一步运动方向所以:
定位数据是路径规划的基础。
没有稳定定位,路径规划也无法稳定。
十二、第七层:运动控制
路径规划告诉机器人:
应该往哪里走但真正执行动作的是:
运动控制系统
它会控制:
- 电机
- 轮子
- 转向
- 速度
- 刹车
例如:
向前 0.5m 右转 20° 减速 停止 回退这时候定位系统会持续反馈:
机器人当前是否到达目标点 有没有偏离路径 有没有越界形成一个闭环。
十三、完整闭环是什么?
机器人不是一次性拿到位置就结束。
而是一个实时闭环:
获取当前位置 ↓ 判断定位质量 ↓ 更新地图位置 ↓ 判断是否越界 ↓ 计算下一步路径 ↓ 控制机器人运动 ↓ 再次获取当前位置这个过程会一直循环。
所以:
机器人定位系统是实时系统
不是普通 App 里显示一个定位点那么简单。
十四、为什么 RTK + 地图容易出问题?
真实工程中,很多问题并不是 RTK 单独导致的。
而是:
RTK、地图、坐标系、控制系统之间没对齐
常见问题包括:
1. 坐标系不一致
RTK 是WGS84。
地图可能是 GCJ-02。
机器人内部又是局部坐标。
如果没转换对,地图上的点就会偏。
2. 地图原点错误
如果局部坐标原点设置错了,所有点都会整体偏移。
3. 朝向不准
RTK 只能提供位置。
如果 heading 不准,机器人会出现:
位置对了 但方向错了最终路径还是会偏。
4. 定位延迟
如果 RTK 数据延迟,机器人看到的是:
过去的位置而不是真实当前位置。
这会导致控制滞后。
5. 跳点没有过滤
如果 RTK 突然跳出 10 米,
地图直接使用,
机器人可能立刻误判越界。
所以必须做跳点过滤。
十五、为什么需要 RTK + IMU 融合?
RTK 的优点是:
全局准但缺点是:
容易受遮挡和网络影响IMU 的优点是:
短时连续 响应快但缺点是:
时间长了会累积误差所以二者结合:
RTK 负责长期校准 IMU 负责短时稳定这就是工程里常说的:
多传感器融合
十六、真实机器人里的定位架构
真实工程里,
完整架构可能是:
RTK 模块 IMU 编码器 轮速计 ↓ 定位融合模块 ↓ Pose(x, y, theta) ↓ 地图系统 ↓ 电子围栏 ↓ 路径规划 ↓ 运动控制 ↓ 机器人执行这个架构才是机器人真正需要的。
不是单纯:
拿一个经纬度十七、Android / IoT 里怎么设计这套架构?
如果上层是 Android,
可以这样分层:
RtkDataSource ↓ RtkRepository ↓ LocationEngine ↓ MapEngine ↓ FenceEngine ↓ NavigationEngine ↓ RobotControllerRtkDataSource
负责:
串口 / 蓝牙 / TCP 数据读取RtkRepository
负责:
NMEA 解析 状态维护 异常处理LocationEngine
负责:
定位质量判断 跳点过滤 数据超时判断 坐标转换MapEngine
负责:
地图坐标 边界 禁区 路径点FenceEngine
负责:
Point-In-Polygon 判断 越界检测NavigationEngine
负责:
路径规划 目标点计算 任务状态RobotController
负责:
运动控制 停止 转向 速度控制十八、推荐的数据模型
上层不应该直接传 NMEA 字符串。
而应该传统一模型。
例如:
data class RobotPose( val x: Double, val y: Double, val heading: Double, val speed: Double, val fixType: FixType, val satelliteCount: Int, val hdop: Double?, val timestamp: Long, val isReliable: Boolean )这样地图、围栏、路径规划都可以统一使用。
十九、定位状态应该怎么设计?
真实工程中,定位状态必须明确。
例如:
enum class LocationStatus { NONE, GPS, RTK_FLOAT, RTK_FIX, DEGRADED, LOST }这样系统才能根据状态做决策。
例如:
RTK_FIX → 正常运行 RTK_FLOAT → 降速运行 / 提醒风险 LOST → 停止运动 / 等待恢复不能所有状态都当成正常定位。
二十、机器人遇到定位异常怎么办?
这是工程里非常关键的一点。
机器人不能盲目相信定位。
如果定位异常,系统应该有降级策略。
常见策略
1. RTK Fix 正常
机器人正常运行。
2. RTK Float
可以:
- 降速
- 缩小动作范围
- 提醒定位精度下降
- 结合 IMU 短时运行
3. 无定位
应该:
- 停止运动
- 等待恢复
- 告警
- 进入安全模式
4. 跳点异常
应该:
- 丢弃异常点
- 使用上一帧可信位置
- 等待连续稳定数据
二十一、为什么这是系统架构问题?
很多人以为:
RTK 问题就是:
模块问题其实不是。
真实工程中,RTK 定位稳定性,取决于整个系统:
硬件 天线 差分 网络 协议 解析 坐标转换 地图 围栏 规划 控制任何一层出问题,机器人都会表现为:
定位不准 路径偏移 越界 跳点 回充失败所以:
RTK 不是单点技术
而是:
机器人定位系统工程
二十二、面试怎么回答?
如果面试官问:
“RTK 在机器人系统里是怎么工作的?”
推荐回答:
标准答案(面试版)
RTK 在机器人系统中,通常不是单独使用的。
它首先通过串口、蓝牙或 TCP 输出 NMEA 定位数据。
上层系统解析经纬度、Fix 状态、卫星数量、HDOP 等信息。
然后进行定位质量判断,过滤跳点和过期数据。
接着把 WGS84 经纬度转换成机器人内部使用的局部地图坐标。
地图系统根据当前位置更新机器人位置,电子围栏通过 Point-In-Polygon 判断是否越界。
路径规划模块根据当前位姿和目标点计算下一步路径。
运动控制模块再控制机器人执行。
真实工程中,RTK 通常还会融合 IMU、编码器、轮速计或 SLAM,
最终输出稳定的机器人位姿:
Pose(x, y, theta)所以 RTK 只是定位系统的一部分,
完整机器人定位系统本质上是:
RTK + 传感器融合 + 地图 + 围栏 + 规划 + 控制
二十三、总结
一句话总结:
RTK 负责“知道机器人在哪里”
地图负责“知道环境是什么样”
电子围栏负责“判断能不能过去”
路径规划负责“决定怎么走”
控制系统负责“让机器人真正动起来”
所以:
真正的机器人定位系统,
不是:
RTK 输出经纬度而是:
RTK + 坐标转换 + 地图系统 + 电子围栏 + 路径规划 + 运动控制共同组成的工程闭环。
二十四、系列最终总结
到这里,
《RTK / GNSS 工程实战系列》基本就形成闭环了。
从最开始的:
为什么机器人能厘米级定位到:
RTK 为什么比 GPS 准再到:
为什么 RTK 会漂再到:
电子围栏 数据链路 Android / IoT 接入 完整系统架构这一整套下来,
你会发现:
RTK 并不是一个孤立知识点。
它连接的是:
GNSS 差分定位 数据协议 Android / IoT 地图系统 机器人控制 多传感器融合所以最终目标不是成为:
GNSS 算法专家而是成为:
懂 RTK 系统的 Android / IoT / 机器人工程师
这才是这个系列真正的定位。
《RTK / GNSS 工程实战系列》
- 为什么机器人能厘米级定位?——一篇讲透 GPS、北斗 与 RTK
- RTK 为什么比 GPS 准?——差分定位原理详解
- 机器人为什么会“漂”?——RTK 漂移问题详解
- Point-In-Polygon 是什么?——机器人电子围栏核心算法
- NMEA、RTCM、NTRIP 到底是什么?——RTK 数据链路详解
- Android / IoT 如何接入 RTK 模块?——串口、蓝牙、TCP 工程实践
- RTK + 地图 + 机器人:完整定位系统架构解析
