00001 #include <robodyn_controllers/TreeIkTrajectory.h> 00002 #include "nasa_common_logging/Logger.h" 00003 00004 TreeIkTrajectory::TreeIkTrajectory() 00005 : lastTime(0.) 00006 { 00007 00008 } 00009 00010 void TreeIkTrajectory::getPose(double time, KDL::JntArrayAcc& pose) 00011 { 00012 if (time == 0.) 00013 { 00014 pose = jointsLast = jointsInit; 00015 lastTime = 0.; 00016 return; 00017 } 00018 00019 if (time < lastTime) 00020 { 00021 std::stringstream err; 00022 err << "TreeIkTrajectory time moved backwards" << std::endl; 00023 NasaCommonLogging::Logger::log("gov.nasa.controllers.TreeIkTrajectory", log4cpp::Priority::ERROR, err.str()); 00024 throw std::runtime_error(err.str()); 00025 return; 00026 } 00027 00028 if (time == lastTime) 00029 { 00030 pose = jointsLast; 00031 return; 00032 } 00033 00034 // get pos 00035 trajectory->getPose(time, nodeFramesAcc); 00036 nodeFrames.resize(nodeFramesAcc.size()); 00037 00038 for (unsigned int i = 0; i < nodeFramesAcc.size(); ++i) 00039 { 00040 nodeFrames[i] = nodeFramesAcc[i].GetFrame(); 00041 } 00042 00043 pose.resize(jointsInit.q.rows()); 00044 treeIk->getJointPositions(jointsLast.q, nodeNames, nodeFrames, pose.q, nodePriorities); 00045 00046 // get vel & acc 00047 for (unsigned int i = 0; i < pose.q.rows(); ++i) 00048 { 00049 double tstep = time - lastTime; 00050 00051 if (tstep < treeIk->getTimeStep() / 2.) 00052 { 00053 tstep = treeIk->getTimeStep() / 2.; 00054 } 00055 00056 pose.qdot(i) = (pose.q(i) - jointsLast.q(i)) / tstep; 00057 pose.qdotdot(i) = (pose.qdot(i) - jointsLast.qdot(i)) / tstep; 00058 } 00059 00060 lastTime = time; 00061 jointsLast = pose; 00062 }