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
30using namespace armarx;
31using 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
82armarx::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
92float
93armarx::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
101Eigen::Vector3f
102armarx::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
126void
128 const armarx::VariantBasePtr& value,
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}
std::string timestamp()
constexpr T c
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,...
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
MedianDerivativeFilterV3(std::size_t offsetWindowSize=1001, std::size_t windowSize=11)
VariantBasePtr calculate(const Ice::Current &c) const override
void update(Ice::Long timestamp, const VariantBasePtr &value, const Ice::Current &c) override
ParameterTypeList getSupportedTypes(const Ice::Current &c) const override
This filter supports: Vector3, FramedDirection, FramedPosition.
MedianFilter(int windowSize=11)
ParameterTypeList getSupportedTypes(const Ice::Current &c=Ice::emptyCurrent) const override
This filter supports: Int, Long, Float, Double.
#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 Vector3
Definition Pose.h:38
This file offers overloads of toIce() and fromIce() functions for STL container types.
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
Eigen::Vector3f toEigen(const pcl::PointXYZ &pt)