Visualization.cpp
Go to the documentation of this file.
1 #include "Visualization.h"
2 
3 #include <algorithm>
4 #include <exception>
5 #include <string>
6 
7 #include <Eigen/Geometry>
8 
9 #include <SimoxUtility/algorithm/get_map_keys_values.h>
10 #include <SimoxUtility/math/pose.h>
11 
16 #include <ArmarXCore/interface/core/PackagePath.h>
17 
23 
25 
26 
28 {
29 
30  Visu::Visu(const PoseSegment& poseSegment) : poseSegment(poseSegment)
31  {
32  Logging::setTag("HumanVisualization");
33  }
34 
35 
36  void
37  Visu::defineProperties(armarx::PropertyDefinitionsPtr defs, const std::string& prefix)
38  {
39  defs->optional(
40  p.enabled, prefix + "enabled", "Enable or disable visualization of humans.");
41  defs->optional(p.frequencyHz, prefix + "frequenzyHz", "Frequency of visualization.");
42  }
43 
44 
45  void
47  {
48  ;
49  }
50 
51 
52  void
54  {
55  this->arviz = arviz;
56  if (debugObserver)
57  {
58  bool batchMode = true;
59  this->debugObserver = DebugObserverHelper("HumanMemory", debugObserver, batchMode);
60  }
61 
62  if (updateTask)
63  {
64  updateTask->stop();
65  updateTask->join();
66  updateTask = nullptr;
67  }
68  updateTask = new SimpleRunningTask<>([this]() { this->visualizeRun(); });
69  updateTask->start();
70  }
71 
72 
73  void
74  Visu::visualizeHumanPoses(armarx::viz::HumanPoseLayers &layers,
75  const std::vector<armarx::armem::human::HumanPose>& humanPoses)
76  {
77  std::string providerName = "azure_kinect"; // TODO: Get actual value.
78 
79  std::map<std::string, armarx::armem::human::HumanPose> poseMap;
80  int unknown = 0;
81  for (const armarx::armem::human::HumanPose& humanPose : humanPoses)
82  {
83  if (humanPose.humanTrackingId.has_value())
84  {
85  poseMap[humanPose.humanTrackingId.value()] = humanPose;
86  }
87  else
88  {
89  // ARMARX_WARNING << "Found unknown human id...";
90  poseMap["unknown_human_" + std::to_string(unknown++)] = humanPose;
91  }
92  }
93 
94  armarx::viz::addPosesToLayer(poseMap, layers, providerName);
95  }
96 
97 
98  void
99  Visu::visualizeRun()
100  {
101  armarx::Metronome metronome{armarx::Frequency::Hertz(p.frequencyHz)};
102  while (updateTask and not updateTask->isStopped())
103  {
104  if (p.enabled)
105  {
106  const Time timestamp = Time::Now();
107  ARMARX_DEBUG << "Visu task at " << armem::toStringMilliSeconds(timestamp);
108 
109  try
110  {
111  visualizeOnce(timestamp);
112  }
113  catch (const std::exception& e)
114  {
115  ARMARX_WARNING << "Caught exception while visualizing robots: \n" << e.what();
116  }
117  catch (...)
118  {
119  ARMARX_WARNING << "Caught unknown exception while visualizing robots.";
120  }
121 
122  if (debugObserver.has_value())
123  {
124  debugObserver->sendDebugObserverBatch();
125  }
126  }
127  metronome.waitForNextTick();
128  }
129  }
130 
131 
132  void
133  Visu::visualizeOnce(const Time& timestamp)
134  {
135  TIMING_START(tVisuTotal);
136 
137  // TODO(fabian.reister): use timestamp
138 
139  const Duration maxAge = Duration::MilliSeconds(1000);
140 
141  // Get data.
142  TIMING_START(tVisuGetData);
143 
144  TIMING_START(tRobotDescriptions);
145  const std::map<std::string, std::vector<armarx::armem::human::HumanPose>>
146  humanPosesPerProvider = poseSegment.getHumanPoseEntities(maxAge);
147  TIMING_END_STREAM(tRobotDescriptions, ARMARX_DEBUG);
148 
149  TIMING_END_STREAM(tVisuGetData, ARMARX_DEBUG);
150 
151  // Build layers.
152  TIMING_START(tVisuBuildLayers);
153 
154  std::vector<viz::Layer> providerLayers;
155  for (const auto& [providerName, humanPoses] : humanPosesPerProvider)
156  {
157  viz::Layer layerSkeleton = arviz.layer("HumanPoses_" + providerName);
158  viz::Layer layerFrames = arviz.layer("HumanPoses_" + providerName + "_Frames");
159  armarx::viz::HumanPoseLayers layers {.skeleton = layerSkeleton, .frames = layerFrames};
160 
161  visualizeHumanPoses(layers, humanPoses);
162  providerLayers.push_back(layerSkeleton);
163  providerLayers.push_back(layerFrames);
164  }
165 
166  TIMING_END_STREAM(tVisuBuildLayers, ARMARX_DEBUG);
167 
168 
169  // Commit layers.
170 
171  ARMARX_DEBUG << "Commit visualization ...";
172  TIMING_START(tVisuCommit);
173  arviz.commit(providerLayers);
174  TIMING_END_STREAM(tVisuCommit, ARMARX_DEBUG);
175 
176  TIMING_END_STREAM(tVisuTotal, ARMARX_DEBUG);
177 
178  if (debugObserver.has_value())
179  {
180  const std::string p = "Visu | ";
181  debugObserver->setDebugObserverDatafield(p + "t Total (ms)",
182  tVisuTotal.toMilliSecondsDouble());
183  debugObserver->setDebugObserverDatafield(p + "t 1 Get Data (ms)",
184  tVisuGetData.toMilliSecondsDouble());
185  debugObserver->setDebugObserverDatafield(p + "t 1.1 Descriptions (ms)",
186  tRobotDescriptions.toMilliSecondsDouble());
187 
188  debugObserver->setDebugObserverDatafield(p + "t 2 Build Layers (ms)",
189  tVisuBuildLayers.toMilliSecondsDouble());
190  debugObserver->setDebugObserverDatafield(p + "t 3 Commit (ms)",
191  tVisuCommit.toMilliSecondsDouble());
192  }
193  }
194 
195 } // namespace armarx::armem::server::human
armarx::SimpleRunningTask
Usage:
Definition: TaskUtil.h:70
armarx::viz::Client::commit
CommitResult commit(StagedCommit const &commit)
Definition: Client.cpp:80
TIMING_START
#define TIMING_START(name)
Definition: TimeUtil.h:280
armarx::armem::server::human::PoseSegment::getHumanPoseEntities
std::map< std::string, std::vector< armarx::armem::human::HumanPose > > getHumanPoseEntities(const Duration &maxAge) const
Definition: PoseSegment.cpp:51
armarx::armem::server::human::Visu::connect
void connect(const viz::Client &arviz, DebugObserverInterfacePrx debugObserver=nullptr)
Definition: Visualization.cpp:53
armarx::core::time::DateTime::Now
static DateTime Now()
Definition: DateTime.cpp:55
armarx::viz::addPosesToLayer
void addPosesToLayer(const std::map< std::string, armarx::armem::human::HumanPose > &poses, HumanPoseLayers &layers, const std::string &prefix)
Definition: HumanPose.cpp:46
armarx::armem::server::human::PoseSegment
Definition: PoseSegment.h:37
armarx::armem::server::human::Visu::defineProperties
void defineProperties(armarx::PropertyDefinitionsPtr defs, const std::string &prefix="visu.")
Definition: Visualization.cpp:37
Elements.h
armarx::viz::HumanPoseLayers::skeleton
viz::Layer & skeleton
Definition: HumanPose.h:17
TIMING_END_STREAM
#define TIMING_END_STREAM(name, os)
Definition: TimeUtil.h:300
armarx::armem::server::human::Visu::init
void init()
Definition: Visualization.cpp:46
ARMARX_DEBUG
#define ARMARX_DEBUG
Definition: Logging.h:177
Segment.h
armarx::armem::toStringMilliSeconds
std::string toStringMilliSeconds(const Time &time, int decimals=3)
Returns time as e.g.
Definition: Time.cpp:11
Metronome.h
HumanPose.h
armarx::armem::human::HumanPose
Definition: types.h:29
armarx::armem::Time
armarx::core::time::DateTime Time
Definition: forward_declarations.h:13
armarx::to_string
const std::string & to_string(const std::string &s)
Definition: StringHelpers.h:40
CycleUtil.h
Segment.h
armarx::armem::server::human
Definition: aron_conversions.cpp:10
TimeUtil.h
Segment.h
IceUtil::Handle< class PropertyDefinitionContainer >
armarx::core::time::Metronome
Simple rate limiter for use in loops to maintain a certain frequency given a clock.
Definition: Metronome.h:35
armarx::armem::server::human::Visu::Visu
Visu(const PoseSegment &poseSegment)
Definition: Visualization.cpp:30
IceInternal::ProxyHandle<::IceProxy::armarx::DebugObserverInterface >
Time.h
armarx::core::time::Frequency::Hertz
static Frequency Hertz(std::int64_t hertz)
Definition: Frequency.cpp:23
armarx::viz::HumanPoseLayers
Definition: HumanPose.h:15
armarx::Logging::setTag
void setTag(const LogTag &tag)
Definition: Logging.cpp:55
Logging.h
ARMARX_WARNING
#define ARMARX_WARNING
Definition: Logging.h:186
armarx::viz::Client::layer
Layer layer(std::string const &name) const
Definition: Client.cpp:73
armarx::viz::Client
Definition: Client.h:109
Visualization.h
armarx::viz::Layer
Definition: Layer.h:12
armarx::DebugObserverHelper
Brief description of class DebugObserverHelper.
Definition: DebugObserverHelper.h:50
armarx::armem::Duration
armarx::core::time::Duration Duration
Definition: forward_declarations.h:14
armarx::core::time::Duration::MilliSeconds
static Duration MilliSeconds(std::int64_t milliSeconds)
Constructs a duration in milliseconds.
Definition: Duration.cpp:55