8#include <Eigen/Geometry>
16#include <ArmarXCore/interface/observers/ObserverInterface.h>
38 poseSegment(poseSegment),
39 faceRecognitionSegment(faceRecognitionSegment),
40 personInstanceSegment(personInstanceSegment)
48 defs->optional(p.enabled, prefix +
"enabled",
"Enable or disable visualization of humans.");
49 defs->optional(p.frequencyHz, prefix +
"frequenzyHz",
"Frequency of visualization.");
64 bool batchMode =
true;
80 const std::vector<armarx::armem::human::HumanPose>& humanPoses)
82 std::string providerName =
"azure_kinect";
84 std::map<std::string, armarx::armem::human::HumanPose> poseMap;
88 if (humanPose.humanTrackingId.has_value())
90 poseMap[humanPose.humanTrackingId.value()] = humanPose;
95 poseMap[
"unknown_human_" + std::to_string(unknown++)] = humanPose;
103 Visu::visualizeFaceRecognitions(
105 const std::vector<armarx::armem::human::FaceRecognition>& faceRecognitions)
107 std::string providerName =
"azure_kinect";
109 std::map<std::string, armarx::armem::human::FaceRecognition> faceRecognitionMap;
113 if (faceRecognition.profileID.has_value())
115 faceRecognitionMap[faceRecognition.profileID.value().entityName] = faceRecognition;
120 faceRecognitionMap[
"unknown_face_" + std::to_string(unknown++)] = faceRecognition;
123 if (faceRecognitionMap.size() == 0)
129 faceRecognitionLayer,
134 Visu::visualizePersonInstances(
135 armarx::viz::Layer& personInstanceLayer,
136 const std::vector<armarx::armem::human::PersonInstance>& personInstances)
138 std::string providerName =
"person_instanciator";
140 std::map<std::string, armarx::armem::human::PersonInstance> personInstanceMap;
141 for (
const armarx::armem::human::PersonInstance& personInstance : personInstances)
143 personInstanceMap[personInstance.profileID.entityName] = personInstance;
145 if (personInstanceMap.empty())
149 for (
const auto& [name, personInstance] : personInstanceMap)
165 while (updateTask and not updateTask->isStopped())
176 catch (
const std::exception& e)
178 ARMARX_WARNING <<
"Caught exception while visualizing robots: \n" << e.what();
182 ARMARX_WARNING <<
"Caught unknown exception while visualizing robots.";
185 if (debugObserver.has_value())
187 debugObserver->sendDebugObserverBatch();
190 metronome.waitForNextTick();
207 const std::map<std::string, std::vector<armarx::armem::human::HumanPose>>
208 humanPosesPerProvider = poseSegment.getHumanPoseEntities(maxAge);
209 const std::map<std::string, std::vector<armarx::armem::human::FaceRecognition>>
210 faceRecognitionsPerProvider = faceRecognitionSegment.getFaceRecognitionEntities(maxAge);
211 const std::map<std::string, std::vector<armarx::armem::human::PersonInstance>>
212 personInstancesPerProvider = personInstanceSegment.getPersonInstanceEntities(maxAge);
220 std::vector<viz::Layer> providerLayers;
221 for (
const auto& [providerName, humanPoses] : humanPosesPerProvider)
223 viz::Layer layerSkeleton = arviz.layer(
"HumanPoses_" + providerName);
224 viz::Layer layerFrames = arviz.layer(
"HumanPoses_" + providerName +
"_Frames");
225 armarx::viz::HumanPoseLayers layers{.skeleton = layerSkeleton, .frames = layerFrames};
227 visualizeHumanPoses(layers, humanPoses);
228 providerLayers.push_back(layerSkeleton);
229 providerLayers.push_back(layerFrames);
231 for (
const auto& [providerName, faceRecognitions] : faceRecognitionsPerProvider)
233 viz::Layer faceRecognitionLayer = arviz.layer(
"FaceRecognitions_" + providerName);
234 visualizeFaceRecognitions(faceRecognitionLayer, faceRecognitions);
235 providerLayers.push_back(faceRecognitionLayer);
237 for (
const auto& [providerName, personInstances] : personInstancesPerProvider)
239 viz::Layer personInstanceLayer = arviz.layer(
"PersonInstances_" + providerName);
240 visualizePersonInstances(personInstanceLayer, personInstances);
241 providerLayers.push_back(personInstanceLayer);
250 arviz.commit(providerLayers);
255 if (debugObserver.has_value())
257 const std::string p =
"Visu | ";
258 debugObserver->setDebugObserverDatafield(p +
"t Total (ms)",
259 tVisuTotal.toMilliSecondsDouble());
260 debugObserver->setDebugObserverDatafield(p +
"t 1 Get Data (ms)",
261 tVisuGetData.toMilliSecondsDouble());
262 debugObserver->setDebugObserverDatafield(p +
"t 1.1 Descriptions (ms)",
263 tRobotDescriptions.toMilliSecondsDouble());
265 debugObserver->setDebugObserverDatafield(p +
"t 2 Build Layers (ms)",
266 tVisuBuildLayers.toMilliSecondsDouble());
267 debugObserver->setDebugObserverDatafield(p +
"t 3 Commit (ms)",
268 tVisuCommit.toMilliSecondsDouble());
Brief description of class DebugObserverHelper.
static Frequency Hertz(std::int64_t hertz)
void setTag(const LogTag &tag)
void defineProperties(armarx::PropertyDefinitionsPtr defs, const std::string &prefix="visu.")
Visu(const PoseSegment &poseSegment, const FaceRecognitionSegment &faceRecognitionSegment, const PersonInstanceSegment &personInstanceSegment)
void connect(const viz::Client &arviz, DebugObserverInterfacePrx debugObserver=nullptr)
static Duration MilliSeconds(std::int64_t milliSeconds)
Constructs a duration in milliseconds.
#define ARMARX_DEBUG
The logging level for output that is only interesting while debugging.
#define ARMARX_WARNING
The logging level for unexpected behaviour, but not a serious problem.
#define ARMARX_VERBOSE
The logging level for verbose information.
#define TIMING_START(name)
Helper macro to do timing tests.
#define TIMING_END_STREAM(name, os)
Prints duration.
facerecog::Segment FaceRecognitionSegment
armarx::core::time::DateTime Time
armarx::core::time::Duration Duration
std::string toStringMilliSeconds(const Time &time, int decimals=3)
Returns time as e.g.
void addFaceRecognitionsToLayer(const std::map< std::string, armarx::armem::human::FaceRecognition > &faceRecognitions, armarx::viz::Layer &faceRecognitionLayer, const std::string &prefix)
void addPosesToLayer(const std::map< std::string, armarx::armem::human::HumanPose > &poses, HumanPoseLayers &layers, const std::string &prefix, const DrawingStyle &drawingStyle=DrawingStyle())
void addPersonInstanceToLayer(const armarx::armem::human::FaceRecognition &faceReco, const std::string &name, armarx::viz::Layer &personInstanceLayer, const std::string &prefix)
::IceInternal::ProxyHandle<::IceProxy::armarx::DebugObserverInterface > DebugObserverInterfacePrx
IceUtil::Handle< class PropertyDefinitionContainer > PropertyDefinitionsPtr
PropertyDefinitions smart pointer type.
SimpleRunningTask(Ts...) -> SimpleRunningTask< std::function< void(void)> >