一文看懂map、odom、base_link、laser之间的tf关系

这三者之间的关系到底是怎样的?尤其是map坐标系到odom坐标系之间的变换,到底是有什么意义呢?我当时被这个问题也是困扰了很久。现在经过实践终于有机会记录一下拙见,如有错误,还请指正!
这张经典的图大家都见过吧,已经不知道被偷了多少遍了🤣浅浅的手画了几张图,来说明一下几者的关系。
经典图片

首先说一下这三个坐标系分别是什么,再来解释变换关系。

  • map_frame
    顾名思义,指地图坐标系。也就是你开map_server让他去发布的那个地图。 在map.yaml可以指定map坐标系的原点。 map坐标系是固定的,永恒不变的,相当于数轴。一般来说,定位的需求就是要返回在map坐标系下的坐标。

  • 里程计是什么?
    机器人通过读取轮子上每个电机的编码器数据,能够实时得知轮子当前的运动状态。由四个轮子的运动数据可以解算出当前的运动速度,由陀螺仪可以得知当前角度。那么你想,有了当前速度和角度,是不是能计算出,在dt时间内车子的位移?累积起来是不是就是开机之后的总位移?

注意,上面说的用imu算出的是位移。我们假设机器人每时每刻能够返回一个(x,y),也是一直积分得到的数字。你想,你开机没有动机器人的时候,是不是(0,0)?如果理想情况下,xy方向各自移动1m后,里程计返回的是不是(1,1)?但是现实情况下,轮式里程计难免会有打滑的情况。如果误差在10%的话,他的里程计返回的是不是(0.9,0.9)?

然后这里就是重点!你的机器人是不是以为你在xy方向各自移动了0.9米?但是事实上,你如果令机器人沿xy方向回退0.9米,你会发现机器人并没有回到原点,对吧?但是这个时候里程计已经清零了,机器人以为已经回到了一开始出发的位置。但是其实并没有。所以,由此可以引入里程计坐标系。

  • odom_frame
    以下是我个人理解的定义(为了方便理解,与实际定义略有偏差):
    机器人因为打滑,你按照里程计得到的数据往回走,即使把里程计清零,也并不能返回到原来的出发点。把里程计走到清零那个点称作目前里程计坐标系的原点。
    里程计坐标系的误差产生

也就是说,里程计座标系其实是一直在变的,因为轮式里程计的误差是不可预知的、积累的。你即使让他把现在的里程计清零,他在返回的时候仍然会累积误差。

map->odom这么一个坐标系变换,或者说两个原点之间的向量,其本质其实是描述了你里程计的累积误差。你里程计归零了,但是你在地图上的坐标系并不是原来启动的位置,那么中间的差不就是你里程计的累积误差吗?这个累计误差在实际工程中是由amcl节点计算并发布,不需要你去计算。

  • base_link
    就是机器人坐标系,或者叫车体坐标系。把车体抽象为一个质点,这个质点所在的位置就是机器人坐标系的原点。在rviz里面可以调出来看到。说白了其实就是你机器人现在所在的位置。

  • odom->base_link
    思考一下,这么一个坐标系变换描述的是什么呢?首先你要明确,这个是谁发布的?

答:是你的里程计发布的。他描述的就是:在你的机器人里程计看来,从原点走了多远?

需要注意的就是,他是机器人通过里程计得到的数据,是有误差的。这个误差也就是由map->odom描述。

  • laser_link
    无论你的机器人是人形机器人还是方形机器人,你的激光雷达总不可能正好装在机器人抽象成的质点中心上吧?一般来说都装在前面或者是开阔的位置。那么他是不是和你机器人的实际中心有一个差别?base_link->laser_link描述的就是因为机器安装所导致的两者不重合的位移向量。一般都是机械建模软件里就可以得到。如果你精度要求不高的话,也可以用尺子去量。

总结一下:
总结图

说了这么多,那机器人究竟是怎么获知自己在地图坐标系下的位置呢?很简单,map->odom由amcl计算并发布,而你又发布了odom->base_link,一个函数不就算出了map到base_link了吗?

从思想的角度来说,其实就是你里程计有一个累积误差,而map->odom这个误差啊,由amcl计算出来,然后在你实际算TF变换的时候,把你里程计的累计误差给抵消掉。

为了方便理解,上面的语言都不是很精确,我本人也很讨厌那种根本叫人看不懂的文章,当时走了很多弯路,浪费了很多时间(甚至间接的导致我挂了几门课哈哈)

鄙人没有系统学过这些东西,都是大二做比赛的时候实际理解的,才疏学浅,妄言拙见,恳请大佬留言指正!看懂的话麻烦点一个免费的赞!

  • 20
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
【资源说明】 1、该资源包括项目的全部源码,下载可以直接使用! 2、本项目适合作为计算机、数学、电子信息等专业的课程设计、期末大作业和毕设项目,作为参考资料学习借鉴。 3、本资源作为“参考资料”如果需要实现其他功能,需要能看代码,并且热爱钻研,自行调试。 基于ROS的激光雷达+小车+IMU的SLAM建图、定位、路径规划c++实现源码+项目说明.zip # 单线激光雷达SLAM建图与路径规划 使用的硬件:autolabor pro1小车、小觅双目相机(S1030标准版本)、IntelNUC迷你主机、显示器、2D激光雷达 Delta-1A 使用的软件:ubuntu 16.04 LTS、ROS-kinetic、小觅驱动、autolabor pro1小车驱动、Delta-1A驱动、VINS-Fusion算法、ROS-navigation导航包、gmapping建图算法、cartographer_ros建图算法 ## tf介绍 tf变换:map(地图坐标系)-->odom(里程计坐标系)——>base_link(小车基座坐标系)——>传感器坐标系(lidar、camera) ---- map-->odom 由建图算法提供 ---- odom --> base_link 由小车驱动提供 ---- base_link --> 传感器坐标系 根据传感器在小车上安装的位置确定,使用static_transform_publisher静态坐标转换来设置 所需传感器数据类型: sensor_msgs/LaserScan 使用Delta-1A驱动发布的雷达扫描话题,话题名:/scan 所需里程计信息数据类型:nav_msgs/Odometry 使用autolabor pro1发布的里程计,话题名:/wheel_odom ## 建图 采用gmapping与 cartographer_ros建图算法分别进行建图 ### gmapping建图:(雷达+小车) 打开终端,执行如下指令: $ cd ~/catkin_ws_lidar_slam/ $ source devel/setup.bash $ roslaunch autolabor_box_launch create_map_gmapping.launch ####打开小车urdf模型、驱动、键盘控制节点、打开雷达驱动、打开gmapping节点、打开rviz可视化节点 ####此时使用键盘的上下左右键控制小车移动,开始建图 ####建图完成后,开启新的终端执行如下指令,保存地图: $ rosrun map_server map_saver -f map_name ####保存地图 map_name为保存地图的名称,运行结果,会生成2个文件,后缀名分别为 .pgm .yaml ### cartographer_ros建图:(雷达+小车) ##打开终端,执行如下指令: $ cd ~/catkin_ws_lidar_slam/ $ source devel/setup.bash $ roslaunch autolabor_box_launch create_map_cartographer.launch ####此时使用键盘的上下左右键控制小车移动,开始建图 ####建图完成后,开启新的终端执行如下指令,保存地图: $ rosrun map_server map_saver -f map_name ......
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值