From f52fe7f01b850da8d261c10e83afd87fe2efb672 Mon Sep 17 00:00:00 2001 From: David <david.schiebener@kit.edu> Date: Tue, 10 Nov 2015 17:12:37 +0100 Subject: [PATCH] fixed initial value bug --- source/RobotAPI/libraries/core/CMakeLists.txt | 1 + .../PoseMedianOffsetFilter.cpp | 110 ++++++++++++++++++ .../observerfilters/PoseMedianOffsetFilter.h | 104 +---------------- 3 files changed, 117 insertions(+), 98 deletions(-) create mode 100644 source/RobotAPI/libraries/core/observerfilters/PoseMedianOffsetFilter.cpp diff --git a/source/RobotAPI/libraries/core/CMakeLists.txt b/source/RobotAPI/libraries/core/CMakeLists.txt index 27d230c5c..dce297b52 100644 --- a/source/RobotAPI/libraries/core/CMakeLists.txt +++ b/source/RobotAPI/libraries/core/CMakeLists.txt @@ -27,6 +27,7 @@ set(LIB_FILES LinkedPose.cpp RobotStatechartContext.cpp checks/ConditionCheckMagnitudeChecks.cpp + observerfilters/PoseMedianOffsetFilter.cpp RobotAPIObjectFactories.cpp remoterobot/RobotStateObserver.cpp remoterobot/RemoteRobot.cpp diff --git a/source/RobotAPI/libraries/core/observerfilters/PoseMedianOffsetFilter.cpp b/source/RobotAPI/libraries/core/observerfilters/PoseMedianOffsetFilter.cpp new file mode 100644 index 000000000..7e516f717 --- /dev/null +++ b/source/RobotAPI/libraries/core/observerfilters/PoseMedianOffsetFilter.cpp @@ -0,0 +1,110 @@ +#include "PoseMedianOffsetFilter.h" + +using namespace armarx; +using namespace filters; + +armarx::filters::PoseMedianOffsetFilter::PoseMedianOffsetFilter(int windowSize) + : MedianFilter(windowSize) +{ + this->windowFilterSize = windowSize; + this->dataIndex = -windowSize; + this->offset = Eigen::Vector3f::Zero(); + this->currentValue = Eigen::Vector3f::Zero(); +} + +armarx::VariantBasePtr armarx::filters::PoseMedianOffsetFilter::calculate(const Ice::Current& c) const +{ + if (dataHistory.size() == 0) + { + return NULL; + } + + VariantPtr var = VariantPtr::dynamicCast(dataHistory.begin()->second); + VariantTypeId type = var->getType(); + + if (type == VariantType::Vector3) + { + Vector3Ptr vecVar = new Vector3(currentValue); + return new Variant(vecVar); + } + else if (type == VariantType::FramedDirection) + { + FramedDirectionPtr p = var->get<FramedDirection>(); + FramedDirectionPtr vecVar = new FramedDirection(currentValue, p->frame, p->agent); + return new Variant(vecVar); + } + else if (type == VariantType::FramedPosition) + { + FramedPositionPtr p = var->get<FramedPosition>(); + FramedPositionPtr vecVar = new FramedPosition(currentValue, p->frame, p->agent); + return new Variant(vecVar); + } + else + { + ARMARX_WARNING_S << "Unsupported Variant Type: " << var->getTypeName(); + return NULL; + } + +} + +armarx::ParameterTypeList armarx::filters::PoseMedianOffsetFilter::getSupportedTypes(const Ice::Current& c) const +{ + ParameterTypeList result = MedianFilter::getSupportedTypes(c); + result.push_back(VariantType::Vector3); + result.push_back(VariantType::FramedDirection); + result.push_back(VariantType::FramedPosition); + return result; +} + +float armarx::filters::PoseMedianOffsetFilter::median(std::vector<float>& values) +{ + std::sort(values.begin(), values.end()); + return values.size() % 2 == 0 ? (values.at(values.size() / 2 - 1) + values.at(values.size() / 2)) / 2 : values.at(values.size() / 2); +} + +Eigen::Vector3f armarx::filters::PoseMedianOffsetFilter::calculateMedian() +{ + Eigen::Vector3f result; + for (int i = 0; i < 3; ++i) + { + std::vector<float> values; + values.reserve(data.size()); + + for (const Eigen::Vector3f& v : data) + { + values.push_back(v(i)); + } + result(i) = median(values); + } + return result; +} + +void armarx::filters::PoseMedianOffsetFilter::update(Ice::Long timestamp, const armarx::VariantBasePtr& value, const Ice::Current& c) +{ + VariantTypeId type = value->getType(); + if (type == VariantType::Vector3 || type == VariantType::FramedDirection || type == VariantType::FramedPosition) + { + Eigen::Vector3f currentValue = VariantPtr::dynamicCast(value)->get<Vector3>()->toEigen(); + if (dataIndex < 0) + { + data.push_back(currentValue); + this->currentValue = Eigen::Vector3f::Zero(); + dataIndex++; + if (dataIndex == 0) + { + offset = calculateMedian(); + } + } + else + { + data.at(dataIndex) = currentValue; + dataIndex = (dataIndex + 1) % windowFilterSize; + this->currentValue = calculateMedian() - offset; + } + } + else + { + ARMARX_WARNING_S << "Unsupported Variant Type: " << value->getTypeName(); + } + DatafieldFilter::update(timestamp, value, c); +} diff --git a/source/RobotAPI/libraries/core/observerfilters/PoseMedianOffsetFilter.h b/source/RobotAPI/libraries/core/observerfilters/PoseMedianOffsetFilter.h index 749c017da..dc90a1085 100644 --- a/source/RobotAPI/libraries/core/observerfilters/PoseMedianOffsetFilter.h +++ b/source/RobotAPI/libraries/core/observerfilters/PoseMedianOffsetFilter.h @@ -22,61 +22,17 @@ namespace armarx public MedianFilter { public: - PoseMedianOffsetFilter(int windowSize = 11) - { - this->windowFilterSize = windowSize; - this->dataIndex = -windowSize; - } + PoseMedianOffsetFilter(int windowSize = 11); // DatafieldFilterBase interface public: - VariantBasePtr calculate(const Ice::Current& c) const - { - if (dataHistory.size() == 0) - { - return NULL; - } - - VariantPtr var = VariantPtr::dynamicCast(dataHistory.begin()->second); - VariantTypeId type = var->getType(); - - if (type == VariantType::Vector3) - { - Vector3Ptr vecVar = new Vector3(currentValue); - return new Variant(vecVar); - } - else if (type == VariantType::FramedDirection) - { - FramedDirectionPtr p = var->get<FramedDirection>(); - FramedDirectionPtr vecVar = new FramedDirection(currentValue, p->frame, p->agent); - return new Variant(vecVar); - } - else if (type == VariantType::FramedPosition) - { - FramedPositionPtr p = var->get<FramedPosition>(); - FramedPositionPtr vecVar = new FramedPosition(currentValue, p->frame, p->agent); - return new Variant(vecVar); - } - else - { - ARMARX_WARNING_S << "Unsupported Variane Type: " << var->getTypeName(); - return NULL; - } - - } + VariantBasePtr calculate(const Ice::Current& c) const; /** * @brief This filter supports: Vector3, FramedDirection, FramedPosition * @return List of VariantTypes */ - ParameterTypeList getSupportedTypes(const Ice::Current& c) const - { - ParameterTypeList result = MedianFilter::getSupportedTypes(c); - result.push_back(VariantType::Vector3); - result.push_back(VariantType::FramedDirection); - result.push_back(VariantType::FramedPosition); - return result; - } + ParameterTypeList getSupportedTypes(const Ice::Current& c) const; private: Eigen::Vector3f offset; @@ -84,59 +40,11 @@ namespace armarx std::vector<Eigen::Vector3f> data; int dataIndex; - float median(std::vector<float>& values) - { - std::sort(values.begin(), values.end()); - return values.size() % 2 == 0 ? (values.at(values.size() / 2 - 1) + values.at(values.size() / 2)) / 2 : values.at(values.size() / 2); - } - - Eigen::Vector3f calculateMedian() - { - Eigen::Vector3f result; - for (int i = 0; i < 3; ++i) - { - std::vector<float> values; - values.reserve(data.size()); - - for (const Eigen::Vector3f& v : data) - { - values.push_back(v(i)); - } - result(i) = median(values); - } - return result; - } + float median(std::vector<float>& values); + Eigen::Vector3f calculateMedian(); public: - void update(Ice::Long timestamp, const VariantBasePtr& value, const Ice::Current& c) - { - DatafieldFilter::update(timestamp, value, c); - VariantTypeId type = value->getType(); - if (type == VariantType::Vector3 || type == VariantType::FramedDirection || type == VariantType::FramedPosition) - { - Eigen::Vector3f currentValue = VariantPtr::dynamicCast(value)->get<Vector3>()->toEigen(); - if (dataIndex < 0) - { - data.push_back(currentValue); - this->currentValue == Eigen::Vector3f::Zero(); - dataIndex++; - if (dataIndex == 0) - { - offset = calculateMedian(); - } - } - else - { - data.at(dataIndex) = currentValue; - dataIndex = (dataIndex + 1) % windowFilterSize; - this->currentValue = calculateMedian() - offset; - } - } - else - { - ARMARX_WARNING_S << "Unsupported Variane Type: " << value->getTypeName(); - } - } + void update(Ice::Long timestamp, const VariantBasePtr& value, const Ice::Current& c); }; -- GitLab