28#include <ceres/ceres.h>
30#if CERES_VERSION_MAJOR >= 2 && CERES_VERSION_MINOR >= 1
31# include <ceres/manifold.h>
33# define SET_CONSTRAINT(problem, param, constraint) \
34 (problem).SetManifold((param), (constraint))
36# include <ceres/local_parameterization.h>
38# define SET_CONSTRAINT(problem, param, constraint) \
39 (problem).SetParameterization((param), (constraint))
51 return std::atan2(std::sin(a), std::cos(a));
54 static void normalizeTrajectoryAngles(std::vector<CenterPoint>& traj)
70 const T*
const c_next,
73 residual[0] =
T(
w) * (c_prev[0] -
T(2.0) * c_i[0] + c_next[0]);
74 residual[1] =
T(
w) * (c_prev[1] -
T(2.0) * c_i[1] + c_next[1]);
101 wrapper_(&node[0], &node[1], &d_raw);
103 if (!ceres::isfinite(d_raw))
105 residual[0] =
T(
w_) *
T(100.0);
113 residual[0] =
T(0.0);
115 else if (obs_dist <
T(0.0))
117 T penetration = -obs_dist;
119 if (penetration > max_pen)
120 penetration = max_pen;
122 residual[0] =
T(
w_) * (ceres::exp(
T(2.0) * ratio) -
T(1.0) +
T(0.1) * ratio);
150 template <
typename T>
151 bool operator()(
const T*
const c_i,
const T*
const c_ip1,
T* residual)
const
153 T mx = (c_i[0] + c_ip1[0]) /
T(2.0);
154 T my = (c_i[1] + c_ip1[1]) /
T(2.0);
159 if (!ceres::isfinite(d_raw))
161 residual[0] =
T(
w_) *
T(100.0);
169 residual[0] =
T(0.0);
171 else if (obs_dist <
T(0.0))
173 T penetration = -obs_dist;
175 if (penetration > max_pen)
176 penetration = max_pen;
178 residual[0] =
T(
w_) * (ceres::exp(
T(2.0) * ratio) -
T(1.0) +
T(0.1) * ratio);
210 template <
typename T>
211 bool operator()(
const T*
const c_i,
const T*
const c_ip1,
T* residual)
const
213 T sx = (
T(1.0) -
T(
t_)) * c_i[0] +
T(
t_) * c_ip1[0];
214 T sy = (
T(1.0) -
T(
t_)) * c_i[1] +
T(
t_) * c_ip1[1];
219 if (!ceres::isfinite(d_raw))
221 residual[0] =
T(
w_) *
T(100.0);
229 residual[0] =
T(0.0);
231 else if (obs_dist <
T(0.0))
233 T penetration = -obs_dist;
235 if (penetration > max_pen)
236 penetration = max_pen;
238 residual[0] =
T(
w_) * (ceres::exp(
T(2.0) * ratio) -
T(1.0) +
T(0.1) * ratio);
270 double max_deviation,
282 template <
typename T>
285 T dx = c_i[0] -
T(
xr_);
286 T dy = c_i[1] -
T(
yr_);
287 T d = ceres::sqrt(dx * dx + dy * dy +
T(1e-6));
321 template <
typename T>
324 residual[0] =
T(
w_) * (c_i[0] -
T(
xr_));
325 residual[1] =
T(
w_) * (c_i[1] -
T(
yr_));
340 template <
typename T>
341 bool operator()(
const T*
const c_i,
const T*
const c_ip1,
T* residual)
const
343 T dx = c_ip1[0] - c_i[0];
344 T dy = c_ip1[1] - c_i[1];
345 T dist_sq = dx * dx + dy * dy;
347 residual[0] =
T(
w) * (dist_sq - target_sq);
360 return std::hypot(b.
x - a.x, b.
y - a.y);
363 static double computeAverageSpacing(
const std::vector<CenterPoint>& traj)
368 for (
size_t i = 0; i + 1 < traj.size(); ++i)
369 sum += segment_length(traj[i], traj[i + 1]);
370 return sum / double(traj.size() - 1);
Differentiable wrapper around the standard 2-D distance-to-obstacle costmap.
This file is part of ArmarX.
double normalizeAngle(double a)
This file offers overloads of toIce() and fromIce() functions for STL container types.
ceres::SubsetParameterization SubsetConstraint
This file is part of ArmarX.
BoundedTrackingResidual(double xr, double yr, double deadzone, double max_deviation, double w_in_bounds, double w_hard)
bool operator()(const T *const c_i, T *residual) const
MidpointObstacleResidual2D(const Costmap2DWrapper &wrapper, double weight, double max_dist, double clearance)
const Costmap2DWrapper & wrapper_
bool operator()(const T *const c_i, const T *const c_ip1, T *residual) const
const Costmap2DWrapper & wrapper_
bool operator()(const T *const node, T *residual) const
ObstacleResidual2D(const Costmap2DWrapper &wrapper, double weight, double max_dist, double clearance)
bool operator()(const T *const c_prev, const T *const c_i, const T *const c_next, T *residual) const
PositionSmoothResidual(double weight=1.0)
const Costmap2DWrapper & wrapper_
bool operator()(const T *const c_i, const T *const c_ip1, T *residual) const
SegmentObstacleResidual2D(const Costmap2DWrapper &wrapper, double weight, double max_dist, double clearance, double t)
SoftTrackingResidual(double xr, double yr, double weight)
bool operator()(const T *const c_i, T *residual) const
SpacingResidual(double d_avg, double weight)
bool operator()(const T *const c_i, const T *const c_ip1, T *residual) const