34 using namespace PlatformGroup;
37 MovePlatformRelative::SubClassRegistry
50 if (!in.getUsePlatformNativeController())
55 auto pose = in.getRelativePose();
58 new DatafieldRef(
c->platformUnitObserverPrx,
"platformPose",
"positionX");
60 new DatafieldRef(
c->platformUnitObserverPrx,
"platformPose",
"positionY");
62 new DatafieldRef(
c->platformUnitObserverPrx,
"platformPose",
"rotation");
63 float posX = posXRef->getDataField()->getFloat();
64 float posY = posYRef->getDataField()->getFloat();
65 float ori = oriRef->getDataField()->getFloat();
67 Eigen::Vector3f localPos{pose->x, pose->y, 0};
69 m = Eigen::AngleAxisf(ori, Eigen::Vector3f::UnitZ());
70 Eigen::Vector3f globalPos = m * localPos;
74 pose->z -=
M_PI * 2.0;
79 pose->z +=
M_PI * 2.0;
82 float targetX = posX + globalPos[0];
83 float targetY = posY + globalPos[1];
84 float targetOri = ori + pose->z;
88 targetOri +=
M_PI * 2.0;
91 while (targetOri >
M_PI * 2.0)
93 targetOri -=
M_PI * 2.0;
96 ARMARX_INFO <<
"Relative target pose: " << pose->toEigen().transpose();
97 ARMARX_INFO <<
"Global target pose: " << targetX <<
" " << targetY <<
" " << targetOri;
98 local.setAbsoluteTargetPosition(
new Vector3(targetX, targetY, targetOri));
104 std::string platformDatafieldName = in.getPlatformPoseDatafieldName();
112 auto relativeTargetPose = in.getRelativePose();
115 datafields.at(0)->getFloat() + relativeTargetPose->x,
116 datafields.at(1)->getFloat() + relativeTargetPose->y,
120 Literal checkX(*posXId, checks::approx, {
target->x, in.getPositionalAccuracy()});
121 Literal checkY(*posYId, checks::approx, {
target->y, in.getPositionalAccuracy()});
123 Literal checkAngle(*rotId, checks::approx, {
target->z, in.getOrientationalAccuracy()});
125 float checkAngleValueOffset;
129 checkAngleValueOffset = -2 *
M_PI;
133 checkAngleValueOffset = 2 *
M_PI;
139 {(
float)(
target->z + checkAngleValueOffset), in.getOrientationalAccuracy()});
141 installConditionForTargetReached(checkX && checkY && (checkAngle || checkAngle2));
142 setTimeoutEvent(in.getTimeout(), this->createEventTimeout());
150 std::string platformDatafieldName = in.getPlatformPoseDatafieldName();
151 if (in.getUsePlatformNativeController())
161 auto relativeTargetPose = in.getRelativePose();
163 datafields.at(0)->getFloat() + relativeTargetPose->x,
164 datafields.at(1)->getFloat() + relativeTargetPose->y,
167 relativeTargetPose->y,
168 relativeTargetPose->z,
169 in.getPositionalAccuracy(),
170 in.getOrientationalAccuracy());
176 Eigen::Vector2f currentPos(datafields.at(0)->getFloat(), datafields.at(1)->getFloat());
177 float yaw = datafields.at(2)->getFloat();
178 Eigen::Vector2f posError = currentPos -
target->toEigen().head(2);
179 float yawError = yaw -
target->z;
182 while (!isRunningTaskStopped())
191 out.setRemainingError(error);
200 waitForRunningTaskToFinish();