Wrappers
MTC provides the following wrapper stages:
ComputeIK
PredicateFilter
PassThrough
ComputeIK
The ComputeIK
is a wrapper for any pose generator stage to compute the inverse kinematics for the poses in Cartesian space generated by the Generate Pose
stage.
Property Name |
Function to set property |
Description |
---|---|---|
eef |
void setEndEffector(std::string eef) |
Name of end effector group |
group |
void setGroup(std::string group) |
Name of active group. Derived from eef if not provided. |
max_ik_solutions |
void setMaxIKSolutions(uint32_t n) |
Default is 1 |
ignore_collisions |
void setIgnoreCollisions(bool flag) |
Default is false. |
min_solution_distance |
void setMinSolutionDistance(double distance) |
Minimum distance between separate IK solutions for the same target. Default is 0.1. |
Code Example
auto stage = std::make_unique<moveit::task_constructor::stages::GenerateVacuumGraspPose>("generate pose");
auto wrapper = std::make_unique<moveit::task_constructor::stages::ComputeIK>("pose IK", std::move(stage));
wrapper->setTimeout(0.05);
wrapper->setIKFrame("tool_frame");
wrapper->properties().configureInitFrom(moveit::task_constructor::Stage::PARENT, { "eef", "group" }); // Property value derived from parent stage
wrapper->properties().configureInitFrom(moveit::task_constructor::Stage::INTERFACE, { "target_pose" }); // Property value derived from child stage
// Users can add a callback function when grasp solutions are generated.
// Here we have added a custom function called publishGraspSolution which can publish the grasp solution to a certain topic.
wrapper->addSolutionCallback(
[this](const moveit::task_constructor::SolutionBase& solution) { return publishGraspSolution(solution); });
PredicateFilter
PredicateFilter
is a stage wrapper to filter generated solutions by custom criteria.
Property Name |
Function to set property |
Description |
---|---|---|
predicate |
void setPredicate(std::function<bool(const SolutionBase, std::string)> predicate) |
Predicate to filter solutions |
ignore_filter |
void setIgnoreFilter(bool ignore) |
Ignore predicate and forward all solutions |
Code Example
auto current_state = std::make_unique<moveit::task_constructor::stages::CurrentState>(kStageNameCurrentState);
// Use Predicate filter to fail the MTC task if any links are in collision in planning scene
auto applicability_filter =
std::make_unique<moveit::task_constructor::stages::PredicateFilter>("current state", std::move(current_state));
applicability_filter->setPredicate([this](const moveit::task_constructor::SolutionBase& s, std::string& comment) {
if (s.start()->scene()->isStateColliding())
{
// Get links that are in collision
std::vector<std::string> colliding_links;
s.start()->scene()->getCollidingLinks(colliding_links);
// Publish the results
publishLinkCollisions(colliding_links);
comment = "Links are in collision";
return false;
}
return true;
});
PassThrough
PassThrough
is a generic wrapper that passes on a solution.
This is useful to set a custom CostTransform
via Stage::setCostTerm to change a solutions’s cost without losing the original value.