Visu.cpp
Go to the documentation of this file.
1#include "Visu.h"
2
3#include <math.h>
4
5#include <cstddef>
6#include <map>
7#include <optional>
8#include <string>
9#include <vector>
10
11#include <range/v3/algorithm/contains.hpp>
12#include <range/v3/view/map.hpp>
13
14#include <SimoxUtility/algorithm/get_map_keys_values.h>
15#include <SimoxUtility/color/Color.h>
16#include <SimoxUtility/math/pose.h>
17#include <SimoxUtility/math/rescale.h>
18#include <SimoxUtility/shapes/OrientedBox.h>
19
28
30
43
45{
46
47 void
49 {
50 defs->optional(enabled, prefix + "enabled", "Enable or disable visualization of objects.");
51 defs->optional(minConfidence,
52 prefix + "minConfidence",
53 "Min confidence to visualize objects. If decay is enabled, "
54 "`decay.minConfidence` will be used instead.");
55 defs->optional(colModelsEnabled,
56 prefix + "colModelsEnabled",
57 "Enable or disable visualization of collision models of objects.");
58 defs->optional(frequencyHz, prefix + "frequenzyHz", "Frequency of visualization.");
59 defs->optional(inGlobalFrame,
60 prefix + "inGlobalFrame",
61 "If true, show global poses. If false, show poses in robot frame.");
62 defs->optional(alpha, prefix + "alpha", "Alpha of objects (1 = solid, 0 = transparent).");
63 defs->optional(alphaByConfidence,
64 prefix + "alphaByConfidence",
65 "If true, use the pose confidence as alpha (if < 1.0).");
66 defs->optional(oobbs, prefix + "oobbs", "Enable showing oriented bounding boxes.");
67
68 defs->optional(objectFrames, prefix + "objectFrames", "Enable showing object frames.");
69 defs->optional(
70 objectFramesScale, prefix + "objectFramesScale", "Scaling of object frames.");
71
72 gaussians.defineProperties(defs, prefix + "gaussians.");
73
74 defs->optional(useArticulatedModels,
75 prefix + "useArticulatedModels",
76 "Prefer articulated object models if available.");
77
78 linearPredictions.defineProperties(defs, prefix + "predictions.linear.");
79 }
80
81 void
83 {
84 defs->optional(
85 position, prefix + "position", "Enable showing pose gaussians (position part).");
86 defs->optional(
87 positionScale, prefix + "positionScale", "Scaling of pose gaussians (position part).");
88
89 defs->optional(
90 orientation, prefix + "position", "Enable showing pose gaussians (orientation part).");
91 defs->optional(orientationScale,
92 prefix + "positionScale",
93 "Scaling of pose gaussians (orientation part).");
94 defs->optional(
96 prefix + "positionDisplaced",
97 "Displace center orientation (co)variance circle arrows along their rotation axis.");
98 }
99
100 std::vector<viz::Layer>
102 const std::map<std::string, objpose::ObjectPoseSeq>& objectPoses,
103 const std::map<std::string, std::vector<std::map<DateTime, objpose::ObjectPose>>>&
104 poseHistories,
105 const ObjectFinder& objectFinder) const
106 {
107 std::vector<viz::Layer> layers;
108 for (const auto& [name, poses] : objectPoses)
109 {
110 if (name.empty())
111 {
112 continue;
113 }
114
115 auto poseHistoryMap = poseHistories.find(name);
116 if (poseHistoryMap != poseHistories.end())
117 {
118 layers.push_back(
119 visualizeProvider(name, poses, poseHistoryMap->second, objectFinder));
120 }
121 else
122 {
123 layers.push_back(visualizeProvider(name, poses, {}, objectFinder));
124 }
125 }
126 return layers;
127 }
128
129 std::vector<viz::Layer>
131 const std::vector<std::map<DateTime, objpose::ObjectPose>>& poseHistories,
132 const ObjectFinder& objectFinder) const
133 {
134 std::map<std::string, viz::Layer> stage;
135 for (size_t i = 0; i < objectPoses.size(); ++i)
136 {
137 const std::string providerName = objectPoses.at(i).providerName;
138 if (providerName.empty())
139 {
140 ARMARX_INFO << "Object pose provider not set!";
141 continue;
142 }
143
144 visualizeObjectPose(getLayer(providerName, stage),
145 objectPoses.at(i),
146 poseHistories.at(i),
147 objectFinder,
148 false);
149
151 {
152 visualizeObjectPose(getLayer(providerName + "_col", stage),
153 objectPoses.at(i),
154 poseHistories.at(i),
155 objectFinder,
156 true);
157 }
158 }
159 return simox::alg::get_values(stage);
160 }
161
162 std::vector<viz::Layer>
164 const objpose::ObjectPoseMap& objectPoses,
165 const std::map<ObjectID, std::map<DateTime, objpose::ObjectPose>>& poseHistories,
166 const ObjectFinder& objectFinder) const
167 {
168 std::map<std::string, viz::Layer> stage;
169 for (const auto& [id, pose] : objectPoses)
170 {
171 if (pose.providerName.empty())
172 {
173 ARMARX_WARNING << "The object " << QUOTED(id)
174 << " does not have a `providerName` set";
175 continue;
176 }
177
178 auto poseHistoryMap = poseHistories.find(id);
179 if (poseHistoryMap != poseHistories.end())
180 {
181 visualizeObjectPose(getLayer(pose.providerName, stage),
182 pose,
183 poseHistoryMap->second,
184 objectFinder,
185 false);
186 }
187 else
188 {
190 getLayer(pose.providerName, stage), pose, {}, objectFinder, false);
191 }
192
193 // visualize collision models
195 {
196 if (poseHistoryMap != poseHistories.end())
197 {
198 visualizeObjectPose(getLayer(pose.providerName + "_col", stage),
199 pose,
200 poseHistoryMap->second,
201 objectFinder,
202 true);
203 }
204 else
205 {
207 getLayer(pose.providerName + "_col", stage), pose, {}, objectFinder, true);
208 }
209 }
210 }
211 return simox::alg::get_values(stage);
212 }
213
215 Visu::getLayer(const std::string& providerName, std::map<std::string, viz::Layer>& stage) const
216 {
217 ARMARX_CHECK_NOT_EMPTY(providerName)
218 << "`providerName` used as layer name: must not be empty";
219 auto it = stage.find(providerName);
220 if (it == stage.end())
221 {
222 it = stage.emplace(providerName, arviz.layer(providerName)).first;
223 }
224 return it->second;
225 }
226
229 const std::string& providerName,
230 const objpose::ObjectPoseSeq& objectPoses,
231 const std::vector<std::map<DateTime, objpose::ObjectPose>>& poseHistories,
232 const ObjectFinder& objectFinder) const
233 {
234 viz::Layer layer = arviz.layer(providerName);
235 for (size_t i = 0; i < poseHistories.size(); ++i)
236 {
237 visualizeObjectPose(layer, objectPoses.at(i), poseHistories.at(i), objectFinder, false);
238
240 {
242 layer, objectPoses.at(i), poseHistories.at(i), objectFinder, true);
243 }
244 }
245 return layer;
246 }
247
248 void
250 const objpose::ObjectPose& objectPose,
251 const std::map<DateTime, objpose::ObjectPose>& poseHistory,
252 const ObjectFinder& objectFinder,
253 const bool useColModel) const
254 {
255 const bool show = objectPose.confidence >= minConfidence;
256 if (not show)
257 {
258 return;
259 }
260 const armarx::ObjectID id = objectPose.objectID;
261 const std::string key = id.str();
262
263 const Eigen::Matrix4f pose =
264 inGlobalFrame ? objectPose.objectPoseGlobal : objectPose.objectPoseRobot;
265 std::optional<ObjectInfo> objectInfo = objectFinder.findObject(id);
266
267 auto makeObject = [&objectInfo, &id](const std::string& key)
268 {
269 viz::Object object(key);
270 if (objectInfo)
271 {
272 object.file(objectInfo->package(), objectInfo->simoxXML().relativePath);
273 }
274 else
275 {
276 object.fileByObjectFinder(id);
277 }
278 return object;
279 };
280
281 bool hasObject = false;
282 {
283
284 bool done = false;
285 if (useArticulatedModels and objectInfo)
286 {
287 if (std::optional<PackageFileLocation> model = objectInfo->getArticulatedModel())
288 {
289 viz::Robot robot(key);
290 robot.pose(pose);
291 robot.file(model->package, model->package + "/" + model->relativePath);
292 robot.joints(objectPose.objectJointValues);
293
294 if (useColModel)
295 {
296 robot.useCollisionModel();
297 // robot.overrideColor(colVisColor);
298 }
299
300 layer.add(robot);
301 done = true;
302 }
303 }
304 if (not done)
305 {
306 viz::Object object = makeObject(key).pose(pose);
307 if (alphaByConfidence && objectPose.confidence < 1.0f)
308 {
309 object.alpha(objectPose.confidence);
310 }
311 else if (alpha < 1)
312 {
313 object.alpha(alpha);
314 }
315
316 if (useColModel)
317 {
318 object.useCollisionModel();
319 // object.overrideColor(colVisColor);
320 }
321
322
323 layer.add(object);
324 hasObject = true;
325 }
326 }
327
328 if (oobbs and objectPose.localOOBB)
329 {
330 const simox::OrientedBoxf oobb =
331 inGlobalFrame ? objectPose.oobbGlobal().value() : objectPose.oobbRobot().value();
332 layer.add(viz::Box(key + " OOBB").set(oobb).color(simox::Color::lime(255, 64)));
333 }
334 if (objectFrames)
335 {
336 layer.add(viz::Pose(key + " Pose").pose(pose).scale(objectFramesScale));
337 }
338 if (gaussians.showAny() and
339 (inGlobalFrame ? objectPose.objectPoseGlobalGaussian.has_value()
340 : objectPose.objectPoseRobotGaussian.has_value()))
341 {
342 gaussians.draw(layer, objectPose, inGlobalFrame);
343 }
344 if (linearPredictions.showAny() and hasObject)
345 {
346 linearPredictions.draw(layer, makeObject, objectPose, poseHistory, inGlobalFrame);
347 }
348 }
349
350 bool
352 {
353 return position or orientation;
354 }
355
356 void
358 const objpose::ObjectPose& objectPose,
359 bool inGlobalFrame) const
360 {
361 const std::string key = objectPose.objectID.str();
362
363 const objpose::PoseManifoldGaussian& gaussian =
364 inGlobalFrame ? objectPose.objectPoseGlobalGaussian.value()
365 : objectPose.objectPoseRobotGaussian.value();
367
368 if (position)
369 {
370 layer.add(viz::Ellipsoid(key + " Gaussian (Translation)")
371 .position(ellipsoid.center)
372 .orientation(ellipsoid.orientation)
373 .axisLengths(positionScale * ellipsoid.size)
374 .color(viz::Color::azure(255, 32)));
375
376 if (false) // Arrows can be visualized for debugging.
377 {
378 for (int i = 0; i < 3; ++i)
379 {
380 Eigen::Vector3i color = Eigen::Vector3i::Zero();
381 color(i) = 255;
382
383 layer.add(viz::Arrow(key + " Gaussian (Translation)" + std::to_string(i))
384 .fromTo(ellipsoid.center,
385 ellipsoid.center + positionScale * ellipsoid.size(i) *
386 ellipsoid.orientation.col(i))
387 .width(5)
388 .color(simox::Color(color)));
389 }
390 }
391 }
392 if (orientation)
393 {
394 const float pi = static_cast<float>(M_PI);
395 for (int i = 0; i < 3; ++i)
396 {
397 const bool global = true;
398 Eigen::AngleAxisf rot = gaussian.getScaledRotationAxis(i, global);
399
400 Eigen::Vector4i color = Eigen::Vector4i::Zero();
401 color(i) = 255;
402 color(3) = 64;
403
404 layer.add(viz::ArrowCircle(key + " Gaussian (Orientation) " + std::to_string(i))
406 ? ellipsoid.center + orientationScale * rot.axis()
407 : ellipsoid.center)
408 .normal(rot.axis())
409 .radius(orientationScale)
410 .completion(simox::math::rescale(rot.angle(), 0.f, pi * 2, 0.f, 1.f))
411 .width(simox::math::rescale(rot.angle(), 0.f, pi * 2, 2.f, 7.f))
412 .color(simox::Color(color)));
413 }
414 }
415 }
416
417 void
419 {
420 using namespace armarx::RemoteGui::Client;
421
422 enabled.setValue(visu.enabled);
423 inGlobalFrame.setValue(visu.inGlobalFrame);
424 alpha.setRange(0, 1.0);
425 alpha.setValue(visu.alpha);
426 alphaByConfidence.setValue(visu.alphaByConfidence);
427 oobbs.setValue(visu.oobbs);
428
429 auto initScale = [](FloatSpinBox& scale, float value, float stepResolution)
430 {
431 float max = 10000;
432 scale.setRange(0, max);
433 scale.setDecimals(2);
434 scale.setSteps(int(stepResolution * max));
435 scale.setValue(value);
436 };
437 objectFrames.setValue(visu.objectFrames);
438 initScale(objectFramesScale, visu.objectFramesScale, 10);
439
440 gaussians.position.setValue(visu.gaussians.position);
441 initScale(gaussians.positionScale, visu.gaussians.positionScale, 10);
442
443 gaussians.orientation.setValue(visu.gaussians.orientation);
444 initScale(gaussians.orientationScale, visu.gaussians.orientationScale, 0.5);
445 gaussians.orientationDisplaced.setValue(visu.gaussians.orientationDisplaced);
446
447 useArticulatedModels.setValue(visu.useArticulatedModels);
448
449
450 GridLayout grid;
451 int row = 0;
452 grid.add(Label("Enabled"), {row, 0}).add(enabled, {row, 1});
453 row++;
454 grid.add(Label("Global Frame"), {row, 0}).add(inGlobalFrame, {row, 1});
455 row++;
456 grid.add(Label("Alpha"), {row, 0}).add(alpha, {row, 1}, {1, 3});
457 row++;
458 grid.add(Label("Alpha by Confidence"), {row, 0}).add(alphaByConfidence, {row, 1});
459 row++;
460 grid.add(Label("OOBB"), {row, 0}).add(oobbs, {row, 1});
461 row++;
462
463 grid.add(Label("Object Frames"), {row, 0}).add(objectFrames, {row, 1});
464 grid.add(Label("Scale:"), {row, 2}).add(objectFramesScale, {row, 3});
465 row++;
466
467 gaussians.setup(visu);
468 grid.add(gaussians.group, {row, 0}, {1, 4});
469 row++;
470
471 grid.add(Label("Use Articulated Models"), {row, 0}).add(useArticulatedModels, {row, 1});
472 row++;
473
474 linearPredictions.setup(visu.linearPredictions);
475 grid.add(linearPredictions.group, {row, 0}, {1, 4});
476 row++;
477
478 group = GroupBox();
479 group.setLabel("Visualization");
480 group.addChild(grid);
481 }
482
483 void
485 {
486 using namespace armarx::RemoteGui::Client;
487
488 GridLayout grid;
489 int row = 0;
490
491 grid.add(Label("Position"), {row, 0}).add(position, {row, 1});
492 grid.add(Label("Scale:"), {row, 2}).add(positionScale, {row, 3});
493 row++;
494
495 grid.add(Label("Orientation"), {row, 0}).add(orientation, {row, 1});
496 grid.add(Label("Scale:"), {row, 2}).add(orientationScale, {row, 3});
497 grid.add(Label("Displaced"), {row, 4}).add(orientationDisplaced, {row, 5});
498 row++;
499
500 group = GroupBox();
501 group.setLabel("Pose Gaussians");
502 group.addChild(grid);
503 }
504
505 void
507 {
508 data.position = position.getValue();
509 data.positionScale = positionScale.getValue();
510
511 data.orientation = orientation.getValue();
512 data.orientationScale = orientationScale.getValue();
513 data.orientationDisplaced = orientationDisplaced.getValue();
514 }
515
516 void
518 {
519 visu.enabled = enabled.getValue();
520 visu.inGlobalFrame = inGlobalFrame.getValue();
521 visu.alpha = alpha.getValue();
522 visu.alphaByConfidence = alphaByConfidence.getValue();
523 visu.oobbs = oobbs.getValue();
524
525 visu.objectFrames = objectFrames.getValue();
526 visu.objectFramesScale = objectFramesScale.getValue();
527
528 gaussians.update(visu.gaussians);
529
530 visu.useArticulatedModels = useArticulatedModels.getValue();
531
532 linearPredictions.update(visu.linearPredictions);
533 }
534
535 std::vector<viz::Layer>
537 const std::map<std::string, objpose::ObjectPoseMap>& objectPosesByProvider,
538 const std::map<std::string, std::map<ObjectID, std::map<DateTime, objpose::ObjectPose>>>&
539 poseHistoriesByProvider,
540 const ObjectFinder& objectFinder) const
541 {
542 std::map<std::string, viz::Layer> stage;
543
544 ARMARX_VERBOSE << "Visualizing commit";
545
546 const auto availableProvidersInPoseHistories = ranges::views::keys(poseHistoriesByProvider);
547
548 for (const auto& [provider, objectPoses] : objectPosesByProvider)
549 {
550 for (const auto& [id, pose] : objectPoses)
551 {
552 if (pose.providerName.empty())
553 {
554 ARMARX_WARNING << "The object " << QUOTED(id)
555 << " does not have a `providerName` set";
556 continue;
557 }
558
559 const auto visualizeObjPose =
560 [&](const std::map<DateTime, objpose::ObjectPose>& poseHistory)
561 {
563 getLayer(pose.providerName, stage), pose, poseHistory, objectFinder, false);
564 };
565
566 if (ranges::contains(availableProvidersInPoseHistories, provider))
567 {
568 const auto& poseHistories = poseHistoriesByProvider.at(provider);
569
570 auto poseHistoryMap = poseHistories.find(id);
571 if (poseHistoryMap != poseHistories.end())
572 {
573 visualizeObjPose(poseHistoryMap->second);
574 }
575 else
576 {
577 visualizeObjPose({});
578 }
579 }
580 else
581 {
582 visualizeObjPose({});
583 }
584
585 // visualize collision models
587 {
588 const auto visualizeObjColPose =
589 [&](const std::map<DateTime, objpose::ObjectPose>& poseHistory)
590 {
591 visualizeObjectPose(getLayer(pose.providerName + "_col", stage),
592 pose,
593 poseHistory,
594 objectFinder,
595 true);
596 };
597
598
599 if (ranges::contains(availableProvidersInPoseHistories, provider))
600 {
601 const auto& poseHistories = poseHistoriesByProvider.at(provider);
602 auto poseHistoryMap = poseHistories.find(id);
603
604 if (poseHistoryMap != poseHistories.end())
605 {
606 visualizeObjColPose(poseHistoryMap->second);
607 }
608 else
609 {
610 visualizeObjColPose({});
611 }
612 }
613 else
614 {
615 visualizeObjColPose({});
616 }
617 }
618 }
619 }
620
621
622 // independent of the provider, we want visualize the most recent poses of each object instance in a layer "latest"
623 {
624 // get latest pose for each object (by iterating over all providers and their poses)
625 objpose::ObjectPoseMap latestObjectPoses;
626 {
627 for (const auto& [provider, objectPoses] : objectPosesByProvider)
628 {
629 for (const auto& [id, pose] : objectPoses)
630 {
631
632 // if the object is not already in the map, add it
633 if (latestObjectPoses.count(id) == 0)
634 {
635 latestObjectPoses.emplace(id, pose);
636 }
637 else
638 {
639 // the object is already in the map
640 auto& latestObjectPose = latestObjectPoses.at(id);
641
642 // update pose if it is more recent
643 if (pose.timestamp > latestObjectPose.timestamp)
644 {
645 latestObjectPose = pose;
646 }
647 }
648 }
649 }
650 }
651
652 // visualize latest poses
653 {
654 auto& layer = getLayer("latest", stage);
655
656 for (const auto& [id, pose] : latestObjectPoses)
657 {
658 visualizeObjectPose(layer, pose, {}, objectFinder, false);
659 }
660 }
661 }
662
663 return simox::alg::get_values(stage);
664 }
665} // namespace armarx::armem::server::obj::instance
#define pi
int Label(int n[], int size, int *curLabel, MiscLib::Vector< std::pair< int, size_t > > *labels)
Definition Bitmap.cpp:801
#define ARMARX_CHECK_NOT_EMPTY(c)
#define M_PI
Definition MathTools.h:17
#define QUOTED(x)
Used to find objects in the ArmarX objects repository [1] (formerly [2]).
std::optional< ObjectInfo > findObject(const std::string &dataset, const std::string &name) const
A known object ID of the form "Dataset/ClassName" or "Dataset/ClassName/InstanceName".
Definition ObjectID.h:11
std::string str() const
Return "dataset/className" or "dataset/className/instanceName".
Definition ObjectID.cpp:60
Models decay of object localizations by decreasing the confidence the longer the object was not local...
Definition Visu.h:27
void defineProperties(armarx::PropertyDefinitionsPtr defs, const std::string &prefix="visu.")
Definition Visu.cpp:48
visu::LinearPredictions linearPredictions
Linear predictions for objects.
Definition Visu.h:114
bool useArticulatedModels
Prefer articulated models if available.
Definition Visu.h:111
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:101
viz::Layer visualizeProvider(const std::string &providerName, const objpose::ObjectPoseSeq &objectPoses, const std::vector< std::map< DateTime, objpose::ObjectPose > > &poseHistories, const ObjectFinder &objectFinder) const
Definition Visu.cpp:228
void visualizeObjectPose(viz::Layer &layer, const objpose::ObjectPose &objectPose, const std::map< DateTime, objpose::ObjectPose > &poseHistory, const ObjectFinder &objectFinder, bool useColModel) const
Definition Visu.cpp:249
virtual Layer layer(std::string const &name) const
Definition Client.cpp:80
DerivedT & pose(Eigen::Matrix4f const &pose)
Definition ElementOps.h:176
DerivedT & color(Color color)
Definition ElementOps.h:218
Robot & joints(std::map< std::string, float > const &values)
Definition Robot.h:74
Robot & useCollisionModel()
Definition Robot.h:34
Robot & file(std::string const &project, std::string const &filename)
Definition Robot.h:16
#define ARMARX_INFO
The normal logging level.
Definition Logging.h:181
#define ARMARX_WARNING
The logging level for unexpected behaviour, but not a serious problem.
Definition Logging.h:193
#define ARMARX_VERBOSE
The logging level for verbose information.
Definition Logging.h:187
std::map< ObjectID, ObjectPose > ObjectPoseMap
std::vector< ObjectPose > ObjectPoseSeq
IceUtil::Handle< class PropertyDefinitionContainer > PropertyDefinitionsPtr
PropertyDefinitions smart pointer type.
std::vector< T > max(const std::vector< T > &v1, const std::vector< T > &v2)
void setRange(float min, float max)
Definition Widgets.cpp:330
GridLayout & add(Widget const &child, Pos pos, Span span=Span{1, 1})
Definition Widgets.cpp:438
void draw(viz::Layer &layer, const objpose::ObjectPose &objectPose, bool inGlobalFrame) const
Definition Visu.cpp:357
void defineProperties(armarx::PropertyDefinitionsPtr defs, const std::string &prefix)
Definition Visu.cpp:82
armarx::RemoteGui::Client::CheckBox orientation
Definition Visu.h:137
armarx::RemoteGui::Client::FloatSpinBox positionScale
Definition Visu.h:135
armarx::RemoteGui::Client::CheckBox orientationDisplaced
Definition Visu.h:139
armarx::RemoteGui::Client::FloatSpinBox orientationScale
Definition Visu.h:138
armarx::RemoteGui::Client::CheckBox inGlobalFrame
Definition Visu.h:124
armarx::RemoteGui::Client::FloatSpinBox objectFramesScale
Definition Visu.h:130
armarx::RemoteGui::Client::CheckBox useArticulatedModels
Definition Visu.h:149
armarx::RemoteGui::Client::GroupBox group
Definition Visu.h:120
armarx::RemoteGui::Client::CheckBox alphaByConfidence
Definition Visu.h:126
armarx::RemoteGui::Client::CheckBox objectFrames
Definition Visu.h:129
armarx::RemoteGui::Client::FloatSlider alpha
Definition Visu.h:125
visu::LinearPredictions::RemoteGui linearPredictions
Definition Visu.h:151
armarx::RemoteGui::Client::CheckBox enabled
Definition Visu.h:122
armarx::RemoteGui::Client::CheckBox oobbs
Definition Visu.h:127
An object pose as stored by the ObjectPoseStorage.
Definition ObjectPose.h:34
float confidence
Confidence in [0, 1] (1 = full, 0 = none).
Definition ObjectPose.h:96
armarx::ObjectID objectID
The object ID, i.e. dataset, class name and instance name.
Definition ObjectPose.h:56
std::optional< simox::OrientedBoxf > oobbRobot() const
Get the OOBB in the robot frame (according to objectPoseRobot).
Eigen::Matrix4f objectPoseRobot
The object pose in the robot root frame.
Definition ObjectPose.h:66
std::optional< PoseManifoldGaussian > objectPoseGlobalGaussian
... and with uncertainty.
Definition ObjectPose.h:73
std::map< std::string, float > objectJointValues
The object's joint values if it is articulated.
Definition ObjectPose.h:83
std::optional< simox::OrientedBoxf > localOOBB
Object bounding box in object's local coordinate frame.
Definition ObjectPose.h:102
std::optional< simox::OrientedBoxf > oobbGlobal() const
Get the OOBB in the global frame (according to objectPoseGlobal).
Eigen::Matrix4f objectPoseGlobal
The object pose in the global frame.
Definition ObjectPose.h:71
std::optional< PoseManifoldGaussian > objectPoseRobotGaussian
... and with uncertainty.
Definition ObjectPose.h:68
A "gaussian" distribution in pose space (i.e.
Eigen::AngleAxisf getScaledRotationAxis(int index, bool global=false) const
Get a column of the pure orientational covariance matrix as axis-angle rotation.
Ellipsoid getPositionEllipsoid() const
Get the parameters of a 3D ellipsoid illustrating this gaussian.
Arrow & width(float w)
Definition Elements.h:211
void add(ElementT const &element)
Definition Layer.h:31