5.1 坐标变换简介
场景
机器人系统上,有多个传感器,如激光雷达、摄像头等,有的传感器是可以感知机器人周边的物体方位(以坐标的方式表示物体与传感器的横向距离、纵向距离、垂直高度等信息)的,以协助机器人定位障碍物,那么可以直接将物体相对该传感器的方位信息,等价于物体相对于机器人系统或机器人其它组件的方位信息吗?显然是不行的,这中间需要一个转换过程。更具体描述如下:
场景1:现有一移动式机器人底盘,在底盘上安装了一雷达,雷达相对于底盘的偏移量已知,现雷达检测到一障碍物信息,获取到坐标分别为(x,y,z),该坐标是以雷达为参考系的,如何将这个坐标转换成以小车为参考系的坐标呢?


场景2:现有一带机械臂的机器人(比如:PR2)需要夹取目标物,当前机器人头部摄像头可以探测到目标物的坐标(x,y,z),不过该坐标是以摄像头为参考系的,而实际操作目标物的是机械臂的夹具,当前我们需要将该坐标转换成相对于机械臂夹具的坐标,这个过程如何实现?

当然,根据我们高中学习的知识,在明确了不同坐标系之间的的相对关系,就可以实现任何坐标点在不同坐标系之间的转换,但是该计算实现是较为常用的,且算法也有点复杂,因此在 ROS 中直接封装了相关的模块: 坐标变换(tf)。
概念
tf(TransForm Frame)是指坐标变换,它允许用户随时间跟踪多个坐标系。 它在时间缓冲的树结构中维护坐标帧之间的关系,并让用户在任何所需的时间点在任意两个坐标帧之间变换点、向量等。在ROS中已经提供了同名的库实现,并且随着ROS的迭代,该库升级为了tf2,也即第二代坐标变换库。本阶段课程主要内容也是以tf2为主。
完整的坐标变换实现由坐标变换广播方和坐标变换监听方两部分组成。每个坐标变换广播方一般会发布一组坐标系相对关系,而坐标变换监听方则会将多组坐标系相对关系融合为一棵坐标树(该坐标树有且仅有一个根坐标系),并可以实现任意坐标系之间或坐标点与坐标系的变换。
另外需要说明的是,ROS中的坐标变换是基于右手坐标系的。右手坐标系的具体规则如下图所示:将右手处于坐标系原点,大拇指、食指与中指互成直角,食指指向的是x轴正方向,中指指向的是y轴正方向,大拇指指向的是z轴正方向。

作用
在ROS中用于实现不同坐标系之间的点或向量的转换。
5.1.1 案例安装以及运行
关于坐标变换的实现有一个经典的“乌龟跟随”案例,在学习坐标变换的具体知识点之前,建议先安装并运行此案例。
1.安装
首先安装“乌龟跟随”案例的功能包以及依赖项。
安装方式1(二进制方式安装):

安装方式2(克隆源码并构建):

此外,还需要安装一个名为 transforms3d
的 Python 包,它为 tf_transformations
包提供四元数和欧拉角变换功能,安装命令如下:

2.执行
启动两个终端,终端1输入如下命令:

该命令会启动 turtlesim_node 节点,turtlesim_node 节点中自带一只小乌龟 turtle1,除此之外还会新生成一只乌龟 turtle2,turtle2 会运行至 turtle1 的位置。
终端2输入如下命令:

该终端下可以通过键盘控制 turtle1 运动,并且 turtle2 会跟随 turtle1 运动(参考引言部分的案例1)。

B站有完整的ros系列教程视频,可以观看完整内容ros课程ROS2理论与实践
更多内容将在猛狮知识星球社区更新最新课程,后续将推出更多优质内容——详情可关注猛狮集训营公众号和猛狮集训营官方网站。