14 properties(
std::move(properties)),
16 pushToMemory(
std::move(pushToMemory)),
17 pullFromMemory(
std::move(pullFromMemory)),
18 isCommitRequired(false),
19 isUpdateRequired(true),
20 isMemoryVizRequired(true),
21 isMetaVizRequired(true)
23 placeholderOptions.emplace_back(
"Remove");
24 placeholderOptions.emplace_back(lineString);
28 placeholderOptions.push_back(armarx::fromIce(availableObject).str());
39 storedPoses = update();
41 isUpdateRequired =
false;
48 isResetRequired =
false;
51 if (isMemoryVizRequired)
54 stage.
add(memoryLayer);
56 isMemoryVizRequired =
false;
59 if (isMetaVizRequired)
64 isMetaVizRequired =
false;
71 isCommitRequired =
false;
74 observer.requestInteractions(stage);
86 isMemoryVizRequired =
true;
88 return newRequestedPoses;
96 isMemoryVizRequired =
true;
102 changes.moveNewObjectsTo(storedPoses);
107 remainingPoses.reserve(storedPoses.size());
108 for (objpose::ObjectPose& current : storedPoses)
110 bool isChanged = changes.applyTo(current);
114 providingPoses.push_back(current.toProvidedObjectPoseGlobal());
115 objpose::ProvidedObjectPose& providing = providingPoses.back();
117 providing.providerName = properties.providerName;
121 if (current.confidence > properties.confidenceThreshold)
123 remainingPoses.push_back(current);
127 pushToMemory(providingPoses);
130 storedPoses = remainingPoses;
132 isMemoryVizRequired =
true;
136 Editor::visualizeMemory()
138 observer.clearObservedLayer(memoryLayer);
140 for (objpose::ObjectPose& objectPose : storedPoses)
142 if (objectPose.confidence > properties.confidenceThreshold)
144 visualizeObject(objectPose);
148 changes.visualizeNewObjects();
154 VisualizationDescription description = changes.buildVisualizationDescription(objectPose);
158 if (description.allowTransforming)
163 if (not description.options.empty())
168 viz::Object
object = viz::Object(objectPose.objectID.str())
169 .pose(description.transform * objectPose.objectPoseGlobal)
170 .scale(properties.objectScaling)
171 .fileByObjectFinder(objectPose.objectID)
172 .enable(interaction);
174 if (description.alpha.has_value())
176 object.alpha(description.alpha.value());
179 if (description.color.has_value())
181 object.overrideColor(description.color.value());
184 observer.addObserved(memoryLayer,
object)
185 .onContextMenu(description.cloneIndex,
188 changes.cloneObject(objectPose);
189 isMemoryVizRequired = true;
191 .onContextMenu(description.deleteIndex,
194 changes.deleteObject(objectPose);
195 isMemoryVizRequired = true;
197 .onContextMenu(description.resetIndex,
200 changes.resetObject(objectPose);
201 isMemoryVizRequired = true;
203 .onContextMenu(description.prototypeIndex,
206 const float defaultExtents = 100;
207 simox::OrientedBoxf box(
208 objectPose.objectPoseGlobal,
209 Eigen::Vector3f(defaultExtents, defaultExtents, defaultExtents));
211 box = objectPose.oobbGlobal().value_or(box);
212 box = box.transformed(changes.getTransform(objectPose));
214 placeholders.addPlaceholder(box);
215 isMetaVizRequired = true;
217 .onContextMenu(description.commitIndex, [
this] { isCommitRequired = true; })
218 .onContextMenu(description.updateIndex, [
this] { isUpdateRequired = true; })
219 .onContextMenu(description.resetAllIndex, [
this] { isResetRequired = true; })
221 [
this, &objectPose](
const Eigen::Matrix4f&
transform)
223 changes.moveObject(objectPose,
transform);
224 isMemoryVizRequired =
true;
229 Editor::visualizeMeta()
231 observer.clearObservedLayer(metaLayer);
233 placeholders.visualizePlaceholders();
243 viz::Box box = viz::Box(
"placeholder_" + std::to_string(
id))
244 .set(placeholder.box.transformed(placeholder.transform))
245 .color(simox::Color::yellow(255, 128))
246 .enable(interaction);
248 auto& observation = observer.addObserved(metaLayer, box)
252 placeholders.removePlaceholder(
id);
253 isMetaVizRequired =
true;
256 [
this,
id](Eigen::Matrix4f
const&
transform)
258 placeholders.movePlaceholder(
id,
transform);
259 isMetaVizRequired =
true;
264 std::string
const&
object = placeholderOptions[
index];
266 observation.onContextMenu(
index,
269 placeholders.specifyObject(
id,
object, changes);
271 isMetaVizRequired =
true;
272 isMemoryVizRequired =
true;
287 seq.insert(seq.begin(), newPoses.begin(), newPoses.end());
295 bool isChanged = iterator != changed.end();
299 auto& [name, change] = *iterator;
301 if (change.kind == DELETE)
317 editor->visualizeObject(objectPose);
326 auto iterator = changed.find(
object.objectID.str());
327 bool isChanged = iterator != changed.end();
329 ChangeKind kind = MOVE;
332 auto& [name, change] = *iterator;
338 size_t currentIndex = 0;
342 description.
options.emplace_back(
"Clone");
345 description.
options.emplace_back(
"Delete");
351 auto& [name, change] = *iterator;
353 description.
options.emplace_back(
"Reset");
356 description.
transform = change.transform;
358 const float alpha = 0.5;
363 description.
alpha = alpha;
367 description.
color = simox::Color(0.0F, 1.0F, 0.0F, alpha);
371 description.
color = simox::Color(1.0F, 0.0F, 0.0F, alpha);
376 description.
options.emplace_back(
"Create Placeholder");
379 description.
options.emplace_back(Editor::lineString);
382 description.
options.emplace_back(
"Commit All Changes");
385 description.
options.emplace_back(
"Update Unchanged");
388 description.
options.emplace_back(
"Reset All");
397 std::string suffix = std::to_string(std::chrono::duration_cast<std::chrono::seconds>(
398 std::chrono::system_clock::now().time_since_epoch())
405 const float minOffset = 100;
406 float offset = minOffset;
407 if (
object.localOOBB.has_value())
409 Eigen::Vector3f size =
410 object.localOOBB.value().corner_max() -
object.localOOBB.value().corner_min();
411 float objectOffset = size.maxCoeff() / 2;
413 offset = std::max(minOffset, objectOffset);
416 Change& clonedChange = changed[newPose.
objectID.
str()];
417 clonedChange.kind = CREATE;
419 clonedChange.transform = Eigen::Affine3f(Eigen::Translation3f(offset, offset, 0)).matrix();
420 clonedChange.iterator = std::prev(newPoses.end());
422 auto iterator = changed.find(
object.objectID.str());
423 if (iterator != changed.end())
425 auto& [name, originalChange] = *iterator;
426 clonedChange.transform *= originalChange.transform;
433 std::string suffix = std::to_string(std::chrono::duration_cast<std::chrono::seconds>(
434 std::chrono::system_clock::now().time_since_epoch())
443 newPose.
objectType = objpose::ObjectType::KnownObject;
450 std::optional<armarx::ObjectInfo> info = editor->objectFinder.findObject(
id);
451 if (info.has_value())
458 pose * newPose.
localOOBB->transformation_centered().inverse();
462 Change& createdChange = changed[newPose.
objectID.
str()];
463 createdChange.kind = CREATE;
464 createdChange.transform = Eigen::Matrix4f::Identity();
465 createdChange.iterator = std::prev(newPoses.end());
471 changed[
object.objectID.str()].kind = DELETE;
477 auto iterator = changed.find(
object.objectID.str());
478 if (iterator != changed.end())
480 auto& [name, change] = *iterator;
482 if (change.kind == CREATE)
484 newPoses.erase(change.iterator);
487 changed.erase(iterator);
494 Change& change = changed[
object.objectID.str()];
495 change.transform =
transform * change.transform;
501 Eigen::Matrix4f
transform = Eigen::Matrix4f::Identity();
503 auto iterator = changed.find(
object.objectID.str());
504 if (iterator != changed.end())
506 auto& [name, change] = *iterator;
518 auto& entry = placeholders[id];
519 entry.placeholder = {.box = std::move(box), .transform = Eigen::Matrix4f::Identity()};
520 entry.isActive =
true;
526 for (
size_t id = 0;
id < placeholders.size();
id++)
528 auto& entry = placeholders[id];
532 editor->visualizePlaceholder(entry.placeholder,
id);
540 auto& placeholder = placeholders[id].placeholder;
541 placeholder.transform =
transform * placeholder.transform;
547 placeholders[id].isActive =
false;
553 PlaceholderState::getID()
555 if (unusedIDs.empty())
557 size_t id = placeholders.size();
558 placeholders.push_back({Placeholder(),
false});
562 size_t id = unusedIDs.top();
569 std::string
const& objectID,
572 auto& placeholder = placeholders[id].placeholder;
574 Eigen::Matrix4f pose =
575 placeholder.box.transformed(placeholder.transform).transformation_centered();
void moveObject(objpose::ObjectPose const &object, Eigen::Matrix4f const &transform)
void deleteObject(objpose::ObjectPose const &object)
Eigen::Matrix4f getTransform(objpose::ObjectPose const &object)
void createObject(std::string const &objectID, Eigen::Matrix4f const &pose)
void moveNewObjectsTo(objpose::ObjectPoseSeq &seq)
void cloneObject(objpose::ObjectPose const &object)
bool applyTo(objpose::ObjectPose &pose)
void visualizeNewObjects()
void resetObject(objpose::ObjectPose const &object)
VisualizationDescription buildVisualizationDescription(objpose::ObjectPose &object)
Editor(viz::Client &client, Properties properties, std::function< void(objpose::ProvidedObjectPoseSeq &)> pushToMemory, std::function< objpose::ObjectPoseSeq(void)> pullFromMemory)
A known object ID of the form "Dataset/ClassName" or "Dataset/ClassName/InstanceName".
ObjectID withInstanceName(const std::string &instanceName) const
std::string str() const
Return "dataset/className" or "dataset/className/instanceName".
void addPlaceholder(simox::OrientedBoxf box)
void specifyObject(size_t id, std::string const &objectID, ChangeState &changeState)
void movePlaceholder(size_t id, Eigen::Matrix4f const &transform)
void visualizePlaceholders()
void removePlaceholder(size_t id)
std::vector< ObjectPose > ObjectPoseSeq
std::vector< ProvidedObjectPose > ProvidedObjectPoseSeq
InteractionDescription interaction()
This file offers overloads of toIce() and fromIce() functions for STL container types.
auto transform(const Container< InputT, Alloc > &in, OutputT(*func)(InputT const &)) -> Container< OutputT, typename std::allocator_traits< Alloc >::template rebind_alloc< OutputT > >
Convenience function (with less typing) to transform a container of type InputT into the same contain...
std::vector< data::ObjectID > const & availableObjects
std::optional< simox::Color > color
std::vector< std::string > options
Eigen::Matrix4f transform
std::optional< float > alpha
An object pose as stored by the ObjectPoseStorage.
float confidence
Confidence in [0, 1] (1 = full, 0 = none).
armarx::ObjectID objectID
The object ID, i.e. dataset, class name and instance name.
std::string providerName
Name of the providing component.
bool isStatic
Whether object is static. Static objects don't decay.
DateTime timestamp
Source timestamp.
ObjectType objectType
Known or unknown object.
std::optional< simox::OrientedBoxf > localOOBB
Object bounding box in object's local coordinate frame.
Eigen::Matrix4f objectPoseGlobal
The object pose in the global frame.
InteractionFeedbackRange interactions() const
Self & contextMenu(std::vector< std::string > const &options)
Self & hideDuringTransform()
A staged commit prepares multiple layers to be committed.
void add(Layer const &layer)
Stage a layer to be committed later via client.apply(*this)