45 template <
class RealType,
class CollisionChecker,
class ConfigType>
50 CollisionChecker isCollisionFree)
54 const auto size =
static_cast<long int>(from.size());
56 Eigen::Map<const EigenVector> eFrom{from.data(), size};
57 Eigen::Map<const EigenVector> eTo{to.data(), size};
59 EigenVector step = eTo - eFrom;
60 const auto length = step.norm();
61 step *= dcdStepSize / length;
67 const std::size_t stepsToTake =
static_cast<std::size_t
>(length / dcdStepSize);
69 ConfigType stepToCheck(from);
71 Eigen::Map<EigenVector> eStepToCheck{stepToCheck.data(), size};
72 std::size_t stepsTaken = 0;
74 for (; stepsTaken < stepsToTake; ++stepsTaken)
78 if (!isCollisionFree(stepToCheck))
95 if (isCollisionFree(to))
117 class CollisionChecker,
119 class Distance = std::function<
float(Eigen::VectorXf, Eigen::VectorXf)>,
120 class Interpolate = std::function<Eigen::VectorXf(Eigen::VectorXf, Eigen::VectorXf,
float)>>
123 const ConfigType& from,
124 const ConfigType& to,
125 RealType dcdStepSize,
126 CollisionChecker isCollisionFree,
127 bool toIsCollisionFree =
true,
128 const std::optional<Distance>& distanceLambda = std::optional<Distance>(),
129 const std::optional<Interpolate>& interpolationLambda = std::optional<Interpolate>(),
130 std::vector<ConfigType>* resultPath = NULL)
132 if (!(toIsCollisionFree || isCollisionFree(to)))
139 const auto size =
static_cast<long int>(from.size());
141 Eigen::Map<const EigenVector> eFrom{from.data(), size};
142 Eigen::Map<const EigenVector> eTo{to.data(), size};
143 EigenVector connecting = eTo - eFrom;
144 std::vector<float> tmp(size);
145 Eigen::Map<EigenVector> eTmp{tmp.data(), size};
146 float distanceFromTo;
149 distanceFromTo = (*distanceLambda)(eFrom, eTo);
153 distanceFromTo = connecting.norm();
157 if (distanceFromTo <= dcdStepSize)
161 resultPath->push_back(to);
167 float dcdAsDistanceFactor = dcdStepSize / distanceFromTo;
169 float checkedStepFactor;
170 float betweenStepFactor;
171 std::size_t stepsToCheck = 1;
175 betweenStepFactor = 1.f / stepsToCheck;
176 checkedStepFactor = betweenStepFactor / 2.f;
178 float factor = checkedStepFactor;
180 for (std::size_t step = 0; step < stepsToCheck; ++step, factor += betweenStepFactor)
182 if (interpolationLambda)
184 eTmp = (*interpolationLambda)(eFrom, eTo, factor);
188 eTmp = eFrom + factor * connecting;
190 if (!isCollisionFree(tmp))
197 resultPath->push_back(tmp);
200 stepsToCheck = stepsToCheck << 1;
201 }
while (checkedStepFactor > dcdAsDistanceFactor);