VirtualRobotReader.cpp
Go to the documentation of this file.
1 #include "VirtualRobotReader.h"
2 
3 #include <optional>
4 #include <thread>
5 
6 #include <VirtualRobot/Robot.h>
7 #include <VirtualRobot/VirtualRobot.h>
8 #include <VirtualRobot/XML/RobotIO.h>
9 
15 
17 {
18  // TODO(fabian.reister): register property defs
19  void
21  {
23  }
24 
25  bool
27  const armem::Time& timestamp) const
28  {
29  // const static auto packages = armarx::CMakePackageFinder::FindAllArmarXSourcePackages();
30  // const auto package = armarx::ArmarXDataPath::getProject(packages, robot.getFilename());
31 
32  const robot::RobotDescription robotDescription{.name = robot.getName(),
33  .xml = PackagePath{"", ""}};
34 
35  const auto robotState = queryState(robotDescription, timestamp);
36  if (not robotState)
37  {
38  ARMARX_VERBOSE << deactivateSpam(5) << "Querying robot state failed for robot `"
39  << robot.getName() << "` "
40  << "(type `" << robot.getType() << "`)!";
41  return false;
42  }
43 
44  robot.setJointValues(robotState->jointMap);
45  robot.setGlobalPose(robotState->globalPose.matrix());
46 
47  return true;
48  }
49 
51  VirtualRobotReader::getRobot(const std::string& name,
52  const armem::Time& timestamp,
53  const VirtualRobot::RobotIO::RobotDescription& loadMode)
54  {
55  ARMARX_VERBOSE << deactivateSpam(60) << "Querying robot description for robot '" << name
56  << "'";
57  const auto description = queryDescription(name, timestamp);
58 
59  if (not description)
60  {
61  ARMARX_VERBOSE << deactivateSpam(5) << "The description of robot `" << name
62  << "` is not a available!";
63 
64  return nullptr;
65  }
66 
67  const std::string xmlFilename = description->xml.toSystemPath();
68  ARMARX_CHECK(std::filesystem::exists(xmlFilename)) << xmlFilename;
69 
70  ARMARX_VERBOSE << deactivateSpam(5) << "Loading (virtual) robot '" << description->name
71  << "' from XML file '" << xmlFilename << "'";
72 
73  auto robot = VirtualRobot::RobotIO::loadRobot(xmlFilename, loadMode);
74  ARMARX_CHECK_NOT_NULL(robot) << "Could not load robot from file `" << xmlFilename << "`";
75 
76  robot->setName(name);
77 
78  return robot;
79  }
80 
82  VirtualRobotReader::getSynchronizedRobot(const std::string& name,
83  const VirtualRobot::BaseIO::RobotDescription& loadMode,
84  bool blocking)
85  {
86  return _getSynchronizedRobot(name, armem::Time::Invalid(), loadMode, blocking);
87  }
88 
91  const std::string& name,
92  const armem::Time& timestamp,
93  const VirtualRobot::RobotIO::RobotDescription& loadMode,
94  const bool blocking)
95  {
96  return _getSynchronizedRobot(name, timestamp, loadMode, blocking);
97  }
98 
100  VirtualRobotReader::_getSynchronizedRobot(
101  const std::string& name,
102  const Time& timestamp,
103  const VirtualRobot::BaseIO::RobotDescription& loadMode,
104  bool blocking)
105  {
106  while (blocking)
107  {
108  const auto ts = timestamp.isInvalid() ? armarx::Clock::Now() : timestamp;
109 
110  VirtualRobot::RobotPtr robot = getRobot(name, ts, loadMode);
111  if (robot and synchronizeRobot(*robot, ts))
112  {
113  return robot;
114  }
115 
116  ARMARX_VERBOSE << deactivateSpam(5) << "Retrying to query robot after failure";
118  }
119 
120  ARMARX_VERBOSE << deactivateSpam(5) << "Failed to get synchronized robot `" << name << "`";
121  return nullptr;
122  }
123 
124  std::optional<std::map<RobotReader::Hand, robot::ForceTorque>>
125  VirtualRobotReader::queryForceTorque(const std::string& name, const Time& timestamp)
126  {
127  const auto description = queryDescription(name, timestamp);
128  if (not description.has_value())
129  {
130  return std::nullopt;
131  }
132  return RobotReader::queryForceTorque(description.value(), timestamp);
133  }
134 
135 
136 } // namespace armarx::armem::robot_state
armarx::armem::robot_state::RobotReader::queryForceTorque
std::optional< std::map< Hand, robot::ForceTorque > > queryForceTorque(const robot::RobotDescription &description, const armem::Time &timestamp) const
Definition: RobotReader.cpp:511
ARMARX_VERBOSE
#define ARMARX_VERBOSE
Definition: Logging.h:180
armarx::armem::robot_state::VirtualRobotReader::queryForceTorque
std::optional< std::map< RobotReader::Hand, robot::ForceTorque > > queryForceTorque(const std::string &name, const armem::Time &timestamp)
Definition: VirtualRobotReader.cpp:125
armarx::core::time::DateTime::isInvalid
bool isInvalid() const
Definition: DateTime.cpp:140
armarx::armem::robot_state::VirtualRobotReader::getRobot
VirtualRobot::RobotPtr getRobot(const std::string &name, const armem::Time &timestamp=armem::Time::Invalid(), const VirtualRobot::RobotIO::RobotDescription &loadMode=VirtualRobot::RobotIO::RobotDescription::eStructure)
Definition: VirtualRobotReader.cpp:51
armarx::core::time::Clock::WaitFor
static void WaitFor(const Duration &duration)
Wait for a certain duration on the virtual clock.
Definition: Clock.cpp:104
ARMARX_CHECK_NOT_NULL
#define ARMARX_CHECK_NOT_NULL(ptr)
This macro evaluates whether ptr is not null and if it turns out to be false it will throw an Express...
Definition: ExpressionException.h:206
armarx::armem::robot_state::RobotReader::registerPropertyDefinitions
virtual void registerPropertyDefinitions(::armarx::PropertyDefinitionsPtr &def)
Definition: RobotReader.cpp:43
armarx::armem::robot_state::RobotReader::queryDescription
std::optional< robot::RobotDescription > queryDescription(const std::string &name, const armem::Time &timestamp) const
Definition: RobotReader.cpp:138
armarx::armem::robot_state::VirtualRobotReader::registerPropertyDefinitions
void registerPropertyDefinitions(::armarx::PropertyDefinitionsPtr &def) override
Definition: VirtualRobotReader.cpp:20
armarx::armem::robot_state
Definition: RobotStatePredictionClient.cpp:42
armarx::armem::robot_state::VirtualRobotReader::synchronizeRobot
bool synchronizeRobot(VirtualRobot::Robot &robot, const armem::Time &timestamp) const
Definition: VirtualRobotReader.cpp:26
ARMARX_CHECK
#define ARMARX_CHECK(expression)
Shortcut for ARMARX_CHECK_EXPRESSION.
Definition: ExpressionException.h:82
Clock.h
armarx::armem::robot::RobotDescription
Definition: types.h:17
deactivateSpam
SpamFilterDataPtr deactivateSpam(SpamFilterDataPtr const &spamFilter, float deactivationDurationSec, const std::string &identifier, bool deactivate)
Definition: Logging.cpp:72
armarx::armem::human::Robot
@ Robot
Definition: util.h:14
VirtualRobotReader.h
armarx::armem::robot_state::VirtualRobotReader::getSynchronizedRobot
VirtualRobot::RobotPtr getSynchronizedRobot(const std::string &name, const VirtualRobot::RobotIO::RobotDescription &loadMode=VirtualRobot::RobotIO::RobotDescription::eStructure, bool blocking=true)
armarx::core::time::DateTime
Represents a point in time.
Definition: DateTime.h:24
CMakePackageFinder.h
armarx::armem::robot::RobotDescription::name
std::string name
Definition: types.h:21
IceUtil::Handle< class PropertyDefinitionContainer >
armarx::core::time::Clock::Now
static DateTime Now()
Current time on the virtual clock.
Definition: Clock.cpp:97
armarx::armem::robot_state::RobotReader::queryState
std::optional< robot::RobotState > queryState(const robot::RobotDescription &description, const armem::Time &timestamp) const
Definition: RobotReader.cpp:186
Logging.h
ArmarXDataPath.h
armarx::PackagePath
Definition: PackagePath.h:55
armarx::armem::robot_state::RobotReader::sleepAfterFailure
armem::Duration sleepAfterFailure
Definition: RobotReader.h:126
armarx::core::time::DateTime::Invalid
static DateTime Invalid()
Definition: DateTime.cpp:60
VirtualRobot::RobotPtr
std::shared_ptr< class Robot > RobotPtr
Definition: Bus.h:18
PackagePath.h