1、需求

在使用ROS的过程中,我们常常需要在应用中获取某个或者整体的tf树,或者发布某个frame与某个节点之间的transform关系。

2、发布transforms

// 1. 引入头文件
#include <tf/transform_broadcaster.h>
// 2. 创建TransformBroadcaster对象
tf::TransformBroadcaster br;
// 3. 创建Transform对象
tf::Transform transform;
// 4. 给tranform填入目标值
transform.setOrigin(tf::Vector3(x, y, 0.0));
tf::Quaternion q;
q.setRPY(0, 0, 0);
transform.setRotation(q);
// 5. 将Transform填充到StampedTransform对象中,并使用Broadcaster发布StampedTransform话题,
br.sendTransform(tf::StampedTransform(transform, ros::Time::now(), "/parent_id", "/child_id"));

3、获取transform

// 1. 引入listener头文件
#include <tf/transform_listener.h>
// 2. 创建listener对象
tf::TransformListener listener;
// 3. 创建StampedTransform对象
tf::StampedTransform transform;
// 4. 尝试获取指定的transform, 如果获取失败会返回TransformException
try{
    listener.lookupTransform("/parent_id", "/child_id",  
                            ros::Time(0), transform);
}
catch (tf::TransformException ex){
    ROS_ERROR("%s",ex.what());
}
// getOrigin() 获取transition
transform.getOrigin()
// getRotation() 获取orientation
transform.getRotation()

4、编译设置

add_executable(turtle_tf_listener src/turtle_tf_listener.cpp)
target_link_libraries(turtle_tf_listener ${catkin_LIBRARIES})

5、编译

catkin_make