ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

移动机器人旋转编码器与里程计实战指南

移动机器人旋转编码器与里程计实战指南 旋转编码器在移动机器人里的角色远不止“测转速”这么简单。做机器人底盘、AGV、甚至扫地机的人最后都会发现一个问题无论你用的是激光雷达还是视觉轮子上的编码器永远是那个“兜底”的传感器——它最便宜、最可靠、最少受环境干扰。这篇内容我打算从编码器的工作原理、选型参数、里程计推算、安装调试到问题排查把移动机器人里编码器这套事讲透给正在做底盘或想入坑移动机器人的朋友一份可以直接抄的参考。1. 为什么移动机器人绕不开旋转编码器1.1 移动机器人对“位置感知”的刚性需求移动机器人的核心能力无非三件事我在哪、我要去哪、我怎么去。第一件事“我在哪”是所有运动控制的基础而这个问题拆开来看又分两层一是电机轴转到哪了二是机器人本体移动到哪了。电机轴的位置感知听起来简单但没有它你连一个最基本的闭环速度控制都做不了。直流电机空载能转到几千转负载一上来转速立刻掉如果你不告诉驱动器“实际转了多少”那所谓控制就是开环瞎猜。开环控制下两个轮子即使给同样的PWM因为地面摩擦、电池电压波动、电机个体差异实际转速也可能差出一大截机器人就会往一边偏。这正是编码器解决的根本问题它把“转了多少”变成电信号让控制器有能力修正偏差。机器人本体的位置感知则更上层。轮式机器人最常用的定位手段之一就是里程计Odometry里程计的信号来源几乎全是轮子上的编码器。激光雷达再好它也需要一个运动模型来辅助帧间匹配视觉SLAM再强遇到光照突变或者纹理稀少的墙面也得靠轮式里程计兜底。编码器是那个永远不会“看不见”的传感器哪怕在纯黑环境、无GPS的室内它照样给你输出脉冲。1.2 编码器在整个机器人系统中的定位很多新手容易把编码器理解成“一个传感器”其实在系统架构里它更像是一个承上启下的环节。往上它给导航算法提供里程增量往下它给电机驱动器提供换向和速度反馈。我画一个简单的数据流向电机转动 → 编码器输出脉冲 → 单片机/驱动器采集计数 → 计算转速与位移增量 → 反馈给运动控制环或导航算法。在这条链路里编码器的响应速度和分辨率直接决定了运动控制的上限。举个实际例子你做一台差速底盘PID速度环的采样频率一般是1kHz也就是每1ms读一次编码器计数。如果编码器分辨率太低1ms内计数跳变只有0或1速度反馈就是阶梯状的PID输出会抖动底盘跑起来会“嗡嗡”响。这也是为什么伺服电机标配17位甚至23位编码器而普通直流减速电机配的霍尔编码器只有几十线的原因——控制精度差着数量级。1.3 增量式与绝对式的抉择移动机器人里最常见的是增量式编码器也就是输出A/B两相正交脉冲的那种。它结构简单、便宜、协议通用任何单片机都能读。但它有一个天生弱点断电后位置信息丢失上电必须找零位。对于轮式里程计这不算大问题因为机器人上电后轮子位置本身不重要只要从当前位置开始积分就行。绝对式编码器则不同它通过格雷码或二进制码盘直接输出一个唯一位置值上电即知当前角度。多旋翼无人机、机械臂关节、需要上电直接动刀的危险场合绝对式编码器是刚需。但在移动机器人轮子上它的使用频率没那么高原因有两个一是价格高二是很多机器人的轮子旋转圈数远不止一圈普通增量式可以无限累加计数绝对式单圈得配合多圈计数。我的建议是轮子电机用增量式编码器就够了如果做的是服务机器人或协作机械臂的关节再考虑绝对值方案。这里还有个折中方案很多驱动轮电机自带霍尔传感器输出三轮换相信号精度虽然只有3或6个脉冲每转但对于低速移动机器人来说已经够用这也是现在市面上大多数AGV驱动轮的标准配置。2. 旋转编码器的核心工作原理2.1 光电式编码器怎么测角度光电编码器是目前精度最高、应用最广的一种。它结构上是三件套发光二极管LED、码盘带刻线的旋转圆盘、光敏接收管。码盘随轴旋转LED的光透过码盘上的缝隙照到接收管上每转过一个刻线接收管就产生一个脉冲信号。但只有一组接收管你只能知道“转了多少”不知道“往哪转”。于是工程上增加了一个关键设计在码盘上布置两组错开90°相位的接收管输出A相和B相。当码盘正转时A相相位超前B相90°反转时B相超前A相90°。控制器通过检测A、B两相的上升沿和下降沿不仅能数脉冲个数还能判断方向——这就是“正交解码”的原理。更妙的是四倍频技术。对A、B两相信号的每个跳变沿上升沿和下降沿各两个都计数一个物理刻线就能产生4个计数脉冲。也就是说一个500线的码盘用四倍频解码后等效分辨率是2000线/转。这个技巧在移动机器人里用得非常多同一个码盘白拿4倍精度代价只是单片机多几次中断处理。2.2 磁编码器的差异磁编码器的工作原理跟光电完全不同。它是在转轴上装一个径向磁化的磁铁磁铁附近的霍尔传感器或磁阻传感器感应磁场方向变化通过反正切计算出角度。因为磁场方向是连续变化的磁编码器天然就是“绝对式”的——一上电就能知道当前角度。磁编码器的优势是抗污染、抗振动、结构简单不用担心灰尘遮挡光路。但它的精度通常比光电式低常见磁编码器在12-14位左右分辨率约0.02°高精度光电式可以达到17位以上。在移动机器人领域磁编码器最常见的应用场景是轮毂电机的一体化模块——很多轮毂电机把磁编码器直接集成在电机尾部体积小、成本低出厂即校准对整机厂商非常友好。2.3 分辨率、精度和重复精度的区别这三个词是编码器选型里最容易混淆的。分辨率是编码器能分辨的最小角度变化等于360°除以每转脉冲数或2的位数次方。精度是实际角度与真实角度之间的误差它受码盘加工误差、安装偏心、温度漂移影响。重复精度是指多次回到同一位置时读数的稳定程度它只关心“读数一致不一致”不关心理想值。简单类比分辨率像一把尺子的最小刻度精度像这把尺子准不准重复精度像你每次量同一个东西读数是不是一样。移动机器人做里程计时真正影响定位质量的是重复精度和计数可靠性并不是单纯追求分辨率越高越好。我见过有人给轮子装了20000线的编码器结果安装时联轴器同心度不够每个旋转周期都出现明显的正余弦误差最后定位精度反而不如用500线好好安装的。——高分辨率不等于高精度这个坑要记住。3. 移动机器人上旋转编码器的三大典型应用3.1 电机速度闭环和位置闭环反馈编码器在移动机器人驱动系统里承担的第一层职责是电机闭环反馈。现在主流移动机器人底盘常采用“双闭环”结构内环是电流环扭矩环外环是速度环。速度环的反馈来源就是编码器。在PID控制器里编码器读到的速度值与目标速度的偏差进入PID运算输出PWM控制电机。如果编码器反馈滞后或者噪声大PID会变得不稳定。我调过的很多底盘跑起来“嘎吱嘎吱”异响其实就是编码器的反馈信号干扰太大导致电流波形毛刺多。另外一个容易被忽略的细节是编码器安装在电机轴上还是减速器输出轴上。装在电机高速级可以拿到更高的脉冲频率分辨率等效提高减速比倍但反映不到负载端的真实转速——如果皮带打滑或齿轮间隙大控制器以为转了实际没转。装在输出端则更直接但得到的脉冲数少低速时分辨率不够。两种方案都有支持者我的经验是做精密底盘用双编码器电机级高速编码器做速度和换向输出级低分辨率编码器做里程计预算有限时优先保速度环里程计用软件补偿。3.2 轮式里程计Odometry推算这是编码器在移动机器人里最“神”的应用之一。通过左右轮编码器的脉冲计数结合轮径和轮距可以推算机器人每时每刻的位置和航向角。这就是差速驱动模型ΔD_left 左轮编码器脉冲数 / 每转脉冲数 × 轮子周长ΔD_right 右轮编码器脉冲数 / 每转脉冲数 × 轮子周长ΔD_center (ΔD_left ΔD_right) / 2Δθ (ΔD_right - ΔD_left) / 轮距然后更新x ΔD_center × cos(θ_current)y ΔD_center × sin(θ_current)θ Δθ这个公式看起来简单但实现的时候有无数细节。比如轮距到底取哪个值——理论上是左右轮接地点之间的横向距离但实际轮胎有宽度接触点会随着载荷和胎压变化。又比如车轮直径直接量轮子外径是不准的因为轮胎会压扁有效滚动半径比几何半径要小几个百分点。最好的办法是做一次“标定实验”让机器人走一段已知长度比如3米反向算出每脉冲对应的实际位移把误差标定出来。还有一点里程计推导位置本质是积分运算积分一定会漂移。再好的编码器轮胎打滑一次后续几米内位置全都是偏的。所以里程计的正确用法是和其他传感器融合比如IMU、激光雷达而不是单独依赖它。但哪怕是融合里程计仍然提供了“短期较准”的预测值这对卡尔曼滤波的预测步骤至关重要。3.3 关节角度反馈和转向机构除了驱动轮移动机器人还有不少旋转关节。舵轮底盘的转向电机、机械臂的旋转底座、云台的偏航轴都需要角度反馈。在这些场合绝对式编码器比增量式更方便因为机器人在某些工况下需要上电后立刻知道关节处于什么角度。我做过一个舵轮AGV转向电机用的就是带绝对式磁编码器的伺服电机。上电后驱动器自动读回当前转向角根本不需要回零位校准。如果用增量式编码器每次上电都得先转到机械限位找零如果现场有障碍物这个找零过程可能直接就撞上了。当然有些设计为省钱会采用增量式霍尔开关的组合机械转轴上装一个霍尔接近开关上电后向某方向转到开关触发点作为零位。这个方案便宜但找零过程必须有空间避让而且不能用在需要在任意角度都能立即安全启动的场景。4. 移动机器人编码器选型与参数计算4.1 编码器关键选型参数解读选编码器的时候你会看到一长串参数分辨率PPR、输出信号类型TTL/推挽/开路集电极、供电电压、最大转速、防护等级、轴径等。很多参数看着头大但只要抓住几条关键主线就能快速锁定型号。分辨率是第一个要定的。对移动机器人来说我一般建议轮子编码器的等效分辨率做到每毫米至少1个脉冲最好2-3个以上。所谓“等效分辨率”是编码器安装在电机轴上还是轮子轴上的区别。假设电机减速比30:1编码器PPR为500四倍频后是2000脉冲/转输出轴每转就是60000个脉冲轮子周长0.5米的话每毫米大约120个脉冲非常充裕。输出信号类型里差分输出RS422线驱动抗干扰能力最强长线传输首选。基本输出集电极开路适合短线低噪声环境。另外要注意编码器的最大响应频率分辨率乘以转速不要超过编码器的最大相应频率否则会出现计数丢脉冲。防护等级方面室内轮式机器人用IP40就够如果要做户外巡检至少要IP65。别忘了灰尘和水汽是码盘光电接收管的第一大杀手这个很多人到最后都没有意识到。4.2 一个移动机器人底盘的具体计算实例拿一台常见差速服务机器人来实际算一下驱动轮直径125mm电机额定转速3000rpm减速比20:1要求最大速度1m/s期望定位分辨率1cm。轮子周长π × 0.125 ≈ 0.3927m最大轮子转速1 / 0.3927 ≈ 2.55rps即153rpm电机最大转速2.55 × 20 51rps即3060rpm符合电机额定若定位分辨率1cm轮子转一圈要累计约39.27个脉冲0.3927 / 0.01 ≈ 39.27编码器在电机轴上减速比为20则每转编码器需提供约39.27 × 20 ≈ 785.4个脉冲这里已按四倍频后的等效计数因此物理PPR选择250线四倍频后1000脉冲/转完全足够想要更平滑选500线也合理。同时计算编码器的最大输出频率电机3060rpm即51rps500线原始脉冲频率 51 × 500 25.5kHz四倍频后为102kHz。这个频率对大多数单片机定时器编码器模式来说完全没有压力即使STM32也轻松处理。如果选的编码器最大响应频率只有20kHz那就会丢脉冲——选型的时候一定要按这个公式算一遍。5. 安装调试与实操心得5.1 安装同心度与联轴器的坑编码器安装最影响长期稳定性的因素就是同心度。码盘或磁铁如果和电机轴不同心每转一圈就会产生一次周期性的误差——看起来像编码器“忽快忽慢”实际上就是机械偏心导致读数偏差。安装时尽量使用弹性联轴器它能吸收一定程度的轴心偏差。如果编码器直接套在电机轴上很多微型编码器是这种结构要注意轴端的跳动公差安装面要平整不要斜着用力压入。有一次我们底盘的编码器总是每转出现固定频率的振动排除了电机问题后才发现是联轴器裂了一道小缝换掉后立刻恢复。还有一点码盘或编码器外壳绝对不要承受额外的轴向力。如果电机轴有皮带轮或者齿轮建议先支撑好负载不要让编码器轴承承受安装应力。编码器内部轴承通常比较精细一旦预紧力不对寿命会断崖式下降。5.2 信号干扰与线缆处理的实战经验移动机器人内部是个电磁环境很恶劣的空间驱动电机大电流、PWM高频开关、有时候还有无线数传模块。编码器信号线如果跟动力线走同一个线槽必然遇到干扰。我踩过最大的坑是让编码器线跟着电机动力线一起从底盘后面穿到前部控制板。结果装上后编码器计数时好时坏尤其在电机加速时跳变特别严重。后来用示波器测A相波形发现上面叠加了一堆毛刺边沿抖动严重。处理办法是信号线单独走线远离动力线采用带屏蔽层的双绞线并且屏蔽层单端接地在驱动器侧加磁环或者RC滤波。经过处理后波形干净了很多计数跳变问题彻底消失。另外代码层面也有很多抗干扰手段。比如正交解码后加一个合理的滤波窗口把短于2μs的脉冲丢弃或者用状态机检查A/B相变化是否合法如果出现“00→11”这种不可能出现的跳变说明信号异常直接丢弃此次计数。这些都是软件层面的低成本保险。5.3 偏置校准与时间同步如果你用的是绝对式编码器或磁编码器安装时几乎没有机械零位必须做电气零位校准。方法很简单把电机转到机械参考点如果有关节限位或者找零块记录当前编码器角度值作为软件偏置。之后所有读数都减去这个偏置就得到了相对于机械零位的角度。时间同步是一个更高阶的问题。当你有多个编码器、一个IMU和一台激光雷达时如果数据时间戳不对齐卡尔曼融合出来的状态会有很大的延时误差。实机上常用方案是让所有传感器数据都经过同一颗单片机或工控机打时间戳编码器中断里立刻给当前计数附带一个硬件时间戳然后再进行后续运算。有些实时性要求高的系统还会用FPGA做编码器计数和时间戳管理把CPU解放出来。我之前调试的一套双轮差速底盘编码器计数是通过USB串口虚拟的串口设备读回来的波特率115200结果整个里程计更新频率只能到50Hz时间戳还不稳定。后来把编码器接入MCU自带的编码器接口如STM32的TIM编码器模式直接硬件计数MCU再通过CAN或者以太网把带时间戳的数据发出去频率到了500Hz之后整个运动控制曲线顺了许多。6. 常见问题与排查技巧实录6.1 电机没转但计数在跳这是最常遇到的问题之一。排查方向从硬件到软件依次过一遍先摸一下屏蔽层接地是否可靠再看是否和动力线近距离并行然后用示波器抓一下A/B相波形看有没有毛刺。如果是车载电源纹波大考虑给编码器单独加一个LC滤波。另外还要检查是不是两根信号线接反或者虚焊我遇到过几次因为插头端子松动导致接触不良、时断时续的情况。6.2 里程计越走越偏机器人走直线轨迹却逐渐划弧。要么是左右轮实际直径不一致要么是轮距标定不准要么是某一个电机刹车或摩擦阻力过大。排查方法将机器人悬空手动匀速推轮看左右编码器累计脉冲是否一致。一致则问题在机械或地面不一致则检查对应电机驱动和编码器信号。更精确的做法是做一次“直线标定”让机器人以100mm/s速度走5米记录横向偏差和航向角偏差然后用这些数据反算轮径修正系数。6.3 上电后角度不对绝对式编码器如果使用绝对式编码器但上电读数总差一个固定角度基本可以断定是零位偏置没保存或者保存的偏置值丢失。很多伺服驱动器有电池记忆功能电池没电了绝对值位置就会丢。设计时一定要有一个“上电读取并校验”的流程保存偏置的同时保存一圈内的基准读数校验通过再允许使能运动。6.4 编码器问题速查表故障现象可能原因排查与解决计数跳变、明显丢脉冲信号干扰、线缆过长、屏蔽未接地单独走线、双绞屏蔽线、加磁环每转一圈固定误差联轴器偏心、码盘安装不正更换弹性联轴器、重新校准同心度上电后位置丢失使用了增量式编码器且无找零加装找零开关或换绝对式编码器速度反馈抖动编码器分辨率过低导致低速量化误差换高分辨率编码器或软件滤波读数方向反了A/B相接反交换A/B两相信号线或软件翻转方向电机堵转时计数乱跳共模干扰或电源跌落检查驱动供电、增加共模电感6.5 一个曲折的实战排查案例最后分享一个我印象特别深的案例。当时做一台室外巡检机器人四个轮子都装了增量式编码器调试时发现右前轮里程计的增量总比期望值多出10%。检查了轮径、减速比、脉冲数全部对不上。最后拆开轮子发现那个轮的轮胎是新换的品牌和原厂不一样直径大了接近2mm而轮径参数是用原厂轮胎标定的。换回原厂胎后数据立刻就对了。这事的教训是里程计的标定是“针对整套机械配置”的轮径、减速比、胎压、地面材质每一项变化都会直接影响编码器读数到实际位移的换算系数。所以量产和长期维护时机械变更一定要同步更新标定参数否则导航系统会在你根本没察觉的情况下慢慢变差。7. 定位融合编码器与IMU、激光雷达的配合7.1 为什么编码器单独撑不起完整定位前面提过编码器里程计会积分漂移更要命的是它无法感知侧滑和打滑。假设机器人右轮压到一片湿滑地面轮子空转了一瞬间编码器会记录一个位移增量但实际上机器人根本没前进。这种误差一旦出现后面不管走多远都会带着这个错误。因此现代移动机器人普遍采用多传感器融合定位。IMU提供高频加速度和角速度能捕捉短时间内的姿态变化激光雷达或视觉提供绝对位置修正编码器提供速度预测和轮式运动约束。三者在卡尔曼滤波里各司其职编码器负责“我这会儿大概走了多少”IMU负责“我这会儿大概转了多少”激光雷达负责“错了多少拉回来多少”。7.2 实际融合框架里的编码器处理在ROS 2里编码器里程计通常会发布为nav_msgs/Odometry消息包含速度twist和位置pose两个部分。很多融合算法比如robot_localization并不是直接读你的位置估算而是读你的速度来作为预测模型输入——这时候编码器测速的平滑性和实时性就比单纯的位置计算更重要了。为了让速度平滑我会对编码器原始脉冲做一次递推平均或者一阶低通滤波但要注意滤波带来的延时。如果只做导航建图延时几十毫秒影响不大如果做高动态运动控制滤波器必须放在控制环之外编码器原始数据直接进控制环平滑计算只用于定位。7.3 双编码器与视觉/雷达融合的实战建议我现在的底盘设计惯例是驱动电机上装高分辨率增量式光电编码器输出轴额外装一个低分辨率磁编码器专门测量真实轮转。这样速度环和里程计各取所需并且可以通过两个编码器的差值实时感知打滑——如果电机轴编码器显示转速高但输出轴编码器显示转速低说明传动存在丢步或打滑这时候可以主动降低速度或对里程计做修正。与激光雷达融合时有个常用的做法是“scan matching初值”每次激光帧间匹配之前用编码器里程计给出一个预测初值这样匹配不仅更快而且不容易陷入局部极值。实测下来这个初值的好坏对激光雷达在走廊、长墙这类退化环境下的表现影响非常大编码器精度差一点整个SLAM都跟着抖。8. 不同底盘类型对编码器方案的影响8.1 差速底盘差速底盘是最常见的两个驱动轮各装一个编码器转向靠左右轮速度差实现。它的里程计模型简单但存在一个先天弱点原地旋转时对转向角度的估算极度依赖轮距精度而且轮胎打滑影响很大。所以差速底盘的编码器建议选高分辨率型号同时尽量降低重心减少加速和刹车时的打滑。8.2 舵轮底盘舵轮底盘每个轮子有驱动和转向两个电机通常需要4个编码器2个驱动2个转向。转向角反馈的精度直接决定了底盘能不能实现全向运动。用磁编码器做转向反馈是当前很多AGV厂商的标准做法因为转向不需要超高分辨率但需要绝对角度和快速响应。8.3 全向轮/麦克纳姆轮底盘全向轮和麦克纳姆轮的轮子运动分解方式与传统轮式不同编码器装在电机上时读到的只是“那个轮子的转速”并不是机器人沿某个坐标轴的速度。这类底盘的里程计需要对每个轮子的速度和机体几何关系做一次运动学变换。更麻烦的是麦克纳姆轮的滚子与地面的接触滑移很大纯编码器里程计的精度通常不如橡胶轮差速底盘因此全向底盘往往需要加IMU甚至视觉传感器来辅助修正。9. 写在实操之后的一些心得做了这几年机器人底盘我对编码器的态度从“不就是个测速传感器”变成了“整个运动控制的地基”。地基打不好上面盖再漂亮的算法都是空中楼阁。编码器选型、安装、布线和标定每一步都直接决定你最终跑出来的定位精度和鲁棒性。如果现在有人问我给新手一条快速上手的路径我会推荐先买一台带霍尔编码器的开源小车比如常见的差速驱动轮模块把PID速度环调稳然后接上OLED显示编码器计数和里程计坐标走一个1m见方的方块看最后偏差有多少再尝试用卡尔曼滤波把编码器和MPU6050的航向角融合看转弯漂移有没有改善。这一套走下来你对编码器在移动机器人里的理解会比单纯读十篇文章都深。最后再分享一个小技巧在设计底盘时提前为编码器线缆留好独立的走线槽和接口位置这对后期调试的省心程度影响巨大。很多看起来“玄学”的干扰问题追根溯源都是当初布线太随意埋下的雷。编码器本身不复杂真正的复杂度全在旁边那些容易被忽略的细节里。
返回列表