25 #include <Eigen/Geometry>
27 #include <SimoxUtility/math/pose/pose.h>
28 #include <SimoxUtility/shapes/AxisAlignedBoundingBox.h>
37 #include <RobotAPI/libraries/armem_index/aron/Spatial.aron.generated.h>
39 #include <RobotAPI/libraries/armem_objects/aron/ObjectInstance.aron.generated.h>
41 #include <RobotAPI/libraries/armem_robot_state/aron/RobotState.aron.generated.h>
55 defs->optional(properties.object.maxFrequencyHz,
"p.object.maxFrequency");
68 return "ObjectInstanceToIndex";
127 const std::vector<armem::MemoryID>& snapshotIDs)
130 if (not robotMemoryReader)
136 catch (
const armem::error::CouldNotResolveMemoryServer& e)
145 std::map<armem::MemoryID, const armem::MemoryID*> entityToSnapshot;
149 if (
auto it = entityToSnapshot.find(entityID); it != entityToSnapshot.end())
151 if (it->second->timestamp < snapshotID.timestamp)
153 entityToSnapshot[entityID] = &snapshotID;
158 entityToSnapshot[entityID] = &snapshotID;
163 std::vector<armem::MemoryID> queryIDs;
164 for (
const auto& [_, snapshotID] : entityToSnapshot)
166 queryIDs.push_back(*snapshotID);
169 armem::client::QueryResult result = robotMemoryReader.queryMemoryIDs(queryIDs);
178 result.memory.forEachInstance(
181 const armem::arondto::ObjectInstance
data = instance.dataAs<armem::arondto::ObjectInstance>();
183 armem::index::arondto::Spatial spatial;
190 update.referencedTime = instance.id().timestamp;
191 update.instancesData = { spatial.toAron() };
204 ObjectInstanceToIndex::processObjectInstance(
const armem::MemoryID&
id,
205 const std::vector<armem::MemoryID>& snapshotIDs)
207 std::scoped_lock lock(objectMutex);
208 if (not
object.has_value())
210 object = armem::objects::ObjectInstanceToIndex{
212 .indexSpatialMemoryWriter = indexSpatialMemoryWriter,
213 .indexSpatialProviderSegmentID =
215 .indexNamedProviderSegmentID =
224 object->fetchAndCommitObjectInstances(snapshotIDs);