27 #include "../../util/PlanningUtil.h"
32 const VectorXf& startCfg,
33 const VectorXf& goalCfg,
34 const std::string& taskName,
39 this->cspace = cspace;
40 this->startCfg = startCfg;
41 this->goalCfg = goalCfg;
42 this->dcdStep = dcdStep;
43 this->maximalPlanningTimeInSeconds = maximalPlanningTimeInSeconds;
44 this->workerCount = workerCount;
45 this->taskName = taskName;
51 std::lock_guard<std::mutex> lock{
mtx};
61 std::lock_guard<std::mutex> lock{
mtx};
68 std::lock_guard<std::mutex> lock{
mtx};
74 Task::run(
const RemoteObjectNodePrxList& remoteNodes,
const Ice::Current&)
79 [](
const RemoteObjectNodeInterfacePrx& n)
84 const std::string topicName =
"RRTConnectUpdateTopic:" +
getProxy()->ice_getIdentity().name;
87 const auto startIsCollisionFree =
88 cspace->isCollisionFree(std::pair<const Ice::Float*, const Ice::Float*>{
89 startCfg.data(), startCfg.data() + startCfg.size()});
90 if (!startIsCollisionFree)
94 <<
" trivially failed! start cfg in collision. start:\n"
99 const auto goalIscollisionFree =
100 cspace->isCollisionFree(std::pair<const Ice::Float*, const Ice::Float*>{
101 goalCfg.data(), goalCfg.data() + goalCfg.size()});
102 if (!goalIscollisionFree)
106 <<
" trivially failed! goal cfg in collision. goal:\n"
111 if (
euclideanDistance(startCfg.begin(), startCfg.end(), goalCfg.begin()) <= dcdStep)
113 solution.nodes.emplace_back(startCfg);
114 solution.nodes.emplace_back(goalCfg);
115 solution.pathName = taskName +
"_trivialPath_" + ice_staticId();
117 <<
"MotionPlanningTask " << taskName
118 <<
" trivially succeeded! (start and goal less than dcd step size apart!)";
124 std::unique_lock<std::mutex> lock{
mtx};
125 std::vector<RemoteHandle<WorkerNodeBasePrx>> workers;
126 WorkerNodeBasePrxList workerProxies;
128 workers.reserve(workerCount);
129 auto workerToStart = workerCount;
130 const auto taskName =
getProxy()->ice_getIdentity().name;
131 for (
auto& ron : remoteNodes)
133 auto maxWorkerForNode = ron->getNumberOfCores();
134 for (
Ice::Long i = 0; i < maxWorkerForNode && workerToStart; ++i)
136 WorkerNodeBasePtr worker{
new WorkerNode{cspace->clone(),
140 TaskBasePrx::uncheckedCast(
getProxy()),
145 taskName,
"RRTConnectWorker:" +
to_string(workers.size()));
146 workers.emplace_back(ron->registerRemoteHandledObject(workerName, worker));
147 workerProxies.emplace_back(*(workers.back()));
157 for (
auto& w : workers)
159 w->setWorkerNodes(workerProxies);
164 std::chrono::system_clock::now() + std::chrono::seconds{maximalPlanningTimeInSeconds};
168 doneCV.wait_for(lock, std::chrono::milliseconds{10});
169 if (endTime < std::chrono::system_clock::now())
184 for (
auto& w : workers)
188 doneCV.wait_for(lock, std::chrono::milliseconds{10});
195 std::lock_guard<std::mutex> lock{
mtx};
197 solution.pathName = taskName +
"_path_" + ice_staticId();
206 cspace->initCollisionTest();