inline double ParallelKinematicMachine3PUPS::getEndEffectorPoseError( const arma::Col<double>::fixed<6>& endEffectorPose, const arma::Row<double>& redundantJointActuations) const { const arma::Cube<double>::fixed<3, 3, 2>& model = getModel(endEffectorPose, redundantJointActuations); const arma::Mat<double>::fixed<3, 3>& baseJoints = model.slice(0); const arma::Mat<double>::fixed<3, 3>& endEffectorJoints = model.slice(1); arma::Mat<double>::fixed<3, 3> endEffectorJointsRotated = endEffectorJoints; endEffectorJointsRotated.each_col() -= endEffectorPose.subvec(0, 1); const arma::Mat<double>::fixed<3, 3>& baseToEndEffectorJointPositions = endEffectorJoints - baseJoints; const arma::Row<double>::fixed<3>& baseToEndEffectorJointActuations = arma::sqrt(arma::sum(arma::square(baseToEndEffectorJointPositions))); if (arma::any(baseToEndEffectorJointActuations < minimalActiveJointActuations_) || arma::any(baseToEndEffectorJointActuations > maximalActiveJointActuations_)) { return 0.0; } arma::Mat<double>::fixed<6, 3> forwardKinematic; forwardKinematic.head_rows(3) = baseToEndEffectorJointPositions; for (std::size_t n = 0; n < baseToEndEffectorJointPositions.n_cols; ++n) { forwardKinematic.submat(3, n, 5, n) = arma::cross(endEffectorJointsRotated.col(n), baseToEndEffectorJointPositions.col(n)); } arma::Mat<double> inverseKinematic(6, 3 + redundantJointIndicies_.n_elem, arma::fill::zeros); inverseKinematic.diag() = -arma::sqrt(arma::sum(arma::square(baseToEndEffectorJointPositions))); for (std::size_t n = 0; n < redundantJointIndicies_.n_elem; ++n) { const unsigned int& redundantJointIndex = redundantJointIndicies_(n); inverseKinematic(n, 3 + n) = arma::dot(baseToEndEffectorJointPositions.col(redundantJointIndex), redundantJointAngles_.col(redundantJointIndex)); } return -1.0 / arma::cond(arma::solve(forwardKinematic.t(), inverseKinematic)); }
inline double ParallelKinematicMachine3PRPR::getEndEffectorPoseError( const arma::Col<double>::fixed<3>& endEffectorPose, const arma::Row<double>& redundantJointActuations) const { const arma::Cube<double>::fixed<2, 3, 2>& model = getModel(endEffectorPose, redundantJointActuations); const arma::Mat<double>::fixed<2, 3>& baseJointPositions = model.slice(1); const arma::Mat<double>::fixed<2, 3>& endEffectorJointPositions = model.slice(1); arma::Mat<double>::fixed<2, 3> endEffectorJointPositionsRotated = endEffectorJointPositions; endEffectorJointPositionsRotated.each_col() -= endEffectorPose.subvec(0, 1); const arma::Mat<double>::fixed<2, 3>& baseToEndEffectorJointPositions = endEffectorJointPositions - baseJointPositions; const arma::Row<double>::fixed<3>& baseToEndEffectorJointActuations = arma::sqrt(arma::sum(arma::square(baseToEndEffectorJointPositions))); if (arma::any(baseToEndEffectorJointActuations < minimalActiveJointActuations_) || arma::any(baseToEndEffectorJointActuations > maximalActiveJointActuations_)) { return 0.0; } arma::Mat<double>::fixed<3, 3> forwardKinematic; forwardKinematic.head_rows(2) = baseToEndEffectorJointPositions; forwardKinematic.row(2) = -forwardKinematic.row(0) % endEffectorJointPositionsRotated.row(1) + forwardKinematic.row(1) % endEffectorJointPositionsRotated.row(0); arma::Mat<double> inverseKinematic(3, 3 + redundantJointIndicies_.n_elem, arma::fill::zeros); inverseKinematic.diag() = -baseToEndEffectorJointActuations; for (std::size_t n = 0; n < redundantJointIndicies_.n_elem; ++n) { const unsigned int& redundantJointIndex = redundantJointIndicies_(n); inverseKinematic(n, 3 + n) = forwardKinematic(redundantJointIndex, 0) * redundantJointAngleCosines_(n) + forwardKinematic(redundantJointIndex, 1) * redundantJointAngleSines_(n); } return -1.0 / arma::cond(arma::solve(forwardKinematic.t(), inverseKinematic)); }
//ReadHTKHeader(); bool CmpParser::getNextFrame(arma::Col<double> &frame, int derivate){ if (file.is_open()==false) return false; if (hdr.sampKind&1024){//compressed mode. TODO to be implemented std::cerr<<"HTK compressed mode is not yet supported"<<std::endl; return false; } else{ unsigned int dim=hdr.sampSize/4; arma::Col<double> data; if (!this->readData(data)){ return false; } if (prev1.n_rows!=data.n_rows){ prev2=data; if (!this->readData(prev1)){ return false; } if (!this->readData(data)){ return false; } } if (derivate==2){ frame.resize(3*dim); frame.subvec(0, dim-1)=prev1; frame.subvec(dim, 2*dim-1)=(data-prev2)/2; frame.subvec(2*dim, 3*dim-1)=prev2-2*prev1+data; } else if (derivate==1){ frame.resize(2*dim); frame.subvec(0, dim-1)=prev1; frame.subvec(dim, 2*dim-1)=(data-prev2)/2; } else{ frame.resize(dim); frame=data; } prev2=prev1; prev1=data; //std::cout<<"data:"<<std::endl; //std::cout<<frame<<std::endl; return true; } }
//This function is specific to a single problem void calculateDependentVariables(const arma::Mat<std::complex<double> >& myOffsets, const arma::Col<std::complex<double> >& myCurrentGuess, arma::Col<std::complex<double> >& targetsCalculated) { //Evaluate a dependent variable for each iteration //The arma::Col allows this to be expressed as a vector operation for(int i = 0; i < NUMDIMENSIONS; i++) { targetsCalculated[i] = arma::sum(pow(myCurrentGuess.subvec(0,1) - myOffsets.row(i).subvec(0,1).t(),2.0)); targetsCalculated[i] = targetsCalculated[i] + myCurrentGuess[2]*pow(-1.0, i) - myOffsets.row(i)[2]; //std::cout << targetsCalculated[i] << std::endl; } //std::cout << "model evaluated *************************" << std::endl; //std::cout << targetsCalculated << std::endl; //std::cout << myOffsets << std::endl; }
inline arma::Cube<double>::fixed<2, 3, 2> ParallelKinematicMachine3PRPR::getModel( const arma::Col<double>::fixed<3>& endEffectorPose, const arma::Row<double>& redundantJointActuations) const { verify(arma::any(arma::vectorise(redundantJointActuations < 0)) || arma::any(arma::vectorise(redundantJointActuations > 1)), "All values for the actuation of redundantion joints must be between [0, 1]."); verify(redundantJointActuations.n_elem == redundantJointIndicies_.n_elem, "The number of redundant actuations must be equal to the number of redundant joints."); arma::Cube<double>::fixed<2, 3, 2> model; const arma::Col<double>::fixed<2>& endEffectorPosition = endEffectorPose.subvec(0, 1); const double& endEffectorAngle = endEffectorPose(2); model.slice(0) = redundantJointStartPositions_; for (std::size_t n = 0; n < redundantJointIndicies_.n_elem; n++) { const unsigned int& redundantJointIndex = redundantJointIndicies_(n); model.slice(0).col(redundantJointIndex) += redundantJointActuations(redundantJointIndex) * redundantJointStartToEndPositions_.col(redundantJointIndex); } model.slice(1) = get2DRotation(endEffectorAngle) * endEffectorJointPositions_; model.slice(1).each_col() += endEffectorPosition; return model; }