diff --git a/source/RobotAPI/components/armem/server/RobotStateMemory/RobotStateMemory.cpp b/source/RobotAPI/components/armem/server/RobotStateMemory/RobotStateMemory.cpp index 2a3d01143be737e9afb7ce5c27253e2cb6d4891e..da477a238532c316ed729e833ebcc0a07f86cc2e 100644 --- a/source/RobotAPI/components/armem/server/RobotStateMemory/RobotStateMemory.cpp +++ b/source/RobotAPI/components/armem/server/RobotStateMemory/RobotStateMemory.cpp @@ -130,6 +130,10 @@ namespace armarx::armem::server::robot_state void RobotStateMemory::onConnectComponent() { + waitUntilRobotUnitIsRunning(); + + ARMARX_CHECK_NOT_NULL(getRobotUnit()->getKinematicUnit()); + descriptionSegment.connect(getArvizClient(), getRobotUnit()); proprioceptionSegment.connect(getArvizClient(), getRobotUnit()); diff --git a/source/RobotAPI/libraries/RobotAPIComponentPlugins/RobotUnitComponentPlugin.cpp b/source/RobotAPI/libraries/RobotAPIComponentPlugins/RobotUnitComponentPlugin.cpp index 7c120b3cc4db3aabbf6b184e5d747d3014ae0a61..7d32ae794b427f07dc27e38edd8178460ec9fbd4 100644 --- a/source/RobotAPI/libraries/RobotAPIComponentPlugins/RobotUnitComponentPlugin.cpp +++ b/source/RobotAPI/libraries/RobotAPIComponentPlugins/RobotUnitComponentPlugin.cpp @@ -1,4 +1,6 @@ #include "RobotUnitComponentPlugin.h" +#include "ArmarXCore/util/CPPUtility/Pointer.h" +#include <thread> namespace armarx::plugins { @@ -112,7 +114,11 @@ namespace armarx::plugins { _deactivated = true; } -} + + + + +} // namespace armarx::plugins namespace armarx { @@ -130,6 +136,18 @@ namespace armarx { return *plugin; } + + void RobotUnitComponentPluginUser::waitUntilRobotUnitIsRunning(const std::function<bool()>& termCond) const + { + ARMARX_INFO << "Waiting until robot unit is running ..."; + + while ((not termCond()) and ((isNullptr(getRobotUnit()) or (not getRobotUnit()->isRunning())))) + { + std::this_thread::sleep_for(std::chrono::milliseconds(100)); + } + + ARMARX_INFO << "Robot unit is up and running."; + } } diff --git a/source/RobotAPI/libraries/RobotAPIComponentPlugins/RobotUnitComponentPlugin.h b/source/RobotAPI/libraries/RobotAPIComponentPlugins/RobotUnitComponentPlugin.h index 18616020e0683a70e6fcb0f95c7e7a09939db357..63d78de7da9033399b92497a7bccf89161337588 100644 --- a/source/RobotAPI/libraries/RobotAPIComponentPlugins/RobotUnitComponentPlugin.h +++ b/source/RobotAPI/libraries/RobotAPIComponentPlugins/RobotUnitComponentPlugin.h @@ -78,7 +78,20 @@ namespace armarx { public: RobotUnitComponentPluginUser(); + RobotUnitInterfacePrx getRobotUnit() const; + + /** + * @brief Waits until the robot unit is running. + * + * Although the robot unit proxy might be initialized (\see getRobotUnit()), the robot unit might + * not be fully initialized. + * + * @param termCond Termination condition. If it evaluates to true, waitUntilRobotUnitIsRunning returns without waiting + * for the robot unit to become available. + */ + void waitUntilRobotUnitIsRunning(const std::function<bool()>& termCond = [] {return false;}) const; + plugins::RobotUnitComponentPlugin& getRobotUnitComponentPlugin(); private: armarx::plugins::RobotUnitComponentPlugin* plugin = nullptr; diff --git a/source/RobotAPI/libraries/armem_robot_state/client/localization/TransformWriter.h b/source/RobotAPI/libraries/armem_robot_state/client/localization/TransformWriter.h index aa9e295bf19b34229697ad43725884469c9d1172..0402d8188e52b9a967805a7ddb9ca5df9c14320c 100644 --- a/source/RobotAPI/libraries/armem_robot_state/client/localization/TransformWriter.h +++ b/source/RobotAPI/libraries/armem_robot_state/client/localization/TransformWriter.h @@ -47,7 +47,6 @@ namespace armarx::armem::client::robot_state::localization */ class TransformWriter : virtual public TransformWriterInterface - // virtual public ::armarx::armem::MemoryConnector { public: TransformWriter(armem::ClientWriterComponentPluginUser& memoryClient); diff --git a/source/RobotAPI/libraries/armem_robot_state/server/description/Segment.cpp b/source/RobotAPI/libraries/armem_robot_state/server/description/Segment.cpp index 826c5b484768686e2edb8cee409df4136bcc85ab..c4dc03c66eadfa840923bf32c5fc03533749f55b 100644 --- a/source/RobotAPI/libraries/armem_robot_state/server/description/Segment.cpp +++ b/source/RobotAPI/libraries/armem_robot_state/server/description/Segment.cpp @@ -99,25 +99,8 @@ namespace armarx::armem::server::robot_state::description void Segment::updateRobotDescription() { ARMARX_CHECK_NOT_NULL(robotUnit); + auto kinematicUnit = robotUnit->getKinematicUnit(); - const auto waitForKinematicUnit = [&]() - { - while (true) - { - auto kinematicUnit = robotUnit->getKinematicUnit(); - - if (kinematicUnit) - { - ARMARX_INFO << "Kinematic unit is now available."; - return kinematicUnit; - } - - ARMARX_INFO << "Waiting for kinematic unit ..."; - std::this_thread::sleep_for(std::chrono::seconds(1)); - } - }; - - auto kinematicUnit = waitForKinematicUnit(); ARMARX_CHECK_NOT_NULL(kinematicUnit); const auto robotName = kinematicUnit->getRobotName();