diff --git a/CMakeLists.txt b/CMakeLists.txt index 8d684da402ca704e30e1d7219a24accd0e5f1742..100538b7b7a1e37d867cadf03cd1c6fe8240bb39 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -17,6 +17,9 @@ set(ARMARX_ENABLE_AUTO_CODE_FORMATTING TRUE) armarx_project("RobotAPI") depends_on_armarx_package(ArmarXGui) +find_package(DMP QUIET) + + add_subdirectory(source) install_project() diff --git a/scenarios/ArViz/config/ArVizStorage.cfg b/scenarios/ArViz/config/ArVizStorage.cfg index 0dcbd8d5775b8c0f562bba62b5f2fe282e2da6d0..30b8ea5904d318cf689370e81d3d3a7c47d07a68 100644 --- a/scenarios/ArViz/config/ArVizStorage.cfg +++ b/scenarios/ArViz/config/ArVizStorage.cfg @@ -68,7 +68,7 @@ # ArmarX.ArVizStorage.TopicName = ArVizTopic -# ArmarX.CachePath: Path for cache files. If relative path AND env. variable ARMARX_USER_CONFIG_DIR is set, the cache path will be made relative to ARMARX_USER_CONFIG_DIR. Otherwise if relative it will be relative to the default ArmarX config dir (${HOME}/.armarx) +# ArmarX.CachePath: Path for cache files. If relative path AND env. variable ARMARX_CONFIG_DIR is set, the cache path will be made relative to ARMARX_CONFIG_DIR. Otherwise if relative it will be relative to the default ArmarX config dir (${ARMARX_WORKSPACE}/armarx_config) # Attributes: # - Default: mongo/.cache # - Case sensitivity: yes diff --git a/scenarios/ArViz/config/DebugObserver.cfg b/scenarios/ArViz/config/DebugObserver.cfg index 4a0b9dac036cd4d103efd7d1b718d508f285d85a..8dc7ead26b3bd2f7678b3b3e7a1b00c01213225d 100644 --- a/scenarios/ArViz/config/DebugObserver.cfg +++ b/scenarios/ArViz/config/DebugObserver.cfg @@ -18,7 +18,7 @@ # ArmarX.ApplicationName = "" -# ArmarX.CachePath: Path for cache files. If relative path AND env. variable ARMARX_USER_CONFIG_DIR is set, the cache path will be made relative to ARMARX_USER_CONFIG_DIR. Otherwise if relative it will be relative to the default ArmarX config dir (${HOME}/.armarx) +# ArmarX.CachePath: Path for cache files. If relative path AND env. variable ARMARX_CONFIG_DIR is set, the cache path will be made relative to ARMARX_CONFIG_DIR. Otherwise if relative it will be relative to the default ArmarX config dir (${ARMARX_WORKSPACE}/armarx_config) # Attributes: # - Default: mongo/.cache # - Case sensitivity: yes diff --git a/scenarios/ArVizExample/config/ArVizExample.cfg b/scenarios/ArVizExample/config/ArVizExample.cfg index bbc0fa108ff0f746a7460ca98e1ef3e2b69302b3..0c0ee4c6e9a0e5ed6bbf7955e59b03a898c15528 100644 --- a/scenarios/ArVizExample/config/ArVizExample.cfg +++ b/scenarios/ArVizExample/config/ArVizExample.cfg @@ -61,7 +61,7 @@ # ArmarX.ArVizExample.layers.ManyElements = false -# ArmarX.CachePath: Path for cache files. If relative path AND env. variable ARMARX_USER_CONFIG_DIR is set, the cache path will be made relative to ARMARX_USER_CONFIG_DIR. Otherwise if relative it will be relative to the default ArmarX config dir (${HOME}/.armarx) +# ArmarX.CachePath: Path for cache files. If relative path AND env. variable ARMARX_CONFIG_DIR is set, the cache path will be made relative to ARMARX_CONFIG_DIR. Otherwise if relative it will be relative to the default ArmarX config dir (${ARMARX_WORKSPACE}/armarx_config) # Attributes: # - Default: mongo/.cache # - Case sensitivity: yes diff --git a/scenarios/ArVizExample/config/ArVizStorage.cfg b/scenarios/ArVizExample/config/ArVizStorage.cfg index 0dcbd8d5775b8c0f562bba62b5f2fe282e2da6d0..30b8ea5904d318cf689370e81d3d3a7c47d07a68 100644 --- a/scenarios/ArVizExample/config/ArVizStorage.cfg +++ b/scenarios/ArVizExample/config/ArVizStorage.cfg @@ -68,7 +68,7 @@ # ArmarX.ArVizStorage.TopicName = ArVizTopic -# ArmarX.CachePath: Path for cache files. If relative path AND env. variable ARMARX_USER_CONFIG_DIR is set, the cache path will be made relative to ARMARX_USER_CONFIG_DIR. Otherwise if relative it will be relative to the default ArmarX config dir (${HOME}/.armarx) +# ArmarX.CachePath: Path for cache files. If relative path AND env. variable ARMARX_CONFIG_DIR is set, the cache path will be made relative to ARMARX_CONFIG_DIR. Otherwise if relative it will be relative to the default ArmarX config dir (${ARMARX_WORKSPACE}/armarx_config) # Attributes: # - Default: mongo/.cache # - Case sensitivity: yes diff --git a/scenarios/ArVizExample/config/DebugObserver.cfg b/scenarios/ArVizExample/config/DebugObserver.cfg index 4a0b9dac036cd4d103efd7d1b718d508f285d85a..8dc7ead26b3bd2f7678b3b3e7a1b00c01213225d 100644 --- a/scenarios/ArVizExample/config/DebugObserver.cfg +++ b/scenarios/ArVizExample/config/DebugObserver.cfg @@ -18,7 +18,7 @@ # ArmarX.ApplicationName = "" -# ArmarX.CachePath: Path for cache files. If relative path AND env. variable ARMARX_USER_CONFIG_DIR is set, the cache path will be made relative to ARMARX_USER_CONFIG_DIR. Otherwise if relative it will be relative to the default ArmarX config dir (${HOME}/.armarx) +# ArmarX.CachePath: Path for cache files. If relative path AND env. variable ARMARX_CONFIG_DIR is set, the cache path will be made relative to ARMARX_CONFIG_DIR. Otherwise if relative it will be relative to the default ArmarX config dir (${ARMARX_WORKSPACE}/armarx_config) # Attributes: # - Default: mongo/.cache # - Case sensitivity: yes diff --git a/scenarios/ArVizExample/config/RobotToArVizApp.cfg b/scenarios/ArVizExample/config/RobotToArVizApp.cfg index b023833a9d18ac3f4c1d92911b29ad1f8699a22c..b33276fe2dc50c8d6eadcb7beb004710f336e825 100644 --- a/scenarios/ArVizExample/config/RobotToArVizApp.cfg +++ b/scenarios/ArVizExample/config/RobotToArVizApp.cfg @@ -18,7 +18,7 @@ # ArmarX.ApplicationName = "" -# ArmarX.CachePath: Path for cache files. If relative path AND env. variable ARMARX_USER_CONFIG_DIR is set, the cache path will be made relative to ARMARX_USER_CONFIG_DIR. Otherwise if relative it will be relative to the default ArmarX config dir (${HOME}/.armarx) +# ArmarX.CachePath: Path for cache files. If relative path AND env. variable ARMARX_CONFIG_DIR is set, the cache path will be made relative to ARMARX_CONFIG_DIR. Otherwise if relative it will be relative to the default ArmarX config dir (${ARMARX_WORKSPACE}/armarx_config) # Attributes: # - Default: mongo/.cache # - Case sensitivity: yes diff --git a/source/RobotAPI/components/ArViz/ArVizStorage.h b/source/RobotAPI/components/ArViz/ArVizStorage.h index 220bc12b3c41eb17fdcf5110a4b237235ed5a7f7..02ebc981525bdc26ce277867950e79bbed39d17a 100644 --- a/source/RobotAPI/components/ArViz/ArVizStorage.h +++ b/source/RobotAPI/components/ArViz/ArVizStorage.h @@ -49,7 +49,7 @@ namespace armarx * visualization episodes and restore. * * - * @class ArViz + * @class ArVizStorage * @ingroup Component-ArVizStorage * * @brief Stores visualization elements drawn by ArViz clients. diff --git a/source/RobotAPI/components/ArViz/Example/ArVizExample.h b/source/RobotAPI/components/ArViz/Example/ArVizExample.h index 953dd1577cff25cb11dd0d6b055dbc92667192cc..252a0c6f2221b95872db648f05dcdbdf7d487c5f 100644 --- a/source/RobotAPI/components/ArViz/Example/ArVizExample.h +++ b/source/RobotAPI/components/ArViz/Example/ArVizExample.h @@ -47,22 +47,28 @@ namespace armarx * \li Open the gui plugin `ArViz` * \li Start the component `ArVizExample` * - * The scenario `ArVizExample` starts the necessary components including - * the example component. + * The scenario `ArVizExample` starts the necessary components, + * including the example component. * * + * A component which wants to visualize data via ArViz should: + * \li `#include <RobotAPI/libraries/RobotAPIComponentPlugins/ArVizComponentPlugin.h>` + * \li Inherit from the `armarx::ArVizComponentPluginUser`. This adds the + * necessary properties (e.g. the topic name) and provides a + * ready-to-use ArViz client called `arviz`. + * \li Use the inherited ArViz client variable `arviz` of type `viz::Client` + * to create layers, add visualization elements to the layers, + * and commit the layers to the ArViz topic. + * + * \see ArVizExample + * * * @class ArVizExample * @ingroup Component-ArVizExample - * @brief Brief description of class ArVizExample. * - * A component which wants to visualize data via ArViz should inherit from - * the `armarx::ArVizComponentPluginUser`. - * This adds the necessary properties (e.g. the topic name) and provides a - * ready-to-use ArViz client called `arviz`. - * The ArViz client can be used to create layers and commit them to the - * ArViz topic. + * @brief An example for how to use ArViz. * + * @see @ref Component-ArVizExample */ class ArVizExample : virtual public armarx::Component, diff --git a/source/RobotAPI/components/armem/addon/LegacyRobotStateMemoryAdapter/CMakeLists.txt b/source/RobotAPI/components/armem/addon/LegacyRobotStateMemoryAdapter/CMakeLists.txt index 9340296c089e80e1be44039534555519936551ba..7f3ad39c47742664118f7f4de02a32d6d85aa8a2 100644 --- a/source/RobotAPI/components/armem/addon/LegacyRobotStateMemoryAdapter/CMakeLists.txt +++ b/source/RobotAPI/components/armem/addon/LegacyRobotStateMemoryAdapter/CMakeLists.txt @@ -9,7 +9,9 @@ armarx_add_component( LIBS ArmarXCore ArmarXCoreInterfaces # for DebugObserverInterface ArmarXGuiComponentPlugins - RobotAPICore RobotAPIInterfaces armem armem_robot_state + RobotAPICore RobotAPIInterfaces + RobotAPI::armem + armem_robot_state ) #generate the application diff --git a/source/RobotAPI/components/armem/client/ExampleMemoryClient/CMakeLists.txt b/source/RobotAPI/components/armem/client/ExampleMemoryClient/CMakeLists.txt index 667e5d5ad070e08f331d505fa4e742ce61b39df7..b9434aeb6575293b01482473f3467403e969ab86 100644 --- a/source/RobotAPI/components/armem/client/ExampleMemoryClient/CMakeLists.txt +++ b/source/RobotAPI/components/armem/client/ExampleMemoryClient/CMakeLists.txt @@ -7,7 +7,9 @@ armarx_build_if(OpenCV_FOUND "OpenCV not available") set(COMPONENT_LIBS ArmarXCore ArmarXCoreInterfaces # for DebugObserverInterface ArmarXGuiComponentPlugins - RobotAPICore RobotAPIInterfaces armem aronopencvconverter aronjsonconverter + RobotAPICore RobotAPIInterfaces + armem + aronopencvconverter aronjsonconverter ${OpenCV_LIBRARIES} ) diff --git a/source/RobotAPI/components/armem/client/ExampleMemoryClient/ExampleMemoryClient.cpp b/source/RobotAPI/components/armem/client/ExampleMemoryClient/ExampleMemoryClient.cpp index eae52c5054369e599acebfa5378075b7a448d6e5..d5ffd4c911804296d10c756577b3c573b3174235 100644 --- a/source/RobotAPI/components/armem/client/ExampleMemoryClient/ExampleMemoryClient.cpp +++ b/source/RobotAPI/components/armem/client/ExampleMemoryClient/ExampleMemoryClient.cpp @@ -597,7 +597,6 @@ namespace armarx if (tab.queryResult) { - tab.queryResultGroup = armem::server::MemoryRemoteGui().makeGroupBox(*tab.queryResult); } VBoxLayout root = {tab.queryResultGroup, VSpacer()}; diff --git a/source/RobotAPI/components/armem/server/ExampleMemory/CMakeLists.txt b/source/RobotAPI/components/armem/server/ExampleMemory/CMakeLists.txt index de9b660b2175a34c4cd3aeb90152370f222ceb11..b1a5224421ff0147e3fd990c5c17917334dd61a9 100644 --- a/source/RobotAPI/components/armem/server/ExampleMemory/CMakeLists.txt +++ b/source/RobotAPI/components/armem/server/ExampleMemory/CMakeLists.txt @@ -6,7 +6,8 @@ armarx_build_if(OpenCV_FOUND "OpenCV not available") set(COMPONENT_LIBS ArmarXCore ArmarXCoreInterfaces # for DebugObserverInterface ArmarXGuiComponentPlugins - RobotAPICore RobotAPIInterfaces armem + RobotAPICore RobotAPIInterfaces + armem_server ) set(SOURCES diff --git a/source/RobotAPI/components/armem/server/GeneralPurposeMemory/CMakeLists.txt b/source/RobotAPI/components/armem/server/GeneralPurposeMemory/CMakeLists.txt index f0521043e0891a4b42b3fd75e612b607b3e421aa..278e9c29a43c0d8d42de5d512b128354481d89b9 100644 --- a/source/RobotAPI/components/armem/server/GeneralPurposeMemory/CMakeLists.txt +++ b/source/RobotAPI/components/armem/server/GeneralPurposeMemory/CMakeLists.txt @@ -4,7 +4,7 @@ armarx_component_set_name("GeneralPurposeMemory") set(COMPONENT_LIBS ArmarXCore ArmarXCoreInterfaces # for DebugObserverInterface ArmarXGuiComponentPlugins - RobotAPICore RobotAPIInterfaces armem + RobotAPICore RobotAPIInterfaces armem_server # RobotAPIComponentPlugins # for ArViz and other plugins ${IVT_LIBRARIES} diff --git a/source/RobotAPI/components/armem/server/GraspMemory/CMakeLists.txt b/source/RobotAPI/components/armem/server/GraspMemory/CMakeLists.txt index 7bac572cd11bae463d2349529691f2ff5d6b79b2..6f09f46f79512819800b879bbd7701677fde1118 100644 --- a/source/RobotAPI/components/armem/server/GraspMemory/CMakeLists.txt +++ b/source/RobotAPI/components/armem/server/GraspMemory/CMakeLists.txt @@ -4,7 +4,7 @@ armarx_component_set_name("GraspMemory") set(COMPONENT_LIBS ArmarXCore ArmarXCoreInterfaces # for DebugObserverInterface ArmarXGuiComponentPlugins - RobotAPICore RobotAPIInterfaces armem + RobotAPICore RobotAPIInterfaces armem_server RobotAPIComponentPlugins # for ArViz and other plugins ${IVT_LIBRARIES} diff --git a/source/RobotAPI/components/armem/server/MotionMemory/CMakeLists.txt b/source/RobotAPI/components/armem/server/MotionMemory/CMakeLists.txt index 4b9a866f9c3be383e589ba9e0bafbc60368f0f57..2762e4152f4a3711b4d49fd8022ef5f5a90bcbe4 100644 --- a/source/RobotAPI/components/armem/server/MotionMemory/CMakeLists.txt +++ b/source/RobotAPI/components/armem/server/MotionMemory/CMakeLists.txt @@ -7,21 +7,20 @@ armarx_add_component( ArmarXGuiComponentPlugins RobotAPICore RobotAPIInterfaces - RobotAPI::ArMem - RobotAPI::ArMemMotions - RobotAPI::armem_mps + RobotAPI::armem_server + RobotAPI::armem_motions_server + RobotAPI::armem_mps_server + SOURCES MotionMemory.cpp + HEADERS MotionMemory.h ) # add unit tests -add_subdirectory(test) +# add_subdirectory(test) #generate the application armarx_generate_and_add_component_executable() - - - diff --git a/source/RobotAPI/components/armem/server/ObjectMemory/CMakeLists.txt b/source/RobotAPI/components/armem/server/ObjectMemory/CMakeLists.txt index 1c90c244bf872fdc4931e0b9067a92c189d9b694..ac589f21a49e3b86f01d413b023dc3825fbf9f7c 100644 --- a/source/RobotAPI/components/armem/server/ObjectMemory/CMakeLists.txt +++ b/source/RobotAPI/components/armem/server/ObjectMemory/CMakeLists.txt @@ -8,7 +8,9 @@ set(COMPONENT_LIBS ArmarXGuiComponentPlugins # RobotAPI RobotAPI::ComponentPlugins + RobotAPI::armem_server RobotAPI::armem_objects + RobotAPI::armem_objects_server # This project ${PROJECT_NAME}Interfaces diff --git a/source/RobotAPI/components/armem/server/RobotStateMemory/CMakeLists.txt b/source/RobotAPI/components/armem/server/RobotStateMemory/CMakeLists.txt index f49cb33c231a20857aa30458b4f7f5f14c05acdc..24c6616942f86aa4a6e828675db83f59b14aff72 100644 --- a/source/RobotAPI/components/armem/server/RobotStateMemory/CMakeLists.txt +++ b/source/RobotAPI/components/armem/server/RobotStateMemory/CMakeLists.txt @@ -10,8 +10,8 @@ set(COMPONENT_LIBS # RobotAPI RobotAPICore RobotAPIInterfaces RobotAPIComponentPlugins - armem - armem_robot_state + RobotAPI::armem_server + RobotAPI::armem_robot_state_server ) set(SOURCES diff --git a/source/RobotAPI/components/units/RobotUnit/NJointControllers/NJointHolonomicPlatformGlobalPositionController.h b/source/RobotAPI/components/units/RobotUnit/NJointControllers/NJointHolonomicPlatformGlobalPositionController.h index 418d2e00d379d8d9a91ad4db4268090dc124606a..bf4d338d0e642a870c91fe86772d64371e65f1ce 100755 --- a/source/RobotAPI/components/units/RobotUnit/NJointControllers/NJointHolonomicPlatformGlobalPositionController.h +++ b/source/RobotAPI/components/units/RobotUnit/NJointControllers/NJointHolonomicPlatformGlobalPositionController.h @@ -51,10 +51,10 @@ namespace armarx float p = 1.0f; float i = 0.0f; float d = 0.0f; - float maxVelocity = 500; - float maxAcceleration = 400; + float maxVelocity = 400; + float maxAcceleration = 300; - float p_rot = 0.7f; + float p_rot = 0.8f; float i_rot = 0.0f; float d_rot = 0.0f; diff --git a/source/RobotAPI/gui-plugins/ArMemMemoryViewer/CMakeLists.txt b/source/RobotAPI/gui-plugins/ArMemMemoryViewer/CMakeLists.txt index 7ccd3c5dfe0ca69fc1dbb4f7b48cf854bdff8fa1..c449d1100f0ed75d7ccabe34e7ab6446b2996a1a 100644 --- a/source/RobotAPI/gui-plugins/ArMemMemoryViewer/CMakeLists.txt +++ b/source/RobotAPI/gui-plugins/ArMemMemoryViewer/CMakeLists.txt @@ -22,7 +22,8 @@ set(GUI_UIS # Add more libraries you depend on here, e.g. ${QT_LIBRARIES}. set(COMPONENT_LIBS SimpleConfigDialog - armem armem_gui + RobotAPI::armem + RobotAPI::armem_gui ) if(ArmarXGui_FOUND) diff --git a/source/RobotAPI/libraries/armem/CMakeLists.txt b/source/RobotAPI/libraries/armem/CMakeLists.txt index d98b1b34873da38be27ffbd34acf383a6af00aa7..ba231f670b3342011fd228da611d2e9d1b8d87cc 100644 --- a/source/RobotAPI/libraries/armem/CMakeLists.txt +++ b/source/RobotAPI/libraries/armem/CMakeLists.txt @@ -3,26 +3,12 @@ set(LIB_NAME armem) armarx_component_set_name("${LIB_NAME}") armarx_set_target("Library: ${LIB_NAME}") -SET(INSTALL_SCRIPT_MSG - "Please use the installation script in RobotAPI/etc/mongocxx to install libmongocxx and libbsoncxx." -) - -find_package(libmongocxx QUIET) -armarx_build_if(libmongocxx_FOUND "libmongocxx not available. ${INSTALL_SCRIPT_MSG}") -find_package(libbsoncxx QUIET) -armarx_build_if(libbsoncxx_FOUND "libbsoncxx not available. ${INSTALL_SCRIPT_MSG}") - set(LIBS - ArmarXCoreInterfaces ArmarXCore + ArmarXCoreInterfaces + ArmarXCore RemoteGui aron - - # Needed for LTM - RobotAPI::aron::converter::json - RobotAPI::aron::converter::opencv - ${LIBMONGOCXX_LIBRARIES} - ${LIBBSONCXX_LIBRARIES} ) set(LIB_FILES @@ -79,76 +65,6 @@ set(LIB_FILES client/query/Builder.cpp client/query/selectors.cpp - - server/MemoryToIceAdapter.cpp - server/MemoryRemoteGui.cpp - server/RemoteGuiAronDataVisitor.cpp - - server/ltm/base/detail/MemoryItem.cpp - server/ltm/base/detail/MemoryBase.cpp - server/ltm/base/detail/BufferedMemoryBase.cpp - server/ltm/base/detail/LUTMemoryBase.cpp - server/ltm/base/detail/CoreSegmentBase.cpp - server/ltm/base/detail/ProviderSegmentBase.cpp - server/ltm/base/detail/EntityBase.cpp - server/ltm/base/detail/EntitySnapshotBase.cpp - - server/ltm/base/filter/Filter.cpp - server/ltm/base/filter/frequencyFilter/FrequencyFilter.cpp - - server/ltm/base/extractor/Extractor.cpp - server/ltm/base/extractor/imageExtractor/ImageExtractor.cpp - server/ltm/base/extractor/noExtractor/NoExtractor.cpp - - server/ltm/base/converter/dict/Converter.cpp - server/ltm/base/converter/dict/json/JsonConverter.cpp - server/ltm/base/converter/dict/bson/BsonConverter.cpp - server/ltm/base/converter/image/Converter.cpp - server/ltm/base/converter/image/png/PngConverter.cpp - - server/ltm/base/forgetter/Forgetter.cpp - server/ltm/base/forgetter/LRUForgetter/LRUForgetter.cpp - - server/ltm/disk/detail/Data.cpp - server/ltm/disk/detail/DiskStorage.cpp - server/ltm/disk/Memory.cpp - server/ltm/disk/CoreSegment.cpp - server/ltm/disk/ProviderSegment.cpp - server/ltm/disk/Entity.cpp - server/ltm/disk/EntitySnapshot.cpp - - server/wm/memory_definitions.cpp - server/wm/ice_conversions.cpp - server/wm/detail/MaxHistorySize.cpp - - server/plugins/Plugin.cpp - server/plugins/ReadOnlyPluginUser.cpp - server/plugins/ReadWritePluginUser.cpp - - server/segment/detail/SpecializedSegment.cpp - server/segment/SpecializedCoreSegment.cpp - server/segment/SpecializedProviderSegment.cpp - server/segment/SpecializedSegment.cpp - - server/query_proc/base/BaseQueryProcessorBase.cpp - server/query_proc/base/EntityQueryProcessorBase.cpp - server/query_proc/base/ProviderSegmentQueryProcessorBase.cpp - server/query_proc/base/CoreSegmentQueryProcessorBase.cpp - server/query_proc/base/MemoryQueryProcessorBase.cpp - - server/query_proc/ltm/detail/EntityQueryProcessorBase.cpp - server/query_proc/ltm/detail/ProviderSegmentQueryProcessorBase.cpp - server/query_proc/ltm/detail/CoreSegmentQueryProcessorBase.cpp - server/query_proc/ltm/detail/MemoryQueryProcessorBase.cpp - server/query_proc/ltm/disk/ltm.cpp - - server/query_proc/wm/detail/EntityQueryProcessorBase.cpp - server/query_proc/wm/detail/ProviderSegmentQueryProcessorBase.cpp - server/query_proc/wm/detail/CoreSegmentQueryProcessorBase.cpp - server/query_proc/wm/detail/MemoryQueryProcessorBase.cpp - server/query_proc/wm/wm.cpp - - mns/MemoryNameSystem.cpp mns/Registry.cpp mns/plugins/Plugin.cpp @@ -227,83 +143,7 @@ set(LIB_HEADERS client/util/SimpleReaderBase.h client/util/SimpleWriterBase.h - server.h - server/forward_declarations.h - - server/MemoryToIceAdapter.h - server/MemoryRemoteGui.h - server/RemoteGuiAronDataVisitor.h - - server/ltm/base/detail/MemoryItem.h - server/ltm/base/detail/MemoryBase.h - server/ltm/base/detail/BufferedMemoryBase.h - server/ltm/base/detail/LUTMemoryBase.h - server/ltm/base/detail/CoreSegmentBase.h - server/ltm/base/detail/ProviderSegmentBase.h - server/ltm/base/detail/EntityBase.h - server/ltm/base/detail/EntitySnapshotBase.h - - server/ltm/base/filter/Filter.h - server/ltm/base/filter/frequencyFilter/FrequencyFilter.h - - server/ltm/base/extractor/Extractor.h - server/ltm/base/extractor/imageExtractor/ImageExtractor.h - server/ltm/base/extractor/noExtractor/NoExtractor.h - - server/ltm/base/converter/dict/Converter.h - server/ltm/base/converter/dict/json/JsonConverter.h - server/ltm/base/converter/dict/bson/BsonConverter.h - server/ltm/base/converter/image/Converter.h - server/ltm/base/converter/image/png/PngConverter.h - - - server/ltm/base/forgetter/Forgetter.h - server/ltm/base/forgetter/LRUForgetter/LRUForgetter.h - - server/ltm/disk/detail/Data.h - server/ltm/disk/detail/DiskStorage.h - server/ltm/disk/Memory.h - server/ltm/disk/CoreSegment.h - server/ltm/disk/ProviderSegment.h - server/ltm/disk/Entity.h - server/ltm/disk/EntitySnapshot.h - - server/wm/memory_definitions.h - server/wm/ice_conversions.h - server/wm/detail/MaxHistorySize.h - - server/plugins.h - server/plugins/Plugin.h - server/plugins/ReadOnlyPluginUser.h - server/plugins/ReadWritePluginUser.h - - server/segment/detail/SpecializedSegment.h - server/segment/SpecializedCoreSegment.h - server/segment/SpecializedProviderSegment.h - server/segment/SpecializedSegment.h - - server/query_proc.h - - server/query_proc/base.h - server/query_proc/base/BaseQueryProcessorBase.h - server/query_proc/base/EntityQueryProcessorBase.h - server/query_proc/base/ProviderSegmentQueryProcessorBase.h - server/query_proc/base/CoreSegmentQueryProcessorBase.h - server/query_proc/base/MemoryQueryProcessorBase.h - - server/query_proc/ltm/detail/EntityQueryProcessorBase.h - server/query_proc/ltm/detail/ProviderSegmentQueryProcessorBase.h - server/query_proc/ltm/detail/CoreSegmentQueryProcessorBase.h - server/query_proc/ltm/detail/MemoryQueryProcessorBase.h - server/query_proc/ltm/disk/ltm.h - - server/query_proc/wm/detail/EntityQueryProcessorBase.h - server/query_proc/wm/detail/ProviderSegmentQueryProcessorBase.h - server/query_proc/wm/detail/CoreSegmentQueryProcessorBase.h - server/query_proc/wm/detail/MemoryQueryProcessorBase.h - server/query_proc/wm/wm.h - mns.h mns/MemoryNameSystem.h @@ -331,8 +171,7 @@ armarx_add_library( add_library(RobotAPI::armem ALIAS "${LIB_NAME}") add_library(RobotAPI::ArMem ALIAS "${LIB_NAME}") -target_include_directories("${LIB_NAME}" PUBLIC ${LIBMONGOCXX_INCLUDE_DIRS}) -target_include_directories("${LIB_NAME}" PUBLIC ${LIBBSONCXX_INCLUDE_DIRS}) - # add unit tests add_subdirectory(test) + +add_subdirectory(server) diff --git a/source/RobotAPI/libraries/armem/server/CMakeLists.txt b/source/RobotAPI/libraries/armem/server/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..00e51e9e99a1fb0b518f88e5685bfa7069dc8667 --- /dev/null +++ b/source/RobotAPI/libraries/armem/server/CMakeLists.txt @@ -0,0 +1,194 @@ +set(LIB_NAME armem_server) + +armarx_component_set_name("${LIB_NAME}") +armarx_set_target("Library: ${LIB_NAME}") + +SET(INSTALL_SCRIPT_MSG + "Please use the installation script in RobotAPI/etc/mongocxx to install libmongocxx and libbsoncxx." +) + +find_package(libmongocxx QUIET) +armarx_build_if(libmongocxx_FOUND "libmongocxx not available. ${INSTALL_SCRIPT_MSG}") +find_package(libbsoncxx QUIET) +armarx_build_if(libbsoncxx_FOUND "libbsoncxx not available. ${INSTALL_SCRIPT_MSG}") + + +set(LIBS + ArmarXCoreInterfaces + ArmarXCore + RemoteGui + aron + RobotAPI::armem + + # Needed for LTM + RobotAPI::aron::converter::json + RobotAPI::aron::converter::opencv + ${LIBMONGOCXX_LIBRARIES} + ${LIBBSONCXX_LIBRARIES} +) + +set(LIB_FILES + MemoryToIceAdapter.cpp + MemoryRemoteGui.cpp + RemoteGuiAronDataVisitor.cpp + + ltm/base/detail/MemoryItem.cpp + ltm/base/detail/MemoryBase.cpp + ltm/base/detail/BufferedMemoryBase.cpp + ltm/base/detail/LUTMemoryBase.cpp + ltm/base/detail/CoreSegmentBase.cpp + ltm/base/detail/ProviderSegmentBase.cpp + ltm/base/detail/EntityBase.cpp + ltm/base/detail/EntitySnapshotBase.cpp + + ltm/base/filter/Filter.cpp + ltm/base/filter/frequencyFilter/FrequencyFilter.cpp + + ltm/base/extractor/Extractor.cpp + ltm/base/extractor/imageExtractor/ImageExtractor.cpp + ltm/base/extractor/noExtractor/NoExtractor.cpp + + ltm/base/converter/dict/Converter.cpp + ltm/base/converter/dict/json/JsonConverter.cpp + ltm/base/converter/dict/bson/BsonConverter.cpp + ltm/base/converter/image/Converter.cpp + ltm/base/converter/image/png/PngConverter.cpp + + ltm/base/forgetter/Forgetter.cpp + ltm/base/forgetter/LRUForgetter/LRUForgetter.cpp + + ltm/disk/detail/Data.cpp + ltm/disk/detail/DiskStorage.cpp + ltm/disk/Memory.cpp + ltm/disk/CoreSegment.cpp + ltm/disk/ProviderSegment.cpp + ltm/disk/Entity.cpp + ltm/disk/EntitySnapshot.cpp + + wm/memory_definitions.cpp + wm/ice_conversions.cpp + wm/detail/MaxHistorySize.cpp + + plugins/Plugin.cpp + plugins/ReadOnlyPluginUser.cpp + plugins/ReadWritePluginUser.cpp + + segment/Segment.cpp + segment/SpecializedSegment.cpp + + query_proc/base/BaseQueryProcessorBase.cpp + query_proc/base/EntityQueryProcessorBase.cpp + query_proc/base/ProviderSegmentQueryProcessorBase.cpp + query_proc/base/CoreSegmentQueryProcessorBase.cpp + query_proc/base/MemoryQueryProcessorBase.cpp + + query_proc/ltm/detail/EntityQueryProcessorBase.cpp + query_proc/ltm/detail/ProviderSegmentQueryProcessorBase.cpp + query_proc/ltm/detail/CoreSegmentQueryProcessorBase.cpp + query_proc/ltm/detail/MemoryQueryProcessorBase.cpp + query_proc/ltm/disk/ltm.cpp + + query_proc/wm/detail/EntityQueryProcessorBase.cpp + query_proc/wm/detail/ProviderSegmentQueryProcessorBase.cpp + query_proc/wm/detail/CoreSegmentQueryProcessorBase.cpp + query_proc/wm/detail/MemoryQueryProcessorBase.cpp + query_proc/wm/wm.cpp +) + +set(LIB_HEADERS + forward_declarations.h + + MemoryToIceAdapter.h + MemoryRemoteGui.h + RemoteGuiAronDataVisitor.h + + ltm/base/detail/MemoryItem.h + ltm/base/detail/MemoryBase.h + ltm/base/detail/BufferedMemoryBase.h + ltm/base/detail/LUTMemoryBase.h + ltm/base/detail/CoreSegmentBase.h + ltm/base/detail/ProviderSegmentBase.h + ltm/base/detail/EntityBase.h + ltm/base/detail/EntitySnapshotBase.h + + ltm/base/filter/Filter.h + ltm/base/filter/frequencyFilter/FrequencyFilter.h + + ltm/base/extractor/Extractor.h + ltm/base/extractor/imageExtractor/ImageExtractor.h + ltm/base/extractor/noExtractor/NoExtractor.h + + ltm/base/converter/dict/Converter.h + ltm/base/converter/dict/json/JsonConverter.h + ltm/base/converter/dict/bson/BsonConverter.h + ltm/base/converter/image/Converter.h + ltm/base/converter/image/png/PngConverter.h + + + ltm/base/forgetter/Forgetter.h + ltm/base/forgetter/LRUForgetter/LRUForgetter.h + + ltm/disk/detail/Data.h + ltm/disk/detail/DiskStorage.h + ltm/disk/Memory.h + ltm/disk/CoreSegment.h + ltm/disk/ProviderSegment.h + ltm/disk/Entity.h + ltm/disk/EntitySnapshot.h + + wm/memory_definitions.h + wm/ice_conversions.h + wm/detail/MaxHistorySize.h + + plugins.h + plugins/Plugin.h + plugins/ReadOnlyPluginUser.h + plugins/ReadWritePluginUser.h + + segment/Segment.h + segment/SpecializedSegment.h + + query_proc.h + + query_proc/base.h + query_proc/base/BaseQueryProcessorBase.h + query_proc/base/EntityQueryProcessorBase.h + query_proc/base/ProviderSegmentQueryProcessorBase.h + query_proc/base/CoreSegmentQueryProcessorBase.h + query_proc/base/MemoryQueryProcessorBase.h + + query_proc/ltm/detail/EntityQueryProcessorBase.h + query_proc/ltm/detail/ProviderSegmentQueryProcessorBase.h + query_proc/ltm/detail/CoreSegmentQueryProcessorBase.h + query_proc/ltm/detail/MemoryQueryProcessorBase.h + query_proc/ltm/disk/ltm.h + + query_proc/wm/detail/EntityQueryProcessorBase.h + query_proc/wm/detail/ProviderSegmentQueryProcessorBase.h + query_proc/wm/detail/CoreSegmentQueryProcessorBase.h + query_proc/wm/detail/MemoryQueryProcessorBase.h + query_proc/wm/wm.h +) + +# Clear variable set by CMakeLists.txt in parent directory. +set(ARON_FILES "") + +armarx_add_library( + LIB_NAME + "${LIB_NAME}" + SOURCES + "${LIB_FILES}" + HEADERS + "${LIB_HEADERS}" + LIBS + "${LIBS}" +) + + +add_library(RobotAPI::armem_server ALIAS "${LIB_NAME}") + +target_include_directories("${LIB_NAME}" PUBLIC ${LIBMONGOCXX_INCLUDE_DIRS}) +target_include_directories("${LIB_NAME}" PUBLIC ${LIBBSONCXX_INCLUDE_DIRS}) + +# add unit tests +add_subdirectory(test) diff --git a/source/RobotAPI/libraries/armem/test/ArMemLTMBenchmark.cpp b/source/RobotAPI/libraries/armem/server/test/ArMemLTMBenchmark.cpp similarity index 100% rename from source/RobotAPI/libraries/armem/test/ArMemLTMBenchmark.cpp rename to source/RobotAPI/libraries/armem/server/test/ArMemLTMBenchmark.cpp diff --git a/source/RobotAPI/libraries/armem/test/ArMemLTMTest.cpp b/source/RobotAPI/libraries/armem/server/test/ArMemLTMTest.cpp similarity index 100% rename from source/RobotAPI/libraries/armem/test/ArMemLTMTest.cpp rename to source/RobotAPI/libraries/armem/server/test/ArMemLTMTest.cpp diff --git a/source/RobotAPI/libraries/armem/test/ArMemMemoryTest.cpp b/source/RobotAPI/libraries/armem/server/test/ArMemMemoryTest.cpp similarity index 100% rename from source/RobotAPI/libraries/armem/test/ArMemMemoryTest.cpp rename to source/RobotAPI/libraries/armem/server/test/ArMemMemoryTest.cpp diff --git a/source/RobotAPI/libraries/armem/test/ArMemQueryTest.cpp b/source/RobotAPI/libraries/armem/server/test/ArMemQueryTest.cpp similarity index 100% rename from source/RobotAPI/libraries/armem/test/ArMemQueryTest.cpp rename to source/RobotAPI/libraries/armem/server/test/ArMemQueryTest.cpp diff --git a/source/RobotAPI/libraries/armem/server/test/CMakeLists.txt b/source/RobotAPI/libraries/armem/server/test/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..c8f646815ccd1838019cc74e2d2358451d8ec4c1 --- /dev/null +++ b/source/RobotAPI/libraries/armem/server/test/CMakeLists.txt @@ -0,0 +1,8 @@ + +# Libs required for the tests +SET(LIBS ${LIBS} ArmarXCore ${LIB_NAME}) + +armarx_add_test(ArMemLTMTest ArMemLTMTest.cpp "${LIBS}") +armarx_add_test(ArMemLTMBenchmark ArMemLTMBenchmark.cpp "${LIBS}") +armarx_add_test(ArMemMemoryTest ArMemMemoryTest.cpp "${LIBS}") +armarx_add_test(ArMemQueryTest ArMemQueryTest.cpp "${LIBS}") diff --git a/source/RobotAPI/libraries/armem/test/CMakeLists.txt b/source/RobotAPI/libraries/armem/test/CMakeLists.txt index a80618cee37da7a0ab0e3198d8f9eda431964bfb..592b9aef3105bd7fc780c92348cae11e60f65a6d 100644 --- a/source/RobotAPI/libraries/armem/test/CMakeLists.txt +++ b/source/RobotAPI/libraries/armem/test/CMakeLists.txt @@ -5,9 +5,5 @@ SET(LIBS ${LIBS} ArmarXCore ${LIB_NAME}) armarx_add_test(ArMemForEachTest ArMemForEachTest.cpp "${LIBS}") armarx_add_test(ArMemGetFindTest ArMemGetFindTest.cpp "${LIBS}") armarx_add_test(ArMemIceConversionsTest ArMemIceConversionsTest.cpp "${LIBS}") -armarx_add_test(ArMemLTMTest ArMemLTMTest.cpp "${LIBS}") -armarx_add_test(ArMemLTMBenchmark ArMemLTMBenchmark.cpp "${LIBS}") -armarx_add_test(ArMemMemoryTest ArMemMemoryTest.cpp "${LIBS}") armarx_add_test(ArMemMemoryIDTest ArMemMemoryIDTest.cpp "${LIBS}") armarx_add_test(ArMemQueryBuilderTest ArMemQueryBuilderTest.cpp "${LIBS}") -armarx_add_test(ArMemQueryTest ArMemQueryTest.cpp "${LIBS}") diff --git a/source/RobotAPI/libraries/armem_gui/CMakeLists.txt b/source/RobotAPI/libraries/armem_gui/CMakeLists.txt index 2a781dd3989d5731393e1b5d9304b06f467611a4..b75fa106e2c89434d1032ba3a0173421fa7e1bc6 100644 --- a/source/RobotAPI/libraries/armem_gui/CMakeLists.txt +++ b/source/RobotAPI/libraries/armem_gui/CMakeLists.txt @@ -10,7 +10,10 @@ set(LIBRARIES # ArmarXGui SimpleConfigDialog # RobotAPI - aroneigenconverter armem + aroncommon + aroneigenconverter + armem + armem_server # for disk LTM ) set(SOURCES @@ -41,6 +44,7 @@ set(SOURCES instance/tree_visitors/TreeDataVisitorBase.cpp instance/tree_visitors/TreeDataVisitor.cpp instance/tree_visitors/TreeTypedDataVisitor.cpp + instance/tree_visitors/TreeTypedJSONConverter.cpp memory/GroupBox.cpp memory/TreeWidget.cpp @@ -81,6 +85,7 @@ set(HEADERS instance/tree_visitors/TreeDataVisitorBase.h instance/tree_visitors/TreeDataVisitor.h instance/tree_visitors/TreeTypedDataVisitor.h + instance/tree_visitors/TreeTypedJSONConverter.h memory/GroupBox.h memory/TreeWidget.h @@ -93,5 +98,9 @@ set(HEADERS armarx_gui_library("${LIB_NAME}" "${SOURCES}" "${GUI_MOC_HDRS}" "${GUI_UIS}" "" "${LIBRARIES}") +add_library(${PROJECT_NAME}::armem_gui ALIAS armem_gui) + + # add unit tests add_subdirectory(test) + diff --git a/source/RobotAPI/libraries/armem_gui/instance/InstanceView.cpp b/source/RobotAPI/libraries/armem_gui/instance/InstanceView.cpp index b1f347c46cc32a391212d1cd89c88255f7703aa8..8a61ecd6de4053dac87894685e2b011aec824245 100644 --- a/source/RobotAPI/libraries/armem_gui/instance/InstanceView.cpp +++ b/source/RobotAPI/libraries/armem_gui/instance/InstanceView.cpp @@ -1,4 +1,5 @@ #include "InstanceView.h" +#include <new> #include <QAction> #include <QApplication> @@ -20,7 +21,6 @@ #include <ArmarXCore/core/exceptions/local/ExpressionException.h> -#include <RobotAPI/libraries/aron/converter/json/NLohmannJSONConverter.h> #include <RobotAPI/libraries/aron/core/data/variant/complex/NDArray.h> #include <RobotAPI/libraries/aron/core/type/variant/container/Object.h> @@ -33,6 +33,7 @@ #include <RobotAPI/libraries/armem_gui/instance/serialize_path.h> #include <RobotAPI/libraries/armem_gui/instance/tree_builders/DataTreeBuilder.h> #include <RobotAPI/libraries/armem_gui/instance/tree_builders/TypedDataTreeBuilder.h> +#include <RobotAPI/libraries/armem_gui/instance/tree_visitors/TreeTypedJSONConverter.h> #include "MemoryIDTreeWidgetItem.h" #include "WidgetsWithToolbar.h" @@ -260,6 +261,14 @@ namespace armarx::armem::gui::instance menu.addAction(action); } } + else if (item == this->treeItemData && currentInstance.has_value()) + { + QAction* action = makeActionCopyDataToClipboard(); + if (action) + { + menu.addAction(action); + } + } else if (item->parent() == nullptr) { return; // Other top level item => no context menu. @@ -329,7 +338,11 @@ namespace armarx::armem::gui::instance const std::optional<aron::Path> elementPath = getElementPath(item); if (elementPath) { - menu.addAction(makeActionCopyDataToClipboard(elementPath.value())); + QAction* action = makeActionCopyDataToClipboard(elementPath.value()); + if (action) + { + menu.addAction(action); + } } if (menu.actions().size() > 0) @@ -420,19 +433,39 @@ namespace armarx::armem::gui::instance return action; } + QAction* InstanceView::makeActionCopyDataToClipboard() + { + return makeCopyAction(currentInstance->data()); + } + QAction* InstanceView::makeActionCopyDataToClipboard(const aron::Path& path) { - QAction* action = new QAction("Copy data to clipboard as JSON"); + try + { + aron::data::VariantPtr element = currentInstance->data()->navigateAbsolute(path); + return makeCopyAction(element); + } + catch (const aron::error::AronException& e) + { + ARMARX_WARNING << "Could not convert Aron data to JSON: " << e.getReason(); + } + return nullptr; + } - connect(action, &QAction::triggered, [this, path]() + QAction* InstanceView::makeCopyAction(const aron::data::VariantPtr& element) + { + QAction* action = new QAction("Copy data to clipboard as JSON"); + connect(action, &QAction::triggered, [this, element]() { try { - aron::data::VariantPtr element = currentInstance->data()->navigateAbsolute(path); - nlohmann::json json = - aron::converter::AronNlohmannJSONConverter::ConvertToNlohmannJSON(element); + TreeTypedJSONConverter conv; + // TODO(phesch): Type hierarchy doesn't match data hierarchy + armarx::aron::data::visitRecursive(conv, currentInstance->data(), currentAronType); + //nlohmann::json json = + // aron::converter::AronNlohmannJSONConverter::ConvertToNlohmannJSON(element); QClipboard* clipboard = QApplication::clipboard(); - clipboard->setText(QString::fromStdString(json.dump(2))); + clipboard->setText(QString::fromStdString(conv.getJSON().dump(2))); QApplication::processEvents(); } catch (const aron::error::AronException& e) @@ -444,7 +477,6 @@ namespace armarx::armem::gui::instance return action; } - void InstanceView::showImageView(const aron::Path& elementPath) { if (not currentInstance) diff --git a/source/RobotAPI/libraries/armem_gui/instance/InstanceView.h b/source/RobotAPI/libraries/armem_gui/instance/InstanceView.h index 1dc2ce13ec8fadad24072d9301817ceca7779a64..75e41ab9cb4c61f6267e74454d261dff48488ac9 100644 --- a/source/RobotAPI/libraries/armem_gui/instance/InstanceView.h +++ b/source/RobotAPI/libraries/armem_gui/instance/InstanceView.h @@ -79,7 +79,9 @@ namespace armarx::armem::gui::instance QAction* makeActionResolveMemoryID(const MemoryID& id); QAction* makeActionCopyMemoryID(const MemoryID& id); + QAction* makeActionCopyDataToClipboard(); QAction* makeActionCopyDataToClipboard(const aron::Path& path); + QAction* makeCopyAction(const aron::data::VariantPtr& element); private: diff --git a/source/RobotAPI/libraries/armem_gui/instance/tree_visitors/TreeTypedJSONConverter.cpp b/source/RobotAPI/libraries/armem_gui/instance/tree_visitors/TreeTypedJSONConverter.cpp new file mode 100644 index 0000000000000000000000000000000000000000..b7d157c746d3b4c5dfc99f7bc91fddefe5405af9 --- /dev/null +++ b/source/RobotAPI/libraries/armem_gui/instance/tree_visitors/TreeTypedJSONConverter.cpp @@ -0,0 +1,288 @@ +#include "TreeTypedJSONConverter.h" + +#include <SimoxUtility/json/eigen_conversion.h> + +#include <ArmarXCore/core/logging/Logging.h> + +#include "RobotAPI/libraries/aron/core/Exception.h" +#include <RobotAPI/libraries/armem/core/Time.h> +#include <RobotAPI/libraries/aron/converter/eigen/EigenConverter.h> + +namespace armarx::armem::gui::instance +{ + TreeTypedJSONConverter::TreeTypedJSONConverter() + { + jsonStack.push({"", nlohmann::json()}); + } + + const nlohmann::json& + TreeTypedJSONConverter::getJSON() + { + nlohmann::json& obj = jsonStack.top().second; + if (obj.front().is_object()) + { + return obj.front(); + } + return obj; + } + + void + TreeTypedJSONConverter::visitObjectOnEnter(DataInput& elementData, TypeInput& /*elementType*/) + { + std::string key = ""; + try + { + key = elementData->getPath().getLastElement(); + } + catch (const aron::error::AronException& e) + { + // This happens when we start at the top-level object. + } + jsonStack.push({key, nlohmann::json(nlohmann::json::value_t::object)}); + } + + void + TreeTypedJSONConverter::visitObjectOnExit(DataInput& /*elementData*/, + TypeInput& /*elementType*/) + { + auto obj = jsonStack.top(); + jsonStack.pop(); + insertIntoJSON(obj.first, obj.second); + } + + void + TreeTypedJSONConverter::visitDictOnEnter(DataInput& elementData, TypeInput& elementType) + { + this->visitObjectOnEnter(elementData, elementType); + } + + void + TreeTypedJSONConverter::visitDictOnExit(DataInput& elementData, TypeInput& elementType) + { + this->visitObjectOnExit(elementData, elementType); + } + + void + TreeTypedJSONConverter::visitPairOnEnter(DataInput& elementData, TypeInput& elementType) + { + this->visitListOnEnter(elementData, elementType); + } + + void + TreeTypedJSONConverter::visitPairOnExit(DataInput& elementData, TypeInput& elementType) + { + this->visitListOnExit(elementData, elementType); + } + + void + TreeTypedJSONConverter::visitTupleOnEnter(DataInput& elementData, TypeInput& elementType) + { + this->visitListOnEnter(elementData, elementType); + } + + void + TreeTypedJSONConverter::visitTupleOnExit(DataInput& elementData, TypeInput& elementType) + { + this->visitListOnExit(elementData, elementType); + } + + void + TreeTypedJSONConverter::visitListOnEnter(DataInput& elementData, TypeInput& /*elementType*/) + { + const std::string key = elementData->getPath().getLastElement(); + jsonStack.push({key, nlohmann::json(nlohmann::json::value_t::array)}); + } + + void + TreeTypedJSONConverter::visitListOnExit(DataInput& /*elementData*/, TypeInput& /*elementType*/) + { + auto list = jsonStack.top(); + jsonStack.pop(); + insertIntoJSON(list.first, list.second); + } + + void + TreeTypedJSONConverter::visitMatrix(DataInput& elementData, TypeInput& elementType) + { + const std::string key = elementData->getPath().getLastElement(); + auto nd = *aron::data::NDArray::DynamicCastAndCheck(elementData); + auto t = *aron::type::Matrix::DynamicCastAndCheck(elementType); + nlohmann::json obj; + if (nd.getType() == "float") + { + Eigen::Map<Eigen::Matrix<float, Eigen::Dynamic, Eigen::Dynamic>> m( + reinterpret_cast<float*>(nd.getData()), t.getRows(), t.getCols()); + Eigen::to_json(obj, m); + } + else if (nd.getType() == "double") + { + Eigen::Map<Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic>> m( + reinterpret_cast<double*>(nd.getData()), t.getRows(), t.getCols()); + Eigen::to_json(obj, m); + } + else + { + obj = handleGenericNDArray(nd); + } + insertIntoJSON(key, obj); + } + + void + TreeTypedJSONConverter::visitNDArray(DataInput& elementData, TypeInput& /*elementType*/) + { + const std::string key = elementData->getPath().getLastElement(); + auto nd = *aron::data::NDArray::DynamicCastAndCheck(elementData); + insertIntoJSON(key, handleGenericNDArray(nd)); + } + + void + TreeTypedJSONConverter::visitQuaternion(DataInput& elementData, TypeInput& /*elementType*/) + { + const std::string key = elementData->getPath().getLastElement(); + auto nd = *aron::data::NDArray::DynamicCastAndCheck(elementData); + nlohmann::json obj; + Eigen::to_json(obj, aron::converter::AronEigenConverter::ConvertToQuaternionf(nd)); + insertIntoJSON(key, obj); + } + + void + TreeTypedJSONConverter::visitOrientation(DataInput& elementData, TypeInput& elementType) + { + this->visitQuaternion(elementData, elementType); + } + + void + TreeTypedJSONConverter::visitPosition(DataInput& elementData, TypeInput& /*elementType*/) + { + const std::string key = elementData->getPath().getLastElement(); + auto nd = *aron::data::NDArray::DynamicCastAndCheck(elementData); + nlohmann::json obj; + Eigen::to_json(obj, aron::converter::AronEigenConverter::ConvertToVector3f(nd)); + insertIntoJSON(key, obj); + } + + void + TreeTypedJSONConverter::visitPose(DataInput& elementData, TypeInput& /*elementType*/) + { + const std::string key = elementData->getPath().getLastElement(); + auto nd = *aron::data::NDArray::DynamicCastAndCheck(elementData); + nlohmann::json obj; + Eigen::to_json(obj, aron::converter::AronEigenConverter::ConvertToMatrix4f(nd)); + insertIntoJSON(key, obj); + } + + void + TreeTypedJSONConverter::visitImage(DataInput& elementData, TypeInput& /*elementType*/) + { + const std::string key = elementData->getPath().getLastElement(); + auto nd = *aron::data::NDArray::DynamicCastAndCheck(elementData); + insertIntoJSON(key, handleGenericNDArray(nd)); + } + + void + TreeTypedJSONConverter::visitPointCloud(DataInput& elementData, TypeInput& /*elementType*/) + { + const std::string key = elementData->getPath().getLastElement(); + auto nd = *aron::data::NDArray::DynamicCastAndCheck(elementData); + insertIntoJSON(key, handleGenericNDArray(nd)); + } + + void + TreeTypedJSONConverter::visitIntEnum(DataInput& elementData, TypeInput& elementType) + { + /* Not handled by the TreeTypedDataVisitor either */ + } + + void + TreeTypedJSONConverter::visitInt(DataInput& elementData, TypeInput& /*elementType*/) + { + const std::string key = elementData->getPath().getLastElement(); + int i = *aron::data::Int::DynamicCastAndCheck(elementData); + insertIntoJSON(key, i); + } + + void + TreeTypedJSONConverter::visitLong(DataInput& elementData, TypeInput& /*elementType*/) + { + const std::string key = elementData->getPath().getLastElement(); + int64_t l = *aron::data::Long::DynamicCastAndCheck(elementData); + insertIntoJSON(key, l); + } + + void + TreeTypedJSONConverter::visitFloat(DataInput& elementData, TypeInput& /*elementType*/) + { + const std::string key = elementData->getPath().getLastElement(); + float f = *aron::data::Float::DynamicCastAndCheck(elementData); + insertIntoJSON(key, f); + } + + void + TreeTypedJSONConverter::visitDouble(DataInput& elementData, TypeInput& /*elementType*/) + { + const std::string key = elementData->getPath().getLastElement(); + double d = *aron::data::Double::DynamicCastAndCheck(elementData); + insertIntoJSON(key, d); + } + + void + TreeTypedJSONConverter::visitBool(DataInput& elementData, TypeInput& /*elementType*/) + { + const std::string key = elementData->getPath().getLastElement(); + bool b = *aron::data::Bool::DynamicCastAndCheck(elementData); + insertIntoJSON(key, b); + } + + void + TreeTypedJSONConverter::visitString(DataInput& elementData, TypeInput& /*elementType*/) + { + const std::string key = elementData->getPath().getLastElement(); + std::string s = *aron::data::String::DynamicCastAndCheck(elementData); + insertIntoJSON(key, s); + } + + void + TreeTypedJSONConverter::visitTime(DataInput& elementData, TypeInput& /*elementType*/) + { + const std::string key = elementData->getPath().getLastElement(); + int64_t l = *aron::data::Long::DynamicCastAndCheck(elementData); + armem::Time time = armem::Time::microSeconds(l); + insertIntoJSON(key, l); + if (!jsonStack.top().second.is_array()) + { + insertIntoJSON(key + "_hr", armem::toDateTimeMilliSeconds(time)); + } + } + + template <typename ElementType> + void + TreeTypedJSONConverter::insertIntoJSON(const std::string& key, const ElementType& data) + { + if (jsonStack.top().second.is_object()) + { + jsonStack.top().second[key] = nlohmann::json(data); + } + else + { + jsonStack.top().second.emplace_back(data); + } + } + + nlohmann::json + TreeTypedJSONConverter::handleGenericNDArray(const aron::data::NDArray& nd) + { + nlohmann::json ndobj; + std::vector<int> shape = nd.getShape(); + ndobj["dimensions"] = shape; + ndobj["type"] = nd.getType(); + + int elements = + shape.empty() + ? 0 + : std::accumulate(std::begin(shape), std::end(shape), 1, std::multiplies<>()); + std::vector<unsigned char> d = std::vector<unsigned char>(elements); + memcpy(d.data(), nd.getData(), elements); + ndobj["data"] = d; + return ndobj; + } +} // namespace armarx::armem::gui::instance diff --git a/source/RobotAPI/libraries/armem_gui/instance/tree_visitors/TreeTypedJSONConverter.h b/source/RobotAPI/libraries/armem_gui/instance/tree_visitors/TreeTypedJSONConverter.h new file mode 100644 index 0000000000000000000000000000000000000000..7a112979e7baa9e01460cc98d00c3d74a0d846e5 --- /dev/null +++ b/source/RobotAPI/libraries/armem_gui/instance/tree_visitors/TreeTypedJSONConverter.h @@ -0,0 +1,56 @@ +#pragma once + +#include <stack> +#include <utility> + +#include <SimoxUtility/json/json.hpp> + +#include <RobotAPI/libraries/aron/core/data/visitor/variant/VariantVisitor.h> + +namespace armarx::armem::gui::instance +{ + class TreeTypedJSONConverter : public aron::data::RecursiveConstTypedVariantVisitor + { + public: + TreeTypedJSONConverter(); + ~TreeTypedJSONConverter() override = default; + + const nlohmann::json& getJSON(); + + void visitObjectOnEnter(DataInput& elementData, TypeInput& elementType) override; + void visitObjectOnExit(DataInput& elementData, TypeInput& elementType) override; + void visitDictOnEnter(DataInput& elementData, TypeInput& elementType) override; + void visitDictOnExit(DataInput& elementData, TypeInput& elementType) override; + void visitPairOnEnter(DataInput& elementData, TypeInput& elementType) override; + void visitPairOnExit(DataInput& elementData, TypeInput& elementType) override; + void visitTupleOnEnter(DataInput& elementData, TypeInput& elementType) override; + void visitTupleOnExit(DataInput& elementData, TypeInput& elementType) override; + void visitListOnEnter(DataInput& elementData, TypeInput& elementType) override; + void visitListOnExit(DataInput& elementData, TypeInput& elementType) override; + + void visitMatrix(DataInput& elementData, TypeInput& elementType) override; + void visitNDArray(DataInput& elementData, TypeInput& elementType) override; + void visitQuaternion(DataInput& elementData, TypeInput& elementType) override; + void visitOrientation(DataInput& elementData, TypeInput& elementType) override; + void visitPosition(DataInput& elementData, TypeInput& elementType) override; + void visitPose(DataInput& elementData, TypeInput& elementType) override; + void visitImage(DataInput& elementData, TypeInput& elementType) override; + void visitPointCloud(DataInput& elementData, TypeInput& elementType) override; + void visitIntEnum(DataInput& elementData, TypeInput& elementType) override; + void visitInt(DataInput& elementData, TypeInput& elementType) override; + void visitLong(DataInput& elementData, TypeInput& elementType) override; + void visitFloat(DataInput& elementData, TypeInput& elementType) override; + void visitDouble(DataInput& elementData, TypeInput& elementType) override; + void visitBool(DataInput& elementData, TypeInput& elementType) override; + void visitString(DataInput& elementData, TypeInput& elementType) override; + void visitTime(DataInput& elementData, TypeInput& elementType) override; + + private: + std::stack<std::pair<std::string, nlohmann::json>> jsonStack; + + template <typename ElementType> + void insertIntoJSON(const std::string& key, const ElementType& data); + + static nlohmann::json handleGenericNDArray(const aron::data::NDArray& nd); + }; +} // namespace armarx::armem::gui::instance diff --git a/source/RobotAPI/libraries/armem_gui/server/CMakeLists.txt b/source/RobotAPI/libraries/armem_gui/server/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..46fce90ac352efc0ed0870d4988fb1eea80dfa0e --- /dev/null +++ b/source/RobotAPI/libraries/armem_gui/server/CMakeLists.txt @@ -0,0 +1,99 @@ +set(LIB_NAME armem_gui) + +armarx_component_set_name("${LIB_NAME}") +armarx_set_target("Library: ${LIB_NAME}") + + +set(LIBRARIES + # ArmarXCore + ArmarXCoreInterfaces ArmarXCore + # ArmarXGui + SimpleConfigDialog + # RobotAPI + aroneigenconverter armem +) + +set(SOURCES + + gui_utils.cpp + lifecycle.cpp + + MemoryViewer.cpp + PeriodicUpdateWidget.cpp + + disk/ControlWidget.cpp + + instance/GroupBox.cpp + instance/ImageView.cpp + instance/InstanceView.cpp + instance/MemoryIDTreeWidgetItem.cpp + instance/WidgetsWithToolbar.cpp + instance/sanitize_typename.cpp + instance/serialize_path.cpp + + instance/display_visitors/DataDisplayVisitor.cpp + instance/display_visitors/TypedDataDisplayVisitor.cpp + + instance/tree_builders/DataTreeBuilder.cpp + instance/tree_builders/DataTreeBuilderBase.cpp + instance/tree_builders/TypedDataTreeBuilder.cpp + + instance/tree_visitors/TreeDataVisitorBase.cpp + instance/tree_visitors/TreeDataVisitor.cpp + instance/tree_visitors/TreeTypedDataVisitor.cpp + instance/tree_visitors/TreeTypedJSONConverter.cpp + + memory/GroupBox.cpp + memory/TreeWidget.cpp + + query_widgets/QueryWidget.cpp + query_widgets/SnapshotForm.cpp + query_widgets/SnapshotSelectorWidget.cpp +) +set(HEADERS + + gui_utils.h + lifecycle.h + + MemoryViewer.h + PeriodicUpdateWidget.h + TreeWidgetBuilder.h + + PeriodicUpdateWidget.h + TreeWidgetBuilder.h + + disk/ControlWidget.h + + instance/GroupBox.h + instance/ImageView.h + instance/InstanceView.h + instance/MemoryIDTreeWidgetItem.h + instance/WidgetsWithToolbar.h + instance/sanitize_typename.h + instance/serialize_path.h + + instance/display_visitors/DataDisplayVisitor.h + instance/display_visitors/TypedDataDisplayVisitor.h + + instance/tree_builders/DataTreeBuilder.h + instance/tree_builders/DataTreeBuilderBase.h + instance/tree_builders/TypedDataTreeBuilder.h + + instance/tree_visitors/TreeDataVisitorBase.h + instance/tree_visitors/TreeDataVisitor.h + instance/tree_visitors/TreeTypedDataVisitor.h + instance/tree_visitors/TreeTypedJSONConverter.h + + memory/GroupBox.h + memory/TreeWidget.h + + query_widgets/QueryWidget.h + query_widgets/SnapshotForm.h + query_widgets/SnapshotSelectorWidget.h +) + +armarx_gui_library("${LIB_NAME}" "${SOURCES}" "${GUI_MOC_HDRS}" "${GUI_UIS}" "" "${LIBRARIES}") + + +# add unit tests +add_subdirectory(test) diff --git a/source/RobotAPI/libraries/armem_motions/CMakeLists.txt b/source/RobotAPI/libraries/armem_motions/CMakeLists.txt index bf222bcec14b760e988327bd0d038322fce32b97..d82a0952ee75f711fc0c9c067d5ed860d68b25f1 100644 --- a/source/RobotAPI/libraries/armem_motions/CMakeLists.txt +++ b/source/RobotAPI/libraries/armem_motions/CMakeLists.txt @@ -14,15 +14,15 @@ armarx_add_library( RobotAPI::PriorKnowledge::Motions SOURCES - ./server/mdb_conversions.cpp - ./server/MotionSegment.cpp + armem_motions.cpp HEADERS - ./server/mdb_conversions.h - ./server/MotionSegment.h + armem_motions.h ARON_FILES - ./aron/MDBReference.xml + aron/MDBReference.xml ) add_library(RobotAPI::ArMemMotions ALIAS armem_motions) add_library(RobotAPI::armem_motions ALIAS armem_motions) + +add_subdirectory(server) diff --git a/source/RobotAPI/libraries/armem_motions/armem_motions.cpp b/source/RobotAPI/libraries/armem_motions/armem_motions.cpp new file mode 100644 index 0000000000000000000000000000000000000000..a675039efc6efeb0220ea11ee11f61cc60ed24e1 --- /dev/null +++ b/source/RobotAPI/libraries/armem_motions/armem_motions.cpp @@ -0,0 +1,6 @@ +#include "armem_motions.h" + +namespace armarx::armem::motions::mdb +{ + +} diff --git a/source/RobotAPI/libraries/armem_motions/armem_motions.h b/source/RobotAPI/libraries/armem_motions/armem_motions.h new file mode 100644 index 0000000000000000000000000000000000000000..f9dca33dd7b46131ee27c6d52c2cf7e4e579f9c4 --- /dev/null +++ b/source/RobotAPI/libraries/armem_motions/armem_motions.h @@ -0,0 +1,7 @@ +#pragma once + + +namespace armarx::armem::motions::mdb +{ + +} diff --git a/source/RobotAPI/libraries/armem_motions/server/CMakeLists.txt b/source/RobotAPI/libraries/armem_motions/server/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..5aaac747df0903aab354366f97d950adce1f1dc1 --- /dev/null +++ b/source/RobotAPI/libraries/armem_motions/server/CMakeLists.txt @@ -0,0 +1,31 @@ +set(ARMARX_LIB_NAME "" ) +set(ARON_FILES "") + +set(LIB_NAME armem_motions_server) + +armarx_component_set_name("${LIB_NAME}") +armarx_set_target("Library: ${LIB_NAME}") + +armarx_add_library( + LIBS + ArmarXCoreInterfaces + ArmarXCore + ArmarXCoreObservers + + RobotAPI::Core + RobotAPI::armem_server + RobotAPI::PriorKnowledge::Motions + RobotAPI::armem_motions + + SOURCES + mdb_conversions.cpp + MotionSegment.cpp + + HEADERS + mdb_conversions.h + MotionSegment.h +) + + +add_library(RobotAPI::ArMemMotions_server ALIAS armem_motions_server) +add_library(RobotAPI::armem_motions_server ALIAS armem_motions_server) diff --git a/source/RobotAPI/libraries/armem_mps/CMakeLists.txt b/source/RobotAPI/libraries/armem_mps/CMakeLists.txt index a7763da42d8f0feaa7b8f21784e363c83877b43f..7b3c2964c035d9b6fddddb87895cded8759938b5 100644 --- a/source/RobotAPI/libraries/armem_mps/CMakeLists.txt +++ b/source/RobotAPI/libraries/armem_mps/CMakeLists.txt @@ -11,23 +11,28 @@ armarx_add_library( ArmarXCoreInterfaces ArmarXCore ArmarXCoreObservers - ${DMP_LIBRARIES} + RobotAPI::Core - RobotAPI::aron::common RobotAPI::armem RobotAPI::PriorKnowledge::Motions + RobotAPI::armem_motions + VirtualRobot + ${DMP_LIBRARIES} + SOURCES - ./aron_conversions.cpp - #./traj_conversions.cpp - ./server/MotionPrimitives/motionprimitives.cpp - ./server/MotionPrimitives/Segment.cpp + aron_conversions.cpp + #traj_conversions.cpp + HEADERS - ./aron_conversions.h - #./traj_conversions.h - ./server/MotionPrimitives/motionprimitives.h - ./server/MotionPrimitives/Segment.h + aron_conversions.h + #traj_conversions.h + + ARON_FILES + aron/Trajectory.xml ) add_library(RobotAPI::armem_mps ALIAS armem_mps) + +add_subdirectory(server) diff --git a/source/RobotAPI/libraries/armem_mps/server/CMakeLists.txt b/source/RobotAPI/libraries/armem_mps/server/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..c4a5854ce895a7415a6ba21cdd06b8b4b03eb6c8 --- /dev/null +++ b/source/RobotAPI/libraries/armem_mps/server/CMakeLists.txt @@ -0,0 +1,36 @@ +set(ARMARX_LIB_NAME "" ) +set(ARON_FILES "") + +set(LIB_NAME armem_mps_server) + +armarx_component_set_name("${LIB_NAME}") +armarx_set_target("Library: ${LIB_NAME}") + +armarx_build_if(DMP_FOUND "DMP not available") + +armarx_add_library( + LIBS + ArmarXCoreInterfaces + ArmarXCore + ArmarXCoreObservers + + RobotAPI::Core + RobotAPI::armem_server + RobotAPI::PriorKnowledge::Motions + RobotAPI::armem_motions + RobotAPI::armem_mps + + VirtualRobot + ${DMP_LIBRARIES} + + SOURCES + MotionPrimitives/motionprimitives.cpp + MotionPrimitives/Segment.cpp + + HEADERS + MotionPrimitives/motionprimitives.h + MotionPrimitives/Segment.h +) + + +add_library(RobotAPI::armem_mps_server ALIAS armem_mps_server) diff --git a/source/RobotAPI/libraries/armem_mps/server/MotionPrimitives/motionprimitives.cpp b/source/RobotAPI/libraries/armem_mps/server/MotionPrimitives/motionprimitives.cpp index 33ba4be58f283651fb2f421af4664819c6c42f3f..0dbe9da26ba0f180a5fb090540e9abb7eff45127 100644 --- a/source/RobotAPI/libraries/armem_mps/server/MotionPrimitives/motionprimitives.cpp +++ b/source/RobotAPI/libraries/armem_mps/server/MotionPrimitives/motionprimitives.cpp @@ -1,6 +1,7 @@ #include "motionprimitives.h" -#include <ArmarXCore/core/exceptions/local/ExpressionException.h> +// #include <iostream> +// #include <fstream> #include <SimoxUtility/algorithm/string.h> @@ -10,6 +11,9 @@ #include <RobotAPI/libraries/aron/common/aron/Trajectory.aron.generated.h> #include <dmp/representation/trajectory.h> + +#include <ArmarXCore/core/exceptions/local/ExpressionException.h> +#include <ArmarXCore/core/logging/Logging.h> #include <ArmarXCore/core/system/ArmarXDataPath.h> #include <ArmarXCore/core/logging/Logging.h> #include <VirtualRobot/MathTools.h> @@ -27,9 +31,11 @@ std::optional<armarx::arondto::Trajectory> createFromFile(const std::filesystem: std::string absPath; ArmarXDataPath::getAbsolutePath(pathToInfoJson, absPath); traj.readFromCSVFile(absPath); + //traj = DMP::SampledTrajectoryV2::normalizeTimestamps(traj, 0, 1); std::map<double, DMP::DVec> currentTraj = traj.getPositionData();//todo trajs.push_back(traj); + armarx::arondto::Trajectory trajectory; std::string name = pathToInfoJson.filename(); std::string toErase = "taskspace-trajectory-"; @@ -40,15 +46,18 @@ std::optional<armarx::arondto::Trajectory> createFromFile(const std::filesystem: } trajectory.name = name; std::map<std::string, std::vector<float>> mapJointSpace; - for(DMP::SampledTrajectoryV2 traj: trajs){ + for(DMP::SampledTrajectoryV2 traj: trajs) + { std::map<double, DMP::DVec> currentTraj = traj.getPositionData(); // todo: add config making data structure clear - if(taskspace){ - for(std::pair<double, DMP::DVec> element: currentTraj){ + if(taskspace) + { + for(std::pair<double, DMP::DVec> element: currentTraj) + { Eigen::Vector3f vec(element.second.at(0), element.second.at(1), element.second.at(2)); Eigen::Matrix<float, 4, 4> poseMatrix = VirtualRobot::MathTools::quat2eigen4f(element.second.at(4), element.second.at(5), element.second.at(6), element.second.at(3)); poseMatrix.block<3, 1>(0, 3) = vec; - armarx::arondto::TSElement tselement; + arondto::TSElement tselement; tselement.timestep = element.first; tselement.pose = poseMatrix; trajectory.taskSpace.steps.push_back(tselement); @@ -56,10 +65,14 @@ std::optional<armarx::arondto::Trajectory> createFromFile(const std::filesystem: } - }else{ - for(std::pair<double, DMP::DVec> element: currentTraj){ + } + else + { + for(std::pair<double, DMP::DVec> element: currentTraj) + { std::vector<float> configvec; - for(double el: element.second){ + for(double el: element.second) + { configvec.push_back(float(el)); } armarx::arondto::JSElement jselement; diff --git a/source/RobotAPI/libraries/armem_objects/CMakeLists.txt b/source/RobotAPI/libraries/armem_objects/CMakeLists.txt index ab26b1f8a38b5e18b16dc49a498c9369d6d918db..88fd8cf80f190ee13489c8180e4c4a53f652caff 100644 --- a/source/RobotAPI/libraries/armem_objects/CMakeLists.txt +++ b/source/RobotAPI/libraries/armem_objects/CMakeLists.txt @@ -50,18 +50,6 @@ armarx_add_library( SceneSnapshot.cpp - server/class/FloorVis.cpp - server/class/Segment.cpp - - server/instance/Segment.cpp - server/instance/SegmentAdapter.cpp - server/instance/Decay.cpp - server/instance/RobotHeadMovement.cpp - server/instance/Visu.cpp - server/instance/ArticulatedObjectVisu.cpp - - server/attachments/Segment.cpp - client/articulated_object/Reader.cpp client/articulated_object/Writer.cpp client/articulated_object/ArticulatedObjectReader.cpp @@ -71,13 +59,6 @@ armarx_add_library( client/attachment/Reader.cpp client/attachment/Writer.cpp -) - - - -armarx_enable_aron_file_generation_for_target( - TARGET_NAME - "${LIB_NAME}" ARON_FILES aron/ObjectClass.xml aron/ObjectInstance.xml @@ -86,7 +67,7 @@ armarx_enable_aron_file_generation_for_target( # aron/Constraint.xml ) + add_library(${PROJECT_NAME}::armem_objects ALIAS armem_objects) -# add unit tests -# add_subdirectory(test) +add_subdirectory(server) diff --git a/source/RobotAPI/libraries/armem_objects/server/CMakeLists.txt b/source/RobotAPI/libraries/armem_objects/server/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..cf92773305aac9c8d4c1ce69abbf86bd3b6789ea --- /dev/null +++ b/source/RobotAPI/libraries/armem_objects/server/CMakeLists.txt @@ -0,0 +1,54 @@ +set(ARMARX_LIB_NAME "" ) +set(ARON_FILES "") + +set(LIB_NAME armem_objects_server) + +armarx_component_set_name("${LIB_NAME}") +armarx_set_target("Library: ${LIB_NAME}") + + +armarx_add_library( + LIBS + # ArmarXCore + ArmarXCore + # ArmarXGui + ArmarXGuiComponentPlugins + # RobotAPI + RobotAPI::ArViz + RobotAPI::ComponentPlugins + RobotAPI::Core + RobotAPI::armem_server + RobotAPI::armem_robot + RobotAPI::armem_objects + + HEADERS + + class/FloorVis.h + class/Segment.h + + instance/Segment.h + instance/SegmentAdapter.h + instance/Decay.h + instance/RobotHeadMovement.h + instance/Visu.h + instance/ArticulatedObjectVisu.h + + attachments/Segment.h + + SOURCES + class/FloorVis.cpp + class/Segment.cpp + + instance/Segment.cpp + instance/SegmentAdapter.cpp + instance/Decay.cpp + instance/RobotHeadMovement.cpp + instance/Visu.cpp + instance/ArticulatedObjectVisu.cpp + + attachments/Segment.cpp +) + + +add_library(${PROJECT_NAME}::armem_objects_server ALIAS armem_objects_server) + diff --git a/source/RobotAPI/libraries/armem_robot_state/CMakeLists.txt b/source/RobotAPI/libraries/armem_robot_state/CMakeLists.txt index c86ed671ef17fcd287c05a7083abf3803b852e99..2c46fab4e7f811e979609b96b62ca5a02cb65b15 100644 --- a/source/RobotAPI/libraries/armem_robot_state/CMakeLists.txt +++ b/source/RobotAPI/libraries/armem_robot_state/CMakeLists.txt @@ -3,7 +3,6 @@ set(LIB_NAME armem_robot_state) armarx_component_set_name("${LIB_NAME}") armarx_set_target("Library: ${LIB_NAME}") -find_package(Eigen3 QUIET) armarx_build_if(Eigen3_FOUND "Eigen3 not available") @@ -36,26 +35,6 @@ armarx_add_library( client/localization/TransformReader.h client/localization/TransformWriter.h - server/forward_declarations.h - - server/common/Visu.h - server/common/combine.h - - server/localization/Segment.h - - server/proprioception/Segment.h - server/proprioception/aron_conversions.h - server/proprioception/RobotStateWriter.h - server/proprioception/RobotUnitData.h - server/proprioception/RobotUnitReader.h - - server/proprioception/converters/Armar6Converter.h - server/proprioception/converters/ConverterTools.h - server/proprioception/converters/ConverterRegistry.h - server/proprioception/converters/ConverterInterface.h - - server/description/Segment.h - aron_conversions.h utils.h @@ -68,24 +47,6 @@ armarx_add_library( client/localization/TransformReader.cpp client/localization/TransformWriter.cpp - server/common/Visu.cpp - server/common/combine.cpp - - server/localization/Segment.cpp - - server/proprioception/Segment.cpp - server/proprioception/aron_conversions.cpp - server/proprioception/RobotStateWriter.cpp - server/proprioception/RobotUnitData.cpp - server/proprioception/RobotUnitReader.cpp - - server/proprioception/converters/Armar6Converter.cpp - server/proprioception/converters/ConverterTools.cpp - server/proprioception/converters/ConverterRegistry.cpp - server/proprioception/converters/ConverterInterface.cpp - - server/description/Segment.cpp - aron_conversions.cpp utils.cpp ) @@ -104,3 +65,5 @@ armarx_enable_aron_file_generation_for_target( add_library(RobotAPI::armem_robot_state ALIAS armem_robot_state) + +add_subdirectory(server) diff --git a/source/RobotAPI/libraries/armem_robot_state/client/common/RobotReader.cpp b/source/RobotAPI/libraries/armem_robot_state/client/common/RobotReader.cpp index 92c5039cadbc9015af4a2488500869ed197b0362..4428f3d967085e9d1f1a8e1951c5524d1097b2e7 100644 --- a/source/RobotAPI/libraries/armem_robot_state/client/common/RobotReader.cpp +++ b/source/RobotAPI/libraries/armem_robot_state/client/common/RobotReader.cpp @@ -3,19 +3,19 @@ #include <mutex> #include <optional> -#include "ArmarXCore/core/exceptions/local/ExpressionException.h" -#include "RobotAPI/libraries/armem_robot/types.h" +#include <ArmarXCore/core/PackagePath.h> #include <ArmarXCore/core/exceptions/LocalException.h> +#include <ArmarXCore/core/exceptions/local/ExpressionException.h> #include <ArmarXCore/core/logging/Logging.h> -#include <ArmarXCore/core/PackagePath.h> #include <RobotAPI/libraries/armem/client/query/Builder.h> -#include <RobotAPI/libraries/armem/core/error.h> #include <RobotAPI/libraries/armem/core/Time.h> +#include <RobotAPI/libraries/armem/core/error.h> #include <RobotAPI/libraries/armem/core/wm/memory_definitions.h> +#include <RobotAPI/libraries/armem_robot/aron/Robot.aron.generated.h> #include <RobotAPI/libraries/armem_robot/aron_conversions.h> #include <RobotAPI/libraries/armem_robot/robot_conversions.h> -#include <RobotAPI/libraries/armem_robot/aron/Robot.aron.generated.h> +#include <RobotAPI/libraries/armem_robot/types.h> #include <RobotAPI/libraries/armem_robot_state/aron/JointState.aron.generated.h> #include <RobotAPI/libraries/armem_robot_state/aron/Proprioception.aron.generated.h> #include <RobotAPI/libraries/armem_robot_state/aron_conversions.h> @@ -54,7 +54,8 @@ namespace armarx::armem::robot_state try { memoryReader = memoryNameSystem.useReader(properties.memoryName); - ARMARX_IMPORTANT << "RobotReader: Connected to memory '" << properties.memoryName << "'"; + ARMARX_IMPORTANT << "RobotReader: Connected to memory '" << properties.memoryName + << "'"; } catch (const armem::error::CouldNotResolveMemoryServer& e) { @@ -81,9 +82,9 @@ namespace armarx::armem::robot_state RobotReader::get(const robot::RobotDescription& description, const armem::Time& timestamp) { robot::Robot robot{.description = description, - .instance = "", // TODO(fabian.reister): - .config = {}, // will be populated by synchronize - .timestamp = timestamp}; + .instance = "", // TODO(fabian.reister): + .config = {}, // will be populated by synchronize + .timestamp = timestamp}; synchronize(robot, timestamp); @@ -300,11 +301,12 @@ namespace armarx::armem::robot_state // clang-format on const armem::wm::EntityInstance* instance = nullptr; - providerSegment.forEachInstance([&instance](const wm::EntityInstance & i) - { - instance = &i; - return false; // break - }); + providerSegment.forEachInstance( + [&instance](const wm::EntityInstance& i) + { + instance = &i; + return false; // break + }); if (!instance) { ARMARX_WARNING << "No entity snapshots found"; @@ -320,7 +322,8 @@ namespace armarx::armem::robot_state std::optional<AronClass> tryCast(const wm::EntityInstance& item) { - static_assert(std::is_base_of<armarx::aron::codegenerator::cpp::AronCppClass, AronClass>::value); + static_assert( + std::is_base_of<armarx::aron::codegenerator::cpp::AronCppClass, AronClass>::value); try { @@ -344,27 +347,29 @@ namespace armarx::armem::robot_state .getCoreSegment(properties.proprioceptionCoreSegment); // clang-format on - coreSegment.forEachEntity([&jointMap](const wm::Entity & entity) - { - const auto& entityInstance = entity.getLatestSnapshot().getInstance(0); + coreSegment.forEachEntity( + [&jointMap](const wm::Entity& entity) + { + const auto& entityInstance = entity.getLatestSnapshot().getInstance(0); - const auto proprioception = tryCast<::armarx::armem::arondto::Proprioception>(entityInstance); - ARMARX_CHECK(proprioception.has_value()); + const auto proprioception = + tryCast<::armarx::armem::arondto::Proprioception>(entityInstance); + ARMARX_CHECK(proprioception.has_value()); const armarx::armem::prop::arondto::Joints& joints = proprioception->joints; - // const auto jointState = tryCast<::armarx::armem::arondto::JointState>(entityInstance); - // if (not jointState) - // { - // ARMARX_WARNING << "Could not convert entity instance to 'JointState'"; - // return; - // } + // const auto jointState = tryCast<::armarx::armem::arondto::JointState>(entityInstance); + // if (not jointState) + // { + // ARMARX_WARNING << "Could not convert entity instance to 'JointState'"; + // return; + // } - jointMap = joints.position; + jointMap = joints.position; - // jointMap.emplace(jointState->name, jointState->position); - }); + // jointMap.emplace(jointState->name, jointState->position); + }); if (jointMap.empty()) { @@ -569,11 +574,9 @@ namespace armarx::armem::robot_state .getCoreSegment(properties.proprioceptionCoreSegment); // clang-format on - coreSegment.forEachEntity( - [&forceTorques](const wm::Entity& entity) + coreSegment.forEachInstance( + [&forceTorques](const wm::EntityInstance& entityInstance) { - const auto& entityInstance = entity.getLatestSnapshot().getInstance(0); - const auto proprioception = tryCast<::armarx::armem::arondto::Proprioception>(entityInstance); ARMARX_CHECK(proprioception.has_value()); diff --git a/source/RobotAPI/libraries/armem_robot_state/client/common/VirtualRobotReader.cpp b/source/RobotAPI/libraries/armem_robot_state/client/common/VirtualRobotReader.cpp index 1c0152a463d5c38abb3b1c81f1014e1f74ef4d77..0907cb70b01220686d2b6b30a2d5577c1e6838c3 100644 --- a/source/RobotAPI/libraries/armem_robot_state/client/common/VirtualRobotReader.cpp +++ b/source/RobotAPI/libraries/armem_robot_state/client/common/VirtualRobotReader.cpp @@ -77,7 +77,7 @@ namespace armarx::armem::robot_state const armem::Time& timestamp, const VirtualRobot::RobotIO::RobotDescription& loadMode) { - auto robot = getRobot(name, timestamp); + auto robot = getRobot(name, timestamp, loadMode); synchronizeRobot(*robot, timestamp); diff --git a/source/RobotAPI/libraries/armem_robot_state/server/CMakeLists.txt b/source/RobotAPI/libraries/armem_robot_state/server/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..848efe75e0b615f367f5602c9cdfdfb3cdbbd7ea --- /dev/null +++ b/source/RobotAPI/libraries/armem_robot_state/server/CMakeLists.txt @@ -0,0 +1,73 @@ +set(ARMARX_LIB_NAME "" ) +set(ARON_FILES "") + +set(LIB_NAME armem_robot_state_server) + +armarx_component_set_name("${LIB_NAME}") +armarx_set_target("Library: ${LIB_NAME}") + +armarx_build_if(Eigen3_FOUND "Eigen3 not available") + + +armarx_add_library( + LIBS + # ArmarX + ArmarXCore + ArmarXCoreInterfaces + DebugObserverHelper + # ArmarXGui + ArmarXGuiComponentPlugins + # This package + RobotAPICore + RobotAPIInterfaces + RobotAPI::armem_server + RobotAPI::armem_robot + RobotAPI::armem_robot_state + aroncommon + + # System / External + Eigen3::Eigen + + HEADERS + forward_declarations.h + + common/Visu.h + common/combine.h + + localization/Segment.h + + proprioception/Segment.h + proprioception/aron_conversions.h + proprioception/RobotStateWriter.h + proprioception/RobotUnitData.h + proprioception/RobotUnitReader.h + + proprioception/converters/Armar6Converter.h + proprioception/converters/ConverterTools.h + proprioception/converters/ConverterRegistry.h + proprioception/converters/ConverterInterface.h + + description/Segment.h + + SOURCES + common/Visu.cpp + common/combine.cpp + + localization/Segment.cpp + + proprioception/Segment.cpp + proprioception/aron_conversions.cpp + proprioception/RobotStateWriter.cpp + proprioception/RobotUnitData.cpp + proprioception/RobotUnitReader.cpp + + proprioception/converters/Armar6Converter.cpp + proprioception/converters/ConverterTools.cpp + proprioception/converters/ConverterRegistry.cpp + proprioception/converters/ConverterInterface.cpp + + description/Segment.cpp +) + + +add_library(RobotAPI::armem_robot_state_server ALIAS armem_robot_state_server) diff --git a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/ndarray/Pose.cpp b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/ndarray/Pose.cpp index d7292d0e05e46931f2d43ea937d9eda0b6def9fb..b377dde0f39916daa25e80d4b74a7bc665c316c0 100644 --- a/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/ndarray/Pose.cpp +++ b/source/RobotAPI/libraries/aron/core/codegenerator/codewriter/cpp/generator/ndarray/Pose.cpp @@ -86,7 +86,9 @@ namespace armarx::aron::codegenerator::cpp::generator CppBlockPtr Pose::getEqualsBlock(const std::string& accessor, const std::string& otherInstanceAccessor) const { CppBlockPtr block_if_data = std::make_shared<CppBlock>(); - block_if_data->addLine("if (not (" + accessor + nextEl() + "isApprox(" + otherInstanceAccessor + ")))"); + std::string other_instance_resolved_accessor = this->resolveMaybeAccessor(otherInstanceAccessor); + + block_if_data->addLine("if (not (" + accessor + nextEl() + "isApprox(" + other_instance_resolved_accessor + ")))"); block_if_data->addLineAsBlock("return false;"); return resolveMaybeEqualsBlock(block_if_data, accessor, otherInstanceAccessor); } diff --git a/source/RobotAPI/libraries/aron/core/data/visitor/RecursiveVisitor.h b/source/RobotAPI/libraries/aron/core/data/visitor/RecursiveVisitor.h index c5c729c3c61394663a1790e290d24a9b99dbb402..628316850cdd5c7b0fa588ae94bc9408553ace8a 100644 --- a/source/RobotAPI/libraries/aron/core/data/visitor/RecursiveVisitor.h +++ b/source/RobotAPI/libraries/aron/core/data/visitor/RecursiveVisitor.h @@ -128,9 +128,9 @@ namespace armarx::aron::data case type::Descriptor::eDict: { v.visitDictOnEnter(o, t); - for (auto& [key, value, acceptedType] : v.getDictElements(o, t)) + for (auto& [key, pair] : v.getDictElements(o, t)) { - visitRecursive(v, value, acceptedType); + visitRecursive(v, pair.first, pair.second); } v.visitDictOnExit(o, t); return; @@ -138,9 +138,9 @@ namespace armarx::aron::data case type::Descriptor::eObject: { v.visitObjectOnEnter(o, t); - for (auto& [key, value, acceptedType] : v.getObjectElements(o, t)) + for (auto& [key, pair] : v.getObjectElements(o, t)) { - visitRecursive(v, value, acceptedType); + visitRecursive(v, pair.first, pair.second); } v.visitObjectOnExit(o, t); return; diff --git a/source/RobotAPI/libraries/aron/core/test/aron/OptionalTest.xml b/source/RobotAPI/libraries/aron/core/test/aron/OptionalTest.xml index 332e9b13e489cb6426cb9a0a88aa238d8aaea9d3..2b0d2d39810d2d1c05d4c40bba55ee36fc29615a 100644 --- a/source/RobotAPI/libraries/aron/core/test/aron/OptionalTest.xml +++ b/source/RobotAPI/libraries/aron/core/test/aron/OptionalTest.xml @@ -61,7 +61,9 @@ </List> </ObjectChild> - + <ObjectChild key="an_optional_pose"> + <Pose /> + </ObjectChild> </Object> </GenerateTypes>