54 const std::string Component::defaultName =
"dynamic_scene_provider";
59 addPlugin(laserScannerFeaturesReaderPlugin);
64 addPlugin(laserScannerFeaturesWriterPlugin);
88 properties.taskPeriodMs,
"p.taskPeriodMs",
"Update rate of the running task.");
90 def->optional(properties.laserScannerFeatures.enabled,
91 "p.laserScannerFeatures.enabled",
92 "Whether laser scanner features are used.");
93 def->optional(properties.laserScannerFeatures.providerName,
94 "p.laserScannerFeatures.providerName",
96 def->optional(properties.laserScannerFeatures.name,
"p.laserScannerFeatures.name",
"");
98 def->required(properties.robot.name,
"p.robot.name",
"");
100 def->optional(properties.occupancyGrid.providerName,
"p.occupancyGrid.providerName",
"");
101 def->optional(properties.occupancyGrid.name,
"p.occupancyGrid.name",
"");
103 properties.occupancyGrid.freespaceThreshold,
"p.occupancyGrid.freespaceThreshold",
"");
105 properties.occupancyGrid.occupiedThreshold,
"p.occupancyGrid.occupiedThreshold",
"");
108 properties.humanPoses.enabled,
"p.humanPoses.enabled",
"Whether human poses are used.");
109 def->optional(properties.humanPoses.providerName,
"p.humanPoses.providerName",
"");
158 robot = virtualRobotReaderPlugin->get().getRobotWaiting(properties.robot.name);
159 if (robot !=
nullptr)
168 humanTracker.
reset();
171 this, &Component::runPeriodically, properties.taskPeriodMs,
false,
"runningTask");
189 return Component::defaultName;
195 return Component::defaultName;
199 Component::runPeriodically()
201 const auto logDuration = [
this](
const std::string& name,
const Duration& duration)
204 const auto makeSWlog = [&](
const std::string& name)
205 {
return [=](
const Duration& duration) { logDuration(name, duration); }; };
219 if (not virtualRobotReaderPlugin->get().synchronizeRobot(*robot, timestamp))
221 ARMARX_INFO <<
"Failed to synchronize robot to timestamp `" << timestamp <<
"`.";
225 const core::Pose global_T_robot(robot->getGlobalPose());
227 ARMARX_VERBOSE <<
"Robot position: " << global_T_robot.translation().head<2>();
234 const std::vector<armem::human::HumanPose> humanPoses = [&]
236 if (!properties.humanPoses.enabled)
238 return std::vector<armem::human::HumanPose>{};
244 const armem::human::client::Reader::Query humanPoseQuery{
245 .providerName = properties.humanPoses.providerName,
246 .timestamp = timestamp,
249 const armem::human::client::Reader::Result humanPoseResult =
250 humanPoseReaderPlugin->get().query(humanPoseQuery);
253 << humanPoseResult.errorMessage;
255 ARMARX_VERBOSE << humanPoseResult.humanPoses.size() <<
" humans in the scene.";
257 return humanPoseResult.humanPoses;
264 const memory::LaserScannerFeatures laserFeatures = [&]() -> memory::LaserScannerFeatures
266 if (!properties.laserScannerFeatures.enabled)
268 return memory::LaserScannerFeatures{};
274 const memory::client::laser_scanner_features::Reader::Query laserFeaturesQuery{
275 .providerName = properties.laserScannerFeatures.providerName,
276 .name = properties.laserScannerFeatures.name,
277 .timestamp = timestamp};
279 const memory::client::laser_scanner_features::Reader::Result laserFeaturesResult =
280 laserScannerFeaturesReaderPlugin->get().queryData(laserFeaturesQuery);
282 if (laserFeaturesResult.status !=
285 ARMARX_VERBOSE <<
"Querying laser scanner features failed. Reason: "
286 << laserFeaturesResult.errorMessage;
293 << laserFeaturesResult.errorMessage;
295 ARMARX_VERBOSE << laserFeaturesResult.features.size() <<
" clusters/features";
297 if (laserFeaturesResult.features.empty())
304 <<
"We request the merged instance with only one result";
306 return laserFeaturesResult.features.front();
427 if (properties.humanPoses.enabled)
431 ARMARX_VERBOSE <<
"Running human tracker with camera measurements";
432 humanTracker.
update(human::HumanTracker::CameraMeasurement{.detectionTime = timestamp,
433 .humanPoses = humanPoses});
438 const std::vector<memory::LaserScannerFeature> unusedFeatures = [&]
440 if (!properties.laserScannerFeatures.enabled)
442 return std::vector<memory::LaserScannerFeature>{};
446 makeSWlog(
"dynamic_scene.human_tracker.laserscanner"));
448 ARMARX_VERBOSE <<
"Running human tracker with lasersensor measurements";
450 return humanTracker.
update(human::HumanTracker::LaserMeasurement{
451 .detectionTime = timestamp, .clusters = laserFeatures.features});
468 if (not humans.empty())
471 humanWriterPlugin->get().store(humans,
getName(), timestamp);
474 if (not unusedFeatures.empty())
477 <<
" laser scanner features not associated with humans";
479 laserScannerFeaturesWriterPlugin->get().store(
480 memory::LaserScannerFeatures{.frame =
"global",
482 .features = unusedFeatures},