diff --git a/source/RobotAPI/drivers/HokuyoLaserUnit/HokuyoLaserUnit.cpp b/source/RobotAPI/drivers/HokuyoLaserUnit/HokuyoLaserUnit.cpp index 2a1f02718bb8b1fa9465445086238a4e04ba92dd..a89af6168a5f66f366a4df3a36b59c01906a0695 100644 --- a/source/RobotAPI/drivers/HokuyoLaserUnit/HokuyoLaserUnit.cpp +++ b/source/RobotAPI/drivers/HokuyoLaserUnit/HokuyoLaserUnit.cpp @@ -24,6 +24,7 @@ #include <SimoxUtility/algorithm/string/string_tools.h> +#include "ArmarXCore/core/time/Clock.h" #include <ArmarXCore/core/time/DateTime.h> #include <ArmarXCore/core/time/Duration.h> #include <ArmarXCore/core/time/ice_conversions.h> @@ -45,9 +46,9 @@ HokuyoLaserUnit::onInitComponent() offeringTopicFromProperty("RobotHealthTopicName"); offeringTopicFromProperty("DebugObserverName"); - topicName = getProperty<std::string>("LaserScannerTopicName").getValue(); - offeringTopic(topicName); - ARMARX_INFO << "Going to report on topic " << topicName; + laserScannerListenerProxyName = getProperty<std::string>("LaserScannerListenerName").getValue(); + usingProxyFromProperty("LaserScannerListenerName"); + ARMARX_INFO << "Going to report to listener " << laserScannerListenerProxyName; updatePeriod = getProperty<int>("UpdatePeriod").getValue(); angleOffset = getProperty<float>("AngleOffset").getValue(); @@ -92,7 +93,7 @@ HokuyoLaserUnit::onConnectComponent() { ARMARX_TRACE; - topic = getTopic<LaserScannerUnitListenerPrx>(topicName); + getProxyFromProperty(listenerPrx, "LaserScannerListenerName"); debugObserver = getTopic<DebugObserverInterfacePrx>( getProperty<std::string>("DebugObserverName").getValue()); @@ -133,7 +134,7 @@ HokuyoLaserUnit::onConnectComponent() info.stepSize = (info.maxAngle - info.minAngle) / (maxStep - minStep); device.lengthData.resize(lengthDataSize); - device.scanTopic = topic; + device.listenerPrx = listenerPrx; device.robotHealthPlugin = heartbeat; device.debugObserver = debugObserver; @@ -181,7 +182,7 @@ HokuyoLaserUnit::createPropertyDefinitions() std::string HokuyoLaserUnit::getReportTopicName(const Ice::Current&) const { - return topicName; + return laserScannerListenerProxyName; } LaserScannerInfoSeq @@ -230,6 +231,8 @@ HokuyoLaserScanDevice::run() ARMARX_TRACE; while (!task->isStopped()) { + ARMARX_INFO << deactivateSpam() << "Running update loop for laserscanner device " << ip; + IceUtil::Time time_start = TimeUtil::GetTime(); if (errorCounter > 10) @@ -272,15 +275,16 @@ HokuyoLaserScanDevice::run() errorCounter = 0; - if (scanTopic) + if (listenerPrx) { - scanTopic->reportSensorValues(ip, frame, scan, now); + + listenerPrx->reportSensorValues(ip, frame, scan, now); } else { - ARMARX_WARNING << "No scan topic available: IP: " << ip << ", Port: " << port; + ARMARX_WARNING << "No proxy available: IP: " << ip << ", Port: " << port; } - IceUtil::Time time_topicSensor = TimeUtil::GetTime(); + IceUtil::Time time_proxyReport = TimeUtil::GetTime(); if (robotHealthPlugin != nullptr) { @@ -302,10 +306,10 @@ HokuyoLaserScanDevice::run() new Variant((time_measure - time_start).toMilliSecondsDouble()); durations["update_ms"] = new Variant((time_update - time_measure).toMilliSecondsDouble()); - durations["topic_sensor_ms"] = - new Variant((time_topicSensor - time_update).toMilliSecondsDouble()); + durations["proxy_report_ms"] = + new Variant((time_proxyReport - time_update).toMilliSecondsDouble()); durations["topic_health_ms"] = - new Variant((time_topicHeartbeat - time_topicSensor).toMilliSecondsDouble()); + new Variant((time_topicHeartbeat - time_proxyReport).toMilliSecondsDouble()); debugObserver->setDebugChannel( "LaserScannerDuration_" + simox::alg::replace_all(ip, ".", "_"), durations); @@ -318,9 +322,9 @@ HokuyoLaserScanDevice::run() << "Update: " << (time_update - time_measure).toMilliSecondsDouble() << "ms\n" << "TopicSensor: " - << (time_topicSensor - time_update).toMilliSecondsDouble() << "ms\n" + << (time_proxyReport - time_update).toMilliSecondsDouble() << "ms\n" << "TopicHeart: " - << (time_topicHeartbeat - time_topicSensor).toMilliSecondsDouble() + << (time_topicHeartbeat - time_proxyReport).toMilliSecondsDouble() << "ms\n"; } } diff --git a/source/RobotAPI/drivers/HokuyoLaserUnit/HokuyoLaserUnit.h b/source/RobotAPI/drivers/HokuyoLaserUnit/HokuyoLaserUnit.h index 0b8ad3985e9e3b1825054fe1339cb41a5c59f4cd..98da02fce21736694803272e4e76e046080d2cd4 100644 --- a/source/RobotAPI/drivers/HokuyoLaserUnit/HokuyoLaserUnit.h +++ b/source/RobotAPI/drivers/HokuyoLaserUnit/HokuyoLaserUnit.h @@ -47,7 +47,7 @@ namespace armarx armarx::ComponentPropertyDefinitions(prefix) { defineOptionalProperty<std::string>( - "LaserScannerTopicName", "LaserScans", "Name of the laser scan topic."); + "LaserScannerListenerName", "CartographerMappingAndLocalization", "Name of the laser scan listener."); defineOptionalProperty<int>("UpdatePeriod", 25, "Update period for laser scans"); defineOptionalProperty<float>("AngleOffset", -2.3561944902, @@ -87,7 +87,7 @@ namespace armarx LaserScan scan; std::string componentName; - LaserScannerUnitListenerPrx scanTopic; + LaserScannerUnitListenerPrx listenerPrx; armarx::plugins::HeartbeatComponentPlugin* robotHealthPlugin; DebugObserverInterfacePrx debugObserver; }; @@ -150,8 +150,8 @@ namespace armarx LaserScannerInfoSeq getConnectedDevices(const Ice::Current& c) const override; private: - std::string topicName; - LaserScannerUnitListenerPrx topic; + std::string laserScannerListenerProxyName; + LaserScannerUnitListenerPrx listenerPrx; int updatePeriod = 25; float angleOffset = 0.0f; std::vector<HokuyoLaserScanDevice> devices; diff --git a/source/RobotAPI/libraries/armem_objects/client/instance/ObjectReader.h b/source/RobotAPI/libraries/armem_objects/client/instance/ObjectReader.h index 0a77d4d0fe8e77557a5fb4659b52aa9b1be23035..81a0fc03092bbbe67c476d3e5f2146a28d62517a 100644 --- a/source/RobotAPI/libraries/armem_objects/client/instance/ObjectReader.h +++ b/source/RobotAPI/libraries/armem_objects/client/instance/ObjectReader.h @@ -74,6 +74,11 @@ namespace armarx::armem::obj::instance return this->p; } + objpose::ObjectPoseStorageInterfacePrx getObjectPoseStorage() const + { + return objPoseStorage; + } + private: Properties p; diff --git a/source/RobotAPI/libraries/armem_robot_state/common/localization/TransformHelper.cpp b/source/RobotAPI/libraries/armem_robot_state/common/localization/TransformHelper.cpp index 7e3908c5503d4ead6a018f9e9555618b01ca2d28..0cc87be10ec27214b2cf9e8540537aaf0a8d98ba 100644 --- a/source/RobotAPI/libraries/armem_robot_state/common/localization/TransformHelper.cpp +++ b/source/RobotAPI/libraries/armem_robot_state/common/localization/TransformHelper.cpp @@ -68,11 +68,12 @@ namespace armarx::armem::common::robot_state::localization if (transforms.empty()) { - ARMARX_WARNING << deactivateSpam(1) << "No transform available."; + ARMARX_INFO << deactivateSpam(1) << "No transform available."; return {.transform = {.header = query.header}, .status = TransformResult::Status::ErrorFrameNotAvailable, - .errorMessage = "Error in TF loookup: '" + query.header.parentFrame + " -> " + - query.header.frame + "'. No memory data in time range."}; + .errorMessage = "Error in TF loookup: '" + query.header.parentFrame + + " -> " + query.header.frame + + "'. No memory data in time range."}; } const Eigen::Affine3f transform = std::accumulate( @@ -107,12 +108,15 @@ namespace armarx::armem::common::robot_state::localization localizationCoreSegment, tfChain, query.header.agent, query.header.timestamp); if (transforms.empty()) { - ARMARX_WARNING << deactivateSpam(1) << "No transform available."; - return {.header = query.header, - .transforms = {}, - .status = TransformChainResult::Status::ErrorFrameNotAvailable, - .errorMessage = "Error in TF loookup: '" + query.header.parentFrame + " -> " + - query.header.frame + "'. No memory data in time range."}; + ARMARX_INFO << deactivateSpam(1) << "No transform available."; + return + { + .header = query.header, + .transforms = {}, + .status = TransformChainResult::Status::ErrorFrameNotAvailable, + .errorMessage = "Error in TF loookup: '" + query.header.parentFrame + " -> " + + query.header.frame + "'. No memory data in time range."}; + }; } @@ -161,9 +165,9 @@ namespace armarx::armem::common::robot_state::localization if (chain.empty() or chain.back() != query.header.frame) { - ARMARX_WARNING << deactivateSpam(60) << "Cannot create tf lookup chain '" - << query.header.parentFrame << " -> " << query.header.frame - << "' for robot `" + query.header.agent + "`."; + ARMARX_INFO << deactivateSpam(60) << "Cannot create tf lookup chain '" + << query.header.parentFrame << " -> " << query.header.frame + << "' for robot `" + query.header.agent + "`."; return {}; } diff --git a/source/RobotAPI/libraries/armem_robot_state/server/proprioception/RobotUnitReader.cpp b/source/RobotAPI/libraries/armem_robot_state/server/proprioception/RobotUnitReader.cpp index 1233be7dadb4a548efd9d7c8c38a797d4138c707..34260f51e36951f7b9a0a68369cf8317e8a4dedc 100644 --- a/source/RobotAPI/libraries/armem_robot_state/server/proprioception/RobotUnitReader.cpp +++ b/source/RobotAPI/libraries/armem_robot_state/server/proprioception/RobotUnitReader.cpp @@ -141,7 +141,7 @@ namespace armarx::armem::server::robot_state::proprioception debugObserver->setDebugObserverDatafield("RobotUnitReader | RT Timestamp USec", data.back().timestampUSec); debugObserver->setDebugObserverDatafield( - "RobotUnitReader | RT TS Since Last Iteration", + "RobotUnitReader | RT Timestamp Since Last Iteration", data.back().timesSinceLastIterationUSec); } } diff --git a/source/RobotAPI/statecharts/CMakeLists.txt b/source/RobotAPI/statecharts/CMakeLists.txt index 006016c5daa24d555c8a5d9537b8bfbbd0c96229..33340476f9568dce65fbd43bcd3f745f80df32f6 100644 --- a/source/RobotAPI/statecharts/CMakeLists.txt +++ b/source/RobotAPI/statecharts/CMakeLists.txt @@ -13,3 +13,5 @@ add_subdirectory(StatechartExecutionGroup) add_subdirectory(ProsthesisKinestheticTeachIn) add_subdirectory(DebugDrawerToArVizGroup) + +add_subdirectory(ObjectMemoryGroup) diff --git a/source/RobotAPI/statecharts/ObjectMemoryGroup/CMakeLists.txt b/source/RobotAPI/statecharts/ObjectMemoryGroup/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..a751e89b2566ed34fadcfa9c04943088955c1d5e --- /dev/null +++ b/source/RobotAPI/statecharts/ObjectMemoryGroup/CMakeLists.txt @@ -0,0 +1,31 @@ +# Modern CMake way: +#armarx_add_statechart(ObjectMemoryGroup +# SOURCES +# ObjectMemoryGroupRemoteStateOfferer.cpp +# HEADERS +# ObjectMemoryGroupRemoteStateOfferer.h +# DEPENDENCIES +#) + +# Legacy CMake way: + +armarx_component_set_name("ObjectMemoryGroup") + +set(COMPONENT_LIBS + ArmarXCoreInterfaces ArmarXCore ArmarXCoreStatechart ArmarXCoreObservers + # RobotAPI + RobotAPIArmarXObjects + armem_objects +) + +set(SOURCES + ObjectMemoryGroupRemoteStateOfferer.cpp +) + +set(HEADERS + ObjectMemoryGroupRemoteStateOfferer.h + ObjectMemoryGroup.scgxml +) + +armarx_generate_statechart_cmake_lists() +armarx_add_component("${SOURCES}" "${HEADERS}") diff --git a/source/RobotAPI/statecharts/ObjectMemoryGroup/ObjectMemoryGroup.scgxml b/source/RobotAPI/statecharts/ObjectMemoryGroup/ObjectMemoryGroup.scgxml new file mode 100644 index 0000000000000000000000000000000000000000..8f7d00053ef37819464e9d1b7bc4171cf4caf72b --- /dev/null +++ b/source/RobotAPI/statecharts/ObjectMemoryGroup/ObjectMemoryGroup.scgxml @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="utf-8"?> +<StatechartGroup name="ObjectMemoryGroup" package="RobotAPI" generateContext="true"> + <Proxies> + <Proxy value="RobotAPIInterfaces.MemoryNameSystem"/> + </Proxies> + <Folder basename="test"> + <State filename="RequestObjectsTest.xml" visibility="public"/> + </Folder> + <State filename="RequestObjects.xml" visibility="public"/> +</StatechartGroup> + diff --git a/source/RobotAPI/statecharts/ObjectMemoryGroup/ObjectMemoryGroupRemoteStateOfferer.cpp b/source/RobotAPI/statecharts/ObjectMemoryGroup/ObjectMemoryGroupRemoteStateOfferer.cpp new file mode 100644 index 0000000000000000000000000000000000000000..1324dfff62f4a6ec3df04e61d451f062125a50c8 --- /dev/null +++ b/source/RobotAPI/statecharts/ObjectMemoryGroup/ObjectMemoryGroupRemoteStateOfferer.cpp @@ -0,0 +1,29 @@ +#include "ObjectMemoryGroupRemoteStateOfferer.h" + +namespace armarx::ObjectMemoryGroup +{ + // DO NOT EDIT NEXT LINE + ObjectMemoryGroupRemoteStateOfferer::SubClassRegistry ObjectMemoryGroupRemoteStateOfferer::Registry(ObjectMemoryGroupRemoteStateOfferer::GetName(), &ObjectMemoryGroupRemoteStateOfferer::CreateInstance); + + ObjectMemoryGroupRemoteStateOfferer::ObjectMemoryGroupRemoteStateOfferer(StatechartGroupXmlReaderPtr reader) : + XMLRemoteStateOfferer < ObjectMemoryGroupStatechartContext > (reader) + {} + + void ObjectMemoryGroupRemoteStateOfferer::onInitXMLRemoteStateOfferer() {} + + void ObjectMemoryGroupRemoteStateOfferer::onConnectXMLRemoteStateOfferer() {} + + void ObjectMemoryGroupRemoteStateOfferer::onExitXMLRemoteStateOfferer() {} + + // DO NOT EDIT NEXT FUNCTION + std::string ObjectMemoryGroupRemoteStateOfferer::GetName() + { + return "ObjectMemoryGroupRemoteStateOfferer"; + } + + // DO NOT EDIT NEXT FUNCTION + XMLStateOffererFactoryBasePtr ObjectMemoryGroupRemoteStateOfferer::CreateInstance(StatechartGroupXmlReaderPtr reader) + { + return XMLStateOffererFactoryBasePtr(new ObjectMemoryGroupRemoteStateOfferer(reader)); + } +} diff --git a/source/RobotAPI/statecharts/ObjectMemoryGroup/ObjectMemoryGroupRemoteStateOfferer.h b/source/RobotAPI/statecharts/ObjectMemoryGroup/ObjectMemoryGroupRemoteStateOfferer.h new file mode 100644 index 0000000000000000000000000000000000000000..882627aec09b55c16b4b0f07fe313c0138392368 --- /dev/null +++ b/source/RobotAPI/statecharts/ObjectMemoryGroup/ObjectMemoryGroupRemoteStateOfferer.h @@ -0,0 +1,26 @@ +#pragma once + +#include <ArmarXCore/statechart/xmlstates/XMLRemoteStateOfferer.h> +#include "ObjectMemoryGroupStatechartContext.generated.h" + +namespace armarx::ObjectMemoryGroup +{ + class ObjectMemoryGroupRemoteStateOfferer : + virtual public XMLRemoteStateOfferer < ObjectMemoryGroupStatechartContext > // Change this statechart context if you need another context (dont forget to change in the constructor as well) + { + public: + ObjectMemoryGroupRemoteStateOfferer(StatechartGroupXmlReaderPtr reader); + + // inherited from RemoteStateOfferer + void onInitXMLRemoteStateOfferer() override; + void onConnectXMLRemoteStateOfferer() override; + void onExitXMLRemoteStateOfferer() override; + + // static functions for AbstractFactory Method + static std::string GetName(); + static XMLStateOffererFactoryBasePtr CreateInstance(StatechartGroupXmlReaderPtr reader); + static SubClassRegistry Registry; + + + }; +} diff --git a/source/RobotAPI/statecharts/ObjectMemoryGroup/RequestObjects.cpp b/source/RobotAPI/statecharts/ObjectMemoryGroup/RequestObjects.cpp new file mode 100644 index 0000000000000000000000000000000000000000..562ddabd56b6d07428f8ce2b386fa682ac95dd1f --- /dev/null +++ b/source/RobotAPI/statecharts/ObjectMemoryGroup/RequestObjects.cpp @@ -0,0 +1,133 @@ +#include "RequestObjects.h" + +//#include <ArmarXCore/core/time/TimeUtil.h> +//#include <ArmarXCore/observers/variant/DatafieldRef.h> + +#include <RobotAPI/libraries/armem_objects/client/instance/ObjectReader.h> +#include <RobotAPI/libraries/ArmarXObjects/ObjectID.h> +#include <RobotAPI/libraries/ArmarXObjects/ice_conversions.h> + +#include "ObjectMemoryGroupStatechartContext.generated.h" + +namespace armarx::ObjectMemoryGroup +{ + // DO NOT EDIT NEXT LINE + RequestObjects::SubClassRegistry RequestObjects::Registry(RequestObjects::GetName(), &RequestObjects::CreateInstance); + + RequestObjects::RequestObjects(const XMLStateConstructorParams& stateData): + XMLStateTemplate<RequestObjects>(stateData), RequestObjectsGeneratedBase<RequestObjects>(stateData) + { + } + + void RequestObjects::onEnter() + { + + // put your user code for the enter-point here + // execution time should be short (<100ms) + } + + void RequestObjects::run() + { + if (not in.getEnable()) + { + emitSuccess(); + return; + } + + using Reader = armarx::armem::obj::instance::Reader; + + const std::string provider = in.isProviderSet() ? in.getProvider() : ""; + + const std::vector<std::string> objectIdsString = in.getObjectIds(); + const armarx::Duration relativeTimeout = armarx::Duration::MilliSeconds(in.getRelativeTimeoutMilliseconds()); + + std::stringstream info; + std::stringstream warn; + + std::vector<armarx::ObjectID> objectIds; + for (const std::string& idString : objectIdsString) + { + try + { + armarx::ObjectID id = armarx::ObjectID::FromString(idString); + objectIds.push_back(id); + info << "Requesting object " << id << "\n"; + } + catch (const armarx::LocalException& e) + { + warn << "\nGiven object ID '" << idString << "' could not parsed as ObjectID: " << e.what(); + } + } + + auto context = getContext<ObjectMemoryGroupStatechartContext>(); + armarx::armem::client::MemoryNameSystem mns(getMemoryNameSystem(), context); + + Reader reader{mns}; + reader.connect(); + objpose::ObjectPoseStorageInterfacePrx storage = reader.getObjectPoseStorage(); + + armarx::objpose::observer::RequestObjectsInput input; + input.provider = provider; + for (const armarx::ObjectID& id : objectIds) + { + armarx::toIce(input.request.objectIDs.emplace_back(), id); + } + input.request.relativeTimeoutMS = relativeTimeout.toMilliSeconds(); + + + objpose::observer::RequestObjectsOutput output; + try + { + output = storage->requestObjects(input); + } + catch (const Ice::Exception& e) + { + ARMARX_WARNING << "Failed to request object localization: " << e.what(); + emitFailure(); + return; + } + + for (const auto& [id, result] : output.results) + { + if (result.result.success) + { + info << "Requested object " << id << " via provider '" << result.providerName << "'.\n"; + } + else + { + warn << "\nFailed to request the object " << id << " for localization."; + } + } + + if (not info.str().empty()) + { + ARMARX_INFO << info.str(); + } + if (not warn.str().empty()) + { + ARMARX_WARNING << "The following issues occurred whhen requesting objects for localization:" + << warn.str(); + } + + emitSuccess(); + } + + //void RequestObjects::onBreak() + //{ + // // put your user code for the breaking point here + // // execution time should be short (<100ms) + //} + + void RequestObjects::onExit() + { + // put your user code for the exit point here + // execution time should be short (<100ms) + } + + + // DO NOT EDIT NEXT FUNCTION + XMLStateFactoryBasePtr RequestObjects::CreateInstance(XMLStateConstructorParams stateData) + { + return XMLStateFactoryBasePtr(new RequestObjects(stateData)); + } +} diff --git a/source/RobotAPI/statecharts/ObjectMemoryGroup/RequestObjects.h b/source/RobotAPI/statecharts/ObjectMemoryGroup/RequestObjects.h new file mode 100644 index 0000000000000000000000000000000000000000..4390865434749d591d6082df003c55e3b8560cd6 --- /dev/null +++ b/source/RobotAPI/statecharts/ObjectMemoryGroup/RequestObjects.h @@ -0,0 +1,27 @@ +#pragma once + +#include <RobotAPI/statecharts/ObjectMemoryGroup/RequestObjects.generated.h> + +namespace armarx::ObjectMemoryGroup +{ + class RequestObjects : + public RequestObjectsGeneratedBase < RequestObjects > + { + public: + RequestObjects(const XMLStateConstructorParams& stateData); + + // inherited from StateBase + void onEnter() override; + void run() override; + // void onBreak() override; + void onExit() override; + + // static functions for AbstractFactory Method + static XMLStateFactoryBasePtr CreateInstance(XMLStateConstructorParams stateData); + static SubClassRegistry Registry; + + // DO NOT INSERT ANY CLASS MEMBERS, + // use stateparameters instead, + // if classmember are neccessary nonetheless, reset them in onEnter + }; +} diff --git a/source/RobotAPI/statecharts/ObjectMemoryGroup/RequestObjects.xml b/source/RobotAPI/statecharts/ObjectMemoryGroup/RequestObjects.xml new file mode 100644 index 0000000000000000000000000000000000000000..8b32c20109a1bee77bcd3ee1203716d3abb02f0d --- /dev/null +++ b/source/RobotAPI/statecharts/ObjectMemoryGroup/RequestObjects.xml @@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<State version="1.2" name="RequestObjects" uuid="9F09FB2F-CC0C-4B8A-A716-F130E04A7230" width="800" height="600" type="Normal State"> + <InputParameters> + <Parameter name="Enable" type="::armarx::BoolVariantData" docType="bool" optional="no"> + <DefaultValue value='{"type":"::armarx::SingleVariantBase","variant":{"typeName":"::armarx::BoolVariantData","value":true}}' docValue="True"/> + </Parameter> + <Parameter name="ObjectIds" type="::armarx::SingleTypeVariantListBase(::armarx::StringVariantData)" docType="List(string)" optional="no"/> + <Parameter name="Provider" type="::armarx::StringVariantData" docType="string" optional="yes"/> + <Parameter name="RelativeTimeoutMilliseconds" type="::armarx::IntVariantData" docType="int" optional="no"/> + </InputParameters> + <OutputParameters/> + <LocalParameters/> + <Substates/> + <Events> + <Event name="Failure"> + <Description>Event for statechart-internal failures or optionally user-code failures</Description> + </Event> + <Event name="Success"/> + </Events> + <Transitions/> +</State> + diff --git a/source/RobotAPI/statecharts/ObjectMemoryGroup/test/RequestObjectsTest.xml b/source/RobotAPI/statecharts/ObjectMemoryGroup/test/RequestObjectsTest.xml new file mode 100644 index 0000000000000000000000000000000000000000..edb16e98297feb19d1769ca6c54ab28901da7ad1 --- /dev/null +++ b/source/RobotAPI/statecharts/ObjectMemoryGroup/test/RequestObjectsTest.xml @@ -0,0 +1,67 @@ +<?xml version="1.0" encoding="utf-8"?> +<State version="1.2" name="RequestObjectsTest" uuid="E74E1D8D-2E97-4846-9282-73AC4F49FAEE" width="493.167" height="355.278" type="Normal State"> + <InputParameters> + <Parameter name="ObjectIds" type="::armarx::SingleTypeVariantListBase(::armarx::StringVariantData)" docType="List(string)" optional="no"> + <DefaultValue value='{"array":[{"type":"::armarx::SingleVariantBase","variant":{"typeName":"::armarx::StringVariantData","value":"Maintenance/spraybottle"}},{"type":"::armarx::SingleVariantBase","variant":{"typeName":"::armarx::StringVariantData","value":"Maintenance/handwash-paste"}},{"type":"::armarx::SingleVariantBase","variant":{"typeName":"::armarx::StringVariantData","value":"Maintenance/mounting-adhesive"}},{"type":"::armarx::SingleVariantBase","variant":{"typeName":"::armarx::StringVariantData","value":"Maintenance/multipurpose-grease"}}],"type":"::armarx::SingleTypeVariantListBase"}' docValue="Maintenance/spraybottle\nMaintenance/handwash-paste\nMaintenance/mounting-adhesive\nMaintenance/multipurpose-grease"/> + </Parameter> + <Parameter name="Provider" type="::armarx::StringVariantData" docType="string" optional="no"> + <DefaultValue value='{"type":"::armarx::SingleVariantBase","variant":{"typeName":"::armarx::StringVariantData","value":"sim_track"}}' docValue="sim_track"/> + </Parameter> + <Parameter name="RelativeTimeoutMilliseconds" type="::armarx::IntVariantData" docType="int" optional="no"> + <DefaultValue value='{"type":"::armarx::SingleVariantBase","variant":{"typeName":"::armarx::IntVariantData","value":10000}}' docValue="10000"/> + </Parameter> + </InputParameters> + <OutputParameters/> + <LocalParameters/> + <Substates> + <EndState name="Failure" event="Failure" left="363.167" top="140.056" boundingSquareSize="99.6636"/> + <LocalState name="RequestObjects" refuuid="9F09FB2F-CC0C-4B8A-A716-F130E04A7230" left="114.167" top="196.278" boundingSquareSize="99.6636"/> + <EndState name="Success" event="Success" left="363.167" top="250.278" boundingSquareSize="99.6636"/> + </Substates> + <Events> + <Event name="Failure"> + <Description>Event for statechart-internal failures or optionally user-code failures</Description> + </Event> + </Events> + <StartState substateName="RequestObjects"> + <ParameterMappings> + <ParameterMapping sourceType="Parent" from="ObjectIds" to="ObjectIds"/> + <ParameterMapping sourceType="Parent" from="Provider" to="Provider"/> + <ParameterMapping sourceType="Parent" from="RelativeTimeoutMilliseconds" to="RelativeTimeoutMilliseconds"/> + </ParameterMappings> + <SupportPoints> + <SupportPoint posX="67.1067" posY="233.278"/> + <SupportPoint posX="76.5839" posY="233.278"/> + <SupportPoint posX="88.7241" posY="233.278"/> + <SupportPoint posX="101.186" posY="233.278"/> + </SupportPoints> + </StartState> + <Transitions> + <Transition from="RequestObjects" to="Failure" eventName="Failure"> + <ParameterMappings/> + <ParameterMappingsToParentsLocal/> + <ParameterMappingsToParentsOutput/> + <SupportPoints> + <SupportPoint posX="214.588" posY="221.9"/> + <SupportPoint posX="253.892" posY="213.031"/> + <SupportPoint posX="308.683" posY="200.669"/> + <SupportPoint posX="350.786" posY="191.175"/> + </SupportPoints> + </Transition> + <Transition from="RequestObjects" to="Success" eventName="Success"> + <ParameterMappings/> + <ParameterMappingsToParentsLocal/> + <ParameterMappingsToParentsOutput/> + <SupportPoints> + <SupportPoint posX="214.358" posY="252.153"/> + <SupportPoint posX="221.884" posY="254.613"/> + <SupportPoint posX="229.602" posY="256.935"/> + <SupportPoint posX="237" posY="258.833"/> + <SupportPoint posX="274.158" posY="268.372"/> + <SupportPoint posX="316.529" posY="275.551"/> + <SupportPoint posX="350.428" posY="280.424"/> + </SupportPoints> + </Transition> + </Transitions> +</State> +