坐标系是我们非常熟悉的一个概念,也是机器人学中的重要基础,在一个完整的机器人系统中,会存在很多坐标系,这些坐标系之间的位置关系该如何管理?ROS给我们提供了一个坐标系的管理神器:TF2
在移动机器人系统中,坐标系一样至关重要,比如一个移动机器人的中心点是基坐标系Base Link,雷达所在的位置叫做雷达坐标系laser link,机器人要移动,里程计会累积位置,这个位置的参考系叫做里程计坐标系odom,里程计又会有累积误差和漂移,绝对位置的参考系叫做地图坐标系map。
一层一层坐标系之间关系复杂,有一些是相对固定的,也有一些是不断变化的,看似简单的坐标系也在空间范围内变得复杂,良好的坐标系管理系统就显得格外重要。
关于坐标系变换关系的基本理论,在每一本机器人学的教材中都会有讲解,可以分解为平移和旋转两个部分,通过一个四乘四的矩阵进行描述,在空间中画出坐标系,那两者之间的变换关系,其实就是向量的数学描述。
ROS中TF功能的底层原理,就是对这些数学变换进行了封装,详细的理论知识大家可以参考机器人学的教材,我们主要讲解TF坐标管理系统的使用方法。
我们先通过两只小海龟的示例,了解下基于坐标系的一种机器人跟随算法。为方便演示,本节课程最好选择在虚拟机中操作
这个示例需要我们先安装相应的功能包
sudo apt install ros-foxy-turtle-tf2-py ros-foxy-tf2-tools
sudo pip3 install transforms3d
然后就可以通过一个launch文件启动,之后我们可以控制其中的一只小海龟,另外一只小海龟会自动跟随运动。
xxxxxxxxxx
ros2 launch turtle_tf2_py turtle_tf2_demo.launch.py
ros2 run turtlesim turtle_teleop_key
当我们控制一只海龟运动时,另外一只海龟也会跟随运动。
xxxxxxxxxx
ros2 run tf2_tools view_frames.py
默认在当前终端路径下生成了一个frames.pdf文件,打开之后,就可以看到系统中各个坐标系的关系了。
只看到坐标系的结构还不行,如果我们想要知道某两个坐标系之间的具体关系,可以通过tf2_echo这个工具查看:
xxxxxxxxxx
ros2 run tf2_ros tf2_echo turtle2 turtle1
运行成功后,终端中就会循环打印坐标系的变换数值了
用rviz2来做显示:
xxxxxxxxxx
rviz2
rivz2中设置参考坐标系为:world,添加TF显示,再让小海龟动起来,Rviz中的坐标轴就会开始运动,这样是不是更加直观了呢!
所谓静态坐标变换,是指两个坐标系之间的相对位置是固定的。如雷达和base_link之间的位置是固定的。
示例:为方便演示,本节课程最好选择在虚拟机中操作
xxxxxxxxxx
ros2 run tf2_ros static_transform_publisher 0 0 3 0 0 3.14 A B
xxxxxxxxxx
ros2 run tf2_ros tf2_echo A B
下节课程中讲解,请看下节课程