Go to the documentation of this file.00001
00060 #include <schunk_powercube_chain/simulatedArm.h>
00061 #include <schunk_powercube_chain/simulatedMotor.h>
00062 #include <math.h>
00063
00064 #define PSIM_CHECK_INITIALIZED() \
00065 if ( isInitialized()==false ) \
00066 { \
00067 m_ErrorMessage.assign("Manipulator not initialized."); \
00068 return false; \
00069 }
00070
00071 simulatedArm::simulatedArm()
00072 {
00073 std::cerr << "==============Starting Simulated Powercubes\n";
00074 m_DOF = 0;
00075 m_Initialized = false;
00076 m_motors.clear();
00077
00078 }
00079
00080 simulatedArm::~simulatedArm()
00081 {
00082
00083 ;
00084 }
00085
00086 bool simulatedArm::Init(PowerCubeCtrlParams * params)
00087 {
00088 m_DOF = params->GetNumberOfDOF();;
00089
00090 double vmax = 1.0;
00091 double amax = 1.5;
00092
00093 setMaxVelocity(vmax);
00094 setMaxAcceleration(amax);
00095 m_maxVel.resize(m_DOF);
00096 m_maxAcc.resize(m_DOF);
00097
00098 std::vector<double> ul(m_DOF);
00099 std::vector<double> ll(m_DOF);
00100 ul = params->GetUpperLimits();
00101 ll = params->GetLowerLimits();
00102 m_maxVel = params->GetMaxVel();
00103 m_maxAcc = params->GetMaxAcc();
00104
00105
00106 for (int i=0; i < m_DOF; i++)
00107 {
00108 m_motors.push_back( simulatedMotor(ll[i], ul[i], amax, vmax) );
00109 }
00110 std::cerr << "===========Initializing Simulated Powercubes\n";
00111 m_Initialized = true;
00112 return true;
00113 }
00114
00116 bool simulatedArm::Stop()
00117 {
00118 for (int i=0; i < m_DOF; i++)
00119 m_motors[i].stop();
00120 return true;
00121 }
00122
00123 bool simulatedArm::MoveJointSpaceSync(const std::vector<double>& target)
00124 {
00125 std::cerr << "======================TUTUTUTUT\n";
00126 PSIM_CHECK_INITIALIZED();
00127
00128
00129 std::vector<double> acc(m_DOF);
00130 std::vector<double> vel(m_DOF);
00131
00132 double TG = 0;
00133
00134
00135 try
00136 {
00137
00138
00139 std::vector<double> posnow;
00140 posnow.resize(m_DOF);
00141 if ( getConfig(posnow) == false )
00142 return false;
00143
00144 std::vector<double> velnow;
00145 velnow.resize(m_DOF);
00146 if ( getJointVelocities(velnow) == false )
00147 return false;
00148
00149 std::vector<double> times(m_DOF);
00150
00151 for (int i=0; i < m_DOF; i++)
00152 {
00153 RampCommand rm(posnow[i], velnow[i], target[i], m_maxAcc[i], m_maxVel[i]);
00154 times[i] = rm.getTotalTime();
00155 }
00156
00157
00158 int furthest = 0;
00159
00160 double max = times[0];
00161
00162 for (int i=1; i<m_DOF; i++)
00163 {
00164 if (times[i] > max)
00165 {
00166 max = times[i];
00167 furthest = i;
00168 }
00169 }
00170
00171 RampCommand rm_furthest(posnow[furthest], velnow[furthest], target[furthest], m_maxAcc[furthest], m_maxVel[furthest]);
00172
00173 double T1 = rm_furthest.T1();
00174 double T2 = rm_furthest.T2();
00175 double T3 = rm_furthest.T3();
00176
00177
00178 TG = T1 + T2 + T3;
00179
00180
00181 acc[furthest] = m_maxAcc[furthest];
00182 vel[furthest] = m_maxVel[furthest];
00183
00184 for (int i = 0; i < m_DOF; i++)
00185 {
00186 if (i != furthest)
00187 {
00188 double a; double v;
00189
00190 RampCommand::calculateAV(
00191 posnow[i],
00192 velnow[i],
00193 target[i],
00194 TG, T3,
00195 m_maxAcc[i],
00196 m_maxVel[i],
00197 a,
00198 v);
00199
00200 acc[i] = a;
00201 vel[i] = v;
00202 }
00203 }
00204 }
00205 catch(...)
00206 {
00207 m_ErrorMessage.assign("Problem during calculation of a and av.");
00208 return false;
00209 }
00210
00211
00212 for (int i=0; i < m_DOF; i++)
00213 {
00214 std::cout << "moving motor " << i << ": " << target[i] << ": " << vel[i] << ": " << acc[i] << "\n";
00215 m_motors[i].moveRamp(target[i], vel[i], acc[i]);
00216 }
00217
00218 return true;
00219 }
00220
00221 bool simulatedArm::MoveVel(const std::vector<double>& Vel)
00222 {
00223 PSIM_CHECK_INITIALIZED();
00224
00225
00226
00227 for (int i=0; i < m_DOF; i++)
00228 {
00229
00230 m_motors[i].moveVel(Vel[i]);
00231 }
00232
00233 return true;
00234 }
00235
00236
00237 bool simulatedArm::MovePos(const std::vector<double>& Pos)
00238 {
00239 PSIM_CHECK_INITIALIZED();
00240
00241 for (int i=0; i < m_DOF; i++)
00242 m_motors[i].movePos(Pos[i]);
00243
00244 return true;
00245 }
00246
00247
00249
00251
00253 bool simulatedArm::setMaxVelocity(double radpersec)
00254 {
00255 PSIM_CHECK_INITIALIZED();
00256
00257 m_maxVel.resize(m_DOF);
00258
00259 for (int i=0; i < m_DOF; i++)
00260 {
00261 m_maxAcc[i] = radpersec;
00262 m_motors[i].setMaxVelocity(radpersec);
00263 }
00264
00265 return true;
00266 }
00267
00268 bool simulatedArm::setMaxVelocity(const std::vector<double>& radpersec)
00269 {
00270 PSIM_CHECK_INITIALIZED();
00271
00272 m_maxAcc = radpersec;
00273
00274 for (int i=0; i < m_DOF; i++)
00275 m_motors[i].setMaxVelocity(radpersec[i]);
00276
00277 return true;
00278 }
00279
00281 bool simulatedArm::setMaxAcceleration(double radPerSecSquared)
00282 {
00283 PSIM_CHECK_INITIALIZED();
00284
00285 for (int i=0; i < m_DOF; i++)
00286 m_motors[i].setMaxAcceleration(radPerSecSquared);
00287
00288 return true;
00289 }
00290
00291 bool simulatedArm::setMaxAcceleration(const std::vector<double>& radPerSecSquared)
00292 {
00293 PSIM_CHECK_INITIALIZED();
00294
00295 for (int i=0; i < m_DOF; i++)
00296 m_motors[i].setMaxAcceleration(radPerSecSquared[i]);
00297
00298 return true;
00299 }
00300
00301
00303
00305
00306
00308 bool simulatedArm::getConfig(std::vector<double>& result)
00309 {
00310 PSIM_CHECK_INITIALIZED();
00311
00312 result.resize(m_DOF);
00313 for (int i=0; i < m_DOF; i++)
00314 {
00315 result[i] = m_motors[i].getAngle();
00316 }
00317
00318 return true;
00319 }
00320
00322 bool simulatedArm::getJointVelocities(std::vector<double>& result)
00323 {
00324 PSIM_CHECK_INITIALIZED();
00325
00326 result.resize(m_DOF);
00327 for (int i=0; i < m_DOF; i++)
00328 {
00329 result[i] = m_motors[i].getVelocity();
00330 }
00331
00332 return true;
00333 }
00334
00337 bool simulatedArm::statusMoving()
00338 {
00339 PSIM_CHECK_INITIALIZED();
00340
00341 for(int i=0; i<m_DOF; i++)
00342 {
00343 if (m_motors[i].statusMoving())
00344 return true;
00345 }
00346 return false;
00347 }
00348
00349
00351 bool simulatedArm::statusDec()
00352 {
00353 PSIM_CHECK_INITIALIZED();
00354
00355 for(int i=0; i<m_DOF; i++)
00356 {
00357 if (m_motors[i].statusDec())
00358 return true;
00359 }
00360 return false;
00361 }
00362
00364 bool simulatedArm::statusAcc()
00365 {
00366 PSIM_CHECK_INITIALIZED();
00367
00368 for(int i=0; i<m_DOF; i++)
00369 {
00370 if (m_motors[i].statusAcc())
00371 return true;
00372 }
00373 return false;
00374 }
00375