From b6ebf6bee28c99845d6cb57dab7cf337b92d6fc6 Mon Sep 17 00:00:00 2001 From: Markus Grotz <markus.grotz@kit.edu> Date: Tue, 7 Jun 2016 11:56:18 +0200 Subject: [PATCH] updated ViewSelection - replaced IceUtil::Time::now with ArmarX TimeUtil - SaliencyMaps now include more information (time, source) --- .../ViewSelection/ViewSelection.cpp | 22 ++++++++++--------- .../components/ViewSelection/ViewSelection.h | 5 +++-- .../components/ViewSelectionInterface.ice | 16 +++++++++++++- 3 files changed, 30 insertions(+), 13 deletions(-) diff --git a/source/RobotAPI/components/ViewSelection/ViewSelection.cpp b/source/RobotAPI/components/ViewSelection/ViewSelection.cpp index 79700054c..34c80fd1f 100644 --- a/source/RobotAPI/components/ViewSelection/ViewSelection.cpp +++ b/source/RobotAPI/components/ViewSelection/ViewSelection.cpp @@ -48,6 +48,9 @@ void ViewSelection::onInitComponent() std::string graphFileName = "RobotAPI/ViewSelection/graph40k.gra"; + armarx::CMakePackageFinder finder("RobotAPI"); + ArmarXDataPath::addDataPaths(finder.getDataDir()); + if (ArmarXDataPath::getAbsolutePath(graphFileName, graphFileName)) { visibilityMaskGraph = new CIntensityGraph(graphFileName); @@ -84,7 +87,7 @@ void ViewSelection::onInitComponent() sleepingTimeBetweenViewDirectionChanges = getProperty<int>("SleepingTimeBetweenViewDirectionChanges").getValue(); doAutomaticViewSelection = getProperty<bool>("ActiveAtStartup").getValue(); - timeOfLastViewChange = IceUtil::Time::now(); + timeOfLastViewChange = armarx::TimeUtil::GetTime(); // this is robot model specific: offset from the used head coordinate system to the actual // head center where the eyes are assumed to be located. Here it is correct for ARMAR-III @@ -142,13 +145,13 @@ ViewTargetBasePtr ViewSelection::nextAutomaticViewTarget() // find the direction with highest saliency int maxIndex = -1; - float maxSaliency = 0; + float maxSaliency = std::numeric_limits<float>::min(); for (size_t i = 0; i < visibilityMaskGraphNodes->size(); i++) { float saliency = 0.0f; - for (const auto & p : saliencyMaps) + for (const std::string & n : activeSaliencyMaps) { - saliency += p.second[i]; + saliency += saliencyMaps[n]->map[i]; } CIntensityNode* visibilityNode = (CIntensityNode*) visibilityMaskGraphNodes->at(i); @@ -164,7 +167,7 @@ ViewTargetBasePtr ViewSelection::nextAutomaticViewTarget() ARMARX_DEBUG << "Highest saliency: " << maxSaliency; // select a new view if saliency is bigger than threshold (which converges towards 0 over time) - int timeSinceLastViewChange = (IceUtil::Time::now() - timeOfLastViewChange).toMilliSeconds(); + int timeSinceLastViewChange = (armarx::TimeUtil::GetTime() - timeOfLastViewChange).toMilliSeconds(); float saliencyThreshold = 0; if (timeSinceLastViewChange > 0) @@ -182,7 +185,7 @@ ViewTargetBasePtr ViewSelection::nextAutomaticViewTarget() ViewTargetBasePtr viewTarget = new ViewTargetBase(); viewTarget->priority = armarx::DEFAULT_VIEWTARGET_PRIORITY; // * maxSaliency; - viewTarget->timeAdded = new TimestampVariant(IceUtil::Time::now()); + viewTarget->timeAdded = new TimestampVariant(armarx::TimeUtil::GetTime()); viewTarget->target = viewTargetPositionPtr; viewTarget->duration = 0; @@ -242,8 +245,7 @@ void ViewSelection::process() ARMARX_INFO << "Looking at target " << viewTargetPositionPtr->output(); headIKUnitProxy->setHeadTarget(headIKKinematicChainName, viewTargetPositionPtr); - timeOfLastViewChange = IceUtil::Time::now(); - + timeOfLastViewChange = armarx::TimeUtil::GetTime(); float duration = viewTarget->duration; if (!viewTarget->duration) @@ -310,11 +312,11 @@ ViewTargetList ViewSelection::getManualViewTargets(const Ice::Current& c) -void armarx::ViewSelection::updateSaliencyMap(const string& name, const FloatSequence& map, const Ice::Current&) +void armarx::ViewSelection::updateSaliencyMap(const SaliencyMapBasePtr& map, const Ice::Current&) { boost::mutex::scoped_lock lock(manualViewTargetsMutex); - saliencyMaps[name] = map; + saliencyMaps[map->name] = map; } diff --git a/source/RobotAPI/components/ViewSelection/ViewSelection.h b/source/RobotAPI/components/ViewSelection/ViewSelection.h index ce8977b57..40d200901 100644 --- a/source/RobotAPI/components/ViewSelection/ViewSelection.h +++ b/source/RobotAPI/components/ViewSelection/ViewSelection.h @@ -28,6 +28,7 @@ #include <ArmarXCore/core/Component.h> +#include <ArmarXCore/core/time/TimeUtil.h> #include <ArmarXCore/observers/variant/TimestampVariant.h> #include <ArmarXCore/core/services/tasks/RunningTask.h> @@ -164,7 +165,7 @@ namespace armarx doAutomaticViewSelection = false; } - void updateSaliencyMap(const string& name, const FloatSequence& map, const Ice::Current& c = ::Ice::Current()); + void updateSaliencyMap(const SaliencyMapBasePtr& map, const Ice::Current& c = ::Ice::Current()); private: @@ -197,7 +198,7 @@ namespace armarx Eigen::Vector3f offsetToHeadCenter; - std::map<std::string, std::vector<float>> saliencyMaps; + std::map<std::string, SaliencyMapBasePtr> saliencyMaps; }; diff --git a/source/RobotAPI/interface/components/ViewSelectionInterface.ice b/source/RobotAPI/interface/components/ViewSelectionInterface.ice index 7521a30c8..52c991bd7 100755 --- a/source/RobotAPI/interface/components/ViewSelectionInterface.ice +++ b/source/RobotAPI/interface/components/ViewSelectionInterface.ice @@ -52,6 +52,20 @@ module armarx string source; }; + + + ["cpp:virtual"] + class SaliencyMapBase + { + string name; + + FloatSequence map; + + TimestampBase validUntil; + + TimestampBase timeAdded; + }; + sequence<ViewTargetBase> ViewTargetList; interface ViewSelectionInterface @@ -63,7 +77,7 @@ module armarx void activateAutomaticViewSelection(); void deactivateAutomaticViewSelection(); - void updateSaliencyMap(string name, FloatSequence map); + void updateSaliencyMap(SaliencyMapBase map); }; -- GitLab