Go to the documentation of this file.00001
00060 #include <schunk_powercube_chain/simulatedMotor.h>
00061 #include <math.h>
00062
00063
00064 simulatedMotor::simulatedMotor(double lowLimit, double upLimit, double maxAcc, double maxVel)
00065 : m_lastMove(0, 0, 0, 1, 1)
00066 {
00067 m_ll = lowLimit;
00068 m_ul = upLimit;
00069 m_amax = fabs(maxAcc);
00070 m_vmax = fabs(maxVel);
00071
00072 m_lastMove.start();
00073 T0 = 0.0008;
00074 }
00075
00077
00079
00081 void simulatedMotor::moveRamp(double targetAngle, double vmax, double amax)
00082 {
00083 double x = m_lastMove.pos();
00084 double v = m_lastMove.vel();
00085
00086
00087 if ( targetAngle < m_ll ) targetAngle = m_ll;
00088 else if ( targetAngle > m_ul ) targetAngle = m_ul;
00089
00090 double vm = fabs(vmax);
00091 double am = fabs(amax);
00092
00093 if ( vm > m_vmax ) vm = m_vmax;
00094 if ( am > m_amax ) am = m_amax;
00095
00096 m_lastMove = RampCommand(x, v, targetAngle, am, vm);
00097 m_lastMove.start();
00098 }
00099
00100
00102 void simulatedMotor::moveVel(double vel)
00103 {
00104 double x = m_lastMove.pos();
00105 double v = m_lastMove.vel();
00106
00107 double targetAngle = x;
00108
00109
00110 if ( vel > 0 )
00111 targetAngle = m_ul;
00112 else if ( vel < 0)
00113 targetAngle = m_ll;
00114
00115 double vm = fabs(vel);
00116 if ( vm > m_vmax ) vm = m_vmax;
00117
00118 double a = fabs(vel-v) / T0;
00119
00120 m_lastMove = RampCommand(x, v, targetAngle, a, vm);
00121 m_lastMove.start();
00122 }
00123
00124
00126 void simulatedMotor::movePos(double pos)
00127 {
00128 double x = m_lastMove.pos();
00129 double v = m_lastMove.vel();
00130
00131 double targetAngle = pos;
00132
00133
00134 if ( targetAngle < m_ll ) targetAngle = m_ll;
00135 else if ( targetAngle > m_ul ) targetAngle = m_ul;
00136
00137 double vm = fabs(m_vmax);
00138
00139
00140 if ( pos < x )
00141 vm = -vm;
00142
00143 double a = fabs(vm-v) / T0;
00144
00145 m_lastMove = RampCommand(x, v, targetAngle, a, vm);
00146 m_lastMove.start();
00147 }
00148
00149
00151 void simulatedMotor::stop()
00152 {
00153
00154 double x = m_lastMove.pos();
00155 double v = 0;
00156
00157 m_lastMove = RampCommand(x, v, x, 1, 1);
00158 m_lastMove.start();
00159 }
00160
00162 RampCommand simulatedMotor::getRampMove(double targetAngle, double vmax, double amax)
00163 {
00164 double x = m_lastMove.pos();
00165 double v = m_lastMove.vel();
00166
00167
00168 if ( targetAngle < m_ll ) targetAngle = m_ll;
00169 else if ( targetAngle > m_ul ) targetAngle = m_ul;
00170
00171 double vm = fabs(vmax);
00172 double am = fabs(amax);
00173
00174 if ( vm > m_vmax ) vm = m_vmax;
00175 if ( am > m_amax ) am = m_amax;
00176
00177 RampCommand rc(x, v, targetAngle, am, vm);
00178 return rc;
00179 }