From 08e9b65cb51d15d3340b07eb2365bd6cff0dcd23 Mon Sep 17 00:00:00 2001 From: Fabian Peller <fabian.peller-konrad@kit.edu> Date: Thu, 16 Mar 2023 10:07:57 +0000 Subject: [PATCH] rename other time values. Add lastAccessed timestamp and counter --- source/RobotAPI/interface/armem/memory.ice | 6 ++-- .../RobotAPI/libraries/armem/core/Commit.cpp | 2 +- source/RobotAPI/libraries/armem/core/Commit.h | 6 ++-- .../armem/core/base/EntityInstanceBase.cpp | 15 +++++--- .../armem/core/base/EntityInstanceBase.h | 34 ++++++++++++++----- .../armem/core/base/ice_conversions.cpp | 12 ++++--- .../libraries/armem/core/ice_conversions.cpp | 10 +++--- .../armem/core/wm/memory_definitions.cpp | 4 +-- .../armem/server/MemoryToIceAdapter.cpp | 2 +- .../ltm/detail/EntityQueryProcessorBase.h | 1 + .../wm/detail/EntityQueryProcessorBase.h | 8 ++++- .../libraries/armem/server/query_proc/wm/wm.h | 10 ++++-- .../server/KnownGraspProviderSegment.cpp | 2 +- .../armem_gui/instance/InstanceView.cpp | 4 ++- .../client/instance/ObjectWriter.cpp | 2 +- .../armem_objects/server/class/Segment.cpp | 2 +- .../armem_objects/server/instance/Segment.cpp | 2 +- .../server/description/Segment.cpp | 2 +- .../server/localization/Segment.cpp | 2 +- 19 files changed, 85 insertions(+), 41 deletions(-) diff --git a/source/RobotAPI/interface/armem/memory.ice b/source/RobotAPI/interface/armem/memory.ice index 2b2dc5c81..63801dd4d 100644 --- a/source/RobotAPI/interface/armem/memory.ice +++ b/source/RobotAPI/interface/armem/memory.ice @@ -39,8 +39,10 @@ module armarx class EntityInstanceMetadata { armarx::core::time::dto::DateTime referencedTime; - armarx::core::time::dto::DateTime timeSent; - armarx::core::time::dto::DateTime timeArrived; + armarx::core::time::dto::DateTime sentTime; + armarx::core::time::dto::DateTime arrivedTime; + armarx::core::time::dto::DateTime lastAccessedTime; + long accessed = 0; float confidence = 1.0; }; diff --git a/source/RobotAPI/libraries/armem/core/Commit.cpp b/source/RobotAPI/libraries/armem/core/Commit.cpp index 33752d844..341d160ec 100644 --- a/source/RobotAPI/libraries/armem/core/Commit.cpp +++ b/source/RobotAPI/libraries/armem/core/Commit.cpp @@ -25,7 +25,7 @@ namespace armarx::armem return os << "Entity update result: " << "\n- success: \t" << (rhs.success ? "true" : "false") << "\n- snapshotID: \t" << rhs.snapshotID - << "\n- time arrived: \t" << toDateTimeMilliSeconds(rhs.timeArrived) + << "\n- time arrived: \t" << toDateTimeMilliSeconds(rhs.arrivedTime) << "\n- error message: \t" << rhs.errorMessage << "\n" ; diff --git a/source/RobotAPI/libraries/armem/core/Commit.h b/source/RobotAPI/libraries/armem/core/Commit.h index ae9efd877..81d041384 100644 --- a/source/RobotAPI/libraries/armem/core/Commit.h +++ b/source/RobotAPI/libraries/armem/core/Commit.h @@ -52,14 +52,14 @@ namespace armarx::armem * * Set automatically when sending the commit. */ - Time timeSent = Time::Invalid(); + Time sentTime = Time::Invalid(); /** * @brief Time when this update arrived at the memory server. * * Set by memory server on arrival. */ - Time timeArrived = Time::Invalid(); + Time arrivedTime = Time::Invalid(); friend std::ostream& operator<<(std::ostream& os, const EntityUpdate& rhs); @@ -74,7 +74,7 @@ namespace armarx::armem bool success = false; MemoryID snapshotID; - Time timeArrived = Time::Invalid(); + Time arrivedTime = Time::Invalid(); std::string errorMessage; diff --git a/source/RobotAPI/libraries/armem/core/base/EntityInstanceBase.cpp b/source/RobotAPI/libraries/armem/core/base/EntityInstanceBase.cpp index 4f202b43f..56f207e7e 100644 --- a/source/RobotAPI/libraries/armem/core/base/EntityInstanceBase.cpp +++ b/source/RobotAPI/libraries/armem/core/base/EntityInstanceBase.cpp @@ -3,6 +3,12 @@ namespace armarx::armem::base { + void EntityInstanceMetadata::access() const + { + accessed++; + lastAccessedTime = armarx::core::time::DateTime::Now(); + } + bool EntityInstanceMetadata::operator==(const EntityInstanceMetadata& other) const { return referencedTime == other.referencedTime @@ -16,10 +22,11 @@ namespace armarx::armem::base std::ostream& armarx::armem::base::operator<<(std::ostream& os, const EntityInstanceMetadata& d) { os << "EntityInstanceMetadata: " - << "\n- t_referenced = \t" << armem::toStringMicroSeconds(d.referencedTime) << " us" - << "\n- t_sent = \t" << armem::toStringMicroSeconds(d.sentTime) << " us" - << "\n- t_arrived = \t" << armem::toStringMicroSeconds(d.arrivedTime) << " us" - << "\n- confidence = \t" << d.confidence << " us" + << "\n - t_referenced = \t" << armem::toStringMicroSeconds(d.referencedTime) << " us" + << "\n - t_sent = \t" << armem::toStringMicroSeconds(d.sentTime) << " us" + << "\n - t_arrived = \t" << armem::toStringMicroSeconds(d.arrivedTime) << " us" + << "\n - t_accessed = \t" << armem::toStringMicroSeconds(d.lastAccessedTime) << " us (" << d.accessed << ")" + << "\n - confidence = \t" << d.confidence << " us" ; return os; } diff --git a/source/RobotAPI/libraries/armem/core/base/EntityInstanceBase.h b/source/RobotAPI/libraries/armem/core/base/EntityInstanceBase.h index 92ca8dff0..26806524c 100644 --- a/source/RobotAPI/libraries/armem/core/base/EntityInstanceBase.h +++ b/source/RobotAPI/libraries/armem/core/base/EntityInstanceBase.h @@ -9,35 +9,51 @@ namespace armarx::armem::base { + struct Metadata + { + virtual void access() const = 0; + + virtual ~Metadata() = default; + }; + /** * @brief Default data of an entity instance (empty). */ - struct NoData + struct NoData : public Metadata { + void access() const final {} + + virtual ~NoData() = default; + + bool operator==(const NoData& other) { return true; } + bool operator!=(const NoData& other) { return false;} }; /** * @brief Metadata of an entity instance. */ - struct EntityInstanceMetadata + struct EntityInstanceMetadata : public Metadata { /// Time when this value was created. - Time referencedTime; + Time referencedTime = Time::Invalid(); /// Time when this value was sent to the memory. - Time sentTime; + Time sentTime = Time::Invalid(); /// Time when this value has arrived at the memory. - Time arrivedTime; + Time arrivedTime = Time::Invalid(); /// An optional confidence, may be used for things like decay. float confidence = 1.0; /// An optional value indicating the last access - Time lastAccessedTime = Time::Invalid(); + mutable Time lastAccessedTime = Time::Invalid(); /// A counter how often the instance has been accessed - unsigned long accessed = 0; + mutable unsigned long accessed = 0; + + void access() const final; + virtual ~EntityInstanceMetadata() = default; bool operator==(const EntityInstanceMetadata& other) const; inline bool operator!=(const EntityInstanceMetadata& other) const @@ -91,11 +107,11 @@ namespace armarx::armem::base // Data - EntityInstanceMetadata& metadata() + MetadataT& metadata() { return _metadata; } - const EntityInstanceMetadata& metadata() const + const MetadataT& metadata() const { return _metadata; } diff --git a/source/RobotAPI/libraries/armem/core/base/ice_conversions.cpp b/source/RobotAPI/libraries/armem/core/base/ice_conversions.cpp index adc5ad57c..af2dfbcfa 100644 --- a/source/RobotAPI/libraries/armem/core/base/ice_conversions.cpp +++ b/source/RobotAPI/libraries/armem/core/base/ice_conversions.cpp @@ -56,16 +56,20 @@ namespace armarx::armem void base::toIce(data::EntityInstanceMetadata& ice, const EntityInstanceMetadata& metadata) { ice.confidence = metadata.confidence; - toIce(ice.timeArrived, metadata.arrivedTime); + toIce(ice.arrivedTime, metadata.arrivedTime); toIce(ice.referencedTime, metadata.referencedTime); - toIce(ice.timeSent, metadata.sentTime); + toIce(ice.sentTime, metadata.sentTime); + toIce(ice.lastAccessedTime, metadata.lastAccessedTime); + ice.accessed = metadata.accessed; } void base::fromIce(const data::EntityInstanceMetadata& ice, EntityInstanceMetadata& metadata) { metadata.confidence = ice.confidence; - fromIce(ice.timeArrived, metadata.arrivedTime); + fromIce(ice.arrivedTime, metadata.arrivedTime); fromIce(ice.referencedTime, metadata.referencedTime); - fromIce(ice.timeSent, metadata.sentTime); + fromIce(ice.sentTime, metadata.sentTime); + fromIce(ice.lastAccessedTime, metadata.lastAccessedTime); + metadata.accessed = ice.accessed; } diff --git a/source/RobotAPI/libraries/armem/core/ice_conversions.cpp b/source/RobotAPI/libraries/armem/core/ice_conversions.cpp index 6fccee2f6..5e1ace162 100644 --- a/source/RobotAPI/libraries/armem/core/ice_conversions.cpp +++ b/source/RobotAPI/libraries/armem/core/ice_conversions.cpp @@ -90,7 +90,7 @@ namespace armarx fromIce(ice.referencedTime, update.referencedTime); update.confidence = ice.confidence; - fromIce(ice.timeSent, update.timeSent); + fromIce(ice.timeSent, update.sentTime); } void armem::toIce(data::EntityUpdate& ice, const EntityUpdate& update) @@ -105,14 +105,14 @@ namespace armarx toIce(ice.referencedTime, update.referencedTime); ice.confidence = update.confidence; - toIce(ice.timeSent, update.timeSent); + toIce(ice.timeSent, update.sentTime); } void armem::fromIce(const data::EntityUpdateResult& ice, EntityUpdateResult& result) { result.success = ice.success; fromIce(ice.snapshotID, result.snapshotID); - fromIce(ice.timeArrived, result.timeArrived); + fromIce(ice.timeArrived, result.arrivedTime); result.errorMessage = ice.errorMessage; } @@ -120,7 +120,7 @@ namespace armarx { ice.success = result.success; toIce(ice.snapshotID, result.snapshotID); - toIce(ice.timeArrived, result.timeArrived); + toIce(ice.timeArrived, result.arrivedTime); ice.errorMessage = result.errorMessage; } @@ -137,7 +137,7 @@ namespace armarx void armem::fromIce(const data::EntityUpdate& ice, EntityUpdate& update, Time timeArrived) { fromIce(ice, update); - update.timeArrived = timeArrived; + update.arrivedTime = timeArrived; } void armem::fromIce(const actions::data::MenuPtr& ice, actions::Menu& menu) diff --git a/source/RobotAPI/libraries/armem/core/wm/memory_definitions.cpp b/source/RobotAPI/libraries/armem/core/wm/memory_definitions.cpp index eaa3e3c20..bfc408ac9 100644 --- a/source/RobotAPI/libraries/armem/core/wm/memory_definitions.cpp +++ b/source/RobotAPI/libraries/armem/core/wm/memory_definitions.cpp @@ -38,8 +38,8 @@ namespace armarx::armem::wm this->_metadata.confidence = update.confidence; this->_metadata.referencedTime = update.referencedTime; - this->_metadata.sentTime = update.timeSent; - this->_metadata.arrivedTime = update.timeArrived; + this->_metadata.sentTime = update.sentTime; + this->_metadata.arrivedTime = update.arrivedTime; } } diff --git a/source/RobotAPI/libraries/armem/server/MemoryToIceAdapter.cpp b/source/RobotAPI/libraries/armem/server/MemoryToIceAdapter.cpp index 63b9bba20..b70d98e4f 100644 --- a/source/RobotAPI/libraries/armem/server/MemoryToIceAdapter.cpp +++ b/source/RobotAPI/libraries/armem/server/MemoryToIceAdapter.cpp @@ -187,7 +187,7 @@ namespace armarx::armem::server result.success = true; result.snapshotID = updateResult.id; - result.timeArrived = update.timeArrived; + result.arrivedTime = update.arrivedTime; for (const auto& snapshot : updateResult.removedSnapshots) { diff --git a/source/RobotAPI/libraries/armem/server/query_proc/ltm/detail/EntityQueryProcessorBase.h b/source/RobotAPI/libraries/armem/server/query_proc/ltm/detail/EntityQueryProcessorBase.h index d9f64fc7a..42b87df82 100644 --- a/source/RobotAPI/libraries/armem/server/query_proc/ltm/detail/EntityQueryProcessorBase.h +++ b/source/RobotAPI/libraries/armem/server/query_proc/ltm/detail/EntityQueryProcessorBase.h @@ -27,6 +27,7 @@ namespace armarx::armem::server::query_proc::ltm::detail protected: + // default addResultSnapshot method. Always copies the data void addResultSnapshot(ResultEntityT& result, const EntitySnapshotT& snapshot) const override { ResultSnapshotT s; diff --git a/source/RobotAPI/libraries/armem/server/query_proc/wm/detail/EntityQueryProcessorBase.h b/source/RobotAPI/libraries/armem/server/query_proc/wm/detail/EntityQueryProcessorBase.h index faa3fe544..5fbd2300c 100644 --- a/source/RobotAPI/libraries/armem/server/query_proc/wm/detail/EntityQueryProcessorBase.h +++ b/source/RobotAPI/libraries/armem/server/query_proc/wm/detail/EntityQueryProcessorBase.h @@ -2,6 +2,7 @@ #include "../../base/EntityQueryProcessorBase.h" +#include <ArmarXCore/core/logging/Logging.h> namespace armarx::armem::server::query_proc::wm::detail { @@ -32,7 +33,12 @@ namespace armarx::armem::server::query_proc::wm::detail protected: void addResultSnapshot(ResultEntityT& result, const EntitySnapshotT& snapshot) const override { - result.addSnapshot(snapshot); + snapshot.forEachInstance([](const typename EntitySnapshotT::EntityInstanceT& instance) + { + instance.metadata().access(); + }); + EntitySnapshotT copy = snapshot; + result.addSnapshot(std::move(copy)); } }; } diff --git a/source/RobotAPI/libraries/armem/server/query_proc/wm/wm.h b/source/RobotAPI/libraries/armem/server/query_proc/wm/wm.h index 27e88e828..312a39896 100644 --- a/source/RobotAPI/libraries/armem/server/query_proc/wm/wm.h +++ b/source/RobotAPI/libraries/armem/server/query_proc/wm/wm.h @@ -53,15 +53,21 @@ namespace armarx::armem::server::query_proc::wm::detail bool withData = (dataMode == armem::query::DataMode::WithData); if (withData) { - result.addSnapshot(server::wm::EntitySnapshot{ snapshot }); + Base::addResultSnapshot(result, snapshot); } else { + // 1. access real data + snapshot.forEachInstance([](const server::wm::EntityInstance& i) + { + i.metadata().access(); + }); + + // 2. create copy and remove data from copy server::wm::EntitySnapshot copy = snapshot; copy.forEachInstance([](server::wm::EntityInstance & i) { i.data() = nullptr; - return true; }); result.addSnapshot(std::move(copy)); } diff --git a/source/RobotAPI/libraries/armem_grasping/server/KnownGraspProviderSegment.cpp b/source/RobotAPI/libraries/armem_grasping/server/KnownGraspProviderSegment.cpp index 17adf356e..00bd50a3d 100644 --- a/source/RobotAPI/libraries/armem_grasping/server/KnownGraspProviderSegment.cpp +++ b/source/RobotAPI/libraries/armem_grasping/server/KnownGraspProviderSegment.cpp @@ -127,7 +127,7 @@ namespace armarx::armem::grasping::segment { EntityUpdate& update = commit.add(); update.entityID = providerID.withEntityName(info.id().str()); - update.entityID.timestamp = update.timeArrived = update.referencedTime = update.timeSent = now; + update.entityID.timestamp = update.arrivedTime = update.referencedTime = update.sentTime = now; update.instancesData = { diff --git a/source/RobotAPI/libraries/armem_gui/instance/InstanceView.cpp b/source/RobotAPI/libraries/armem_gui/instance/InstanceView.cpp index e95234373..025eb36cc 100644 --- a/source/RobotAPI/libraries/armem_gui/instance/InstanceView.cpp +++ b/source/RobotAPI/libraries/armem_gui/instance/InstanceView.cpp @@ -50,6 +50,7 @@ namespace armarx::armem::gui::instance treeItemMetadata->addChild(new QTreeWidgetItem({"Time Created"})); treeItemMetadata->addChild(new QTreeWidgetItem({"Time Sent"})); treeItemMetadata->addChild(new QTreeWidgetItem({"Time Arrived"})); + treeItemMetadata->addChild(new QTreeWidgetItem({"Time Last Accessed"})); QList<QTreeWidgetItem*> items = {treeItemInstanceID, treeItemMetadata}; tree->insertTopLevelItems(0, items); @@ -112,7 +113,8 @@ namespace armarx::armem::gui::instance std::to_string(metadata.confidence), armem::toDateTimeMilliSeconds(metadata.referencedTime), armem::toDateTimeMilliSeconds(metadata.sentTime), - armem::toDateTimeMilliSeconds(metadata.arrivedTime) + armem::toDateTimeMilliSeconds(metadata.arrivedTime), + armem::toDateTimeMilliSeconds(metadata.lastAccessedTime) + " (" + std::to_string(metadata.accessed) + " times total)" }; ARMARX_CHECK_EQUAL(static_cast<size_t>(treeItemMetadata->childCount()), items.size()); int i = 0; diff --git a/source/RobotAPI/libraries/armem_objects/client/instance/ObjectWriter.cpp b/source/RobotAPI/libraries/armem_objects/client/instance/ObjectWriter.cpp index 91eb015ab..8ee596b27 100644 --- a/source/RobotAPI/libraries/armem_objects/client/instance/ObjectWriter.cpp +++ b/source/RobotAPI/libraries/armem_objects/client/instance/ObjectWriter.cpp @@ -65,7 +65,7 @@ namespace armarx::armem::obj::instance e.entityID.providerSegmentName = provider; e.entityID.entityName = inst.pose.objectID.dataset + "/" + inst.pose.objectID.className + "/" + inst.pose.objectID.instanceName; e.referencedTime = t; - e.timeSent = armem::Time::Now(); + e.sentTime = armem::Time::Now(); e.instancesData = { inst.toAron() }; auto res = memoryWriter.commit(c); diff --git a/source/RobotAPI/libraries/armem_objects/server/class/Segment.cpp b/source/RobotAPI/libraries/armem_objects/server/class/Segment.cpp index ad9b5f73e..c841afc4d 100644 --- a/source/RobotAPI/libraries/armem_objects/server/class/Segment.cpp +++ b/source/RobotAPI/libraries/armem_objects/server/class/Segment.cpp @@ -95,7 +95,7 @@ namespace armarx::armem::server::obj::clazz EntityUpdate& update = commit.add(); update.entityID = providerID.withEntityName(info.id().str()); - update.timeArrived = update.referencedTime = update.timeSent = now; + update.arrivedTime = update.referencedTime = update.sentTime = now; arondto::ObjectClass objectClass = objectClassFromInfo(info); update.instancesData = diff --git a/source/RobotAPI/libraries/armem_objects/server/instance/Segment.cpp b/source/RobotAPI/libraries/armem_objects/server/instance/Segment.cpp index f8a6d67c7..b0726c001 100644 --- a/source/RobotAPI/libraries/armem_objects/server/instance/Segment.cpp +++ b/source/RobotAPI/libraries/armem_objects/server/instance/Segment.cpp @@ -335,7 +335,7 @@ namespace armarx::armem::server::obj::instance providerName.empty() ? pose.providerName : providerName); update.entityID = providerID.withEntityName(pose.objectID.str()); - update.timeArrived = now; + update.arrivedTime = now; update.referencedTime = pose.timestamp; update.confidence = pose.confidence; diff --git a/source/RobotAPI/libraries/armem_robot_state/server/description/Segment.cpp b/source/RobotAPI/libraries/armem_robot_state/server/description/Segment.cpp index 8c196a889..7a8f6ae03 100644 --- a/source/RobotAPI/libraries/armem_robot_state/server/description/Segment.cpp +++ b/source/RobotAPI/libraries/armem_robot_state/server/description/Segment.cpp @@ -58,7 +58,7 @@ namespace armarx::armem::server::robot_state::description EntityUpdate update; update.entityID = providerID.withEntityName("description"); - update.timeArrived = update.referencedTime = update.timeSent = now; + update.arrivedTime = update.referencedTime = update.sentTime = now; arondto::RobotDescription dto; robot::toAron(dto, robotDescription); diff --git a/source/RobotAPI/libraries/armem_robot_state/server/localization/Segment.cpp b/source/RobotAPI/libraries/armem_robot_state/server/localization/Segment.cpp index 522583f12..a503bae53 100644 --- a/source/RobotAPI/libraries/armem_robot_state/server/localization/Segment.cpp +++ b/source/RobotAPI/libraries/armem_robot_state/server/localization/Segment.cpp @@ -187,7 +187,7 @@ namespace armarx::armem::server::robot_state::localization EntityUpdate update; update.entityID = providerID.withEntityName(transform.header.parentFrame + "," + transform.header.frame); - update.timeArrived = update.referencedTime = update.timeSent = timestamp; + update.arrivedTime = update.referencedTime = update.sentTime = timestamp; arondto::Transform aronTransform; toAron(aronTransform, transform); -- GitLab