util.cpp
Go to the documentation of this file.
1 #include "util.h"
2 
3 #include <limits>
4 
5 #include <SimoxUtility/algorithm/string.h>
6 
10 
11 namespace armarx::armem::human
12 {
13 
14  std::optional<Eigen::Vector3f>
16  {
17  Eigen::Vector3f sumPosition = Eigen::Vector3f::Zero();
18  int sumWeights = 0;
19  for (const auto& [id, keypoint] : humanPose.keypoints)
20  {
21  switch (coordSystem)
22  {
23  case Camera:
24  {
25  sumPosition += keypoint.positionCamera.toEigen();
26  sumWeights += 1;
27  break;
28  }
29  case Global:
30  [[fallthrough]];
32  {
33  if (keypoint.positionGlobal)
34  {
35  sumPosition += keypoint.positionGlobal.value().toEigen();
36  sumWeights += 1;
37  }
38  break;
39  }
40  case Robot:
41  {
42  if (keypoint.positionRobot)
43  {
44  sumPosition += keypoint.positionRobot.value().toEigen();
45  sumWeights += 1;
46  }
47  break;
48  }
49  default:
50  break;
51  }
52  }
53  if (sumWeights == 0)
54  return std::nullopt;
56  sumPosition.z() = 0.0;
57  return sumPosition / sumWeights;
58  }
59 
60  std::optional<HumanPose>
61  getNearestHuman(const std::vector<HumanPose>& humanPoses,
62  const NearestHumanParameters& parameters)
63  {
64  std::optional<HumanPose> nearestHumanPose = std::nullopt;
65  double minDistance = std::numeric_limits<double>::infinity();
66  for (const HumanPose& humanPose : humanPoses)
67  {
68  if (parameters.modelIDs.empty() or parameters.modelIDs.count(humanPose.poseModelId))
69  {
70  const std::optional<Eigen::Vector3f> meanPosition =
71  computeMeanPosition(humanPose, parameters.coordSystem);
72  if (not meanPosition)
73  continue;
74  const double distance = (meanPosition.value() - parameters.positionMM).norm();
75  if (distance < minDistance)
76  {
77  minDistance = distance;
78  nearestHumanPose = humanPose;
79  }
80  }
81  }
82  if (parameters.distanceThresholdMM and minDistance > parameters.distanceThresholdMM)
83  {
84  return std::nullopt;
85  }
86  return nearestHumanPose;
87  }
88 
89  void
91  const std::string& prefix)
92  {
93  const std::string prefix_ = prefix + "nearestHuman.";
94  def->optional(
95  positionMM.x(), prefix_ + "position.x", "Anchor position (x-coordinate) in mm.");
96  def->optional(
97  positionMM.y(), prefix_ + "position.y", "Anchor position (y-coordinate) in mm.");
98  def->optional(
99  positionMM.z(), prefix_ + "position.z", "Anchor position (z-coordinate) in mm.");
100  def->optional(
101  coordSystem, prefix_ + "coordSystem", "Coordinate system of the anchor position.")
102  .map("Camera", KeyPointCoordinateSystem::Camera)
103  .map("Global", KeyPointCoordinateSystem::Global)
104  .map("GlobalFloorProjection", KeyPointCoordinateSystem::GlobalFloorProjection)
105  .map("Robot", KeyPointCoordinateSystem::Robot)
106  .setCaseInsensitive(true);
107  def->optional(distanceThresholdMM,
108  prefix_ + "distanceThreshold",
109  "Optional minimum distance threshold in mm.");
110  def->optional(
111  modelIDs, prefix_ + "allowedModelIDs", "Allowed pose model ids, seperated by commas.");
112  }
113 
114  void
116  {
120  {
122  }
123  const std::vector<std::string> ids = simox::alg::split(properties.modelIDs, ",");
124  modelIDs = std::set<std::string>(ids.begin(), ids.end());
125 
126  ARMARX_INFO << "Setting nearest human position to " << positionMM.transpose()
127  << " in frame " << coordSystem;
128  }
129 
130 } // namespace armarx::armem::human
util.h
armarx::armem::human::Camera
@ Camera
Definition: util.h:14
armarx::armem::human::KeyPointCoordinateSystem
KeyPointCoordinateSystem
Definition: util.h:12
armarx::armem::human::NearestHumanParameters::Properties::modelIDs
std::string modelIDs
Definition: util.h:31
armarx::armem::human::NearestHumanParameters
Definition: util.h:24
armarx::armem::human::NearestHumanParameters::Properties::coordSystem
KeyPointCoordinateSystem coordSystem
Definition: util.h:29
armarx::armem::human::NearestHumanParameters::Properties::addTo
void addTo(armarx::PropertyDefinitionsPtr &def, const std::string &prefix=std::string())
Definition: util.cpp:90
armarx::armem::human::NearestHumanParameters::updateFromProperties
void updateFromProperties()
Definition: util.cpp:115
armarx::armem::human::NearestHumanParameters::positionMM
Eigen::Vector3f positionMM
Definition: util.h:40
armarx::armem::human::NearestHumanParameters::Properties::distanceThresholdMM
double distanceThresholdMM
Definition: util.h:30
armarx::armem::human::Robot
@ Robot
Definition: util.h:17
armarx::armem::human::Global
@ Global
Definition: util.h:15
armarx::armem::human::NearestHumanParameters::Properties::positionMM
Eigen::Vector3f positionMM
Definition: util.h:28
armarx::armem::human::HumanPose
Definition: types.h:30
armarx::armem::human::NearestHumanParameters::modelIDs
std::set< std::string > modelIDs
Definition: util.h:43
armarx::armem::human::getNearestHuman
std::optional< HumanPose > getNearestHuman(const std::vector< HumanPose > &humanPoses, const NearestHumanParameters &parameters)
Definition: util.cpp:61
PropertyDefinition.hpp
ARMARX_INFO
#define ARMARX_INFO
Definition: Logging.h:181
PropertyDefinitionContainer.h
armarx::armem::human::GlobalFloorProjection
@ GlobalFloorProjection
Definition: util.h:16
IceUtil::Handle< class PropertyDefinitionContainer >
armarx::armem::human::NearestHumanParameters::coordSystem
KeyPointCoordinateSystem coordSystem
Definition: util.h:41
armarx::armem::human::NearestHumanParameters::properties
struct armarx::armem::human::NearestHumanParameters::Properties properties
armarx::armem::human::computeMeanPosition
std::optional< Eigen::Vector3f > computeMeanPosition(const HumanPose &humanPose, KeyPointCoordinateSystem coordSystem)
Definition: util.cpp:15
distance
double distance(const Point &a, const Point &b)
Definition: point.hpp:95
armarx::armem::human::HumanPose::keypoints
KeyPointMap keypoints
Definition: types.h:35
armarx::armem::human
Definition: aron_conversions.cpp:16
PropertyDefinition.h
armarx::armem::human::NearestHumanParameters::distanceThresholdMM
std::optional< double > distanceThresholdMM
Definition: util.h:42
armarx::split
std::vector< std::string > split(const std::string &source, const std::string &splitBy, bool trimElements=false, bool removeEmptyElements=false)
Definition: StringHelpers.cpp:38
norm
double norm(const Point &a)
Definition: point.hpp:102