ROS坐标系map,odom,base_link,base_laser

14 篇文章 1 订阅
11 篇文章 1 订阅

map

map坐标系是一个世界固定坐标系,其Z轴指向上方。相对于map坐标系的移动平台的姿态,不应该随时间显著移动。map坐标系作为长期的全局参考是很有用的,但是跳变使得对于本地传感和执行器来说,其实是一个不好的参考坐标。使用Gmapping建图时,建图起始点被设为map的原点(如下图)
在这里插入图片描述

base_link

机器人本体坐标系,与机器人中心重合,也有的成为base_footprint。图中中心所有箭头指向的位置是base_link,机器人启动后静止时,base_link的左边是odom,也就是黄线的另一端(图1的map对应的黄线)
在这里插入图片描述

odom

里程计坐标系(odom或者odom_combined),odom 坐标系是一个世界固定坐标系。在odom 坐标系中移动平台的位姿可以任意移动,没有任何界限。这种移动使得odom 坐标系不能作为长期的全局参考。然而,在odom 坐标系中的机器人的姿态能够保证是连续的,这意味着在odom 坐标系中的移动平台的姿态总是平滑变化,没有跳变。在一个典型设置中,odom 坐标系是基于测距源来计算的,如车轮里程计,视觉里程计或惯性测量单元。odom 坐标系作为一种精确,作为短期的本地参考是很有用的,但偏移使得它不能作为长期参考。

如图,是机器人向前移动了一段距离的坐标系,可以看出odom与base_link之间的距离增大了一些,但是继续向前移动时,他们之间的距离在一定范围变动。因为odom是通过传感器测量,然后经过某些算法的计算得到的系统的估计值。
在这里插入图片描述

自定义(传感器坐标系or其他)

如图,laser_link激光雷达的坐标系,激光雷达的安装点,其与base_link的tf为固定的(安装在底盘上的)。

wheel1_link,wheel2_link左右轮坐标系,同上
在这里插入图片描述
当机器人获得地图上的一个点(坐标系map)作为目标导航点,然后转换到odom坐标系下,传感器测量值读取转换到base_link(安装在机体上的器件与base_link存在固定的转换关系),base_link转换到odom

相关参考

https://www.ros.org/reps/rep-0105.html#id5

https://blog.csdn.net/qq_39203385/article/details/81518210

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要获取mapbase_link之间的机器人角度,可以使用ROS2中的tf2库。tf2库提供了一个TransformListener类,它可以订阅tf2变换,并提供了一些方法来查询和转换变换。 以下是获取机器人角度的步骤: 1. 创建一个TransformListener对象: ``` tf_buffer = tf2_ros.Buffer() tf_listener = tf2_ros.TransformListener(tf_buffer) ``` 2. 在机器人运行时,订阅tf2中的/map到/base_link变换: ``` try: trans = tf_buffer.lookup_transform('map', 'base_link', rospy.Time()) except (tf2_ros.LookupException, tf2_ros.ConnectivityException, tf2_ros.ExtrapolationException): rospy.logwarn("Failed to get transform from map to base_link") ``` 3. 从变换中获取机器人的角度: ``` roll, pitch, yaw = tf.transformations.euler_from_quaternion([trans.transform.rotation.x, trans.transform.rotation.y, trans.transform.rotation.z, trans.transform.rotation.w]) ``` 其中,roll、pitch和yaw是机器人在x、y和z轴上的旋转角度。 完整的代码示例如下: ``` import rospy import tf2_ros import tf rospy.init_node('tf_listener') tf_buffer = tf2_ros.Buffer() tf_listener = tf2_ros.TransformListener(tf_buffer) while not rospy.is_shutdown(): try: trans = tf_buffer.lookup_transform('map', 'base_link', rospy.Time()) roll, pitch, yaw = tf.transformations.euler_from_quaternion([trans.transform.rotation.x, trans.transform.rotation.y, trans.transform.rotation.z, trans.transform.rotation.w]) rospy.loginfo("Robot angle: %.2f degrees", yaw*180/3.14) except (tf2_ros.LookupException, tf2_ros.ConnectivityException, tf2_ros.ExtrapolationException): rospy.logwarn("Failed to get transform from map to base_link") rospy.sleep(0.1) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值