Go to the documentation of this file.00001
00008 #ifndef TRAJECTORY_H
00009 #define TRAJECTORY_H
00010
00011 #include <kdl/frameacc.hpp>
00012 #include <kdl/jntarrayacc.hpp>
00013 #include <vector>
00014 #include <boost/shared_ptr.hpp>
00015 #include <stdexcept>
00016 #include "nasa_common_logging/Logger.h"
00017
00022 template <class P>
00023 class Trajectory
00024 {
00025 public:
00026 typedef P poseType;
00027
00028 Trajectory() : duration(0.) {}
00029 virtual ~Trajectory() {}
00030
00031 inline double getDuration() const {return duration;}
00032
00039 virtual void getPose(double time, poseType& pose) = 0;
00040
00041 virtual void setDuration(double duration_in);
00042
00043 private:
00044 double duration;
00045 };
00046
00047 typedef Trajectory<KDL::JntArrayAcc> JointTrajectory;
00048 typedef Trajectory<KDL::FrameAcc> CartesianTrajectory;
00049
00054 template <class P>
00055 class SynchedTrajectory : public Trajectory<std::vector<P> >
00056 {
00057 public:
00058 typedef Trajectory<std::vector<P> > baseType;
00059
00060 SynchedTrajectory() {}
00061 virtual ~SynchedTrajectory() {}
00062
00063 void push_back(boost::shared_ptr<Trajectory<P> > traj);
00064
00065 void pop_back()
00066 {
00067 trajectories.pop_back();
00068
00069 if (trajectories.empty()) { baseType::setDuration(0.); }
00070 }
00071
00072 void clear()
00073 {
00074 trajectories.clear();
00075 baseType::setDuration(0.);
00076 }
00077
00078 inline unsigned int size() {return trajectories.size();}
00079
00080 inline boost::shared_ptr<const Trajectory<typename baseType::poseType> > operator[](unsigned int i)
00081 {return trajectories[i];}
00082
00083 virtual void getPose(double time, typename baseType::poseType& pose);
00084
00085 private:
00086 typedef std::vector<boost::shared_ptr<Trajectory<P> > > trajectories_type;
00087 trajectories_type trajectories;
00088 };
00089
00090 typedef SynchedTrajectory<KDL::FrameAcc> SynchedCartesianTrajectory;
00091
00097 template <class P, template <class> class trajType = Trajectory>
00098 class TrajectorySequence : public trajType<P>
00099 {
00100 public:
00101 typedef trajType<P> baseType;
00102
00103 TrajectorySequence() {}
00104 virtual ~TrajectorySequence() {}
00105
00106 void push_back(boost::shared_ptr<baseType> traj)
00107 {
00108 trajectories.push_back(traj);
00109 baseType::setDuration(baseType::getDuration() + traj->getDuration());
00110 }
00111
00112 void pop_back()
00113 {
00114 baseType::setDuration(baseType::getDuration() - trajectories.back()->getDuration());
00115 trajectories.pop_back();
00116 }
00117
00118 void clear()
00119 {
00120 trajectories.clear();
00121 baseType::setDuration(0.);
00122 }
00123
00124 virtual void getPose(double time, typename baseType::poseType& pose);
00125
00126 private:
00127 typedef std::vector<boost::shared_ptr<baseType> > trajectories_type;
00128 trajectories_type trajectories;
00129 };
00130
00131 template <class P>
00132 class SynchedTrajectorySequence : public TrajectorySequence<P, SynchedTrajectory> {};
00133
00134 typedef TrajectorySequence<KDL::JntArrayAcc> JointTrajectorySequence;
00135 typedef TrajectorySequence<KDL::FrameAcc> CartesianTrajectorySequence;
00136 typedef SynchedTrajectorySequence<KDL::FrameAcc> SynchedCartesianTrajectorySequence;
00137
00138 template <class P>
00139 void Trajectory<P>::setDuration(double duration_in)
00140 {
00141 if (duration_in >= 0)
00142 {
00143 duration = duration_in;
00144 }
00145 else
00146 {
00147 std::stringstream err;
00148 err << "Trajectory::setDuration() - duration must be greater than or equal to 0";
00149 NasaCommonLogging::Logger::log("gov.nasa.controllers.Trajectory", log4cpp::Priority::ERROR, err.str());
00150 throw std::invalid_argument(err.str());
00151 }
00152 }
00153
00154 template <class P>
00155 void SynchedTrajectory<P>::push_back(boost::shared_ptr<Trajectory<P> > traj)
00156 {
00157 if (trajectories.empty())
00158 {
00159 baseType::setDuration(traj->getDuration());
00160 }
00161 else if (baseType::getDuration() != traj->getDuration())
00162 {
00163 std::stringstream err;
00164 err << "SynchedTrajectory::push_back() - durations of trajectories don't match";
00165 NasaCommonLogging::Logger::log("gov.nasa.controllers.SynchedTrajectory", log4cpp::Priority::ERROR, err.str());
00166 throw std::runtime_error(err.str());
00167 return;
00168 }
00169
00170 trajectories.push_back(traj);
00171 }
00172
00173 template <class P>
00174 void SynchedTrajectory<P>::getPose(double time, typename baseType::poseType& pose)
00175 {
00176 pose.resize(trajectories.size());
00177
00178 for (unsigned int i = 0; i < trajectories.size(); ++i)
00179 {
00180 trajectories[i]->getPose(time, pose[i]);
00181 }
00182 }
00183
00184 template <class P, template <class> class trajType>
00185 void TrajectorySequence<P, trajType>::getPose(double time, typename baseType::poseType& pose)
00186 {
00187 if (trajectories.empty())
00188 {
00189 std::stringstream err;
00190 err << "TrajectorySequence::getPose() - trajectory empty";
00191 throw std::runtime_error(err.str());
00192 return;
00193 }
00194
00195 typename trajectories_type::iterator it = trajectories.begin();
00196
00197 while (time > (*it)->getDuration())
00198 {
00199 time -= (*it)->getDuration();
00200 ++it;
00201
00202 if (it == trajectories.end())
00203 {
00204 throw std::runtime_error("Time exceeds trajectory duration");
00205 }
00206 }
00207
00208 (*it)->getPose(time, pose);
00209 }
00210
00211 #endif