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 namespace pick_place
00044 {
00045
00046 ReachableAndValidPoseFilter::ReachableAndValidPoseFilter(const planning_scene::PlanningSceneConstPtr &scene,
00047 const collision_detection::AllowedCollisionMatrixConstPtr &collision_matrix,
00048 const constraint_samplers::ConstraintSamplerManagerPtr &constraints_sampler_manager) :
00049 ManipulationStage("reachable & valid pose filter"),
00050 planning_scene_(scene),
00051 collision_matrix_(collision_matrix),
00052 constraints_sampler_manager_(constraints_sampler_manager)
00053 {
00054 }
00055
00056 bool ReachableAndValidPoseFilter::isStateCollisionFree(const ManipulationPlan *manipulation_plan,
00057 robot_state::JointStateGroup *joint_state_group,
00058 const std::vector<double> &joint_group_variable_values) const
00059 {
00060 joint_state_group->setVariableValues(joint_group_variable_values);
00061
00062 joint_state_group->getRobotState()->setStateValues(manipulation_plan->approach_posture_);
00063
00064 collision_detection::CollisionRequest req;
00065 collision_detection::CollisionResult res;
00066 req.verbose = verbose_;
00067 req.group_name = manipulation_plan->shared_data_->planning_group_;
00068 planning_scene_->checkCollision(req, res, *joint_state_group->getRobotState(), *collision_matrix_);
00069 if (res.collision == false)
00070 return planning_scene_->isStateFeasible(*joint_state_group->getRobotState());
00071 else
00072 return false;
00073 }
00074
00075 bool ReachableAndValidPoseFilter::isEndEffectorFree(const ManipulationPlanPtr &plan, robot_state::RobotState &token_state) const
00076 {
00077 tf::poseMsgToEigen(plan->goal_pose_.pose, plan->transformed_goal_pose_);
00078 plan->transformed_goal_pose_ = planning_scene_->getFrameTransform(token_state, plan->goal_pose_.header.frame_id) * plan->transformed_goal_pose_;
00079 token_state.updateStateWithLinkAt(plan->shared_data_->ik_link_name_, plan->transformed_goal_pose_);
00080 collision_detection::CollisionRequest req;
00081 req.verbose = verbose_;
00082 collision_detection::CollisionResult res;
00083 req.group_name = plan->shared_data_->end_effector_group_;
00084 planning_scene_->checkCollision(req, res, token_state, *collision_matrix_);
00085 return res.collision == false;
00086 }
00087
00088 bool ReachableAndValidPoseFilter::evaluate(const ManipulationPlanPtr &plan) const
00089 {
00090
00091 robot_state::RobotStatePtr token_state(new robot_state::RobotState(planning_scene_->getCurrentState()));
00092 if (isEndEffectorFree(plan, *token_state))
00093 {
00094
00095
00096
00097 if (robot_state::Transforms::sameFrame(planning_scene_->getPlanningFrame(), plan->goal_pose_.header.frame_id))
00098 {
00099 tf::poseEigenToMsg(plan->transformed_goal_pose_, plan->goal_pose_.pose);
00100 plan->goal_pose_.header.frame_id = planning_scene_->getPlanningFrame();
00101 }
00102
00103
00104 plan->goal_constraints_ = kinematic_constraints::constructGoalConstraints(plan->shared_data_->ik_link_name_, plan->goal_pose_);
00105
00106 const std::string &planning_group = plan->shared_data_->planning_group_;
00107
00108
00109
00110 plan->goal_sampler_ = constraints_sampler_manager_->selectSampler(planning_scene_, planning_group, plan->goal_constraints_);
00111 if (plan->goal_sampler_)
00112 {
00113 plan->goal_sampler_->setStateValidityCallback(boost::bind(&ReachableAndValidPoseFilter::isStateCollisionFree, this, plan.get(), _1, _2));
00114 plan->goal_sampler_->setVerbose(verbose_);
00115 if (plan->goal_sampler_->sample(token_state->getJointStateGroup(planning_group), *token_state, plan->shared_data_->max_goal_sampling_attempts_))
00116 {
00117 plan->possible_goal_states_.push_back(token_state);
00118 return true;
00119 }
00120 else
00121 if (verbose_)
00122 ROS_INFO("Sampler failed to produce a state");
00123 }
00124 else
00125 ROS_ERROR_THROTTLE(1, "No sampler was constructed");
00126 }
00127 plan->error_code_.val = moveit_msgs::MoveItErrorCodes::GOAL_IN_COLLISION;
00128 return false;
00129 }
00130
00131 }