Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037 #include <moveit/pick_place/reachable_valid_pose_filter.h>
00038 #include <moveit/kinematic_constraints/utils.h>
00039 #include <eigen_conversions/eigen_msg.h>
00040 #include <boost/bind.hpp>
00041 #include <ros/console.h>
00042
00043 pick_place::ReachableAndValidPoseFilter::ReachableAndValidPoseFilter(const planning_scene::PlanningSceneConstPtr &scene,
00044 const collision_detection::AllowedCollisionMatrixConstPtr &collision_matrix,
00045 const constraint_samplers::ConstraintSamplerManagerPtr &constraints_sampler_manager) :
00046 ManipulationStage("reachable & valid pose filter"),
00047 planning_scene_(scene),
00048 collision_matrix_(collision_matrix),
00049 constraints_sampler_manager_(constraints_sampler_manager)
00050 {
00051 }
00052
00053 namespace
00054 {
00055 bool isStateCollisionFree(const planning_scene::PlanningScene *planning_scene,
00056 const collision_detection::AllowedCollisionMatrix *collision_matrix,
00057 bool verbose,
00058 const pick_place::ManipulationPlan *manipulation_plan,
00059 robot_state::RobotState *state,
00060 const robot_model::JointModelGroup *group,
00061 const double *joint_group_variable_values)
00062 {
00063 collision_detection::CollisionRequest req;
00064 req.verbose = verbose;
00065 req.group_name = manipulation_plan->shared_data_->planning_group_->getName();
00066
00067 state->setJointGroupPositions(group, joint_group_variable_values);
00068
00069 if (manipulation_plan->approach_posture_.points.empty())
00070 {
00071 state->update();
00072 collision_detection::CollisionResult res;
00073 planning_scene->checkCollision(req, res, *state, *collision_matrix);
00074 if (res.collision)
00075 return false;
00076 }
00077 else
00078
00079 for (std::size_t i = 0 ; i < manipulation_plan->approach_posture_.points.size() ; ++i)
00080 {
00081 state->setVariablePositions(manipulation_plan->approach_posture_.joint_names, manipulation_plan->approach_posture_.points[i].positions);
00082 state->update();
00083 collision_detection::CollisionResult res;
00084 planning_scene->checkCollision(req, res, *state, *collision_matrix);
00085 if (res.collision)
00086 return false;
00087 }
00088 return planning_scene->isStateFeasible(*state);
00089 }
00090 }
00091
00092 bool pick_place::ReachableAndValidPoseFilter::isEndEffectorFree(const ManipulationPlanPtr &plan, robot_state::RobotState &token_state) const
00093 {
00094 tf::poseMsgToEigen(plan->goal_pose_.pose, plan->transformed_goal_pose_);
00095 plan->transformed_goal_pose_ = planning_scene_->getFrameTransform(token_state, plan->goal_pose_.header.frame_id) * plan->transformed_goal_pose_;
00096 token_state.updateStateWithLinkAt(plan->shared_data_->ik_link_, plan->transformed_goal_pose_);
00097 collision_detection::CollisionRequest req;
00098 req.verbose = verbose_;
00099 collision_detection::CollisionResult res;
00100 req.group_name = plan->shared_data_->end_effector_group_->getName();
00101 planning_scene_->checkCollision(req, res, token_state, *collision_matrix_);
00102 return res.collision == false;
00103 }
00104
00105 bool pick_place::ReachableAndValidPoseFilter::evaluate(const ManipulationPlanPtr &plan) const
00106 {
00107
00108 robot_state::RobotStatePtr token_state(new robot_state::RobotState(planning_scene_->getCurrentState()));
00109 if (isEndEffectorFree(plan, *token_state))
00110 {
00111
00112
00113
00114 if (robot_state::Transforms::sameFrame(planning_scene_->getPlanningFrame(), plan->goal_pose_.header.frame_id))
00115 {
00116 tf::poseEigenToMsg(plan->transformed_goal_pose_, plan->goal_pose_.pose);
00117 plan->goal_pose_.header.frame_id = planning_scene_->getPlanningFrame();
00118 }
00119
00120
00121 plan->goal_constraints_ = kinematic_constraints::constructGoalConstraints(plan->shared_data_->ik_link_->getName(), plan->goal_pose_);
00122
00123 const std::string &planning_group = plan->shared_data_->planning_group_->getName();
00124
00125
00126
00127 plan->goal_sampler_ = constraints_sampler_manager_->selectSampler(planning_scene_, planning_group, plan->goal_constraints_);
00128 if (plan->goal_sampler_)
00129 {
00130 plan->goal_sampler_->setGroupStateValidityCallback(boost::bind(&isStateCollisionFree, planning_scene_.get(), collision_matrix_.get(),
00131 verbose_, plan.get(), _1, _2, _3));
00132 plan->goal_sampler_->setVerbose(verbose_);
00133 if (plan->goal_sampler_->sample(*token_state, plan->shared_data_->max_goal_sampling_attempts_))
00134 {
00135 plan->possible_goal_states_.push_back(token_state);
00136 return true;
00137 }
00138 else
00139 if (verbose_)
00140 ROS_INFO("Sampler failed to produce a state");
00141 }
00142 else
00143 ROS_ERROR_THROTTLE(1, "No sampler was constructed");
00144 }
00145 plan->error_code_.val = moveit_msgs::MoveItErrorCodes::GOAL_IN_COLLISION;
00146 return false;
00147 }
00148