From fdc79d372bd8babbf9cf7e5e445b04c594cb037c Mon Sep 17 00:00:00 2001 From: Rainer Kartmann <rainer.kartmann@kit.edu> Date: Mon, 22 Feb 2021 14:00:44 +0100 Subject: [PATCH] Move code to separate file --- .../ObjectPoseObserver/CMakeLists.txt | 4 + .../ObjectPoseObserver/ObjectPoseObserver.cpp | 81 ----------------- .../ObjectPoseObserver/ObjectPoseObserver.h | 43 ++------- .../detail/ObjectPoseDecay.cpp | 7 ++ .../detail/ObjectPoseDecay.h | 24 +++++ .../detail/RobotHeadMovement.cpp | 89 +++++++++++++++++++ .../detail/RobotHeadMovement.h | 46 ++++++++++ 7 files changed, 175 insertions(+), 119 deletions(-) create mode 100644 source/RobotAPI/components/ObjectPoseObserver/detail/ObjectPoseDecay.cpp create mode 100644 source/RobotAPI/components/ObjectPoseObserver/detail/ObjectPoseDecay.h create mode 100644 source/RobotAPI/components/ObjectPoseObserver/detail/RobotHeadMovement.cpp create mode 100644 source/RobotAPI/components/ObjectPoseObserver/detail/RobotHeadMovement.h diff --git a/source/RobotAPI/components/ObjectPoseObserver/CMakeLists.txt b/source/RobotAPI/components/ObjectPoseObserver/CMakeLists.txt index 96c82550e..fd526dd81 100644 --- a/source/RobotAPI/components/ObjectPoseObserver/CMakeLists.txt +++ b/source/RobotAPI/components/ObjectPoseObserver/CMakeLists.txt @@ -12,6 +12,8 @@ set(COMPONENT_LIBS set(SOURCES ObjectPoseObserver.cpp + detail/ObjectPoseDecay.cpp + detail/RobotHeadMovement.cpp plugins/ObjectPoseProviderPlugin.cpp plugins/ObjectPoseClientPlugin.cpp @@ -19,6 +21,8 @@ set(SOURCES ) set(HEADERS ObjectPoseObserver.h + detail/ObjectPoseDecay.h + detail/RobotHeadMovement.h plugins/ObjectPoseProviderPlugin.h plugins/ObjectPoseClientPlugin.h diff --git a/source/RobotAPI/components/ObjectPoseObserver/ObjectPoseObserver.cpp b/source/RobotAPI/components/ObjectPoseObserver/ObjectPoseObserver.cpp index 634600034..71021ee3d 100644 --- a/source/RobotAPI/components/ObjectPoseObserver/ObjectPoseObserver.cpp +++ b/source/RobotAPI/components/ObjectPoseObserver/ObjectPoseObserver.cpp @@ -831,87 +831,6 @@ namespace armarx } - void ObjectPoseObserver::RobotHeadMovement::fetchDatafields() - { - if (kinematicUnitObserver) - { - for (const std::string& jointName : jointNames) - { - std::string error = ""; - try - { - DatafieldRefBasePtr datafield = kinematicUnitObserver->getDatafieldRefByName(jointVelocitiesChannelName, jointName); - DatafieldRefPtr casted = DatafieldRefPtr::dynamicCast(datafield); - if (casted) - { - jointVelocitiesDatafields.push_back(casted); - } - } - catch (const InvalidDatafieldException& e) - { - error = e.what(); - } - catch (const InvalidChannelException& e) - { - error = e.what(); - } - if (error.size() > 0) - { - ARMARX_WARNING << "Could not get datafield for joint '" << jointName << "' in channel '" << jointVelocitiesChannelName << "': \n " - << error; - } - } - } - else - { - ARMARX_INFO << "Cannot fetch joint velocity datafields because there is no kinematic unit observer."; - } - } - - bool ObjectPoseObserver::RobotHeadMovement::isMoving() const - { - for (DatafieldRefPtr df : jointVelocitiesDatafields) - { - if (df) - { - float jointVelocity = df->getFloat(); - // ARMARX_IMPORTANT << "Is " << df->datafieldName << " " << VAROUT(std::abs(jointVelocity)) << " > " << VAROUT(maxJointVelocity) << "?"; - if (std::abs(jointVelocity) > maxJointVelocity) - { - return true; - } - } - } - return false; - } - - void ObjectPoseObserver::RobotHeadMovement::movementStarts(long discardIntervalMs) - { - return movementStarts(IceUtil::Time::milliSeconds(discardIntervalMs)); - } - void ObjectPoseObserver::RobotHeadMovement::movementStarts(IceUtil::Time discardInterval) - { - discardUpdatesUntil = TimeUtil::GetTime() + discardInterval; - } - void ObjectPoseObserver::RobotHeadMovement::movementStops(long discardIntervalMs) - { - return movementStops(IceUtil::Time::milliSeconds(discardIntervalMs)); - } - void ObjectPoseObserver::RobotHeadMovement::movementStops(IceUtil::Time discardInterval) - { - if (discardInterval.toMilliSeconds() < 0) - { - // Stop discarding. - discardUpdatesUntil = IceUtil::Time::milliSeconds(-1); - } - else - { - // Basically the same as starting. - discardUpdatesUntil = TimeUtil::GetTime() + discardInterval; - } - } - - void ObjectPoseObserver::createRemoteGuiTab() { using namespace armarx::RemoteGui::Client; diff --git a/source/RobotAPI/components/ObjectPoseObserver/ObjectPoseObserver.h b/source/RobotAPI/components/ObjectPoseObserver/ObjectPoseObserver.h index 6f4cb8a0c..09c839d29 100644 --- a/source/RobotAPI/components/ObjectPoseObserver/ObjectPoseObserver.h +++ b/source/RobotAPI/components/ObjectPoseObserver/ObjectPoseObserver.h @@ -40,8 +40,10 @@ #include <RobotAPI/libraries/ArmarXObjects/ObjectFinder.h> #include <RobotAPI/libraries/ArmarXObjects/ObjectPose.h> -#define ICE_CURRENT_ARG const Ice::Current& = Ice::emptyCurrent +#include <RobotAPI/components/ObjectPoseObserver/detail/ObjectPoseDecay.h> +#include <RobotAPI/components/ObjectPoseObserver/detail/RobotHeadMovement.h> +#define ICE_CURRENT_ARG const Ice::Current& = Ice::emptyCurrent namespace armarx @@ -185,45 +187,10 @@ namespace armarx Data data; - struct Decay - { - /// Time for an object pose to decay. - float durationSeconds = 20.0; - /// Frequency of updating the current decay. - float updateFrequencyHz = 10.0; - - SimpleRunningTask<>::pointer_type updateTask; - }; - Decay decay; - + objpose::ObjectPoseDecay decay; - class RobotHeadMovement : public armarx::Logging - { - public: - - bool checkHeadVelocity = true; - - std::string jointVelocitiesChannelName = "jointvelocities"; - std::vector<std::string> jointNames = {"Neck_1_Yaw", "Neck_2_Pitch"}; - float maxJointVelocity = 0.05f; - int discardIntervalAfterMoveMS = 100; - - KinematicUnitObserverInterfacePrx kinematicUnitObserver; - std::vector<DatafieldRefPtr> jointVelocitiesDatafields; - IceUtil::Time discardUpdatesUntil = IceUtil::Time::seconds(-1); - - DebugObserverInterfacePrx debugObserver; - - void fetchDatafields(); - bool isMoving() const; - - void movementStarts(long discardIntervalMs); - void movementStarts(IceUtil::Time discardInterval); - void movementStops(long discardIntervalMs); - void movementStops(IceUtil::Time discardInterval); - }; - RobotHeadMovement robotHead; + objpose::RobotHeadMovement robotHead; std::mutex robotHeadMutex; diff --git a/source/RobotAPI/components/ObjectPoseObserver/detail/ObjectPoseDecay.cpp b/source/RobotAPI/components/ObjectPoseObserver/detail/ObjectPoseDecay.cpp new file mode 100644 index 000000000..c716765ab --- /dev/null +++ b/source/RobotAPI/components/ObjectPoseObserver/detail/ObjectPoseDecay.cpp @@ -0,0 +1,7 @@ +#include "ObjectPoseDecay.h" + + +namespace armarx::objpose +{ + +} diff --git a/source/RobotAPI/components/ObjectPoseObserver/detail/ObjectPoseDecay.h b/source/RobotAPI/components/ObjectPoseObserver/detail/ObjectPoseDecay.h new file mode 100644 index 000000000..a68223beb --- /dev/null +++ b/source/RobotAPI/components/ObjectPoseObserver/detail/ObjectPoseDecay.h @@ -0,0 +1,24 @@ +#pragma once + +#include <ArmarXCore/core/services/tasks/TaskUtil.h> + + +namespace armarx::objpose +{ + + class ObjectPoseDecay + { + public: + + /// Time for an object pose to decay. + float durationSeconds = 20.0; + /// Frequency of updating the current decay. + float updateFrequencyHz = 10.0; + + // bool removeDecayedObjects = false; + + SimpleRunningTask<>::pointer_type updateTask; + + }; + +} diff --git a/source/RobotAPI/components/ObjectPoseObserver/detail/RobotHeadMovement.cpp b/source/RobotAPI/components/ObjectPoseObserver/detail/RobotHeadMovement.cpp new file mode 100644 index 000000000..c0c68e6d1 --- /dev/null +++ b/source/RobotAPI/components/ObjectPoseObserver/detail/RobotHeadMovement.cpp @@ -0,0 +1,89 @@ +#include "RobotHeadMovement.h" + +#include <ArmarXCore/core/time/TimeUtil.h> + + +namespace armarx::objpose +{ + + void RobotHeadMovement::fetchDatafields() + { + if (kinematicUnitObserver) + { + for (const std::string& jointName : jointNames) + { + std::string error = ""; + try + { + DatafieldRefBasePtr datafield = kinematicUnitObserver->getDatafieldRefByName(jointVelocitiesChannelName, jointName); + DatafieldRefPtr casted = DatafieldRefPtr::dynamicCast(datafield); + if (casted) + { + jointVelocitiesDatafields.push_back(casted); + } + } + catch (const InvalidDatafieldException& e) + { + error = e.what(); + } + catch (const InvalidChannelException& e) + { + error = e.what(); + } + if (error.size() > 0) + { + ARMARX_WARNING << "Could not get datafield for joint '" << jointName << "' in channel '" << jointVelocitiesChannelName << "': \n " + << error; + } + } + } + else + { + ARMARX_INFO << "Cannot fetch joint velocity datafields because there is no kinematic unit observer."; + } + } + + bool RobotHeadMovement::isMoving() const + { + for (DatafieldRefPtr df : jointVelocitiesDatafields) + { + if (df) + { + float jointVelocity = df->getFloat(); + // ARMARX_IMPORTANT << "Is " << df->datafieldName << " " << VAROUT(std::abs(jointVelocity)) << " > " << VAROUT(maxJointVelocity) << "?"; + if (std::abs(jointVelocity) > maxJointVelocity) + { + return true; + } + } + } + return false; + } + + void RobotHeadMovement::movementStarts(long discardIntervalMs) + { + return movementStarts(IceUtil::Time::milliSeconds(discardIntervalMs)); + } + void RobotHeadMovement::movementStarts(IceUtil::Time discardInterval) + { + discardUpdatesUntil = TimeUtil::GetTime() + discardInterval; + } + void RobotHeadMovement::movementStops(long discardIntervalMs) + { + return movementStops(IceUtil::Time::milliSeconds(discardIntervalMs)); + } + void RobotHeadMovement::movementStops(IceUtil::Time discardInterval) + { + if (discardInterval.toMilliSeconds() < 0) + { + // Stop discarding. + discardUpdatesUntil = IceUtil::Time::milliSeconds(-1); + } + else + { + // Basically the same as starting. + discardUpdatesUntil = TimeUtil::GetTime() + discardInterval; + } + } + +} diff --git a/source/RobotAPI/components/ObjectPoseObserver/detail/RobotHeadMovement.h b/source/RobotAPI/components/ObjectPoseObserver/detail/RobotHeadMovement.h new file mode 100644 index 000000000..b0345e7c3 --- /dev/null +++ b/source/RobotAPI/components/ObjectPoseObserver/detail/RobotHeadMovement.h @@ -0,0 +1,46 @@ +#pragma once + +#include <string> +#include <vector> + +#include <IceUtil/Time.h> + +#include <ArmarXCore/interface/observers/ObserverInterface.h> +#include <ArmarXCore/core/logging/Logging.h> +#include <ArmarXCore/observers/variant/DatafieldRef.h> + +#include <RobotAPI/interface/observers/KinematicUnitObserverInterface.h> + + +namespace armarx::objpose +{ + class RobotHeadMovement : public armarx::Logging + { + public: + + bool checkHeadVelocity = true; + + std::string jointVelocitiesChannelName = "jointvelocities"; + std::vector<std::string> jointNames = {"Neck_1_Yaw", "Neck_2_Pitch"}; + float maxJointVelocity = 0.05f; + int discardIntervalAfterMoveMS = 100; + + KinematicUnitObserverInterfacePrx kinematicUnitObserver; + std::vector<DatafieldRefPtr> jointVelocitiesDatafields; + IceUtil::Time discardUpdatesUntil = IceUtil::Time::seconds(-1); + + DebugObserverInterfacePrx debugObserver; + + void fetchDatafields(); + bool isMoving() const; + + void movementStarts(long discardIntervalMs); + void movementStarts(IceUtil::Time discardInterval); + void movementStops(long discardIntervalMs); + void movementStops(IceUtil::Time discardInterval); + }; + + + + +} -- GitLab