22 #include <RobotAPI/libraries/armem_robot_state/aron/Exteroception.aron.generated.h>
23 #include <RobotAPI/libraries/armem_robot_state/aron/Proprioception.aron.generated.h>
24 #include <RobotAPI/libraries/armem_robot_state/aron/Robot.aron.generated.h>
30 namespace fs = ::std::filesystem;
35 properties(r.properties),
36 propertyPrefix(r.propertyPrefix),
37 memoryReader(r.memoryReader),
38 transformReader(r.transformReader)
51 transformReader.
connect(memoryNameSystem);
81 return get(*description, timestamp);
91 .timestamp = timestamp};
132 ARMARX_INFO <<
"Retrying to query robot state after failure";
136 robot.
config = std::move(*state);
141 std::optional<description::RobotDescription>
160 if (not memoryReader)
162 ARMARX_WARNING <<
"Memory reader is null. Did you forget to call "
163 "RobotReader::connect() in onConnectComponent()?";
169 std::scoped_lock l(memoryReaderMutex);
174 if (not qResult.success)
179 return getRobotDescription(qResult.memory, name);
189 std::optional<RobotState>
192 std::optional<RobotState> robotState =
queryJointState(robotName, timestamp);
199 ARMARX_VERBOSE <<
"Failed to query global pose for robot " << robotName;
202 robotState->globalPose = *globalPose;
208 std::optional<RobotState>
213 if (not proprioception.has_value())
215 ARMARX_VERBOSE <<
"Failed to query proprioception for robot '" << robotName <<
"'.";
218 const auto jointMap = proprioception->joints.position;
222 .jointMap = jointMap,
223 .proprioception = proprioception};
226 std::optional<::armarx::armem::robot_state::localization::Transform>
234 .timestamp = timestamp}};
252 std::optional<armarx::armem::arondto::Proprioception>
261 ARMARX_DEBUG <<
"Querying robot description for robot: " << robotName;
273 std::scoped_lock l(memoryReaderMutex);
278 if (not qResult.success)
284 return getRobotProprioception(qResult.memory, robotName);
301 ARMARX_DEBUG <<
"Querying robot joint states for robot: `" << robotName
302 <<
"` on time interval [" << begin <<
"," << end <<
"]";
314 std::scoped_lock l(memoryReaderMutex);
319 if (not qResult.success)
325 return getRobotJointStates(qResult.memory, robotName);
335 std::optional<PlatformState>
344 ARMARX_DEBUG <<
"Querying robot description for robot: " << robotName;
356 std::scoped_lock l(memoryReaderMutex);
361 if (not qResult.success)
367 return getRobotPlatformState(qResult.memory, robotName);
377 std::optional<RobotState::Pose>
399 std::optional<RobotState>
401 const std::string& name)
const
406 .getProviderSegment(name);
410 if (providerSegment.
empty())
426 if (instance ==
nullptr)
437 template <
typename AronClass>
438 std::optional<AronClass>
446 return AronClass::FromAron(item.
data());
454 std::optional<armarx::armem::arondto::Proprioception>
456 const std::string& name)
const
463 std::optional<armarx::armem::arondto::Proprioception> proprioception;
475 proprioception = tryCast<::armarx::armem::arondto::Proprioception>(entityInstance);
478 return proprioception;
483 const std::string& name)
const
489 const armem::wm::CoreSegment& coreSegment = memory
493 coreSegment.forEachEntity(
494 [&jointTrajectory](
const wm::Entity& entity)
496 entity.forEachSnapshot(
497 [&](
const auto& snapshot)
499 if (not snapshot.hasInstance(0))
504 const auto& entityInstance = snapshot.getInstance(0);
506 const auto proprioception =
507 tryCast<::armarx::armem::arondto::Proprioception>(entityInstance);
512 jointTrajectory.emplace(entityInstance.id().timestamp, joints.position);
516 ARMARX_INFO <<
"Joint trajectory with " << jointTrajectory.size() <<
" elements";
518 return jointTrajectory;
522 std::optional<std::map<RobotReader::Hand, proprioception::ForceTorque>>
529 ARMARX_DEBUG <<
"Querying force torques description for robot: " << robotName;
541 std::scoped_lock l(memoryReaderMutex);
546 if (not qResult.success)
552 return getForceTorque(qResult.memory, robotName);
563 std::optional<std::map<RobotReader::Hand, std::map<armem::Time, proprioception::ForceTorque>>>
572 ARMARX_DEBUG <<
"Querying force torques description for robot: " << robotName;
584 std::scoped_lock l(memoryReaderMutex);
589 if (not qResult.success)
595 return getForceTorques(qResult.memory, robotName);
605 std::optional<std::map<RobotReader::Hand, exteroception::ToF>>
611 ARMARX_DEBUG <<
"Querying ToF data for robot: " << robotName;
623 std::scoped_lock l(memoryReaderMutex);
628 if (not qResult.success)
634 return getToF(qResult.memory, robotName);
644 std::optional<PlatformState>
646 const std::string& name)
const
648 std::optional<PlatformState> platformState;
665 const auto proprioception =
666 tryCast<::armarx::armem::arondto::Proprioception>(entityInstance);
670 fromAron(proprioception->platform, platformState.value());
673 return platformState;
689 throw LocalException(
"Unknown hand name `" + name +
"`!");
692 std::map<RobotReader::Hand, proprioception::ForceTorque>
694 const std::string& name)
const
696 std::map<RobotReader::Hand, proprioception::ForceTorque> forceTorques;
713 const auto proprioception =
714 tryCast<::armarx::armem::arondto::Proprioception>(entityInstance);
717 for (
const auto& [handName, dtoFt] : proprioception->forceTorque)
719 proprioception::ForceTorque forceTorque;
720 fromAron(dtoFt, forceTorque);
722 const auto hand = fromHandName(handName);
723 forceTorques.emplace(hand, forceTorque);
730 std::map<RobotReader::Hand, std::map<armem::Time, proprioception::ForceTorque>>
732 const std::string& name)
const
734 std::map<RobotReader::Hand, std::map<armem::Time, proprioception::ForceTorque>>
738 const armem::wm::CoreSegment& coreSegment = memory
742 coreSegment.forEachInstance(
745 const auto proprioception =
746 tryCast<::armarx::armem::arondto::Proprioception>(entityInstance);
750 for (
const auto& [handName, dtoFt] : proprioception->forceTorque)
752 proprioception::ForceTorque forceTorque;
756 forceTorques[hand].emplace(entityInstance.id().timestamp, forceTorque);
763 std::map<RobotReader::Hand, exteroception::ToF>
766 std::map<RobotReader::Hand, exteroception::ToF> tofs;
769 const armem::wm::CoreSegment& coreSegment = memory
773 coreSegment.forEachEntity(
774 [&tofs](
const wm::Entity& entity)
778 if (not entity.getLatestSnapshot().hasInstance(0))
782 const auto& entityInstance = entity.getLatestSnapshot().getInstance(0);
784 const auto exteroception =
785 tryCast<::armarx::armem::arondto::Exteroception>(entityInstance);
789 for (
const auto& [handName, dtoFt] : exteroception->tof)
791 ARMARX_DEBUG <<
"Processing ToF element for hand `" << handName <<
"`";
793 exteroception::ToF tof;
794 fromAron(dtoFt, tof);
796 const auto hand = fromHandName(handName);
797 tofs.emplace(hand, tof);
804 std::optional<description::RobotDescription>
806 const std::string& name)
const
809 const armem::wm::ProviderSegment& providerSegment = memory
811 .getProviderSegment(name);
817 if (instance ==
nullptr)
819 ARMARX_VERBOSE <<
"No entity snapshots found in provider segment `" << name <<
"`";
826 std::vector<description::RobotDescription>
829 const armem::wm::CoreSegment& coreSegment =
832 std::vector<description::RobotDescription> descriptions;
834 coreSegment.forEachInstance(
837 if (
const std::optional<description::RobotDescription> desc =
840 descriptions.push_back(desc.value());
847 std::vector<description::RobotDescription>
865 if (not memoryReader)
867 ARMARX_WARNING <<
"Memory reader is null. Did you forget to call "
868 "RobotReader::connect() in onConnectComponent()?";
874 std::scoped_lock l(memoryReaderMutex);
879 if (not qResult.success)
884 return getRobotDescriptions(qResult.memory);