3 #include <VirtualRobot/Nodes/RobotNode.h>
4 #include <VirtualRobot/RobotNodeSet.h>
5 #include <VirtualRobot/math/Helpers.h>
18 #include <armarx/control/njoint_controller/platform/platform_follower_controller/aron/PlatformFollowerControllerConfig.aron.generated.h>
23 const std::string
NAME =
"PlatformFollowerController";
28 const armarx::NJointControllerConfigPtr& config,
32 ConfigPtrT cfg = ConfigPtrT::dynamicCast(config);
41 armarx::ControlModes::HolonomicPlatformVelocity)
44 <<
"The actuator " << robotUnit->getRobotPlatformName() <<
" has no control mode "
45 << armarx::ControlModes::HolonomicPlatformVelocity;
47 const Config configData = ::armarx::fromAron<arondto::Config, Config>(cfg->config);
53 const VirtualRobot::RobotNodeSetPtr rnsRight =
54 robot->getRobotNodeSet(configData.
params.nodeSetNameRight);
56 const VirtualRobot::RobotNodeSetPtr rnsLeft =
57 robot->getRobotNodeSet(configData.
params.nodeSetNameLeft);
59 tcpRight = rnsRight->getTCP();
60 tcpLeft = rnsLeft->getTCP();
74 stateBuffer.
getWriteBuffer().handPositionRight = tcpRight->getPositionInRootFrame();
75 stateBuffer.
getWriteBuffer().handPositionLeft = tcpLeft->getPositionInRootFrame();
96 const Ice::Current& iceCurrent)
102 auto updateConfig = ::armarx::fromAron<arondto::Config, Config>(dto);
109 if (not rtReady.load())
125 const double deltaT = (state.time - additionalTaskData.lastTime).toSecondsDouble();
126 additionalTaskData.lastTime = state.time;
131 const Eigen::Vector3f currentVel = state.currentVel;
132 const Eigen::Vector3f currentPositionRight = state.handPositionRight;
133 const Eigen::Vector3f currentPositionLeft = state.handPositionLeft;
134 const Eigen::Vector3f positionDeltaRight =
136 const Eigen::Vector3f positionDeltaLeft =
139 Eigen::Vector2f positionDelta = ((positionDeltaLeft + positionDeltaRight) / 2).head<2>();
140 Eigen::Vector2f velocity = Eigen::Vector2f::Zero();
141 if (positionDelta.norm() >= params.minPosTolerance)
144 positionDelta - params.minPosTolerance * positionDelta / positionDelta.norm();
145 velocity = positionDelta * params.kPos - currentVel.head<2>() * params.dPos;
147 const float Tstar = 1 / ((params.filterTimeConstant / deltaT) + 1);
148 additionalTaskData.filteredLinearVel =
149 Tstar * (velocity - additionalTaskData.filteredLinearVel) +
150 additionalTaskData.filteredLinearVel;
153 additionalTaskData.filteredLinearVel(0) = 0;
157 additionalTaskData.filteredLinearVel(1) = 0;
159 velocity = additionalTaskData.filteredLinearVel.norm() > params.maxPosVel
160 ? additionalTaskData.filteredLinearVel.normalized() * params.maxPosVel
161 : additionalTaskData.filteredLinearVel;
164 const Eigen::Vector3f currentDirection = state.direction();
165 const float cosAlpha = currentDirection.dot(initialState.
direction());
166 const Eigen::Vector3f directionDiff = currentDirection - initialState.
direction();
168 if (directionDiff(1) < 0)
170 alpha = -acos(cosAlpha);
174 alpha = acos(cosAlpha);
176 float angularVelocity;
177 if (fabs(alpha) < params.minAngleTolerance)
185 alpha -= params.minAngleTolerance;
189 alpha += params.minAngleTolerance;
191 angularVelocity = params.kAngle * alpha - params.dAngle * currentVel.z();
193 additionalTaskData.filteredAngularVel =
194 Tstar * (angularVelocity - additionalTaskData.filteredAngularVel) +
195 additionalTaskData.filteredAngularVel;
198 additionalTaskData.filteredAngularVel = 0;
200 angularVelocity =
std::min(additionalTaskData.filteredAngularVel, params.maxAngleVel);
206 onPublishData.target.platformVelocityTargets.x = velocity.x();
207 onPublishData.target.platformVelocityTargets.y = velocity.y();
208 onPublishData.target.platformVelocityTargets.yaw = angularVelocity;
210 onPublishData.position_error_left = positionDeltaLeft;
211 onPublishData.position_error_right = positionDeltaRight;
245 debugObservers->setDebugChannel(
NAME, datafields);
261 armarx::eManagedIceObjectStarted);
262 ARMARX_IMPORTANT <<
"Create a new thread alone PlatformTrajectory controller";
263 while (
getState() == armarx::eManagedIceObjectStarted)
270 c.waitForCycleDuration();
274 ARMARX_INFO <<
"PlatformTrajectoryVelocityController::onInitNJointController";