1. ROS中的tf坐标系基础
在机器人系统中,坐标系变换(Transform)是最基础也是最重要的概念之一。想象一下,当机器人的手臂要抓取一个物体时,它需要知道这个物体相对于自身底座的位置。而机器人的每个关节都有自己的坐标系,这就需要通过坐标系变换来描述它们之间的关系。
ROS中的tf(Transform)库就是专门用来管理这些坐标系关系的工具包。它维护了一个坐标系变换树,可以高效地处理不同坐标系之间的转换。tf系统由两个核心组件组成:
- 广播器(Broadcaster):负责发布坐标系之间的相对关系
- 监听器(Listener):负责查询坐标系之间的变换关系
提示:在ROS中,坐标系通常被称为"frame",每个frame都有一个唯一的名称,如"world"、"base_link"等。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 项目环境准备
2.1 创建工作空间
首先我们需要创建一个ROS工作空间来存放我们的tf实验代码。打开终端,执行以下命令:
bash复制mkdir -p ~/sor_ws/src
cd ~/sor_ws/src
catkin_init_workspace
这会在你的home目录下创建一个名为"sor_ws"的工作空间,并初始化src目录。工作空间的目录结构应该是这样的:
code复制sor_ws/
├── build/
├── devel/
└── src/
2.2 创建功能包
接下来,我们创建一个专门用于学习tf的功能包:
bash复制cd ~/sor_ws/src
catkin_create_pkg learning_tf rospy roscpp tf turtlesim
这个命令创建了一个名为"learning_tf"的功能包,并指定了它依赖的ROS包:
- rospy:Python客户端库
- roscpp:C++客户端库
- tf:ROS的tf变换库
- turtlesim:我们将使用的小海龟模拟器
创建完成后,功能包目录结构如下:
code复制learning_tf/
├── CMakeLists.txt
├── include/
├── package.xml
└── src/
3. 实现tf广播器
3.1 创建广播器源文件
在src目录下创建广播器的C++源文件:
bash复制cd ~/sor_ws/src/learning_tf/src
touch turtle_tf_broadcaster.cpp
3.2 广播器代码解析
广播器的主要功能是发布小海龟相对于世界坐标系(world)的位姿。下面是完整的代码实现:
cpp复制#include <ros/ros.h>
#include <tf/transform_broadcaster.h>
#include <turtlesim/Pose.h>
std::string turtle_name;
void poseCallback(const turtlesim::PoseConstPtr& msg)
{
// 创建tf的广播器
static tf::TransformBroadcaster br;
// 初始化tf数据
tf::Transform transform;
transform.setOrigin(tf::Vector3(msg->x, msg->y, 0.0));
tf::Quaternion q;
q.setRPY(0, 0, msg->theta);
transform.setRotation(q);
// 广播world与海龟坐标系之间的tf数据
br.sendTr
