PoseMedianFilter.cpp
Go to the documentation of this file.
1 #include "PoseMedianFilter.h"
2 
4 
5 #include <RobotAPI/interface/core/PoseBase.h>
7 
8 namespace armarx::filters
9 {
10 
12  {
13  this->windowFilterSize = windowSize;
14  }
15 
17  PoseMedianFilter::calculate(const Ice::Current& c) const
18  {
19  std::unique_lock lock(historyMutex);
20 
21  if (dataHistory.size() == 0)
22  {
23  return nullptr;
24  }
25 
26  VariantTypeId type = dataHistory.begin()->second->getType();
27 
28  if (type == VariantType::Vector3 or type == VariantType::FramedDirection or
30  {
31  Eigen::Vector3f vec;
32  vec.setZero();
33  std::string frame = "";
34  std::string agent = "";
35  VariantPtr var = VariantPtr::dynamicCast(dataHistory.begin()->second);
36 
37  if (type == VariantType::FramedDirection)
38  {
39  FramedDirectionPtr p = var->get<FramedDirection>();
40  frame = p->frame;
41  agent = p->agent;
42  }
43  else if (type == VariantType::FramedPosition)
44  {
45  FramedPositionPtr p = var->get<FramedPosition>();
46  frame = p->frame;
47  agent = p->agent;
48  }
49 
50  for (int i = 0; i < 3; ++i)
51  {
52  std::vector<double> values;
53 
54  for (auto v : dataHistory)
55  {
56  VariantPtr v2 = VariantPtr::dynamicCast(v.second);
57  values.push_back(v2->get<Vector3>()->toEigen()[i]);
58  }
59 
60  std::sort(values.begin(), values.end());
61  vec[i] = values.at(values.size() / 2);
62  }
63 
64  if (type == VariantType::Vector3)
65  {
66  Vector3Ptr vecVar = new Vector3(vec);
67  return new Variant(vecVar);
68  }
69  else if (type == VariantType::FramedDirection)
70  {
71 
72  FramedDirectionPtr vecVar = new FramedDirection(vec, frame, agent);
73  return new Variant(vecVar);
74  }
75  else if (type == VariantType::FramedPosition)
76  {
77  FramedPositionPtr vecVar = new FramedPosition(vec, frame, agent);
78  return new Variant(vecVar);
79  }
80  else
81  {
82  ARMARX_WARNING_S << "Implementation missing here";
83  return nullptr;
84  }
85  }
86  else if (type == VariantType::Double)
87  {
88  // auto values = SortVariants<double>(dataHistory);
89  // return new Variant(values.at(values.size()/2));
90  }
91  else if (type == VariantType::Int)
92  {
93  // auto values = SortVariants<int>(dataHistory);
94  // return new Variant(values.at(values.size()/2));
95  }
96 
97  return MedianFilter::calculate(c);
98  }
99 
100  ParameterTypeList
101  PoseMedianFilter::getSupportedTypes(const Ice::Current& c) const
102  {
103  ParameterTypeList result = MedianFilter::getSupportedTypes(c);
104  result.push_back(VariantType::Vector3);
105  result.push_back(VariantType::FramedDirection);
106  result.push_back(VariantType::FramedPosition);
107  return result;
108  }
109 
110 } // namespace armarx::filters
armarx::Variant
The Variant class is described here: Variants.
Definition: Variant.h:223
armarx::filters::PoseMedianFilter::PoseMedianFilter
PoseMedianFilter(int windowSize=11)
Definition: PoseMedianFilter.cpp:11
ProsthesisInterface.values
values
Definition: ProsthesisInterface.py:190
armarx::VariantType::Vector3
const VariantTypeId Vector3
Definition: Pose.h:38
c
constexpr T c
Definition: UnscentedKalmanFilterTest.cpp:46
PoseMedianFilter.h
IceInternal::Handle<::armarx::VariantBase >
armarx::filters
Definition: AverageFilter.h:32
armarx::VariantType::Double
const VariantTypeId Double
Definition: Variant.h:920
armarx::filters::MedianFilter::getSupportedTypes
ParameterTypeList getSupportedTypes(const Ice::Current &c=Ice::emptyCurrent) const override
This filter supports: Int, Long, Float, Double.
Definition: MedianFilter.cpp:69
FramedPose.h
armarx::FramedPosition
The FramedPosition class.
Definition: FramedPose.h:157
armarx::Vector3
The Vector3 class.
Definition: Pose.h:112
armarx::VariantTypeId
Ice::Int VariantTypeId
Definition: Variant.h:43
ARMARX_WARNING_S
#define ARMARX_WARNING_S
Definition: Logging.h:213
armarx::ctrlutil::v
double v(double t, double v0, double a0, double j)
Definition: CtrlUtil.h:39
armarx::FramedDirection
FramedDirection is a 3 dimensional direction vector with a reference frame. The reference frame can b...
Definition: FramedPose.h:86
armarx::DatafieldFilter::dataHistory
TimeVariantBaseMap dataHistory
Definition: DatafieldFilter.h:83
armarx::VariantType::FramedDirection
const VariantTypeId FramedDirection
Definition: FramedPose.h:37
armarx::Vector3::toEigen
virtual Eigen::Vector3f toEigen() const
Definition: Pose.cpp:134
armarx::filters::PoseMedianFilter::getSupportedTypes
ParameterTypeList getSupportedTypes(const Ice::Current &c) const override
This filter supports: Vector3, FramedDirection, FramedPosition.
Definition: PoseMedianFilter.cpp:101
armarx::DatafieldFilter::historyMutex
std::mutex historyMutex
Definition: DatafieldFilter.h:84
memoryx::KBM::Vector3
Eigen::Vector3d Vector3
Definition: kbm.h:43
armarx::VariantType::Int
const VariantTypeId Int
Definition: Variant.h:917
armarx::filters::MedianFilter::calculate
VariantBasePtr calculate(const Ice::Current &c=Ice::emptyCurrent) const override
Definition: MedianFilter.cpp:34
armarx::filters::PoseMedianFilter::calculate
VariantBasePtr calculate(const Ice::Current &c) const override
Definition: PoseMedianFilter.cpp:17
Logging.h
armarx::VariantType::FramedPosition
const VariantTypeId FramedPosition
Definition: FramedPose.h:38