diff --git a/source/RobotAPI/libraries/armem/client/util/SimpleWriterBase.cpp b/source/RobotAPI/libraries/armem/client/util/SimpleWriterBase.cpp index e5d468c552d96d70d3ef4ae92196cdb714f39163..3d8907a348bad7051e3fc88239f3b816899acd5e 100644 --- a/source/RobotAPI/libraries/armem/client/util/SimpleWriterBase.cpp +++ b/source/RobotAPI/libraries/armem/client/util/SimpleWriterBase.cpp @@ -44,12 +44,6 @@ namespace armarx::armem::client::util } } - std::mutex& - SimpleWriterBase::memoryWriterMutex() - { - return memoryMutex; - } - armem::client::Writer& SimpleWriterBase::memoryWriter() { diff --git a/source/RobotAPI/libraries/armem/client/util/SimpleWriterBase.h b/source/RobotAPI/libraries/armem/client/util/SimpleWriterBase.h index 13a54cc5b213a90e1949f73c1b11de716c0593cc..895376b0a2f3ff1f30fdd070c2e50c62b9aa2968 100644 --- a/source/RobotAPI/libraries/armem/client/util/SimpleWriterBase.h +++ b/source/RobotAPI/libraries/armem/client/util/SimpleWriterBase.h @@ -58,7 +58,6 @@ namespace armarx::armem::client::util virtual std::string propertyPrefix() const = 0; virtual Properties defaultProperties() const = 0; - std::mutex& memoryWriterMutex(); armem::client::Writer& memoryWriter(); @@ -66,7 +65,6 @@ namespace armarx::armem::client::util Properties props; armem::client::Writer memoryWriterClient; - std::mutex memoryMutex; }; } // namespace armarx::armem::client::util diff --git a/source/RobotAPI/libraries/armem_objects/CMakeLists.txt b/source/RobotAPI/libraries/armem_objects/CMakeLists.txt index 63da8444d40d90e6c4e73a1a4fd755082f4914f9..bbb52cc2b5f473d71cbf1d7c73e39002368f71ad 100644 --- a/source/RobotAPI/libraries/armem_objects/CMakeLists.txt +++ b/source/RobotAPI/libraries/armem_objects/CMakeLists.txt @@ -36,6 +36,8 @@ armarx_add_library( server/attachments/Segment.h + client/class/ClassReader.h + client/class/ClassWriter.h client/articulated_object/Reader.h client/articulated_object/Writer.h client/articulated_object/ArticulatedObjectReader.h @@ -55,6 +57,8 @@ armarx_add_library( types.cpp utils.cpp + client/class/ClassReader.cpp + client/class/ClassWriter.cpp client/articulated_object/Reader.cpp client/articulated_object/Writer.cpp client/articulated_object/ArticulatedObjectReader.cpp diff --git a/source/RobotAPI/libraries/armem_objects/client/class/ClassReader.cpp b/source/RobotAPI/libraries/armem_objects/client/class/ClassReader.cpp new file mode 100644 index 0000000000000000000000000000000000000000..bceba7d960ffbe41a620c36d47a5d8fc0897c157 --- /dev/null +++ b/source/RobotAPI/libraries/armem_objects/client/class/ClassReader.cpp @@ -0,0 +1,45 @@ +#include "ClassReader.h" + +namespace armarx::armem::obj::clazz +{ + std::optional<armem::clazz::ObjectClass> + ClassReader::getObjectClass(const std::string& providerName, const ObjectID& id) + { + auto mid = armarx::armem::MemoryID(); + mid.memoryName = properties().memoryName; + mid.coreSegmentName = properties().coreSegmentName; + mid.providerSegmentName = providerName; + mid.entityName = id.str(); + + auto i = this->memoryReader().getLatestSnapshotIn(mid); + + if (i.has_value() && i->size() == 1) + { + auto& instance = i->getInstance(0); + auto aron = instance.dataAs<armarx::armem::arondto::ObjectClass>(); + + armem::clazz::ObjectClass objClass; + armarx::armem::clazz::fromAron(aron, objClass); + + return objClass; + } + + return std::nullopt; + } + + std::string + ClassReader::propertyPrefix() const + { + return "classReader."; + } + + client::util::SimpleReaderBase::Properties + ClassReader::defaultProperties() const + { + client::util::SimpleReaderBase::Properties p; + p.memoryName = "Object"; + p.coreSegmentName = "Class"; + return p; + } + +} // namespace armarx::armem::obj::clazz diff --git a/source/RobotAPI/libraries/armem_objects/client/class/ClassReader.h b/source/RobotAPI/libraries/armem_objects/client/class/ClassReader.h new file mode 100644 index 0000000000000000000000000000000000000000..4d2805b4f03e81bb6b58b65d73997eeae56755ab --- /dev/null +++ b/source/RobotAPI/libraries/armem_objects/client/class/ClassReader.h @@ -0,0 +1,49 @@ +/* + * 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 + * 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/>. + * + * @author Fabian Reister ( fabian dot reister at kit dot edu ) + * @date 2021 + * @copyright http://www.gnu.org/licenses/gpl-2.0.txt + * GNU General Public License + */ + +#pragma once + +#include <mutex> +#include <optional> + +#include <RobotAPI/libraries/armem/client/util/SimpleReaderBase.h> +#include <RobotAPI/libraries/armem_objects/aron_conversions.h> +#include <RobotAPI/libraries/armem_objects/types.h> + +namespace armarx::armem::obj::clazz +{ + class ClassReader : public armem::client::util::SimpleReaderBase + { + public: + ClassReader() = default; + + std::optional<armem::clazz::ObjectClass> getObjectClass(const std::string& providerName, + const armarx::ObjectID& id); + + protected: + std::string propertyPrefix() const final; + Properties defaultProperties() const final; + + private: + }; + + +} // namespace armarx::armem::obj::clazz diff --git a/source/RobotAPI/libraries/armem_objects/client/class/ClassWriter.cpp b/source/RobotAPI/libraries/armem_objects/client/class/ClassWriter.cpp new file mode 100644 index 0000000000000000000000000000000000000000..f9f1d109bca843610638ab3473314ab5fe1c4a03 --- /dev/null +++ b/source/RobotAPI/libraries/armem_objects/client/class/ClassWriter.cpp @@ -0,0 +1,48 @@ +#include "ClassWriter.h" + +namespace armarx::armem::obj::clazz +{ + bool + ClassWriter::commitObjectClass(const armarx::armem::clazz::ObjectClass& c, + const armarx::core::time::DateTime& referenceTime) + { + armarx::armem::arondto::ObjectClass objClassAron; + armarx::armem::clazz::toAron(objClassAron, c); + + armarx::armem::MemoryID mid; + mid.memoryName = properties().memoryName; + mid.coreSegmentName = properties().coreSegmentName; + mid.providerSegmentName = properties().providerName; + mid.entityName = c.id.str(); + + auto commit = armarx::armem::Commit(); + auto& update = commit.add(); + + update.confidence = 1.0f; + update.referencedTime = referenceTime; + update.sentTime = armarx::core::time::DateTime::Now(); + update.entityID = mid; + update.instancesData = {objClassAron.toAron()}; + + auto res = this->memoryWriter().commit(commit); + + return res.allSuccess(); + } + + std::string + ClassWriter::propertyPrefix() const + { + return "classWriter."; + } + + client::util::SimpleWriterBase::Properties + ClassWriter::defaultProperties() const + { + client::util::SimpleWriterBase::Properties p; + p.memoryName = "Object"; + p.coreSegmentName = "Class"; + p.providerName = providerName; + return p; + } + +} // namespace armarx::armem::obj::clazz diff --git a/source/RobotAPI/libraries/armem_objects/client/class/ClassWriter.h b/source/RobotAPI/libraries/armem_objects/client/class/ClassWriter.h new file mode 100644 index 0000000000000000000000000000000000000000..db17223ba7f8dc550283fb2aa5c1ed3d11872f7e --- /dev/null +++ b/source/RobotAPI/libraries/armem_objects/client/class/ClassWriter.h @@ -0,0 +1,50 @@ +/* + * 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 + * 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/>. + * + * @author Fabian Reister ( fabian dot reister at kit dot edu ) + * @date 2021 + * @copyright http://www.gnu.org/licenses/gpl-2.0.txt + * GNU General Public License + */ + +#pragma once + +#include <mutex> +#include <optional> + +#include <RobotAPI/libraries/armem/client/util/SimpleWriterBase.h> +#include <RobotAPI/libraries/armem_objects/aron_conversions.h> +#include <RobotAPI/libraries/armem_objects/types.h> + +namespace armarx::armem::obj::clazz +{ + class ClassWriter : public armem::client::util::SimpleWriterBase + { + public: + ClassWriter(const std::string& p) : providerName(p){}; + + bool commitObjectClass(const armarx::armem::clazz::ObjectClass& c, + const armarx::core::time::DateTime& referenceTime); + + protected: + std::string propertyPrefix() const final; + Properties defaultProperties() const final; + + private: + const std::string providerName; + }; + + +} // namespace armarx::armem::obj::clazz diff --git a/source/RobotAPI/libraries/armem_vision/client/occupancy_grid/Writer.cpp b/source/RobotAPI/libraries/armem_vision/client/occupancy_grid/Writer.cpp index a682162553005783d3ad74e42d78bffefbc09ae2..9c06db1e5ce466aaa3a1461f5274d99b26d64c91 100644 --- a/source/RobotAPI/libraries/armem_vision/client/occupancy_grid/Writer.cpp +++ b/source/RobotAPI/libraries/armem_vision/client/occupancy_grid/Writer.cpp @@ -1,19 +1,21 @@ #include "Writer.h" -#include <RobotAPI/libraries/armem_vision/aron_conversions.h> #include <RobotAPI/libraries/armem_vision/aron/OccupancyGrid.aron.generated.h> - +#include <RobotAPI/libraries/armem_vision/aron_conversions.h> namespace armarx::armem::vision::occupancy_grid::client { Writer::~Writer() = default; - bool Writer::store(const OccupancyGrid& grid, - const std::string& frame, - const std::string& providerName, - const std::int64_t& timestamp) + bool + Writer::store(const OccupancyGrid& grid, + const std::string& frame, + const std::string& providerName, + const std::int64_t& timestamp) { - std::lock_guard g{memoryWriterMutex()}; + static std::mutex mutex; + + std::lock_guard g{mutex}; const auto result = memoryWriter().addSegment(properties().coreSegmentName, providerName); @@ -28,7 +30,7 @@ namespace armarx::armem::vision::occupancy_grid::client const auto iceTimestamp = Time(Duration::MicroSeconds(timestamp)); const auto providerId = armem::MemoryID(result.segmentID); - const auto entityID = providerId.withEntityName(frame).withTimestamp(iceTimestamp); + const auto entityID = providerId.withEntityName(frame).withTimestamp(iceTimestamp); armem::EntityUpdate update; update.entityID = entityID; @@ -41,7 +43,7 @@ namespace armarx::armem::vision::occupancy_grid::client dict->addElement("grid", toAron(grid.grid)); update.instancesData = {dict}; - update.referencedTime = iceTimestamp; + update.referencedTime = iceTimestamp; ARMARX_DEBUG << "Committing " << update << " at time " << iceTimestamp; armem::EntityUpdateResult updateResult = memoryWriter().commit(update); @@ -56,7 +58,8 @@ namespace armarx::armem::vision::occupancy_grid::client return updateResult.success; } - std::string Writer::propertyPrefix() const + std::string + Writer::propertyPrefix() const { return "mem.vision.occupancy_grid."; } @@ -65,7 +68,7 @@ namespace armarx::armem::vision::occupancy_grid::client Writer::defaultProperties() const { - return SimpleWriterBase::Properties{.memoryName = "Vision", + return SimpleWriterBase::Properties{.memoryName = "Vision", .coreSegmentName = "OccupancyGrid"}; } } // namespace armarx::armem::vision::occupancy_grid::client