SegmentAdapter.cpp
Go to the documentation of this file.
1 /*
2  * This file is part of ArmarX.
3  *
4  * ArmarX is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License version 2 as
6  * published by the Free Software Foundation.
7  *
8  * ArmarX is distributed in the hope that it will be useful, but
9  * WITHOUT ANY WARRANTY; without even the implied warranty of
10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11  * GNU General Public License for more details.
12  *
13  * You should have received a copy of the GNU General Public License
14  * along with this program. If not, see <http://www.gnu.org/licenses/>.
15  *
16  * @package RobotAPI::armem_objects::SegmentAdapter
17  * @author Rainer Kartmann ( rainer dot kartmann at kit dot edu )
18  * @date 2021
19  * @copyright http://www.gnu.org/licenses/gpl-2.0.txt
20  * GNU General Public License
21  */
22 
23 #include "SegmentAdapter.h"
24 
25 #include <SimoxUtility/algorithm/get_map_keys_values.h>
26 #include <VirtualRobot/Robot.h>
27 
34 
39 #include <RobotAPI/libraries/armem_objects/aron/ObjectInstance.aron.generated.h>
42 
44 {
45 
46  SegmentAdapter::SegmentAdapter(MemoryToIceAdapter& iceMemory) : segment(iceMemory)
47  {
48  }
49 
50  std::string
52  {
53  return Logging::tag.tagName;
54  }
55 
56  void
58  {
59  calibration.defineProperties(defs, prefix + "calibration.");
60  segment.defineProperties(defs, prefix);
61  robotHead.defineProperties(defs, prefix + "head.");
62  visu.defineProperties(defs, prefix + "visu.");
63  }
64 
65  void
67  {
68  segment.setTag(getName());
69  segment.decay.setTag(getName());
71  robotHead.setTag(getName());
72  visu.setTag(getName());
73 
74  segment.init();
75  }
76 
77  void
79  KinematicUnitObserverInterfacePrx kinematicUnitObserver,
80  viz::Client arviz,
81  DebugObserverInterfacePrx debugObserver)
82  {
83  this->debugObserver = debugObserver;
84  this->arviz = arviz;
85 
86  segment.robots.reader = virtualRobotReader;
87 
88  robotHead.kinematicUnitObserver = kinematicUnitObserver;
89  robotHead.debugObserver = debugObserver;
90  robotHead.fetchDatafields();
91 
92  visu.arviz = arviz;
93 
94  if (!visu.updateTask)
95  {
96  visu.updateTask = new SimpleRunningTask<>([this]() { this->visualizeRun(); });
97  visu.updateTask->start();
98  }
99 
100  segment.connect(arviz);
101  }
102 
103  void
104  SegmentAdapter::reportProviderAvailable(const std::string& providerName,
105  const objpose::ProviderInfo& info,
106  const Ice::Current&)
107  {
108  ARMARX_IMPORTANT << "Provider `" << providerName << "` is (now) available.";
109  updateProviderInfo(providerName, info);
110  }
111 
112  void
113  SegmentAdapter::reportObjectPoses(const std::string& providerName,
114  const objpose::data::ProvidedObjectPoseSeq& providedPoses,
115  const Ice::Current&)
116  {
117  ARMARX_VERBOSE << "Received " << providedPoses.size() << " object poses from provider '"
118  << providerName << "'.";
119  updateObjectPoses(providerName, providedPoses);
120  }
121 
122  void
123  SegmentAdapter::updateProviderInfo(const std::string& providerName,
124  const objpose::ProviderInfo& info)
125  {
126  if (!info.proxy)
127  {
128  ARMARX_WARNING << "Received availability signal by provider '" << providerName << "' "
129  << "with invalid provider proxy.\nIgnoring provider '" << providerName
130  << "'.";
131  return;
132  }
133  segment.doLocked(
134  [this, &providerName, &info]()
135  {
136  std::stringstream ss;
137  for (const auto& id : info.supportedObjects)
138  {
139  ss << "- " << id << "\n";
140  }
141  ARMARX_VERBOSE << "Provider '" << providerName << "' available.\n"
142  << "Supported objects: \n"
143  << ss.str();
144  segment.providers[providerName] = info;
145  });
146  }
147 
148  void
149  SegmentAdapter::updateObjectPoses(const std::string& providerName,
150  const objpose::data::ProvidedObjectPoseSeq& providedPoses)
151  {
152  TIMING_START(tReportObjectPoses);
153 
154  RobotHeadMovement::Discard discard;
155  {
156  std::scoped_lock lock(robotHeadMutex);
157  discard = robotHead.getDiscard();
158  }
159  if (debugObserver)
160  {
162  map["Discarding All Updates"] = new Variant(discard.all ? 1.f : 0.f);
163  if (discard.all)
164  {
165  map["Proportion Updated Poses"] = new Variant(0.f);
166  }
167  debugObserver->setDebugChannel(getName(), map);
168  }
169 
170  if (discard.all)
171  {
172  return;
173  }
174 
175  segment.doLocked(
176  [&]()
177  {
178  const auto timestamp = armarx::Clock::Now();
179 
180  TIMING_START(tCommitObjectPoses);
181  Segment::CommitStats stats = segment.commitObjectPoses(
182  providerName, providedPoses, calibration, discard.updatesUntil);
183  TIMING_END_STREAM(tCommitObjectPoses, ARMARX_VERBOSE);
184 
185  if (debugObserver)
186  {
187  debugObserver->setDebugChannel(
188  getName(),
189  {{"Discarding All Updates", new Variant(discard.all ? 1 : 0)},
190  {"Proportion Updated Poses",
191  new Variant(static_cast<float>(stats.numUpdated) /
192  providedPoses.size())}});
193  }
194 
195  handleProviderUpdate(providerName);
196 
197  TIMING_END_STREAM(tReportObjectPoses, ARMARX_VERBOSE);
198  if (debugObserver)
199  {
200  debugObserver->setDebugChannel(
201  getName(),
202  {
203  {"t ReportObjectPoses [ms]",
204  new Variant(tReportObjectPoses.toMilliSecondsDouble())},
205  {"t MemorySetObjectPoses [ms]",
206  new Variant(tCommitObjectPoses.toMilliSecondsDouble())},
207  });
208  }
209  });
210  }
211 
212  void
213  SegmentAdapter::handleProviderUpdate(const std::string& providerName)
214  {
215  // Initialized to 0 on first access.
216  if (segment.providers.count(providerName) == 0)
217  {
218  segment.providers[providerName] = objpose::ProviderInfo();
219  }
220  }
221 
223  SegmentAdapter::getObjectPoses(const Ice::Current&)
224  {
225  TIMING_START(tGetObjectPoses);
226 
227  const Time now = Time::Now();
228  const objpose::ObjectPoseSeq objectPoses = segment.doLocked(
229  [this, &now]() { return simox::alg::get_values(segment.getObjectPoses(now)); });
230  const objpose::data::ObjectPoseSeq result = objpose::toIce(objectPoses);
231 
232  TIMING_END_STREAM(tGetObjectPoses, ARMARX_VERBOSE);
233 
234  if (debugObserver)
235  {
236  debugObserver->setDebugChannel(
237  getName(),
238  {
239  {"t GetObjectPoses() [ms]",
240  new Variant(tGetObjectPoses.toMilliSecondsDouble())},
241  });
242  }
243 
244  return result;
245  }
246 
248  SegmentAdapter::getObjectPosesByProvider(const std::string& providerName, const Ice::Current&)
249  {
250  TIMING_START(GetObjectPoses);
251 
252  const Time now = Time::Now();
253  const objpose::ObjectPoseSeq objectPoses = segment.doLocked(
254  [this, &now, &providerName]() {
255  return simox::alg::get_values(segment.getObjectPosesByProvider(providerName, now));
256  });
257  const objpose::data::ObjectPoseSeq result = objpose::toIce(objectPoses);
258 
259  TIMING_END_STREAM(GetObjectPoses, ARMARX_VERBOSE);
260 
261  if (debugObserver)
262  {
263  debugObserver->setDebugChannel(getName(),
264  {
265  {"t GetObjectPosesByProvider() [ms]",
266  new Variant(GetObjectPoses.toMilliSecondsDouble())},
267  });
268  }
269 
270  return result;
271  }
272 
273  objpose::observer::RequestObjectsOutput
274  SegmentAdapter::requestObjects(const objpose::observer::RequestObjectsInput& input,
275  const Ice::Current&)
276  {
277  ARMARX_INFO << "Requesting objects ...";
278 
279  std::map<std::string, objpose::provider::RequestObjectsInput> providerRequests;
280  std::map<std::string, objpose::ObjectPoseProviderPrx> proxies;
281 
282  objpose::observer::RequestObjectsOutput output;
283 
284  auto updateProxy = [&](const std::string& providerName)
285  {
286  if (proxies.count(providerName) == 0)
287  {
288  if (auto it = segment.providers.find(providerName); it != segment.providers.end())
289  {
290  proxies[providerName] = it->second.proxy;
291  }
292  else
293  {
294  ARMARX_ERROR << "No proxy for provider ' " << providerName << "'.";
295  proxies[providerName] = nullptr;
296  }
297  }
298  };
299 
300  if (not input.provider.empty())
301  {
302  providerRequests[input.provider] = input.request;
303  updateProxy(input.provider);
304  }
305  else
306  {
307  segment.doLocked(
308  [&]()
309  {
310  ARMARX_INFO << "Known providers are: "
311  << simox::alg::get_keys(segment.providers);
312 
313  for (const auto& objectID : input.request.objectIDs)
314  {
315  bool found = true;
316  for (const auto& [providerName, info] : segment.providers)
317  {
318  // ToDo: optimize look up.
319  if (std::find(info.supportedObjects.begin(),
320  info.supportedObjects.end(),
321  objectID) != info.supportedObjects.end())
322  {
323  ARMARX_INFO << "Found provider for " << objectID << ": "
324  << providerName;
325  providerRequests[providerName].relativeTimeoutMS =
326  input.request.relativeTimeoutMS;
327  providerRequests[providerName].objectIDs.push_back(objectID);
328  updateProxy(providerName);
329  break;
330  }
331  }
332  if (!found)
333  {
334  ARMARX_ERROR << "Did not find a provider for " << objectID << ".";
335  output.results[objectID].providerName = "";
336  }
337  }
338  });
339  }
340 
341  ARMARX_INFO << VAROUT(simox::alg::get_keys(providerRequests));
342 
343  for (const auto& [providerName, request] : providerRequests)
344  {
345  if (objpose::ObjectPoseProviderPrx proxy = proxies.at(providerName); proxy)
346  {
347  ARMARX_INFO << "Requesting " << request.objectIDs.size() << " objects by provider '"
348  << providerName << "' for " << request.relativeTimeoutMS << " ms.";
349  objpose::provider::RequestObjectsOutput providerOutput =
350  proxy->requestObjects(request);
351 
352  int successful = 0;
353  for (const auto& [objectID, result] : providerOutput.results)
354  {
355  objpose::observer::ObjectRequestResult& res = output.results[objectID];
356  res.providerName = providerName;
357  res.result = result;
358  successful += int(result.success);
359  }
360  ARMARX_INFO << successful << " of " << request.objectIDs.size()
361  << " object requests successful.";
362  }
363  }
364  return output;
365  }
366 
367  objpose::ProviderInfoMap
369  {
370  return segment.doLocked([this]() { return segment.providers; });
371  }
372 
373  Ice::StringSeq
375  {
376  return segment.doLocked([this]() { return simox::alg::get_keys(segment.providers); });
377  }
378 
379  objpose::ProviderInfo
380  SegmentAdapter::getProviderInfo(const std::string& providerName, const Ice::Current&)
381  {
382  return segment.doLocked([this, &providerName]()
383  { return segment.getProviderInfo(providerName); });
384  }
385 
386  bool
387  SegmentAdapter::hasProvider(const std::string& providerName, const Ice::Current&)
388  {
389  return segment.doLocked([this, &providerName]()
390  { return segment.providers.count(providerName) > 0; });
391  }
392 
393  objpose::AttachObjectToRobotNodeOutput
394  SegmentAdapter::attachObjectToRobotNode(const objpose::AttachObjectToRobotNodeInput& input,
395  const Ice::Current&)
396  {
397  return segment.doLocked([this, &input]()
398  { return segment.attachObjectToRobotNode(input); });
399  }
400 
401  objpose::DetachObjectFromRobotNodeOutput
402  SegmentAdapter::detachObjectFromRobotNode(const objpose::DetachObjectFromRobotNodeInput& input,
403  const Ice::Current&)
404  {
405  return segment.doLocked([this, &input]()
406  { return segment.detachObjectFromRobotNode(input); });
407  }
408 
409  objpose::DetachAllObjectsFromRobotNodesOutput
411  const objpose::DetachAllObjectsFromRobotNodesInput& input,
412  const Ice::Current&)
413  {
414  return segment.doLocked([this, &input]()
415  { return segment.detachAllObjectsFromRobotNodes(input); });
416  }
417 
418  objpose::AgentFramesSeq
420  {
421  return segment.doLocked(
422  [this]()
423  {
424  objpose::AgentFramesSeq output;
425  for (const auto& [name, agent] : segment.robots.loaded)
426  {
427  objpose::AgentFrames& frames = output.emplace_back();
428  frames.agent = agent->getName();
429  frames.frames = agent->getRobotNodeNames();
430  }
431  return output;
432  });
433  }
434 
435  objpose::SignalHeadMovementOutput
436  SegmentAdapter::signalHeadMovement(const objpose::SignalHeadMovementInput& input,
437  const Ice::Current&)
438  {
439  std::scoped_lock lock(robotHeadMutex);
440  return robotHead.signalHeadMovement(input);
441  }
442 
443  objpose::ObjectPosePredictionResultSeq
444  SegmentAdapter::predictObjectPoses(const objpose::ObjectPosePredictionRequestSeq& requests,
445  const Ice::Current&)
446  {
447  objpose::ObjectPosePredictionResultSeq results;
448  std::vector<std::map<DateTime, objpose::ObjectPose>> poses;
449  std::vector<objpose::ObjectPose> latestPoses;
450 
451  segment.doLocked(
452  [this, &requests, &results, &poses, &latestPoses]()
453  {
454  for (const auto& request : requests)
455  {
456  auto& result = results.emplace_back();
457  const ObjectID objID = armarx::fromIce(request.objectID);
458 
459  const Duration timeWindow = armarx::fromIce<Duration>(request.timeWindow);
460 
461  const wm::Entity* entity = segment.findObjectEntity(objID);
462  // Use result.success as a marker for whether to continue later
463  result.success = false;
464  poses.emplace_back();
465  latestPoses.emplace_back();
466  if (!entity)
467  {
468  std::stringstream sstream;
469  sstream << "Could not find object with ID " << objID << ".";
470  result.errorMessage = sstream.str();
471  continue;
472  }
473 
474  const auto dto = entity->findLatestInstanceDataAs<arondto::ObjectInstance>();
475  if (!dto)
476  {
477  std::stringstream sstream;
478  sstream << "No snapshots of the object " << objID << " were found."
479  << " Cannot make a prediction.";
480  result.errorMessage = sstream.str();
481  continue;
482  }
483 
484  result.success = true;
485  poses.back() = segment.getObjectPosesInRange(
486  *entity, Time::Now() - timeWindow, Time::Invalid());
487  latestPoses.back() = aron::fromAron<objpose::ObjectPose>(dto.value().pose);
488  }
489  });
490 
491  for (size_t i = 0; i < requests.size(); ++i)
492  {
493  const objpose::ObjectPosePredictionRequest& request = requests.at(i);
494  objpose::ObjectPosePredictionResult& result = results.at(i);
495 
496  if (result.success)
497  {
498  armem::PredictionSettings settings =
499  armem::PredictionSettings::fromIce(request.settings);
500 
501  if (settings.predictionEngineID.empty() or
503  {
505  poses.at(i),
506  armarx::fromIce<DateTime>(request.timestamp),
507  latestPoses.at(i));
508  }
509  else
510  {
511  result.errorMessage = "Prediction engine '" + settings.predictionEngineID +
512  "' not available for object pose prediction.";
513  result.success = false;
514  }
515  }
516  }
517  return results;
518  }
519 
520  armem::prediction::data::PredictionEngineSeq
522  {
523  return armarx::toIce<armem::prediction::data::PredictionEngineSeq>(predictionEngines);
524  }
525 
526  void
527  SegmentAdapter::visualizeRun()
528  {
529  ObjectFinder objectFinder;
530 
531  CycleUtil cycle(static_cast<int>(1000 / visu.frequencyHz));
532  while (visu.updateTask && !visu.updateTask->isStopped())
533  {
534  {
535  std::scoped_lock lock(visuMutex);
536 
537  if (visu.enabled)
538  {
539  TIMING_START(tVisu);
540 
541  objpose::ObjectPoseMap objectPoses;
542  std::map<ObjectID, std::map<DateTime, objpose::ObjectPose>> poseHistories;
543  visu.minConfidence = -1;
544 
545  segment.doLocked(
546  [this, &objectPoses, &poseHistories, &objectFinder]()
547  {
548  const Time now = Time::Now();
549 
550  // Also include decayed objects in result
551  // Store original setting.
552  const float minConf = segment.decay.removeObjectsBelowConfidence;
553  segment.decay.removeObjectsBelowConfidence = -1;
554  // Get result.
555  objectPoses = segment.getObjectPoses(now);
556  // Restore original setting.
557  segment.decay.removeObjectsBelowConfidence = minConf;
558 
559  objectFinder = segment.objectFinder;
560  if (segment.decay.enabled)
561  {
563  }
564 
565  // Get histories.
566  for (const auto& [id, objectPose] : objectPoses)
567  {
568  const wm::Entity* entity = segment.findObjectEntity(id);
569  if (entity != nullptr)
570  {
571  poseHistories[id] = instance::Segment::getObjectPosesInRange(
572  *entity,
575  Time::Invalid());
576  }
577  }
578  });
579 
580  const std::vector<viz::Layer> layers =
581  visu.visualizeCommit(objectPoses, poseHistories, objectFinder);
582  arviz.commit(layers);
583 
584 
586 
587  if (debugObserver)
588  {
589  armarx::StringVariantBaseMap debugValues;
590  debugValues["t Visualize [ms]"] = new Variant(tVisu.toMilliSecondsDouble());
591  for (const auto& [id, pose] : objectPoses)
592  {
593  debugValues["confidence(" + id.str() + ")"] =
594  new Variant(pose.confidence);
595  }
596  debugObserver->setDebugChannel(getName(), debugValues);
597  }
598  }
599  }
600  cycle.waitForCycleDuration();
601  }
602  }
603 
604  const std::string SegmentAdapter::linearPredictionEngineID = "Linear Position Regression";
605  const std::vector<PredictionEngine> SegmentAdapter::predictionEngines{
606  {linearPredictionEngineID}};
607 
608  void
610  {
611  using namespace armarx::RemoteGui::Client;
612 
613  this->visu.setup(adapter.visu);
614  this->segment.setup(adapter.segment);
615  this->decay.setup(adapter.segment.decay);
616  this->robotHead.setup(adapter.robotHead);
617 
618  layout = VBoxLayout{this->visu.group,
619  this->segment.group,
620  this->decay.group,
621  this->robotHead.group,
622  VSpacer()};
623 
624  group = {};
625  group.setLabel("Instance");
627  }
628 
629  void
631  {
632  // Non-atomic variables need to be guarded by a mutex if accessed by multiple threads
633  {
634  std::scoped_lock lock(adapter.visuMutex);
635  this->visu.update(adapter.visu);
636  }
637  this->segment.update(adapter.segment);
638  {
639  adapter.segment.doLocked([this, &adapter]()
640  { this->decay.update(adapter.segment.decay); });
641  }
642  {
643  std::scoped_lock lock(adapter.robotHeadMutex);
644  this->robotHead.update(adapter.robotHead);
645  }
646  }
647 
648 } // namespace armarx::armem::server::obj::instance
armarx::armem::server::obj::instance::Segment::getProviderInfo
objpose::ProviderInfo getProviderInfo(const std::string &providerName)
Definition: Segment.cpp:800
armarx::SimpleRunningTask
Usage:
Definition: TaskUtil.h:85
armarx::Variant
The Variant class is described here: Variants.
Definition: Variant.h:223
RemoteRobot.h
armarx::viz::Client::commit
CommitResult commit(StagedCommit const &commit)
Definition: Client.cpp:89
armarx::armem::server::obj::instance::SegmentAdapter::predictObjectPoses
virtual objpose::ObjectPosePredictionResultSeq predictObjectPoses(const objpose::ObjectPosePredictionRequestSeq &requests, ICE_CURRENT_ARG) override
Definition: SegmentAdapter.cpp:444
ARMARX_VERBOSE
#define ARMARX_VERBOSE
Definition: Logging.h:187
armarx::RemoteGui::Client::ContainerWidget::addChild
void addChild(Widget const &child)
Definition: Widgets.cpp:95
armarx::armem::server::obj::instance::Segment::getObjectPoses
objpose::ObjectPoseMap getObjectPoses(const DateTime &now)
Definition: Segment.cpp:486
TIMING_START
#define TIMING_START(name)
Definition: TimeUtil.h:289
armarx::armem::server::obj::instance::SegmentAdapter::RemoteGui::robotHead
instance::RobotHeadMovement::RemoteGui robotHead
Definition: SegmentAdapter.h:170
armarx::armem::robot_state::VirtualRobotReader
The VirtualRobotReader class.
Definition: VirtualRobotReader.h:39
armarx::armem::server::obj::instance::SegmentAdapter::hasProvider
virtual bool hasProvider(const std::string &providerName, ICE_CURRENT_ARG) override
Definition: SegmentAdapter.cpp:387
ice_conversions.h
armarx::ObjectID
A known object ID of the form "Dataset/ClassName" or "Dataset/ClassName/InstanceName".
Definition: ObjectID.h:10
predictions.h
armarx::armem::server::obj::instance::RobotHeadMovement::getDiscard
Discard getDiscard()
Definition: RobotHeadMovement.cpp:142
armarx::armem::server::obj::instance::Segment::providers
objpose::ProviderInfoMap providers
Definition: Segment.h:181
armarx::StringVariantBaseMap
std::map< std::string, VariantBasePtr > StringVariantBaseMap
Definition: ManagedIceObject.h:110
armarx::armem::server::obj::instance::Segment::detachAllObjectsFromRobotNodes
objpose::DetachAllObjectsFromRobotNodesOutput detachAllObjectsFromRobotNodes(const objpose::DetachAllObjectsFromRobotNodesInput &input)
Definition: Segment.cpp:973
armarx::armem::server::obj::instance::Visu::enabled
bool enabled
Definition: Visu.h:69
ARMARX_IMPORTANT
#define ARMARX_IMPORTANT
Definition: Logging.h:190
armarx::objpose::ObjectPoseSeq
std::vector< ObjectPose > ObjectPoseSeq
Definition: forward_declarations.h:20
armarx::armem::server::obj::instance::SegmentAdapter::getObjectPosesByProvider
virtual objpose::data::ObjectPoseSeq getObjectPosesByProvider(const std::string &providerName, ICE_CURRENT_ARG) override
Definition: SegmentAdapter.cpp:248
armarx::armem::server::obj::instance::Decay::RemoteGui::update
void update(Decay &decay)
Definition: Decay.cpp:130
armarx::LogTag::tagName
std::string tagName
Definition: LoggingUtil.h:75
armarx::armem::server::obj::instance::RobotHeadMovement::RemoteGui::setup
void setup(const RobotHeadMovement &rhm)
Definition: RobotHeadMovement.cpp:167
armarx::armem::server::obj::instance::SegmentAdapter::getAvailableObjectPoseEngines
virtual armem::prediction::data::PredictionEngineSeq getAvailableObjectPoseEngines(ICE_CURRENT_ARG) override
Definition: SegmentAdapter.cpp:521
armarx::armem::server::obj::instance::Visu::RemoteGui::group
armarx::RemoteGui::Client::GroupBox group
Definition: Visu.h:109
armarx::RemoteGui::Client::VBoxLayout
Definition: Widgets.h:167
armarx::armem::server::MemoryToIceAdapter
Helps connecting a Memory server to the Ice interface.
Definition: MemoryToIceAdapter.h:19
armarx::armem::server::obj::instance::SegmentAdapter::RemoteGui::update
void update(SegmentAdapter &adapter)
Definition: SegmentAdapter.cpp:630
armarx::core::time::DateTime::Now
static DateTime Now()
Definition: DateTime.cpp:51
armarx::armem::server::obj::instance::SegmentAdapter::getName
std::string getName() const
Definition: SegmentAdapter.cpp:51
armarx::armem::PredictionSettings
Definition: Prediction.h:40
armarx::armem::server::obj::instance::SegmentAdapter::RemoteGui::decay
instance::Decay::RemoteGui decay
Definition: SegmentAdapter.h:169
armarx::armem::server::obj::instance::SegmentAdapter::init
void init()
Definition: SegmentAdapter.cpp:66
armarx::CycleUtil
This util class helps with keeping a cycle time during a control cycle.
Definition: CycleUtil.h:40
armarx::armem::server::obj::instance::RobotHeadMovement::kinematicUnitObserver
KinematicUnitObserverInterfacePrx kinematicUnitObserver
Definition: RobotHeadMovement.h:59
armarx::armem::server::obj::instance::Segment::objectFinder
ObjectFinder objectFinder
Definition: Segment.h:184
armarx::armem::server::obj::instance::SegmentAdapter::RemoteGui::group
armarx::RemoteGui::Client::GroupBox group
Definition: SegmentAdapter.h:164
armarx::armem::server::obj::instance::RobotHeadMovement::fetchDatafields
void fetchDatafields()
Definition: RobotHeadMovement.cpp:27
armarx::armem::server::obj::instance::Segment::init
void init() override
Definition: Segment.cpp:163
armarx::armem::server::obj::instance::Visu::frequencyHz
float frequencyHz
Definition: Visu.h:70
ice_conversions.h
armarx::armem::server::obj::instance::Decay::removeObjectsBelowConfidence
float removeObjectsBelowConfidence
Definition: Decay.h:42
armarx::armem::server::obj::instance::Segment::RobotsCache::loaded
std::map< std::string, VirtualRobot::RobotPtr > loaded
Definition: Segment.h:172
armarx::armem::server::obj::instance::SegmentAdapter::reportObjectPoses
virtual void reportObjectPoses(const std::string &providerName, const objpose::data::ProvidedObjectPoseSeq &objectPoses, ICE_CURRENT_ARG) override
Definition: SegmentAdapter.cpp:113
aron_conversions.h
armarx::armem::server::wm::Entity
Definition: memory_definitions.h:27
armarx::armem::server::obj::instance::Segment::attachObjectToRobotNode
objpose::AttachObjectToRobotNodeOutput attachObjectToRobotNode(const objpose::AttachObjectToRobotNodeInput &input)
Definition: Segment.cpp:820
armarx::RemoteGui::Client::VSpacer
Definition: Widgets.h:204
armarx::armem::server::obj::instance::SegmentAdapter::attachObjectToRobotNode
virtual objpose::AttachObjectToRobotNodeOutput attachObjectToRobotNode(const objpose::AttachObjectToRobotNodeInput &input, ICE_CURRENT_ARG) override
Definition: SegmentAdapter.cpp:394
TIMING_END_STREAM
#define TIMING_END_STREAM(name, os)
Definition: TimeUtil.h:310
armarx::armem::server::obj::instance::RobotHeadMovement::defineProperties
void defineProperties(armarx::PropertyDefinitionsPtr defs, const std::string &prefix="head.")
Definition: RobotHeadMovement.cpp:11
armarx::armem::server::obj::instance::Visu::linearPredictions
visu::LinearPredictions linearPredictions
Linear predictions for objects.
Definition: Visu.h:103
Clock.h
armarx::armem::server::obj::instance
Definition: ArticulatedObjectVisu.cpp:16
armarx::armem::server::obj::instance::SegmentAdapter::getAvailableProviderNames
virtual Ice::StringSeq getAvailableProviderNames(ICE_CURRENT_ARG) override
Definition: SegmentAdapter.cpp:374
armarx::armem::server::obj::instance::RobotHeadMovement::RemoteGui::group
armarx::RemoteGui::Client::GroupBox group
Definition: RobotHeadMovement.h:67
armarx::armem::server::obj::instance::RobotHeadMovement::RemoteGui::update
void update(RobotHeadMovement &rhm)
Definition: RobotHeadMovement.cpp:200
armarx::armem::server::obj::instance::Segment::connect
void connect(viz::Client arviz)
Definition: Segment.cpp:259
SegmentAdapter.h
armarx::ObjectFinder
Used to find objects in the ArmarX objects repository [1] (formerly [2]).
Definition: ObjectFinder.h:22
armarx::armem::server::obj::instance::SegmentAdapter::RemoteGui::visu
instance::Visu::RemoteGui visu
Definition: SegmentAdapter.h:167
armarx::armem::server::obj::instance::Segment::detachObjectFromRobotNode
objpose::DetachObjectFromRobotNodeOutput detachObjectFromRobotNode(const objpose::DetachObjectFromRobotNodeInput &input)
Definition: Segment.cpp:925
armarx::armem::server::obj::instance::Visu::minConfidence
float minConfidence
Definition: Visu.h:73
armarx::armem::server::obj::instance::Visu::visualizeCommit
std::vector< viz::Layer > visualizeCommit(const std::map< std::string, objpose::ObjectPoseSeq > &objectPoses, const std::map< std::string, std::vector< std::map< DateTime, objpose::ObjectPose >>> &poseHistories, const ObjectFinder &objectFinder) const
Definition: Visu.cpp:64
armarx::armem::server::obj::instance::SegmentAdapter::detachAllObjectsFromRobotNodes
virtual objpose::DetachAllObjectsFromRobotNodesOutput detachAllObjectsFromRobotNodes(const objpose::DetachAllObjectsFromRobotNodesInput &input, ICE_CURRENT_ARG) override
Definition: SegmentAdapter.cpp:410
armarx::armem::server::obj::instance::Visu::defineProperties
void defineProperties(armarx::PropertyDefinitionsPtr defs, const std::string &prefix="visu.")
Definition: Visu.cpp:18
armarx::armem::server::obj::instance::Decay::enabled
bool enabled
Definition: Decay.h:32
armarx::armem::server::obj::instance::SegmentAdapter::getAttachableFrames
virtual objpose::AgentFramesSeq getAttachableFrames(ICE_CURRENT_ARG) override
Definition: SegmentAdapter.cpp:419
armarx::armem::server::obj::instance::Visu::RemoteGui::setup
void setup(const Visu &visu)
Definition: Visu.cpp:318
armarx::armem::server::segment::SpecializedCoreSegment::doLocked
auto doLocked(FunctionT &&function) const
Definition: SpecializedCoreSegment.h:38
armarx::aron::input
ReaderT::InputType & input
Definition: rw.h:12
ObjectID.h
armarx::armem::server::obj::instance::Segment::RemoteGui::group
armarx::RemoteGui::Client::GroupBox group
Definition: Segment.h:221
armarx::armem::server::obj::instance::SegmentAdapter::getAvailableProvidersInfo
virtual objpose::ProviderInfoMap getAvailableProvidersInfo(ICE_CURRENT_ARG) override
Definition: SegmentAdapter.cpp:368
armarx::core::time::Duration::SecondsDouble
static Duration SecondsDouble(double seconds)
Constructs a duration in seconds.
Definition: Duration.cpp:78
armarx::armem::wm::detail::FindInstanceDataMixinForEntity::findLatestInstanceDataAs
std::optional< AronDtoT > findLatestInstanceDataAs(int instanceIndex=0) const
Definition: data_lookup_mixins.h:62
armarx::armem::server::obj::instance::Segment::Calibration::defineProperties
void defineProperties(armarx::PropertyDefinitionsPtr defs, const std::string &prefix="calibration.")
Definition: Segment.cpp:52
ARMARX_ERROR
#define ARMARX_ERROR
Definition: Logging.h:196
armarx::armem::server::obj::instance::Segment::decay
Decay decay
Decay model.
Definition: Segment.h:187
armarx::armem::server::obj::instance::SegmentAdapter::SegmentAdapter
SegmentAdapter(MemoryToIceAdapter &iceMemory)
Definition: SegmentAdapter.cpp:46
armarx::armem::server::obj::instance::visu::LinearPredictions::timeWindowSeconds
float timeWindowSeconds
Definition: LinearPredictionsVisu.h:26
armarx::armem::server::obj::instance::Decay::RemoteGui::setup
void setup(const Decay &decay)
Definition: Decay.cpp:74
armarx::armem::server::obj::instance::Segment::RobotsCache::reader
robot_state::VirtualRobotReader * reader
Definition: Segment.h:169
armarx::armem::server::obj::instance::SegmentAdapter::detachObjectFromRobotNode
virtual objpose::DetachObjectFromRobotNodeOutput detachObjectFromRobotNode(const objpose::DetachObjectFromRobotNodeInput &input, ICE_CURRENT_ARG) override
Definition: SegmentAdapter.cpp:402
armarx::armem::server::obj::instance::Segment::RemoteGui::update
void update(Segment &data)
Definition: Segment.cpp:1367
armarx::armem::server::obj::instance::Visu::arviz
viz::Client arviz
Definition: Visu.h:67
armarx::objpose::ProvidedObjectPoseSeq
std::vector< ProvidedObjectPose > ProvidedObjectPoseSeq
Definition: forward_declarations.h:25
armarx::RemoteGui::Client::GroupBox::setLabel
void setLabel(std::string const &text)
Definition: Widgets.cpp:420
armarx::fromIce
void fromIce(const std::map< IceKeyT, IceValueT > &iceMap, boost::container::flat_map< CppKeyT, CppValueT > &cppMap)
Definition: ice_conversions_boost_templates.h:27
armarx::armem::server::obj::instance::SegmentAdapter::getObjectPoses
virtual objpose::data::ObjectPoseSeq getObjectPoses(ICE_CURRENT_ARG) override
Definition: SegmentAdapter.cpp:223
CycleUtil.h
armarx::armem::PredictionSettings::fromIce
static PredictionSettings fromIce(const armem::prediction::data::PredictionSettings &ice)
Definition: Prediction.cpp:44
armarx::armem::server::obj::instance::Segment::getObjectPosesByProvider
objpose::ObjectPoseMap getObjectPosesByProvider(const std::string &providerName, const DateTime &now)
Definition: Segment.cpp:494
armarx::core::time::DateTime
Represents a point in time.
Definition: DateTime.h:24
armarx::armem::server::obj::instance::SegmentAdapter::RemoteGui::segment
instance::Segment::RemoteGui segment
Definition: SegmentAdapter.h:168
armarx::armem::server::obj::instance::Visu::RemoteGui::update
void update(Visu &visu)
Definition: Visu.cpp:417
armarx::objpose::toIce
objpose::AABB toIce(const simox::AxisAlignedBoundingBox &aabb)
Definition: ice_conversions.cpp:103
armarx::armem::server::obj::instance::SegmentAdapter::getProviderInfo
virtual objpose::ProviderInfo getProviderInfo(const std::string &providerName, ICE_CURRENT_ARG) override
Definition: SegmentAdapter.cpp:380
armarx::armem::server::obj::instance::Segment::commitObjectPoses
CommitStats commitObjectPoses(const std::string &providerName, const objpose::data::ProvidedObjectPoseSeq &providedPoses, const Calibration &calibration, std::optional< Time > discardUpdatesUntil=std::nullopt)
ARMARX_INFO
#define ARMARX_INFO
Definition: Logging.h:181
armarx::armem::server::obj::instance::SegmentAdapter::RemoteGui::setup
void setup(const SegmentAdapter &adapter)
Definition: SegmentAdapter.cpp:609
VAROUT
#define VAROUT(x)
Definition: StringHelpers.h:198
IceUtil::Handle< class PropertyDefinitionContainer >
armarx::armem::server::obj::instance::SegmentAdapter::linearPredictionEngineID
static const std::string linearPredictionEngineID
Definition: SegmentAdapter.h:142
armarx::core::time::Duration
Represents a duration.
Definition: Duration.h:16
IceInternal::ProxyHandle<::IceProxy::armarx::DebugObserverInterface >
armarx::armem::server::obj::instance::Segment::RemoteGui::setup
void setup(const Segment &data)
Definition: Segment.cpp:1307
armarx::Logging::tag
LogTag tag
Definition: Logging.h:278
armarx::armem::server::obj::instance::Decay::RemoteGui::group
armarx::RemoteGui::Client::GroupBox group
Definition: Decay.h:46
armarx::armem::server::obj::instance::SegmentAdapter
Helps implementing the armarx::armem::server::ObjectInstanceSegmentInterface.
Definition: SegmentAdapter.h:50
armarx::armem::server::obj::instance::SegmentAdapter::reportProviderAvailable
virtual void reportProviderAvailable(const std::string &providerName, const objpose::ProviderInfo &info, ICE_CURRENT_ARG) override
Definition: SegmentAdapter.cpp:104
armarx::core::time::Clock::Now
static DateTime Now()
Current time on the virtual clock.
Definition: Clock.cpp:93
armarx::armem::server::obj::instance::SegmentAdapter::signalHeadMovement
virtual objpose::SignalHeadMovementOutput signalHeadMovement(const objpose::SignalHeadMovementInput &input, ICE_CURRENT_ARG) override
Definition: SegmentAdapter.cpp:436
ice_conversions_templates.h
armarx::armem::server::obj::instance::RobotHeadMovement::signalHeadMovement
objpose::SignalHeadMovementOutput signalHeadMovement(const objpose::SignalHeadMovementInput &input)
Definition: RobotHeadMovement.cpp:119
armarx::armem::server::segment::SpecializedCoreSegment::setPredictionEngines
void setPredictionEngines(const std::vector< PredictionEngine > &predictionEngines)
Definition: SpecializedCoreSegment.cpp:86
armarx::Logging::setTag
void setTag(const LogTag &tag)
Definition: Logging.cpp:54
Logging.h
armarx::armem::server::obj::instance::Visu::updateTask
SimpleRunningTask ::pointer_type updateTask
Definition: Visu.h:105
armarx::armem::server::obj::instance::SegmentAdapter::RemoteGui::layout
armarx::RemoteGui::Client::VBoxLayout layout
Definition: SegmentAdapter.h:165
ARMARX_WARNING
#define ARMARX_WARNING
Definition: Logging.h:193
armarx::viz::Client
Definition: Client.h:117
armarx::armem::server::obj::instance::Segment::findObjectEntity
wm::Entity * findObjectEntity(const ObjectID &objectID, const std::string &providerName="")
Definition: Segment.cpp:504
armarx::RemoteGui::Client
Definition: EigenWidgets.cpp:8
armarx::armem::server::obj::instance::Segment::robots
RobotsCache robots
Definition: Segment.h:178
armarx::armem::server::obj::instance::Segment::defineProperties
void defineProperties(armarx::PropertyDefinitionsPtr defs, const std::string &prefix="") override
Definition: Segment.cpp:106
Variant.h
aron_conversions.h
armarx::armem::server::obj::instance::SegmentAdapter::requestObjects
virtual objpose::observer::RequestObjectsOutput requestObjects(const objpose::observer::RequestObjectsInput &input, ICE_CURRENT_ARG) override
Definition: SegmentAdapter.cpp:274
armarx::core::time::DateTime::Invalid
static DateTime Invalid()
Definition: DateTime.cpp:57
armarx::armem::server::obj::instance::SegmentAdapter::predictionEngines
static const std::vector< PredictionEngine > predictionEngines
Definition: SegmentAdapter.h:143
armarx::armem::server::obj::instance::SegmentAdapter::connect
void connect(robot_state::VirtualRobotReader *virtualRobotReader, KinematicUnitObserverInterfacePrx kinematicUnitObserver, viz::Client arviz, DebugObserverInterfacePrx debugObserver)
Definition: SegmentAdapter.cpp:78
armarx::objpose::predictObjectPoseLinear
objpose::ObjectPosePredictionResult predictObjectPoseLinear(const std::map< DateTime, ObjectPose > &poses, const DateTime &time, const ObjectPose &latestPose)
Predict the pose of an object given a history of poses based on a linear regression.
Definition: predictions.cpp:37
armarx::armem::server::obj::instance::RobotHeadMovement::debugObserver
DebugObserverInterfacePrx debugObserver
Definition: RobotHeadMovement.h:63
armarx::ObjectID::str
std::string str() const
Return "dataset/className" or "dataset/className/instanceName".
Definition: ObjectID.cpp:60
armarx::armem::server::obj::instance::SegmentAdapter::defineProperties
void defineProperties(armarx::PropertyDefinitionsPtr defs, const std::string &prefix="")
Definition: SegmentAdapter.cpp:57
armarx::armem::PredictionSettings::predictionEngineID
std::string predictionEngineID
Definition: Prediction.h:42
armarx::armem::server::obj::instance::Segment::getObjectPosesInRange
static std::map< DateTime, ObjectPose > getObjectPosesInRange(const wm::Entity &entity, const DateTime &start, const DateTime &end)
Definition: Segment.cpp:766
armarx::objpose::ObjectPoseMap
std::map< ObjectID, ObjectPose > ObjectPoseMap
Definition: forward_declarations.h:21