28 #include <RobotAPI/interface/components/TrajectoryPlayerInterface.h>
31 #include <VirtualRobot/CollisionDetection/CDManager.h>
32 #include <VirtualRobot/RobotNodeSet.h>
33 #include <VirtualRobot/TimeOptimalTrajectory/TimeOptimalTrajectory.h>
41 #include <MotionPlanning/CSpace/CSpacePath.h>
42 #include <MotionPlanning/CSpace/CSpaceSampled.h>
43 #include <MotionPlanning/Planner/BiRrt.h>
44 #include <MotionPlanning/PostProcessing/ShortcutProcessor.h>
47 using namespace MotionControlGroup;
50 CollisionFreeJointControl::SubClassRegistry
70 getContext<MotionControlGroupStatechartContext>();
71 std::set<std::string> jointNameSet;
72 if (!in.isSingleGoalConfigSet() && !in.isGoalConfigSet())
74 ARMARX_WARNING <<
"Either GoalConfig or SingleGoalConfig input parameter must be set!";
79 if (in.isSingleGoalConfigSet())
83 std::vector<StringValueMapPtr> goalConfig;
84 if (in.isGoalConfigSet())
86 goalConfig = in.getGoalConfig();
92 goalConfig.push_back(mapPtr);
96 for (
auto goalConfigMapPtr : goalConfig)
99 auto goalConfigMap = goalConfigMapPtr->toStdMap<
float>();
100 for (
auto pair : goalConfigMap)
102 if (jointNameSet.count(pair.first) != 0)
104 ARMARX_ERROR <<
"joint " << pair.first <<
" is used twice!";
108 jointNameSet.insert(pair.first);
112 float timeStep = in.getTimestep();
113 std::vector<TrajectoryPtr> solutions;
116 auto robot = context->
getRobotPool()->getRobot(in.getSafetyMargin());
128 if (!in.isCollisionSetNamesSet() && !in.isCollisionSetPairsSet())
130 throw LocalException()
131 <<
"You need to either specify CollisionSetNames or CollisionSetPairs!";
134 VirtualRobot::CDManagerPtr cdm(
new VirtualRobot::CDManager(robot->getCollisionChecker()));
137 auto rnsList = in.isCollisionSetNamesSet() ? in.getCollisionSetNames() : Ice::StringSeq();
138 for (
size_t i = 0; i < rnsList.size(); ++i)
140 auto rns1 = robot->getRobotNodeSet(rnsList.at(i));
142 cdm->addCollisionModel(rns1);
154 auto rnsPairList = in.getCollisionSetPairs();
155 for (
auto& subList : rnsPairList)
158 auto getRns = [&](
const std::string& name)
160 VirtualRobot::RobotNodeSetPtr rns;
161 if (robot->hasRobotNodeSet(name))
163 rns = robot->getRobotNodeSet(name);
167 if (robot->hasRobotNode(name))
169 auto node = robot->getRobotNode(name);
170 rns = VirtualRobot::RobotNodeSet::createRobotNodeSet(
171 robot, node->getName(), {node});
178 auto rns1 = getRns(subList->getVariant(0)->getString());
179 auto rns2 = getRns(subList->getVariant(1)->getString());
181 cdm->addCollisionModelPair(rns1, rns2);
184 for (
auto goalConfigMapPtr : goalConfig)
186 if (isRunningTaskStopped())
190 auto goalConfigMap = goalConfigMapPtr->toStdMap<
float>();
191 Ice::StringSeq jointNames =
getMapKeys(goalConfigMap);
194 auto rns = VirtualRobot::RobotNodeSet::createRobotNodeSet(
195 robot,
"tempset", jointNames, robot->getRootNode()->getName());
198 Saba::CSpaceSampledPtr cspace(
new Saba::CSpaceSampled(robot, cdm, rns, 1000000));
200 Saba::BiRrt rrt(cspace, Saba::Rrt::eExtend);
201 rrt.setPlanningTimeout(in.getTimeoutMs());
204 Eigen::VectorXf goalConfig(rns->getSize());
205 for (std::size_t i = 0; i < rns->getSize(); ++i)
207 goalConfig(i) = goalConfigMap.at(rns->getNode(i)->getName());
209 rrt.setStart(rns->getJointValuesEigen());
210 rrt.setGoal(goalConfig);
212 auto planningOk = rrt.plan();
214 Saba::CSpacePathPtr solutionOptimized;
218 auto solution = rrt.getSolution();
222 Saba::ShortcutProcessorPtr postProcessing(
223 new Saba::ShortcutProcessor(solution, cspace,
false));
224 solutionOptimized = postProcessing->shortenSolutionRandom(
225 in.getOptimizationSteps(), in.getOptimizationMaxStepSize());
231 emitPlanningFailed();
236 auto waypoints = solutionOptimized->getPoints();
237 ARMARX_INFO <<
"Waypoint Count: " << waypoints.size();
239 LimitlessStateSeq limitlessStates;
240 for (std::size_t i = 0; i < rns->getSize(); ++i)
242 auto node = rns->getNode(i);
243 limitlessStates.push_back(LimitlessState{
244 node->isLimitless(), node->getJointLimitLow(), node->getJointLimitHigh()});
246 waypointTraj->setDimensionNames(jointNames);
247 waypointTraj->setLimitless(limitlessStates);
249 for (
auto waypoint : waypoints)
251 for (std::size_t i = 0; i < rns->getSize(); ++i)
253 waypointTraj->setPositionEntry(t, i, waypoint(i));
259 Eigen::VectorXd maxVelocities =
260 Eigen::VectorXd::Constant(rns->getSize(), (
double)in.getMaxVelocity());
261 Eigen::VectorXd maxAcceleration =
262 Eigen::VectorXd::Constant(rns->getSize(), (
double)in.getMaxAcceleration());
263 if (in.isJointScaleSet())
265 auto scalingMap = in.getJointScale();
266 for (
size_t i = 0; i < rns->getSize(); ++i)
268 if (scalingMap.at(rns->getNode(i)->getName()) > 0)
270 auto scale = scalingMap.at(rns->getNode(i)->getName());
271 maxVelocities(i) *= scale;
272 maxAcceleration(i) *= scale;
277 waypointTraj->calculateTimeOptimalTrajectory(maxVelocities,
279 in.getMaxDeviation(),
280 IceUtil::Time::secondsDouble(timeStep));
282 solutions.push_back(newTraj);
285 Ice::StringSeq jointNames;
287 for (
auto& sol : solutions)
289 size_t dims = sol->dim();
290 Ice::DoubleSeq timestamps = sol->getTimestamps();
292 for (
size_t d = 0; d < dims; ++d)
294 combinedTraj->addPositionsToDimension(
295 fullTrajDim, sol->getDimensionData(d), timestamps);
296 jointNames.push_back(sol->getDimensionName(d));
300 combinedTraj->setDimensionNames(jointNames);
301 double duration = combinedTraj->getTimeLength();
302 auto rns = VirtualRobot::RobotNodeSet::createRobotNodeSet(
303 robot,
"tempset", jointNames, robot->getRootNode()->getName());
304 LimitlessStateSeq limitlessStates;
305 for (std::size_t i = 0; i < rns->getSize(); ++i)
307 auto node = rns->getNode(i);
308 limitlessStates.push_back(LimitlessState{
309 node->isLimitless(), node->getJointLimitLow(), node->getJointLimitHigh()});
311 combinedTraj->setLimitless(limitlessStates);
318 if (in.getUseTrajectoryPlayerComponent())
320 TrajectoryPlayerInterfacePrx trajPlayer =
321 context->
getProxy<TrajectoryPlayerInterfacePrx>(in.getTrajectoryPlayerName());
322 trajPlayer->resetTrajectoryPlayer(
false);
323 trajPlayer->considerConstraints(
false);
324 trajPlayer->setLoopPlayback(
false);
325 trajPlayer->loadJointTraj(combinedTraj);
326 trajPlayer->startTrajectoryPlayer();
327 auto endTime = trajPlayer->getEndTime();
328 double currentTime = 0;
332 <<
" endTime: " << endTime;
334 currentTime = trajPlayer->getCurrentTime();
335 }
while (currentTime < endTime && !isRunningTaskStopped());
336 if (!isRunningTaskStopped() && currentTime >= endTime)
338 if (in.getWaitTimeAfterExecution() > 0)
340 ARMARX_INFO <<
"Waiting for " << in.getWaitTimeAfterExecution();
343 trajPlayer->pauseTrajectoryPlayer();
346 else if (isRunningTaskStopped())
348 trajPlayer->pauseTrajectoryPlayer();
356 NameControlModeMap modes;
358 for (
auto& jointName : jointNames)
360 modes[jointName] = eVelocityControl;
364 while (!isRunningTaskStopped())
369 Eigen::VectorXf velocityTargets = ctrl.
update(timeStep, rns->getJointValuesEigen());
371 for (
auto& jointName : jointNames)
373 targetVelocities[jointName] = velocityTargets(i);
379 <<
" Duration: " << duration;
388 for (
auto& jointName : jointNames)
390 targetVelocities[jointName] = 0;
396 for (
auto goalConfigMapPtr : goalConfig)
398 auto goalConfigMap = goalConfigMapPtr->toStdMap<
float>();
400 for (
auto& pair : goalConfigMap)
402 errors[pair.first] = robot->getRobotNode(pair.first)->getJointValue();
413 if (in.getUseTrajectoryPlayerComponent())
416 getContext<MotionControlGroupStatechartContext>();
417 TrajectoryPlayerInterfacePrx trajPlayer =
418 context->
getProxy<TrajectoryPlayerInterfacePrx>(in.getTrajectoryPlayerName());
419 trajPlayer->stopTrajectoryPlayer();