From af7090e32aaa34aa181a38fac2cb05519c966343 Mon Sep 17 00:00:00 2001 From: Ali Paikan <ali.paikan@iit.it> Date: Thu, 3 Jul 2014 20:10:46 +0200 Subject: [PATCH] Added more hand control states to execute a preshape or a set of preshapes --- .../RobotAPI/motioncontrol/MotionControl.cpp | 159 ++++++++++++++++-- source/RobotAPI/motioncontrol/MotionControl.h | 49 +++++- 2 files changed, 195 insertions(+), 13 deletions(-) diff --git a/source/RobotAPI/motioncontrol/MotionControl.cpp b/source/RobotAPI/motioncontrol/MotionControl.cpp index 6eded6e89..00de70399 100644 --- a/source/RobotAPI/motioncontrol/MotionControl.cpp +++ b/source/RobotAPI/motioncontrol/MotionControl.cpp @@ -698,16 +698,86 @@ void MotionControl::StopRobot::onEnter() sendEvent<EvSuccess>(); } +void DoPreshapeSet::defineParameters() +{ + addToInput("useLeftHand", VariantType::Bool, false); + addToInput("preshapes", VariantType::List(VariantType::String), false); + addToLocal("counterRef", VariantType::ChannelRef); +} -void CloseHand::defineParameters() +void DoPreshapeSet::defineSubstates() +{ + StatePtr preshape = addState<SelectAndDoPreshape>("SelectAndDoPreshape"); + setInitState(preshape, PM::createMapping()->mapFromParent("*")); + StatePtr success = addState<SuccessState>("SuccessState"); + StatePtr counter = addState<CounterStateTemplate<EvReachedIntermediatePreshape, EvReachedFinalPreshape> >("EvReachedIntermediatePreshape"); + + addTransition<EvSuccess>(preshape, counter, PM::createMapping()->mapFromParent("*")); + addTransition<EvReachedIntermediatePreshape>(counter, preshape, PM::createMapping()->mapFromParent("*")); + addTransition<EvReachedFinalPreshape>(counter, success, PM::createMapping()->mapFromParent("*")); + +} + + + +void DoPreshapeSet::onEnter() +{ + + ChannelRefPtr counterRef = ChannelRefPtr::dynamicCast(getContext()->systemObserverPrx->startCounter(0,"preshapeCounter")); + setLocal("counterRef", counterRef); +} + +void DoPreshapeSet::onExit() +{ + getContext()->systemObserverPrx->removeCounter(getLocal<ChannelRef>("counterRef")); +} + + + + + + + +void SelectAndDoPreshape::defineParameters() { addToInput("useLeftHand", VariantType::Bool, false); + addToInput("preshapes", VariantType::List(VariantType::String), false); + addToInput("counterRef", VariantType::ChannelRef, false); + + addToLocal("selectedPreshapeName", VariantType::String); + } +void SelectAndDoPreshape::defineSubstates() +{ + StatePtr doPreshape = addState<DoPreshape>("DoPreshape"); + PMPtr mapping = PM::createMapping()-> + mapFromParent("*") + ->mapFromParent("selectedPreshapeName", "preshapeName"); + setInitState(doPreshape, mapping); + StatePtr success = addState<SuccessState >("SuccessState"); + addTransition<EvSuccess>(doPreshape, success); -void CloseHand::onEnter() +} + + + +void SelectAndDoPreshape::onEnter() +{ + int index = getInput<ChannelRef>("counterRef")->getDataField("value")->getInt(); + std::string preshapeName = getInput<SingleTypeVariantList>("preshapes")->getVariant(index)->getString(); + setLocal("selectedPreshapeName", preshapeName); +} + +void DoPreshape::defineParameters() +{ + addToInput("useLeftHand", VariantType::Bool, false); + addToInput("preshapeName", VariantType::String, false); +} + +void DoPreshape::onEnter() { RobotStatechartContext* context = getContext<RobotStatechartContext>(); bool useLeftHand = getInput<bool>("useLeftHand"); @@ -724,30 +794,54 @@ void CloseHand::onEnter() std::map<std::string, HandUnitInterfacePrx>::iterator it = context->handUnits.find(handUnitName); if(it != context->handUnits.end()) { - it->second->close(); +// NameValueMap jointValues =it->second->getPreshapeJointValues(getInput<std::string>("PreshapeName")); + it->second->preshape(getInput<std::string>("preshapeName")); + setTimeoutEvent(2000, createEvent<EvSuccess>()); + } else { ARMARX_ERROR << "No Proxy for HandUnit with Name " << handUnitName << " known"; } - - - sendEvent<EvSuccess>(); } +SingleTypeVariantList DoPreshape::GetPreshapeSet(const SingleTypeVariantListPtr preshapes, const std::string &preshapePrefix) +{ + SingleTypeVariantList result(VariantType::String); + for(int i=0; i < preshapes->getSize(); i++) + { + const std::string & preshapeName = preshapes->getVariant(i)->getString(); + if(preshapeName.find(preshapePrefix) != std::string::npos) + { + result.addVariant(preshapeName); + } + } + return result; +} +void DoPrefixPreshapeSet::defineSubstates() +{ + StatePtr doPreshape = addState<DoPreshapeSet>("DoPreshapeSet"); + PMPtr mapping = PM::createMapping()-> + mapFromParent("*"); + setInitState(doPreshape, mapping); + StatePtr success = addState<SuccessState>("SuccessState"); + addTransition<EvSuccess>(doPreshape, success); +} -void OpenHand::defineParameters() +void DoPrefixPreshapeSet::defineParameters() { addToInput("useLeftHand", VariantType::Bool, false); + addToInput("preshapePrefix", VariantType::String, false); } -void OpenHand::onEnter() +void DoPrefixPreshapeSet::onEnter() { RobotStatechartContext* context = getContext<RobotStatechartContext>(); + bool useLeftHand = getInput<bool>("useLeftHand"); std::string handUnitName; if (useLeftHand) @@ -762,19 +856,61 @@ void OpenHand::onEnter() std::map<std::string, HandUnitInterfacePrx>::iterator it = context->handUnits.find(handUnitName); if(it != context->handUnits.end()) { - it->second->open(); + setLocal("preshapes", DoPreshape::GetPreshapeSet(SingleTypeVariantListPtr::dynamicCast(it->second->getPreshapeNames()), getInput<std::string>("preshapePrefix"))); } else { ARMARX_ERROR << "No Proxy for HandUnit with Name " << handUnitName << " known"; } +} - sendEvent<EvSuccess>(); + + + + +void OpenHand::defineSubstates() +{ + StatePtr doPreshape = addState<DoPrefixPreshapeSet>("DoPreshapeSet"); + PMPtr mapping = PM::createMapping()-> + mapFromParent("*"); + setInitState(doPreshape, mapping); + StatePtr success = addState<SuccessState>("SuccessState"); + addTransition<EvSuccess>(doPreshape, success); } +void OpenHand::defineParameters() +{ + addToInput("useLeftHand", VariantType::Bool, false); + addToLocal("preshapePrefix", VariantType::String); +} + +void OpenHand::onEnter() +{ + setLocal("preshapePrefix", "Open"); + +} + +void CloseHand::defineSubstates() +{ + StatePtr doPreshape = addState<DoPrefixPreshapeSet>("DoPreshapeSet"); + PMPtr mapping = PM::createMapping()-> + mapFromParent("*"); + setInitState(doPreshape, mapping); + StatePtr success = addState<SuccessState>("SuccessState"); + addTransition<EvSuccess>(doPreshape, success); +} +void CloseHand::defineParameters() +{ + addToInput("useLeftHand", VariantType::Bool, false); + addToLocal("preshapePrefix", VariantType::String); +} +void CloseHand::onEnter() +{ + setLocal("preshapePrefix", "Close"); +} void HeadLookAtTarget::defineParameters() { @@ -884,3 +1020,6 @@ void CalculateHeadIK::run() } + + + diff --git a/source/RobotAPI/motioncontrol/MotionControl.h b/source/RobotAPI/motioncontrol/MotionControl.h index 8132c75e7..33e35cc5a 100644 --- a/source/RobotAPI/motioncontrol/MotionControl.h +++ b/source/RobotAPI/motioncontrol/MotionControl.h @@ -224,15 +224,43 @@ namespace MotionControl }; - - /** * \ingroup MotionControl * Closes the given hand of the robot * \param useLeftHand True if left hand should be closed, false for the right hand */ - struct CloseHand : StateTemplate<CloseHand> + struct DoPreshape : StateTemplate<DoPreshape> + { + void defineParameters(); + void onEnter(); + static SingleTypeVariantList GetPreshapeSet(const SingleTypeVariantListPtr preshapes, const std::string& preshapePrefix); + }; + + DEFINEEVENT(EvReachedIntermediatePreshape) + DEFINEEVENT(EvReachedFinalPreshape) + struct SelectAndDoPreshape : StateTemplate<SelectAndDoPreshape> + { + void defineSubstates(); + void defineParameters(); + void onEnter(); + }; + + struct DoPreshapeSet : StateTemplate<DoPreshapeSet> + { + void defineSubstates(); + void defineParameters(); + void onEnter(); + void onExit(); + + }; + + + + + + struct DoPrefixPreshapeSet : StateTemplate<DoPrefixPreshapeSet> { + void defineSubstates(); void defineParameters(); void onEnter(); }; @@ -240,6 +268,7 @@ namespace MotionControl + /** * \ingroup MotionControl * Opens the given hand of the robot @@ -247,6 +276,20 @@ namespace MotionControl */ struct OpenHand : StateTemplate<OpenHand> { + void defineSubstates(); + void defineParameters(); + void onEnter(); + }; + + + /** + * \ingroup MotionControl + * Closes the given hand of the robot + * \param useLeftHand True if left hand should be closed, false for the right hand + */ + struct CloseHand : StateTemplate<CloseHand> + { + void defineSubstates(); void defineParameters(); void onEnter(); }; -- GitLab