From bbe491040a14aa1eec3bf0b12a19b6f2a3aac9f5 Mon Sep 17 00:00:00 2001 From: Fabian Reister <fabian.reister@kit.edu> Date: Thu, 23 Jun 2022 18:08:33 +0200 Subject: [PATCH] new component: VirtualRobotWriterExample --- .../components/armem/client/CMakeLists.txt | 1 + .../VirtualRobotWriterExample/CMakeLists.txt | 22 +++ .../VirtualRobotWriterExample.cpp | 158 ++++++++++++++++++ .../VirtualRobotWriterExample.h | 78 +++++++++ 4 files changed, 259 insertions(+) create mode 100644 source/RobotAPI/components/armem/client/VirtualRobotWriterExample/CMakeLists.txt create mode 100644 source/RobotAPI/components/armem/client/VirtualRobotWriterExample/VirtualRobotWriterExample.cpp create mode 100644 source/RobotAPI/components/armem/client/VirtualRobotWriterExample/VirtualRobotWriterExample.h diff --git a/source/RobotAPI/components/armem/client/CMakeLists.txt b/source/RobotAPI/components/armem/client/CMakeLists.txt index 258a28ea0..6eb04b931 100644 --- a/source/RobotAPI/components/armem/client/CMakeLists.txt +++ b/source/RobotAPI/components/armem/client/CMakeLists.txt @@ -3,3 +3,4 @@ add_subdirectory(ExampleMemoryClient) add_subdirectory(GraspProviderExample) add_subdirectory(VirtualRobotReaderExampleClient) +add_subdirectory(VirtualRobotWriterExample) diff --git a/source/RobotAPI/components/armem/client/VirtualRobotWriterExample/CMakeLists.txt b/source/RobotAPI/components/armem/client/VirtualRobotWriterExample/CMakeLists.txt new file mode 100644 index 000000000..a87ba755c --- /dev/null +++ b/source/RobotAPI/components/armem/client/VirtualRobotWriterExample/CMakeLists.txt @@ -0,0 +1,22 @@ +set(LIB_NAME VirtualRobotWriterExample) + +armarx_component_set_name("${LIB_NAME}") +armarx_set_target("Library: ${LIB_NAME}") + +# Add the component +armarx_add_component( + COMPONENT_LIBS + ArmarXCore + armem_objects + armem_robot_state + SOURCES + VirtualRobotWriterExample.cpp + HEADERS + VirtualRobotWriterExample.h +) + +# Generate the application +armarx_generate_and_add_component_executable( + # If your component is not defined in ::armarx, specify its namespace here: + COMPONENT_NAMESPACE "armarx::virtual_robot_writer_example" +) diff --git a/source/RobotAPI/components/armem/client/VirtualRobotWriterExample/VirtualRobotWriterExample.cpp b/source/RobotAPI/components/armem/client/VirtualRobotWriterExample/VirtualRobotWriterExample.cpp new file mode 100644 index 000000000..275353128 --- /dev/null +++ b/source/RobotAPI/components/armem/client/VirtualRobotWriterExample/VirtualRobotWriterExample.cpp @@ -0,0 +1,158 @@ +/* + * 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/>. + * + * @author Fabian Reister ( fabian dot reister at kit dot edu ) + * @date 2021 + * @copyright http://www.gnu.org/licenses/gpl-2.0.txt + * GNU General Public License + */ + +#include "VirtualRobotWriterExample.h" + +#include <memory> + +#include <Eigen/Geometry> + +#include <IceUtil/Time.h> + +#include <SimoxUtility/math/pose/pose.h> +#include <VirtualRobot/Robot.h> +#include <VirtualRobot/VirtualRobot.h> +#include <VirtualRobot/XML/RobotIO.h> + +#include "ArmarXCore/core/time/Clock.h" +#include <ArmarXCore/core/PackagePath.h> +#include <ArmarXCore/core/exceptions/local/ExpressionException.h> +#include <ArmarXCore/core/logging/Logging.h> +#include <ArmarXCore/core/services/tasks/PeriodicTask.h> +#include <ArmarXCore/core/system/ArmarXDataPath.h> +#include <ArmarXCore/core/time/CycleUtil.h> + +#include <RobotAPI/libraries/armem/client/query/Builder.h> +#include <RobotAPI/libraries/armem/client/query/query_fns.h> +#include <RobotAPI/libraries/armem/core/Time.h> +#include <RobotAPI/libraries/armem/core/wm/ice_conversions.h> +#include <RobotAPI/libraries/armem/server/MemoryRemoteGui.h> +#include <RobotAPI/libraries/armem_objects/types.h> + +namespace armarx::virtual_robot_writer_example +{ + VirtualRobotWriterExample::VirtualRobotWriterExample() + { + addPlugin(virtualRobotWriterPlugin); + } + + armarx::PropertyDefinitionsPtr + VirtualRobotWriterExample::createPropertyDefinitions() + { + armarx::PropertyDefinitionsPtr defs = + new ComponentPropertyDefinitions(getConfigIdentifier()); + + // defs->topic(debugObserver); + + defs->optional(p.updateFrequency, "updateFrequency", "Memory update frequency (write)."); + defs->optional(p.robot.package, "robot.package", ""); + defs->optional(p.robot.path, "robot.path", ""); + + return defs; + } + + std::string + VirtualRobotWriterExample::getDefaultName() const + { + return "VirtualRobotWriterExample"; + } + + void + VirtualRobotWriterExample::onInitComponent() + { + } + + void + VirtualRobotWriterExample::onConnectComponent() + { + ARMARX_IMPORTANT << "Running example."; + start = armem::Time::Now(); + + task = new PeriodicTask<VirtualRobotWriterExample>( + this, &VirtualRobotWriterExample::run, static_cast<int>(1000.f / p.updateFrequency)); + task->start(); + } + + void + VirtualRobotWriterExample::onDisconnectComponent() + { + task->stop(); + } + + void + VirtualRobotWriterExample::onExitComponent() + { + } + + VirtualRobot::RobotPtr + VirtualRobotWriterExample::loadRobot() const + { + auto robot = + VirtualRobot::RobotIO::loadRobot(PackagePath(p.robot.package, p.robot.path).toSystemPath(), + VirtualRobot::RobotIO::eStructure); + return robot; + } + + + void + VirtualRobotWriterExample::run() + { + if (robot == nullptr) + { + robot = loadRobot(); + + if (robot == nullptr) // still + { + ARMARX_ERROR << "Loading robot failed"; + return; + } + } + + ARMARX_DEBUG << "Reporting robot"; + ARMARX_CHECK(virtualRobotWriterPlugin->get().storeDescription(*robot)); + + const armem::Time now = armem::Time::Now(); + const float t = float((now - start).toSecondsDouble()); + + // move joints at certain frequency + const float m = (1 + std::sin(t / (M_2_PIf32))) / 2; // in [0,1] + + auto jointValues = robot->getJointValues(); + for (auto& [k, v] : jointValues) + { + const auto node = robot->getRobotNode(k); + + if (node->isLimitless()) + { + continue; + } + + v = node->getJointLimitLow() + + (node->getJointLimitHigh() - node->getJointLimitLow()) * m; + } + + robot->setGlobalPose(simox::math::pose(Eigen::Vector3f(1000, 0, 0))); + robot->setJointValues(jointValues); + + ARMARX_CHECK(virtualRobotWriterPlugin->get().storeState(*robot)); + } + +} // namespace armarx::virtual_robot_writer_example diff --git a/source/RobotAPI/components/armem/client/VirtualRobotWriterExample/VirtualRobotWriterExample.h b/source/RobotAPI/components/armem/client/VirtualRobotWriterExample/VirtualRobotWriterExample.h new file mode 100644 index 000000000..af91d8354 --- /dev/null +++ b/source/RobotAPI/components/armem/client/VirtualRobotWriterExample/VirtualRobotWriterExample.h @@ -0,0 +1,78 @@ + +#pragma once + +#include <VirtualRobot/VirtualRobot.h> + +#include <ArmarXCore/core/services/tasks/PeriodicTask.h> +#include <ArmarXCore/core/Component.h> +#include <ArmarXCore/interface/observers/ObserverInterface.h> +#include <ArmarXCore/util/tasks.h> + +#include <ArmarXGui/libraries/ArmarXGuiComponentPlugins/LightweightRemoteGuiComponentPlugin.h> + +#include "RobotAPI/libraries/armem/client/plugins/ReaderWriterPlugin.h" +#include "RobotAPI/libraries/armem_robot_state/client/common/VirtualRobotWriter.h" +#include <RobotAPI/libraries/armem/core/Time.h> +#include <RobotAPI/interface/armem/mns/MemoryNameSystemInterface.h> +#include <RobotAPI/interface/armem/server/MemoryInterface.h> +#include <RobotAPI/libraries/armem/client/plugins.h> +#include <RobotAPI/libraries/armem/core/wm/memory_definitions.h> + +namespace armarx::virtual_robot_writer_example +{ + + /** + * @defgroup Component-ExampleClient ExampleClient + * @ingroup RobotAPI-Components + * A description of the component ExampleClient. + * + * @class ExampleClient + * @ingroup Component-ExampleClient + * @brief Brief description of class ExampleClient. + * + * Detailed description of class ExampleClient. + */ + class VirtualRobotWriterExample : + virtual public armarx::Component, + virtual public armarx::armem::client::ComponentPluginUser + { + public: + VirtualRobotWriterExample(); + + /// @see armarx::ManagedIceObject::getDefaultName() + std::string getDefaultName() const override; + + protected: + armarx::PropertyDefinitionsPtr createPropertyDefinitions() override; + + void onInitComponent() override; + void onConnectComponent() override; + void onDisconnectComponent() override; + void onExitComponent() override; + + void run(); + + private: + VirtualRobot::RobotPtr loadRobot() const; + VirtualRobot::RobotPtr robot; + + /// Reference timestamp for object movement + armem::Time start; + + armarx::PeriodicTask<VirtualRobotWriterExample>::pointer_type task; + + armem::client::plugins::ReaderWriterPlugin<armem::robot_state::VirtualRobotWriter>* virtualRobotWriterPlugin = nullptr; + + struct Properties + { + float updateFrequency{10.F}; + + struct + { + std::string package; + std::string path; + } robot; + } p; + }; + +} // namespace armarx::virtual_robot_writer_example -- GitLab