Trajectory.h
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


robodyn_controllers
Author(s):
autogenerated on Sat Jun 8 2019 20:20:53