diff --git a/source/RobotAPI/libraries/RobotAPIComponentPlugins/HeartbeatComponentPlugin.cpp b/source/RobotAPI/libraries/RobotAPIComponentPlugins/HeartbeatComponentPlugin.cpp index 510ff8933b6e045ec96e1020e6914f2b064636f2..743d8a9bc2904a707f42633567f9b59ef184c3af 100644 --- a/source/RobotAPI/libraries/RobotAPIComponentPlugins/HeartbeatComponentPlugin.cpp +++ b/source/RobotAPI/libraries/RobotAPIComponentPlugins/HeartbeatComponentPlugin.cpp @@ -67,6 +67,7 @@ namespace armarx::plugins HeartbeatComponentPlugin::preOnConnectComponent() { robotHealthTopic = parent<Component>().getTopic<RobotHealthInterfacePrx>(topicName); + componentName = parent<Component>().getName(); } void diff --git a/source/RobotAPI/libraries/RobotAPINJointControllers/DMPController/NJointTaskSpaceImpedanceDMPController.cpp b/source/RobotAPI/libraries/RobotAPINJointControllers/DMPController/NJointTaskSpaceImpedanceDMPController.cpp index e5077dbad6abca53970f20a82f2b4c7534333cc7..df6f5374d391a6bdf0ec9378df8668017599b4eb 100644 --- a/source/RobotAPI/libraries/RobotAPINJointControllers/DMPController/NJointTaskSpaceImpedanceDMPController.cpp +++ b/source/RobotAPI/libraries/RobotAPINJointControllers/DMPController/NJointTaskSpaceImpedanceDMPController.cpp @@ -454,6 +454,8 @@ namespace armarx debugOutputData.getWriteBuffer().currentDnull_y = dnull.y(); debugOutputData.getWriteBuffer().currentDnull_z = dnull.z(); + debugOutputData.getWriteBuffer().filteredForceInRoot = filteredForceInRoot; + debugOutputData.commitWrite(); } @@ -644,6 +646,10 @@ namespace armarx datafields["forceDesired_ry"] = new Variant(debugOutputData.getUpToDateReadBuffer().forceDesired_ry); datafields["forceDesired_rz"] = new Variant(debugOutputData.getUpToDateReadBuffer().forceDesired_rz); + datafields["filteredForceInRoot_x"] = new Variant(debugOutputData.getUpToDateReadBuffer().filteredForceInRoot[0]); + datafields["filteredForceInRoot_y"] = new Variant(debugOutputData.getUpToDateReadBuffer().filteredForceInRoot[1]); + datafields["filteredForceInRoot_z"] = new Variant(debugOutputData.getUpToDateReadBuffer().filteredForceInRoot[2]); + datafields["deltaT"] = new Variant(debugOutputData.getUpToDateReadBuffer().deltaT); std::string channelName = cfg->nodeSetName + "_TaskSpaceImpedanceControl"; diff --git a/source/RobotAPI/libraries/RobotAPINJointControllers/DMPController/NJointTaskSpaceImpedanceDMPController.h b/source/RobotAPI/libraries/RobotAPINJointControllers/DMPController/NJointTaskSpaceImpedanceDMPController.h index 58fd840fb1121b4a159c185abb2e72fd7470f082..5361dec0f37c7269c86432c6dff64c95504cca3f 100644 --- a/source/RobotAPI/libraries/RobotAPINJointControllers/DMPController/NJointTaskSpaceImpedanceDMPController.h +++ b/source/RobotAPI/libraries/RobotAPINJointControllers/DMPController/NJointTaskSpaceImpedanceDMPController.h @@ -162,6 +162,8 @@ namespace armarx float forceDesired_ry; float forceDesired_rz; + Eigen::Vector3f filteredForceInRoot; + float deltaT; diff --git a/source/RobotAPI/libraries/armem/client/util/SimpleReaderBase.h b/source/RobotAPI/libraries/armem/client/util/SimpleReaderBase.h index a78db401d3f578d7be9f9c86542a37f72326aabc..e567b76b8d36d8cf41c00118a49d3e041d0607bc 100644 --- a/source/RobotAPI/libraries/armem/client/util/SimpleReaderBase.h +++ b/source/RobotAPI/libraries/armem/client/util/SimpleReaderBase.h @@ -44,7 +44,7 @@ namespace armarx::armem::client::util virtual ~SimpleReaderBase() = default; void registerPropertyDefinitions(armarx::PropertyDefinitionsPtr& def); - void connect(); + virtual void connect(); protected: @@ -65,6 +65,8 @@ namespace armarx::armem::client::util const armem::client::Reader& memoryReader() const; + MemoryNameSystem& memoryNameSystem; + private: Properties props; @@ -72,7 +74,6 @@ namespace armarx::armem::client::util armem::client::Reader memoryReaderClient; std::mutex memoryMutex; - MemoryNameSystem& memoryNameSystem; }; } // namespace armarx::armem::client::util diff --git a/source/RobotAPI/libraries/armem/mns/MemoryNameSystem.cpp b/source/RobotAPI/libraries/armem/mns/MemoryNameSystem.cpp index a80a189ff585c7610bebe0978468aec82ebe48b9..a0c606a990fd4635a5fa2cded1c0e5be8f7566a8 100644 --- a/source/RobotAPI/libraries/armem/mns/MemoryNameSystem.cpp +++ b/source/RobotAPI/libraries/armem/mns/MemoryNameSystem.cpp @@ -40,6 +40,14 @@ namespace armarx::armem::mns } } } + + dto::RegisterServerResult MemoryNameSystem::registerServer(const dto::RegisterServerInput& input) + { + const auto result = Registry::registerServer(input); + waitForServer_processOnce(); + + return result; + } armarx::RemoteGui::Client::GridLayout MemoryNameSystem::RemoteGui_buildInfoGrid() @@ -92,4 +100,3 @@ namespace armarx::armem::mns } } - diff --git a/source/RobotAPI/libraries/armem/mns/MemoryNameSystem.h b/source/RobotAPI/libraries/armem/mns/MemoryNameSystem.h index 51e4719f127ee576073e0c9b45cb0635241a185d..e0cf5b88753cb4a96caad2c004a853dcd4d11a34 100644 --- a/source/RobotAPI/libraries/armem/mns/MemoryNameSystem.h +++ b/source/RobotAPI/libraries/armem/mns/MemoryNameSystem.h @@ -31,6 +31,8 @@ namespace armarx::armem::mns void waitForServer_processOnce(); + dto::RegisterServerResult registerServer(const dto::RegisterServerInput& input) override; + /// Builds a RemoteGui grid containing information about registered memories. armarx::RemoteGui::Client::GridLayout RemoteGui_buildInfoGrid(); diff --git a/source/RobotAPI/libraries/armem/mns/Registry.h b/source/RobotAPI/libraries/armem/mns/Registry.h index bf9348d157ee990f6032c4cf115b9fd56c70f716..c1965bdac24fcdf943ad2b7bc945698358dd3f0c 100644 --- a/source/RobotAPI/libraries/armem/mns/Registry.h +++ b/source/RobotAPI/libraries/armem/mns/Registry.h @@ -35,7 +35,7 @@ namespace armarx::armem::mns * Causes threads waiting in `waitForMemory()` to resume if the respective * memory server was added. */ - dto::RegisterServerResult registerServer(const dto::RegisterServerInput& input); + virtual dto::RegisterServerResult registerServer(const dto::RegisterServerInput& input); /** * @brief Remove a server entry. */ diff --git a/source/RobotAPI/libraries/armem_objects/client/articulated_object/Reader.cpp b/source/RobotAPI/libraries/armem_objects/client/articulated_object/Reader.cpp index 202c4d6c4cc5b94e9a912ee9a24a3387b8542906..c554afd52d27cd534b4015eb2c5114ddd8955181 100644 --- a/source/RobotAPI/libraries/armem_objects/client/articulated_object/Reader.cpp +++ b/source/RobotAPI/libraries/armem_objects/client/articulated_object/Reader.cpp @@ -2,15 +2,16 @@ #include <mutex> #include <optional> -#include <Eigen/src/Geometry/Transform.h> -#include "RobotAPI/libraries/ArmarXObjects/aron_conversions/objpose.h" -#include <ArmarXCore/core/PackagePath.h> -#include <ArmarXCore/core/logging/Logging.h> +#include <Eigen/Geometry> +#include "ArmarXCore/core/exceptions/local/ExpressionException.h" #include "RobotAPI/libraries/ArmarXObjects/ObjectInfo.h" #include "RobotAPI/libraries/ArmarXObjects/ObjectPose.h" +#include "RobotAPI/libraries/ArmarXObjects/aron_conversions/objpose.h" #include "RobotAPI/libraries/armem_objects/aron_conversions.h" +#include <ArmarXCore/core/PackagePath.h> +#include <ArmarXCore/core/logging/Logging.h> #include <RobotAPI/libraries/ArmarXObjects/aron/ObjectPose.aron.generated.h> #include <RobotAPI/libraries/armem/client/query/Builder.h> #include <RobotAPI/libraries/armem/core/Time.h> @@ -32,7 +33,8 @@ namespace armarx::armem::articulated_object { } - void Reader::registerPropertyDefinitions(armarx::PropertyDefinitionsPtr& def) + void + Reader::registerPropertyDefinitions(armarx::PropertyDefinitionsPtr& def) { ARMARX_DEBUG << "Reader: registerPropertyDefinitions"; @@ -49,7 +51,8 @@ namespace armarx::armem::articulated_object def->optional(properties.providerName, prefix + "read.ProviderName"); } - void Reader::connect() + void + Reader::connect() { // Wait for the memory to become available and add it as dependency. ARMARX_IMPORTANT << "Reader: Waiting for memory '" << properties.memoryName << "' ..."; @@ -65,14 +68,15 @@ namespace armarx::armem::articulated_object } armem::MemoryID id = armem::MemoryID(); - id.memoryName = properties.memoryName; + id.memoryName = properties.memoryName; id.coreSegmentName = properties.coreClassSegmentName; // listen to all provider segments! memoryNameSystem.subscribe(id, this, &Reader::updateKnownObjects); } - void Reader::updateKnownObject(const armem::MemoryID& snapshotId) + void + Reader::updateKnownObject(const armem::MemoryID& snapshotId) { // const std::string& nameWithDataset = snapshotId.providerSegmentName; @@ -82,8 +86,9 @@ namespace armarx::armem::articulated_object // TODO(fabian.reister): implement } - void Reader::updateKnownObjects(const armem::MemoryID& subscriptionID, - const std::vector<armem::MemoryID>& snapshotIDs) + void + Reader::updateKnownObjects(const armem::MemoryID& subscriptionID, + const std::vector<armem::MemoryID>& snapshotIDs) { ARMARX_INFO << "New objects available!"; @@ -106,9 +111,15 @@ namespace armarx::armem::articulated_object // }); } - std::optional<ArticulatedObject> Reader::get(const std::string& name, - const armem::Time& timestamp) + std::optional<ArticulatedObject> + Reader::get(const std::string& name, const armem::Time& timestamp) { + const auto splits = simox::alg::split(name, "/"); + ARMARX_CHECK_EQUAL(splits.size(), 3) << "`name` must be of form `DATASET/NAME/INSTANCE`"; + + const std::string className = splits.at(0) + "/" + splits.at(1); // `DATASET/NAME` + const std::string instanceName = splits.at(2); + const auto description = queryDescription(name, timestamp); if (not description) @@ -117,36 +128,42 @@ namespace armarx::armem::articulated_object return std::nullopt; } - return get(*description, timestamp); + return get(*description, timestamp, instanceName); } - ArticulatedObject Reader::get(const ArticulatedObjectDescription& description, - const armem::Time& timestamp) + ArticulatedObject + Reader::get(const ArticulatedObjectDescription& description, + const armem::Time& timestamp, + const std::string& instanceName) { ArticulatedObject obj{.description = description, - .instance = "", // TODO(fabian.reister): - .config = {}, // will be populated by synchronize - .timestamp = timestamp}; + .instance = instanceName, + .config = {}, // will be populated by `synchronize()` + .timestamp = timestamp}; synchronize(obj, timestamp); return obj; } - void Reader::synchronize(ArticulatedObject& obj, const armem::Time& timestamp) + void + Reader::synchronize(ArticulatedObject& obj, const armem::Time& timestamp) { - auto state = queryState(obj.description, timestamp); + ARMARX_CHECK_NOT_EMPTY(obj.instance) << "An instance name must be provided!"; + + auto state = queryState(obj.name(), timestamp); if (not state) /* c++20 [[unlikely]] */ { - ARMARX_WARNING << "Could not synchronize object " << obj.description.name; + ARMARX_WARNING << "Could not synchronize object " << obj.instance; return; } obj.config = std::move(*state); } - std::vector<robot::RobotDescription> Reader::queryDescriptions(const armem::Time& timestamp) + std::vector<robot::RobotDescription> + Reader::queryDescriptions(const armem::Time& timestamp) { // Query all entities from provider. armem::client::query::Builder qb; @@ -171,19 +188,23 @@ namespace armarx::armem::articulated_object return getRobotDescriptions(qResult.memory); } - std::string Reader::getProviderName() const + std::string + Reader::getProviderName() const { return properties.providerName; } - void Reader::setProviderName(const std::string& providerName) + void + Reader::setProviderName(const std::string& providerName) { this->properties.providerName = providerName; } - std::optional<robot::RobotDescription> Reader::queryDescription(const std::string& name, - const armem::Time& timestamp) + std::optional<robot::RobotDescription> + Reader::queryDescription(const std::string& name, const armem::Time& timestamp) { + // FIXME: why is `name` unused? + // Query all entities from provider. armem::client::query::Builder qb; @@ -208,8 +229,8 @@ namespace armarx::armem::articulated_object return getRobotDescription(qResult.memory); } - std::optional<robot::RobotState> Reader::queryState(const robot::RobotDescription& description, - const armem::Time& timestamp) + std::optional<robot::RobotState> + Reader::queryState(const std::string& instanceName, const armem::Time& timestamp) { // TODO(fabian.reister): how to deal with multiple providers? @@ -220,7 +241,7 @@ namespace armarx::armem::articulated_object qb .coreSegments().withName(properties.coreInstanceSegmentName) .providerSegments().all() // withName(properties.providerName) // agent - .entities().withName(description.name) + .entities().withName(instanceName) .snapshots().latest(); // clang-format on @@ -237,7 +258,8 @@ namespace armarx::armem::articulated_object } - std::optional<robot::RobotState> convertToRobotState(const armem::wm::EntityInstance& instance) + std::optional<robot::RobotState> + convertToRobotState(const armem::wm::EntityInstance& instance) { armarx::armem::arondto::ObjectInstance aronObjectInstance; try @@ -253,12 +275,9 @@ namespace armarx::armem::articulated_object objpose::ObjectPose objectPose; objpose::fromAron(aronObjectInstance.pose, objectPose); - robot::RobotState robotState - { - .timestamp = objectPose.timestamp, - .globalPose = Eigen::Affine3f(objectPose.objectPoseGlobal), - .jointMap = objectPose.objectJointValues - }; + robot::RobotState robotState{.timestamp = objectPose.timestamp, + .globalPose = Eigen::Affine3f(objectPose.objectPoseGlobal), + .jointMap = objectPose.objectJointValues}; return robotState; } @@ -272,20 +291,16 @@ namespace armarx::armem::articulated_object // clang-format on std::optional<wm::EntityInstance> instance; - coreSegment.forEachInstance([&instance](const wm::EntityInstance & i) - { - instance = i; - }); - + coreSegment.forEachInstance([&instance](const wm::EntityInstance& i) { instance = i; }); + if (instance.has_value()) { return convertToRobotState(instance.value()); // return robot::convertRobotState(instance.value()); } - + ARMARX_FATAL << "Failed to obtain robot state"; return std::nullopt; - } @@ -297,10 +312,7 @@ namespace armarx::armem::articulated_object // clang-format on std::optional<wm::EntityInstance> instance; - coreSegment.forEachInstance([&instance](const wm::EntityInstance & i) - { - instance = i; - }); + coreSegment.forEachInstance([&instance](const wm::EntityInstance& i) { instance = i; }); if (instance.has_value()) { @@ -309,7 +321,6 @@ namespace armarx::armem::articulated_object ARMARX_DEBUG << "No robot description"; return std::nullopt; - } @@ -320,17 +331,19 @@ namespace armarx::armem::articulated_object memory.getCoreSegment(properties.coreClassSegmentName); std::vector<robot::RobotDescription> descriptions; - coreSegment.forEachEntity([&descriptions](const wm::Entity & entity) - { - if (not entity.empty()) + coreSegment.forEachEntity( + [&descriptions](const wm::Entity& entity) { - const auto robotDescription = convertRobotDescription(entity.getFirstSnapshot().getInstance(0)); - if (robotDescription) + if (not entity.empty()) { - descriptions.push_back(*robotDescription); + const auto robotDescription = + convertRobotDescription(entity.getFirstSnapshot().getInstance(0)); + if (robotDescription) + { + descriptions.push_back(*robotDescription); + } } - } - }); + }); return descriptions; } diff --git a/source/RobotAPI/libraries/armem_objects/client/articulated_object/Reader.h b/source/RobotAPI/libraries/armem_objects/client/articulated_object/Reader.h index e0dca8f3ebd68e682f7bff2bcc759c6bb2673759..3108b17f9b7054a61290a4647d5d3965f17d2fbd 100644 --- a/source/RobotAPI/libraries/armem_objects/client/articulated_object/Reader.h +++ b/source/RobotAPI/libraries/armem_objects/client/articulated_object/Reader.h @@ -50,9 +50,9 @@ namespace armarx::armem::articulated_object std::optional<ArticulatedObject> get(const std::string& name, const armem::Time& timestamp) override; ArticulatedObject get(const ArticulatedObjectDescription& description, - const armem::Time& timestamp) override; + const armem::Time& timestamp, const std::string& instanceName) override; - std::optional<robot::RobotState> queryState(const robot::RobotDescription& description, + std::optional<robot::RobotState> queryState(const std::string &instanceName, const armem::Time& timestamp); std::optional<robot::RobotDescription> queryDescription(const std::string& name, const armem::Time& timestamp); diff --git a/source/RobotAPI/libraries/armem_objects/client/articulated_object/Writer.cpp b/source/RobotAPI/libraries/armem_objects/client/articulated_object/Writer.cpp index dcd44d6739bfaa3e211a79721a330cc10b4751fc..05506152012d6527110801adb5bfe5b015a42d1b 100644 --- a/source/RobotAPI/libraries/armem_objects/client/articulated_object/Writer.cpp +++ b/source/RobotAPI/libraries/armem_objects/client/articulated_object/Writer.cpp @@ -104,6 +104,8 @@ namespace armarx::armem::articulated_object std::optional<armem::MemoryID> Writer::storeOrGetClass(const ArticulatedObject& obj) { + ARMARX_TRACE; + const auto objectId = knownObjects.find(obj.description.name); // check if exists @@ -187,7 +189,10 @@ namespace armarx::armem::articulated_object const auto& timestamp = obj.timestamp; - ARMARX_DEBUG << "Storing articulated object instance '" << obj.description.name << "' (provider '" << properties.providerName << "')"; + ARMARX_CHECK(not obj.instance.empty()) << "An object instance name must be provided!"; + const std::string entityName = obj.description.name + "/" + obj.instance; + + ARMARX_DEBUG << "Storing articulated object instance '" << entityName << "' (provider '" << properties.providerName << "')"; const auto providerId = armem::MemoryID() .withMemoryName(properties.memoryName) @@ -195,7 +200,7 @@ namespace armarx::armem::articulated_object .withProviderSegmentName(properties.providerName); armem::EntityUpdate update; - update.entityID = providerId.withEntityName(obj.description.name); + update.entityID = providerId.withEntityName(entityName); // .withTimestamp(timestamp); // You only need to specify the entity ID, not the snapshot ID // arondto::Robot aronArticulatedObject; diff --git a/source/RobotAPI/libraries/armem_objects/client/articulated_object/interfaces.h b/source/RobotAPI/libraries/armem_objects/client/articulated_object/interfaces.h index ced0a76fd07fe4575ea4762ea062a804431fff2a..a3061a553cb545605ce37febf9632d6c73d50cda 100644 --- a/source/RobotAPI/libraries/armem_objects/client/articulated_object/interfaces.h +++ b/source/RobotAPI/libraries/armem_objects/client/articulated_object/interfaces.h @@ -13,7 +13,7 @@ namespace armarx::armem::articulated_object virtual void synchronize(ArticulatedObject& obj, const armem::Time& timestamp) = 0; - virtual ArticulatedObject get(const ArticulatedObjectDescription& description, const armem::Time& timestamp) = 0; + virtual ArticulatedObject get(const ArticulatedObjectDescription& description, const armem::Time& timestamp, const std::string& instanceName) = 0; virtual std::optional<ArticulatedObject> get(const std::string& name, const armem::Time& timestamp) = 0; }; @@ -26,4 +26,4 @@ namespace armarx::armem::articulated_object virtual bool store(const ArticulatedObject& obj) = 0; }; -} // namespace armarx::armem::articulated_object \ No newline at end of file +} // namespace armarx::armem::articulated_object diff --git a/source/RobotAPI/libraries/armem_robot/types.h b/source/RobotAPI/libraries/armem_robot/types.h index df39df99e945e4a1ef38c38db6f9428404a35bed..92f16199a760a2a11475b21fcd63a570dbedbedf 100644 --- a/source/RobotAPI/libraries/armem_robot/types.h +++ b/source/RobotAPI/libraries/armem_robot/types.h @@ -8,6 +8,7 @@ #include <IceUtil/Time.h> +#include "ArmarXCore/core/exceptions/local/ExpressionException.h" #include "RobotAPI/libraries/ArmarXObjects/ObjectID.h" #include <ArmarXCore/core/PackagePath.h> @@ -41,6 +42,14 @@ namespace armarx::armem::robot RobotState config; IceUtil::Time timestamp; + + std::string name() const + { + ARMARX_CHECK_NOT_EMPTY(description.name) << "The robot name must be set!"; + ARMARX_CHECK_NOT_EMPTY(instance) << "The robot instance name must be provided!"; + + return description.name + "/" + instance; + } }; using Robots = std::vector<Robot>; diff --git a/source/RobotAPI/libraries/armem_robot_state/client/common/RobotReader.cpp b/source/RobotAPI/libraries/armem_robot_state/client/common/RobotReader.cpp index 764c443a7cc595f7c1f32ca51d4bdde6ee9309a4..5ea6d2cd90c0412c2b9243262ffb3166f5ce9f13 100644 --- a/source/RobotAPI/libraries/armem_robot_state/client/common/RobotReader.cpp +++ b/source/RobotAPI/libraries/armem_robot_state/client/common/RobotReader.cpp @@ -113,7 +113,7 @@ namespace armarx::armem::robot_state .snapshots().latest(); // TODO(fabian.reister): atTime(timestamp); // clang-format on - ARMARX_INFO << "Lookup query in reader"; + ARMARX_DEBUG << "Lookup query in reader"; if (not memoryReader) { @@ -125,7 +125,7 @@ namespace armarx::armem::robot_state { const armem::client::QueryResult qResult = memoryReader.query(qb.buildQueryInput()); - ARMARX_INFO << "Lookup result in reader: " << qResult; + ARMARX_DEBUG << "Lookup result in reader: " << qResult; if (not qResult.success) /* c++20 [[unlikely]] */ { @@ -149,14 +149,14 @@ namespace armarx::armem::robot_state const auto jointMap = queryJointState(description, timestamp); if (not jointMap) { - ARMARX_WARNING << "Failed to query joint state"; + ARMARX_WARNING << "Failed to query joint state for robot " << description.name; return std::nullopt; } const auto globalPose = queryGlobalPose(description, timestamp); if (not globalPose) { - ARMARX_WARNING << "Failed to query global pose"; + ARMARX_WARNING << "Failed to query global pose for robot " << description.name; return std::nullopt; } diff --git a/source/RobotAPI/libraries/armem_robot_state/client/common/VirtualRobotReader.cpp b/source/RobotAPI/libraries/armem_robot_state/client/common/VirtualRobotReader.cpp index 10e13611f3fd8608a5d0b5027fd92b960c3a7754..1c0152a463d5c38abb3b1c81f1014e1f74ef4d77 100644 --- a/source/RobotAPI/libraries/armem_robot_state/client/common/VirtualRobotReader.cpp +++ b/source/RobotAPI/libraries/armem_robot_state/client/common/VirtualRobotReader.cpp @@ -42,7 +42,7 @@ namespace armarx::armem::robot_state const auto robotState = queryState(robotDescription, timestamp); if (not robotState) { - ARMARX_WARNING << "Querying robot state failed!"; + ARMARX_WARNING << "Querying robot state failed for robot `" << robot.getName() << " / " << robot.getType() << "`!"; return false; } @@ -67,7 +67,9 @@ namespace armarx::armem::robot_state const std::string xmlFilename = ArmarXDataPath::resolvePath(description->xml.serialize().path); ARMARX_INFO << "Loading (virtual) robot '" << description->name << "' from XML file '" << xmlFilename << "'"; - return VirtualRobot::RobotIO::loadRobot(xmlFilename, loadMode); + auto robot = VirtualRobot::RobotIO::loadRobot(xmlFilename, loadMode); + robot->setName(name); + return robot; } diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/toplevel/IntEnumClass.cpp b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/toplevel/IntEnumClass.cpp index 0db5f2d68e1de29da18c9327a5b25ee5bd834bc5..5f3c8043a69376538f41f8a55313b53f0c331f80 100644 --- a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/toplevel/IntEnumClass.cpp +++ b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/toplevel/IntEnumClass.cpp @@ -59,7 +59,7 @@ namespace armarx::aron::cppserializer::serializer for (const auto& [key, value] : typenavigator->getAcceptedValueMap()) { std::string enumKeyWithNamespace = std::string(IMPL_ENUM) + "::" + key; - fields.push_back(std::make_shared<CppField>("const static " + std::string(IMPL_ENUM), key + " = " + enumKeyWithNamespace)); + fields.push_back(std::make_shared<CppField>("static constexpr " + std::string(IMPL_ENUM), key + " = " + enumKeyWithNamespace)); enum_to_name << "\t\t{" << enumKeyWithNamespace << ", \"" << key << "\"}," << std::endl; name_to_enum << "\t\t{\"" << key << "\", " << enumKeyWithNamespace << "}," << std::endl; diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/toplevel/IntEnumClass.h b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/toplevel/IntEnumClass.h index bd4a0f8128b19bbe28b388e3fa97faddf8f743b1..4a73767f0f800f03be6c1d77759ba17993cac1a3 100644 --- a/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/toplevel/IntEnumClass.h +++ b/source/RobotAPI/libraries/aron/core/codegenerator/codeWriter/cpp/serializer/toplevel/IntEnumClass.h @@ -66,6 +66,6 @@ namespace armarx::aron::cppserializer::serializer private: // Members static const std::map<std::string, std::pair<std::string, int>> ACCEPTED_TYPES; - static constexpr const char* IMPL_ENUM = "__ImplEnum"; + static constexpr const char* IMPL_ENUM = "ImplEnum"; }; } diff --git a/source/RobotAPI/libraries/aron/core/test/aronRandomizedTest.cpp b/source/RobotAPI/libraries/aron/core/test/aronRandomizedTest.cpp index 4ff0724c95ca3c0cbc31dd051b6ba3afdff37fe9..b9c54acda1e8d0e1b70477427a2d8c848bbedb15 100644 --- a/source/RobotAPI/libraries/aron/core/test/aronRandomizedTest.cpp +++ b/source/RobotAPI/libraries/aron/core/test/aronRandomizedTest.cpp @@ -384,3 +384,11 @@ BOOST_AUTO_TEST_CASE(test_Optional) OptionalTest pc2; runTestWithInstances<OptionalTest>(pc, pc2); } + + +BOOST_AUTO_TEST_CASE(test_Enum) +{ + BOOST_TEST_MESSAGE("Running Optional test"); + TheIntEnum value = TheIntEnum::INT_ENUM_VALUE_2; + BOOST_CHECK_EQUAL(value.toString(), "INT_ENUM_VALUE_2"); +}