15 #ifndef NAV2_CONSTRAINED_SMOOTHER__UTILS_HPP_
16 #define NAV2_CONSTRAINED_SMOOTHER__UTILS_HPP_
21 #define EPSILON 0.0001
27 #if defined(USE_OLD_CERES_API)
28 #define CERES_ISINF(x) ceres::IsInfinite(x)
30 #define CERES_ISINF(x) ceres::isinf(x)
33 namespace nav2_constrained_smoother
45 inline Eigen::Matrix<T, 2, 1> arcCenter(
46 Eigen::Matrix<T, 2, 1> pt_prev,
47 Eigen::Matrix<T, 2, 1> pt,
48 Eigen::Matrix<T, 2, 1> pt_next,
51 Eigen::Matrix<T, 2, 1> d1 = pt - pt_prev;
52 Eigen::Matrix<T, 2, 1> d2 = pt_next - pt;
59 T det = d1[0] * d2[1] - d1[1] * d2[0];
60 if (ceres::abs(det) < (T)1e-4) {
61 return Eigen::Matrix<T, 2, 1>(
62 (T)std::numeric_limits<double>::infinity(), (T)std::numeric_limits<double>::infinity());
69 Eigen::Matrix<T, 2, 1> mid1 = (pt_prev + pt) / (T)2;
70 Eigen::Matrix<T, 2, 1> mid2 = (pt + pt_next) / (T)2;
71 Eigen::Matrix<T, 2, 1> n1(-d1[1], d1[0]);
72 Eigen::Matrix<T, 2, 1> n2(-d2[1], d2[0]);
73 T det1 = (mid1[0] + n1[0]) * mid1[1] - (mid1[1] + n1[1]) * mid1[0];
74 T det2 = (mid2[0] + n2[0]) * mid2[1] - (mid2[1] + n2[1]) * mid2[0];
75 Eigen::Matrix<T, 2, 1> center((det1 * n2[0] - det2 * n1[0]) / det,
76 (det1 * n2[1] - det2 * n1[1]) / det);
92 inline Eigen::Matrix<T, 2, 1> tangentDir(
93 Eigen::Matrix<T, 2, 1> pt_prev,
94 Eigen::Matrix<T, 2, 1> pt,
95 Eigen::Matrix<T, 2, 1> pt_next,
98 Eigen::Matrix<T, 2, 1> center = arcCenter(pt_prev, pt, pt_next, is_cusp);
99 if (CERES_ISINF(center[0])) {
100 Eigen::Matrix<T, 2, 1> d1 = pt - pt_prev;
101 Eigen::Matrix<T, 2, 1> d2 = pt_next - pt;
108 Eigen::Matrix<T, 2, 1> result(pt_next[0] - pt_prev[0], pt_next[1] - pt_prev[1]);
109 if (result[0] == 0.0 && result[1] == 0.0) {
110 return Eigen::Matrix<T, 2, 1>(d1[1], -d1[0]);
117 return Eigen::Matrix<T, 2, 1>(center[1] - pt[1], pt[0] - center[0]);