PoseMedianFilter.cpp
Go to the documentation of this file.
1#include "PoseMedianFilter.h"
2
4
5#include <RobotAPI/interface/core/PoseBase.h>
7
8namespace 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
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
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
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
constexpr T c
TimeVariantBaseMap dataHistory
FramedDirection is a 3 dimensional direction vector with a reference frame.
Definition FramedPose.h:87
The FramedPosition class.
Definition FramedPose.h:158
The Variant class is described here: Variants.
Definition Variant.h:224
The Vector3 class.
Definition Pose.h:113
virtual Eigen::Vector3f toEigen() const
Definition Pose.cpp:134
VariantBasePtr calculate(const Ice::Current &c=Ice::emptyCurrent) const override
ParameterTypeList getSupportedTypes(const Ice::Current &c=Ice::emptyCurrent) const override
This filter supports: Int, Long, Float, Double.
ParameterTypeList getSupportedTypes(const Ice::Current &c) const override
This filter supports: Vector3, FramedDirection, FramedPosition.
VariantBasePtr calculate(const Ice::Current &c) const override
#define ARMARX_WARNING_S
The logging level for unexpected behaviour, but not a serious problem.
Definition Logging.h:213
const VariantTypeId FramedPosition
Definition FramedPose.h:38
const VariantTypeId FramedDirection
Definition FramedPose.h:37
const VariantTypeId Int
Definition Variant.h:917
const VariantTypeId Vector3
Definition Pose.h:38
const VariantTypeId Double
Definition Variant.h:920
IceInternal::Handle< Vector3 > Vector3Ptr
Definition Pose.h:165
IceInternal::Handle< FramedDirection > FramedDirectionPtr
Definition FramedPose.h:84
IceInternal::Handle< Variant > VariantPtr
Definition Variant.h:41
IceInternal::Handle< FramedPosition > FramedPositionPtr
Definition FramedPose.h:149
Ice::Int VariantTypeId
Definition Variant.h:43
::IceInternal::Handle<::armarx::VariantBase > VariantBasePtr