map、odom、base_link和base_laser坐标系

1、map坐标系

在构建地图时,机器人构建地图的起点位置就是map坐标系的位置。在导航节点,当加载地图时,map坐标系就确定了。 map坐标系一旦固定,就不会再变。

map:地图坐标系,为固定坐标系,理论上应与odom坐标系重合。一般与机器人所在的世界坐标系一致。

2、odom坐标系

由于器件、结构等方面的原因,通过运动反馈获得的里程信息会出现误差累计的问题,为消除累计误差,引入了odom坐标系。

运动反馈一直更新的是odom–>base_link,即base_link在odom坐标系下的坐标。至于误差累计则是通过定位模块amcl纠正,也就是修改map–>odom,odom在map坐标系下的坐标,以此达到消除累计误差。

odom:里程计坐标系,不是固定的坐标系,是可以运动的。odom相当于是根据实际计算得到的坐标和真实坐标之间的变换虚拟出来的一个坐标系。

问题:odom坐标系原点是怎样确定的?随着机器人的运动,odom坐标系会不会发生变化?

odom和map坐标系是不是重合的?
可以很肯定的告诉你,机器人运动开始是重合的。但是,随着时间的推移是不重合的,而出现的偏差就是里程计的累积误差。

机器人开始运动时map与odom重合,但随着时间推移两者的tf不为0。

总结:odom坐标系的原点就是机器人上电时所处的位置,所以在建图时odom坐标系和map坐标系是重合的,后面随着建图的进行,由于误差存在,odom坐标系和map坐标系会慢慢偏离。 而导航时,机器人起始位置一般不会与建图时的起始位置完全相同,而map坐标系是始终不变的,所以在导航开始时,odom坐标系和map坐标系一般都不是重合的。

3、base_link坐标系

base_link坐标系是用于表示机器人本身位姿的坐标系,其始终与机器人本体保持一致。机器人的定位问题最本质的就是求出base_link在map坐标系下的坐标和姿态。

base_link坐标系原点一般为机器人的旋转中心,base_footprint坐标系原点为base_link原点在地面的投影,有些许区别(z值不同)。

4、base_laser坐标系

base_laser:激光雷达的坐标系,与激光雷达的安装点有关,其与base_link的tf为固定的。

5、总结

tf树中只有一种遍历关系–从父节点到子节点,如下图所示。
在这里插入图片描述
SLAM中的定位就是为了计算tf: map->odom

(1)机器人的定位问题最本质的就是求出base_link在map坐标系下的坐标和姿态。
(2)SLAM中的定位就是为了计算tf: map->odom。

问题:机器人定位到底是什么?

Karto SLAM中的代码,根据上述的遍历关系,是先计算base_link->odom,再计算odom->map再用.inverse()计算map->odom。如以下代码。

// Compute the map->odom transform
  tf::Stamped<tf::Pose> odom_to_map;
      
  m_.lock();
  tf::Stamped<tf::Pose> odom_pose = odom_pose_;//base_link->odom
  m_.unlock();

  tf_.transformPose(odom_frame_, tf::Stamped<tf::Pose>(tf::Transform(tf::createQuaternionFromRPY(0, 0, corrected_pose.GetHeading()), 
                    tf::Vector3(corrected_pose.GetX(), corrected_pose.GetY(), 0.0)).inverse(), odom_pose.stamp_, base_frame_), odom_to_map);

  map_to_odom_mutex_.lock();
  map_to_odom_ = tf::Transform(tf::Quaternion(odom_to_map.getRotation()),
                               tf::Point(odom_to_map.getOrigin()))
                              .inverse();
  map_to_odom_mutex_.unlock();

amcl定位模块:amcl使用粒子算法,通过激光点与地图匹配,首先求出map–>laser,laser在map下的位姿,然后根据已知的base_link–>laser,odom–> base_link,计算出map–>odom。

AMCL就是修正里程计本身存在的误差,是通过补偿(或者是说改变) map->odom 之间的关系来是实现的。 “AMCL 校正里程计自身的累计误差”

参考链接:
[1] https://www.jianshu.com/p/1dc8dea89413
[2] https://blog.csdn.net/u013110200/article/details/84249072
[3] https://blog.csdn.net/flyinsilence/article/details/51854123
[4] https://blog.csdn.net/qq_39779233/article/details/105323770

  • 14
    点赞
  • 123
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值