ROS2 中常用坐标系

ROS2 中常用坐标系

frame_id:用来告诉你,发布的数据是来自哪一个坐标系的。

在使用ROS进行定位导航等操作时,我们经常会遇到各种坐标系。每种坐标系都有明确的含义。理论上坐标系的名称可以是随意的,但是为了方便不同的软件间共享坐标信息,ROS定义了几个常见的坐标系。

1.base_link

base_link坐标系和机器人的底盘直接连接。其具体位置和方向都是任意的。对于不同的机器人平台,底盘上会有不同的参考点。不过ROS也给了推荐的坐标系取法。

x 轴指向机器人前方
y 轴指向机器人左方
z 轴指向机器人上方

2.odom

odom是一个固定在环境中的坐标系也就是world-fixed。它的原点和方向不会随着机器人运动而改变。但是odom的位置可以随着机器人的运动漂移。漂移导致odom不是一个很有用的长期的全局坐标。然而机器人的odom坐标必须保证是连续变化的。也就是在odom坐标系下机器人的位置必须是连续变化的,不能有突变和跳跃。
在一般使用中odom坐标系是通过里程计信息计算出来的。比如轮子的编码器或者视觉里程计算法或者陀螺仪和加速度计。odom是一个短期的局域的精确坐标系。但是却是一个比较差的长期大范围坐标。

3.map

map和odom一样是一个固定在环境中的世界坐标系。map的z轴是向上的。机器人在map坐标系下的坐标不应该随着时间漂移。但是map坐标系下的坐标并不需要保证连续性。也就是说在map坐标系下机器人的坐标可以在任何时间发生跳跃变化。
一般来说map坐标系的坐标是通过传感器的信息不断的计算更新而来。比如激光雷达,视觉定位等等。因此能够有效的减少累积误差,但是也导致每次坐标更新可能会产生跳跃。
map坐标系是一个很有用的长期全局坐标系。但是由于坐标会跳跃改变,这是一个比较差的局部坐标系(不适合用于避障和局部操作)。

### ROS坐标系的定义与使用 #### 坐标系的基础概念 在ROS中,坐标系用于描述机器人及其环境的空间关系。为了便于不同软件间的通信和数据共享,ROS定义了一些通用的标准坐标系[^2]。这些标准有助于简化开发流程并提高系统的互操作性。 #### 坐标系的命名约定 尽管理论上坐标系的名字可以任意指定,但遵循一定的命名规则能够显著提升项目的可读性和一致性。例如,`base_link`通常用来表示机器人的主体框架,而其他部件(如传感器)则以其相对于`base_link`的位置来定义各自的坐标系。 #### 坐标系的方向规定 根据REP-103的规定,在ROS环境中,典型的坐标系方向设定为:x轴正向指向前方,y轴正向指向左侧,z轴正向指向上方[^5]。这一设置符合大多数机械工程领域内的惯例,同时也考虑到了视觉设备可能存在的差异——比如摄像头常用的是另一种坐标体系结构(其中z轴朝前),因此需要注意两者之间的转换处理。 #### 静态坐标变换的应用场景 对于那些在整个程序执行过程中都不会发生变化的关系来说,采用静态坐标变换是一种高效的选择。这类情况常见于安装在机器人身上的固定装置之间相互关联的情形下。因为它们具有不变性的特点,所以能有效降低资源消耗,并且允许系统对其进行特定优化措施[^1]。 #### 动态坐标的实现方式 当涉及到随时间变化或者因外界因素影响而导致位置发生变动的对象时,则需要用到动态坐标管理工具tf/tf2包来进行实时更新维护工作。该功能模块不仅支持简单的线性位移运算还涵盖了复杂的姿态调整过程,具体而言就是利用欧拉角或者是四元数表达法完成角度方面的精确控制[^4]。 以下是基于Python语言的一个简单例子展示如何广播一个子节点到父级参照物下的新坐标: ```python import rospy import tf2_ros from geometry_msgs.msg import TransformStamped def broadcast_transform(): br = tf2_ros.TransformBroadcaster() t = TransformStamped() t.header.stamp = rospy.Time.now() t.header.frame_id = "world" t.child_frame_id = "robot" t.transform.translation.x = 1.0 t.transform.translation.y = 2.0 t.transform.translation.z = 0.0 quat = tf_conversions.transformations.quaternion_from_euler(0, 0, pi/4) t.transform.rotation.x = quat[0] t.transform.rotation.y = quat[1] t.transform.rotation.z = quat[2] t.transform.rotation.w = quat[3] rate = rospy.Rate(10.0) while not rospy.is_shutdown(): br.sendTransform(t) rate.sleep() if __name__ == '__main__': rospy.init_node('my_tf_broadcaster') try: broadcast_transform() except rospy.ROSInterruptException: pass ``` 上述脚本创建了一个名为“world”的全局参考帧以及另一个叫做“robot”的局部实体实例,并定期发布二者间存在偏移量和平面旋转的信息给整个网络知晓。 #### 数学模型解析 任何两个三维空间里的坐标系都可以通过一系列的操作互相映射过来。首先是确定两者的起点差距即所谓的平移参数;其次是围绕各个轴转动的角度数值构成整体的姿态特征。最终把这些要素组合起来形成统一表述形式—齐次矩阵T,它包含了所有的必要细节以便后续进一步分析应用[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值