pick_place_action_capability.cpp
Go to the documentation of this file.
1 /*********************************************************************
2  * Software License Agreement (BSD License)
3  *
4  * Copyright (c) 2012, Willow Garage, Inc.
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  *
11  * * Redistributions of source code must retain the above copyright
12  * notice, this list of conditions and the following disclaimer.
13  * * Redistributions in binary form must reproduce the above
14  * copyright notice, this list of conditions and the following
15  * disclaimer in the documentation and/or other materials provided
16  * with the distribution.
17  * * Neither the name of Willow Garage nor the names of its
18  * contributors may be used to endorse or promote products derived
19  * from this software without specific prior written permission.
20  *
21  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
24  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
25  * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
26  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
27  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
28  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
29  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
31  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
32  * POSSIBILITY OF SUCH DAMAGE.
33  *********************************************************************/
34 
35 /* Author: Ioan Sucan */
36 
41 
43  : MoveGroupCapability("PickPlaceAction"), pickup_state_(IDLE)
44 {
45 }
46 
48 {
49  pick_place_ = std::make_shared<pick_place::PickPlace>(context_->planning_pipeline_);
50  pick_place_->displayComputedMotionPlans(true);
51 
52  if (context_->debug_)
53  pick_place_->displayProcessedGrasps(true);
54 
55  // start the pickup action server
56  pickup_action_server_ = std::make_unique<actionlib::SimpleActionServer<moveit_msgs::PickupAction>>(
57  root_node_handle_, PICKUP_ACTION, [this](const auto& goal) { executePickupCallback(goal); }, false);
58  pickup_action_server_->registerPreemptCallback([this] { preemptPickupCallback(); });
59  pickup_action_server_->start();
60 
61  // start the place action server
62  place_action_server_ = std::make_unique<actionlib::SimpleActionServer<moveit_msgs::PlaceAction>>(
63  root_node_handle_, PLACE_ACTION, [this](const auto& goal) { executePlaceCallback(goal); }, false);
64  place_action_server_->registerPreemptCallback([this] { preemptPlaceCallback(); });
65  place_action_server_->start();
66 }
67 
69 {
70  setPickupState(MONITOR);
71 }
72 
74 {
75  setPickupState(LOOK);
76 }
77 
79 {
80  setPlaceState(MONITOR);
81 }
82 
84 {
85  setPlaceState(LOOK);
86 }
87 
88 void move_group::MoveGroupPickPlaceAction::executePickupCallbackPlanOnly(const moveit_msgs::PickupGoalConstPtr& goal,
89  moveit_msgs::PickupResult& action_res)
90 {
91  pick_place::PickPlanPtr plan;
92  try
93  {
94  plan = pick_place_->planPick(context_->planning_scene_monitor_->copyPlanningScene(), *goal);
95  }
96  catch (std::exception& ex)
97  {
98  ROS_ERROR_NAMED("manipulation", "Pick&place threw an exception: %s", ex.what());
99  }
100 
101  if (plan)
102  {
103  const std::vector<pick_place::ManipulationPlanPtr>& success = plan->getSuccessfulManipulationPlans();
104  if (success.empty())
105  {
106  action_res.error_code = plan->getErrorCode();
107  }
108  else
109  {
110  const pick_place::ManipulationPlanPtr& result = success.back();
111  convertToMsg(result->trajectories_, action_res.trajectory_start, action_res.trajectory_stages);
112  action_res.trajectory_descriptions.resize(result->trajectories_.size());
113  for (std::size_t i = 0; i < result->trajectories_.size(); ++i)
114  action_res.trajectory_descriptions[i] = result->trajectories_[i].description_;
115  if (result->id_ < goal->possible_grasps.size())
116  action_res.grasp = goal->possible_grasps[result->id_];
117  action_res.error_code.val = moveit_msgs::MoveItErrorCodes::SUCCESS;
118  action_res.planning_time = plan->getLastPlanTime();
119  }
120  }
121  else
122  {
123  action_res.error_code.val = moveit_msgs::MoveItErrorCodes::FAILURE;
124  }
125 }
126 
127 void move_group::MoveGroupPickPlaceAction::executePlaceCallbackPlanOnly(const moveit_msgs::PlaceGoalConstPtr& goal,
128  moveit_msgs::PlaceResult& action_res)
129 {
130  pick_place::PlacePlanPtr plan;
131  try
132  {
133  plan = pick_place_->planPlace(context_->planning_scene_monitor_->copyPlanningScene(), *goal);
134  }
135  catch (std::exception& ex)
136  {
137  ROS_ERROR_NAMED("manipulation", "Pick&place threw an exception: %s", ex.what());
138  }
139 
140  if (plan)
141  {
142  const std::vector<pick_place::ManipulationPlanPtr>& success = plan->getSuccessfulManipulationPlans();
143  if (success.empty())
144  {
145  action_res.error_code = plan->getErrorCode();
146  }
147  else
148  {
149  const pick_place::ManipulationPlanPtr& result = success.back();
150  convertToMsg(result->trajectories_, action_res.trajectory_start, action_res.trajectory_stages);
151  action_res.trajectory_descriptions.resize(result->trajectories_.size());
152  for (std::size_t i = 0; i < result->trajectories_.size(); ++i)
153  action_res.trajectory_descriptions[i] = result->trajectories_[i].description_;
154  if (result->id_ < goal->place_locations.size())
155  action_res.place_location = goal->place_locations[result->id_];
156  action_res.error_code.val = moveit_msgs::MoveItErrorCodes::SUCCESS;
157  action_res.planning_time = plan->getLastPlanTime();
158  }
159  }
160  else
161  {
162  action_res.error_code.val = moveit_msgs::MoveItErrorCodes::FAILURE;
163  }
164 }
165 
166 bool move_group::MoveGroupPickPlaceAction::planUsingPickPlacePickup(const moveit_msgs::PickupGoal& goal,
167  moveit_msgs::PickupResult* action_res,
169 {
170  setPickupState(PLANNING);
171 
172  pick_place::PickPlanPtr pick_plan;
173  try
174  {
175  pick_plan = pick_place_->planPick(plan.copyPlanningScene(), goal);
176  }
177  catch (std::exception& ex)
178  {
179  ROS_ERROR_NAMED("manipulation", "Pick&place threw an exception: %s", ex.what());
180  }
181 
182  if (pick_plan)
183  {
184  const std::vector<pick_place::ManipulationPlanPtr>& success = pick_plan->getSuccessfulManipulationPlans();
185  if (success.empty())
186  {
187  plan.error_code_ = pick_plan->getErrorCode();
188  }
189  else
190  {
191  const pick_place::ManipulationPlanPtr& result = success.back();
192  plan.plan_components_ = result->trajectories_;
193  if (result->id_ < goal.possible_grasps.size())
194  action_res->grasp = goal.possible_grasps[result->id_];
195  plan.error_code_.val = moveit_msgs::MoveItErrorCodes::SUCCESS;
196  action_res->planning_time = pick_plan->getLastPlanTime();
197  }
198  }
199  else
200  {
201  plan.error_code_.val = moveit_msgs::MoveItErrorCodes::FAILURE;
202  }
203 
204  return plan.error_code_.val == moveit_msgs::MoveItErrorCodes::SUCCESS;
205 }
206 
208  moveit_msgs::PlaceResult* action_res,
210 {
211  setPlaceState(PLANNING);
212 
213  pick_place::PlacePlanPtr place_plan;
214  try
215  {
216  place_plan = pick_place_->planPlace(plan.copyPlanningScene(), goal);
217  }
218  catch (std::exception& ex)
219  {
220  ROS_ERROR_NAMED("manipulation", "Pick&place threw an exception: %s", ex.what());
221  }
222 
223  if (place_plan)
224  {
225  const std::vector<pick_place::ManipulationPlanPtr>& success = place_plan->getSuccessfulManipulationPlans();
226  if (success.empty())
227  {
228  plan.error_code_ = place_plan->getErrorCode();
229  }
230  else
231  {
232  const pick_place::ManipulationPlanPtr& result = success.back();
233  plan.plan_components_ = result->trajectories_;
234  if (result->id_ < goal.place_locations.size())
235  action_res->place_location = goal.place_locations[result->id_];
236  plan.error_code_.val = moveit_msgs::MoveItErrorCodes::SUCCESS;
237  action_res->planning_time = place_plan->getLastPlanTime();
238  }
239  }
240  else
241  {
242  plan.error_code_.val = moveit_msgs::MoveItErrorCodes::FAILURE;
243  }
244 
245  return plan.error_code_.val == moveit_msgs::MoveItErrorCodes::SUCCESS;
246 }
247 
249  const moveit_msgs::PickupGoalConstPtr& goal, moveit_msgs::PickupResult& action_res)
250 {
252 
253  opt.replan_ = goal->planning_options.replan;
254  opt.replan_attempts_ = goal->planning_options.replan_attempts;
255  opt.replan_delay_ = goal->planning_options.replan_delay;
256  opt.before_execution_callback_ = [this] { startPickupExecutionCallback(); };
257 
258  opt.plan_callback_ = [this, &g = *goal, result_ptr = &action_res](plan_execution::ExecutableMotionPlan& plan) {
259  return planUsingPickPlacePickup(g, result_ptr, plan);
260  };
261  if (goal->planning_options.look_around && context_->plan_with_sensing_)
262  {
263  opt.plan_callback_ = [plan_with_sensing = context_->plan_with_sensing_.get(), planner = opt.plan_callback_,
264  attempts = goal->planning_options.look_around_attempts,
265  safe_execution_cost = goal->planning_options.max_safe_execution_cost](
267  return plan_with_sensing->computePlan(plan, planner, attempts, safe_execution_cost);
268  };
269  context_->plan_with_sensing_->setBeforeLookCallback([this] { startPickupLookCallback(); });
270  }
271 
273  context_->plan_execution_->planAndExecute(plan, goal->planning_options.planning_scene_diff, opt);
274 
275  convertToMsg(plan.plan_components_, action_res.trajectory_start, action_res.trajectory_stages);
276  action_res.trajectory_descriptions.resize(plan.plan_components_.size());
277  for (std::size_t i = 0; i < plan.plan_components_.size(); ++i)
278  action_res.trajectory_descriptions[i] = plan.plan_components_[i].description_;
279  action_res.error_code = plan.error_code_;
280 }
281 
282 void move_group::MoveGroupPickPlaceAction::executePlaceCallbackPlanAndExecute(const moveit_msgs::PlaceGoalConstPtr& goal,
283  moveit_msgs::PlaceResult& action_res)
284 {
286 
287  opt.replan_ = goal->planning_options.replan;
288  opt.replan_attempts_ = goal->planning_options.replan_attempts;
289  opt.replan_delay_ = goal->planning_options.replan_delay;
290  opt.before_execution_callback_ = [this] { startPlaceExecutionCallback(); };
291  opt.plan_callback_ = [this, g = *goal, result_ptr = &action_res](plan_execution::ExecutableMotionPlan& plan) {
292  return planUsingPickPlacePlace(g, result_ptr, plan);
293  };
294  if (goal->planning_options.look_around && context_->plan_with_sensing_)
295  {
296  opt.plan_callback_ = [plan_with_sensing = context_->plan_with_sensing_.get(), planner = opt.plan_callback_,
297  attempts = goal->planning_options.look_around_attempts,
298  safe_execution_cost = goal->planning_options.max_safe_execution_cost](
300  return plan_with_sensing->computePlan(plan, planner, attempts, safe_execution_cost);
301  };
302  context_->plan_with_sensing_->setBeforeLookCallback([this] { startPlaceLookCallback(); });
303  }
304 
306  context_->plan_execution_->planAndExecute(plan, goal->planning_options.planning_scene_diff, opt);
307 
308  convertToMsg(plan.plan_components_, action_res.trajectory_start, action_res.trajectory_stages);
309  action_res.trajectory_descriptions.resize(plan.plan_components_.size());
310  for (std::size_t i = 0; i < plan.plan_components_.size(); ++i)
311  action_res.trajectory_descriptions[i] = plan.plan_components_[i].description_;
312  action_res.error_code = plan.error_code_;
313 }
314 
315 void move_group::MoveGroupPickPlaceAction::executePickupCallback(const moveit_msgs::PickupGoalConstPtr& input_goal)
316 {
317  setPickupState(PLANNING);
318 
319  // before we start planning, ensure that we have the latest robot state received...
320  context_->planning_scene_monitor_->waitForCurrentRobotState(ros::Time::now());
321  context_->planning_scene_monitor_->updateFrameTransforms();
322 
323  moveit_msgs::PickupGoalConstPtr goal;
324  if (input_goal->possible_grasps.empty())
325  {
326  moveit_msgs::PickupGoal* copy(new moveit_msgs::PickupGoal(*input_goal));
327  goal.reset(copy);
328  fillGrasps(*copy);
329  }
330  else
331  goal = input_goal;
332 
333  moveit_msgs::PickupResult action_res;
334 
335  if (goal->planning_options.plan_only || !context_->allow_trajectory_execution_)
336  {
337  if (!goal->planning_options.plan_only)
338  ROS_WARN_NAMED("manipulation", "This instance of MoveGroup is not allowed to execute trajectories but the pick "
339  "goal request has plan_only set to false. Only a motion plan will be computed "
340  "anyway.");
341  executePickupCallbackPlanOnly(goal, action_res);
342  }
343  else
344  executePickupCallbackPlanAndExecute(goal, action_res);
345 
346  bool planned_trajectory_empty = action_res.trajectory_stages.empty();
347  std::string response =
348  getActionResultString(action_res.error_code, planned_trajectory_empty, goal->planning_options.plan_only);
349  if (action_res.error_code.val == moveit_msgs::MoveItErrorCodes::SUCCESS)
350  pickup_action_server_->setSucceeded(action_res, response);
351  else
352  {
353  if (action_res.error_code.val == moveit_msgs::MoveItErrorCodes::PREEMPTED)
354  pickup_action_server_->setPreempted(action_res, response);
355  else
356  pickup_action_server_->setAborted(action_res, response);
357  }
358 
359  setPickupState(IDLE);
360 }
361 
362 void move_group::MoveGroupPickPlaceAction::executePlaceCallback(const moveit_msgs::PlaceGoalConstPtr& goal)
363 {
364  setPlaceState(PLANNING);
365 
366  // before we start planning, ensure that we have the latest robot state received...
367  context_->planning_scene_monitor_->waitForCurrentRobotState(ros::Time::now());
368  context_->planning_scene_monitor_->updateFrameTransforms();
369 
370  moveit_msgs::PlaceResult action_res;
371 
372  if (goal->planning_options.plan_only || !context_->allow_trajectory_execution_)
373  {
374  if (!goal->planning_options.plan_only)
375  ROS_WARN_NAMED("manipulation", "This instance of MoveGroup is not allowed to execute trajectories but the place "
376  "goal request has plan_only set to false. Only a motion plan will be computed "
377  "anyway.");
378  executePlaceCallbackPlanOnly(goal, action_res);
379  }
380  else
381  executePlaceCallbackPlanAndExecute(goal, action_res);
382 
383  bool planned_trajectory_empty = action_res.trajectory_stages.empty();
384  std::string response =
385  getActionResultString(action_res.error_code, planned_trajectory_empty, goal->planning_options.plan_only);
386  if (action_res.error_code.val == moveit_msgs::MoveItErrorCodes::SUCCESS)
387  place_action_server_->setSucceeded(action_res, response);
388  else
389  {
390  if (action_res.error_code.val == moveit_msgs::MoveItErrorCodes::PREEMPTED)
391  place_action_server_->setPreempted(action_res, response);
392  else
393  place_action_server_->setAborted(action_res, response);
394  }
395 
396  setPlaceState(IDLE);
397 }
398 
400 {
401 }
402 
404 {
405 }
406 
408 {
409  pickup_state_ = state;
410  pickup_feedback_.state = stateToStr(state);
411  pickup_action_server_->publishFeedback(pickup_feedback_);
412 }
413 
415 {
416  place_state_ = state;
417  place_feedback_.state = stateToStr(state);
418  place_action_server_->publishFeedback(place_feedback_);
419 }
420 
421 void move_group::MoveGroupPickPlaceAction::fillGrasps(moveit_msgs::PickupGoal& goal)
422 {
423  planning_scene_monitor::LockedPlanningSceneRO lscene(context_->planning_scene_monitor_);
424 
425  ROS_DEBUG_NAMED("manipulation", "Using default grasp poses");
426  goal.minimize_object_distance = true;
427 
428  // add a number of default grasp points
429  // \todo add more!
430  moveit_msgs::Grasp g;
431  g.grasp_pose.header.frame_id = goal.target_name;
432  g.grasp_pose.pose.position.x = -0.2;
433  g.grasp_pose.pose.position.y = 0.0;
434  g.grasp_pose.pose.position.z = 0.0;
435  g.grasp_pose.pose.orientation.x = 0.0;
436  g.grasp_pose.pose.orientation.y = 0.0;
437  g.grasp_pose.pose.orientation.z = 0.0;
438  g.grasp_pose.pose.orientation.w = 1.0;
439 
440  g.pre_grasp_approach.direction.header.frame_id = lscene->getPlanningFrame();
441  g.pre_grasp_approach.direction.vector.x = 1.0;
442  g.pre_grasp_approach.min_distance = 0.1;
443  g.pre_grasp_approach.desired_distance = 0.2;
444 
445  g.post_grasp_retreat.direction.header.frame_id = lscene->getPlanningFrame();
446  g.post_grasp_retreat.direction.vector.z = 1.0;
447  g.post_grasp_retreat.min_distance = 0.1;
448  g.post_grasp_retreat.desired_distance = 0.2;
449 
450  if (lscene->getRobotModel()->hasEndEffector(goal.end_effector))
451  {
452  g.pre_grasp_posture.joint_names = lscene->getRobotModel()->getEndEffector(goal.end_effector)->getJointModelNames();
453  g.pre_grasp_posture.points.resize(1);
454  g.pre_grasp_posture.points[0].positions.resize(g.pre_grasp_posture.joint_names.size(),
455  std::numeric_limits<double>::max());
456 
457  g.grasp_posture.joint_names = g.pre_grasp_posture.joint_names;
458  g.grasp_posture.points.resize(1);
459  g.grasp_posture.points[0].positions.resize(g.grasp_posture.joint_names.size(), -std::numeric_limits<double>::max());
460  }
461  goal.possible_grasps.push_back(g);
462 }
463 
response
const std::string response
move_group::MoveGroupState
MoveGroupState
move_group::LOOK
LOOK
move_group::MoveGroupCapability
IDLE
IDLE
move_group::MoveGroupPickPlaceAction::fillGrasps
void fillGrasps(moveit_msgs::PickupGoal &goal)
Definition: pick_place_action_capability.cpp:421
move_group::MoveGroupPickPlaceAction::executePlaceCallbackPlanAndExecute
void executePlaceCallbackPlanAndExecute(const moveit_msgs::PlaceGoalConstPtr &goal, moveit_msgs::PlaceResult &action_res)
Definition: pick_place_action_capability.cpp:282
move_group::MoveGroupPickPlaceAction::startPickupExecutionCallback
void startPickupExecutionCallback()
Definition: pick_place_action_capability.cpp:68
plan_execution::PlanExecution::Options
move_group::MoveGroupPickPlaceAction::MoveGroupPickPlaceAction
MoveGroupPickPlaceAction()
Definition: pick_place_action_capability.cpp:42
plan_execution::PlanExecution::Options::replan_
bool replan_
move_group::MoveGroupPickPlaceAction
Definition: pick_place_action_capability.h:81
move_group::MoveGroupPickPlaceAction::setPickupState
void setPickupState(MoveGroupState state)
Definition: pick_place_action_capability.cpp:407
move_group::MoveGroupPickPlaceAction::initialize
void initialize() override
Definition: pick_place_action_capability.cpp:47
move_group::MoveGroupPickPlaceAction::startPickupLookCallback
void startPickupLookCallback()
Definition: pick_place_action_capability.cpp:73
ROS_ERROR_NAMED
#define ROS_ERROR_NAMED(name,...)
plan_execution::ExecutableMotionPlan::copyPlanningScene
planning_scene::PlanningScenePtr copyPlanningScene()
plan_with_sensing.h
move_group::MoveGroupPickPlaceAction::planUsingPickPlacePickup
bool planUsingPickPlacePickup(const moveit_msgs::PickupGoal &goal, moveit_msgs::PickupResult *action_res, plan_execution::ExecutableMotionPlan &plan)
Definition: pick_place_action_capability.cpp:166
move_group::MoveGroupPickPlaceAction::executePickupCallback
void executePickupCallback(const moveit_msgs::PickupGoalConstPtr &goal)
Definition: pick_place_action_capability.cpp:315
move_group::MoveGroupPickPlaceAction::setPlaceState
void setPlaceState(MoveGroupState state)
Definition: pick_place_action_capability.cpp:414
plan_execution::ExecutableMotionPlan::plan_components_
std::vector< ExecutableTrajectory > plan_components_
ROS_DEBUG_NAMED
#define ROS_DEBUG_NAMED(name,...)
move_group::MoveGroupPickPlaceAction::preemptPlaceCallback
void preemptPlaceCallback()
Definition: pick_place_action_capability.cpp:403
move_group::MoveGroupPickPlaceAction::startPlaceExecutionCallback
void startPlaceExecutionCallback()
Definition: pick_place_action_capability.cpp:78
plan_execution::PlanExecution::Options::plan_callback_
ExecutableMotionPlanComputationFn plan_callback_
class_loader.hpp
plan_execution::PlanExecution::Options::replan_delay_
double replan_delay_
move_group::MONITOR
MONITOR
plan_execution::PlanExecution::Options::replan_attempts_
unsigned int replan_attempts_
plan_execution::ExecutableMotionPlan::error_code_
moveit_msgs::MoveItErrorCodes error_code_
move_group::MoveGroupPickPlaceAction::executePlaceCallbackPlanOnly
void executePlaceCallbackPlanOnly(const moveit_msgs::PlaceGoalConstPtr &goal, moveit_msgs::PlaceResult &action_res)
Definition: pick_place_action_capability.cpp:127
move_group::MoveGroupPickPlaceAction::executePickupCallbackPlanAndExecute
void executePickupCallbackPlanAndExecute(const moveit_msgs::PickupGoalConstPtr &goal, moveit_msgs::PickupResult &action_res)
Definition: pick_place_action_capability.cpp:248
plan_execution::PlanExecution::Options::before_execution_callback_
boost::function< void()> before_execution_callback_
plan_execution::ExecutableMotionPlan
planning_scene_monitor::LockedPlanningSceneRO
move_group::MoveGroupPickPlaceAction::planUsingPickPlacePlace
bool planUsingPickPlacePlace(const moveit_msgs::PlaceGoal &goal, moveit_msgs::PlaceResult *action_res, plan_execution::ExecutableMotionPlan &plan)
Definition: pick_place_action_capability.cpp:207
ROS_WARN_NAMED
#define ROS_WARN_NAMED(name,...)
move_group::PICKUP_ACTION
static const std::string PICKUP_ACTION
Definition: capability_names.h:75
move_group::MoveGroupPickPlaceAction::executePlaceCallback
void executePlaceCallback(const moveit_msgs::PlaceGoalConstPtr &goal)
Definition: pick_place_action_capability.cpp:362
move_group::MoveGroupPickPlaceAction::startPlaceLookCallback
void startPlaceLookCallback()
Definition: pick_place_action_capability.cpp:83
CLASS_LOADER_REGISTER_CLASS
CLASS_LOADER_REGISTER_CLASS(default_planner_request_adapters::AddIterativeSplineParameterization, planning_request_adapter::PlanningRequestAdapter)
pick_place_action_capability.h
move_group::MoveGroupPickPlaceAction::preemptPickupCallback
void preemptPickupCallback()
Definition: pick_place_action_capability.cpp:399
move_group::PLANNING
PLANNING
capability_names.h
move_group::MoveGroupPickPlaceAction::executePickupCallbackPlanOnly
void executePickupCallbackPlanOnly(const moveit_msgs::PickupGoalConstPtr &goal, moveit_msgs::PickupResult &action_res)
Definition: pick_place_action_capability.cpp:88
plan_execution.h
move_group::PLACE_ACTION
static const std::string PLACE_ACTION
Definition: capability_names.h:76
ros::Time::now
static Time now()


manipulation
Author(s): Ioan Sucan , Sachin Chitta
autogenerated on Sat May 3 2025 02:26:53