26 #include <SimoxUtility/algorithm/string/string_tools.h>
32 #include "../../util/CollisionCheckUtil.h"
33 #include "../../util/Metrics.h"
34 #include <MotionPlanning/CSpace/CSpacePath.h>
35 #include <MotionPlanning/CSpace/CSpaceSampled.h>
36 #include <MotionPlanning/Planner/BiRrt.h>
37 #include <MotionPlanning/PostProcessing/ShortcutProcessor.h>
43 const VectorXf& startCfg,
44 const VectorXf& goalCfg,
45 const std::string& taskName,
49 this->cspace = cspace->clone();
50 this->startCfg = startCfg;
51 this->goalCfg = goalCfg;
52 this->dcdStep = dcdStep;
53 this->maximalPlanningTimeInSeconds = maximalPlanningTimeInSeconds;
54 this->taskName = taskName;
56 if (startCfg.size() != goalCfg.size() ||
57 startCfg.size() !=
static_cast<std::size_t
>(this->cspace->getDimensionality()))
59 throw std::invalid_argument{
60 "start and goal have to be the size of the cspace's dimensionality"};
72 std::lock_guard<std::mutex> lock{
mtx};
77 Task::run(
const RemoteObjectNodePrxList&, const ::Ice::Current&)
80 auto failureOutput = [
this]
86 for (
auto set : origCSpace->getCD().getSceneObjectSets())
88 if (origCSpace->getCD().isInCollision(
set))
90 std::string name =
set->getName();
95 for (
auto e :
set->getSceneObjects())
97 names.push_back(e->getName());
102 names.push_back(name);
105 ss <<
"scene object set consisting of " << simox::alg::join(
names,
", ")
106 <<
" is in collision\n";
116 cspace->initCollisionTest();
118 const auto startIsCollisionFree =
119 cspace->isCollisionFree(std::pair<const Ice::Float*, const Ice::Float*>{
120 startCfg.data(), startCfg.data() + startCfg.size()});
121 if (!startIsCollisionFree)
123 ARMARX_WARNING <<
"BiRRT failed trivially: start config is in collision: " << startCfg
130 const auto goalIscollisionFree =
131 cspace->isCollisionFree(std::pair<const Ice::Float*, const Ice::Float*>{
132 goalCfg.data(), goalCfg.data() + goalCfg.size()});
133 if (!goalIscollisionFree)
135 ARMARX_WARNING <<
"BiRRT failed trivially: goal config is in collision" << goalCfg
145 << origCSpace->getAgentSceneObj()->getConfig()->getRobotNodeJointValueMap();
151 ARMARX_INFO <<
"BiRRT took : " << (IceUtil::Time::now() - start).toMilliSecondsDouble()
159 scaledCSpace->unscaleConfig(startCfg);
160 scaledCSpace->unscaleConfig(goalCfg);
161 sampledcSpace->setMetricWeights(
162 Eigen::Map<Eigen::VectorXf>(scaledCSpace->getScalingFactors().data(),
163 scaledCSpace->getScalingFactors().size()));
167 const auto distStartEnd =
170 if (distStartEnd <= dcdStep)
173 solution.nodes.emplace_back(startCfg);
174 solution.nodes.emplace_back(goalCfg);
179 Saba::Rrt::RrtMethod mode;
180 mode = Saba::Rrt::eExtend;
182 ARMARX_INFO <<
"CSpace type : " << cspace->ice_id();
188 sampledcSpace->setSamplingSizeDCD(dcdStep);
189 ARMARX_INFO <<
"SamplingSizeDCD: " << sampledcSpace->getSamplingSizeDCD();
190 Saba::BiRrtPtr rrt(
new Saba::BiRrt(sampledcSpace, mode ));
193 rrt->setStart(Eigen::Map<Eigen::ArrayXf>(startCfg.data(), startCfg.size()));
194 rrt->setGoal(Eigen::Map<Eigen::ArrayXf>(goalCfg.data(), goalCfg.size()));
196 bool planningSucceeded = rrt->plan();
197 if (planningSucceeded)
200 Saba::CSpacePathPtr tmpSolution = rrt->getSolution();
201 ARMARX_INFO <<
"waypoints: " << tmpSolution->getPoints().size();
206 Saba::ShortcutProcessor shortcutter(tmpSolution, sampledcSpace);
207 tmpSolution = shortcutter.shortenSolutionRandom(100, 200);
208 ARMARX_INFO <<
"Shortcutting resulted into " << tmpSolution->getPoints().size();
210 for (
auto& vec : tmpSolution->getPoints())
212 this->
solution.nodes.push_back(VectorXf{vec.data(), vec.data() + vec.rows()});
256 if (cspace->ice_isA(CSpaceAdaptorBase::ice_staticId()))
258 origCSpace = SimoxCSpacePtr::dynamicCast(
265 origCSpace = SimoxCSpacePtr::dynamicCast(cspace);