什么是轮式里程计

本文介绍了码盘在机器人系统中的应用,包括如何通过码盘获取线速度和里程,实现速度闭环控制,并详细阐述了里程计航迹推算的过程,涉及编码器脉冲、线速度计算、航向角估算等关键点。还提到了利用PID控制器进行速度控制,并探讨了不同航向角获取方法的优缺点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

里程计的基石 - 码盘

image.png

这是一个非常丑的码盘,它可以分为8个刻度,红色区域是吸光区,白色区域为透光区。这个码盘粘在电机上,当电机转动时,带动码盘转动。电机本身又通过减速箱与轮子相接最终大概构图为:

ba8f3f7fe439cbf3329730b1fe21d970.jpg

码盘可以得到什么?

真实线速度

经过光电管后,每次码盘转动都会产生一次脉冲,mcu可以通过中断记录两次脉冲之间的时间 △t ,已知这个时间,已知两个码盘间的距离,就可以算出来这段时间的真实速度(线速度 精度为 mm/s)。

里程

我们扫地机的码盘采用的是磁码盘,码盘转一次走过8个刻度,轮子通过减速箱与码盘产生联系,大概关系为:

image.png

比如我们的扫地机左右轮,周长 267mm , 轮子转一圈,经过了335个脉冲(刻度),那么每个脉冲对应的行走距离就是 :

odom = 267 / 335 = 0.797 (mm / 刻度)

那么如果我们左轮走了10000个刻度,就相当于走了 7970 mm

以上就是如何通过码盘获取每个轮子的里程。

扫地机速度闭环

上面讲了我们可以通过码盘获取左右轮真实速度,我们还可以通过PWM + 电机驱动芯片控制轮子的实际速度

image.png上面是一个精简的PID控制器,所有与轮子相关操作的均在一个线程内:

image.png

从linux下发一次线速度角速度,到底层控制电机转动,经过了如下步骤
image.pngimage.png

也就是说,Linux下发的线速度角速度,mcu把它解释为左轮期望速度和右轮期望速度,经过软加速后,放到PID控制器里做闭环。

基于里程计航迹推算(定位建图)

编码器推算轨迹:(直接对距离做分解累积误差相对较小,最终精度1%以内,如果做修正,同时航向角较准确的情况下精度可以达到0.1%以内(已经实测))
编码器每一个脉冲对应实际轮子行走的直线距离系数为:
rate_encoder = 2𝛑r/sum_encoders
其中r为车轮半径, sum_encoders 为轮子走动一圈的编码器的脉冲总数。
单位时间∆t内编码的增量为:
inc_encoder = encoder_now – encoder_last (当前编码器值减去上次编码器值)
则单位时间机器人移动的距离为:
∆d = inc_encoder * rate_encoder

世界坐标系下x、y方向累计里程分别为:
Xw = Xw + ∆xw = Xw + ∆d * cos(θ)
Yw = Yw + ∆yw = Yw + ∆d * sin(θ)

其中航向角θ的获取分两种情况:

  • 底盘带具有稳定航向角的IMU,此方式可以使得最终解算的位置十分准确(电子罗盘受电机干扰交大不可用)
    θ直接等于IMU的航向角Yaw。(IMU的Yaw上电为0,刚好和车的航向角一致)
  • 依靠底盘两个轮子上精确的编码器推算航向角。
    两轮编码器单位时间内增量分别为 inc_encoder_r、inc_encoder_l
    单位时间内两轮扭动的距离差为 lenth_error = (inc_encoder_r- inc_encoder_l) * rate_encoder;
    由⑤得:由距离差得单位时间内角度差为 anlge_z_error = lenth_error / 2d;
    根据编码器累计的角度θ为 anlge_z += anlge_z_error。
    此方式非常依赖编码器精度,有累计误差,效果不如直接使用IMU的好。
### 轮式里程计的工作原理 轮式里程计是一种广泛应用于移动机器人中的传感器系统,主要用于通过测量车轮的旋转来估算机器人的位移和姿态变化[^2]。其实现依赖于几个核心要素: #### 1. **基本参数定义** - 左右轮的转角 $\theta_l$ 和 $\theta_r$ 是由编码器测得的关键数据。 - 转角的变化量可以通过时间间隔内的增量计算得到: $$ \Delta \theta_l = \frac{\text{左轮脉冲数}}{\text{每圈脉冲数}} $$ $$ \Delta \theta_r = \frac{\text{右轮脉冲数}}{\text{每圈脉冲数}} $$ 这些角度变化可以进一步转化为线速度和角速度。 #### 2. **线速度与角速度计算** 利用左右轮的角度变化以及已知的几何参数(如轮距 $L$ 和轮半径 $R$),可分别计算出机器人的线速度 $v$ 和角速度 $\omega$: $$ v = \frac{R}{2} (\Delta \theta_l + \Delta \theta_r) $$ $$ \omega = \frac{R}{L} (\Delta \theta_r - \Delta \theta_l) $$ 上述公式展示了如何从机械结构出发,将物理信号转换为运动学变量。 #### 3. **位姿更新** 基于前述的速度信息,可通过积分的方式实时更新机器人的位置 $(x, y)$ 及朝向 $\phi$: $$ x_{new} = x_{old} + v \cdot \cos(\phi) \cdot \Delta t $$ $$ y_{new} = y_{old} + v \cdot \sin(\phi) \cdot \Delta t $$ $$ \phi_{new} = \phi_{old} + \omega \cdot \Delta t $$ 此过程即所谓的航迹推算 (Dead Reckoning),它是轮式里程计的核心功能之一[^1]。 #### 4. **误差分析与补偿** 尽管理论模型简洁明了,实际应用中不可避免存在累积误差。主要来源包括但不限于滑移效应、地面不平整等因素引起的偏差。因此,在 SLAM 系统中通常会结合其他传感器(如激光雷达)的数据对里程计的结果进行校正[^3]。 ```python import numpy as np def compute_odometry(delta_theta_left, delta_theta_right, wheel_radius, axle_length, dt): """ 计算轮式里程计的位姿变化 参数: delta_theta_left(float): 左轮角度变化(弧度) delta_theta_right(float): 右轮角度变化(弧度) wheel_radius(float): 轮子半径(m) axle_length(float): 轴距(m) dt(float): 时间步长(s) 返回: tuple: 新的位置(x,y),方向(phi)(m,m,radian) """ # 计算线速度和角速度 linear_velocity = 0.5 * wheel_radius * (delta_theta_left + delta_theta_right) angular_velocity = (wheel_radius / axle_length) * (delta_theta_right - delta_theta_left) # 更新位姿 phi_new = angular_velocity * dt dx = linear_velocity * np.cos(phi_new) * dt dy = linear_velocity * np.sin(phi_new) * dt return dx, dy, phi_new ``` ### 结合SLAM的应用场景 在 SLAM 中,轮式里程计作为初始估计提供粗略轨迹,而高精度传感器则负责修正这一路径上的偏误。例如,通过优化算法调整里程计内部参数(如轮距和轮半径),从而提高整体系统的鲁棒性和准确性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值