42 #include <Eigen/Geometry>
53 using StateValidatorFn = std::function<double(
const Eigen::VectorXd& state_positions)>;
77 CostFn cost_fn = [=](
const Eigen::MatrixXd& values, Eigen::VectorXd& costs,
bool& validity) {
78 costs.setZero(values.cols());
81 std::vector<std::pair<long, long>> invalid_windows;
82 bool in_invalid_window =
false;
89 for (
int timestep = 0; timestep < values.cols() - 1; ++timestep)
91 Eigen::VectorXd current = values.col(timestep);
92 Eigen::VectorXd next = values.col(timestep + 1);
93 const double segment_distance = (next - current).norm();
94 double interpolation_fraction = 0.0;
95 const double interpolation_step = std::min(0.5, interpolation_step_size / segment_distance);
96 bool found_invalid_state =
false;
98 while (!found_invalid_state && interpolation_fraction < 1.0)
100 Eigen::VectorXd sample_vec = (1 - interpolation_fraction) * current + interpolation_fraction * next;
102 penalty = state_validator_fn(sample_vec);
103 found_invalid_state = penalty > 0.0;
104 interpolation_fraction += interpolation_step;
107 if (found_invalid_state)
110 costs(timestep) = (1 - interpolation_fraction) * penalty;
111 costs(timestep + 1) = interpolation_fraction * penalty;
115 if (!in_invalid_window)
117 invalid_windows.emplace_back(timestep, values.cols());
118 in_invalid_window =
true;
124 if (in_invalid_window)
126 invalid_windows.back().second = timestep - 1;
127 in_invalid_window =
false;
135 for (
const auto& [start, end] : invalid_windows)
137 const double window_size =
static_cast<double>(end - start) + 1;
138 const double sigma = window_size / 5.0;
139 const double mu = 0.5 * (start + end);
143 for (
auto j = std::max(0l, start -
static_cast<long>(sigma));
144 j <= std::min(values.cols() - 1, end +
static_cast<long>(sigma)); ++j)
147 std::exp(-std::pow(j - mu, 2) / (2 * std::pow(sigma, 2))) / (sigma * std::sqrt(2 * mu)) * window_size;
171 const auto& joints =
group ?
group->getActiveJointModels() :
planning_scene->getRobotModel()->getActiveJointModels();
172 const auto& group_name =
group ?
group->getName() :
"";
174 StateValidatorFn collision_validator_fn = [=](
const Eigen::VectorXd& positions) {
181 return planning_scene->isStateColliding(state, group_name) ? collision_penalty : 0.0;
201 const moveit_msgs::msg::Constraints& constraints_msg,
double cost_scale)
203 const auto& joints =
group ?
group->getActiveJointModels() :
planning_scene->getRobotModel()->getActiveJointModels();
208 StateValidatorFn constraints_validator_fn = [=](
const Eigen::VectorXd& positions) {
230 return [=](
const Eigen::MatrixXd& values, Eigen::VectorXd& overall_costs,
bool& overall_validity) {
231 overall_validity =
true;
232 overall_costs.setZero(values.cols());
234 auto costs = overall_costs;
235 for (
const auto& cost_fn : cost_functions)
238 cost_fn(values, costs, valid);
241 overall_validity = overall_validity && valid;
242 overall_costs += costs;
A class that contains many different constraints, and can check RobotState *versus the full set....
bool add(const moveit_msgs::msg::Constraints &c, const moveit::core::Transforms &tf)
Add all known constraints.
ConstraintEvaluationResult decide(const moveit::core::RobotState &state, bool verbose=false) const
Determines whether all constraints are satisfied by state, returning a single evaluation result.
Representation of a robot's state. This includes position, velocity, acceleration and effort.
void update(bool force=false)
Update all transforms.
Helper functions for converting between MoveIt types and plain Eigen types.
This namespace includes the central class for representing planning contexts.
CostFn getCostFunctionFromStateValidator(const StateValidatorFn &state_validator_fn, double interpolation_step_size)
CostFn getConstraintsCostFunction(const std::shared_ptr< const planning_scene::PlanningScene > &planning_scene, const moveit::core::JointModelGroup *group, const moveit_msgs::msg::Constraints &constraints_msg, double cost_scale)
constexpr double COL_CHECK_DISTANCE
CostFn sum(const std::vector< CostFn > &cost_functions)
constexpr double CONSTRAINT_CHECK_DISTANCE
CostFn getCollisionCostFunction(const std::shared_ptr< const planning_scene::PlanningScene > &planning_scene, const moveit::core::JointModelGroup *group, double collision_penalty)
void setJointPositions(const Eigen::VectorXd &values, const Joints &joints, moveit::core::RobotState &state)
std::function< bool(const Eigen::MatrixXd &values, Eigen::VectorXd &costs, bool &validity)> CostFn
std::function< double(const Eigen::VectorXd &state_positions)> StateValidatorFn
A STOMP task definition that allows injecting custom functions for planning.
double distance
The distance evaluation from the constraint or constraints.