Ask Your Question

Revision history [back]

click to hide/show revision 1
initial version

how get pose(x,y,z) of links and plot in rqt?

i add static_transform_publisher node in launch file :

 <node name="rob2cambase" pkg="tf" type="static_transform_publisher" args="1.58 0.0 0 0 0.0 0.06 /base_link /link_U26_1  100"/>

and write track_kin.py node in node folder :

    #!/usr/bin/env python
import roslib; roslib.load_manifest('tf_workshop')
import rospy
import math
import tf
from geometry_msgs.msg import PoseStamped
from gtk.keysyms import Pause

def callback(data):

    x=data.pose.position.x/1000;
    y=data.pose.position.y/1000;
    z=data.pose.position.z/1000
    quat=tf.transformations.quaternion_from_euler( data.pose.orientation.x*3.1415926/180, data.pose.orientation.y*3.1415926/180,     data.pose.orientation.z*3.1415926/180, 'sxyz')

# Enter here the transform to send:
    br.sendTransform(x,y,z, quat, rospy.Time.now(),"link_U26_1", "base_link")    



def listener():

    global br
    tflistener = tf.TransformListener()
    rospy.Subscriber("armpose", PoseStamped, callback)
    br = tf.TransformBroadcaster()
    rate = rospy.Rate(10.0)

    rospy.spin()

if __name__ == '__main__':
    rospy.init_node('arm_listener', anonymous=True)
    listener()

and write object_tracker.cpp in src folder :

    #include <stdio.h>
#include <ros/ros.h>
#include <cstdlib>
#include <visualization_msgs/Marker.h>
#include <geometry_msgs/PoseStamped.h>
#include <geometry_msgs/Quaternion.h>
#include <geometry_msgs/Vector3.h>
#include <math.h>
#include <tf/transform_listener.h>
#include <tf/transform_broadcaster.h>
#include <sensor_msgs/PointCloud2.h>

#define pi 3.14159265

class Ktracker{

public:
    Ktracker();
    ros::Subscriber trkmarker_sub, pose_sub;
    ros::Publisher objectpc_pub;

    void trackCallback(const visualization_msgs::Marker&);
    void poseCallback(const geometry_msgs::PoseStamped&);

    tf::TransformListener listener;
    tf::StampedTransform transform;
    tf::TransformBroadcaster br;
    tf::Quaternion qtf;

private:
    sensor_msgs::PointCloud objectpc;


};

Ktracker::Ktracker(){

    ros::NodeHandle n;
    objectpc_pub=n.advertise<sensor_msgs::PointCloud>("objpc",1000);
}


void Ktracker::trackCallback(const visualization_msgs::Marker &msg){


    objectpc.set_points_size(msg.get_points_size());

    int i;
    for (i=0;i<(int) msg.get_points_size();i++){
        objectpc.points[i].x=msg.points[i].x;
        objectpc.points[i].y=msg.points[i].y;
        objectpc.points[i].z=msg.points[i].z;
    }

    ros::Time now = ros::Time::now();
    transform.setOrigin(tf::Vector3(msg.pose.position.x,msg.pose.position.y,msg.pose.position.z));
    tf::quaternionMsgToTF(msg.pose.orientation,qtf);
    transform.setRotation(qtf);
    br.sendTransform(tf::StampedTransform(transform, msg.header.stamp, "/link_U26_1","/object_frame"));
    objectpc.header.frame_id="/object_frame";

    try
    {
// Enter the correct transformation to track the object 


        now=ros::Time::now();
        listener.waitForTransform("/object_frame", "/link_U26_1",ros::Time::now(), ros::Duration(0.2));
        listener.lookupTransform("/object_frame", "/link_U26_1",now, transform);
        listener.transformPointCloud("/link_U26_1",objectpc,objectpc);
        objectpc.header.frame_id="/link_U26_1";
        objectpc_pub.publish(objectpc);

    }
    catch (tf::TransformException ex)
    {
        ROS_WARN("TF Exception: %s", ex.what());
    }
}


void Ktracker::poseCallback(const geometry_msgs::PoseStamped &msg){
    objectpc_pub.publish(objectpc);
}

int main(int argc, char **argv)
{
    ros::init(argc, argv, "armtrack");
    Ktracker ktracker;
    ros::Rate loop_rate(20);
    visualization_msgs::Marker bluem;
    ros::NodeHandle n;
    ktracker.trkmarker_sub=n.subscribe("markers_out", 1000, &Ktracker::trackCallback,&ktracker);
    ktracker.pose_sub=n.subscribe("armpose",1000, &Ktracker::poseCallback,&ktracker);

    ros::spin();

}

and build package by : rosmake wrist_moveit_config

how plot pose link_U26_1 in rqt ?? all steps are true ??