三、传感器基础与数据特性(下):轮式里程计、GNSS与相机

好,咱们接着聊。上一节我们把惯性传感器和激光雷达的脾气摸了个大概,这一节轮到另外三位主角:轮式里程计、GNSS和相机。这三样东西,说白了就是机器人“认路”的不同方式——一个靠轮子转圈算距离,一个靠天上卫星定坐标,一个靠眼睛看世界。各有各的长处,也各有各的坑。

3.1 轮式里程计(Wheel Odometry)模型

轮式里程计,我习惯叫它“轮子编码器”。原理其实特别简单:轮子转一圈,车走多远,这是固定的。你只要数清楚轮子转了多少圈,就能算出走了多少路。

但这里有个关键问题——轮子会打滑。我在项目里遇到过好几次,地面稍微有点水或者沙子,编码器数据就飘得离谱。你算出来走了10米,实际可能只走了8米。这就是轮式里程计的硬伤:它只能测轮子转了多少,测不了轮子到底抓没抓住地。

常见的轮式里程计模型有两种:

  • 差分驱动模型:左右轮各装一个编码器。通过左右轮转速差,可以算出转弯半径和角度。我最早做AGV小车时用的就是这种,结构简单,但转弯时容易累积误差。
  • 阿克曼模型:类似汽车转向结构。前轮转向,后轮驱动。这种模型需要知道转向角度,计算稍微复杂一点,但更接近真实车辆的运动特性。

嗯,这里要注意:不管哪种模型,轮式里程计的误差都是随时间累积的。你跑得越远,位置就越不准。所以它通常只用来做短距离的航迹推算,或者配合其他传感器做融合。

3.2 编码器数据与航迹推算

编码器输出的数据,说白了就是脉冲数。每个脉冲对应轮子转过的一个固定角度。比如一个编码器每圈输出1024个脉冲,那每个脉冲对应的距离就是轮子周长除以1024。

航迹推算(Dead Reckoning)就是基于这个脉冲数,一步步推算当前位置。公式其实不复杂:

// 伪代码示例:航迹推算
delta_distance = pulse_count * distance_per_pulse
x += delta_distance * cos(theta)
y += delta_distance * sin(theta)
theta += delta_theta  // 由左右轮差速算出

你看,就这么几行。但实际跑起来,误差会慢慢变大。我做过一个测试:让小车在光滑地板上直线走20米,编码器算出来走了20.3米,实际用卷尺量只有19.7米。差了0.6米,这就是打滑和轮径误差共同作用的结果。

我的小技巧: 每次启动前,让机器人原地转几圈,校准一下轮径参数。这个操作能减少约5%的累积误差。

3.3 全球导航卫星系统(GNSS)原理

GNSS,说白了就是GPS、北斗这些卫星定位系统的统称。原理其实挺巧妙的:卫星在天上不停地发信号,信号里带着卫星自己的位置和时间戳。地面上的接收器收到信号后,算一下信号飞了多久,就能知道离卫星有多远。

但这里有个问题:接收器的时钟不准。卫星上的原子钟精度极高,但接收器里的晶振便宜啊,误差可能差出几微秒。所以至少需要4颗卫星才能解算出三维位置——三颗用来定位,一颗用来校准时间误差。

我刚开始做室外机器人时,觉得GNSS简直是神器。后来发现,在城市峡谷或者树荫下,信号反射严重,定位误差能到十几米。嗯,那时候我才明白,GNSS也不是万能的。

3.4 RTK定位精度与常见误差源

RTK(实时动态差分定位)是GNSS的增强版。原理是:在地面架一个已知位置的基准站,基准站算出卫星信号的误差,然后把误差修正值发给移动站。这样一来,移动站的定位精度可以从米级提升到厘米级。

我在做农业机器人项目时用过RTK,精度确实好。但有几个坑要注意:

  • 基准站和移动站的距离:超过10公里,误差会明显增大。因为大气层对信号的延迟,在不同地方是不一样的。
  • 初始化时间:RTK刚开机时需要几分钟来解算模糊度。这段时间内精度很差,千万别直接拿来用。
  • 信号遮挡:RTK需要同时看到至少5颗卫星。在高楼旁边或者隧道里,直接失效。
我曾经踩过的坑: 有一次在果园里做测试,RTK信号突然丢了,机器人直接冲进了树丛。后来我加了一条规则:RTK信号质量低于某个阈值时,自动切换到其他传感器。

常见误差源总结一下:

误差源 影响程度 应对方法
电离层延迟 米级 双频接收机、RTK差分
多路径效应 米级到十米级 避开反射面、使用抗多径天线
卫星钟差 亚米级 差分修正
接收机噪声 分米级 滤波平滑

3.5 相机视觉传感器简介与图像数据特点

相机,说白了就是机器人的眼睛。但和人类的眼睛不一样,相机看到的是像素矩阵——每个像素就是一个数值,代表该点的亮度或者颜色。

图像数据有几个特点,做融合时一定要心里有数:

  • 数据量大:一张1080p的彩色图像,未经压缩就有约6MB。处理起来很吃算力。
  • 缺乏深度信息:普通相机只能知道物体在图像上的位置,不知道它离你有多远。除非你用双目相机或者深度相机。
  • 对光照敏感:强光下过曝,暗光下噪点多。我做过一个室内项目,白天和晚上的图像特征点数量能差一个数量级。
  • 纹理依赖:白墙、光滑地面这些纹理少的场景,相机基本废了。特征点都提取不出来。

相机在SLAM里主要用来做视觉里程计(Visual Odometry)和回环检测。视觉里程计通过跟踪图像中的特征点来估计运动,回环检测则通过识别曾经到过的地方来消除累积误差。

我的建议: 相机和轮式里程计是绝配。轮式里程计短距离准但会漂,相机长距离稳但怕纹理少。两者融合,正好互补。

好了,这一节的内容就到这里。轮式里程计、GNSS和相机,各有各的脾气。做融合时,关键是要理解每个传感器的长处和短板,然后想办法让它们互相弥补。下一节,我们开始讲真正的融合算法——卡尔曼滤波。到时候你会看到,这些传感器数据是怎么揉到一起的。