一、对tf的了解
一个机器人中通常有多个坐标系,如世界坐标系、基座坐标系、夹具坐标系等等,这些坐标系在tf中构成坐标树,tf通过坐标树维护多个坐标系之间的坐标变换,ros坐标系可以在分布式系统中进行变换,这意味着坐标对所有的节点都是可用的,同时所有订阅tf消息的节点都会缓存一份所有坐标系的变换关系数据,而不需要中心节点来存储。
1、TF功能包能干什么?
五秒钟之前,机器人头部坐标系相对于全局坐标系的关系是什么样的?
机器人夹取的物体相对于机器人中心坐标系的位置在哪里?
机器人中心坐标系相对于全局坐标系的位置在哪里?
2、TF坐标变换如何实现?
(1)广播TF变换
向系统中广播坐标系之间的坐标变换关系。系统中可能存在多个不同部分的TF变换广播,每个广播都可以直接将坐标变换关系插入TF树中,不需要再进行同步。
(2)监听TF变换
接收并缓存系统中发布的所有坐标变换数据,并从中查询所需要的坐标变换关系。
二、编程实现
(1)创建功能包
cd ~/catkin_ws/src
$ catkin_create_pkg learning_tf roscpp rospy tf turtlesim
(2)如何实现一个TF广播器和监听器
广播器:
定义TF广播器(TransformBroadcaster)
创建坐标变换值;
发布坐标变换(sendTransform)
监听器:
定义TF监听器;(TransformListener)
查找坐标变换;(waitForTransform、 lookupTransform)
(3)创建tf广播器代码(C++)
/**
* 该例程产生tf数据,并计算、发布turtle2的速度指令
*/
#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::Transform transform;// 定义存放转换信息(平动,转动)的变量transform,初始化tf数据
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.sendTransform(tf::