VRPNTrackerClient.cpp
Go to the documentation of this file.
00001 /*
00002  * VRPNTrackerClient.cpp
00003  *
00004  *  Created on: Dec 11, 2011
00005  *      Author: mriedel
00006  */
00007 
00008 #include <telekyb_vrpn/VRPNTrackerClient.hpp>
00009 
00010 #include <telekyb_base/ROS/ROSModule.hpp>
00011 
00012 namespace TELEKYB_NAMESPACE {
00013 
00014 void VRPN_CALLBACK viconTracker_handleTracker(void* userData, const vrpn_TRACKERCB t ) {
00015         VRPNTrackerClient* client = (VRPNTrackerClient *) userData;
00016         client->handleVRPNTrackerCB(t);
00017 }
00018 
00019 
00020 VRPNTrackerClient::VRPNTrackerClient(const std::string& objectName_)
00021         : nodeHandle(ROSModule::Instance().getMainNodeHandle()), options(VRPNTrackerClientOptions::Instance())
00022 {
00023         std::string vrpnObjectName = objectName_ + "@" + options.tVRPNHostname->getValue();
00024         pub = nodeHandle.advertise<geometry_msgs::PoseStamped>(objectName_, 10);
00025 
00026         childFrameID = objectName_;
00027         poseStamped.header.frame_id = options.tChildFrameID->getValue();
00028 
00029         // Tracker
00030         vrpnTracker = new vrpn_Tracker_Remote(vrpnObjectName.c_str());
00031         vrpnTracker->register_change_handler(this, viconTracker_handleTracker);
00032 }
00033 
00034 VRPNTrackerClient::~VRPNTrackerClient()
00035 {
00036         vrpnTracker->unregister_change_handler(this, viconTracker_handleTracker);
00037         delete vrpnTracker;
00038 }
00039 
00040 void VRPNTrackerClient::spin()
00041 {
00042         vrpnTracker->mainloop();
00043 }
00044 
00045 void VRPNTrackerClient::handleVRPNTrackerCB(const vrpn_TRACKERCB t)
00046 {
00047         Eigen::Vector3d pose(t.pos[0], t.pos[1], t.pos[2]);
00048         Eigen::Vector3d rotPose = options.tVRPNRotationMatrix->getValue()*pose;
00049         poseStamped.header.stamp = ros::Time(t.msg_time.tv_sec, t.msg_time.tv_usec*1000);
00050         poseStamped.pose.position.x = rotPose[0];
00051         poseStamped.pose.position.y = rotPose[1];
00052         poseStamped.pose.position.z = rotPose[2];
00053 
00054         Eigen::Vector3d ori(t.quat[0], t.quat[1], t.quat[2]);
00055         Eigen::Vector3d rotOri = options.tVRPNRotationMatrix->getValue()*ori;
00056         poseStamped.pose.orientation.x = rotOri[0];
00057         poseStamped.pose.orientation.y = rotOri[1];
00058         poseStamped.pose.orientation.z = rotOri[2];
00059         poseStamped.pose.orientation.w = t.quat[3];
00060 
00061         pub.publish(poseStamped);
00062 
00063         if (options.tEnableTF->getValue()) {
00064 
00065                 tf::Transform transform;
00066                 transform.setOrigin(tf::Vector3(poseStamped.pose.position.x, poseStamped.pose.position.y, poseStamped.pose.position.z));
00067                 transform.setRotation(tf::Quaternion(poseStamped.pose.orientation.x, poseStamped.pose.orientation.y, poseStamped.pose.orientation.z, poseStamped.pose.orientation.w));
00068 
00069                 tf::StampedTransform tfStampedTransform(transform, poseStamped.header.stamp, poseStamped.header.frame_id, childFrameID);
00070                 transBroadcaster.sendTransform(tfStampedTransform);
00071         }
00072 }
00073 
00074 } /* namespace telekyb */
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Friends


telekyb_vrpn
Author(s): Martin Riedel
autogenerated on Mon Nov 11 2013 11:14:04