Go to the documentation of this file.00001
00060 #ifndef __MOVE_COMMAND_H__
00061 #define __MOVE_COMMAND_H__
00062
00063 #include <schunk_powercube_chain/datastructsManipulator.h>
00064 #include <schunk_powercube_chain/TimeStamp.h>
00065
00066 class moveCommand
00067 {
00068 public:
00069 moveCommand() {;}
00070 virtual ~moveCommand() {;}
00071
00073
00075
00079 virtual double getPos(double TimeElapsed)=0;
00080
00084 virtual double getVel(double TimeElapsed)=0;
00085
00089 virtual double getTotalTime()=0;
00090
00092
00093
00095
00099 virtual void start() { m_timeStarted.SetNow(); }
00100
00104 virtual bool isActive() { m_now.SetNow(); return ( m_now-m_timeStarted > getTotalTime() )?false:true;
00105 std::cerr << "========Total Time: " << getTotalTime() << "\n";}
00106
00110 virtual double pos() { m_now.SetNow(); return getPos( m_now-m_timeStarted ); }
00111
00115 virtual double vel() { m_now.SetNow(); return getVel( m_now-m_timeStarted ); }
00116
00120 virtual double timeRemaining() { m_now.SetNow(); return (m_timeStarted - m_now) + getTotalTime(); }
00121
00122 protected:
00123 TimeStamp m_timeStarted;
00124 TimeStamp m_now;
00125 };
00126
00127
00128
00129 class RampCommand : public moveCommand
00130 {
00131 public:
00132 RampCommand(double x0, double v0, double xtarget, double amax, double vmax);
00133 RampCommand(const RampCommand& rc);
00134
00135 virtual RampCommand& operator=(const RampCommand& rc);
00136
00137 virtual ~RampCommand() { if (m_nachumkehr) delete m_nachumkehr; }
00138
00142 virtual double getPos(double TimeElapsed);
00143 double getPos() { return moveCommand::pos(); }
00144
00148 virtual double getVel(double TimeElapsed);
00149 double getVel() { return moveCommand::vel(); }
00150
00154 virtual double getTotalTime();
00155
00156 virtual bool inPhase1() { m_now.SetNow(); return ( m_now-m_timeStarted <= m_T1 )?true:false; }
00157 virtual bool inPhase3()
00158 { m_now.SetNow(); return ( m_now-m_timeStarted > m_T1 + m_T2 && m_now-m_timeStarted < m_T1 + m_T2 + m_T3)?true:false; }
00159
00163 virtual double T1() { return (m_umkehr)?(m_T1 + m_nachumkehr->T1()):m_T1; }
00164 virtual double T2() { return (m_umkehr)?m_nachumkehr->T2():m_T2; }
00165 virtual double T3() { return (m_umkehr)?m_nachumkehr->T3():m_T3; }
00166
00170 static void calculateAV(double x0, double v0, double xtarget, double time, double T3, double amax,
00171 double vmax, double& a, double& v);
00172
00173 private:
00174
00175 static std::ofstream debug;
00176
00177 double m_x0, m_v0;
00178 double m_xtarget;
00179 double m_amax, m_vmax;
00180
00181 double m_T1, m_T2, m_T3;
00182 double m_a1, m_v2, m_a3;
00183 bool m_umkehr;
00184 RampCommand * m_nachumkehr;
00185 };
00186
00187 #endif