diff --git a/source/RobotAPI/libraries/core/CMakeLists.txt b/source/RobotAPI/libraries/core/CMakeLists.txt index 9babf0b23f1eeae6bc2bc01e9238d93809c6c40c..206e492c5660dc1c4c50b8bdbeb069b8b35736aa 100644 --- a/source/RobotAPI/libraries/core/CMakeLists.txt +++ b/source/RobotAPI/libraries/core/CMakeLists.txt @@ -31,7 +31,9 @@ set(LIB_FILES RobotStatechartContext.cpp RobotPool.cpp checks/ConditionCheckMagnitudeChecks.cpp + observerfilters/OffsetFilter.cpp observerfilters/PoseAverageFilter.cpp + observerfilters/PoseMedianFilter.cpp observerfilters/PoseMedianOffsetFilter.cpp observerfilters/MedianDerivativeFilterV3.cpp RobotAPIObjectFactories.cpp diff --git a/source/RobotAPI/libraries/core/FramedPose.cpp b/source/RobotAPI/libraries/core/FramedPose.cpp index f8a2c3f48687c98c96b56d44cd574f07c5a5bae9..852477268e44969670b78789e31f1aae57848fac 100644 --- a/source/RobotAPI/libraries/core/FramedPose.cpp +++ b/source/RobotAPI/libraries/core/FramedPose.cpp @@ -26,11 +26,14 @@ #include <RobotAPI/libraries/core/FramedPose.h> #include <RobotAPI/libraries/core/remoterobot/RemoteRobot.h> +#include <ArmarXCore/core/logging/Logging.h> #include <VirtualRobot/Robot.h> #include <VirtualRobot/LinkedCoordinate.h> #include <VirtualRobot/VirtualRobot.h> #include <VirtualRobot/RobotConfig.h> + + using namespace Eigen; template class ::IceInternal::Handle<::armarx::FramedPose>; diff --git a/source/RobotAPI/libraries/core/LinkedPose.cpp b/source/RobotAPI/libraries/core/LinkedPose.cpp index 00391df0cba8d2a9b94cb368cdf16738c7e4c2c8..10b93907b5873f521378987329895c1a7033a960 100644 --- a/source/RobotAPI/libraries/core/LinkedPose.cpp +++ b/source/RobotAPI/libraries/core/LinkedPose.cpp @@ -290,4 +290,10 @@ namespace armarx } + void VariantType::suppressWarningUnusedVariableForLinkedPoseAndDirection() + { + ARMARX_DEBUG_S << VAROUT(LinkedPose); + ARMARX_DEBUG_S << VAROUT(LinkedDirection); + } + } diff --git a/source/RobotAPI/libraries/core/LinkedPose.h b/source/RobotAPI/libraries/core/LinkedPose.h index c0cceefce563a026803846773fd805d522031186..def35d7f7fd3d23b19f301f7fd77aebdb2b7bbae 100644 --- a/source/RobotAPI/libraries/core/LinkedPose.h +++ b/source/RobotAPI/libraries/core/LinkedPose.h @@ -42,11 +42,7 @@ namespace armarx::VariantType // variant types const VariantTypeId LinkedPose = Variant::addTypeName("::armarx::LinkedPoseBase"); const VariantTypeId LinkedDirection = Variant::addTypeName("::armarx::LinkedDirectionBase"); - inline void suppressWarningUnusedVariableForLinkedPoseAndDirection() - { - ARMARX_DEBUG_S << VAROUT(LinkedPose); - ARMARX_DEBUG_S << VAROUT(LinkedDirection); - } + void suppressWarningUnusedVariableForLinkedPoseAndDirection(); } namespace armarx diff --git a/source/RobotAPI/libraries/core/checks/ConditionCheckMagnitudeChecks.h b/source/RobotAPI/libraries/core/checks/ConditionCheckMagnitudeChecks.h index 1009903e4fb1ddb631f11482a459098452e15419..addca00cdc7e3487aac217a3b03ee488f2287253 100644 --- a/source/RobotAPI/libraries/core/checks/ConditionCheckMagnitudeChecks.h +++ b/source/RobotAPI/libraries/core/checks/ConditionCheckMagnitudeChecks.h @@ -23,11 +23,14 @@ */ #pragma once +#include <ArmarXCore/core/logging/Logging.h> #include <ArmarXCore/core/system/ImportExport.h> #include <ArmarXCore/observers/ConditionCheck.h> + #include <RobotAPI/libraries/core/FramedPose.h> #include <RobotAPI/libraries/core/LinkedPose.h> + namespace armarx { diff --git a/source/RobotAPI/libraries/core/observerfilters/MedianDerivativeFilterV3.cpp b/source/RobotAPI/libraries/core/observerfilters/MedianDerivativeFilterV3.cpp index eaf21147840e8ec1c2e95fa7eedbb218f5518ed0..fbe93784ccb11229682a57d2c2d6ba7577c8adf8 100644 --- a/source/RobotAPI/libraries/core/observerfilters/MedianDerivativeFilterV3.cpp +++ b/source/RobotAPI/libraries/core/observerfilters/MedianDerivativeFilterV3.cpp @@ -23,6 +23,9 @@ */ #include "MedianDerivativeFilterV3.h" +#include <ArmarXCore/core/logging/Logging.h> + + using namespace armarx; using namespace filters; diff --git a/source/RobotAPI/libraries/core/observerfilters/OffsetFilter.cpp b/source/RobotAPI/libraries/core/observerfilters/OffsetFilter.cpp new file mode 100644 index 0000000000000000000000000000000000000000..d8a3246de16fa15282559204e96f45f516567d7c --- /dev/null +++ b/source/RobotAPI/libraries/core/observerfilters/OffsetFilter.cpp @@ -0,0 +1,109 @@ +#include "OffsetFilter.h" + +#include <RobotAPI/libraries/core/FramedPose.h> + +#include <ArmarXCore/core/logging/Logging.h> +#include <ArmarXCore/util/variants/eigen3/MatrixVariant.h> + + +namespace armarx::filters +{ + + OffsetFilter::OffsetFilter() + { + firstRun = true; + windowFilterSize = 1; + } + + + VariantBasePtr OffsetFilter::calculate(const Ice::Current&) const + { + std::unique_lock lock(historyMutex); + + VariantPtr newVariant; + + if (initialValue && dataHistory.size() > 0) + { + VariantTypeId type = dataHistory.begin()->second->getType(); + VariantPtr currentValue = VariantPtr::dynamicCast(dataHistory.rbegin()->second); + + if (currentValue->getType() != initialValue->getType()) + { + ARMARX_ERROR_S << "Types in OffsetFilter are different: " << Variant::typeToString(currentValue->getType()) << " and " << Variant::typeToString(initialValue->getType()); + return nullptr; + } + + if (type == VariantType::Int) + { + int newValue = dataHistory.rbegin()->second->getInt() - initialValue->getInt(); + newVariant = new Variant(newValue); + } + else if (type == VariantType::Float) + { + float newValue = dataHistory.rbegin()->second->getFloat() - initialValue->getFloat(); + newVariant = new Variant(newValue); + } + else if (type == VariantType::Double) + { + double newValue = dataHistory.rbegin()->second->getDouble() - initialValue->getDouble(); + newVariant = new Variant(newValue); + } + else if (type == VariantType::FramedDirection) + { + FramedDirectionPtr vec = FramedDirectionPtr::dynamicCast(currentValue->get<FramedDirection>()); + FramedDirectionPtr intialVec = FramedDirectionPtr::dynamicCast(initialValue->get<FramedDirection>()); + Eigen::Vector3f newValue = vec->toEigen() - intialVec->toEigen(); + + newVariant = new Variant(new FramedDirection(newValue, vec->frame, vec->agent)); + } + else if (type == VariantType::FramedPosition) + { + FramedPositionPtr pos = FramedPositionPtr::dynamicCast(currentValue->get<FramedPosition>()); + FramedPositionPtr intialPos = FramedPositionPtr::dynamicCast(initialValue->get<FramedPosition>()); + Eigen::Vector3f newValue = pos->toEigen() - intialPos->toEigen(); + newVariant = new Variant(new FramedPosition(newValue, pos->frame, pos->agent)); + } + else if (type == VariantType::MatrixFloat) + { + MatrixFloatPtr matrix = MatrixFloatPtr::dynamicCast(currentValue->get<MatrixFloat>()); + MatrixFloatPtr initialMatrix = MatrixFloatPtr::dynamicCast(initialValue->get<MatrixFloat>()); + Eigen::MatrixXf newMatrix = matrix->toEigen() - initialMatrix->toEigen(); + newVariant = new Variant(new MatrixFloat(newMatrix)); + } + } + + return newVariant; + + } + + ParameterTypeList OffsetFilter::getSupportedTypes(const Ice::Current&) const + { + ParameterTypeList result; + result.push_back(VariantType::Int); + result.push_back(VariantType::Float); + result.push_back(VariantType::Double); + result.push_back(VariantType::FramedDirection); + result.push_back(VariantType::FramedPosition); + result.push_back(VariantType::MatrixFloat); + return result; + } + + void OffsetFilter::update(Ice::Long timestamp, const VariantBasePtr& value, const Ice::Current& c) + { + DatafieldFilter::update(timestamp, value, c); + + if (firstRun) + { + std::unique_lock lock(historyMutex); + + if (dataHistory.size() == 0) + { + return; + } + + initialValue = VariantPtr::dynamicCast(dataHistory.begin()->second); + firstRun = false; + } + } + +} diff --git a/source/RobotAPI/libraries/core/observerfilters/OffsetFilter.h b/source/RobotAPI/libraries/core/observerfilters/OffsetFilter.h index 68b2cc80905a7747ab73c04f9d19c873b4e3fb77..4af1082d7fb7ac6fb8aeea67f1491d7f94d2f39d 100644 --- a/source/RobotAPI/libraries/core/observerfilters/OffsetFilter.h +++ b/source/RobotAPI/libraries/core/observerfilters/OffsetFilter.h @@ -23,9 +23,9 @@ #pragma once #include <RobotAPI/interface/observers/ObserverFilters.h> + #include <ArmarXCore/observers/filters/DatafieldFilter.h> -#include <RobotAPI/libraries/core/FramedPose.h> -#include <ArmarXCore/util/variants/eigen3/MatrixVariant.h> + namespace armarx::filters { @@ -43,109 +43,27 @@ namespace armarx::filters public DatafieldFilter { public: - OffsetFilter() - { - firstRun = true; - windowFilterSize = 1; - } + + OffsetFilter(); // DatafieldFilterBase interface public: - VariantBasePtr calculate(const Ice::Current& c = Ice::emptyCurrent) const override - { - - std::unique_lock lock(historyMutex); - - VariantPtr newVariant; - - if (initialValue && dataHistory.size() > 0) - { - VariantTypeId type = dataHistory.begin()->second->getType(); - VariantPtr currentValue = VariantPtr::dynamicCast(dataHistory.rbegin()->second); - - if (currentValue->getType() != initialValue->getType()) - { - ARMARX_ERROR_S << "Types in OffsetFilter are different: " << Variant::typeToString(currentValue->getType()) << " and " << Variant::typeToString(initialValue->getType()); - return NULL; - } - - if (type == VariantType::Int) - { - int newValue = dataHistory.rbegin()->second->getInt() - initialValue->getInt(); - newVariant = new Variant(newValue); - } - else if (type == VariantType::Float) - { - float newValue = dataHistory.rbegin()->second->getFloat() - initialValue->getFloat(); - newVariant = new Variant(newValue); - } - else if (type == VariantType::Double) - { - double newValue = dataHistory.rbegin()->second->getDouble() - initialValue->getDouble(); - newVariant = new Variant(newValue); - } - else if (type == VariantType::FramedDirection) - { - FramedDirectionPtr vec = FramedDirectionPtr::dynamicCast(currentValue->get<FramedDirection>()); - FramedDirectionPtr intialVec = FramedDirectionPtr::dynamicCast(initialValue->get<FramedDirection>()); - Eigen::Vector3f newValue = vec->toEigen() - intialVec->toEigen(); - - newVariant = new Variant(new FramedDirection(newValue, vec->frame, vec->agent)); - } - else if (type == VariantType::FramedPosition) - { - FramedPositionPtr pos = FramedPositionPtr::dynamicCast(currentValue->get<FramedPosition>()); - FramedPositionPtr intialPos = FramedPositionPtr::dynamicCast(initialValue->get<FramedPosition>()); - Eigen::Vector3f newValue = pos->toEigen() - intialPos->toEigen(); - newVariant = new Variant(new FramedPosition(newValue, pos->frame, pos->agent)); - } - else if (type == VariantType::MatrixFloat) - { - MatrixFloatPtr matrix = MatrixFloatPtr::dynamicCast(currentValue->get<MatrixFloat>()); - MatrixFloatPtr initialMatrix = MatrixFloatPtr::dynamicCast(initialValue->get<MatrixFloat>()); - Eigen::MatrixXf newMatrix = matrix->toEigen() - initialMatrix->toEigen(); - newVariant = new Variant(new MatrixFloat(newMatrix)); - } - } - - return newVariant; - - } - ParameterTypeList getSupportedTypes(const Ice::Current&) const override - { - ParameterTypeList result; - result.push_back(VariantType::Int); - result.push_back(VariantType::Float); - result.push_back(VariantType::Double); - result.push_back(VariantType::FramedDirection); - result.push_back(VariantType::FramedPosition); - result.push_back(VariantType::MatrixFloat); - return result; - } + + VariantBasePtr calculate(const Ice::Current& = Ice::emptyCurrent) const override; + + ParameterTypeList getSupportedTypes(const Ice::Current&) const override; + + private: bool firstRun; VariantPtr initialValue; + // DatafieldFilterBase interface public: - void update(Ice::Long timestamp, const VariantBasePtr& value, const Ice::Current& c) override - { - DatafieldFilter::update(timestamp, value, c); - - if (firstRun) - { - std::unique_lock lock(historyMutex); - - if (dataHistory.size() == 0) - { - return; - } - - initialValue = VariantPtr::dynamicCast(dataHistory.begin()->second); - firstRun = false; - } - } + void update(Ice::Long timestamp, const VariantBasePtr& value, const Ice::Current& c) override; + }; } diff --git a/source/RobotAPI/libraries/core/observerfilters/PoseAverageFilter.cpp b/source/RobotAPI/libraries/core/observerfilters/PoseAverageFilter.cpp index aa3b14347927cbbcd068f0164f2c92b86012fabd..e0d61134cfb5e85319d9a45af55418cf9f1a9a07 100644 --- a/source/RobotAPI/libraries/core/observerfilters/PoseAverageFilter.cpp +++ b/source/RobotAPI/libraries/core/observerfilters/PoseAverageFilter.cpp @@ -23,6 +23,9 @@ */ #include "PoseAverageFilter.h" +#include <ArmarXCore/core/logging/Logging.h> + + namespace armarx::filters { diff --git a/source/RobotAPI/libraries/core/observerfilters/PoseMedianFilter.cpp b/source/RobotAPI/libraries/core/observerfilters/PoseMedianFilter.cpp new file mode 100644 index 0000000000000000000000000000000000000000..72c6e8e8e798c43046f14c3dbcabc73233ab9a0d --- /dev/null +++ b/source/RobotAPI/libraries/core/observerfilters/PoseMedianFilter.cpp @@ -0,0 +1,112 @@ +#include "PoseMedianFilter.h" + +#include <RobotAPI/libraries/core/FramedPose.h> +#include <RobotAPI/interface/core/PoseBase.h> + +#include <ArmarXCore/core/logging/Logging.h> + + +namespace armarx::filters +{ + + PoseMedianFilter::PoseMedianFilter(int windowSize) + { + this->windowFilterSize = windowSize; + } + + + VariantBasePtr PoseMedianFilter::calculate(const Ice::Current& c) const + { + std::unique_lock lock(historyMutex); + + if (dataHistory.size() == 0) + { + return nullptr; + } + + VariantTypeId type = dataHistory.begin()->second->getType(); + + if (type == VariantType::Vector3 + or type == VariantType::FramedDirection + or type == VariantType::FramedPosition) + { + Eigen::Vector3f vec; + vec.setZero(); + std::string frame = ""; + std::string agent = ""; + VariantPtr var = VariantPtr::dynamicCast(dataHistory.begin()->second); + + if (type == VariantType::FramedDirection) + { + FramedDirectionPtr p = var->get<FramedDirection>(); + frame = p->frame; + agent = p->agent; + } + else if (type == VariantType::FramedPosition) + { + FramedPositionPtr p = var->get<FramedPosition>(); + frame = p->frame; + agent = p->agent; + } + + for (int i = 0; i < 3; ++i) + { + std::vector<double> values; + + for (auto v : dataHistory) + { + VariantPtr v2 = VariantPtr::dynamicCast(v.second); + values.push_back(v2->get<Vector3>()->toEigen()[i]); + } + + std::sort(values.begin(), values.end()); + vec[i] = values.at(values.size() / 2); + } + + if (type == VariantType::Vector3) + { + Vector3Ptr vecVar = new Vector3(vec); + return new Variant(vecVar); + } + else if (type == VariantType::FramedDirection) + { + + FramedDirectionPtr vecVar = new FramedDirection(vec, frame, agent); + return new Variant(vecVar); + } + else if (type == VariantType::FramedPosition) + { + FramedPositionPtr vecVar = new FramedPosition(vec, frame, agent); + return new Variant(vecVar); + } + else + { + ARMARX_WARNING_S << "Implementation missing here"; + return nullptr; + } + } + else if (type == VariantType::Double) + { + // auto values = SortVariants<double>(dataHistory); + // return new Variant(values.at(values.size()/2)); + } + else if (type == VariantType::Int) + { + // auto values = SortVariants<int>(dataHistory); + // return new Variant(values.at(values.size()/2)); + } + + return MedianFilter::calculate(c); + } + + + ParameterTypeList PoseMedianFilter::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; + } + +} diff --git a/source/RobotAPI/libraries/core/observerfilters/PoseMedianFilter.h b/source/RobotAPI/libraries/core/observerfilters/PoseMedianFilter.h index 33bbed17812e9c8d06336da6ce37ca9b7e73703e..bc03128714c8685f07b45b09e1e41996437e697f 100644 --- a/source/RobotAPI/libraries/core/observerfilters/PoseMedianFilter.h +++ b/source/RobotAPI/libraries/core/observerfilters/PoseMedianFilter.h @@ -23,9 +23,10 @@ */ #pragma once +#include <RobotAPI/interface/core/FramedPoseBase.h> + #include <ArmarXCore/observers/filters/MedianFilter.h> -#include <RobotAPI/libraries/core/FramedPose.h> -#include <RobotAPI/interface/core/PoseBase.h> + namespace armarx::filters { @@ -41,108 +42,17 @@ namespace armarx::filters public MedianFilter { public: - PoseMedianFilter(int windowSize = 11) - { - this->windowFilterSize = windowSize; - } + PoseMedianFilter(int windowSize = 11); // DatafieldFilterBase interface public: - VariantBasePtr calculate(const Ice::Current& c) const override - { - std::unique_lock lock(historyMutex); - - if (dataHistory.size() == 0) - { - return NULL; - } - - VariantTypeId type = dataHistory.begin()->second->getType(); - - if ((type == VariantType::Vector3) || (type == VariantType::FramedDirection) || (type == VariantType::FramedPosition)) - { - - Eigen::Vector3f vec; - vec.setZero(); - std::string frame = ""; - std::string agent = ""; - VariantPtr var = VariantPtr::dynamicCast(dataHistory.begin()->second); - - if (type == VariantType::FramedDirection) - { - FramedDirectionPtr p = var->get<FramedDirection>(); - frame = p->frame; - agent = p->agent; - } - else if (type == VariantType::FramedPosition) - { - FramedPositionPtr p = var->get<FramedPosition>(); - frame = p->frame; - agent = p->agent; - } - - for (int i = 0; i < 3; ++i) - { - std::vector<double> values; - - for (auto v : dataHistory) - { - VariantPtr v2 = VariantPtr::dynamicCast(v.second); - values.push_back(v2->get<Vector3>()->toEigen()[i]); - } - - std::sort(values.begin(), values.end()); - vec[i] = values.at(values.size() / 2); - } - - if (type == VariantType::Vector3) - { - Vector3Ptr vecVar = new Vector3(vec); - return new Variant(vecVar); - } - else if (type == VariantType::FramedDirection) - { - - FramedDirectionPtr vecVar = new FramedDirection(vec, frame, agent); - return new Variant(vecVar); - } - else if (type == VariantType::FramedPosition) - { - FramedPositionPtr vecVar = new FramedPosition(vec, frame, agent); - return new Variant(vecVar); - } - else - { - ARMARX_WARNING_S << "Implementation missing here"; - return NULL; - } - } - else if (type == VariantType::Double) - { - // auto values = SortVariants<double>(dataHistory); - // return new Variant(values.at(values.size()/2)); - } - else if (type == VariantType::Int) - { - // auto values = SortVariants<int>(dataHistory); - // return new Variant(values.at(values.size()/2)); - } - - return MedianFilter::calculate(c); - } + VariantBasePtr calculate(const Ice::Current& c) const override; /** * @brief This filter supports: Vector3, FramedDirection, FramedPosition * @return List of VariantTypes */ - ParameterTypeList getSupportedTypes(const Ice::Current& c) const override - { - 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 override; }; diff --git a/source/RobotAPI/libraries/core/observerfilters/PoseMedianOffsetFilter.cpp b/source/RobotAPI/libraries/core/observerfilters/PoseMedianOffsetFilter.cpp index e4d4a1444065ad83bbc681fa83832bca5ccabb29..3fffba8a157154642b2f7548ed055346b86fb5ef 100644 --- a/source/RobotAPI/libraries/core/observerfilters/PoseMedianOffsetFilter.cpp +++ b/source/RobotAPI/libraries/core/observerfilters/PoseMedianOffsetFilter.cpp @@ -23,6 +23,8 @@ */ #include "PoseMedianOffsetFilter.h" +#include <ArmarXCore/core/logging/Logging.h> + using namespace armarx; using namespace filters; diff --git a/source/RobotAPI/libraries/core/remoterobot/RemoteRobotNode.cpp b/source/RobotAPI/libraries/core/remoterobot/RemoteRobotNode.cpp index 3452cb93862066c3409e35004a2b8f26ed8eca90..1b002dc20e5d631dec870f4f935c2a1a19e5cc36 100644 --- a/source/RobotAPI/libraries/core/remoterobot/RemoteRobotNode.cpp +++ b/source/RobotAPI/libraries/core/remoterobot/RemoteRobotNode.cpp @@ -27,8 +27,10 @@ #include <RobotAPI/libraries/core/FramedPose.h> +#include <ArmarXCore/core/logging/Logging.h> #include <ArmarXCore/interface/core/BasicTypes.h> + namespace armarx {