diff --git a/source/RobotAPI/components/units/KinematicUnitSimulation.cpp b/source/RobotAPI/components/units/KinematicUnitSimulation.cpp index 81f545e0d01e864ac1576718f841bb798987fa01..f830c604c404e232535cd1812e49154da09dc496 100644 --- a/source/RobotAPI/components/units/KinematicUnitSimulation.cpp +++ b/source/RobotAPI/components/units/KinematicUnitSimulation.cpp @@ -63,7 +63,7 @@ void KinematicUnitSimulation::onInitKinematicUnit() ARMARX_TRACE; { // duplicate the loop because of locking - boost::mutex::scoped_lock lock(jointStatesMutex); + std::unique_lock lock(jointStatesMutex); // initialize JoinStates for (std::vector<VirtualRobot::RobotNodePtr>::iterator it = robotNodes.begin(); it != robotNodes.end(); it++) @@ -115,7 +115,7 @@ void KinematicUnitSimulation::simulationFunction() }; { - boost::mutex::scoped_lock lock(jointStatesMutex); + std::unique_lock lock(jointStatesMutex); for (KinematicUnitSimulationJointStates::iterator it = jointStates.begin(); it != jointStates.end(); it++) { @@ -221,7 +221,7 @@ void KinematicUnitSimulation::switchControlMode(const NameControlModeMap& target bool aValueChanged = false; NameControlModeMap changedControlModes; { - boost::mutex::scoped_lock lock(jointStatesMutex); + std::unique_lock lock(jointStatesMutex); for (NameControlModeMap::const_iterator it = targetJointModes.begin(); it != targetJointModes.end(); it++) { @@ -256,7 +256,7 @@ void KinematicUnitSimulation::switchControlMode(const NameControlModeMap& target void KinematicUnitSimulation::setJointAngles(const NameValueMap& targetJointAngles, const Ice::Current& c) { - boost::mutex::scoped_lock lock(jointStatesMutex); + std::unique_lock lock(jointStatesMutex); // name value maps for reporting NameValueMap actualJointAngles; bool aValueChanged = false; @@ -321,7 +321,7 @@ void KinematicUnitSimulation::setJointAngles(const NameValueMap& targetJointAngl void KinematicUnitSimulation::setJointVelocities(const NameValueMap& targetJointVelocities, const Ice::Current& c) { - boost::mutex::scoped_lock lock(jointStatesMutex); + std::unique_lock lock(jointStatesMutex); NameValueMap actualJointVelocities; bool aValueChanged = false; @@ -354,7 +354,7 @@ void KinematicUnitSimulation::setJointVelocities(const NameValueMap& targetJoint void KinematicUnitSimulation::setJointTorques(const NameValueMap& targetJointTorques, const Ice::Current& c) { - boost::mutex::scoped_lock lock(jointStatesMutex); + std::unique_lock lock(jointStatesMutex); NameValueMap actualJointTorques; bool aValueChanged = false; @@ -408,7 +408,7 @@ void KinematicUnitSimulation::setJointDecelerations(const NameValueMap& targetJo void KinematicUnitSimulation::stop(const Ice::Current& c) { - boost::mutex::scoped_lock lock(jointStatesMutex); + std::unique_lock lock(jointStatesMutex); for (KinematicUnitSimulationJointStates::iterator it = jointStates.begin(); it != jointStates.end(); it++) { diff --git a/source/RobotAPI/components/units/KinematicUnitSimulation.h b/source/RobotAPI/components/units/KinematicUnitSimulation.h index cc3dae20ac7476572a4250c384a6395c7fd7d61b..f6512ecf5f261c3afa4047b6d87b5d6b3ff50811 100644 --- a/source/RobotAPI/components/units/KinematicUnitSimulation.h +++ b/source/RobotAPI/components/units/KinematicUnitSimulation.h @@ -29,10 +29,12 @@ #include <ArmarXCore/core/services/tasks/PeriodicTask.h> #include <ArmarXCore/core/system/ImportExportComponent.h> #include <RobotAPI/libraries/core/PIDController.h> -#include <random> #include <IceUtil/Time.h> +#include <random> +#include <mutex> + namespace armarx { /** @@ -178,7 +180,7 @@ namespace armarx KinematicUnitSimulationJointStates jointStates; KinematicUnitSimulationJointStates previousJointStates; KinematicUnitSimulationJointInfos jointInfos; - boost::mutex jointStatesMutex; + std::mutex jointStatesMutex; IceUtil::Time lastExecutionTime; float noise; int intervalMs; diff --git a/source/RobotAPI/components/units/PlatformUnitSimulation.cpp b/source/RobotAPI/components/units/PlatformUnitSimulation.cpp index b4b4879b4ac4c0fd3246565c06eef9f83d50b35c..93b61e1d4f7338e888e55e0427e203a89843f731 100644 --- a/source/RobotAPI/components/units/PlatformUnitSimulation.cpp +++ b/source/RobotAPI/components/units/PlatformUnitSimulation.cpp @@ -94,7 +94,7 @@ namespace armarx lastExecutionTime = now; std::vector<float> vel(3, 0.0f); { - ScopedLock lock(currentPoseMutex); + std::unique_lock lock(currentPoseMutex); switch (platformMode) { case ePositionControl: @@ -177,7 +177,7 @@ namespace armarx { ARMARX_INFO << "new target pose : " << targetPlatformPositionX << ", " << targetPlatformPositionY << " with angle " << targetPlatformRotation; { - ScopedLock lock(currentPoseMutex); + std::unique_lock lock(currentPoseMutex); platformMode = ePositionControl; targetPositionX = targetPlatformPositionX; targetPositionY = targetPlatformPositionY; @@ -199,7 +199,7 @@ namespace armarx void armarx::PlatformUnitSimulation::move(float targetPlatformVelocityX, float targetPlatformVelocityY, float targetPlatformVelocityRotation, const Ice::Current& c) { ARMARX_INFO << deactivateSpam(1) << "New velocity: " << targetPlatformVelocityX << ", " << targetPlatformVelocityY << " with angular velocity: " << targetPlatformVelocityRotation; - ScopedLock lock(currentPoseMutex); + std::unique_lock lock(currentPoseMutex); platformMode = eVelocityControl; linearVelocityX = std::min(maxLinearVelocity, targetPlatformVelocityX); linearVelocityY = std::min(maxLinearVelocity, targetPlatformVelocityY); @@ -211,7 +211,7 @@ namespace armarx { float targetPositionX, targetPositionY, targetRotation; { - ScopedLock lock(currentPoseMutex); + std::unique_lock lock(currentPoseMutex); targetPositionX = currentPositionX + targetPlatformOffsetX; targetPositionY = currentPositionY + targetPlatformOffsetY; targetRotation = currentRotation + targetPlatformOffsetRotation; @@ -221,7 +221,7 @@ namespace armarx void PlatformUnitSimulation::setMaxVelocities(float positionalVelocity, float orientaionalVelocity, const Ice::Current& c) { - ScopedLock lock(currentPoseMutex); + std::unique_lock lock(currentPoseMutex); maxLinearVelocity = positionalVelocity; maxAngularVelocity = orientaionalVelocity; } diff --git a/source/RobotAPI/components/units/PlatformUnitSimulation.h b/source/RobotAPI/components/units/PlatformUnitSimulation.h index 8c7743a7f940c74860597157a46beb16b4de6794..c6d9851b1345a8aad3bd296b99f7c06ea774fec6 100644 --- a/source/RobotAPI/components/units/PlatformUnitSimulation.h +++ b/source/RobotAPI/components/units/PlatformUnitSimulation.h @@ -99,7 +99,7 @@ namespace armarx PropertyDefinitionsPtr createPropertyDefinitions() override; protected: - boost::mutex currentPoseMutex; + std::mutex currentPoseMutex; IceUtil::Time lastExecutionTime; int intervalMs; diff --git a/source/RobotAPI/components/units/RobotUnit/NJointControllers/NJointController.cpp b/source/RobotAPI/components/units/RobotUnit/NJointControllers/NJointController.cpp index 7f73e77b62de92a209368a3f379e0c9e1d3da81e..fbd850fd60d3769abd1a895d1087927e75f5ad78 100644 --- a/source/RobotAPI/components/units/RobotUnit/NJointControllers/NJointController.cpp +++ b/source/RobotAPI/components/units/RobotUnit/NJointControllers/NJointController.cpp @@ -282,7 +282,7 @@ namespace armarx onExitNJointController(); // make sure the destructor of the handles does not throw an exception and triggers a termination of the process ARMARX_DEBUG << "Deleting thread handles"; - ScopedLock lock(threadHandlesMutex); + std::unique_lock lock(threadHandlesMutex); for (auto& pair : threadHandles) { try diff --git a/source/RobotAPI/components/units/RobotUnit/NJointControllers/NJointController.h b/source/RobotAPI/components/units/RobotUnit/NJointControllers/NJointController.h index 1ca9843eb3dd70b97900d04020c286a8c2d27588..26c8a6aedb6cf2f5a85254987fd3f61ce87ead01 100644 --- a/source/RobotAPI/components/units/RobotUnit/NJointControllers/NJointController.h +++ b/source/RobotAPI/components/units/RobotUnit/NJointControllers/NJointController.h @@ -35,7 +35,6 @@ #include <ArmarXCore/core/util/TripleBuffer.h> #include <ArmarXCore/core/exceptions/local/ExpressionException.h> #include <ArmarXCore/core/services/tasks/ThreadPool.h> -#include <ArmarXCore/core/system/Synchronization.h> #include <ArmarXGui/interface/WidgetDescription.h> @@ -701,7 +700,7 @@ namespace armarx template < typename Task > void runTask(const std::string& taskName, Task&& task) { - ScopedLock lock(threadHandlesMutex); + std::unique_lock lock(threadHandlesMutex); ARMARX_CHECK_EXPRESSION(!taskName.empty()); ARMARX_CHECK_EXPRESSION(!threadHandles.count(taskName)); ARMARX_CHECK_EXPRESSION(getState() < eManagedIceObjectExiting); @@ -711,7 +710,7 @@ namespace armarx threadHandles[taskName] = handlePtr; } std::map<std::string, std::shared_ptr<ThreadPool::Handle>> threadHandles; - Mutex threadHandlesMutex; + std::mutex threadHandlesMutex; // //////////////////////////////////////////////////////////////////////////////////////// // // ///////////////////////////////////// ice interface //////////////////////////////////// // diff --git a/source/RobotAPI/components/units/RobotUnit/Units/TCPControllerSubUnit.cpp b/source/RobotAPI/components/units/RobotUnit/Units/TCPControllerSubUnit.cpp index f978876e538d9b8420af57d8c35b8f8f8063a9bd..1c98f6b653589f3a6f6fd611d4695e1933111458 100644 --- a/source/RobotAPI/components/units/RobotUnit/Units/TCPControllerSubUnit.cpp +++ b/source/RobotAPI/components/units/RobotUnit/Units/TCPControllerSubUnit.cpp @@ -58,7 +58,7 @@ void TCPControllerSubUnit::setCycleTime(Ice::Int, const Ice::Current& c) void TCPControllerSubUnit::setTCPVelocity(const std::string& nodeSetName, const std::string& tcpName, const FramedDirectionBasePtr& translationVelocity, const FramedDirectionBasePtr& orientationVelocityRPY, const Ice::Current& c) { - ScopedLock lock(dataMutex); + std::unique_lock lock(dataMutex); ARMARX_CHECK_EXPRESSION_W_HINT(coordinateTransformationRobot->hasRobotNodeSet(nodeSetName), "The robot does not have the node set: " + nodeSetName); std::string tcp; if (tcpName.empty()) @@ -185,7 +185,7 @@ void TCPControllerSubUnit::setTCPVelocity(const std::string& nodeSetName, const bool TCPControllerSubUnit::isRequested(const Ice::Current&) { - ScopedLock lock(dataMutex); + std::unique_lock lock(dataMutex); for (auto& pair : tcpControllerNameMap) { auto ctrl = robotUnit->getNJointController(pair.second); diff --git a/source/RobotAPI/components/units/RobotUnit/Units/TCPControllerSubUnit.h b/source/RobotAPI/components/units/RobotUnit/Units/TCPControllerSubUnit.h index b834d2b8adb16a0405bd3c60834693a3f7df4f57..cb7f6603057bdf2219d3f2aa92506bc6d76d2d53 100644 --- a/source/RobotAPI/components/units/RobotUnit/Units/TCPControllerSubUnit.h +++ b/source/RobotAPI/components/units/RobotUnit/Units/TCPControllerSubUnit.h @@ -27,6 +27,9 @@ #include "RobotUnitSubUnit.h" #include "../NJointControllers/NJointTCPController.h" #include "../util.h" + +#include <mutex> + namespace armarx { TYPEDEF_PTRS_HANDLE(RobotUnit); @@ -57,7 +60,7 @@ namespace armarx // RobotUnitSubUnit interface void update(const SensorAndControl& sc, const JointAndNJointControllers& c) override; private: - mutable Mutex dataMutex; + mutable std::mutex dataMutex; RobotUnit* robotUnit = nullptr; VirtualRobot::RobotPtr coordinateTransformationRobot; std::map<std::string, std::string> tcpControllerNameMap; diff --git a/source/RobotAPI/components/units/RobotUnit/Units/TrajectoryControllerSubUnit.cpp b/source/RobotAPI/components/units/RobotUnit/Units/TrajectoryControllerSubUnit.cpp index 0a3669091152c2de2ec2caad4865a0e3d6b6c08d..4af60478ff5da6a4a57d055dd919473a64b1d1d5 100644 --- a/source/RobotAPI/components/units/RobotUnit/Units/TrajectoryControllerSubUnit.cpp +++ b/source/RobotAPI/components/units/RobotUnit/Units/TrajectoryControllerSubUnit.cpp @@ -158,7 +158,7 @@ void TrajectoryControllerSubUnit::loadJointTraj(const TrajectoryBasePtr& jointTr { ARMARX_DEBUG << "Loading Trajectory ..."; - ScopedLock lock(dataMutex); + std::unique_lock lock(dataMutex); this->jointTraj = TrajectoryPtr::dynamicCast(jointTraj); @@ -215,7 +215,7 @@ void TrajectoryControllerSubUnit::loadBasePoseTraj(const TrajectoryBasePtr& base void TrajectoryControllerSubUnit::setLoopPlayback(bool loop, const Ice::Current& c) { - ScopedLock lock(dataMutex); + std::unique_lock lock(dataMutex); if (!controllerExists()) { @@ -237,7 +237,7 @@ double TrajectoryControllerSubUnit::getTrajEndTime(const Ice::Current& c) double TrajectoryControllerSubUnit::getCurrentTime(const Ice::Current& c) { - ScopedLock lock(dataMutex); + std::unique_lock lock(dataMutex); if (!controllerExists()) { @@ -251,7 +251,7 @@ void TrajectoryControllerSubUnit::setEndTime(Ice::Double end, const Ice::Current { ARMARX_DEBUG << "Setting end-time ..."; - ScopedLock lock(dataMutex); + std::unique_lock lock(dataMutex); if (!jointTraj) { @@ -306,7 +306,7 @@ bool TrajectoryControllerSubUnit::setJointsInUse(const std::string& jointName, b { ARMARX_DEBUG << "Setting joints in use ..."; - ScopedLock lock(dataMutex); + std::unique_lock lock(dataMutex); if (controllerExists()) { @@ -366,7 +366,7 @@ void TrajectoryControllerSubUnit::considerConstraints(bool consider, const Ice:: NJointTrajectoryControllerPtr TrajectoryControllerSubUnit::createTrajectoryController(std::vector<std::string>& jointNames, bool deleteIfAlreadyExist) { - ScopedRecursiveLock lock(controllerMutex); + std::unique_lock lock(controllerMutex); if (controllerExists() && deleteIfAlreadyExist) { @@ -413,7 +413,7 @@ NJointTrajectoryControllerPtr TrajectoryControllerSubUnit::createTrajectoryContr void TrajectoryControllerSubUnit::assureTrajectoryController() { - ScopedRecursiveLock lock(controllerMutex); + std::unique_lock lock(controllerMutex); if (!controllerExists()) { @@ -424,7 +424,7 @@ void TrajectoryControllerSubUnit::assureTrajectoryController() bool TrajectoryControllerSubUnit::controllerExists() { - ScopedRecursiveLock lock(controllerMutex); + std::unique_lock lock(controllerMutex); auto allNJointControllers = robotUnit->getNJointControllersNotNull(robotUnit->getNJointControllerNames()); NJointTrajectoryControllerPtr trajController; diff --git a/source/RobotAPI/components/units/RobotUnit/Units/TrajectoryControllerSubUnit.h b/source/RobotAPI/components/units/RobotUnit/Units/TrajectoryControllerSubUnit.h index d50323bf97082b1fb89df256ddf63784c0b7c277..b0b65db9dad4ee9cd94742d27b542cb03719492a 100644 --- a/source/RobotAPI/components/units/RobotUnit/Units/TrajectoryControllerSubUnit.h +++ b/source/RobotAPI/components/units/RobotUnit/Units/TrajectoryControllerSubUnit.h @@ -30,6 +30,8 @@ #include "KinematicSubUnit.h" +#include <mutex> + namespace armarx { class TrajectoryControllerSubUnitPropertyDefinitions: @@ -152,8 +154,8 @@ namespace armarx DebugDrawerInterfacePrx debugDrawer; PeriodicTask<TrajectoryControllerSubUnit>::pointer_type previewTask; - Mutex dataMutex; - RecursiveMutex controllerMutex; + std::mutex dataMutex; + std::recursive_mutex controllerMutex; bool recreateController = true; // Component interface diff --git a/source/RobotAPI/components/units/SensorActorUnit.h b/source/RobotAPI/components/units/SensorActorUnit.h index bef26a5e7c92e97d3ab2889e4081b59caee0daec..2c18c79e6bd840ed60f5660a858e104faecc3de6 100644 --- a/source/RobotAPI/components/units/SensorActorUnit.h +++ b/source/RobotAPI/components/units/SensorActorUnit.h @@ -27,7 +27,7 @@ #include <ArmarXCore/core/exceptions/Exception.h> #include <RobotAPI/interface/units/UnitInterface.h> -#include <boost/thread/mutex.hpp> +#include <mutex> namespace armarx { @@ -125,7 +125,7 @@ namespace armarx */ virtual void onStop() {}; - boost::mutex unitMutex; + std::mutex unitMutex; Ice::Identity ownerId; UnitExecutionState executionState; }; diff --git a/source/RobotAPI/libraries/core/PIDController.cpp b/source/RobotAPI/libraries/core/PIDController.cpp index 34c5e6c30469a5ef7d38d19a90a0bf5d67f57b5f..02f198137de13f4687bb212753b204b9ea49aaca 100644 --- a/source/RobotAPI/libraries/core/PIDController.cpp +++ b/source/RobotAPI/libraries/core/PIDController.cpp @@ -68,11 +68,11 @@ namespace armarx } } - ScopedRecursiveLockPtr PIDController::getLock() const + auto PIDController::getLock() const -> ScopedRecursiveLockPtr { if (threadSafe) { - return std::make_shared<ScopedRecursiveLock>(mutex); + return std::make_unique<ScopedRecursiveLock>(mutex); } else { diff --git a/source/RobotAPI/libraries/core/PIDController.h b/source/RobotAPI/libraries/core/PIDController.h index b8631b35b9154e28962149e3c1ca5688447d59ac..320f2e6146f018b9803d34dac4a4418dd22aebcc 100644 --- a/source/RobotAPI/libraries/core/PIDController.h +++ b/source/RobotAPI/libraries/core/PIDController.h @@ -28,10 +28,12 @@ #include <ArmarXCore/core/logging/Logging.h> #include <ArmarXCore/observers/filters/rtfilters/RTFilterBase.h> -#include <ArmarXCore/core/system/Synchronization.h> #include <Eigen/Core> +#include <memory> +#include <mutex> + namespace armarx { @@ -73,8 +75,10 @@ namespace armarx rtfilters::RTFilterBasePtr differentialFilter; rtfilters::RTFilterBasePtr pdOutputFilter; private: + using ScopedRecursiveLock = std::unique_lock<std::recursive_mutex>; + using ScopedRecursiveLockPtr = std::unique_ptr<ScopedRecursiveLock>; ScopedRecursiveLockPtr getLock() const; - mutable RecursiveMutex mutex; + mutable std::recursive_mutex mutex; }; using PIDControllerPtr = std::shared_ptr<PIDController>;