diff --git a/source/RobotAPI/components/armem/server/RobotStateMemory/RobotStateMemory.cpp b/source/RobotAPI/components/armem/server/RobotStateMemory/RobotStateMemory.cpp index 27aaa07ddf1c0f0dc819a9a74366036cdadfe11c..c9eae54f7d33aeeab1afede2612eea3f0c2bf868 100644 --- a/source/RobotAPI/components/armem/server/RobotStateMemory/RobotStateMemory.cpp +++ b/source/RobotAPI/components/armem/server/RobotStateMemory/RobotStateMemory.cpp @@ -66,9 +66,6 @@ namespace armarx::armem::server::robot_state defs->optional(robotUnit.reader.properties.sensorPrefix, robotUnitPrefix + "SensorValuePrefix", "Prefix of all sensor values."); - defs->optional(robotUnit.writer.properties.memoryBatchSize, robotUnitPrefix + "MemoryBatchSize", - "The size of the entity snapshot to send to the memory. Minimum is 1.") - .setMin(1); defs->optional(robotUnit.pollFrequency, robotUnitPrefix + "UpdateFrequency", "The frequency to store values in Hz. All other values get discarded. " "Minimum is 1, max is " + std::to_string(ROBOT_UNIT_MAXIMUM_FREQUENCY) + ".") @@ -102,7 +99,6 @@ namespace armarx::armem::server::robot_state commonVisu.init(); robotUnit.pollFrequency = std::clamp(robotUnit.pollFrequency, 0.f, ROBOT_UNIT_MAXIMUM_FREQUENCY); - robotUnit.writer.properties.memoryBatchSize = std::max(static_cast<unsigned int>(1), robotUnit.writer.properties.memoryBatchSize); std::vector<std::string> includePaths; std::vector<std::string> packages = armarx::Application::GetProjectDependencies(); diff --git a/source/RobotAPI/libraries/armem_robot/aron_conversions.cpp b/source/RobotAPI/libraries/armem_robot/aron_conversions.cpp index 21e579c803afd33d2ad5864de6c4b283ae69733c..1bf28496f697da38e2172a41836ecaccceaa5561 100644 --- a/source/RobotAPI/libraries/armem_robot/aron_conversions.cpp +++ b/source/RobotAPI/libraries/armem_robot/aron_conversions.cpp @@ -109,30 +109,5 @@ namespace armarx::armem dto.objectJointValues = bo.jointMap; } - void robot::fromAron(const armarx::armem::prop::arondto::Platform& dto, robot::PlatformState& bo) - { - bo.twist.linear.setZero(); - bo.twist.linear.head<2>() = dto.velocity.head<2>(); // x and y - - bo.twist.angular.setZero(); - bo.twist.angular.z() = dto.velocity.z(); // yaw - } - - void robot::toAron(armarx::armem::prop::arondto::Platform& dto, const robot::PlatformState& bo) - { - ARMARX_ERROR << "Not implemented yet."; - } - - void robot::fromAron(const armarx::armem::prop::arondto::ForceTorque& dto, robot::ForceTorque& bo) - { - bo.force = dto.force; - bo.torque = dto.torque; - } - - void robot::toAron(armarx::armem::prop::arondto::ForceTorque& dto, const robot::ForceTorque& bo) - { - dto.force = bo.force; - dto.torque = bo.torque; - } } // namespace armarx::armem diff --git a/source/RobotAPI/libraries/armem_robot/aron_conversions.h b/source/RobotAPI/libraries/armem_robot/aron_conversions.h index 62744724f1d4c42ebe882cf4072e87d43428dd02..f2ea2ba959897ad48d9aed390a569d2e8009dd17 100644 --- a/source/RobotAPI/libraries/armem_robot/aron_conversions.h +++ b/source/RobotAPI/libraries/armem_robot/aron_conversions.h @@ -8,7 +8,6 @@ #include <RobotAPI/libraries/armem_robot/aron/RobotDescription.aron.generated.h> #include <RobotAPI/libraries/armem_robot/aron/RobotState.aron.generated.h> #include <RobotAPI/libraries/armem_robot/aron/Robot.aron.generated.h> -#include <RobotAPI/libraries/armem_robot_state/aron/Proprioception.aron.generated.h> namespace armarx::armem::robot @@ -27,12 +26,6 @@ namespace armarx::armem::robot void fromAron(const arondto::RobotState& dto, RobotState& bo); void toAron(arondto::RobotState& dto, const RobotState& bo); - void fromAron(const armarx::armem::prop::arondto::Platform& dto, PlatformState& bo); - void toAron(armarx::armem::prop::arondto::Platform& dto, const PlatformState& bo); - - void fromAron(const armarx::armem::prop::arondto::ForceTorque& dto, ForceTorque& bo); - void toAron(armarx::armem::prop::arondto::ForceTorque& dto, const ForceTorque& bo); - void fromAron(const arondto::ObjectClass& dto, RobotDescription& bo); void toAron(arondto::ObjectClass& dto, const RobotDescription& bo); diff --git a/source/RobotAPI/libraries/armem_robot_state/aron_conversions.cpp b/source/RobotAPI/libraries/armem_robot_state/aron_conversions.cpp index 785d25bdca4757ebe1c07f0bab767aa08a02a24d..03a578fab3b9250f724efcd646c24400d8a898d2 100644 --- a/source/RobotAPI/libraries/armem_robot_state/aron_conversions.cpp +++ b/source/RobotAPI/libraries/armem_robot_state/aron_conversions.cpp @@ -1,31 +1,30 @@ #include "aron_conversions.h" -// STL #include <string> -// Ice #include <IceUtil/Time.h> -// RobotAPI -#include <RobotAPI/libraries/armem_robot_state/aron/Transform.aron.generated.h> +#include <ArmarXCore/core/logging/Logging.h> #include <RobotAPI/libraries/armem_robot_state/aron/JointState.aron.generated.h> - +#include <RobotAPI/libraries/armem_robot_state/aron/Proprioception.aron.generated.h> +#include <RobotAPI/libraries/armem_robot_state/aron/Transform.aron.generated.h> +#include <RobotAPI/libraries/armem_robot_state/types.h> #include <RobotAPI/libraries/aron/common/aron_conversions.h> -#include "RobotAPI/libraries/armem_robot_state/types.h" - namespace armarx::armem { /* Transform */ - void fromAron(const arondto::Transform& dto, robot_state::Transform& bo) + void + fromAron(const arondto::Transform& dto, robot_state::Transform& bo) { fromAron(dto.header, bo.header); aron::fromAron(dto.transform, bo.transform); } - void toAron(arondto::Transform& dto, const robot_state::Transform& bo) + void + toAron(arondto::Transform& dto, const robot_state::Transform& bo) { toAron(dto.header, bo.header); aron::toAron(dto.transform, bo.transform); @@ -33,7 +32,8 @@ namespace armarx::armem /* TransformHeader */ - void toAron(arondto::TransformHeader& dto, const robot_state::TransformHeader& bo) + void + toAron(arondto::TransformHeader& dto, const robot_state::TransformHeader& bo) { aron::toAron(dto.parentFrame, bo.parentFrame); aron::toAron(dto.frame, bo.frame); @@ -41,7 +41,8 @@ namespace armarx::armem dto.timestamp = bo.timestamp; } - void fromAron(const arondto::TransformHeader& dto, robot_state::TransformHeader& bo) + void + fromAron(const arondto::TransformHeader& dto, robot_state::TransformHeader& bo) { aron::fromAron(dto.parentFrame, bo.parentFrame); aron::fromAron(dto.frame, bo.frame); @@ -51,16 +52,49 @@ namespace armarx::armem /* JointState */ - void fromAron(const arondto::JointState& dto, robot_state::JointState& bo) + void + fromAron(const arondto::JointState& dto, robot_state::JointState& bo) { aron::fromAron(dto.name, bo.name); aron::fromAron(dto.position, bo.position); } - void toAron(arondto::JointState& dto, const robot_state::JointState& bo) + void + toAron(arondto::JointState& dto, const robot_state::JointState& bo) { aron::toAron(dto.name, bo.name); aron::toAron(dto.position, bo.position); } -} // namespace armarx::armem + + void + fromAron(const armarx::armem::prop::arondto::Platform& dto, robot::PlatformState& bo) + { + bo.twist.linear.setZero(); + bo.twist.linear.head<2>() = dto.velocity.head<2>(); // x and y + + bo.twist.angular.setZero(); + bo.twist.angular.z() = dto.velocity.z(); // yaw + } + + void + toAron(armarx::armem::prop::arondto::Platform& dto, const robot::PlatformState& bo) + { + ARMARX_ERROR << "Not implemented yet."; + } + + void + fromAron(const armarx::armem::prop::arondto::ForceTorque& dto, robot::ForceTorque& bo) + { + bo.force = dto.force; + bo.torque = dto.torque; + } + + void + toAron(armarx::armem::prop::arondto::ForceTorque& dto, const robot::ForceTorque& bo) + { + dto.force = bo.force; + dto.torque = bo.torque; + } + +} // namespace armarx::armem diff --git a/source/RobotAPI/libraries/armem_robot_state/aron_conversions.h b/source/RobotAPI/libraries/armem_robot_state/aron_conversions.h index 202a81f089702e07155232200911fa0e0afa197d..17fe89152ef063ab932ace41a9ade84eb2f2f556 100644 --- a/source/RobotAPI/libraries/armem_robot_state/aron_conversions.h +++ b/source/RobotAPI/libraries/armem_robot_state/aron_conversions.h @@ -21,6 +21,9 @@ #pragma once +#include <RobotAPI/libraries/armem_robot/types.h> +#include <RobotAPI/libraries/armem_robot_state/aron/Proprioception.aron.generated.h> + namespace armarx::armem { namespace robot_state @@ -41,6 +44,7 @@ namespace armarx::armem } // namespace arondto + void fromAron(const arondto::Transform& dto, robot_state::Transform& bo); void toAron(arondto::Transform& dto, const robot_state::Transform& bo); @@ -50,4 +54,11 @@ namespace armarx::armem void fromAron(const arondto::JointState& dto, robot_state::JointState& bo); void toAron(arondto::JointState& dto, const robot_state::JointState& bo); -} // namespace armarx::armem \ No newline at end of file + void fromAron(const armarx::armem::prop::arondto::Platform& dto, robot::PlatformState& bo); + void toAron(armarx::armem::prop::arondto::Platform& dto, const robot::PlatformState& bo); + + void fromAron(const armarx::armem::prop::arondto::ForceTorque& dto, robot::ForceTorque& bo); + void toAron(armarx::armem::prop::arondto::ForceTorque& dto, const robot::ForceTorque& bo); + + +} // namespace armarx::armem 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 923b6f73937ef422da80bec8ce5408d9916b20a5..4f969f35c114b56d5627dc95ae118441b568aca2 100644 --- a/source/RobotAPI/libraries/armem_robot_state/client/common/RobotReader.cpp +++ b/source/RobotAPI/libraries/armem_robot_state/client/common/RobotReader.cpp @@ -4,11 +4,10 @@ #include <optional> #include "ArmarXCore/core/exceptions/local/ExpressionException.h" +#include "RobotAPI/libraries/armem_robot/types.h" #include <ArmarXCore/core/PackagePath.h> #include <ArmarXCore/core/exceptions/LocalException.h> #include <ArmarXCore/core/logging/Logging.h> - -#include "RobotAPI/libraries/armem_robot/types.h" #include <RobotAPI/libraries/armem/client/query/Builder.h> #include <RobotAPI/libraries/armem/core/Time.h> #include <RobotAPI/libraries/armem/core/error.h> @@ -18,6 +17,7 @@ #include <RobotAPI/libraries/armem_robot/robot_conversions.h> #include <RobotAPI/libraries/armem_robot_state/aron/JointState.aron.generated.h> #include <RobotAPI/libraries/armem_robot_state/aron/Proprioception.aron.generated.h> +#include <RobotAPI/libraries/armem_robot_state/aron_conversions.h> namespace fs = ::std::filesystem; @@ -203,6 +203,37 @@ namespace armarx::armem::robot_state return getRobotJointState(qResult.memory, description.name); } + RobotReader::JointTrajectory + RobotReader::queryJointStates(const robot::RobotDescription& description, + const armem::Time& begin, + const armem::Time& end) const + { + armem::client::query::Builder qb; + + ARMARX_DEBUG << "Querying robot joint states for robot: `" << description + << "` on time interval [" << begin << "," << end << "]"; + + // clang-format off + qb + .coreSegments().withName(properties.proprioceptionCoreSegment) + .providerSegments().withName(description.name) // agent + .entities().all() // TODO + .snapshots().timeRange(begin, end); + // clang-format on + + const armem::client::QueryResult qResult = memoryReader.query(qb.buildQueryInput()); + + ARMARX_DEBUG << "Lookup result in reader: " << qResult; + + if (not qResult.success) /* c++20 [[unlikely]] */ + { + ARMARX_WARNING << qResult.errorMessage; + return {}; + } + + return getRobotJointStates(qResult.memory, description.name); + } + std::optional<robot::PlatformState> RobotReader::queryPlatformState(const robot::RobotDescription& description, @@ -275,6 +306,7 @@ namespace armarx::armem::robot_state instance = &i; return false; // break }); + if (!instance) { ARMARX_WARNING << "No entity snapshots found"; @@ -346,6 +378,46 @@ namespace armarx::armem::robot_state return jointMap; } + RobotReader::JointTrajectory + RobotReader::getRobotJointStates(const armarx::armem::wm::Memory& memory, + const std::string& name) const + { + + RobotReader::JointTrajectory jointTrajectory; + + // clang-format off + const armem::wm::CoreSegment& coreSegment = memory + .getCoreSegment(properties.proprioceptionCoreSegment); + // clang-format on + + coreSegment.forEachEntity( + [&jointTrajectory](const wm::Entity& entity) + { + entity.forEachSnapshot( + [&](const auto& snapshot) + { + if (not snapshot.hasInstance(0)) + { + return; + } + + const auto& entityInstance = snapshot.getInstance(0); + + const auto proprioception = + tryCast<::armarx::armem::arondto::Proprioception>(entityInstance); + ARMARX_CHECK(proprioception.has_value()); + + const armarx::armem::prop::arondto::Joints& joints = proprioception->joints; + + jointTrajectory.emplace(entityInstance.id().timestamp, joints.position); + }); + }); + + ARMARX_INFO << "Joint trajectory with " << jointTrajectory.size() << " elements"; + + return jointTrajectory; + } + // force torque for left and right std::optional<std::map<RobotReader::Hand, robot::ForceTorque>> @@ -434,7 +506,7 @@ namespace armarx::armem::robot_state ARMARX_CHECK(proprioception.has_value()); platformState = robot::PlatformState(); // initialize optional - robot::fromAron(proprioception->platform, platformState.value()); + fromAron(proprioception->platform, platformState.value()); }); return platformState; @@ -480,7 +552,7 @@ namespace armarx::armem::robot_state for (const auto& [handName, dtoFt] : proprioception->forceTorque) { robot::ForceTorque forceTorque; - robot::fromAron(dtoFt, forceTorque); + fromAron(dtoFt, forceTorque); const auto hand = fromHandName(handName); forceTorques.emplace(hand, forceTorque); @@ -514,7 +586,7 @@ namespace armarx::armem::robot_state for (const auto& [handName, dtoFt] : proprioception->forceTorque) { robot::ForceTorque forceTorque; - robot::fromAron(dtoFt, forceTorque); + fromAron(dtoFt, forceTorque); const auto hand = fromHandName(handName); forceTorques[hand].emplace(entityInstance.id().timestamp, forceTorque); @@ -538,7 +610,7 @@ namespace armarx::armem::robot_state const armem::wm::EntityInstance* instance = nullptr; providerSegment.forEachInstance([&instance](const wm::EntityInstance& i) { instance = &i; }); - if (!instance) + if (instance == nullptr) { ARMARX_WARNING << "No entity snapshots found"; return std::nullopt; diff --git a/source/RobotAPI/libraries/armem_robot_state/client/common/RobotReader.h b/source/RobotAPI/libraries/armem_robot_state/client/common/RobotReader.h index 884c85fd964b8150a615dfd62e16b0e60de7b5ee..20cafbd2225160c7b9abacc2d73b981f60260e34 100644 --- a/source/RobotAPI/libraries/armem_robot_state/client/common/RobotReader.h +++ b/source/RobotAPI/libraries/armem_robot_state/client/common/RobotReader.h @@ -66,6 +66,12 @@ namespace armarx::armem::robot_state queryJointState(const robot::RobotDescription& description, const armem::Time& timestamp) const; + using JointTrajectory = std::map<armem::Time, robot::RobotState::JointMap>; + + JointTrajectory + queryJointStates(const robot::RobotDescription& description, + const armem::Time& begin, const armem::Time& end) const; + std::optional<robot::RobotState::Pose> queryGlobalPose(const robot::RobotDescription& description, const armem::Time& timestamp) const; @@ -100,6 +106,10 @@ namespace armarx::armem::robot_state std::optional<robot::RobotState::JointMap> getRobotJointState(const armarx::armem::wm::Memory& memory, const std::string& name) const; + JointTrajectory + getRobotJointStates(const armarx::armem::wm::Memory& memory, + const std::string& name) const; + std::optional<robot::PlatformState> getRobotPlatformState(const armarx::armem::wm::Memory& memory, const std::string& name) const; diff --git a/source/RobotAPI/libraries/armem_robot_state/server/proprioception/RobotStateWriter.cpp b/source/RobotAPI/libraries/armem_robot_state/server/proprioception/RobotStateWriter.cpp index b73e65693e30f205b590a4e0c516fb5fff317127..c8a06a1b8329cb3df77280b1da18da556900ae93 100644 --- a/source/RobotAPI/libraries/armem_robot_state/server/proprioception/RobotStateWriter.cpp +++ b/source/RobotAPI/libraries/armem_robot_state/server/proprioception/RobotStateWriter.cpp @@ -78,7 +78,7 @@ namespace armarx::armem::server::robot_state::proprioception { std::lock_guard lock{dataMutex}; queueSize = dataQueue.size(); - if (dataQueue.size() >= properties.memoryBatchSize) + if (!dataQueue.empty()) { std::swap(batch, dataQueue); } diff --git a/source/RobotAPI/libraries/armem_robot_state/server/proprioception/RobotStateWriter.h b/source/RobotAPI/libraries/armem_robot_state/server/proprioception/RobotStateWriter.h index 22a07994e31341c8ebebb6edff872f6eea507f9c..4a4f14672b038132243bdbd5fc5a5617f3f5d668 100644 --- a/source/RobotAPI/libraries/armem_robot_state/server/proprioception/RobotStateWriter.h +++ b/source/RobotAPI/libraries/armem_robot_state/server/proprioception/RobotStateWriter.h @@ -84,7 +84,6 @@ namespace armarx::armem::server::robot_state::proprioception struct Properties { - unsigned int memoryBatchSize = 50; armem::MemoryID robotUnitProviderID; }; Properties properties;