13 #include "../include/LBFGS/LBFGS.h" 36 double rho(Eigen::Vector2d xy);
39 Eigen::Vector2d
grho(Eigen::Vector2d xy);
42 double energyFunc(
const Eigen::VectorXd& x, Eigen::VectorXd& grad);
59 for (
int i = 0; i < binary_mat.rows; i++)
61 for (
int j = 0; j < binary_mat.cols; j++)
63 binary_mat.ptr<
uchar>(i)[j] = 0;
64 if (map_mat.ptr<cv::Vec3b>(i)[j][1] == 255)
65 binary_mat.ptr<
uchar>(i)[j] = 255;
68 cv::threshold(binary_mat, binary_mat, 0, 255, cv::THRESH_BINARY);
69 cv::distanceTransform(binary_mat,
dist, CV_DIST_L2, 3);
70 cv::normalize(
dist,
dist, 0, 1., cv::NORM_MINMAX);
93 float d =
dist.ptr<
float>(r)[c];
101 cv::Point p((
int)
round(xy.x()), (
int)
round(xy.y()));
111 cv::Point p((
int)
round(xy.x()), (
int)
round(xy.y()));
113 return Eigen::Vector2d(0, 0);
121 double rho(Eigen::Vector2d xy)
127 Eigen::Vector2d
grho(Eigen::Vector2d xy)
133 double energyFunc(
const Eigen::VectorXd& x, Eigen::VectorXd& grad)
137 const int n = x.size();
140 for (
int i = 0; i < n - 4; i += 2)
142 Eigen::Vector2d mid((x[i] + x[i + 2]) / 2, (x[i + 1] + x[i + 3]) / 2);
145 pow((x[i] - x[i + 2]), 2)
147 pow((x[i + 1] - x[i + 3]), 2)
162 for (
int i = 2; i < n - 2; i += 2)
164 Eigen::Vector2d xy_i(x[i], x[i + 1]);
166 Eigen::Vector2d xy_n(x[i + 2], x[i + 3]);
167 Eigen::Vector2d mid_n = (xy_i + xy_n) / 2;
168 Eigen::Vector2d g_mid_n =
grho(mid_n);
170 Eigen::Vector2d xy_l(x[i - 2], x[i - 1]);
171 Eigen::Vector2d mid_l = (xy_i + xy_l) / 2;
172 Eigen::Vector2d g_mid_l =
grho(mid_l);
174 3 *
rho(mid_n) * g_mid_n.x() * (
pow(x[i] - x[i + 2], 2) +
pow(x[i + 1] - x[i + 3], 2)) +
pow(
rho(mid_n), 2) * 2 * (x[i] - x[i + 2])
176 3 *
rho(mid_l) * g_mid_l.x() * (
pow(x[i] - x[i - 2], 2) +
pow(x[i + 1] - x[i - 1], 2)) +
pow(
rho(mid_l), 2) * 2 * (x[i] - x[i - 2]);
179 3 *
rho(mid_n) * g_mid_n.y() * (
pow(x[i] - x[i + 2], 2) +
pow(x[i + 1] - x[i + 3], 2)) +
pow(
rho(mid_n), 2) * 2 * (x[i + 1] - x[i + 3])
181 3 *
rho(mid_l) * g_mid_l.y() * (
pow(x[i] - x[i - 2], 2) +
pow(x[i + 1] - x[i - 1], 2)) +
pow(
rho(mid_l), 2) * 2 * (x[i + 1] - x[i - 1]);
197 cv::Point beg(cc, cr);
198 cv::Point end(lc, lr);
200 bool occlusion =
false;
201 int dx = end.x - beg.x;
202 int dy = end.y - beg.y;
207 for (
int y = beg.y; y <= end.y; y++)
218 for (
int y = beg.y; y >= end.y; y--)
232 for (
int x = beg.x; x <= end.x; x++)
243 for (
int x = beg.x; x >= end.x; x--)
253 else if (dx == 0 && dy == 0){}
257 double fXUnitLen = 1.0;
258 double fYUnitLen = 1.0;
259 fYUnitLen = (double)(dy) / (double)(MaxStep);
260 fXUnitLen = (double)(dx) / (double)(MaxStep);
261 double x = (double)(beg.x);
262 double y = (double)(beg.y);
264 for (
long i = 1; i < MaxStep; i++)
268 int crt_r = (int)
round(y);
269 int crt_c = (int)
round(x);
286 const int n = path.size() * 2;
292 Eigen::VectorXd x = Eigen::VectorXd::Zero(n);
295 for (
int nid = 0; nid < path.size(); nid++)
297 x[nid * 2] = path[nid].translation().x();
298 x[nid * 2 + 1] = -path[nid].translation().y();
299 if (fabs(path[nid].rotation().angle() - 0.0) > 0.01)
340 for (
int nid = 0; nid < path.size(); nid++)
342 int cr = (int)
round(x[nid * 2 + 1]);
343 int cc = (int)
round(x[nid * 2]);
348 if (nid > 0)
if (
crossObstacles(p_de, cr, cc, lr, lc))
return false;
352 for (
int nid = 0; nid < path.size(); nid++)
354 path[nid].translation().x() = x[nid * 2];
355 path[nid].translation().y() = -x[nid * 2 + 1];
EIGEN_STRONG_INLINE EIGEN_DEVICE_FUNC half pow(const half &a, const half &b)
bool param(const std::string ¶m_name, T ¶m_val, const T &default_val)
Eigen::Vector2d fieldGradient(Eigen::Vector2d xy)
bool Optimize_Path(DataEngine *p_de, vector< iro::SE2 > &path)
int minimize(Foo &f, Vector &x, Scalar &fx)
float getValueDist(int r, int c)
double distanceField[map_rows][map_cols]
void initDistanceField(DataEngine *p_de)
double rho(Eigen::Vector2d xy)
vector< int > fixed_variabe_indexes
EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE const AbsReturnType abs() const
double getValueDistanceField(int r, int c)
double fieldIntensity(Eigen::Vector2d xy)
vector< int > fixed_node_indexes
double energyFunc(const Eigen::VectorXd &x, Eigen::VectorXd &grad)
Eigen::Vector2d grho(Eigen::Vector2d xy)
bool crossObstacles(DataEngine *p_de, int cr, int cc, int lr, int lc)
EIGEN_DEVICE_FUNC const RoundReturnType round() const