RobotWriter.cpp
Go to the documentation of this file.
1 #include "RobotWriter.h"
2 
3 #include <chrono>
4 #include <mutex>
5 #include <optional>
6 #include <thread>
7 
13 
22 #include <RobotAPI/libraries/armem_robot/aron/Robot.aron.generated.h>
23 #include <RobotAPI/libraries/armem_robot/aron/RobotState.aron.generated.h>
27 #include <RobotAPI/libraries/armem_robot_state/aron/Proprioception.aron.generated.h>
28 #include <RobotAPI/libraries/armem_robot_state/aron/Transform.aron.generated.h>
29 #include <RobotAPI/libraries/armem_robot_state/aron/TransformHeader.aron.generated.h>
31 
32 
33 namespace fs = ::std::filesystem;
34 
36 {
38  properties(r.properties), propertyPrefix(r.propertyPrefix), memoryWriter(r.memoryWriter)
39  {
40  }
41 
42  RobotWriter::~RobotWriter() = default;
43 
44  void
46  {
47  }
48 
49  void
51  {
52  // Wait for the memory to become available and add it as dependency.
53  ARMARX_IMPORTANT << "RobotWriter: Waiting for memory '" << constants::memoryName << "' ...";
54  try
55  {
56  memoryWriter = memoryNameSystem.useWriter(constants::memoryName);
57  ARMARX_IMPORTANT << "RobotWriter: Connected to memory '" << constants::memoryName
58  << "'";
59  }
61  {
62  ARMARX_ERROR << e.what();
63  return;
64  }
65  }
66 
67  bool
69  const armem::Time& timestamp)
70  {
71  const auto validTimestamp = timestamp.isInvalid() ? armarx::Clock::Now() : timestamp;
72 
73  const auto providerId = armem::MemoryID(
75  const auto entityID =
76  providerId.withEntityName(constants::descriptionEntityName).withTimestamp(timestamp);
77 
79  update.entityID = entityID;
80 
81  arondto::RobotDescription aronDescription;
82  toAron(aronDescription, description);
83 
84  update.instancesData = {aronDescription.toAron()};
85  update.referencedTime = timestamp;
86 
87  ARMARX_DEBUG << "Committing " << update << " at time " << timestamp;
89 
90  ARMARX_DEBUG << updateResult;
91 
92  if (not updateResult.success)
93  {
94  ARMARX_ERROR << updateResult.errorMessage;
95  return false;
96  }
97 
98  return true;
99  }
100 
101  bool
103  const std::string& robotName,
104  const std::string& robotRootNodeName,
105  const armem::Time& timestamp)
106  {
107 
108  const auto providerId =
110  const auto entityID = providerId.withEntityName(GlobalFrame + "," + robotRootNodeName)
111  .withTimestamp(timestamp);
112 
114  update.entityID = entityID;
115 
116  arondto::Transform aronTransform;
117 
118  // populate aronTransform
119  {
120  aronTransform.header.agent = robotName;
121  aronTransform.header.frame = robotRootNodeName;
122  aronTransform.header.parentFrame = GlobalFrame;
123  aronTransform.header.timestamp = timestamp;
124 
125  aronTransform.transform = globalRootPose;
126  }
127 
128  update.instancesData = {aronTransform.toAron()};
129  update.referencedTime = timestamp;
130 
131  ARMARX_DEBUG << "Committing " << update << " at time " << timestamp;
133 
134  ARMARX_DEBUG << updateResult;
135 
136  if (not updateResult.success)
137  {
138  ARMARX_ERROR << updateResult.errorMessage;
139  return false;
140  }
141 
142  return true;
143  }
144 
145  bool
146  RobotWriter::storeProprioception(const std::map<std::string, float>& jointMap,
147  const std::string& robotTypeName,
148  const std::string& robotName,
149  const armem::Time& timestamp)
150  {
151 
152  const auto providerId = armem::MemoryID(
154  const auto entityID = providerId.withEntityName(robotName).withTimestamp(timestamp);
155 
157  update.entityID = entityID;
158 
159  arondto::Proprioception aronProprioception;
160  aronProprioception.joints.position = jointMap;
161 
162  update.instancesData = {aronProprioception.toAron()};
163  update.referencedTime = timestamp;
164 
165  ARMARX_DEBUG << "Committing " << update << " at time " << timestamp;
167 
168  ARMARX_DEBUG << updateResult;
169 
170  if (not updateResult.success)
171  {
172  ARMARX_ERROR << updateResult.errorMessage;
173  return false;
174  }
175 
176  return true;
177  }
178 
179  bool
181  const std::string& robotTypeName,
182  const std::string& robotName,
183  const std::string& robotRootNodeName)
184  {
185  const bool successLoc = storeLocalization(
186  state.globalPose.matrix(), robotName, robotRootNodeName, state.timestamp);
187  const bool successProp =
188  storeProprioception(state.jointMap, robotTypeName, robotName, state.timestamp);
189 
190  return successLoc and successProp;
191  }
192 
193 
194 } // namespace armarx::armem::robot_state
armarx::core::time::DateTime::isInvalid
bool isInvalid() const
Definition: DateTime.cpp:140
RobotWriter.h
ARMARX_IMPORTANT
#define ARMARX_IMPORTANT
Definition: Logging.h:183
LocalException.h
armarx::armem::robot_state::RobotWriter
The RobotReader class.
Definition: RobotWriter.h:43
armarx::armem::EntityUpdateResult
Result of an EntityUpdate.
Definition: Commit.h:72
armarx::armem::robot_state::RobotWriter::storeLocalization
bool storeLocalization(const Eigen::Matrix4f &globalRootPose, const std::string &robotName, const std::string &robotRootNodeName, const armem::Time &timestamp)
Definition: RobotWriter.cpp:102
armarx::armem::robot_state::constants::descriptionEntityName
const std::string descriptionEntityName
Definition: constants.h:33
forward_declarations.h
armarx::GlobalFrame
const std::string GlobalFrame
Definition: FramedPose.h:62
armarx::armem::toAron
void toAron(arondto::MemoryID &dto, const MemoryID &bo)
Definition: aron_conversions.cpp:19
armarx::armem::robot_state::constants::memoryName
const std::string memoryName
Definition: constants.h:26
armarx::armem::client::MemoryNameSystem::useWriter
Writer useWriter(const MemoryID &memoryID)
Use a memory server and get a writer for it.
Definition: MemoryNameSystem.cpp:276
constants.h
armarx::armem::robot_state::constants::proprioceptionCoreSegment
const std::string proprioceptionCoreSegment
Definition: constants.h:30
armarx::armem::robot_state
Definition: RobotStatePredictionClient.cpp:42
types.h
armarx::armem::robot_state::constants::robotRootNodeName
const std::string robotRootNodeName
Definition: constants.h:36
armarx::armem::robot_state::RobotWriter::storeDescription
bool storeDescription(const robot::RobotDescription &description, const armem::Time &timestamp=armem::Time::Invalid()) override
Definition: RobotWriter.cpp:68
Clock.h
armarx::armem::client::Writer::commit
CommitResult commit(const Commit &commit)
Writes a Commit to the memory.
Definition: Writer.cpp:51
armarx::armem::robot::RobotState
Definition: types.h:54
armarx::armem::robot::RobotDescription
Definition: types.h:17
armarx::armem::robot_state::RobotWriter::memoryWriter
armem::client::Writer memoryWriter
Definition: RobotWriter.h:83
armarx::armem::robot_state::RobotWriter::storeProprioception
bool storeProprioception(const std::map< std::string, float > &jointMap, const std::string &robotTypeName, const std::string &robotName, const armem::Time &timestamp)
Definition: RobotWriter.cpp:146
armarx::armem::robot_state::RobotWriter::connect
void connect(armem::client::MemoryNameSystem &memoryNameSystem)
Definition: RobotWriter.cpp:50
FramedPose.h
ARMARX_DEBUG
#define ARMARX_DEBUG
Definition: Logging.h:177
error.h
armarx::armem::EntityUpdate
An update of an entity for a specific point in time.
Definition: Commit.h:27
aron_conversions.h
armarx::armem::robot_state::RobotWriter::RobotWriter
RobotWriter()=default
armarx::armem::robot_state::constants::descriptionCoreSegment
const std::string descriptionCoreSegment
Definition: constants.h:28
ARMARX_ERROR
#define ARMARX_ERROR
Definition: Logging.h:189
armarx::armem::robot_state::RobotWriter::~RobotWriter
~RobotWriter() override
aron_conversions.h
armarx::armem::server::ltm::util::mongodb::detail::update
bool update(mongocxx::collection &coll, const nlohmann::json &query, const nlohmann::json &update)
Definition: mongodb.cpp:67
memory_definitions.h
ExpressionException.h
armarx::core::time::DateTime
Represents a point in time.
Definition: DateTime.h:24
armarx::armem::robot::RobotDescription::name
std::string name
Definition: types.h:21
GfxTL::Matrix4f
MatrixXX< 4, 4, float > Matrix4f
Definition: MatrixXX.h:601
armarx::armem::robot_state::constants::localizationCoreSegment
const std::string localizationCoreSegment
Definition: constants.h:29
IceUtil::Handle< class PropertyDefinitionContainer >
types.h
Time.h
Builder.h
armarx::armem::client::MemoryNameSystem
The memory name system (MNS) client.
Definition: MemoryNameSystem.h:69
armarx::armem::error::CouldNotResolveMemoryServer
Indicates that a query to the Memory Name System failed.
Definition: mns.h:26
armarx::core::time::Clock::Now
static DateTime Now()
Current time on the virtual clock.
Definition: Clock.cpp:97
armarx::armem::robot::RobotState::jointMap
JointMap jointMap
Definition: types.h:62
Logging.h
robot_conversions.h
armarx::armem::robot::RobotState::globalPose
Pose globalPose
Definition: types.h:61
armarx::armem::robot_state::RobotWriter::registerPropertyDefinitions
void registerPropertyDefinitions(::armarx::PropertyDefinitionsPtr &def)
Definition: RobotWriter.cpp:45
armarx::armem::robot::RobotState::timestamp
DateTime timestamp
Definition: types.h:59
armarx::armem::robot_state::RobotWriter::storeState
bool storeState(const robot::RobotState &state, const std::string &robotTypeName, const std::string &robotName, const std::string &robotRootNodeName) override
Definition: RobotWriter.cpp:180
PackagePath.h
armarx::human::MemoryID
const armem::MemoryID MemoryID
Definition: memory_ids.cpp:29