之前一直不知道odom,map到底是什么关系,看了这个博客:https://blog.csdn.net/u012686154/article/details/88174195 才了解了一些。这边记录我自己的看法,看下是否正确:

1 ROS中map,odom坐标系的理解

我想解决的问题是:计算出小车在真实世界(这个坐标系称为map)的位置

我可以得到的数据:

gazebo的传感器(比如 libgazebo_ros_diff_drive.so)会在/odom topic下面发布小车在map坐标系的坐标。但是这个坐标只是根据传感器得到的,gazebo无法保证它是正确的。

于是新增了一个概念:odom坐标系。意思是gazebo本来计算的是小车在map上的坐标,但是这个这个坐标和真实值有偏差,因此把该坐标看成小车在odom坐标系上的坐标,然后odom坐标系相对于map有相对偏差。

坐标变换从base_footprint->map 变化为了:base_footprint->odom->map

2 odom坐标系的总结

  1. 只是一个概念上的坐标系,实际不存在
  2. 如果说完全相信传感器的数据,那么可以认为odom坐标系就是map坐标系
  3. 如何计算odom坐标系相对于map坐标系的位置:首先获得差速计推算出的小车坐标p,然后使用雷达再次估算小车的位置g(此时认为g比较准确,因此认为g就是小车在map上的坐标),那么差速计得到的坐标可以看成是小车在odom的坐标+odom相对于map的偏差,因此odom在map上的坐标就是p-g

3 acml和robot_pose_ekf的区别

先说下他们的共同点:

  • 都是可以估算出robot在map上的位置。
  • 虽然它们都会在某个topic发布小车的坐标,并且发布一个tf变换。tf变换可以看成一个特殊的topic,里面说明了两个坐标系的相对位置。在实际开发中,一般直接使用这个tf变换,而不是使用发布出来的坐标。

区别是:

  • acml估算的方法是输入雷达信号,然后直接算出位置。

  • robot_pose_ekf是通过将imu信号和原来里程计估算出来的坐标整合以后算出一个新的坐标。

  • 真正计算坐标的位置,更多是通过坐标变换进行的

    • acml发布了一个map到odom的变换,
    • robot_pose_ekf发布了一个odom到base_footprint的变换

比较让人困惑的是:acml应该只是知道base_footprint到odom的坐标,它怎么知道map到odom的坐标的?

我的理解是,acml觉得自己准确率非常高,因此把自己计算出的坐标当成了map上的坐标,而通过获得base_footprint到另一个坐标系的坐标,就可以获得该坐标系到map的坐标了。现在这个坐标系被称为了odom而已。

amcl能否和robot_pose_ekf一起使用?

我的理解是可以。理论上来说,因为robot_pose_ekf算出了odom到base_link的变化,而amcl计算出的odom到map的变化其实是通过map到base_link变化得到的,(base_link->map)表示base_link相对于map的坐标,那么有:

(base_link->map) = (base_link->odom) + (odom->map)

而acml计算的odom->map:

(odom->map) = (base_link->map) - (base_link->odom)

把它代入上面,发现算出来的还是acml计算出的base_link对于map的坐标,而base_link到odom的坐标不管是什么都不会产生影响。

但是实际上来说,很多包可能会用到odom坐标系,如果说不太相信里程计的话还是使用一下amcl比较好。

下面是详细解释:

从acml的描述可以看出来:

amcl transforms incoming laser scans to the odometry frame (~odom_frame_id). So there must exist a path through the tf tree from the frame in which the laser scans are published to the odometry frame.

The drawing below shows the difference between localization using odometry and amcl. During operation amcl estimates the transformation of the base frame (~base_frame_id) in respect to the global frame (~global_frame_id) but it only publishes the transform between the global frame and the odometry frame (~odom_frame_id). Essentially, this transform accounts for the drift that occurs using Dead Reckoning. The published transforms are future dated

我的理解是:acml和GPS差不多,根据雷达信息可以直接估算出机器人在map上面的坐标。但是acml提供了一个功能,就是可以指定一个别的坐标系,它帮你把map上的坐标转为该坐标系相对于map的坐标。这个坐标系一般是指定为odom。

4 小车漂移的解决方法

我的现象:小车在运动过程中一会儿飘过来,然后突然飘回去。

一开始我觉得可能是odom不准,后来把里程计坐标直接看成map上的坐标,发现小车不再飘了。于是发现是gmapping发布的map到odom的坐标不准。如果说遇到这种情况,可以按照下面的步骤排除:

  1. 如果说用的是差速计控制的小车,可以去网上找一份键盘控制小车的代码
  2. 让小车原地转圈
  3. 如果说小车原地转圈也会飘一定不是里程计的问题。事实上,如果开的不太远,里程计应该是非常准的

解决方法:

  1. 里程计不准可以使用robot_pose_ekf
  2. gmapping不准可以直接放弃使用gmapping发布坐标,完全相信里程计。就是里程计直接发布map到base_footprint的tf变换
  3. 如果是场景非常空旷,可以在场景中加入一些障碍物,不然雷达不会起效
  4. 可以把gmapping的miniScore改的小一点,甚至是负数。因为雷达在空旷的地区置信度为0,而出现一些小的障碍物就会导致置信度>0,转而使用雷达。而我们希望多使用差速计。

ROS中map,odom坐标系的理解以及acml和robot_pose_ekf的对比和小车漂移方法解决相关推荐

  1. ROS中base_link, odom, fixed_frame, target_frame和虚拟大地图map的关系

    前面已经介绍了如何使用URDF建造机器人小车并显示在Rviz的仿真环境里面,但是小车是静止的.下面介绍如何让它在Rviz里面动起来,并理清URDF,TF 和 odom 的关系. 1. ROS中base ...

  2. ROS中map、odom、base_link坐标系的理解和这三个坐标系在AMCL中的关系

    学了ROS快一年了,依旧对map坐标系.odom坐标系.base_link坐标系之间的关系不是很清晰,这段时间下定决心要捋清楚他们之间的关系. map坐标系:地图坐标系,是一个固定的坐标系: base ...

  3. ros中Odom话题与odom坐标系的理解

    odom话题发表的是odom坐标系到base_link之间的转换关系,以及机器人的速度.其中base_like是机器人本体坐标系,与机器人中心重合,所以odom坐标系到base_link之间的转换关系 ...

  4. odom坐标系的理解

    ROS中基本坐标系的理解:map,odom,base_link,base_laster 1.map 地图坐标系,顾名思义,一般设该坐标系为固定坐标系,一般与机器人所在的世界坐标是重合的. 2.base ...

  5. 对于目标检测中mAP@0.5的理解

    文章目录 前言 mAP@0.5 AP是Precision-Recall Curve(PRC)下面的面积!!! 理一下思路 参考 前言 一直不是很理解目标检测中的mAP是如何的,今天具体来写一下,加深一 ...

  6. ROS语音交互系统_(3)ROS中接入图灵机器人语音理解系统

    前言 图灵机器人官网 1.提前安装依赖包 $ sudo apt install libcurl3 libcurl4-oppenssl-dev $ sudo apt install libjsoncpp ...

  7. ROS中阶笔记(七):机器人SLAM与自主导航—SLAM功能包的使用

    ROS中阶笔记(七):机器人SLAM与自主导航-SLAM功能包的使用 文章目录 1 机器人必备条件 1.1 硬件要求 1.2 深度信息 1.2.1 激光雷达 1.2.2 kinect 1.3 里程计信 ...

  8. java8 flatmap与map_java8中map和flatMap区别

    1.函数定义比较 map注释: /** * Returns a stream consisting of the results of applying the given * function to ...

  9. ROS中odom、map坐标系的理解

    学ROS大半年了,之前一直没搞明白odom和map,今天重新查资料看博客加自己思考才真正理解了.深深怀疑自己的理解能力... 此处参考了https://blog.csdn.net/flyinsilen ...

最新文章

  1. Ubuntu10.10 配置ssh服务器及samba服务器
  2. 关闭linux远程桌面,[Linux]Ubuntu 16.04 远程桌面(简单暴力)
  3. java文件下载controller_Java Spring MVC 上传下载文件配置及controller方法详解
  4. Mac入门--Apache/Php/Mysql的开启关闭
  5. R语言学习笔记(九)聚类分析
  6. BigDecimal你遇见过哪些坑?
  7. SpringMVC大坑一枚:ContentNegotiatingViewResolver可能不利于SEO
  8. Scala---Import子句详解
  9. 零基础学python还是c语言-学习python还是c语言?
  10. iphone GCDAsyncSocket 详解
  11. rabbitmq注意事项
  12. alisql安装教程
  13. SQL Server2008详细安装步骤(超详细步骤)
  14. 安立公司推出CPRI RF 测量选件
  15. 李阳疯狂英语学习方法大全集-英语,单词
  16. IE无法打开网页的问题
  17. 阿里云薛冰洋:边缘云自动化测试解决方案—TestMaster
  18. 调css p 段落间距,CSS段落第一个文字空两格缩进text-indent 和 文字之间间距调整letter-spacing...
  19. spring-aop-@Aspect详细用法
  20. 来给罗永浩和王自如打个分(下)

热门文章

  1. 微信小程序中常见的 typeof cb == “function” cb(that.globalData.userInfo)
  2. java panel paint_在paintbrush类型的GUI中,java – paintComponent()和paint()和JPanel对Canvas
  3. CSV文件导入MATLAB并进行绘图
  4. AS3-45度角坐标转换
  5. 越南电子支付行业仍然落后于东南亚其他国家
  6. 使用ps制作社保照片
  7. 马云、阿里云和“云上贵州”的故事
  8. 爱普生机器人学习笔记01
  9. 时尚创意孟菲斯风格PPT模板
  10. 【PCB专题】芯片比较大的焊盘,开钢网时都要设计成不同数量的小格吗?