65 const std::lock_guard<std::recursive_mutex> lock(
mtx_mps);
69 std::map<std::string, bool> flagMPToStop;
70 for (
auto& pair :
limb)
72 flagMPToStop[pair.first] = not
limb.at(pair.first)->controller.ftsensor.ftSafe.load();
73 pair.second->nonRTDeltaT =
74 pair.second->rtStatusInNonRT.accumulateTime - pair.second->nonRTAccumulateTime;
75 pair.second->nonRTAccumulateTime = pair.second->rtStatusInNonRT.accumulateTime;
79 for (
auto& pair :
hands->hands)
81 pair.second->nonRTDeltaT =
82 pair.second->rtsInNonRT.accumulateTime - pair.second->nonRTAccumulateTime;
83 pair.second->nonRTAccumulateTime = pair.second->rtsInNonRT.accumulateTime;
87 std::map<std::string, bool> mpRunning;
90 const auto mpNodeSet =
mp.second.mp->getNodeSetName();
91 mpRunning[
mp.second.mp->getMPName()] =
mp.second.mp->isRunning();
93 auto search = flagMPToStop.find(mpNodeSet);
94 if (search != flagMPToStop.end() and flagMPToStop.at(mpNodeSet) and
95 mp.second.mp->isRunning() and
96 (
limb.at(mpNodeSet)->controller.ftsensor.isForceGuardEnabled() or
97 limb.at(mpNodeSet)->controller.ftsensor.isTorqueGuardEnabled()))
100 ARMARX_INFO <<
"Due to force/torque safe guard, MP " <<
mp.second.mp->getMPName()
101 <<
" is stopped at " <<
mp.second.mp->getCanonicalValue();
104 if (
mp.second.mp->isFinished())
108 if (
mp.second.mp->getRole() ==
"taskspace")
110 auto& arm =
limb.at(
mp.second.mp->getNodeSetName());
111 if (
mp.second.mp->isFirstRun())
116 const std::vector<double> mpStart =
mp.second.mp->getStartVec();
118 if (
mp.second.mp->getStartFromPrevTarget() or
120 arm->rtStatusInNonRT.currentPose,
123 "TSMP initial start pose",
124 arm->nonRtConfig.safeDistanceMMToGoal,
125 arm->nonRtConfig.safeRotAngleDegreeToGoal,
126 mp.second.mp->getMPName() +
"mp_set_target"))
128 if (
mp.second.mp->getStartFromPrevTarget())
130 ARMARX_INFO <<
"User requested to start the current TS MP from the "
131 "previous target pose";
136 <<
"deviation from current pose too large, reset MP start pose";
138 mp.second.mp->validateInitialState(
144 in->pose = arm->rtStatusInNonRT.currentPose;
145 in->vel = arm->rtStatusInNonRT.currentTwist;
147 in->deltaT = arm->nonRTDeltaT;
149 else if (
mp.second.mp->getRole() ==
"nullspace")
151 auto& arm =
limb.at(
mp.second.mp->getNodeSetName());
154 arm->rtStatusInNonRT.jointPosition.size());
155 in->angleRadian = arm->rtStatusInNonRT.jointPosition;
156 in->angularVel = arm->rtStatusInNonRT.qvelFiltered;
157 in->deltaT = arm->nonRTDeltaT;
159 else if (
mp.second.mp->getRole() ==
"hand")
161 auto&
hand =
hands->hands.at(
mp.second.mp->getNodeSetName());
164 in->deltaT =
hand->nonRTDeltaT;
167 if (not rtTargetSafe)
182 if (not mpRunning.at(
mp.second.mp->getMPName()))
186 for (
auto& ftGuard :
mpConfig.ftGuard)
188 if (ftGuard.mpName ==
mp.second.mp->getMPName())
190 bool const forceGuard =
191 (ftGuard.force.has_value() and
192 ftGuard.force.value() >=
mp.second.mp->getCanonicalValue());
193 bool const torqueGuard =
194 (ftGuard.torque.has_value() and
195 ftGuard.torque.value() >=
mp.second.mp->getCanonicalValue());
197 auto& arm =
limb.at(
mp.second.mp->getNodeSetName());
198 bool const resetForce =
199 not arm->controller.ftsensor.isForceGuardEnabled() and forceGuard;
200 bool const resetTorque =
201 not arm->controller.ftsensor.isTorqueGuardEnabled() and torqueGuard;
202 if (resetForce or resetTorque)
204 ARMARX_INFO <<
"Triggering force torque safety guard for "
205 << arm->kinematicChainName <<
" at can value "
206 <<
mp.second.mp->getCanonicalValue();
209 arm->nonRtConfig.ftConfig.enableSafeGuardForce = forceGuard;
210 arm->nonRtConfig.ftConfig.enableSafeGuardTorque = torqueGuard;
211 arm->controller.ftsensor.enableSafeGuard(resetForce, resetTorque);
215 if (
mp.second.mp->getRole() ==
"taskspace")
217 auto& arm =
limb.at(
mp.second.mp->getNodeSetName());
223 arm->rtStatusInNonRT.currentPose,
227 arm->nonRtConfig.safeDistanceMMToGoal,
228 arm->nonRtConfig.safeRotAngleDegreeToGoal,
229 mp.second.mp->getMPName() +
"mp_set_target");
230 arm->nonRtConfig.desiredPose = out->pose;
231 arm->nonRtConfig.desiredTwist = out->vel;
233 else if (
mp.second.mp->getRole() ==
"nullspace")
235 auto& arm =
limb.at(
mp.second.mp->getNodeSetName());
238 arm->nonRtConfig.desiredNullspaceJointAngles.value() = out->angleRadian;
240 else if (
mp.second.mp->getRole() ==
"hand")
243 auto&
hand =
hands->hands.at(
mp.second.mp->getNodeSetName());
246 out->angleRadian.size());
247 hand->targetNonRT.jointPosition.value() = out->angleRadian;
249 if (mpRunning.at(
mp.second.mp->getMPName()) and
mp.second.mp->isFinished())
251 ARMARX_INFO <<
"reset buffer for nonRtConfig of " <<
mp.second.mp->getMPName();
252 for (
auto& pair :
limb)
254 auto& arm = pair.second;
255 arm->bufferConfigUserToNonRt.reinitAllBuffers(arm->nonRtConfig);
257 for (
auto& pair :
limb)
259 userConfig.limbs.at(pair.first) = pair.second->nonRtConfig;