什么是里程计?为什么需要里程计?
里程计是衡量我们从初始位姿到终点位姿的一个标准,通俗的说,我们要实现机器人的定位与导航,就需要知道机器人行进了多少距离,是往哪个方向行进的
这里我举个例子,gmapping导航建图包里建图需要里程计信息,且导航也需要。
hector建图呢有个缺点,如果雷达不够精确,那么建出来的图会导致定位不够精确,这是我们不期望的,所以要实现精确的定位与导航,需要加入里程计信息
ROS gmapping导航包,要求有2 个 输入,一个是激光数据,另一个就是里程计信息。
那么我们该如何获得里程计呢?
里程计又包含2 个方面的信息:
一、是位姿(位置和转角),即(x,y,θ)
二、是速度(前进速度和转向速度)。
那么问题来了,这些数据我们该如何获取呢????
参考:
http://blog.csdn.net/feixin620/article/details/78573893
http://www.ncnynl.com/archives/201703/1416.html
里程计信息的数据获取的途径,我从几篇文章里总结得到的结果是:
一、采用编码器电机来获取
二、采用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位姿数据足够精准,基本都用不上陀螺仪校准。
编码器我们参考,并且引用了这位博主的文章:https://www.cnblogs.com/21207-iHome/p/8066135.html
在文章已经指出我们底层的框架图:
整个移动机器人的控制结构如下图所示,其中base_controller节点将订阅的cmd_vel信息通过串口或其它通信接口发送给下位机(嵌入式控制板)。下位机中根据机器人运动学公式进行解算,将机器人速度转换为每个轮子的速度,然后通过CAN总线(或其它总线接口)将每个轮子的转速发送给电机驱动板控制电机转动。电机驱动板对电机转速进行闭环控制(PID控制),并统计单位时间内接收到的编码器脉冲数,计算出轮子转速。
详细请跳转页面:
ROS里程计之STM32底层编码器(一)
http://blog.csdn.net/zhu751191958/article/details/79322140
ROS里程计之STM32底层编码器(二)
http://blog.csdn.net/zhu751191958/article/details/79322233