Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00032 #ifndef TF_TIME_CACHE_H
00033 #define TF_TIME_CACHE_H
00034
00035 #include <set>
00036 #include <boost/thread/mutex.hpp>
00037
00038 #include "tf/transform_datatypes.h"
00039 #include "tf/exceptions.h"
00040
00041 #include "tf/LinearMath/Transform.h"
00042
00043 #include <sstream>
00044
00045 namespace tf
00046 {
00047 enum ExtrapolationMode { ONE_VALUE, INTERPOLATE, EXTRAPOLATE_BACK, EXTRAPOLATE_FORWARD };
00048
00049
00050 typedef uint32_t CompactFrameID;
00051 typedef std::pair<ros::Time, CompactFrameID> P_TimeAndFrameID;
00052
00054 class TransformStorage
00055 {
00056 public:
00057 TransformStorage();
00058 TransformStorage(const StampedTransform& data, CompactFrameID frame_id, CompactFrameID child_frame_id);
00059
00060 TransformStorage(const TransformStorage& rhs)
00061 {
00062 *this = rhs;
00063 }
00064
00065 TransformStorage& operator=(const TransformStorage& rhs)
00066 {
00067 #if 01
00068 rotation_ = rhs.rotation_;
00069 translation_ = rhs.translation_;
00070 stamp_ = rhs.stamp_;
00071 frame_id_ = rhs.frame_id_;
00072 child_frame_id_ = rhs.child_frame_id_;
00073 #endif
00074 return *this;
00075 }
00076
00077 bool operator< (const TransformStorage &b) const
00078 {
00079 return this->stamp_ < b.stamp_;
00080 }
00081
00082
00083 tf::Quaternion rotation_;
00084 tf::Vector3 translation_;
00085 ros::Time stamp_;
00086 CompactFrameID frame_id_;
00087 CompactFrameID child_frame_id_;
00088 };
00089
00090
00091
00092
00097 class TimeCache
00098 {
00099 public:
00100 static const int MIN_INTERPOLATION_DISTANCE = 5;
00101 static const unsigned int MAX_LENGTH_LINKED_LIST = 1000000;
00102 static const int64_t DEFAULT_MAX_STORAGE_TIME = 1ULL * 1000000000LL;
00103
00104 TimeCache(ros::Duration max_storage_time = ros::Duration().fromNSec(DEFAULT_MAX_STORAGE_TIME));
00105
00106 bool getData(ros::Time time, TransformStorage & data_out, std::string* error_str = 0);
00107 bool insertData(const TransformStorage& new_data);
00108 void clearList();
00109 CompactFrameID getParent(ros::Time time, std::string* error_str);
00110 P_TimeAndFrameID getLatestTimeAndParent();
00111
00113 unsigned int getListLength();
00114 ros::Time getLatestTimestamp();
00115 ros::Time getOldestTimestamp();
00116
00117
00118 private:
00119 typedef std::set<TransformStorage> L_TransformStorage;
00120 L_TransformStorage storage_;
00121
00122 ros::Duration max_storage_time_;
00123
00124
00126
00127 inline uint8_t findClosest(const TransformStorage*& one, const TransformStorage*& two, ros::Time target_time, std::string* error_str);
00128
00129 inline void interpolate(const TransformStorage& one, const TransformStorage& two, ros::Time time, TransformStorage& output);
00130
00131
00132 void pruneList();
00133
00134
00135
00136 };
00137
00138
00139 }
00140 #endif // TF_TIME_CACHE_H