diff --git a/source/RobotAPI/components/ObjectPoseObserver/CMakeLists.txt b/source/RobotAPI/components/ObjectPoseObserver/CMakeLists.txt index 375f518122a5b764afc1cb69714c2cc44a15af7a..dfdb915ea0797f13b4f1253b04324b23e387c377 100644 --- a/source/RobotAPI/components/ObjectPoseObserver/CMakeLists.txt +++ b/source/RobotAPI/components/ObjectPoseObserver/CMakeLists.txt @@ -2,24 +2,11 @@ armarx_component_set_name("ObjectPoseObserver") set(COMPONENT_LIBS - # ArmarXCore - ArmarXCore ArmarXCoreInterfaces - # ArmarXGui - ArmarXGuiComponentPlugins - # RobotAPI - RobotAPI::ComponentPlugins - RobotAPI::armem_objects - - # This project - ${PROJECT_NAME}Interfaces ) set(SOURCES - ObjectPoseObserver.cpp ) set(HEADERS - ObjectPoseObserver.h - # Legacy headers. plugins/ObjectPoseProviderPlugin.h plugins/ObjectPoseClientPlugin.h @@ -29,7 +16,7 @@ armarx_add_component("${SOURCES}" "${HEADERS}") # add unit tests -add_subdirectory(test) +# add_subdirectory(test) # generate the application -armarx_generate_and_add_component_executable() +# armarx_generate_and_add_component_executable() diff --git a/source/RobotAPI/components/ObjectPoseObserver/ObjectPoseObserver.cpp b/source/RobotAPI/components/ObjectPoseObserver/ObjectPoseObserver.cpp deleted file mode 100644 index 44f7f9f8155baec73e4039195d659abb9f61d075..0000000000000000000000000000000000000000 --- a/source/RobotAPI/components/ObjectPoseObserver/ObjectPoseObserver.cpp +++ /dev/null @@ -1,519 +0,0 @@ -/* - * This file is part of ArmarX. - * - * ArmarX is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * ArmarX is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - * - * @package RobotAPI::ArmarXObjects::ObjectPoseObserver - * @author Rainer Kartmann ( rainer dot kartmann at kit dot edu ) - * @date 2020 - * @copyright http://www.gnu.org/licenses/gpl-2.0.txt - * GNU General Public License - */ - -#include "ObjectPoseObserver.h" - -#include <RobotAPI/libraries/core/Pose.h> -#include <RobotAPI/libraries/core/FramedPose.h> -#include <RobotAPI/libraries/ArmarXObjects/aron_conversions.h> -#include <RobotAPI/libraries/ArmarXObjects/ice_conversions.h> - -#include <ArmarXCore/core/time/CycleUtil.h> -#include <ArmarXCore/observers/variant/Variant.h> - -#include <VirtualRobot/Robot.h> -#include <VirtualRobot/RobotConfig.h> - -#include <SimoxUtility/algorithm/get_map_keys_values.h> -#include <SimoxUtility/meta/EnumNames.hpp> - - -namespace armarx -{ - - armarx::PropertyDefinitionsPtr ObjectPoseObserver::createPropertyDefinitions() - { - armarx::PropertyDefinitionsPtr defs(new ComponentPropertyDefinitions(getConfigIdentifier())); - - defs->defineOptionalProperty<std::string>("ObjectPoseTopicName", "ObjectPoseTopic", "Name of the Object Pose Topic."); - defs->defineOptionalProperty<std::string>("KinematicUnitObserverName", "KinematicUnitObserver", "Name of the kinematic unit observer."); - defs->topic(debugObserver); - - calibration.defineProperties(defs, "calibration."); - data.defineProperties(defs); - robotHead.defineProperties(defs, "head."); - visu.defineProperties(defs, "visu."); - - return defs; - } - - ObjectPoseObserver::ObjectPoseObserver() : - data(memory, iceMemory) - { - } - - std::string ObjectPoseObserver::getDefaultName() const - { - return "ObjectPoseObserver"; - } - - void ObjectPoseObserver::onInitComponent() - { - data.setTag(getName()); - data.decay.setTag(getName()); - robotHead.setTag(getName()); - visu.setTag(getName()); - - data.init(); - - usingTopicFromProperty("ObjectPoseTopicName"); - } - - void ObjectPoseObserver::onConnectComponent() - { - // onConnect can be called multiple times, but addRobot will fail if called more than once with the same ID - // So we need to always make sure to guard a call to addRobot - if (!RobotState::hasRobot("robot")) - { - data.robot = RobotState::addRobot("robot", VirtualRobot::RobotIO::RobotDescription::eStructure); - } - data.robotStateComponent = getRobotStateComponent(); - - getProxyFromProperty(robotHead.kinematicUnitObserver, "KinematicUnitObserverName", false, "", false); - robotHead.debugObserver = debugObserver; - robotHead.fetchDatafields(); - - visu.arviz = arviz; - if (!visu.updateTask) - { - visu.updateTask = new SimpleRunningTask<>([this]() - { - this->visualizeRun(); - }); - visu.updateTask->start(); - } - - createRemoteGuiTab(); - RemoteGui_startRunningTask(); - } - - void ObjectPoseObserver::onDisconnectComponent() - { - } - - void ObjectPoseObserver::onExitComponent() - { - } - - - void ObjectPoseObserver::reportProviderAvailable(const std::string& providerName, const objpose::ProviderInfo& info, const Ice::Current&) - { - updateProviderInfo(providerName, info); - } - - - void ObjectPoseObserver::reportObjectPoses( - const std::string& providerName, const objpose::data::ProvidedObjectPoseSeq& providedPoses, const Ice::Current&) - { - ARMARX_VERBOSE << "Received object " << providedPoses.size() << " poses from provider '" << providerName << "'."; - updateObjectPoses(providerName, providedPoses); - } - - - void ObjectPoseObserver::updateProviderInfo(const std::string& providerName, const objpose::ProviderInfo& info) - { - if (!info.proxy) - { - ARMARX_WARNING << "Received availability signal by provider '" << providerName << "' " - << "with invalid provider proxy.\nIgnoring provider '" << providerName << "'."; - return; - } - { - std::scoped_lock lock(dataMutex); - std::stringstream ss; - for (const auto& id : info.supportedObjects) - { - ss << "- " << id << "\n"; - } - ARMARX_VERBOSE << "Provider '" << providerName << "' available.\n" - << "Supported objects: \n" << ss.str(); - data.providers[providerName] = info; - } - } - - - void ObjectPoseObserver::updateObjectPoses( - const std::string& providerName, - const objpose::data::ProvidedObjectPoseSeq& providedPoses) - { - TIMING_START(tReportObjectPoses); - - RobotHeadMovement::Discard discard; - { - std::scoped_lock lock(robotHeadMutex); - discard = robotHead.getDiscard(); - } - if (debugObserver) - { - StringVariantBaseMap map; - map["Discarding All Updates"] = new Variant(discard.all ? 1.f : 0.f); - if (discard.all) - { - map["Proportion Updated Poses"] = new Variant(0.f); - } - debugObserver->setDebugChannel(getName(), map); - } - - if (discard.all) - { - return; - } - - { - std::scoped_lock lock(dataMutex); - RobotState::synchronizeLocalClone(data.robot); - - if (data.robot->hasRobotNode(calibration.robotNode)) - { - VirtualRobot::RobotNodePtr robotNode = data.robot->getRobotNode(calibration.robotNode); - float value = robotNode->getJointValue(); - robotNode->setJointValue(value + calibration.offset); - } - - TIMING_START(tCommitObjectPoses); - Data::CommitStats stats = - data.commitObjectPoses(providerName, providedPoses, discard.updatesUntil); - TIMING_END_STREAM(tCommitObjectPoses, ARMARX_VERBOSE); - - if (debugObserver) - { - debugObserver->setDebugChannel(getName(), - { - { "Discarding All Updates", new Variant(discard.all ? 1 : 0) }, - { "Proportion Updated Poses", new Variant(static_cast<float>(stats.numUpdated) / providedPoses.size()) } - }); - } - - handleProviderUpdate(providerName); - - TIMING_END_STREAM(tReportObjectPoses, ARMARX_VERBOSE); - if (debugObserver) - { - debugObserver->setDebugChannel(getName(), - { - { "t ReportObjectPoses [ms]", new Variant(tReportObjectPoses.toMilliSecondsDouble()) }, - { "t MemorySetObjectPoses [ms]", new Variant(tCommitObjectPoses.toMilliSecondsDouble()) }, - }); - } - } - } - - - void ObjectPoseObserver::handleProviderUpdate(const std::string& providerName) - { - // Initialized to 0 on first access. - if (data.providers.count(providerName) == 0) - { - data.providers[providerName] = objpose::ProviderInfo(); - } - } - - - objpose::data::ObjectPoseSeq ObjectPoseObserver::getObjectPoses(const Ice::Current&) - { - TIMING_START(tGetObjectPoses); - - TIMING_START(tGetObjectPosesLock); - std::scoped_lock lock(dataMutex); - TIMING_END_STREAM(tGetObjectPosesLock, ARMARX_VERBOSE); - - const IceUtil::Time now = TimeUtil::GetTime(); - const objpose::data::ObjectPoseSeq result = objpose::toIce(data.getObjectPoses(now)); - - TIMING_END_STREAM(tGetObjectPoses, ARMARX_VERBOSE); - - if (debugObserver) - { - debugObserver->setDebugChannel(getName(), - { - { "t GetObjectPoses() [ms]", new Variant(tGetObjectPoses.toMilliSecondsDouble()) }, - { "t GetObjectPoses() lock [ms]", new Variant(tGetObjectPosesLock.toMilliSecondsDouble()) } - }); - } - - return result; - } - - objpose::data::ObjectPoseSeq ObjectPoseObserver::getObjectPosesByProvider(const std::string& providerName, const Ice::Current&) - { - TIMING_START(GetObjectPoses); - - TIMING_START(GetObjectPosesLock); - std::scoped_lock lock(dataMutex); - TIMING_END_STREAM(GetObjectPosesLock, ARMARX_VERBOSE); - - const IceUtil::Time now = TimeUtil::GetTime(); - const objpose::data::ObjectPoseSeq result = objpose::toIce(data.getObjectPosesByProvider(providerName, now)); - - TIMING_END_STREAM(GetObjectPoses, ARMARX_VERBOSE); - - if (debugObserver) - { - debugObserver->setDebugChannel(getName(), - { - { "t GetObjectPosesByProvider() [ms]", new Variant(GetObjectPoses.toMilliSecondsDouble()) }, - { "t GetObjectPosesByProvider() lock [ms]", new Variant(GetObjectPosesLock.toMilliSecondsDouble()) } - }); - } - - return result; - } - - - objpose::observer::RequestObjectsOutput ObjectPoseObserver::requestObjects( - const objpose::observer::RequestObjectsInput& input, const Ice::Current&) - { - std::map<std::string, objpose::provider::RequestObjectsInput> providerRequests; - std::map<std::string, objpose::ObjectPoseProviderPrx> proxies; - - objpose::observer::RequestObjectsOutput output; - - auto updateProxy = [&](const std::string & providerName) - { - if (proxies.count(providerName) == 0) - { - if (auto it = data.providers.find(providerName); it != data.providers.end()) - { - proxies[providerName] = it->second.proxy; - } - else - { - ARMARX_ERROR << "No proxy for provider ' " << providerName << "'."; - proxies[providerName] = nullptr; - } - } - }; - - if (input.provider.size() > 0) - { - providerRequests[input.provider] = input.request; - updateProxy(input.provider); - } - else - { - std::scoped_lock lock(dataMutex); - for (const auto& objectID : input.request.objectIDs) - { - bool found = true; - for (const auto& [providerName, info] : data.providers) - { - // ToDo: optimize look up. - if (std::find(info.supportedObjects.begin(), info.supportedObjects.end(), objectID) != info.supportedObjects.end()) - { - providerRequests[providerName].objectIDs.push_back(objectID); - updateProxy(providerName); - break; - } - } - if (!found) - { - ARMARX_ERROR << "Did not find a provider for " << objectID << "."; - output.results[objectID].providerName = ""; - } - } - } - - for (const auto& [providerName, request] : providerRequests) - { - if (objpose::ObjectPoseProviderPrx proxy = proxies.at(providerName); proxy) - { - ARMARX_INFO << "Requesting " << request.objectIDs.size() << " objects by provider '" - << providerName << "' for " << request.relativeTimeoutMS << " ms."; - objpose::provider::RequestObjectsOutput providerOutput = proxy->requestObjects(request); - - int successful = 0; - for (const auto& [objectID, result] : providerOutput.results) - { - objpose::observer::ObjectRequestResult& res = output.results[objectID]; - res.providerName = providerName; - res.result = result; - successful += int(result.success); - } - ARMARX_INFO << successful << " of " << request.objectIDs.size() << " object requests successful."; - } - } - return output; - } - - objpose::ProviderInfoMap ObjectPoseObserver::getAvailableProvidersInfo(const Ice::Current&) - { - std::scoped_lock lock(dataMutex); - return data.providers; - } - - Ice::StringSeq ObjectPoseObserver::getAvailableProviderNames(const Ice::Current&) - { - std::scoped_lock lock(dataMutex); - return simox::alg::get_keys(data.providers); - } - - objpose::ProviderInfo ObjectPoseObserver::getProviderInfo(const std::string& providerName, const Ice::Current&) - { - std::scoped_lock lock(dataMutex); - return data.getProviderInfo(providerName); - } - - bool ObjectPoseObserver::hasProvider(const std::string& providerName, const Ice::Current&) - { - std::scoped_lock lock(dataMutex); - return data.providers.count(providerName) > 0; - } - - - objpose::AttachObjectToRobotNodeOutput ObjectPoseObserver::attachObjectToRobotNode( - const objpose::AttachObjectToRobotNodeInput& input, const Ice::Current&) - { - std::scoped_lock lock(dataMutex); - return data.attachObjectToRobotNode(input); - } - - objpose::DetachObjectFromRobotNodeOutput ObjectPoseObserver::detachObjectFromRobotNode( - const objpose::DetachObjectFromRobotNodeInput& input, const Ice::Current&) - { - std::scoped_lock lock(dataMutex); - return data.detachObjectFromRobotNode(input); - } - - objpose::DetachAllObjectsFromRobotNodesOutput ObjectPoseObserver::detachAllObjectsFromRobotNodes( - const objpose::DetachAllObjectsFromRobotNodesInput& input, const Ice::Current&) - { - std::scoped_lock lock(dataMutex); - return data.detachAllObjectsFromRobotNodes(input); - } - - - objpose::AgentFramesSeq ObjectPoseObserver::getAttachableFrames(const Ice::Current&) - { - std::scoped_lock lock(dataMutex); - - objpose::AgentFramesSeq output; - std::vector<VirtualRobot::RobotPtr> agents = { data.robot }; - for (VirtualRobot::RobotPtr agent : agents) - { - objpose::AgentFrames& frames = output.emplace_back(); - frames.agent = agent->getName(); - frames.frames = agent->getRobotNodeNames(); - } - return output; - } - - objpose::SignalHeadMovementOutput - ObjectPoseObserver::signalHeadMovement(const objpose::SignalHeadMovementInput& input, const Ice::Current&) - { - std::scoped_lock lock(robotHeadMutex); - return robotHead.signalHeadMovement(input); - } - - - void ObjectPoseObserver::visualizeRun() - { - CycleUtil cycle(static_cast<int>(1000 / visu.frequencyHz)); - while (visu.updateTask && !visu.updateTask->isStopped()) - { - { - std::scoped_lock lock(visuMutex); - - if (visu.enabled) - { - TIMING_START(Visu); - - objpose::ObjectPoseSeq objectPoses; - ObjectFinder objectFinder; - visu.minConfidence = -1; - { - std::scoped_lock lock(dataMutex); - - const IceUtil::Time now = TimeUtil::GetTime(); - objectPoses = data.getObjectPoses(now); - objectFinder = data.objectFinder; - if (data.decay.enabled) - { - visu.minConfidence = data.decay.removeObjectsBelowConfidence; - } - } - const std::vector<viz::Layer> layers = visu.visualizeCommit(objectPoses, objectFinder); - arviz.commit(layers); - - TIMING_END_STREAM(Visu, ARMARX_VERBOSE); - - if (debugObserver) - { - debugObserver->setDebugChannel(getName(), - { - { "t Visualize [ms]", new Variant(Visu.toMilliSecondsDouble()) }, - }); - } - } - } - cycle.waitForCycleDuration(); - } - } - - - objpose::ObjectPoseProviderPrx ObjectPoseObserver::getProviderProxy(const std::string& providerName) - { - return getProxy<objpose::ObjectPoseProviderPrx>(providerName, false, "", false); - } - - void ObjectPoseObserver::createRemoteGuiTab() - { - using namespace armarx::RemoteGui::Client; - - tab.visu.setup(this->visu); - tab.data.setup(this->data); - tab.decay.setup(this->data.decay); - tab.robotHead.setup(this->robotHead); - - VBoxLayout root = - { - tab.visu.group, tab.data.group, tab.decay.group, tab.robotHead.group, - VSpacer() - }; - RemoteGui_createTab(getName(), root, &tab); - } - - void ObjectPoseObserver::RemoteGui_update() - { - // Non-atomic variables need to be guarded by a mutex if accessed by multiple threads - { - std::scoped_lock lock(visuMutex); - tab.visu.update(this->visu); - } - { - std::scoped_lock lock(dataMutex); - tab.data.update(this->data); - tab.decay.update(this->data.decay); - } - { - std::scoped_lock lock(robotHeadMutex); - tab.robotHead.update(this->robotHead); - } - } - - void ObjectPoseObserver::Calibration::defineProperties(PropertyDefinitionsPtr defs, const std::string& prefix) - { - defs->optional(robotNode, prefix + "robotNode", "Robot node which can be calibrated."); - defs->optional(offset, prefix + "offset", "Offset for the node to be calibrated."); - } - -} - diff --git a/source/RobotAPI/components/ObjectPoseObserver/ObjectPoseObserver.h b/source/RobotAPI/components/ObjectPoseObserver/ObjectPoseObserver.h deleted file mode 100644 index 0c53032886b712a0cf478a571589409b653beb33..0000000000000000000000000000000000000000 --- a/source/RobotAPI/components/ObjectPoseObserver/ObjectPoseObserver.h +++ /dev/null @@ -1,185 +0,0 @@ -/* - * This file is part of ArmarX. - * - * ArmarX is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * ArmarX is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - * - * @package RobotAPI::ArmarXObjects::ObjectPoseObserver - * @author Rainer Kartmann ( rainer dot kartmann at kit dot edu ) - * @date 2020 - * @copyright http://www.gnu.org/licenses/gpl-2.0.txt - * GNU General Public License - */ - -#pragma once - -#include <mutex> - -#include <ArmarXGui/libraries/ArmarXGuiComponentPlugins/LightweightRemoteGuiComponentPlugin.h> - -#include <RobotAPI/interface/objectpose/ObjectPoseObserverInterface.h> -#include <RobotAPI/libraries/RobotAPIComponentPlugins/ArVizComponentPlugin.h> -#include <RobotAPI/libraries/RobotAPIComponentPlugins/RobotStateComponentPlugin.h> -#include <RobotAPI/libraries/armem/server/ComponentPlugin.h> - -#include <RobotAPI/libraries/armem_objects/Data.h> -#include <RobotAPI/libraries/armem_objects/Decay.h> -#include <RobotAPI/libraries/armem_objects/Visu.h> -#include <RobotAPI/libraries/armem_objects/RobotHeadMovement.h> - - -#define ICE_CURRENT_ARG const Ice::Current& = Ice::emptyCurrent - - -namespace armarx -{ - - /** - * @defgroup Component-ObjectPoseObserver ObjectPoseObserver - * @ingroup RobotAPI-Components - * A description of the component ObjectPoseObserver. - * - * @class ObjectPoseObserver - * @ingroup Component-ObjectPoseObserver - * @brief Brief description of class ObjectPoseObserver. - * - * Detailed description of class ObjectPoseObserver. - */ - class ObjectPoseObserver : - virtual public Component - , virtual public armarx::objpose::ObjectPoseObserverInterface - , virtual public armarx::armem::server::ComponentPluginUser - , virtual public armarx::RobotStateComponentPluginUser - , virtual public armarx::LightweightRemoteGuiComponentPluginUser - , virtual public armarx::ArVizComponentPluginUser - { - public: - using RobotState = armarx::RobotStateComponentPluginUser; - - ObjectPoseObserver(); - - - /// @see armarx::ManagedIceObject::getDefaultName() - std::string getDefaultName() const override; - - - // ObjectPoseTopic interface - public: - void reportProviderAvailable(const std::string& providerName, const objpose::ProviderInfo& info, ICE_CURRENT_ARG) override; - void reportObjectPoses(const std::string& providerName, const objpose::data::ProvidedObjectPoseSeq& objectPoses, ICE_CURRENT_ARG) override; - - // ObjectPoseObserverInterface interface - public: - - // OBJECT POSES - - objpose::data::ObjectPoseSeq getObjectPoses(ICE_CURRENT_ARG) override; - objpose::data::ObjectPoseSeq getObjectPosesByProvider(const std::string& providerName, ICE_CURRENT_ARG) override; - - // PROVIDER INFORMATION - - bool hasProvider(const std::string& providerName, ICE_CURRENT_ARG) override; - objpose::ProviderInfo getProviderInfo(const std::string& providerName, ICE_CURRENT_ARG) override; - Ice::StringSeq getAvailableProviderNames(ICE_CURRENT_ARG) override; - objpose::ProviderInfoMap getAvailableProvidersInfo(ICE_CURRENT_ARG) override; - - - // REQUESTING - - objpose::observer::RequestObjectsOutput requestObjects(const objpose::observer::RequestObjectsInput& input, ICE_CURRENT_ARG) override; - - // ATTACHING - - objpose::AttachObjectToRobotNodeOutput attachObjectToRobotNode(const objpose::AttachObjectToRobotNodeInput& input, ICE_CURRENT_ARG) override; - objpose::DetachObjectFromRobotNodeOutput detachObjectFromRobotNode(const objpose::DetachObjectFromRobotNodeInput& input, ICE_CURRENT_ARG) override; - objpose::DetachAllObjectsFromRobotNodesOutput detachAllObjectsFromRobotNodes(const objpose::DetachAllObjectsFromRobotNodesInput& input, ICE_CURRENT_ARG) override; - - objpose::AgentFramesSeq getAttachableFrames(ICE_CURRENT_ARG) override; - - // HEAD MOVEMENT SIGNALS - - objpose::SignalHeadMovementOutput signalHeadMovement(const objpose::SignalHeadMovementInput& input, ICE_CURRENT_ARG) override; - - - - // Remote GUI - void createRemoteGuiTab(); - void RemoteGui_update() override; - - - protected: - - armarx::PropertyDefinitionsPtr createPropertyDefinitions() override; - - void onInitComponent() override; - void onConnectComponent() override; - - void onDisconnectComponent() override; - void onExitComponent() override; - - - private: - - void updateProviderInfo(const std::string& providerName, const objpose::ProviderInfo& info); - - void updateObjectPoses(const std::string& providerName, const objpose::data::ProvidedObjectPoseSeq& providedPoses); - void handleProviderUpdate(const std::string& providerName); - - objpose::ObjectPoseProviderPrx getProviderProxy(const std::string& providerName); - - - - // Visualization - - void visualizeRun(); - - - private: - - DebugObserverInterfacePrx debugObserver; - - using Data = objpose::observer::Data; - Data data; - std::mutex& dataMutex = memoryMutex; - - using RobotHeadMovement = objpose::observer::RobotHeadMovement; - RobotHeadMovement robotHead; - std::mutex robotHeadMutex; - - objpose::observer::Visu visu; - std::mutex visuMutex; - - - struct Calibration - { - std::string robotNode = "Neck_2_Pitch"; - float offset = 0.0f; - - void defineProperties(armarx::PropertyDefinitionsPtr defs, const std::string& prefix = "calibration."); - }; - Calibration calibration; - - - struct RemoteGuiTab : RemoteGui::Client::Tab - { - objpose::observer::Visu::RemoteGui visu; - objpose::observer::Data::RemoteGui data; - objpose::observer::Decay::RemoteGui decay; - objpose::observer::RobotHeadMovement::RemoteGui robotHead; - }; - RemoteGuiTab tab; - - }; - -} - -#undef ICE_CURRENT_ARG diff --git a/source/RobotAPI/components/ObjectPoseObserver/test/CMakeLists.txt b/source/RobotAPI/components/ObjectPoseObserver/test/CMakeLists.txt deleted file mode 100644 index 878921745f8b8cfd10cc67cbcc594d2199c84ea3..0000000000000000000000000000000000000000 --- a/source/RobotAPI/components/ObjectPoseObserver/test/CMakeLists.txt +++ /dev/null @@ -1,5 +0,0 @@ - -# Libs required for the tests -SET(LIBS ${LIBS} ArmarXCore ObjectPoseObserver) - -armarx_add_test(ObjectPoseObserverTest ObjectPoseObserverTest.cpp "${LIBS}") diff --git a/source/RobotAPI/components/ObjectPoseObserver/test/ObjectPoseObserverTest.cpp b/source/RobotAPI/components/ObjectPoseObserver/test/ObjectPoseObserverTest.cpp deleted file mode 100644 index 903d51bfb830771b2b70b0ef4bdacc414ecee3ed..0000000000000000000000000000000000000000 --- a/source/RobotAPI/components/ObjectPoseObserver/test/ObjectPoseObserverTest.cpp +++ /dev/null @@ -1,68 +0,0 @@ -/* - * This file is part of ArmarX. - * - * ArmarX is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * ArmarX is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - * - * @package RobotAPI::ArmarXObjects::ObjectPoseObserver - * @author Rainer Kartmann ( rainer dot kartmann at kit dot edu ) - * @date 2020 - * @copyright http://www.gnu.org/licenses/gpl-2.0.txt - * GNU General Public License - */ - -#define BOOST_TEST_MODULE RobotAPI::ArmarXObjects::ObjectPoseObserver - -#define ARMARX_BOOST_TEST - -#include <RobotAPI/Test.h> -#include <RobotAPI/components/ObjectPoseObserver/ObjectPoseObserver.h> - -#include <RobotAPI/libraries/ArmarXObjects/ice_conversions.h> -#include <RobotAPI/libraries/core/Pose.h> - -#include <iostream> - -using namespace armarx; - - -BOOST_AUTO_TEST_CASE(test_from_to_OOBB) -{ - Eigen::Vector3f pos(-100, -200, -300); - Eigen::Matrix3f ori = Eigen::AngleAxisf(1.0, Eigen::Vector3f(1, 2, 3).normalized()).toRotationMatrix(); - Eigen::Vector3f extents(40, 50, 60); - - armarx::objpose::Box box; - box.position = new Vector3(pos); - box.orientation = new Quaternion(ori); - box.extents = new Vector3(extents); - - - const float prec = 1e-3; - - simox::OrientedBoxf oobb; - armarx::objpose::fromIce(box, oobb); - ARMARX_CHECK_LESS_EQUAL((oobb.center() - pos).norm(), prec); - ARMARX_CHECK(oobb.rotation().isApprox(ori, prec)); - ARMARX_CHECK_LESS_EQUAL((oobb.dimensions() - extents).norm(), prec); - - armarx::objpose::Box boxOut; - armarx::objpose::toIce(boxOut, oobb); - - Eigen::Vector3f posOut = Vector3Ptr::dynamicCast(boxOut.position)->toEigen(); - Eigen::Matrix3f oriOut = QuaternionPtr::dynamicCast(boxOut.orientation)->toEigen(); - Eigen::Vector3f extentsOut = Vector3Ptr::dynamicCast(boxOut.extents)->toEigen(); - - ARMARX_CHECK_LESS_EQUAL((posOut - pos).norm(), prec); - ARMARX_CHECK(oriOut.isApprox(ori, prec)); - ARMARX_CHECK_LESS_EQUAL((extentsOut - extents).norm(), prec); -}