ROS中map、odom、base_link坐标系的理解和这三个坐标系在AMCL中的关系
学了ROS快一年了,依旧对map坐标系、odom坐标系、base_link坐标系之间的关系不是很清晰,这段时间下定决心要捋清楚他们之间的关系。
map坐标系:地图坐标系,是一个固定的坐标系;
base_link:机器人本体坐标系,一般和机器人的中心重合,会随着机器人的运动而运动;
odom坐标系:里程计坐标系,不是固定的坐标系,是可以运动的。odom相当于是根据实际计算得到的坐标和真实坐标之间的变换虚拟出来的一个坐标系(原因见下面的举例说明)。
一、前提说明:
首先先明确一点,我们计算移动机器人走了多远,是根据编码器信息(也就是里程计数据)来获得的。
在起始位置,机器人静止,
- 在map坐标系下实际位置是0;
- 此时里程计数据也是0,所以根据里程计数据计算得到的运动距离是0,计算得到的机器人位置也在0位置。
所以,在起始位置时,map坐标系和odom坐标系是重合的(注意map坐标系是固定的坐标系,odom坐标系是可以运动的坐标系)。
二、举例说明:
为了简单起见,我们在一维的情况下进行举例讨论。
假设机器人在t=0时刻从起点x=0处开始运动,一段时间t时刻后到达某一位置A点(x=7m);在这段时间内,利用里程计数据计算得到机器人运动了10m(只能利用里程计数据来计算距离,然后得到现在的位置),但是实际在地图中,机器人的实际位置是x=7m(A点)。
所以计算的坐标和真实坐标之间出现了偏差。但是在ROS中换了一个说法,不说计算得到的坐标在map坐标系中漂移了3m,而是说是odom坐标系相对于map坐标系漂移了3m。具体看下图:
所以,base_link坐标系相对于map坐标系的真实位置是7m,odom坐标系相对于map坐标系的漂移是 -3m(也就是map坐标系相对于odom坐标系的漂移是 3m),计算出来的base_link坐标系相对于odom坐标系的距离是10m ,因此 10m= 7m+3m;
当然使用IMU作积分来计算里程计信息,会随着时间的累积,IMU会产生累积误差,和上面的编码器来计算里程计信息产生误差是一样的情况。
所以odom相当于是根据实际计算得到的坐标和真实坐标之间的变换虚拟出来的一个坐标系。
这里引用ros官网资料上面的一个图:
Relationship between Frames
(The map frame is the parent of odom, and odom is the parent of base_link. Although intuition would say that both map and odom should be attached to base_link, this is not allowed because each frame can only have one parent.)
map坐标系是odom的父坐标系,odom是base_link的父坐标系。尽管直觉会说map坐标系和odom坐标系都应该连接到base_link坐标系,但这是不允许的,因为每个坐标系只能有一个父坐标系。
三、AMCL定位中的坐标系关系:
对于上图上半部分Odometry Localization ,纯粹的里程计定位,它是直接根据里程计信息,来计算出base_frame 和odom_frame 之间的偏移,这种情况一般是默认map坐标系和odom坐标系始终是绑在一起的,始终是重合的。所以会有累积误差,随着里程计的增加,它往往会偏差越来越大,越漂越远。
对于上图的下半部分的AMCL,它是通过比对 当前的地图 与 激光雷达检测到的环境地图,来自己的位置进行一个修正,这个修改正就体现在 odometry drift,把之前的运算得到的漂移补到 map_frame 和 odom_frame 两个坐标系之间。这就是AMCL的作用(SLAM里面也有map_frame 和 odom_frame 两个坐标系之间 这样的修正)。
参考链接:
[1] ROS里基本坐标系的理解:map,odom,base_link,base_laser https://blog.csdn.net/flyinsilence/article/details/51854123
[2] ROS中odom、map坐标系的理解 https://blog.csdn.net/u012686154/article/details/88174195
[3] amcl http://wiki.ros.org/amcl
ROS中map、odom、base_link坐标系的理解和这三个坐标系在AMCL中的关系相关推荐
- ROS:坐标系之间的关系 (map \ odom \ base_link)
ROS:坐标系之间的关系 (map \ odom \ base_link) 在使用ROS进行定位与导航操作时,会伴随着各种坐标系,并且每种坐标系都有明确的含义,ros中定义了常见的坐标系,并且所有的坐 ...
- 移动机器人平台的坐标系---map,odom,base_link
文章目录 本问学习记录移动机器人的坐标系 https://blog.csdn.net/w383117613/article/details/46006991
- java中的工厂模式_深入理解Java的三种工厂模式
一.简单工厂模式 简单工厂的定义:提供一个创建对象实例的功能,而无须关心其具体实现.被创建实例的类型可以是接口.抽象类,也可以是具体的类 实现汽车接口 奔驰类 宝马类 简单工厂,既能生产宝马又能生产奔 ...
- 【数据结构】理解二叉树的三种遍历--前序、中序、后序 +层序(简明易懂)
一.易懂的形象理解 其实从名字就可以很好的理解这三种遍历,我在第二点时候说,但是估计能翻到我的文的同学们之前肯定看过好多类似的了,那咱们换个思路~ 先用我想的一种简单易懂的形象思维理解一下前序.中序. ...
- linux 脚本map,shell中map的用法
##实例代码 #!/bin/bash cat ./switchsql.txt | while read line do tmp_partition_name=`echo $line | awk -F ...
- Scala中lazy关键字的使用和理解
Scala中lazy关键字的使用和理解 转载声明: 本文转自 Scala中lazy关键字的使用和理解 作者:br0x 转载仅为方便学习查看,一切权利属于原作者,如果带来不便请联系我删除. Scala中 ...
- C++中各种智能指针的实现及弊端(三)
C++中各种智能指针的实现及弊端(三) 文章目录 C++中各种智能指针的实现及弊端(三) 一: std::unique_ptr 二.**std::unique_ptr的缺陷** 一: std::uni ...
- ROS中map,odom坐标系的理解以及acml和robot_pose_ekf的对比和小车漂移方法解决
之前一直不知道odom,map到底是什么关系,看了这个博客:https://blog.csdn.net/u012686154/article/details/88174195 才了解了一些.这边记录我 ...
- ros中Odom话题与odom坐标系的理解
odom话题发表的是odom坐标系到base_link之间的转换关系,以及机器人的速度.其中base_like是机器人本体坐标系,与机器人中心重合,所以odom坐标系到base_link之间的转换关系 ...
最新文章
- 升级失败?用TFTP修复Linksys无线路由器固件
- idea配置jfinal_Jfinal 项目在idea上创建
- 利用Fiddler模拟POST请求
- 【Python】字符转换为 ASCII 码
- 【CyberSecurityLearning 78】DC系列之DC-9渗透测试
- Spring 自定义注解使用案例 首先创建一个注解@interface
- Python对Excel的读操作(完成)
- C++11 并发指南六(atomic 类型详解一 atomic_flag 介绍)
- Neginx服务搭建
- 计算机视觉算法岗面经,2019秋招资料
- Android Launcher 应用开发
- 抛弃clover,爱上QTTabBar
- oracle failover mode,Oracle RAC FailOver配置
- M1 MacBook使用IE浏览器解决兼容问题
- keras进行时间序列预测
- 数学建模国赛2022C解题分享
- 14. Setting Ta and RTO【设置Ta和RTO】
- 视频批量添加透明水印,必须用这个方法
- 两台电脑串口传输文件及调用opencv库编程显示图片和文本
- 【OpenCV】cv::Mat位深和通道,CV_8UC1等
热门文章
- Lambda表达式表达式树
- 《职来职往》里的经典语录,总有一句震惊到你!
- 7. Applepay 解码实操-golang
- 传智播客西安中心之Android课程大纲
- pytracking的kys报错spatial_correlation_sampler_backend.cpython-37m-x86_64-linux-gnu.so: undefined symbo
- k8s修改默认命名空间
- 计算机黑屏跳横杠,电脑开机时黑屏左上角显示一个横杠是怎么回事
- mysql 登录错误 ERROR 2002 (HY000)
- 使用 Cloud Insight SDK 监控北京空气质量!
- 计算机中丢失swr.dll,win10系统提示模块initpki.dll加载失败如何解决