Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008 #include <telekyb_vicon/ViconSubject.hpp>
00009
00010
00011 #include <telekyb_vicon/ViconTypes.hpp>
00012 #include <ros/console.h>
00013
00014 #include <telekyb_vicon/ViconBridge.hpp>
00015
00016 namespace TELEKYB_NAMESPACE
00017 {
00018
00019 ViconSubject::ViconSubject()
00020 : options(ViconTrackerOptions::Instance()), subjectID(-1)
00021 {
00022
00023 }
00024
00025 ViconSubject::ViconSubject(int subjectID_)
00026 : options(ViconTrackerOptions::Instance()), subjectID(subjectID_)
00027 {
00028
00029 }
00030
00031 ViconSubject& ViconSubject::operator= (const ViconSubject & other)
00032 {
00033 subjectID = other.subjectID;
00034 return *this;
00035 }
00036
00037 ViconSubject::~ViconSubject()
00038 {
00039
00040 }
00041
00042 std::string ViconSubject::getName() const
00043 {
00044 return subjectName;
00045 }
00046
00047 unsigned int ViconSubject::getNSegments() const
00048 {
00049 return nSegments;
00050 }
00051
00052 void ViconSubject::init()
00053 {
00054 subjectName = ViconBridge::Instance().getClient().GetSubjectName(subjectID).SubjectName;
00055 nSegments = ViconBridge::Instance().getClient().GetSegmentCount(subjectName).SegmentCount;
00056
00057
00058 for (unsigned int i = 0; i < nSegments; i++) {
00059 std::string segmentName = ViconBridge::Instance().getClient().GetSegmentName(subjectName, i).SegmentName;
00060 segments.push_back(ViconSegment(*this, i, segmentName));
00061 }
00062 }
00063
00064 void ViconSubject::process()
00065 {
00066 for (unsigned int i = 0; i < nSegments; i++) {
00067 Vicon::Output_GetSegmentGlobalTranslation trans =
00068 ViconBridge::Instance().getClient().GetSegmentGlobalTranslation(subjectName, segments[i].getSegmentName());
00069 Vicon::Output_GetSegmentGlobalRotationQuaternion quat =
00070 ViconBridge::Instance().getClient().GetSegmentGlobalRotationQuaternion(subjectName, segments[i].getSegmentName());
00071
00072 if (trans.Result != Vicon::Result::Success || quat.Result != Vicon::Result::Success) {
00073 ROS_WARN("GetSegmentGlobalTranslation/Rotation failed (result = %s, %s), not publishing...",
00074 ViconResult(trans.Result).str(), ViconResult(quat.Result).str());
00075 continue;
00076 }
00077
00078 if (trans.Occluded || quat.Occluded) {
00079 ROS_WARN_STREAM("Segment "<< segments.at(i).getSegmentName() << " of "
00080 << subjectName <<" occluded, not publishing... " );
00081 continue;
00082 }
00083
00084
00085
00086 Eigen::Vector3d globalTranslation(trans.Translation[0] / 1000, trans.Translation[1] / 1000, trans.Translation[2] / 1000);
00087 Eigen::Quaterniond globalRotation(quat.Rotation[3], quat.Rotation[0], quat.Rotation[1], quat.Rotation[2]);
00088
00089 if (options.tPublishTF->getValue()) {
00090 tf::Transform lastTransform;
00091
00092 lastTransform.setOrigin(tf::Vector3(globalTranslation(0), globalTranslation(1), globalTranslation(2)));
00093 lastTransform.setRotation(tf::Quaternion(globalRotation.x(), globalRotation.y(), globalRotation.z(),
00094 globalRotation.w()));
00095
00096 tfBroadCaster.sendTransform(
00097 tf::StampedTransform(lastTransform, ros::Time::now(), "world", segments[i].getSegmentName() + "/" + subjectName)
00098 );
00099 }
00100
00101 segments[i].publish(globalTranslation, globalRotation);
00102 }
00103 }
00104
00105 }