这里没有代码和公式的解读,只是通俗的讲一下最基本的原理,如果有不正确的地方欢迎指正
基础知识
TF坐标变换
机器人系统上,有多个传感器,如激光雷达、摄像头等,有的传感器是可以感知机器人周边的物体方位(或者称之为:坐标,横向、纵向、高度的距离信息)的,以协助机器人定位障碍物,可以直接将物体相对该传感器的方位信息,等价于物体相对于机器人系统或机器人其它组件的方位信息吗?显示是不行的,这中间需要一个转换过程。更具体描述如下:
这就需要坐标变换 tf:TransForm Frame,坐标变换
坐标系是通过右手坐标系来定义的
传感器
雷达 /scan
惯性传感器 /IMU
里程计 /Odom
导航框架
-
全局地图
-
自身定位
-
路径规划
-
运动控制
-
环境感知
AMCL
自适应蒙特卡洛定位
AMCL的作用是估计机器人在地图上的位置,也就是将机器人从odom
坐标系转换到map
坐标
使用单位区间内的粒子数,表征事件发生的概率。根据选定的评估方程推算时间的置信程度,每个粒子代表机器人的方向和位置
-
生成初始的粒子
-
以当前置信度为起点使用粒子
-
从里程计模型里面采样,预测粒子位姿。更新后粒子更加分散(里程计有误差)
-
更新粒子的位姿。当接收到测量数据(比如/scan)后,通过测量模型,将测量数据放到各个粒子的位姿下,判断测量数据发生的可能性,以这个可能性来更新粒子的权重。计算激光测量的端点与地图最近障碍物的距离,距离越小激光测量数据发生的可能性越大,粒子的权重越大。
-
重采样 如果打开了有选择重采样,程序会判断粒子集合权重的方差,方差越大有效的粒子越小,粒子退化越严重,此时则需要进行重采样,否则可以跳过此步骤。一般情况下权重较小的粒子将被过滤掉,权重较大的粒子将被复制
-
将重采样后的粒子放入直方图中 将重采样后粒子的位姿,放入到对应的直方图中。其中,直方图内粒子的数量越多,直方图的颜色越深,代表该直方图的权重越大。
(颜色越深权重越大)
(颜色越深粒子数越多)
当车移动到一个未知的区域或,会随机在这个区域内增加粒子数
将IMU的数据转换成Odom数据,作为定位滤波时的参考数据
TF树为坐标变换提供了一个实时更新的框架,使得所有的数据都可以转换到一个共同的坐标系中,例如map
/Odom
tf关系map–>odometry–>base_link
需要确定机器人在地图中移动的距离所以有odometry->base_link
的tf广播。
odom的原点是机器人启动的位置,但是不知道它在地图上的相对位置,AMCL
可以根据最佳粒子的位置推算出map->odom
map在地图中是不动的,odom
代表的是机器人启动点的位置,随着机器人移动,odom坐标系中的
base_link。但是如果有误差比如轮子打滑,里程计显示走到了A点,但是AMCL融合其他传感器的数据,推算出小车在B点,里程计数据更新,就产生了一个误差是这样吗
比如说我现在算出来了一个坐标X=10(odom-->base_link),但是这个位置的真实坐标应该是X'=2(map-->base_link),也就是说我计算的坐标和真实坐标出现了偏差。但是ROS在说的时候换了个说法,不说计算出来的坐标在map中漂了8,而是说是odom坐标系相对于map坐标系漂了8。所以此时base_link相对odom坐标是真实坐标x=2(因为odom坐标系短时间是准确的,如果是刚开始时odom和map重合,odom中的该坐标就是真实坐标);odom相对于map坐标是driftX=8(map-->odom);最后计算出来的base_link相对于map的坐标就是X=drixfX+X'=10了。
/scan
base_link-->laser
由底盘的位置可以直接确定laser的位置
雷达畸变
原理 激光雷达扫描是有周期的,激光雷达的一帧数据是一个周期的数据,只有一个时间戳,假设雷达扫描一周的时间为T,那么机器人在这段时间里运动X
$$
🔺Lmax=v*T
$$
但是最后数据封装的时候,会统一到第一束激光雷达发射点处,最后得到一个即便的数据
雷达数据帧率低,误差大,odom帧率在100HZ以上
/imu
它由三个单轴的加速度计和三个单轴的陀螺仪组成,加速度计检测物体在载体坐标系统独立三轴的加速度信号,而陀螺仪检测载体相对于导航坐标系的角速度信号,对这些信号进行处理之后,便可解算出物体的姿态。
move_base
这个包提供了一个基于actionlib的实现,即提供一个目标点,move_base会尝试通过全局以及局部的路径规划,让移动机器人移动到设定的目标点。
move_base维护了两种costmaps
,分别给全局、局部规划器用.给定一个目标,然后控制移动机器人走到目标点的功能。
机器人能连续移动是因为把取了很多点连成一条线