week49 odometry
我们该如何获得里程计呢?
里程计包含2 个方面的信息:
1是位姿(位置和转角),即(x,y,θ)
2是速度(前进速度和转向速度)。
一、采用编码器电机来获取
二、采用ROS里的package : laser_scan_matcher
首先讲一下laser_scan_matcher 这个包,这个包能根据/scan 数据发布2D位姿的数据, 我们是否可以根据2D位姿数据来转换成表示位置的下x,y, z 以及表示姿态的四元数。理论上是可以的。
速度的获取:还是根据2D位姿和时间变量,来计算前进速度和转向速度。2D位姿数据包含:float64 x, float64 y, float64 theta,根据dt 时间里dx,dy,dtheta, 就可以算出前进速度,和转向速度。如果2D位姿数据足够精准,基本都用不上陀螺仪校准。
整个移动机器人的控制结构如下图所示,其中base_controller节点将订阅的cmd_vel信息通过串口或其它通信接口发送给下位机(嵌入式控制板)。下位机中根据机器人运动学公式进行解算,将机器人速度转换为每个轮子的速度,然后通过CAN总线(或其它总线接口)将每个轮子的转速发送给电机驱动板控制电机转动。电机驱动板对电机转速进行闭环控制(PID控制),并统计单位时间内接收到的编码器脉冲数,计算出轮子转速。
对于众多机器人应用来说,自定位以及基于航位推测(Dead-reckoning, DR)估计的里程计信息是非常重要的。一般来说,要设计一个有效的里程计系统是十分困难的。
一、惯性导航单元(Inertial Measurement Unit, IMU)
一般来说,IMU主要由加速度计和陀螺仪构成(有的时候还会加上磁力计),可以相应获取加速度,角速度以及方位角等信息(事实上还可以通过积分获得位移信息,但是误差很大)。
IMU提供带有噪声和偏差的量测,利用上述信息,可以确定IMU的方位(orientation) 、位置(position)、以及速度(velocity)
二. (差分)轮式里程计
误差来源:
(1) 积分时有限的分辨率;
(2) 不同的车轮直径;
(3) 轮子接触点发生变化;
(4) 非均匀的地面接触以及不同位置变化的摩擦系数导致打滑;
关于错误的消除:
确定的误差可以通过合适的标定(calibration)消除;
非确定的误差需要通过误差模型进行描述,这将导致非确定的位置估计结果。
Gmapping本身依赖的是底盘运动模型解算出来的里程计信息,我们应该先弄清楚里程计需要提供的是什么数据,里程计无非是需要(x,y,θ) x,y可以根据运动模型解算得到,既然能解算得到x,y,那么θ也能通过运动模型得到,但是光靠运动模型解算出来的数据,现实机器人总会引入大量的噪声,如果对底盘解算的数据没有信心,可以将通过IMU得到的θ替换掉里程计的θ作为Gmapping的输入,以提供精确的姿态角,同理x,y也可以通过激光雷达解算得到,也可以将这数据作为里程计(x,y)的输入
但电机不行,编码器不行,轮子打滑,底盘不稳,程序解算写得不行,都有可能会影响到立里程计(x,y,θ),结果就是建图不精准,可能出现地图重叠,建图时机器人位姿偏移等现象,我们需要想办法尽可能提供精确的里程计数据(x,y,θ)