From 5819cddb9efacce754e76010d25dcef6effa651e Mon Sep 17 00:00:00 2001 From: Fabian Reister <fabian.reister@kit.edu> Date: Wed, 27 Oct 2021 18:01:06 +0200 Subject: [PATCH] armem_robot_state: fixing getRobotJointStates --- .../client/common/RobotReader.cpp | 72 +++++++++++++++++++ .../client/common/RobotReader.h | 10 +++ .../proprioception/RobotStateWriter.cpp | 2 +- .../server/proprioception/RobotStateWriter.h | 1 - 4 files changed, 83 insertions(+), 2 deletions(-) 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 5a5c279ad..2264ce364 100644 --- a/source/RobotAPI/libraries/armem_robot_state/client/common/RobotReader.cpp +++ b/source/RobotAPI/libraries/armem_robot_state/client/common/RobotReader.cpp @@ -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"; @@ -348,6 +380,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 = entity.getLatestSnapshot().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>> 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 884c85fd9..20cafbd22 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 c2ed636a9..9b35f938d 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 10c5a8b9e..1f66d5a70 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; -- GitLab