基于轮式编码器的里程估计

里程估计是通过传感器信息,递推的估计机器人的实时位置、姿态等信息的一类方法和技术。优势是计算量较小,实时性较好,但是存在误差累计问题。问题的核心是通过将当前时刻与前一个时刻的传感器信息进行对比,推断两个时刻的姿态增量和位置增量,然后通过累加或者积分的方式估计机器人的变化。
大致分成四种里程计估计:
1、运动里程计
2、激光里程计估计
3、视觉里程计估计
4、多传感器融合估计

(一)运动里程计
使用的编码器是轮式编码器和惯性测量单元。
1、轮式编码器里程估计
编码器将角位移转换成电信号,并进行转速测量,测量机器人运动速度和位置等。按照工作原理,编码器分为光电式、磁电式和触电电刷式。目前应用广泛的是光电式。光电式编码器由光栅盘和光电检测装置组成。按照信号原理分类,编码器分成增量式编码器和绝对式编码器两种。增量式编码器通过脉冲数来表示位移的大小。在开机后需进行寻零操作,同时由于误差累计的影响使得检测速度受到影响。绝对式编码器,编码盘中的每个角度对应一个数字码,再利用外部记圈器件进行位置纪录和测量。绝对式编码器开机无需寻零,没有累计误差,测量转速高,但是结构复杂,体积庞大,成本高。
光电式增量编码器的工作原理:光源透过光栏板照射光电原件产生周期性电信号,点信号通过整形电路将正弦波信号,转化成方波信号,进行脉冲信号的基数便可以计算转角和转速。
2、基于轮式编码器的里程计估计方案
以差分驱动移动机器人为例进行里程计估计方案的描述:首先根据编码器产生的脉冲数计算电动机或轮子的旋转圈数,然后根据轮子周长计算形式速度,最后根据运动速度积分计算里程变化。
(1)计算轮子的转速
n ( L ) = N ( L ) p ∆ t n(L) = \frac{N(L)}{p∆t} n(L)=ptN(L)
n ( R ) = N ( R ) p ∆ t n(R) = \frac{N(R)}{p∆t} n(R)=ptN(R)
其中,n(L)和n(R)为左右轮编码器的转速;N(L)和N(R)分别为左右轮编码器在∆t时间内的测得的脉冲数;p为编码器每转过一圈输出的脉冲数。
(2)运动速度计算
v(L)= n(L)πD
v®=n®πD
v = v ( L ) + v ( R ) 2 = n ( L ) + n ( R ) π D 2 v = \frac{v(L)+v(R)}{2} = \frac{n(L)+n(R)πD}{2} v=2v(L)+v(R)=2n(L)+n(R)πD
其中,D为移动机器人车轮直径;v(L)和v®分别是移动机器人左右轮的速度
(3)移动机器人里程计估计
请添加图片描述
轮式编码器双轮差分运动模型

基于以上定义,移动机器人的航向角变化量
θ ≈ s i n θ = d L = ( v ( R ) − v ( L ) ) ∆ t L θ≈sinθ = \frac{d}{L}= \frac{(v(R)-v(L))∆t}{L} θsinθ=Ld=L(v(R)v(L))t
圆弧运动的角速率
ω = θ ∆ t = v ( R ) − v ( L ) L ω = \frac{θ}{∆t}= \frac{v(R)-v(L)}{L} ω=tθ=Lv(R)v(L)
运动半径
R = v ω = L ( v ( R ) + v ( L ) ) 2 ( v ( R ) − v ( L ) ) R = \frac{v}{ω}=\frac{L(v(R)+v(L))}{2(v(R)-v(L))} R=ωv=2(v(R)v(L))L(v(R)+v(L))
因此,移动机器人在x和y方向上的位移变化量求得
∆x=R-Rcosθ
∆y=Rsinθ
为满足编码器测量精度要求,假设精度要求为0.01m,根据经验公式判断:
π D p ≤ 0.01 m \frac{πD}{p}≤0.01m pπD0.01m

  • 2
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
轮式里程计是通过车轮的旋转来估计车辆的位姿(位置和方向)的一种方法。在实际应用中,可以使用编码器来测量车轮旋转的角度和速度,并根据车轮的尺寸计算车辆的位移。下面是一个基于Python的简单的轮式里程计实现,假设我们有两个车轮,编码器的分辨率为1000个计数,车轮直径为0.5米。 ``` python import math class Odometry: def __init__(self): self.wheel_radius = 0.25 # 车轮半径 self.wheel_distance = 1.0 # 两个车轮之间的距离 self.encoder_resolution = 1000 # 编码器分辨率 self.last_left_ticks = 0 # 上一次左轮编码器计数 self.last_right_ticks = 0 # 上一次右轮编码器计数 self.x = 0.0 # x坐标 self.y = 0.0 # y坐标 self.theta = 0.0 # 方向角度 def update(self, left_ticks, right_ticks): left_distance = (left_ticks - self.last_left_ticks) * 2 * math.pi * self.wheel_radius / self.encoder_resolution right_distance = (right_ticks - self.last_right_ticks) * 2 * math.pi * self.wheel_radius / self.encoder_resolution distance = (left_distance + right_distance) / 2.0 dtheta = (right_distance - left_distance) / self.wheel_distance self.x += distance * math.cos(self.theta + dtheta / 2.0) self.y += distance * math.sin(self.theta + dtheta / 2.0) self.theta += dtheta self.last_left_ticks = left_ticks self.last_right_ticks = right_ticks ``` 在每个时间步骤中,我们可以通过读取左右轮的编码器计数来更新车辆的位姿。通过计算左右轮旋转的距离和角度差,就可以估计车辆的位移和方向。最后,将位移和方向分别加到车辆的x、y坐标和方向角度上,就可以得到车辆的新位姿。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值