Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Added plan_only flags to pick and place in Kinetic #862

Merged
merged 8 commits into from Oct 23, 2018
16 changes: 8 additions & 8 deletions moveit_commander/src/moveit_commander/move_group.py
Expand Up @@ -541,27 +541,27 @@ def detach_object(self, name = ""):
""" Given the name of a link, detach the object(s) from that link. If no such link exists, the name is interpreted as an object name. If there is no name specified, an attempt is made to detach all objects attached to any link in the group."""
return self._g.detach_object(name)

def pick(self, object_name, grasp = []):
def pick(self, object_name, grasp = [], plan_only=False):
"""Pick the named object. A grasp message, or a list of Grasp messages can also be specified as argument."""
if type(grasp) is Grasp:
return self._g.pick(object_name, conversions.msg_to_string(grasp))
return self._g.pick(object_name, conversions.msg_to_string(grasp), plan_only)
else:
return self._g.pick(object_name, [conversions.msg_to_string(x) for x in grasp])
return self._g.pick(object_name, [conversions.msg_to_string(x) for x in grasp], plan_only)

def place(self, object_name, location=None):
def place(self, object_name, location=None, plan_only=False):
"""Place the named object at a particular location in the environment or somewhere safe in the world if location is not provided"""
result = False
if location is None:
result = self._g.place(object_name)
result = self._g.place(object_name, plan_only)
elif type(location) is PoseStamped:
old = self.get_pose_reference_frame()
self.set_pose_reference_frame(location.header.frame_id)
result = self._g.place(object_name, conversions.pose_to_list(location.pose))
result = self._g.place(object_name, conversions.pose_to_list(location.pose), plan_only)
self.set_pose_reference_frame(old)
elif type(location) is Pose:
result = self._g.place(object_name, conversions.pose_to_list(location))
result = self._g.place(object_name, conversions.pose_to_list(location), plan_only)
elif type(location) is PlaceLocation:
result = self._g.place(object_name, conversions.msg_to_string(location))
result = self._g.place(object_name, conversions.msg_to_string(location), plan_only)
else:
raise MoveItCommanderException("Parameter location must be a Pose, PoseStamped or PlaceLocation object")
return result
Expand Down
Expand Up @@ -754,37 +754,40 @@ class MoveGroupInterface
/** \brief Pick up an object

This applies a number of hard-coded default grasps */
MoveItErrorCode pick(const std::string& object);
MoveItErrorCode pick(const std::string& object, bool plan_only = false);

/** \brief Pick up an object given a grasp pose */
MoveItErrorCode pick(const std::string& object, const moveit_msgs::Grasp& grasp);
MoveItErrorCode pick(const std::string& object, const moveit_msgs::Grasp& grasp, bool plan_only = false);

/** \brief Pick up an object given possible grasp poses

if the vector is left empty this behaves like pick(const std::string &object) */
MoveItErrorCode pick(const std::string& object, const std::vector<moveit_msgs::Grasp>& grasps);
MoveItErrorCode pick(const std::string& object, const std::vector<moveit_msgs::Grasp>& grasps,
bool plan_only = false);

/** \brief Pick up an object

calls the external moveit_msgs::GraspPlanning service "plan_grasps" to compute possible grasps */
MoveItErrorCode planGraspsAndPick(const std::string& object = "");
MoveItErrorCode planGraspsAndPick(const std::string& object = "", bool plan_only = false);

/** \brief Pick up an object

calls the external moveit_msgs::GraspPlanning service "plan_grasps" to compute possible grasps */
MoveItErrorCode planGraspsAndPick(const moveit_msgs::CollisionObject& object);
MoveItErrorCode planGraspsAndPick(const moveit_msgs::CollisionObject& object, bool plan_only = false);

/** \brief Place an object somewhere safe in the world (a safe location will be detected) */
MoveItErrorCode place(const std::string& object);
MoveItErrorCode place(const std::string& object, bool plan_only = false);

/** \brief Place an object at one of the specified possible locations */
MoveItErrorCode place(const std::string& object, const std::vector<moveit_msgs::PlaceLocation>& locations);
MoveItErrorCode place(const std::string& object, const std::vector<moveit_msgs::PlaceLocation>& locations,
bool plan_only = false);

/** \brief Place an object at one of the specified possible locations */
MoveItErrorCode place(const std::string& object, const std::vector<geometry_msgs::PoseStamped>& poses);
MoveItErrorCode place(const std::string& object, const std::vector<geometry_msgs::PoseStamped>& poses,
bool plan_only = false);

/** \brief Place an object at one of the specified possible location */
MoveItErrorCode place(const std::string& object, const geometry_msgs::PoseStamped& pose);
MoveItErrorCode place(const std::string& object, const geometry_msgs::PoseStamped& pose, bool plan_only = false);

/** \brief Given the name of an object in the planning scene, make
the object attached to a link of the robot. If no link name is
Expand Down
Expand Up @@ -645,7 +645,8 @@ class MoveGroupInterface::MoveGroupInterfaceImpl
}

/** \brief Place an object at one of the specified possible locations */
MoveItErrorCode place(const std::string& object, const std::vector<geometry_msgs::PoseStamped>& poses)
MoveItErrorCode place(const std::string& object, const std::vector<geometry_msgs::PoseStamped>& poses,
bool plan_only = false)
{
std::vector<moveit_msgs::PlaceLocation> locations;
for (std::size_t i = 0; i < poses.size(); ++i)
Expand All @@ -667,10 +668,11 @@ class MoveGroupInterface::MoveGroupInterfaceImpl
}
ROS_DEBUG_NAMED("move_group_interface", "Move group interface has %u place locations",
(unsigned int)locations.size());
return place(object, locations);
return place(object, locations, plan_only);
}

MoveItErrorCode place(const std::string& object, const std::vector<moveit_msgs::PlaceLocation>& locations)
MoveItErrorCode place(const std::string& object, const std::vector<moveit_msgs::PlaceLocation>& locations,
bool plan_only = false)
{
if (!place_action_client_)
{
Expand All @@ -685,7 +687,7 @@ class MoveGroupInterface::MoveGroupInterfaceImpl
moveit_msgs::PlaceGoal goal;
constructGoal(goal, object);
goal.place_locations = locations;
goal.planning_options.plan_only = false;
goal.planning_options.plan_only = plan_only;
goal.planning_options.look_around = can_look_;
goal.planning_options.replan = can_replan_;
goal.planning_options.replan_delay = replan_delay_;
Expand All @@ -710,7 +712,7 @@ class MoveGroupInterface::MoveGroupInterfaceImpl
}
}

MoveItErrorCode pick(const std::string& object, const std::vector<moveit_msgs::Grasp>& grasps)
MoveItErrorCode pick(const std::string& object, const std::vector<moveit_msgs::Grasp>& grasps, bool plan_only = false)
{
if (!pick_action_client_)
{
Expand All @@ -725,7 +727,7 @@ class MoveGroupInterface::MoveGroupInterfaceImpl
moveit_msgs::PickupGoal goal;
constructGoal(goal, object);
goal.possible_grasps = grasps;
goal.planning_options.plan_only = false;
goal.planning_options.plan_only = plan_only;
goal.planning_options.look_around = can_look_;
goal.planning_options.replan = can_replan_;
goal.planning_options.replan_delay = replan_delay_;
Expand All @@ -749,7 +751,7 @@ class MoveGroupInterface::MoveGroupInterfaceImpl
}
}

MoveItErrorCode planGraspsAndPick(const std::string& object)
MoveItErrorCode planGraspsAndPick(const std::string& object, bool plan_only = false)
{
if (object.empty())
{
Expand All @@ -766,10 +768,10 @@ class MoveGroupInterface::MoveGroupInterfaceImpl
return MoveItErrorCode(moveit_msgs::MoveItErrorCodes::INVALID_OBJECT_NAME);
}

return planGraspsAndPick(objects[object]);
return planGraspsAndPick(objects[object], plan_only);
}

MoveItErrorCode planGraspsAndPick(const moveit_msgs::CollisionObject& object)
MoveItErrorCode planGraspsAndPick(const moveit_msgs::CollisionObject& object, bool plan_only = false)
{
if (!plan_grasps_service_)
{
Expand All @@ -795,7 +797,7 @@ class MoveGroupInterface::MoveGroupInterfaceImpl
return MoveItErrorCode(moveit_msgs::MoveItErrorCodes::FAILURE);
}

return pick(object.id, response.grasps);
return pick(object.id, response.grasps, plan_only);
}

MoveItErrorCode plan(Plan& plan)
Expand Down Expand Up @@ -1522,57 +1524,57 @@ moveit::planning_interface::MoveItErrorCode moveit::planning_interface::MoveGrou
}

moveit::planning_interface::MoveItErrorCode
moveit::planning_interface::MoveGroupInterface::pick(const std::string& object)
moveit::planning_interface::MoveGroupInterface::pick(const std::string& object, bool plan_only)
{
return impl_->pick(object, std::vector<moveit_msgs::Grasp>());
return impl_->pick(object, std::vector<moveit_msgs::Grasp>(), plan_only);
}

moveit::planning_interface::MoveItErrorCode
moveit::planning_interface::MoveGroupInterface::pick(const std::string& object, const moveit_msgs::Grasp& grasp)
moveit::planning_interface::MoveItErrorCode moveit::planning_interface::MoveGroupInterface::pick(
const std::string& object, const moveit_msgs::Grasp& grasp, bool plan_only)
{
return impl_->pick(object, std::vector<moveit_msgs::Grasp>(1, grasp));
return impl_->pick(object, std::vector<moveit_msgs::Grasp>(1, grasp), plan_only);
}

moveit::planning_interface::MoveItErrorCode moveit::planning_interface::MoveGroupInterface::pick(
const std::string& object, const std::vector<moveit_msgs::Grasp>& grasps)
const std::string& object, const std::vector<moveit_msgs::Grasp>& grasps, bool plan_only)
{
return impl_->pick(object, grasps);
return impl_->pick(object, grasps, plan_only);
}

moveit::planning_interface::MoveItErrorCode
DavidWatkins marked this conversation as resolved.
Show resolved Hide resolved
moveit::planning_interface::MoveGroupInterface::planGraspsAndPick(const std::string& object)
moveit::planning_interface::MoveGroupInterface::planGraspsAndPick(const std::string& object, bool plan_only)
{
return impl_->planGraspsAndPick(object);
return impl_->planGraspsAndPick(object, plan_only);
}

moveit::planning_interface::MoveItErrorCode
moveit::planning_interface::MoveGroupInterface::planGraspsAndPick(const moveit_msgs::CollisionObject& object)
moveit::planning_interface::MoveItErrorCode moveit::planning_interface::MoveGroupInterface::planGraspsAndPick(
const moveit_msgs::CollisionObject& object, bool plan_only)
{
return impl_->planGraspsAndPick(object);
return impl_->planGraspsAndPick(object, plan_only);
}

moveit::planning_interface::MoveItErrorCode
moveit::planning_interface::MoveGroupInterface::place(const std::string& object)
moveit::planning_interface::MoveGroupInterface::place(const std::string& object, bool plan_only)
{
return impl_->place(object, std::vector<moveit_msgs::PlaceLocation>());
return impl_->place(object, std::vector<moveit_msgs::PlaceLocation>(), plan_only);
}

moveit::planning_interface::MoveItErrorCode moveit::planning_interface::MoveGroupInterface::place(
const std::string& object, const std::vector<moveit_msgs::PlaceLocation>& locations)
const std::string& object, const std::vector<moveit_msgs::PlaceLocation>& locations, bool plan_only)
{
return impl_->place(object, locations);
return impl_->place(object, locations, plan_only);
}

moveit::planning_interface::MoveItErrorCode moveit::planning_interface::MoveGroupInterface::place(
const std::string& object, const std::vector<geometry_msgs::PoseStamped>& poses)
const std::string& object, const std::vector<geometry_msgs::PoseStamped>& poses, bool plan_only)
{
return impl_->place(object, poses);
return impl_->place(object, poses, plan_only);
}

moveit::planning_interface::MoveItErrorCode
moveit::planning_interface::MoveGroupInterface::place(const std::string& object, const geometry_msgs::PoseStamped& pose)
moveit::planning_interface::MoveItErrorCode moveit::planning_interface::MoveGroupInterface::place(
const std::string& object, const geometry_msgs::PoseStamped& pose, bool plan_only)
{
return impl_->place(object, std::vector<geometry_msgs::PoseStamped>(1, pose));
return impl_->place(object, std::vector<geometry_msgs::PoseStamped>(1, pose), plan_only);
}

double moveit::planning_interface::MoveGroupInterface::computeCartesianPath(
Expand Down
Expand Up @@ -254,25 +254,25 @@ class MoveGroupInterfaceWrapper : protected py_bindings_tools::ROScppInitializer
return py_bindings_tools::listFromString(getKnownConstraints());
}

bool placePose(const std::string& object_name, const bp::list& pose)
bool placePose(const std::string& object_name, const bp::list& pose, bool plan_only = false)
{
geometry_msgs::PoseStamped msg;
convertListToPose(pose, msg.pose);
msg.header.frame_id = getPoseReferenceFrame();
msg.header.stamp = ros::Time::now();
return place(object_name, msg) == MoveItErrorCode::SUCCESS;
return place(object_name, msg, plan_only) == MoveItErrorCode::SUCCESS;
}

bool placeLocation(const std::string& object_name, const std::string& location_str)
bool placeLocation(const std::string& object_name, const std::string& location_str, bool plan_only = false)
{
std::vector<moveit_msgs::PlaceLocation> locations(1);
py_bindings_tools::deserializeMsg(location_str, locations[0]);
return place(object_name, locations) == MoveItErrorCode::SUCCESS;
return place(object_name, locations, plan_only) == MoveItErrorCode::SUCCESS;
}

bool placeAnywhere(const std::string& object_name)
bool placeAnywhere(const std::string& object_name, bool plan_only = false)
{
return place(object_name) == MoveItErrorCode::SUCCESS;
return place(object_name, plan_only) == MoveItErrorCode::SUCCESS;
}

void convertListToArrayOfPoses(const bp::list& poses, std::vector<geometry_msgs::Pose>& msg)
Expand Down Expand Up @@ -451,20 +451,20 @@ class MoveGroupInterfaceWrapper : protected py_bindings_tools::ROScppInitializer
return bp::make_tuple(py_bindings_tools::serializeMsg(trajectory), fraction);
}

int pickGrasp(const std::string& object, const std::string& grasp_str)
int pickGrasp(const std::string& object, const std::string& grasp_str, bool plan_only = false)
{
moveit_msgs::Grasp grasp;
py_bindings_tools::deserializeMsg(grasp_str, grasp);
return pick(object, grasp).val;
return pick(object, grasp, plan_only).val;
}

int pickGrasps(const std::string& object, const bp::list& grasp_list)
int pickGrasps(const std::string& object, const bp::list& grasp_list, bool plan_only = false)
{
int l = bp::len(grasp_list);
std::vector<moveit_msgs::Grasp> grasps(l);
for (int i = 0; i < l; ++i)
py_bindings_tools::deserializeMsg(bp::extract<std::string>(grasp_list[i]), grasps[i]);
return pick(object, grasps).val;
return pick(object, grasps, plan_only).val;
}

void setPathConstraintsFromMsg(const std::string& constraints_str)
Expand Down Expand Up @@ -535,7 +535,7 @@ static void wrap_move_group_interface()
MoveGroupInterfaceClass.def("move", &MoveGroupInterfaceWrapper::movePython);
MoveGroupInterfaceClass.def("execute", &MoveGroupInterfaceWrapper::executePython);
MoveGroupInterfaceClass.def("async_execute", &MoveGroupInterfaceWrapper::asyncExecutePython);
moveit::planning_interface::MoveItErrorCode (MoveGroupInterfaceWrapper::*pick_1)(const std::string&) =
moveit::planning_interface::MoveItErrorCode (MoveGroupInterfaceWrapper::*pick_1)(const std::string&, bool) =
&MoveGroupInterfaceWrapper::pick;
MoveGroupInterfaceClass.def("pick", pick_1);
MoveGroupInterfaceClass.def("pick", &MoveGroupInterfaceWrapper::pickGrasp);
Expand Down