25 #include <VirtualRobot/MathTools.h>
26 #include <VirtualRobot/Nodes/RobotNode.h>
27 #include <VirtualRobot/RobotNodeSet.h>
44 const SimoxCSpaceBasePtr& cSpacePlatformBase,
45 const MotionPlanningData& mpd,
46 const Ice::Current&
c)
48 TrajectoryPtr jointTrajectory = calculateJointTrajectory(cSpaceBase, mpd,
c);
49 TrajectoryPtr platformTrajectory = calculatePlatformTrajectory(cSpacePlatformBase, mpd,
c);
50 return {platformTrajectory, jointTrajectory, mpd.rnsToUse, mpd.endeffector, mpd.grasp};
55 const SimoxCSpaceBasePtr& cSpacePlatformBase,
56 const MotionPlanningData& mpd,
57 const Ice::Current&
c)
59 VectorXf startCfg, goalCfg, startPos, goalPos;
61 Eigen::Vector3f rpyAgent;
63 SimoxCSpacePtr cSpacePlatform = SimoxCSpacePtr::dynamicCast(cSpacePlatformBase);
64 prepareJointCSpace(cSpace, mpd, &startCfg, &goalCfg, &scaledJointCSpace);
65 preparePlatformCSpace(
66 cSpacePlatform, mpd, &startPos, &goalPos, &scaledPlatformCSpace, &rpyAgent);
67 ARMARX_INFO <<
"Starting BiRRT for Joints and Platform";
70 startBiRRT(scaledJointCSpace, startCfg, goalCfg, 0.01);
72 startBiRRT(scaledPlatformCSpace, startPos, goalPos, 0.1);
74 Path jointTrajectoryPath = finishBiRRT(rspJointHandle, scaledJointCSpace,
"Joint");
76 Path posTrajectoryPath = finishBiRRT(rspPlatformHandle, scaledPlatformCSpace,
"Platform");
79 auto transformToGlobal = [&](armarx::VectorXf& pos2D)
81 Eigen::Vector2f globalPos =
82 Eigen::Rotation2Df(rpyAgent(2)) * Eigen::Vector2f(pos2D.at(0), pos2D.at(1));
83 pos2D.at(0) = globalPos[0] + cSpacePlatform->getAgent().agentPose->position->x;
84 pos2D.at(1) = globalPos[1] + cSpacePlatform->getAgent().agentPose->position->y;
87 for (
auto& e : posTrajectoryPath.nodes)
92 jointTrajectory = cSpace->pathToTrajectory(jointTrajectoryPath);
93 platformTrajectory = cSpacePlatform->pathToTrajectory(posTrajectoryPath);
94 return {platformTrajectory, jointTrajectory, mpd.rnsToUse, mpd.endeffector, mpd.grasp};
102 maxPostProcessingSteps = 50;
108 getProxy(mps,
"MotionPlanningServer");
109 getProxy(robotStateComponent,
"RobotStateComponent");
111 VirtualRobot::RobotIO::eStructure);
117 planningTasks.clear();
134 const armarx::MotionPlanningData& mpd,
135 const Ice::Current&
c)
137 TrajectoryPtr trajectory = calculateJointTrajectory(cSpaceBase, mpd,
c);
138 return TrajectoryBasePtr::dynamicCast(trajectory);
143 const armarx::MotionPlanningData& mpd,
144 const Ice::Current&
c)
146 TrajectoryPtr trajectory = calculatePlatformTrajectory(cSpacePlatformBase, mpd,
c);
147 return TrajectoryBasePtr::dynamicCast(trajectory);
151 PlannedMotionProvider::calculateJointTrajectory(
const SimoxCSpaceBasePtr& cSpaceBase,
152 const MotionPlanningData& mpd,
153 const Ice::Current&
c)
159 prepareJointCSpace(cSpace, mpd, &startCfg, &goalCfg, &scaledJointCSpace);
161 startBiRRT(scaledJointCSpace, startCfg, goalCfg, 0.01);
162 Path jointTrajectoryPath = finishBiRRT(rspHandle, scaledJointCSpace,
"Joint");
163 return cSpace->pathToTrajectory(jointTrajectoryPath);
167 PlannedMotionProvider::calculatePlatformTrajectory(
const SimoxCSpaceBasePtr& cSpacePlatformBase,
168 const MotionPlanningData& mpd,
169 const Ice::Current&
c)
174 Eigen::Vector3f rpyAgent;
175 SimoxCSpacePtr cSpacePlatform = SimoxCSpacePtr::dynamicCast(cSpacePlatformBase);
176 preparePlatformCSpace(
177 cSpacePlatform, mpd, &startPos, &goalPos, &scaledPlatformCSpace, &rpyAgent);
179 RemoteHandle<MotionPlanningTaskControlInterfacePrx> rspHandle =
180 startBiRRT(scaledPlatformCSpace, startPos, goalPos, 0.1);
181 Path posTrajectoryPath = finishBiRRT(rspHandle, scaledPlatformCSpace,
"Platform");
183 auto transformToGlobal = [&](armarx::VectorXf& pos2D)
185 Eigen::Vector2f globalPos =
186 Eigen::Rotation2Df(rpyAgent(2)) * Eigen::Vector2f(pos2D.at(0), pos2D.at(1));
187 pos2D.at(0) = globalPos[0] + cSpacePlatform->getAgent().agentPose->position->x;
188 pos2D.at(1) = globalPos[1] + cSpacePlatform->getAgent().agentPose->position->y;
191 for (
auto& e : posTrajectoryPath.nodes)
193 transformToGlobal(e);
196 return cSpacePlatform->pathToTrajectory(posTrajectoryPath);
199 RemoteHandle<MotionPlanningTaskControlInterfacePrx>
201 const armarx::VectorXf startPos,
202 const armarx::VectorXf goalPos,
204 bool doRandomShortcutPostProcessing)
207 MotionPlanningTaskBasePtr taskRRT =
214 RemoteHandle<MotionPlanningTaskControlInterfacePrx> handle;
215 if (!doRandomShortcutPostProcessing)
217 handle = mps->enqueueTask(taskRRT);
221 handle = mps->enqueueTask(
223 "RRTSmoothing" + IceUtil::generateUUID(),
226 maxPostProcessingSteps));
228 planningTasks.push_back(handle);
233 PlannedMotionProvider::finishBiRRT(RemoteHandle<MotionPlanningTaskControlInterfacePrx> handle,
235 const std::string roboPart)
238 handle->waitForFinishedRunning();
240 << roboPart +
" trajectory planning took "
241 << IceUtil::Time::microSeconds(handle->getRunningTime()).toMilliSecondsDouble()
244 if (handle->getTaskStatus() == armarx::TaskStatus::ePlanningFailed)
246 throw RuntimeError(
" Motion Planning failed!");
250 << ((bool)(handle->getTaskStatus() == armarx::TaskStatus::ePlanningFailed)
253 ARMARX_INFO <<
"RRTConnectTask Planning status: " << handle->getTaskStatus();
255 auto posTrajectoryPath = handle->getPath();
257 scaledCSpace->unscalePath(posTrajectoryPath);
258 return posTrajectoryPath;
262 PlannedMotionProvider::preparePlatformCSpace(
SimoxCSpacePtr cSpacePlatform,
263 const MotionPlanningData& mpd,
264 VectorXf* storeStart,
267 Eigen::Vector3f* storeRpyAgent)
269 cSpacePlatform->setStationaryObjectMargin(
270 getProperty<float>(
"PlatformMotionSafetyMargin").
getValue());
273 Eigen::Vector3f rpy, rpyAgent;
274 VirtualRobot::MathTools::eigen4f2rpy(PosePtr::dynamicCast(mpd.globalPoseStart)->toEigen(),
276 VirtualRobot::MathTools::eigen4f2rpy(
277 PosePtr::dynamicCast(cSpacePlatform->getAgent().agentPose)->toEigen(), rpyAgent);
278 armarx::VectorXf startPos{
279 mpd.globalPoseStart->position->x - cSpacePlatform->getAgent().agentPose->position->x,
280 mpd.globalPoseStart->position->y - cSpacePlatform->getAgent().agentPose->position->y,
283 Eigen::Vector2f localStartPos =
284 Eigen::Rotation2Df(-rpyAgent(2)) * Eigen::Vector2f(startPos.at(0), startPos.at(1));
285 startPos.at(0) = localStartPos(0);
286 startPos.at(1) = localStartPos(1);
287 VirtualRobot::MathTools::eigen4f2rpy(PosePtr::dynamicCast(mpd.globalPoseGoal)->toEigen(),
289 armarx::VectorXf goalPos{
290 mpd.globalPoseGoal->position->x - cSpacePlatform->getAgent().agentPose->position->x,
291 mpd.globalPoseGoal->position->y - cSpacePlatform->getAgent().agentPose->position->y,
293 Eigen::Vector2f localGoalPos =
294 Eigen::Rotation2Df(-rpyAgent(2)) * Eigen::Vector2f(goalPos.at(0), goalPos.at(1));
295 goalPos.at(0) = localGoalPos(0);
296 goalPos.at(1) = localGoalPos(1);
300 ScaledCSpacePtr scaledPlatformCSpace =
new ScaledCSpace(cSpacePlatform, {0.001, 0.001, 1});
301 scaledPlatformCSpace->scaleConfig(startPos);
302 scaledPlatformCSpace->scaleConfig(goalPos);
303 *storeStart = startPos;
304 *storeGoal = goalPos;
305 *storeScaledCSpace = scaledPlatformCSpace;
306 *storeRpyAgent = rpyAgent;
311 const MotionPlanningData& mpd,
312 VectorXf* storeStart,
316 cSpace->setStationaryObjectMargin(getProperty<float>(
"JointMotionSafetyMargin").
getValue());
319 Ice::FloatSeq cSpaceScaling;
320 for (VirtualRobot::RobotNodePtr node :
321 localRobot->getRobotNodeSet(mpd.rnsToUse)->getAllRobotNodes())
323 cSpaceScaling.push_back(node->isTranslationalJoint() ? 0.001f : 1.0f);
326 <<
VAROUT(mpd.globalPoseGoal->output());
328 armarx::VectorXf startCfg = cSpace->jointMapToVector(mpd.configStart);
329 armarx::VectorXf goalCfg = cSpace->jointMapToVector(mpd.configGoal);
332 ScaledCSpacePtr scaledJointCSpace =
new ScaledCSpace(cSpace, cSpaceScaling);
333 scaledJointCSpace->scaleConfig(startCfg);
334 scaledJointCSpace->scaleConfig(goalCfg);
335 *storeStart = startCfg;
336 *storeGoal = goalCfg;
337 *storeScaledCSpace = scaledJointCSpace;