diff --git a/source/RobotAPI/components/armem/server/ObjectMemory/ObjectMemory.cpp b/source/RobotAPI/components/armem/server/ObjectMemory/ObjectMemory.cpp index fe2a7471594c303e21ed0638bb1fa6f5e1635fa5..c2a37675fe7c14de21f949b0d2ad01e07e0a3703 100644 --- a/source/RobotAPI/components/armem/server/ObjectMemory/ObjectMemory.cpp +++ b/source/RobotAPI/components/armem/server/ObjectMemory/ObjectMemory.cpp @@ -21,7 +21,9 @@ */ #include "ObjectMemory.h" +#include <VirtualRobot/VirtualRobot.h> +#include "ArmarXCore/core/time/Clock.h" #include <ArmarXCore/core/ice_conversions/ice_conversions_templates.h> #include <ArmarXCore/core/time/ice_conversions.h> @@ -65,6 +67,8 @@ namespace armarx::armem::server::obj "Duration of time window into the past to use for predictions" " when requested via the PredictingMemoryInterface (in seconds)."); + defs->optional(robotName, "robotName", ""); + return defs; } @@ -74,6 +78,7 @@ namespace armarx::armem::server::obj classSegment(iceAdapter()), attachmentSegment(iceAdapter()) { + addPlugin(virtualRobotReaderPlugin); } @@ -130,20 +135,26 @@ namespace armarx::armem::server::obj { // onConnect can be called multiple times, but addRobot will fail if called more than once with the same ID // So we need to always make sure to guard a call to addRobot - const std::string robotKey = "robot"; - VirtualRobot::RobotPtr robot = RobotState::hasRobot(robotKey) - ? RobotState::getRobot(robotKey) - : RobotState::addRobot(robotKey, VirtualRobot::RobotIO::RobotDescription::eStructure); + // const std::string robotKey = "robot"; + // VirtualRobot::RobotPtr robot = RobotState::hasRobot(robotKey) + // ? RobotState::getRobot(robotKey) + // : RobotState::addRobot(robotKey, VirtualRobot::RobotIO::RobotDescription::eStructure); - robotStateComponent = RobotState::getRobotStateComponent(); + // TODO: the instance segment should check the provided object poses and instantiate the needed robots by itself. + ARMARX_CHECK_NOT_NULL(virtualRobotReaderPlugin); + + VirtualRobot::RobotPtr robot = virtualRobotReaderPlugin->get().getSynchronizedRobot(robotName, armarx::Clock::Now(), VirtualRobot::RobotIO::RobotDescription::eStructure, true); + ARMARX_CHECK_NOT_NULL(robot); getProxyFromProperty(kinematicUnitObserver, "cmp.KinematicUnitObserverName", false, "", false); // Create first to use the original values. createRemoteGuiTab(); + // ARMARX_CHECK(virtualRobotReaderPlugin->isAvailable()); + instance::SegmentAdapter::connect( - robotStateComponent, + &virtualRobotReaderPlugin->get(), robot, kinematicUnitObserver, ArVizComponentPluginUser::getArvizClient(), diff --git a/source/RobotAPI/components/armem/server/ObjectMemory/ObjectMemory.h b/source/RobotAPI/components/armem/server/ObjectMemory/ObjectMemory.h index 1a939eebff7c94f887b4d68f5d363c5f986e5194..5cf03b6e31f15526cf6f99e0be43c0aacedabb11 100644 --- a/source/RobotAPI/components/armem/server/ObjectMemory/ObjectMemory.h +++ b/source/RobotAPI/components/armem/server/ObjectMemory/ObjectMemory.h @@ -22,6 +22,8 @@ #pragma once +#include "RobotAPI/libraries/armem/client/plugins/ReaderWriterPlugin.h" +#include "RobotAPI/libraries/armem_robot_state/client/common/VirtualRobotReader.h" #include <RobotAPI/libraries/armem_objects/server/class/Segment.h> #include <RobotAPI/libraries/armem_objects/server/instance/SegmentAdapter.h> #include <RobotAPI/libraries/armem_objects/server/attachments/Segment.h> @@ -61,15 +63,11 @@ namespace armarx::armem::server::obj , virtual public armarx::armem::server::ObjectMemoryInterface , virtual public armarx::armem::server::ReadWritePluginUser , virtual public armarx::armem::server::obj::instance::SegmentAdapter - - , virtual public armarx::RobotStateComponentPluginUser , virtual public armarx::LightweightRemoteGuiComponentPluginUser , virtual public armarx::ArVizComponentPluginUser { public: - using RobotState = armarx::RobotStateComponentPluginUser; - static const std::string defaultMemoryName; @@ -119,7 +117,6 @@ namespace armarx::armem::server::obj private: DebugObserverInterfacePrx debugObserver; - RobotStateComponentInterfacePrx robotStateComponent; KinematicUnitObserverInterfacePrx kinematicUnitObserver; double predictionTimeWindow = 2; @@ -137,6 +134,8 @@ namespace armarx::armem::server::obj }; std::unique_ptr<RemoteGuiTab> tab; + std::string robotName = "Armar6"; + armem::client::plugins::ReaderWriterPlugin<robot_state::VirtualRobotReader>* virtualRobotReaderPlugin; }; } diff --git a/source/RobotAPI/libraries/armem_objects/server/CMakeLists.txt b/source/RobotAPI/libraries/armem_objects/server/CMakeLists.txt index cf92773305aac9c8d4c1ce69abbf86bd3b6789ea..9f977a7beaa67789b181cbabb18752cbf4242fef 100644 --- a/source/RobotAPI/libraries/armem_objects/server/CMakeLists.txt +++ b/source/RobotAPI/libraries/armem_objects/server/CMakeLists.txt @@ -21,6 +21,9 @@ armarx_add_library( RobotAPI::armem_robot RobotAPI::armem_objects + armem_robot_state + armem_robot + HEADERS class/FloorVis.h @@ -51,4 +54,3 @@ armarx_add_library( add_library(${PROJECT_NAME}::armem_objects_server ALIAS armem_objects_server) - diff --git a/source/RobotAPI/libraries/armem_objects/server/instance/Segment.cpp b/source/RobotAPI/libraries/armem_objects/server/instance/Segment.cpp index aaf23c20e21eff50cf135664b6c8c951d9980abd..6ba35fd2042b04540721c95c1b48d566ad9d3d5a 100644 --- a/source/RobotAPI/libraries/armem_objects/server/instance/Segment.cpp +++ b/source/RobotAPI/libraries/armem_objects/server/instance/Segment.cpp @@ -27,6 +27,7 @@ #include <RobotAPI/libraries/core/FramedPose.h> #include <RobotAPI/libraries/core/remoterobot/RemoteRobot.h> +#include "ArmarXCore/core/time/Clock.h" #include <ArmarXCore/core/ice_conversions/ice_conversions_templates.h> #include <ArmarXCore/core/logging/Logging.h> #include <ArmarXCore/core/system/cmake/CMakePackageFinder.h> @@ -150,6 +151,10 @@ namespace armarx::armem::server::obj::instance // Build new poses. objpose::ObjectPoseSeq newObjectPoses; stats.numUpdated = 0; + + // timestamp used to reduce the rpc calls for robot sync + Time robotSyncTimestamp = -1; + for (const objpose::data::ProvidedObjectPose& provided : providedPoses) { const Time timestamp = armarx::fromIce<Time>(provided.timestamp); @@ -190,6 +195,13 @@ namespace armarx::armem::server::obj::instance // Update the entity. stats.numUpdated++; + // update the robot to obtain correct local -> global transformation + if(robotSyncTimestamp != timestamp) + { + ARMARX_CHECK(virtualRobotReader->synchronizeRobot(*robot, timestamp)); + robotSyncTimestamp = timestamp; + } + objpose::ObjectPose& newPose = newObjectPoses.emplace_back(); if (provided.objectPoseFrame.empty()) { @@ -394,7 +406,12 @@ namespace armarx::armem::server::obj::instance if (!synchronized) // Synchronize only once. { - RemoteRobot::synchronizeLocalClone(agent, robotStateComponent); + const auto timestamp = armarx::Clock::Now(); + + ARMARX_CHECK_NOT_NULL(agent); + ARMARX_CHECK_NOT_NULL(virtualRobotReader); + + ARMARX_CHECK(virtualRobotReader->synchronizeRobot(*agent, timestamp)); synchronized = true; } objectPose.updateAttached(agent); @@ -653,7 +670,10 @@ namespace armarx::armem::server::obj::instance } else { - RemoteRobot::synchronizeLocalClone(agent, robotStateComponent); + ARMARX_CHECK_NOT_NULL(virtualRobotReader); + + const auto timestamp = armarx::Clock::Now(); + ARMARX_CHECK(virtualRobotReader->synchronizeRobot(*agent, timestamp)); armarx::FramedPose framed(data.pose.objectPoseGlobal, armarx::GlobalFrame, agent->getName()); if (frameName == armarx::GlobalFrame) diff --git a/source/RobotAPI/libraries/armem_objects/server/instance/Segment.h b/source/RobotAPI/libraries/armem_objects/server/instance/Segment.h index ba7c5539df7299be11ceead0c4253938bfe9ed73..aab85a19f618a7c47c93de465987349d015db3fd 100644 --- a/source/RobotAPI/libraries/armem_objects/server/instance/Segment.h +++ b/source/RobotAPI/libraries/armem_objects/server/instance/Segment.h @@ -8,6 +8,7 @@ #include <SimoxUtility/caching/CacheMap.h> #include <SimoxUtility/shapes/OrientedBox.h> +#include "RobotAPI/libraries/armem_robot_state/client/common/VirtualRobotReader.h" #include <RobotAPI/interface/core/RobotState.h> #include <RobotAPI/interface/objectpose/ObjectPoseStorageInterface.h> @@ -158,7 +159,7 @@ namespace armarx::armem::server::obj::instance public: - RobotStateComponentInterfacePrx robotStateComponent; + robot_state::VirtualRobotReader* virtualRobotReader; VirtualRobot::RobotPtr robot; objpose::ProviderInfoMap providers; diff --git a/source/RobotAPI/libraries/armem_objects/server/instance/SegmentAdapter.cpp b/source/RobotAPI/libraries/armem_objects/server/instance/SegmentAdapter.cpp index 7a36b0cbce48d258eded0545492bd4974019069f..d72adb6fd350f5ca40c432b519c2509255879f16 100644 --- a/source/RobotAPI/libraries/armem_objects/server/instance/SegmentAdapter.cpp +++ b/source/RobotAPI/libraries/armem_objects/server/instance/SegmentAdapter.cpp @@ -30,6 +30,7 @@ #include <RobotAPI/libraries/armem_objects/aron/ObjectInstance.aron.generated.h> #include <RobotAPI/libraries/aron/common/aron_conversions/core.h> +#include "ArmarXCore/core/time/Clock.h" #include <ArmarXCore/core/ice_conversions/ice_conversions_templates.h> #include <ArmarXCore/core/time/CycleUtil.h> #include <ArmarXCore/core/time/ice_conversions.h> @@ -77,7 +78,7 @@ namespace armarx::armem::server::obj::instance void SegmentAdapter::connect( - RobotStateComponentInterfacePrx robotStateComponent, + robot_state::VirtualRobotReader* virtualRobotReader, VirtualRobot::RobotPtr robot, KinematicUnitObserverInterfacePrx kinematicUnitObserver, viz::Client arviz, @@ -88,7 +89,7 @@ namespace armarx::armem::server::obj::instance this->arviz = arviz; segment.robot = robot; - segment.robotStateComponent = robotStateComponent; + segment.virtualRobotReader = virtualRobotReader; robotHead.kinematicUnitObserver = kinematicUnitObserver; robotHead.debugObserver = debugObserver; @@ -175,7 +176,10 @@ namespace armarx::armem::server::obj::instance segment.doLocked([&]() { - RemoteRobot::synchronizeLocalClone(segment.robot, segment.robotStateComponent); + const auto timestamp = armarx::Clock::Now(); + + ARMARX_CHECK_NOT_NULL(segment.robot); + ARMARX_CHECK(segment.virtualRobotReader->synchronizeRobot(*segment.robot, timestamp)); if (segment.robot->hasRobotNode(calibration.robotNode)) { @@ -653,4 +657,3 @@ namespace armarx::armem::server::obj::instance } } - diff --git a/source/RobotAPI/libraries/armem_objects/server/instance/SegmentAdapter.h b/source/RobotAPI/libraries/armem_objects/server/instance/SegmentAdapter.h index aafe61f5c87e5a1363ef837d56cd7cbeec08407c..bdfa58f683e4705a6a6623621a1cdca0027be98f 100644 --- a/source/RobotAPI/libraries/armem_objects/server/instance/SegmentAdapter.h +++ b/source/RobotAPI/libraries/armem_objects/server/instance/SegmentAdapter.h @@ -28,6 +28,7 @@ #include <ArmarXGui/libraries/RemoteGui/Client/Widgets.h> +#include "RobotAPI/libraries/armem_robot_state/client/common/VirtualRobotReader.h" #include <RobotAPI/interface/armem/server/ObjectMemoryInterface.h> #include <RobotAPI/interface/core/RobotState.h> @@ -62,7 +63,7 @@ namespace armarx::armem::server::obj::instance void init(); void connect( - RobotStateComponentInterfacePrx robotStateComponent, + robot_state::VirtualRobotReader* virtualRobotReader, VirtualRobot::RobotPtr robot, KinematicUnitObserverInterfacePrx kinematicUnitObserver, viz::Client arviz,