Skip to content
Snippets Groups Projects
DMPComponent.cpp 16.1 KiB
Newer Older
Nikolaus Vahrenkamp's avatar
Nikolaus Vahrenkamp committed
/*
 * This file is part of ArmarX.
 *
 * ArmarX is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation.
 *
 * ArmarX is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
Nikolaus Vahrenkamp's avatar
Nikolaus Vahrenkamp committed
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program. If not, see <http://www.gnu.org/licenses/>.
 *
 * @package    RobotAPI::ArmarXObjects::DMPComponent
 * @author     Mirko Waechter ( mirko dot waechter at kit dot edu )
 * @date       2015
 * @copyright  http://www.gnu.org/licenses/gpl-2.0.txt
Nikolaus Vahrenkamp's avatar
Nikolaus Vahrenkamp committed
 *             GNU General Public License
 */

#include "DMPComponent.h"
#include <MMM/Motion/MotionReaderXML.h>
#include <dmp/io/MMMConverter.h>
Martin Do's avatar
Martin Do committed
#include <dmp/testing/testdataset.h>
Nikolaus Vahrenkamp's avatar
Nikolaus Vahrenkamp committed

using namespace armarx;


void DMPComponent::onInitComponent()
{
    ARMARX_INFO << "initializing DMP component";
    usingProxy(getProperty<std::string>("LongtermMemoryName").getValue());
    ARMARX_INFO << "successfully initialized DMP component" ;
}


void DMPComponent::onConnectComponent()
{
    ARMARX_INFO << "connecting DMP component";
Nikolaus Vahrenkamp's avatar
Nikolaus Vahrenkamp committed
    try
    {
        longtermMemoryPrx = getProxy<memoryx::LongtermMemoryInterfacePrx>(getProperty<std::string>("LongtermMemoryName").getValue());
Nikolaus Vahrenkamp's avatar
Nikolaus Vahrenkamp committed
    }
    catch (...)
Nikolaus Vahrenkamp's avatar
Nikolaus Vahrenkamp committed
    {
        ARMARX_ERROR << "cannot get longterm memory proxy";
        return;
    }
Nikolaus Vahrenkamp's avatar
Nikolaus Vahrenkamp committed
    try
    {
        dmpDataMemoryPrx = longtermMemoryPrx->getDMPSegment();
Nikolaus Vahrenkamp's avatar
Nikolaus Vahrenkamp committed
    }
    catch (...)
Nikolaus Vahrenkamp's avatar
Nikolaus Vahrenkamp committed
    {
        ARMARX_ERROR << "cannot get dmp segment of longterm memory";
        return;
    }

    ARMARX_INFO << "successfully connected DMP component";
}


void DMPComponent::onDisconnectComponent()
{
    ARMARX_INFO << "disconnecting DMP component";
}


void DMPComponent::onExitComponent()
{
    ARMARX_INFO << "exiting DMP component";
}


Nikolaus Vahrenkamp's avatar
Nikolaus Vahrenkamp committed
void DMPComponent::instantiateDMP(int DMPType, const Ice::Current&)
{
Nikolaus Vahrenkamp's avatar
Nikolaus Vahrenkamp committed
    ARMARX_INFO << "instantiate DMP";
    dmpType = DMPType;

Nikolaus Vahrenkamp's avatar
Nikolaus Vahrenkamp committed
    switch (dmpType)
    {
        case ARMARX_DMPTYPE_BASICDMP:
            basicdmp.reset(new DMP::BasicDMP);
            break;

        case ARMARX_DMPTYPE_DMP3RDORDER:
            dmp3rdorder.reset(new DMP::DMP3rdOrder);
            break;

        case ARMARX_DMPTYPE_DMP3RDORDERFORCEFIELD:
            dmp3rdorder.reset(new DMP::DMP3rdOrderForceField);
            break;

        case ARMARX_DMPTYPE_ENDVELODMP:
            basicdmp.reset(new DMP::EndVeloDMP);
            break;

        case ARMARX_DMPTYPE_FORCEFIELDDMP:
            basicdmp.reset(new DMP::ForceFieldDMP);
            break;

        case ARMARX_DMPTYPE_SIMPLEENDVELODMP:
            basicdmp.reset(new DMP::SimpleEndVeloDMP);
            break;
        //    case ARMARX_DMPTYPE_ENDVELFORCEFILELDDMP: basicdmp.reset(new DMP::EndVeloForceFieldDMP);break;
        //    case ARMARX_DMPTYPE_QUATERNIONDMP: basicdmp.reset(new DMP::QuaternionDMP); break; //error: quanternionDMP is an abstract type.
        //    case ARMARX_DMPTYPE_ADAPTIVEGOAL3RDORDERDMP: basicdmp.reset(new DMP::AdaptiveGoal3rdOrderDMP); break; //error:
Martin Do's avatar
Martin Do committed
        case ARMARX_DMPTYPE_PERIODICTRANSIENTDMP:
            ARMARX_INFO << "instantiate PeriodicDMP";
            basicdmp.reset(new DMP::PeriodicTransientDMP);
            break;
Nikolaus Vahrenkamp's avatar
Nikolaus Vahrenkamp committed
        default:
            ARMARX_ERROR << "ERROR: It is not a valid dmp type. " ;
Nikolaus Vahrenkamp's avatar
Nikolaus Vahrenkamp committed
    }
Nikolaus Vahrenkamp's avatar
Nikolaus Vahrenkamp committed
void DMPComponent::storeDMPInDatabase(const std::string& name, const ::Ice::Current&)
{
Nikolaus Vahrenkamp's avatar
Nikolaus Vahrenkamp committed

    ARMARX_INFO << "storing DMP in the database";
    memoryx::DMPEntityPtr dmpEntity = new memoryx::DMPEntity(name);

    dmpEntity->setDMPType(dmpType);
    dmpEntity->setDMPName(name);
    dmpEntity->set3rdOrder(is3rdOrder);

    std::stringstream dmptext;
    boost::archive::text_oarchive ar(dmptext);


Nikolaus Vahrenkamp's avatar
Nikolaus Vahrenkamp committed
    if (is3rdOrder)
    {
Nikolaus Vahrenkamp's avatar
Nikolaus Vahrenkamp committed
        dmpEntity->set3rdOrder(true);
Nikolaus Vahrenkamp's avatar
Nikolaus Vahrenkamp committed
        ar << boost::serialization::make_nvp("dmp", *dmp3rdorder);
    }
    else
    {
Nikolaus Vahrenkamp's avatar
Nikolaus Vahrenkamp committed
        dmpEntity->set3rdOrder(false);
Nikolaus Vahrenkamp's avatar
Nikolaus Vahrenkamp committed
        ar << boost::serialization::make_nvp("dmp", *basicdmp);
Nikolaus Vahrenkamp's avatar
Nikolaus Vahrenkamp committed
    }
Nikolaus Vahrenkamp's avatar
Nikolaus Vahrenkamp committed
    dmpEntity->setDMPtextStr(dmptext.str());

    std::cout << dmpEntity << std::endl;
    const std::string entityID = dmpDataMemoryPrx->addEntity(dmpEntity);
    dmpEntity->setId(entityID);

    ARMARX_INFO << "successfully stored DMP";

}


Nikolaus Vahrenkamp's avatar
Nikolaus Vahrenkamp committed
void DMPComponent::getDMPFromDatabase(const std::string& dmpName, const Ice::Current&)
{
Nikolaus Vahrenkamp's avatar
Nikolaus Vahrenkamp committed
    ARMARX_INFO << "getting DMP from database";
Nikolaus Vahrenkamp's avatar
Nikolaus Vahrenkamp committed

    if (!dmpDataMemoryPrx->hasEntityByName(dmpName))
    {
Nikolaus Vahrenkamp's avatar
Nikolaus Vahrenkamp committed
        ARMARX_ERROR << "DMP with name " + dmpName + " does not exist in the database";
        return;
    }

    memoryx::DMPEntityPtr dmpEntity = memoryx::DMPEntityPtr::dynamicCast(dmpDataMemoryPrx->getDMPEntityByName(dmpName));

    std::string name = dmpEntity->getDMPName();
    ARMARX_INFO << "DMP with name: " + name + " is loaded";

    dmpType = dmpEntity->getDMPType();
    ARMARX_INFO << "dmp type is " + std::to_string(dmpType);

    is3rdOrder = dmpEntity->get3rdOrder();
    ARMARX_INFO << "is3rdOrder is " + std::to_string(is3rdOrder);

    std::string textStr = dmpEntity->getDMPtextStr();
    ARMARX_INFO << textStr;
    std::stringstream istr;
    istr.str(textStr);

    boost::archive::text_iarchive ar(istr);

Nikolaus Vahrenkamp's avatar
Nikolaus Vahrenkamp committed
    if (is3rdOrder)
    {
Nikolaus Vahrenkamp's avatar
Nikolaus Vahrenkamp committed
        ar >> boost::serialization::make_nvp("dmp", *dmp3rdorder);
Nikolaus Vahrenkamp's avatar
Nikolaus Vahrenkamp committed
    else
Nikolaus Vahrenkamp's avatar
Nikolaus Vahrenkamp committed
        ar >> boost::serialization::make_nvp("dmp", *basicdmp);
Nikolaus Vahrenkamp's avatar
Nikolaus Vahrenkamp committed

    ARMARX_INFO << "successfully got dmp from database.";
}


Nikolaus Vahrenkamp's avatar
Nikolaus Vahrenkamp committed
void DMPComponent::trainDMP(const ::Ice::Current&)
{
Nikolaus Vahrenkamp's avatar
Nikolaus Vahrenkamp committed
    // learn dmp
Martin Do's avatar
Martin Do committed
    ARMARX_INFO << "In Train DMP";
    if (dmpType == ARMARX_DMPTYPE_BASICDMP)
Martin Do's avatar
Martin Do committed

Nikolaus Vahrenkamp's avatar
Nikolaus Vahrenkamp committed
        basicdmp->learnFromTrajectories(trajs);
Martin Do's avatar
Martin Do committed
    else if (dmpType == ARMARX_DMPTYPE_DMP3RDORDER)
Martin Do's avatar
Martin Do committed

Nikolaus Vahrenkamp's avatar
Nikolaus Vahrenkamp committed
        dmp3rdorder->learnFromTrajectories(trajs);
    }
Martin Do's avatar
Martin Do committed
    else if (dmpType == ARMARX_DMPTYPE_PERIODICTRANSIENTDMP)
    {


        basicdmp->learnFromTrajectories(trajs);
    }
    ARMARX_INFO << "Exit Train DMP";
Nikolaus Vahrenkamp's avatar
Nikolaus Vahrenkamp committed
void DMPComponent::calculateWholeTrajectory()
{
Nikolaus Vahrenkamp's avatar
Nikolaus Vahrenkamp committed
DMP::Vec<DMP::DMPState> DMPComponent::calculateNextState(DMP::Vec<DMP::DMPState>& initialStates, double t, double tInit, DMP::DVec& canonicalValues)
{
Nikolaus Vahrenkamp's avatar
Nikolaus Vahrenkamp committed
    if (configs.find(DMP_PARAMETERS_GOAL) == configs.end())
    {
Nikolaus Vahrenkamp's avatar
Nikolaus Vahrenkamp committed
        ARMARX_ERROR << "The goal of DMP must be specified";
    }

    DMP::DVec goal = boost::get<DMP::DVec>(configs[DMP_PARAMETERS_GOAL]);

    double temporalFactor;
Nikolaus Vahrenkamp's avatar
Nikolaus Vahrenkamp committed

    if (configs.find(DMP_PARAMETERS_TEMPORALFACTOR) != configs.end())
    {
Nikolaus Vahrenkamp's avatar
Nikolaus Vahrenkamp committed
        temporalFactor = boost::get<double>(configs[DMP_PARAMETERS_TEMPORALFACTOR]);
Nikolaus Vahrenkamp's avatar
Nikolaus Vahrenkamp committed
    else
Nikolaus Vahrenkamp's avatar
Nikolaus Vahrenkamp committed
        temporalFactor = 1.0;
Nikolaus Vahrenkamp's avatar
Nikolaus Vahrenkamp committed

    return basicdmp->calculateTrajectoryPoint(t, goal, tInit, initialStates, canonicalValues, temporalFactor);
}

Nikolaus Vahrenkamp's avatar
Nikolaus Vahrenkamp committed
DMP::Vec<DMP::_3rdOrderDMP> DMPComponent::calculateNextState(DMP::Vec<DMP::_3rdOrderDMP>& initialStates, double t, double tInit, DMP::DVec& canonicalValues)
{
    if (configs.find(DMP_PARAMETERS_GOAL) == configs.end())
    {
Nikolaus Vahrenkamp's avatar
Nikolaus Vahrenkamp committed
        ARMARX_ERROR << "The goal of DMP must be specified";
    }

    DMP::DVec goal = boost::get<DMP::DVec>(configs[DMP_PARAMETERS_GOAL]);

    double temporalFactor;
Nikolaus Vahrenkamp's avatar
Nikolaus Vahrenkamp committed

    if (configs.find(DMP_PARAMETERS_TEMPORALFACTOR) != configs.end())
    {
Nikolaus Vahrenkamp's avatar
Nikolaus Vahrenkamp committed
        temporalFactor = boost::get<double>(configs[DMP_PARAMETERS_TEMPORALFACTOR]);
Nikolaus Vahrenkamp's avatar
Nikolaus Vahrenkamp committed
    else
Nikolaus Vahrenkamp's avatar
Nikolaus Vahrenkamp committed
        temporalFactor = 1.0;
Nikolaus Vahrenkamp's avatar
Nikolaus Vahrenkamp committed

    return dmp3rdorder->calculateTrajectoryPoint(t, goal, tInit, initialStates, canonicalValues, temporalFactor);
}


Nikolaus Vahrenkamp's avatar
Nikolaus Vahrenkamp committed
void DMPComponent::readTrajectoryFromFile(const std::string& file, const Ice::Current&)
{
Nikolaus Vahrenkamp's avatar
Nikolaus Vahrenkamp committed
    std::string ext = file.rfind(".") == file.npos ? file : file.substr(file.rfind(".") + 1);
Nikolaus Vahrenkamp's avatar
Nikolaus Vahrenkamp committed
    if (ext == "xml")
    {
Nikolaus Vahrenkamp's avatar
Nikolaus Vahrenkamp committed
        DMP::SampledTrajectoryV2 traj;
        MMM::MotionReaderXML motionreader;
        MMM::MotionPtr motion = motionreader.loadMotion(file);
        traj = DMP::MMMConverter::fromMMMJoints(motion);
        trajs.push_back(traj);
Nikolaus Vahrenkamp's avatar
Nikolaus Vahrenkamp committed
    }
    else if (ext == "csv")
    {
Nikolaus Vahrenkamp's avatar
Nikolaus Vahrenkamp committed
        DMP::SampledTrajectoryV2 traj;
        traj.readFromCSVFile(file);
        trajs.push_back(traj);
Martin Do's avatar
Martin Do committed

    }
    else if (ext == "vsg")
    {
Martin Do's avatar
Martin Do committed
        TestDataSet set;
        set.readFromFile(file);
        set.cutConstantBeginning();
        DMP::SampledTrajectoryV2 testTraj;//= set.trajectoryForPositionsV2();

        trajs.push_back(testTraj);
        set.trajectoryForPositionsV2(trajs[0], usedDimensions);
        //DVec anchorPoint;//delete set;
        //anchorPoint.push_back(0.0);
        //anchorPoint.push_back(1.0);
        //anchorPoint.push_back(2.0);
        //trajs[0].m_anchorPoint = anchorPoint;

        ARMARX_INFO << "VSG File LOADED";
        //trajs.resize(1);
        //trajs[1] = traji;

        ARMARX_INFO << "VSG File LOADED";
        printf("Size of traj %f %f\n", trajs[0].m_anchorPoint[0], trajs[0].m_anchorPoint[1]);
        ARMARX_INFO << "VSG File LOADED";
        //ARMARX_INFO << "Size of loaded Trajectories " << trajs.size() << " and " << traj.getAnchorPoint();
        ARMARX_INFO << "VSG File LOADED DONE";
Nikolaus Vahrenkamp's avatar
Nikolaus Vahrenkamp committed
        ARMARX_ERROR << "Error: The file is not valid ";
        return;
    }

}

Nikolaus Vahrenkamp's avatar
Nikolaus Vahrenkamp committed
void DMPComponent::setDMPConfiguration()
{
Nikolaus Vahrenkamp's avatar
Nikolaus Vahrenkamp committed
    //    for(configMap::iterator it = configs.begin(); it != configs.end(); it++){
    //        if(getBasicDMPType() == ARMARX_DMPTYPE_BASICDMP){
    //            basicdmp->setConfiguration(it->first, it->second);
    //        }else if(getBasicDMPType() == ARMARX_DMPTYPE_DMP3RDORDER){
    //            dmp3rdorder->setConfiguration(it->first, it->second);
    //        }
    //    }
Nikolaus Vahrenkamp's avatar
Nikolaus Vahrenkamp committed
configMap DMPComponent::constructConfigMap(DMP::Vec<int> paraIDs, DMP::Vec<paraType> paraVals)
{
    if (paraIDs.size() != paraVals.size())
    {
Nikolaus Vahrenkamp's avatar
Nikolaus Vahrenkamp committed
        ARMARX_WARNING << "ID list and value list have different sizes, which may cause error.";
    }

Nikolaus Vahrenkamp's avatar
Nikolaus Vahrenkamp committed
    for (size_t i = 0; i < paraIDs.size(); i++)
    {
        if (configs.find(paraIDs[i]) == configs.end())
        {
Nikolaus Vahrenkamp's avatar
Nikolaus Vahrenkamp committed
            configs.insert(configPair(paraIDs[i], paraVals[i]));
Nikolaus Vahrenkamp's avatar
Nikolaus Vahrenkamp committed
        else
Nikolaus Vahrenkamp's avatar
Nikolaus Vahrenkamp committed
            configs[paraIDs[i]] = paraVals[i];
Nikolaus Vahrenkamp's avatar
Nikolaus Vahrenkamp committed
    }
Nikolaus Vahrenkamp's avatar
Nikolaus Vahrenkamp committed
    return configs;
}


Nikolaus Vahrenkamp's avatar
Nikolaus Vahrenkamp committed
std::string DMPComponent::getDMPTypeName()
{
    switch (dmpType)
    {
        case ARMARX_DMPTYPE_BASICDMP:
            return "BasicDMP";

        case ARMARX_DMPTYPE_ENDVELODMP:
            return "EndVeloDMP";

        case ARMARX_DMPTYPE_SIMPLEENDVELODMP:
            return "SimpleEndVeloDMP";

        case ARMARX_DMPTYPE_FORCEFIELDDMP:
            return "ForceFieldDMP";

        case ARMARX_DMPTYPE_ENDVELFORCEFILELDDMP:
            return "EndVeloForceFieldDMP";

        case ARMARX_DMPTYPE_PERIODICTRANSIENTDMP:
            return "PeriodicTransientDMP";

        case ARMARX_DMPTYPE_DMP3RDORDER:
            return "3rdOrderDMP";

        case ARMARX_DMPTYPE_DMP3RDORDERFORCEFIELD:
            return "3rdOrderForceFieldDMP";

        case ARMARX_DMPTYPE_ADAPTIVEGOAL3RDORDERDMP:
            return "AdaptiveGoal3rdOrderDMP";

        case ARMARX_DMPTYPE_QUATERNIONDMP:
            return "QuaternionDMP";

        default:
            ARMARX_ERROR << "This is not a valid dmp type";
            return "unknownDMP";
Nikolaus Vahrenkamp's avatar
Nikolaus Vahrenkamp committed
void DMPComponent::setDMPState(const ::armarx::cStateVec& state, const ::Ice::Current&)
{
Nikolaus Vahrenkamp's avatar
Nikolaus Vahrenkamp committed
    if (!is3rdOrder)
    {
Nikolaus Vahrenkamp's avatar
Nikolaus Vahrenkamp committed
        currentDMPState.resize(state.size());
Nikolaus Vahrenkamp's avatar
Nikolaus Vahrenkamp committed

        for (size_t i = 0; i < state.size(); i++)
        {
Nikolaus Vahrenkamp's avatar
Nikolaus Vahrenkamp committed
            currentDMPState[i].pos = state[i].pos;
            currentDMPState[i].vel = state[i].vel;

        }
Nikolaus Vahrenkamp's avatar
Nikolaus Vahrenkamp committed
        currentDMP3rdOrder.resize(state.size());
Nikolaus Vahrenkamp's avatar
Nikolaus Vahrenkamp committed

        for (size_t i = 0; i < state.size(); i++)
        {
Nikolaus Vahrenkamp's avatar
Nikolaus Vahrenkamp committed
            currentDMP3rdOrder[i].pos = state[i].pos;
            currentDMP3rdOrder[i].vel = state[i].vel;
            currentDMP3rdOrder[i].acc = state[i].acc;
        }
    }

}

Nikolaus Vahrenkamp's avatar
Nikolaus Vahrenkamp committed
void DMPComponent::setParameter(const int paraID, double value, const ::Ice::Current&)
{
    if (configs.find(paraID) == configs.end())
    {
Nikolaus Vahrenkamp's avatar
Nikolaus Vahrenkamp committed
        configs.insert(configPair(paraID, value));
Nikolaus Vahrenkamp's avatar
Nikolaus Vahrenkamp committed
    else
Nikolaus Vahrenkamp's avatar
Nikolaus Vahrenkamp committed
        configs[paraID] = value;
Nikolaus Vahrenkamp's avatar
Nikolaus Vahrenkamp committed
void DMPComponent::setGoal(const DVector& value, const Ice::Current&)
{
    if (configs.find(DMP_PARAMETERS_GOAL) == configs.end())
    {
Nikolaus Vahrenkamp's avatar
Nikolaus Vahrenkamp committed
        configs.insert(configPair(DMP_PARAMETERS_GOAL, DMP::DVec(value)));
Nikolaus Vahrenkamp's avatar
Nikolaus Vahrenkamp committed
    else
Nikolaus Vahrenkamp's avatar
Nikolaus Vahrenkamp committed
        configs[DMP_PARAMETERS_GOAL] = DMP::DVec(value);
Nikolaus Vahrenkamp's avatar
Nikolaus Vahrenkamp committed
void DMPComponent::setStartPosition(const DVector& value, const Ice::Current&)
{
    if (configs.find(DMP_PARAMETERS_STARTPOSITION) == configs.end())
    {
Nikolaus Vahrenkamp's avatar
Nikolaus Vahrenkamp committed
        configs.insert(configPair(DMP_PARAMETERS_STARTPOSITION, DMP::DVec(value)));
Nikolaus Vahrenkamp's avatar
Nikolaus Vahrenkamp committed
    else
Nikolaus Vahrenkamp's avatar
Nikolaus Vahrenkamp committed
        configs[DMP_PARAMETERS_STARTPOSITION] = DMP::DVec(value);
Nikolaus Vahrenkamp's avatar
Nikolaus Vahrenkamp committed
void DMPComponent::setTimeStamps(const DVector& value, const Ice::Current&)
{
Nikolaus Vahrenkamp's avatar
Nikolaus Vahrenkamp committed
    timestamps = DMP::DVec(value);
}

Nikolaus Vahrenkamp's avatar
Nikolaus Vahrenkamp committed
void DMPComponent::setCanonicalValues(const DVector& value, const Ice::Current&)
{
Martin Do's avatar
Martin Do committed

Nikolaus Vahrenkamp's avatar
Nikolaus Vahrenkamp committed
    canonicalValues = DMP::DVec(value);
}


Nikolaus Vahrenkamp's avatar
Nikolaus Vahrenkamp committed
::armarx::cStateVec getcStateVec(const DMP::Vec<DMP::DMPState>& dmpstate)
{
Nikolaus Vahrenkamp's avatar
Nikolaus Vahrenkamp committed
    ::armarx::cStateVec sv;
    sv.resize(dmpstate.size());
Nikolaus Vahrenkamp's avatar
Nikolaus Vahrenkamp committed

    for (size_t i = 0; i < dmpstate.size(); i++)
    {
Nikolaus Vahrenkamp's avatar
Nikolaus Vahrenkamp committed
        sv[i].pos = dmpstate[i].pos;
        sv[i].vel = dmpstate[i].vel;
    }
Nikolaus Vahrenkamp's avatar
Nikolaus Vahrenkamp committed
    return sv;
}

Nikolaus Vahrenkamp's avatar
Nikolaus Vahrenkamp committed
::armarx::cStateVec getcStateVec(const DMP::Vec<DMP::_3rdOrderDMP>& dmpstate)
{
Nikolaus Vahrenkamp's avatar
Nikolaus Vahrenkamp committed
    ::armarx::cStateVec sv;
    sv.resize(dmpstate.size());
Nikolaus Vahrenkamp's avatar
Nikolaus Vahrenkamp committed

    for (size_t i = 0; i < dmpstate.size(); i++)
    {
Nikolaus Vahrenkamp's avatar
Nikolaus Vahrenkamp committed
        sv[i].pos = dmpstate[i].pos;
        sv[i].vel = dmpstate[i].vel;
        sv[i].acc = dmpstate[i].acc;
    }
Nikolaus Vahrenkamp's avatar
Nikolaus Vahrenkamp committed
    return sv;
}

Nikolaus Vahrenkamp's avatar
Nikolaus Vahrenkamp committed
::armarx::cStateVec DMPComponent::getNextState(const ::Ice::Current&)
{
Martin Do's avatar
Martin Do committed
    ARMARX_INFO << "In getNext State ";
Nikolaus Vahrenkamp's avatar
Nikolaus Vahrenkamp committed
    setDMPConfiguration();

Nikolaus Vahrenkamp's avatar
Nikolaus Vahrenkamp committed
    if (timestamps.size() == 0)
    {
Nikolaus Vahrenkamp's avatar
Nikolaus Vahrenkamp committed
        ARMARX_ERROR << "Timestampes must be specified.";
    }
Martin Do's avatar
Martin Do committed
    ARMARX_INFO << "In getNext State 1";
Nikolaus Vahrenkamp's avatar
Nikolaus Vahrenkamp committed
    if (canonicalValues.size() == 0)
    {
Nikolaus Vahrenkamp's avatar
Nikolaus Vahrenkamp committed
        ARMARX_WARNING << "Canonical value is not specified. It will be set 1.0.";
        canonicalValues.push_back(1.0);
    }

Martin Do's avatar
Martin Do committed
    ARMARX_INFO << "In getNext State 2";
Nikolaus Vahrenkamp's avatar
Nikolaus Vahrenkamp committed

    double tInit = timestamps[tCurrent++];

Nikolaus Vahrenkamp's avatar
Nikolaus Vahrenkamp committed
    if (timestamps.size() <= tCurrent)
    {
Nikolaus Vahrenkamp's avatar
Nikolaus Vahrenkamp committed
        ARMARX_ERROR << "Unable to get next state, because time is gone.";
Nikolaus Vahrenkamp's avatar
Nikolaus Vahrenkamp committed

        if (!is3rdOrder)
        {
Nikolaus Vahrenkamp's avatar
Nikolaus Vahrenkamp committed
            return getcStateVec(currentDMPState);
Nikolaus Vahrenkamp's avatar
Nikolaus Vahrenkamp committed
        else
Nikolaus Vahrenkamp's avatar
Nikolaus Vahrenkamp committed
            return getcStateVec(currentDMP3rdOrder);
Nikolaus Vahrenkamp's avatar
Nikolaus Vahrenkamp committed

        tCurrent = 0;
    }
Martin Do's avatar
Martin Do committed
    ARMARX_INFO << "In getNext State 3";
Nikolaus Vahrenkamp's avatar
Nikolaus Vahrenkamp committed
    double t = timestamps[tCurrent];


Nikolaus Vahrenkamp's avatar
Nikolaus Vahrenkamp committed
    if (!is3rdOrder)
    {
        if (currentDMPState.size() == 0)
        {
Nikolaus Vahrenkamp's avatar
Nikolaus Vahrenkamp committed
            ARMARX_ERROR << "The current state is not available. Please specify current state with setDMPState().";
        }
Nikolaus Vahrenkamp's avatar
Nikolaus Vahrenkamp committed
        currentDMPState = calculateNextState(currentDMPState, t, tInit, canonicalValues);
        return getcStateVec(currentDMPState);
Nikolaus Vahrenkamp's avatar
Nikolaus Vahrenkamp committed
    }
    else
    {
        if (currentDMP3rdOrder.size() == 0)
        {
Nikolaus Vahrenkamp's avatar
Nikolaus Vahrenkamp committed
            ARMARX_ERROR << "The current state is not available. Please specify current state with setDMPState().";
        }
Nikolaus Vahrenkamp's avatar
Nikolaus Vahrenkamp committed
        currentDMP3rdOrder = calculateNextState(currentDMP3rdOrder, t, tInit, canonicalValues);
        return getcStateVec(currentDMP3rdOrder);
    }
}


Nikolaus Vahrenkamp's avatar
Nikolaus Vahrenkamp committed
void DMPComponent::removeDMPFromDatabase(const std::string& dmpName, const ::Ice::Current&)
{
Nikolaus Vahrenkamp's avatar
Nikolaus Vahrenkamp committed
    ARMARX_INFO << "removing DMP from database";
Nikolaus Vahrenkamp's avatar
Nikolaus Vahrenkamp committed

    if (!dmpDataMemoryPrx->hasEntityByName(dmpName))
    {
Nikolaus Vahrenkamp's avatar
Nikolaus Vahrenkamp committed
        ARMARX_ERROR << "DMP with name " + dmpName + " does not exist in the database";
        return;
    }

    memoryx::DMPEntityPtr dmpEntity = memoryx::DMPEntityPtr::dynamicCast(dmpDataMemoryPrx->getDMPEntityByName(dmpName));
    dmpDataMemoryPrx->removeEntity(dmpEntity->getId());

Nikolaus Vahrenkamp's avatar
Nikolaus Vahrenkamp committed
    if (!dmpDataMemoryPrx->hasEntityByName(dmpName))
    {
Nikolaus Vahrenkamp's avatar
Nikolaus Vahrenkamp committed
        ARMARX_INFO << "successfully removed dmp from database";
    }
}

Martin Do's avatar
Martin Do committed
void DMPComponent::setDimensionsToLearn(const DVector& value, const Ice::Current&)
{
    usedDimensions.clear();
    for (int i = 0; i < value.size(); i++)
    {
        usedDimensions.push_back(int(value[i]));
    }
}

Nikolaus Vahrenkamp's avatar
Nikolaus Vahrenkamp committed

//PropertyDefinitionsPtr DMPComponent::createPropertyDefinitions()
//{
//    return PropertyDefinitionsPtr(new DMPComponentPropertyDefinitions(
//                                      getConfigIdentifier()));
//}