天天看點

如何使用tf::transform進行簡單的不同frame間的pose轉換如何使用tf::transform進行簡單的不同frame間的pose轉換

摘自:https://my.oschina.net/u/4288583/blog/3413736

如何使用tf::transform進行簡單的不同frame間的pose轉換

osc_22to9se2

2019/08/27 15:57

閱讀數 315

tf轉換,分為兩部分:broadcaster和listener。前者是tf的釋出者,後者是接收者。我們如果要建立一個完整的tf體系,需要自己先生成tf資訊用broadcaster釋出出去,然後再在需要tf資訊的節點使用listner接收tf資訊後進行轉換。

但是大部分情況下,我們都是在一個已經有完善體系的架構下工作,并不需要自己管理tf。這時我們隻需要了解怎樣用listner接收tf進行pose轉換就可以了。本文即是簡述這種方法。

首先,要添加頭檔案。listner的定義在這個檔案中:

#include <tf/transform_listener.h>
           

然後是listener的變量定義:

tf::TransformListener listener;
           

下來就是核心函數了,核心函數的定義是這樣的:

void transformPose(const std::string &target_frame, const geometry_msgs::PoseStamped &stamped_in, geometry_msgs::PoseStamped &stamped_out) const
           

參數名字的定義對功能的說明還是很明顯的,target_frame就是你要把源pose轉換成哪個frame上的pose。假如你的源pose的frame_id是"odom",你想轉到"map"上,那麼target_frame寫成“map”就可以了。stamped_in就是源pose,而stamped_out就是目标資料了,也就是轉換完成的資料。需要注意的是,從參數上來看,轉換時是不需要指定源frame_id的,這是因為它已經包含在了stamped_in中,換句話說,就是這個函數一個隐含的使用條件是,stamped_in中必須指明源pose屬于哪個frame。

那麼最後就是準備源資料變量和目标資料變量了,如下:

geometry_msgs::PoseStamped pose_odom;
pose_odom.header = odom->header;
pose_odom.pose = odom->pose.pose;

geometry_msgs::PoseStamped pose_map;
           

這裡是要把odom上的資料轉換到map上,是以源變量就是pose_odom,而目标變量就是pose_map。

以上這些都是局部代碼片斷,都隻能看個大概意思,這回我們把它們都連在一起形成一個完整的程式來看看意思:

#include <tf/transform_listener.h>
#include <nav_msgs/Odometry.h>
#include <ros/ros.h>void odomReceived(const nav_msgs::Odometry::ConstPtr& odom)
{
    // transform from "odom" to "map"
    tf::TransformListener listener;

    geometry_msgs::PoseStamped pose_odom;
    pose_odom.header = odom->header;
    pose_odom.pose = odom->pose.pose;

    geometry_msgs::PoseStamped pose_map;

    try{
        listener.transformPose("map", pose_odom, pose_map);
    }
    catch( tf::TransformException ex)
    {
        ROS_WARN("transfrom exception : %s",ex.what());
        return;
    }

    ROS_INFO_STREAM(pose_map);
}
           

好了,将這段程式嵌入進你的代碼中,作為subscribe topic "odom"的回調函數,就能看到效果了:)