diff --git a/source/RobotAPI/drivers/GamepadUnit/GamepadUnit.cpp b/source/RobotAPI/drivers/GamepadUnit/GamepadUnit.cpp index 1e7dacc348c3101705f4ae650ab978b031cd23d7..14cc8fb49d139d177425040e4b69334f4e9e042a 100644 --- a/source/RobotAPI/drivers/GamepadUnit/GamepadUnit.cpp +++ b/source/RobotAPI/drivers/GamepadUnit/GamepadUnit.cpp @@ -22,6 +22,7 @@ #include "GamepadUnit.h" +#include "ArmarXCore/core/logging/Logging.h" #include <ArmarXCore/util/CPPUtility/trace.h> #include <ArmarXCore/observers/variant/TimestampVariant.h> #include <linux/joystick.h> @@ -53,7 +54,7 @@ void GamepadUnit::onConnectComponent() ARMARX_TRACE; if (!dataTimestamp) { - ARMARX_INFO << "dataTimestamp is null, waiting for value"; + ARMARX_INFO << deactivateSpam(1) << "dataTimestamp is null, waiting for value"; return; } ARMARX_CHECK_NOT_NULL(dataTimestamp); diff --git a/source/RobotAPI/drivers/GamepadUnit/Joystick.h b/source/RobotAPI/drivers/GamepadUnit/Joystick.h index 8befbe9d5c08bd6d13220cd7c709884c906afc7b..af7cc386dc35a8b1b8ec3122545fd0bb88fef4bd 100644 --- a/source/RobotAPI/drivers/GamepadUnit/Joystick.h +++ b/source/RobotAPI/drivers/GamepadUnit/Joystick.h @@ -220,7 +220,7 @@ namespace armarx stop.type = EV_FF; stop.code = e.id; stop.value = 0; - const int stopStatus = write(fdEvent, static_cast<const void*>(&stop), sizeof(stop)); + [[maybe_unused]] const int stopStatus = write(fdEvent, static_cast<const void*>(&stop), sizeof(stop)); ret = ioctl(fdEvent, EVIOCRMFF, e.id); diff --git a/source/RobotAPI/gui-plugins/KinematicUnitPlugin/KinematicUnitGuiPlugin.cpp b/source/RobotAPI/gui-plugins/KinematicUnitPlugin/KinematicUnitGuiPlugin.cpp index fa8011d66e9fb45de290395eab222e9299888620..7c7cfae4d2fba28158d7bbe6cb2a3cb89fd5c195 100644 --- a/source/RobotAPI/gui-plugins/KinematicUnitPlugin/KinematicUnitGuiPlugin.cpp +++ b/source/RobotAPI/gui-plugins/KinematicUnitPlugin/KinematicUnitGuiPlugin.cpp @@ -74,6 +74,7 @@ #include <iostream> #include <memory> #include <optional> +#include <stdexcept> #include <string> @@ -81,8 +82,10 @@ //#define KINEMATIC_UNIT_FILE_DEFAULT_PACKAGE std::string("RobotAPI") #define KINEMATIC_UNIT_NAME_DEFAULT "Robot" //#define TOPIC_NAME_DEFAULT "RobotState" -#define SLIDER_POS_DEG_MULTIPLIER 5 -#define SLIDER_POS_RAD_MULTIPLIER 100 + +constexpr float SLIDER_POS_DEG_MULTIPLIER = 5; +constexpr float SLIDER_POS_RAD_MULTIPLIER = 100; +constexpr float SLIDER_POS_HEMI_MULTIPLIER = 100; namespace armarx { @@ -648,15 +651,26 @@ namespace armarx { if (currentNode) { - const bool isDeg = ui.checkBoxUseDegree->isChecked(); - const bool isRot = currentNode->isRotationalJoint(); - const auto factor = - isRot && !isDeg ? SLIDER_POS_RAD_MULTIPLIER : SLIDER_POS_DEG_MULTIPLIER; - float conversionFactor = isRot && isDeg ? 180.0 / M_PI : 1.0f; - float pos = currentNode->getJointValue() * conversionFactor; - - ui.lcdNumberKinematicUnitJointValue->display((int)pos); - ui.horizontalSliderKinematicUnitPos->setSliderPosition((int)(pos * factor)); + if (currentNode->isRotationalJoint() or currentNode->isHemisphereJoint()) + { + const bool isDeg = ui.checkBoxUseDegree->isChecked(); + const auto factor = + isDeg ? SLIDER_POS_DEG_MULTIPLIER : SLIDER_POS_RAD_MULTIPLIER; + const float conversionFactor = isDeg ? 180.0 / M_PI : 1.0f; + const float pos = currentNode->getJointValue() * conversionFactor; + + ui.lcdNumberKinematicUnitJointValue->display((int)pos); + ui.horizontalSliderKinematicUnitPos->setSliderPosition((int)(pos * factor)); + } + + if (currentNode->isTranslationalJoint()) + { + const auto factor = SLIDER_POS_DEG_MULTIPLIER; + const float pos = currentNode->getJointValue(); + + ui.lcdNumberKinematicUnitJointValue->display((int)pos); + ui.horizontalSliderKinematicUnitPos->setSliderPosition((int)(pos * factor)); + } } } } @@ -712,15 +726,49 @@ namespace armarx if (currentNode) { - QString unit = currentNode->isRotationalJoint() - ? (ui.checkBoxUseDegree->isChecked() ? "deg" : "rad") - : "mm"; + const QString unit = [&]() -> QString + { + if (currentNode->isRotationalJoint() or currentNode->isHemisphereJoint()) + { + if (ui.checkBoxUseDegree->isChecked()) + { + return "deg"; + } + + return "rad"; + } + + if (currentNode->isTranslationalJoint()) + { + return "mm"; + } + + throw std::invalid_argument("unknown/unsupported joint type"); + }(); + ui.labelUnit->setText(unit); - const bool isDeg = ui.checkBoxUseDegree->isChecked(); - const bool isRot = currentNode->isRotationalJoint(); - const auto factor = - isRot && !isDeg ? SLIDER_POS_RAD_MULTIPLIER : SLIDER_POS_DEG_MULTIPLIER; - float conversionFactor = isRot && isDeg ? 180.0 / M_PI : 1.0f; + + + const auto [factor, conversionFactor] = [&]() -> std::pair<float, float> + { + if (currentNode->isRotationalJoint() or currentNode->isHemisphereJoint()) + { + const bool isDeg = ui.checkBoxUseDegree->isChecked(); + if (isDeg) + { + return {SLIDER_POS_DEG_MULTIPLIER, 180.0 / M_PI}; + } + return {SLIDER_POS_RAD_MULTIPLIER, 1}; + } + + if (currentNode->isTranslationalJoint()) + { + return {SLIDER_POS_DEG_MULTIPLIER, 1}; + } + + throw std::invalid_argument("unknown/unsupported joint type"); + }(); + jointModes[currentNode->getName()] = ePositionControl; if (kinematicUnitInterfacePrx) @@ -728,8 +776,8 @@ namespace armarx kinematicUnitInterfacePrx->switchControlMode(jointModes); } - float lo = currentNode->getJointLimitLo() * conversionFactor; - float hi = currentNode->getJointLimitHi() * conversionFactor; + const float lo = currentNode->getJointLimitLo() * conversionFactor; + const float hi = currentNode->getJointLimitHi() * conversionFactor; if (hi - lo <= 0.0f) { @@ -745,7 +793,7 @@ namespace armarx synchronizeRobotJointAngles(); } - float pos = currentNode->getJointValue() * conversionFactor; + const float pos = currentNode->getJointValue() * conversionFactor; ARMARX_INFO << "Setting position control for current node " << "(name '" << currentNode->getName() << "' with current value " << pos << ")"; @@ -754,8 +802,18 @@ namespace armarx // This will initially send a position target with a small delta to the joint. ui.horizontalSliderKinematicUnitPos->blockSignals(true); - ui.horizontalSliderKinematicUnitPos->setMaximum(hi * factor); - ui.horizontalSliderKinematicUnitPos->setMinimum(lo * factor); + const float sliderMax = hi * factor; + const float sliderMin = lo * factor; + + ui.horizontalSliderKinematicUnitPos->setMaximum(sliderMax); + ui.horizontalSliderKinematicUnitPos->setMinimum(sliderMin); + + const std::size_t desiredNumberOfTicks = 1'000; + + const float tickInterval = (sliderMax - sliderMin) / desiredNumberOfTicks; + ARMARX_INFO << VAROUT(tickInterval); + + ui.horizontalSliderKinematicUnitPos->setTickInterval(tickInterval); ui.lcdNumberKinematicUnitJointValue->display(pos); ui.horizontalSliderKinematicUnitPos->blockSignals(false); @@ -780,14 +838,37 @@ namespace armarx // set the velocity to zero to stop any previous controller (e.g. torque controller) jointVelocities[currentNode->getName()] = 0; - const bool isDeg = ui.checkBoxUseDegree->isChecked(); - const bool isRot = currentNode->isRotationalJoint(); - QString unit = isRot ? (isDeg ? "deg/s" : "rad/(100*s)") : "mm/s"; + + const QString unit = [&]() -> QString + { + if (currentNode->isRotationalJoint() or currentNode->isHemisphereJoint()) + { + if (ui.checkBoxUseDegree->isChecked()) + { + return "deg/s"; + } + + return "rad/(100*s)"; + } + + if (currentNode->isTranslationalJoint()) + { + return "mm/s"; + } + + throw std::invalid_argument("unknown/unsupported joint type"); + }(); + + ui.labelUnit->setText(unit); ARMARX_INFO << "setting velocity control for current Node Name: " << currentNode->getName() << flush; - float lo = isRot ? (isDeg ? -90 : -M_PI * 100) : -1000; - float hi = isRot ? (isDeg ? +90 : +M_PI * 100) : 1000; + + const bool isDeg = ui.checkBoxUseDegree->isChecked(); + const bool isRot = currentNode->isRotationalJoint() or currentNode->isHemisphereJoint(); + + const float lo = isRot ? (isDeg ? -90 : -M_PI * 100) : -1000; + const float hi = isRot ? (isDeg ? +90 : +M_PI * 100) : 1000; try { @@ -1105,7 +1186,7 @@ namespace armarx const ControlMode currentControlMode = getSelectedControlMode(); const bool isDeg = ui.checkBoxUseDegree->isChecked(); - const bool isRot = currentNode->isRotationalJoint(); + const bool isRot = currentNode->isRotationalJoint() or currentNode->isHemisphereJoint(); if (currentControlMode == ePositionControl) { @@ -1361,7 +1442,10 @@ namespace armarx QModelIndex index = ui.tableJointList->model()->index(i, eTabelColumnAngleProgressbar); float conversionFactor = - ui.checkBoxUseDegree->isChecked() && node->isRotationalJoint() ? 180.0 / M_PI : 1; + ui.checkBoxUseDegree->isChecked() && + (node->isRotationalJoint() or node->isHemisphereJoint()) + ? 180.0 / M_PI + : 1; ui.tableJointList->model()->setData( index, (int)(cutJitter(currentValue * conversionFactor) * 100) / 100.0f, @@ -1401,7 +1485,8 @@ namespace armarx } float currentValue = it->second; - if (ui.checkBoxUseDegree->isChecked() && rn[i]->isRotationalJoint()) + if (ui.checkBoxUseDegree->isChecked() && + (rn[i]->isRotationalJoint() or rn[i]->isHemisphereJoint())) { currentValue *= 180.0 / M_PI; } diff --git a/source/RobotAPI/libraries/armem_grasping/client/KnownGraspCandidateReader.cpp b/source/RobotAPI/libraries/armem_grasping/client/KnownGraspCandidateReader.cpp index efe2d01c13731c5c32ba876a3837b2e1816ea41a..6eafef5ed875232aa83ab237f058a3c29db08a60 100644 --- a/source/RobotAPI/libraries/armem_grasping/client/KnownGraspCandidateReader.cpp +++ b/source/RobotAPI/libraries/armem_grasping/client/KnownGraspCandidateReader.cpp @@ -3,29 +3,25 @@ #include <mutex> #include <optional> -#include <ArmarXCore/core/logging/Logging.h> #include <ArmarXCore/core/PackagePath.h> +#include <ArmarXCore/core/logging/Logging.h> +#include <RobotAPI/libraries/armem/client/query/Builder.h> #include <RobotAPI/libraries/armem/core/Time.h> #include <RobotAPI/libraries/armem/core/error.h> -#include <RobotAPI/libraries/armem/client/query/Builder.h> #include <RobotAPI/libraries/armem/core/wm/memory_definitions.h> #include <RobotAPI/libraries/armem/util/util.h> -#include <RobotAPI/libraries/armem_robot/robot_conversions.h> -#include <RobotAPI/libraries/armem_robot/aron_conversions.h> -#include <RobotAPI/libraries/armem_robot/aron/Robot.aron.generated.h> #include <RobotAPI/libraries/armem_objects/aron/Attachment.aron.generated.h> #include <RobotAPI/libraries/armem_objects/aron_conversions.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/aron/common/aron_conversions.h> - namespace armarx::armem::grasping::known_grasps { - Reader::Reader(armem::client::MemoryNameSystem& memoryNameSystem) : - memoryNameSystem(memoryNameSystem) - {} - - void Reader::registerPropertyDefinitions(armarx::PropertyDefinitionsPtr& def) + void + Reader::registerPropertyDefinitions(armarx::PropertyDefinitionsPtr& def) { ARMARX_DEBUG << "Reader: registerPropertyDefinitions"; @@ -38,8 +34,8 @@ namespace armarx::armem::grasping::known_grasps "Name of the memory core segment to use for object instances."); } - - void Reader::connect() + void + Reader::connect(armem::client::MemoryNameSystem& memoryNameSystem) { // Wait for the memory to become available and add it as dependency. ARMARX_IMPORTANT << "Reader: Waiting for memory '" << properties.memoryName << "' ..."; @@ -55,7 +51,8 @@ namespace armarx::armem::grasping::known_grasps } } - std::optional<armem::grasping::arondto::KnownGraspInfo> Reader::queryKnownGraspInfo(const armem::wm::Memory& memory, const armem::Time&) + std::optional<armem::grasping::arondto::KnownGraspInfo> + Reader::queryKnownGraspInfo(const armem::wm::Memory& memory, const armem::Time&) { // clang-format off const armem::wm::CoreSegment& s = memory @@ -63,8 +60,7 @@ namespace armarx::armem::grasping::known_grasps // clang-format on const armem::wm::EntityInstance* instance = nullptr; - s.forEachInstance([&instance](const wm::EntityInstance& i) - { instance = &i; }); + s.forEachInstance([&instance](const wm::EntityInstance& i) { instance = &i; }); if (instance == nullptr) { ARMARX_VERBOSE << "No entity snapshots found"; @@ -73,7 +69,9 @@ namespace armarx::armem::grasping::known_grasps return armem::grasping::arondto::KnownGraspInfo::FromAron(instance->data()); } - std::optional<armarx::armem::grasping::arondto::KnownGraspInfo> Reader::queryKnownGraspInfoByEntityName(const std::string& entityName, const armem::Time& timestamp) + std::optional<armarx::armem::grasping::arondto::KnownGraspInfo> + Reader::queryKnownGraspInfoByEntityName(const std::string& entityName, + const armem::Time& timestamp) { // Query all entities from all provider. armem::client::query::Builder qb; @@ -103,7 +101,8 @@ namespace armarx::armem::grasping::known_grasps auto split = simox::alg::split(entityName, "/"); if (split.size() > 2) // there is more than just dataset/class { - ARMARX_INFO << "No grasp found for object entity " << entityName << ". Search for grasp without the index"; + ARMARX_INFO << "No grasp found for object entity " << entityName + << ". Search for grasp without the index"; return queryKnownGraspInfoByEntityName(split[0] + "/" + split[1], timestamp); } } @@ -111,4 +110,4 @@ namespace armarx::armem::grasping::known_grasps return ret; } -} // namespace armarx::armem::attachment +} // namespace armarx::armem::grasping::known_grasps diff --git a/source/RobotAPI/libraries/armem_grasping/client/KnownGraspCandidateReader.h b/source/RobotAPI/libraries/armem_grasping/client/KnownGraspCandidateReader.h index e421d4ee185b092ece8f81f3af45116e04c3d723..d0057afc8d23a30da6e5c6335143d58c638d0557 100644 --- a/source/RobotAPI/libraries/armem_grasping/client/KnownGraspCandidateReader.h +++ b/source/RobotAPI/libraries/armem_grasping/client/KnownGraspCandidateReader.h @@ -28,38 +28,36 @@ #include <RobotAPI/libraries/armem/client/MemoryNameSystem.h> #include <RobotAPI/libraries/armem/client/Reader.h> - #include <RobotAPI/libraries/armem_grasping/aron/KnownGraspCandidate.aron.generated.h> - namespace armarx::armem::grasping::known_grasps { class Reader { public: - Reader(armem::client::MemoryNameSystem& memoryNameSystem); + Reader() = default; virtual ~Reader() = default; void registerPropertyDefinitions(armarx::PropertyDefinitionsPtr& def); - void connect(); + void connect(armem::client::MemoryNameSystem& memoryNameSystem); - std::optional<armem::grasping::arondto::KnownGraspInfo> queryKnownGraspInfoByEntityName(const std::string&, const armem::Time&); - std::optional<armem::grasping::arondto::KnownGraspInfo> queryKnownGraspInfo(const armem::wm::Memory& memory, const armem::Time&); + std::optional<armem::grasping::arondto::KnownGraspInfo> + queryKnownGraspInfoByEntityName(const std::string&, const armem::Time&); + std::optional<armem::grasping::arondto::KnownGraspInfo> + queryKnownGraspInfo(const armem::wm::Memory& memory, const armem::Time&); private: - struct Properties { - std::string memoryName = "Grasp"; - std::string coreSegmentName = "KnownGraspCandidate"; + std::string memoryName = "Grasp"; + std::string coreSegmentName = "KnownGraspCandidate"; } properties; const std::string propertyPrefix = "mem.grasping.knowngrasps."; - armem::client::MemoryNameSystem& memoryNameSystem; armem::client::Reader memoryReader; mutable std::mutex memoryWriterMutex; }; -} // namespace armarx::armem::attachment +} // namespace armarx::armem::grasping::known_grasps diff --git a/source/RobotAPI/libraries/armem_robot_state/aron/Proprioception.xml b/source/RobotAPI/libraries/armem_robot_state/aron/Proprioception.xml index bfb14cb23d8dd6a169b5b9bd916723af9cbd6a2a..db6a0a9c5898f6332df65199da67c0b4b7b16c1c 100644 --- a/source/RobotAPI/libraries/armem_robot_state/aron/Proprioception.xml +++ b/source/RobotAPI/libraries/armem_robot_state/aron/Proprioception.xml @@ -267,6 +267,31 @@ </Dict> </ObjectChild> + <ObjectChild key="extraBools"> + <Dict> + <bool /> + </Dict> + </ObjectChild> + + <ObjectChild key="extraShorts"> + <Dict> + <int32 /> + </Dict> + </ObjectChild> + + <ObjectChild key="extraInts"> + <Dict> + <int32 /> + </Dict> + </ObjectChild> + + <ObjectChild key="extraBytes"> + <Dict> + <int32 /> + </Dict> + </ObjectChild> + + </Object> 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 8d94400263d0deb04152cda8f96d9b9dcbd8c9f2..a8280d7e93ee5513449571a8c13d8ee086c9843d 100644 --- a/source/RobotAPI/libraries/armem_robot_state/client/common/RobotReader.cpp +++ b/source/RobotAPI/libraries/armem_robot_state/client/common/RobotReader.cpp @@ -51,12 +51,11 @@ namespace armarx::armem::robot_state transformReader.connect(memoryNameSystem); // Wait for the memory to become available and add it as dependency. - ARMARX_IMPORTANT << "RobotReader: Waiting for memory '" << constants::memoryName << "' ..."; + ARMARX_INFO << "RobotReader: Waiting for memory '" << constants::memoryName << "' ..."; try { memoryReader = memoryNameSystem.useReader(constants::memoryName); - ARMARX_IMPORTANT << "RobotReader: Connected to memory '" << constants::memoryName - << "'"; + ARMARX_INFO << "RobotReader: Connected to memory '" << constants::memoryName << "'"; } catch (const armem::error::CouldNotResolveMemoryServer& e) { @@ -87,7 +86,7 @@ namespace armarx::armem::robot_state .config = {}, // will be populated by synchronize .timestamp = timestamp}; - synchronize(robot, timestamp); + ARMARX_CHECK(synchronize(robot, timestamp)); return robot; } diff --git a/source/RobotAPI/libraries/armem_robot_state/client/localization/TransformReader.cpp b/source/RobotAPI/libraries/armem_robot_state/client/localization/TransformReader.cpp index 7fa14f5a1bf7ab5a9519584f8432aa92f04a5617..51739021f56c5b87a47b930fa39cd51a8358607d 100644 --- a/source/RobotAPI/libraries/armem_robot_state/client/localization/TransformReader.cpp +++ b/source/RobotAPI/libraries/armem_robot_state/client/localization/TransformReader.cpp @@ -79,12 +79,11 @@ namespace armarx::armem::client::robot_state::localization TransformReader::connect(armem::client::MemoryNameSystem& memoryNameSystem) { // Wait for the memory to become available and add it as dependency. - ARMARX_IMPORTANT << "TransformReader: Waiting for memory '" << properties.memoryName - << "' ..."; + ARMARX_INFO << "TransformReader: Waiting for memory '" << properties.memoryName << "' ..."; try { memoryReader = memoryNameSystem.useReader(properties.memoryName); - ARMARX_IMPORTANT << "TransformReader: Connected to memory '" << properties.memoryName; + ARMARX_INFO << "TransformReader: Connected to memory '" << properties.memoryName; } catch (const armem::error::CouldNotResolveMemoryServer& e) { diff --git a/source/RobotAPI/libraries/armem_robot_state/server/proprioception/converters/Armar6Converter.cpp b/source/RobotAPI/libraries/armem_robot_state/server/proprioception/converters/Armar6Converter.cpp index 4dda540b2596801f1492c4ae8ac532455af002a4..dcbe1b7783190849e6a5d8d442a0124ca22c1b4c 100644 --- a/source/RobotAPI/libraries/armem_robot_state/server/proprioception/converters/Armar6Converter.cpp +++ b/source/RobotAPI/libraries/armem_robot_state/server/proprioception/converters/Armar6Converter.cpp @@ -1,8 +1,10 @@ #include "Armar6Converter.h" +#include <cstddef> #include <SimoxUtility/algorithm/get_map_keys_values.h> #include <SimoxUtility/algorithm/advanced.h> +#include <RobotAPI/interface/units/RobotUnit/RobotUnitInterface.h> #include <RobotAPI/libraries/RobotUnitDataStreamingReceiver/RobotUnitDataStreamingReceiver.h> #include <RobotAPI/libraries/aron/core/data/variant/container/Dict.h> @@ -86,6 +88,18 @@ namespace armarx::armem::server::robot_state::proprioception case RobotUnitDataStreaming::NodeTypeLong: dto.extraLongs[key] = getValueAs<long>(value); break; + case RobotUnitDataStreaming::NodeTypeBool: + dto.extraBools[key] = getValueAs<bool>(value); + break; + case RobotUnitDataStreaming::NodeTypeInt: + dto.extraInts[key] = getValueAs<int>(value); + break; + case RobotUnitDataStreaming::NodeTypeShort: + dto.extraShorts[key] = getValueAs<Ice::Short>(value); + break; + case RobotUnitDataStreaming::NodeTypeByte: + dto.extraBytes[key] = getValueAs<Ice::Byte>(value); + break; default: ARMARX_DEBUG << "Cannot handle extra field '" << key << "' of type " << RobotUnitDataStreaming::DataEntryNames.to_name(value.entry.type);