35 using namespace PlatformGroup;
44 return std::copysign(std::min<float>(fabs(newValue), minAbsValue), newValue);
61 setTimeoutEvent(in.getTimeout(), createEventTimeout());
63 if (in.getUsePlatformNativeController())
69 {currentTarget->x, in.getPositionalAccuracy()});
72 {currentTarget->y, in.getPositionalAccuracy()});
76 {currentTarget->z, in.getOrientationalAccuracy()});
78 float checkAngleValueOffset;
80 if (currentTarget->z >
M_PI)
82 checkAngleValueOffset = -2 *
M_PI;
86 checkAngleValueOffset = 2 *
M_PI;
92 {(float)(currentTarget->z + checkAngleValueOffset), in.getOrientationalAccuracy()});
94 installConditionForPoseReached(checkX && checkY && (checkAngle || checkAngle2));
95 ARMARX_INFO <<
"Moving to " << in.getTargetPose()->x <<
", " << in.getTargetPose()->y
96 <<
", " << in.getTargetPose()->z <<
", ";
98 in.getTargetPose()->y,
99 in.getTargetPose()->z,
100 in.getPositionalAccuracy(),
101 in.getOrientationalAccuracy());
104 in.getTargetPose()->y,
105 in.getTargetPose()->z,
106 in.getPositionalAccuracy(),
107 in.getOrientationalAccuracy());
109 this->setUseRunFunction(
false);
113 this->setUseRunFunction(
true);
122 in.getPTranslation(), in.getITranslation(), in.getDTranslation());
124 PIDController pidRot(in.getPOrientation(), in.getIOrientation(), in.getDOrientation());
130 new DatafieldRef(
c->platformUnitObserverPrx,
"platformPose",
"positionX");
132 new DatafieldRef(
c->platformUnitObserverPrx,
"platformPose",
"positionY");
134 new DatafieldRef(
c->platformUnitObserverPrx,
"platformPose",
"rotation");
137 float maxTransVel = in.getMaxTranslationVelocity();
138 ARMARX_INFO <<
"orientation accuracy: " << in.getOrientationalAccuracy();
139 ARMARX_INFO <<
"translational accuracy: " << in.getPositionalAccuracy();
142 float targetX = in.getTargetPose()->x;
143 float targetY = in.getTargetPose()->y;
144 Eigen::Vector3f
target{targetX, targetY, 0};
145 float targetOri = in.getTargetPose()->z;
160 float startOri = oriRef->getDataField()->getFloat();
163 ARMARX_INFO <<
"Platform current pose: " << posXRef->getDataField()->getFloat() <<
", "
164 << posYRef->getDataField()->getFloat() <<
", "
165 << oriRef->getDataField()->getFloat();
167 ARMARX_INFO <<
"Platform target pose: " << *in.getTargetPose();
168 ARMARX_INFO <<
"AdjustPlatform target angle: " << targetOri;
171 if (targetOri >
M_PI)
173 targetOri = -2 *
M_PI + targetOri;
178 startOri = -2 *
M_PI + startOri;
181 float angleAbsDelta = targetOri - startOri;
184 while (angleAbsDelta < -
M_PI)
186 angleAbsDelta += 2 *
M_PI;
189 while (angleAbsDelta >=
M_PI)
191 angleAbsDelta -= 2 *
M_PI;
195 Eigen::Vector2f targetOriVec(sin(targetOri), cos(targetOri));
196 bool verify = in.getVerifyTargetPose();
198 float cycleTime = in.getCycleTime();
200 while (!isRunningTaskStopped())
203 float posx = posXRef->getDataField()->getFloat();
204 float posy = posYRef->getDataField()->getFloat();
205 float ori = oriRef->getDataField()->getFloat();
212 Eigen::Vector3f pos{posx, posy, 0.0f};
216 ori = -2 *
M_PI + ori;
222 float angleDelta = targetOri - ori;
228 while (angleDelta < -
M_PI)
230 angleDelta += 2 *
M_PI;
233 while (angleDelta >=
M_PI)
235 angleDelta -= 2 *
M_PI;
240 pidRot.
update(angleDelta, 0);
246 Eigen::Vector3f globalVel{newVel[0], newVel[1], 0};
248 m = Eigen::AngleAxisf(ori, Eigen::Vector3f::UnitZ());
249 Eigen::Vector3f localVel = m.inverse() * globalVel;
250 if (localVel.head(2).norm() > maxTransVel)
252 localVel.head(2) *= maxTransVel / localVel.head(2).norm();
258 if (std::isnan(localVel[0]) || std::isnan(localVel[1]) || std::isnan(newVelocityRot))
260 throw LocalException(
"A target velocity is NaN!");
267 c->platformUnitPrx->move(localVel[0], localVel[1], newVelocityRot);
270 if (fabs(pidTrans.
previousError) < in.getPositionalAccuracy() &&
279 if (targetReachedTime.toSeconds() == 0)
285 <<
" x velocity: " << newVel[0] <<
" y velocity: " << newVel[1];
287 <<
" rot velocity: " << newVelocityRot;
299 <<
" x velocity: " << newVel[0] <<
" y velocity: " << newVel[1];
301 <<
" rot velocity: " << newVelocityRot;
304 usleep(cycleTime * 1000);
448 new DatafieldRef(
c->platformUnitObserverPrx,
"platformPose",
"positionX");
450 new DatafieldRef(
c->platformUnitObserverPrx,
"platformPose",
"positionY");
452 new DatafieldRef(
c->platformUnitObserverPrx,
"platformPose",
"rotation");
453 float posX = posXRef->getDataField()->getFloat();
454 float posY = posYRef->getDataField()->getFloat();
455 float ori = oriRef->getDataField()->getFloat();
457 fabs(in.getTargetPose()->y - posY),
458 fabs(in.getTargetPose()->z - ori));
459 ARMARX_INFO <<
"Remaining platform error: " << *error;
460 out.setRemainingError(error);
466 while (!isRunningTaskFinished())
474 if (in.getStopPlatformOnBreak())
476 c->platformUnitPrx->stopPlatform();
483 while (!isRunningTaskFinished())
492 if (in.getStopPlatformOnExit())
494 c->platformUnitPrx->stopPlatform();