From e1dae5738d60ee185c20b0c03c55c3823f0997c4 Mon Sep 17 00:00:00 2001 From: Meixner <andre.meixner@kit.edu> Date: Tue, 13 Feb 2024 11:28:20 +0100 Subject: [PATCH] Added synchronize robot joints to robot reader to be independent of localization --- .../client/common/RobotReader.cpp | 29 ++++++++++++++----- .../client/common/RobotReader.h | 3 ++ .../client/common/VirtualRobotReader.cpp | 24 +++++++++++++++ .../client/common/VirtualRobotReader.h | 3 ++ 4 files changed, 51 insertions(+), 8 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 8f7c057e4..f3b4731b0 100644 --- a/source/RobotAPI/libraries/armem_robot_state/client/common/RobotReader.cpp +++ b/source/RobotAPI/libraries/armem_robot_state/client/common/RobotReader.cpp @@ -185,6 +185,26 @@ namespace armarx::armem::robot_state std::optional<robot::RobotState> RobotReader::queryState(const robot::RobotDescription& description, const armem::Time& timestamp) const + { + std::optional<robot::RobotState> robotState = queryJointState(description, timestamp); + + if (robotState) + { + const auto globalPose = queryGlobalPose(description, timestamp); + if (not globalPose) + { + ARMARX_VERBOSE << "Failed to query global pose for robot " << description.name; + return std::nullopt; + } + robotState->globalPose = *globalPose; + } + + return robotState; + } + + std::optional<robot::RobotState> + RobotReader::queryJointState(const robot::RobotDescription& description, + const armem::Time& timestamp) const { const auto proprioception = queryProprioception(description, timestamp); @@ -196,15 +216,8 @@ namespace armarx::armem::robot_state } const auto jointMap = proprioception->joints.position; - const auto globalPose = queryGlobalPose(description, timestamp); - if (not globalPose) - { - ARMARX_VERBOSE << "Failed to query global pose for robot " << description.name; - return std::nullopt; - } - return robot::RobotState{.timestamp = timestamp, - .globalPose = *globalPose, + .globalPose = robot::RobotState::Pose::Identity(), .jointMap = jointMap, .proprioception = proprioception}; } 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 8397ea9a8..e3ff03089 100644 --- a/source/RobotAPI/libraries/armem_robot_state/client/common/RobotReader.h +++ b/source/RobotAPI/libraries/armem_robot_state/client/common/RobotReader.h @@ -67,6 +67,9 @@ namespace armarx::armem::robot_state std::optional<robot::RobotState> queryState(const robot::RobotDescription& description, const armem::Time& timestamp) const; + std::optional<robot::RobotState> queryJointState(const robot::RobotDescription& description, + const armem::Time& timestamp) const; + std::optional<armarx::armem::arondto::Proprioception> queryProprioception(const robot::RobotDescription& description, const armem::Time& timestamp) const; 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 0effa5c23..e23178dfa 100644 --- a/source/RobotAPI/libraries/armem_robot_state/client/common/VirtualRobotReader.cpp +++ b/source/RobotAPI/libraries/armem_robot_state/client/common/VirtualRobotReader.cpp @@ -47,6 +47,30 @@ namespace armarx::armem::robot_state return true; } + bool + VirtualRobotReader::synchronizeRobotJoints(VirtualRobot::Robot& robot, + const armem::Time& timestamp) const + { + // const static auto packages = armarx::CMakePackageFinder::FindAllArmarXSourcePackages(); + // const auto package = armarx::ArmarXDataPath::getProject(packages, robot.getFilename()); + + const robot::RobotDescription robotDescription{.name = robot.getName(), + .xml = PackagePath{"", ""}}; + + const auto robotState = queryJointState(robotDescription, timestamp); + if (not robotState) + { + ARMARX_VERBOSE << deactivateSpam(5) << "Querying robot state failed for robot `" + << robot.getName() << "` " + << "(type `" << robot.getType() << "`)!"; + return false; + } + + robot.setJointValues(robotState->jointMap); + + return true; + } + VirtualRobot::RobotPtr VirtualRobotReader::getRobot(const std::string& name, const armem::Time& timestamp, diff --git a/source/RobotAPI/libraries/armem_robot_state/client/common/VirtualRobotReader.h b/source/RobotAPI/libraries/armem_robot_state/client/common/VirtualRobotReader.h index 1d91f0582..d0a672c21 100644 --- a/source/RobotAPI/libraries/armem_robot_state/client/common/VirtualRobotReader.h +++ b/source/RobotAPI/libraries/armem_robot_state/client/common/VirtualRobotReader.h @@ -49,6 +49,9 @@ namespace armarx::armem::robot_state [[nodiscard]] bool synchronizeRobot(VirtualRobot::Robot& robot, const armem::Time& timestamp) const; + [[nodiscard]] bool synchronizeRobotJoints(VirtualRobot::Robot& robot, + const armem::Time& timestamp) const; + [[nodiscard]] VirtualRobot::RobotPtr getRobot(const std::string& name, const armem::Time& timestamp = armem::Time::Invalid(), -- GitLab