MedianDerivativeFilterV3.cpp
Go to the documentation of this file.
1 /*
2  * This file is part of ArmarX.
3  *
4  * Copyright (C) 2011-2016, High Performance Humanoid Technologies (H2T), Karlsruhe Institute of Technology (KIT), all rights reserved.
5  *
6  * ArmarX is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License version 2 as
8  * published by the Free Software Foundation.
9  *
10  * ArmarX is distributed in the hope that it will be useful, but
11  * WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program. If not, see <http://www.gnu.org/licenses/>.
17  *
18  * @package
19  * @author
20  * @date
21  * @copyright http://www.gnu.org/licenses/gpl-2.0.txt
22  * GNU General Public License
23  */
24 
26 
28 
29 
30 using namespace armarx;
31 using namespace filters;
32 
34  std::size_t windowSize) :
35  MedianFilter(windowSize)
36 {
37  this->valueIndex = 0;
38  this->offsetIndex = 0;
39  this->currentValue = Eigen::Vector3f::Zero();
40  this->currentOffset = Eigen::Vector3f::Zero();
41 
42  this->offsetWindowSize = offsetWindowSize;
43 }
44 
47 {
48  std::unique_lock lock(historyMutex);
49 
50  if (dataHistory.size() == 0)
51  {
52  return NULL;
53  }
54 
55  VariantPtr var = VariantPtr::dynamicCast(dataHistory.begin()->second);
56  VariantTypeId type = var->getType();
57 
58  if (type == VariantType::Vector3)
59  {
60  Vector3Ptr vecVar = new Vector3(currentValue);
61  return new Variant(vecVar);
62  }
63  else if (type == VariantType::FramedDirection)
64  {
65  FramedDirectionPtr p = var->get<FramedDirection>();
66  FramedDirectionPtr vecVar = new FramedDirection(currentValue, p->frame, p->agent);
67  return new Variant(vecVar);
68  }
69  else if (type == VariantType::FramedPosition)
70  {
71  FramedPositionPtr p = var->get<FramedPosition>();
72  FramedPositionPtr vecVar = new FramedPosition(currentValue, p->frame, p->agent);
73  return new Variant(vecVar);
74  }
75  else
76  {
77  ARMARX_WARNING_S << "Unsupported Variant Type: " << var->getTypeName();
78  return NULL;
79  }
80 }
81 
82 armarx::ParameterTypeList
84 {
85  ParameterTypeList result = MedianFilter::getSupportedTypes(c);
86  result.push_back(VariantType::Vector3);
87  result.push_back(VariantType::FramedDirection);
88  result.push_back(VariantType::FramedPosition);
89  return result;
90 }
91 
92 float
93 armarx::filters::MedianDerivativeFilterV3::median(std::vector<float>& values)
94 {
95  std::sort(values.begin(), values.end());
96  return values.size() % 2 == 0
97  ? (values.at(values.size() / 2 - 1) + values.at(values.size() / 2)) / 2
98  : values.at(values.size() / 2);
99 }
100 
101 Eigen::Vector3f
102 armarx::filters::MedianDerivativeFilterV3::calculateMedian(const std::vector<Eigen::Vector3f>& data)
103 {
104  // increase cache-efficiency by iterating over data one time, storing all three vectors
105  std::vector<float> values[3];
106  for (int i = 0; i < 3; ++i)
107  {
108  values[i].reserve(data.size());
109  }
110  for (const Eigen::Vector3f& v : data)
111  {
112  for (int i = 0; i < 3; ++i)
113  {
114  values[i].push_back(v(i));
115  }
116  }
117 
118  Eigen::Vector3f result;
119  for (int i = 0; i < 3; ++i)
120  {
121  result(i) = median(values[i]);
122  }
123  return result;
124 }
125 
126 void
129  const Ice::Current& c)
130 {
131  VariantTypeId type = value->getType();
132  if (type == VariantType::Vector3 || type == VariantType::FramedDirection ||
134  {
135  Eigen::Vector3f inputValue = VariantPtr::dynamicCast(value)->get<Vector3>()->toEigen();
136 
137  bool offsetValid = false;
138  if (offsetData.size() < unsigned(offsetWindowSize))
139  {
140  offsetData.push_back(inputValue);
141  }
142  else
143  {
144  offsetData[offsetIndex] = inputValue;
145  offsetIndex = (offsetIndex + 1) % offsetWindowSize;
146  this->currentOffset = calculateMedian(offsetData);
147  offsetValid = true;
148  }
149 
150  if (valueData.size() < unsigned(windowFilterSize))
151  {
152  valueData.push_back(inputValue);
153  }
154  else
155  {
156  valueData[valueIndex] = inputValue;
157  valueIndex = (valueIndex + 1) % windowFilterSize;
158  }
159 
160  // Keep currentValue at zero while currentOffset is invalid.
161  if (offsetValid)
162  {
163  // otherwise, compute it
164  this->currentValue = calculateMedian(valueData) - currentOffset;
165  }
166  }
167  else
168  {
169  ARMARX_WARNING_S << "Unsupported Variant Type: " << value->getTypeName();
170  }
172 }
armarx::Variant
The Variant class is described here: Variants.
Definition: Variant.h:223
armarx::filters::MedianDerivativeFilterV3::getSupportedTypes
ParameterTypeList getSupportedTypes(const Ice::Current &c) const override
This filter supports: Vector3, FramedDirection, FramedPosition.
Definition: MedianDerivativeFilterV3.cpp:83
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
IceInternal::Handle<::armarx::VariantBase >
armarx::DatafieldFilter::update
void update(Ice::Long timestamp, const VariantBasePtr &value, const Ice::Current &c=Ice::emptyCurrent) override
Adds the given value to the data map, erases old values if maximum size was reached,...
Definition: DatafieldFilter.cpp:41
armarx::filters::MedianFilter
The MedianFilter class provides an implementation for a median for datafields of type float,...
Definition: MedianFilter.h:47
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
cxxopts::value
std::shared_ptr< Value > value()
Definition: cxxopts.hpp:855
MedianDerivativeFilterV3.h
armarx::toEigen
Eigen::Vector3f toEigen(const pcl::PointXYZ &pt)
Definition: PointToModelICP.h:67
armarx::filters::MedianDerivativeFilterV3::update
void update(Ice::Long timestamp, const VariantBasePtr &value, const Ice::Current &c) override
Definition: MedianDerivativeFilterV3.cpp:127
data
uint8_t data[1]
Definition: EtherCATFrame.h:68
armarx::FramedPosition
The FramedPosition class.
Definition: FramedPose.h:157
armarx::filters::MedianDerivativeFilterV3::calculate
VariantBasePtr calculate(const Ice::Current &c) const override
Definition: MedianDerivativeFilterV3.cpp:46
armarx::Vector3
The Vector3 class.
Definition: Pose.h:112
armarx::VariantType::Long
const VariantTypeId Long
Definition: Variant.h:918
timestamp
std::string timestamp()
Definition: CartographerAdapter.cpp:85
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::VariantType::FramedDirection
const VariantTypeId FramedDirection
Definition: FramedPose.h:37
memoryx::KBM::Vector3
Eigen::Vector3d Vector3
Definition: kbm.h:43
Logging.h
armarx::VariantType::FramedPosition
const VariantTypeId FramedPosition
Definition: FramedPose.h:38
armarx
This file offers overloads of toIce() and fromIce() functions for STL container types.
Definition: ArmarXTimeserver.cpp:27
armarx::filters::MedianDerivativeFilterV3::MedianDerivativeFilterV3
MedianDerivativeFilterV3(std::size_t offsetWindowSize=1001, std::size_t windowSize=11)
Definition: MedianDerivativeFilterV3.cpp:33