Robotics StackExchange | Archived questions

How to transform tf::Vector3 with tf::TransformationListener?

I am trying to convert a tf::Vector3 with tf::TransfomationListener::transformVector(string("/base_link"), sourceV, targetV). What I get is the following:

*no known conversion for argument 2 from 'const tf::Vector3' to 'const Vector3Stamped& {aka const geometrymsgs::Vector3Stampedstd::allocator<void >&}' *

Ok, so I figured I need a Stamped version of my vector. I tried this:

tf::Stamped<tf::Vector3> sv(sourceV, ros::Time(), string("/odom"));

and got this:

no known conversion for argument 2 from 'tf::Stampedtf::Vector3' to 'const Vector3Stamped& {aka const geometrymsgs::Vector3Stampedstd::allocator<void >&}'

Then I realized that it is requesting geometry_msgs::Vector3Stamped. How come the transformation listener from tf doesn't take tf::Vector3?

Ok, then I tried to get the right type:

    geometry_msgs::Vector3Stamped gV;
    gV.vector = sourceV;
    gV.header.stamp = ros::Time();
    gV.header.frame_id = "/odom";

This resulted in:

no match for 'operator=' (operand types are 'geometrymsgs::Vector3Stampedstd::allocator<void >::vectortype {aka geometrymsgs::Vector3std::allocator<void >}' and 'const tf::Vector3')

In the end my code looked like this:

    geometry_msgs::Vector3Stamped gV, tV;
    gV.vector.x = sourceV.x();
    gV.vector.y = sourceV.y();
    gV.vector.z = sourceV.z();
    gV.header.stamp = ros::Time();
    gV.header.frame_id = "/odom";
    getTransformListener()->transformVector(string("/base_link"), gV, tV);
    targetV.setX(tV.vector.x);
    targetV.setY(tV.vector.y);
    targetV.setZ(tV.vector.z);

Even though I think this should be a one-liner without all that unnecessary object creation and assigment:

    getTransformListener()->transformVector(string("/base_link"), sourceV, targetV);

Question:

Is the one-liner somehow possible? Is there another easy way to do this that I am missing?

Asked by Sheridan Vespo on 2014-12-12 11:44:49 UTC

Comments

Answers