26 #include <experimental/map>
28 #include <SimoxUtility/algorithm/string.h>
37 #include <range/v3/range/conversion.hpp>
38 #include <range/v3/view/filter.hpp>
39 #include <range/v3/view/transform.hpp>
43 const std::string SimulationObjectPoseProvider::defaultName =
"SimulationObjectPoseProvider";
57 def->component(simulatorPrx,
"Simulator");
59 def->optional(properties.updateFrequency,
61 "Frequency at which to update the objects in the ObjectMemory.");
63 def->optional(properties.requestAllEntities,
64 "p.requestAllEntities",
65 "True if all entities should be requested all the time.");
67 def->optional(properties.initiallyRequestedEntities,
68 "p.initiallyRequestedEntities",
69 "All entities (comma separated) that should be requested from the beginning "
70 "(e.g. 'Kitchen/multivitamin-juice/0'). "
71 "If you want an entity to be localized for n seconds append ':n'. If you "
72 "want to see all active entities, set the component to DEBUG.");
87 for (
const auto& entity :
simox::alg::split(properties.initiallyRequestedEntities,
","))
93 <<
"Could not use multiple durations for localization request '" << entity <<
"'";
95 const auto& objectName = tokens[0];
99 const auto until = tokens.size() == 1
103 activeRequests.insert({objectName, until});
113 poseProviderTask->start();
129 return SimulationObjectPoseProvider::defaultName;
135 return SimulationObjectPoseProvider::defaultName;
138 objpose::provider::RequestObjectsOutput
140 const objpose::provider::RequestObjectsInput&
input,
141 const Ice::Current& )
143 if (properties.requestAllEntities)
146 "Requesting an object does not have an effect.";
150 const std::lock_guard l(knownObjectsMutex);
151 const std::lock_guard l2(activeRequestsMutex);
155 objpose::provider::RequestObjectsOutput output;
156 for (
const auto&
id :
input.objectIDs)
158 const std::string entityId =
id.dataset +
"/" +
id.className +
"/" +
id.instanceName;
159 if (knownObjects.find(entityId) != knownObjects.end())
161 if (activeRequests.find(entityId) != activeRequests.end())
164 <<
"' is already requested. Updating the request time.";
166 activeRequests[entityId] =
168 output.results[id].success =
true;
172 std::vector<std::string> allNames;
173 allNames.reserve(knownObjects.size());
174 for (
const auto& [name, _] : knownObjects)
176 allNames.push_back(name);
179 <<
"'. All known objects are: " << allNames;
180 output.results[id].success =
false;
186 objpose::ProviderInfo
189 objpose::ProviderInfo info;
190 info.objectType = objpose::KnownObject;
191 info.proxy = getProxy<objpose::ObjectPoseProviderPrx>();
192 info.supportedObjects = {};
197 SimulationObjectPoseProvider::poseProviderTaskRun()
201 while (poseProviderTask and not poseProviderTask->isStopped())
203 metronome.waitForNextTick();
207 armarx::SceneVisuData sceneData;
210 sceneData = simulatorPrx->getScene();
211 for (
const auto&
object : sceneData.objects)
213 ARMARX_DEBUG <<
"Found object in scene: " <<
object.name;
216 catch (
const Ice::LocalException& e)
218 ARMARX_INFO <<
"Could not get object poses from simulator: " << e.what();
223 <<
" objects and " << sceneData.robots.size() <<
" robots.";
225 std::vector<objpose::ProvidedObjectPose> providedObjects;
227 if (properties.requestAllEntities)
230 providedObjects = getAllPoses(sceneData, now);
235 updateKnownObjects(sceneData);
236 removeExpiredRequests(now);
237 providedObjects = getRequestedPoses(now);
247 catch (
const Ice::LocalException& e)
249 ARMARX_INFO <<
"Could not report object poses to object memory: " << e.what();
255 std::vector<objpose::ProvidedObjectPose>
256 SimulationObjectPoseProvider::getAllPoses(
const armarx::SceneVisuData& sceneData,
257 const DateTime& time)
const
259 auto convertPoses = [
this, time](
const auto& simObject)
260 {
return objectPoseFromVisuData(simObject, time); };
266 SimulationObjectPoseProvider::updateKnownObjects(
const armarx::SceneVisuData& sceneData)
268 const std::scoped_lock l(knownObjectsMutex);
270 knownObjects.clear();
271 for (
const auto&
object : sceneData.objects)
273 knownObjects.insert({
object.name,
object});
278 SimulationObjectPoseProvider::removeExpiredRequests(
const DateTime& time)
280 const std::scoped_lock l2(activeRequestsMutex);
282 auto isTimeout = [time](
const auto& request)
284 const auto& provideUntilTime = request.second;
285 return (not provideUntilTime.isInvalid()) and time > provideUntilTime;
291 std::vector<objpose::ProvidedObjectPose>
292 SimulationObjectPoseProvider::getRequestedPoses(
const DateTime& time)
const
294 const std::scoped_lock l(knownObjectsMutex);
295 const std::scoped_lock l2(activeRequestsMutex);
297 auto isRequestedObjectKnown = [
this](
const auto& request)
299 const auto& objectName = request.first;
300 return this->knownObjects.find(objectName) != this->knownObjects.end();
303 auto getPoseFromRequest = [
this, time](
const auto& request)
305 const auto&
object = this->knownObjects.at(request.first);
306 return objectPoseFromVisuData(
object, time);
309 return activeRequests | ranges::views::filter(isRequestedObjectKnown) |
313 objpose::ProvidedObjectPose
314 SimulationObjectPoseProvider::objectPoseFromVisuData(
const armarx::ObjectVisuData& visuData,
315 const DateTime& time)
const
317 objpose::ProvidedObjectPose pose;
320 pose.objectType = objpose::ObjectType::KnownObject;
321 pose.isStatic = visuData.staticObject;
325 pose.objectPose =
armarx::fromIce(visuData.objectPoses.at(visuData.name));
329 pose.timestamp = time;