3838#include < rosparam_shortcuts/rosparam_shortcuts.h>
3939
4040namespace moveit_task_constructor_demo {
41- constexpr char LOGNAME [] = " pick_place_task" ;
42- PickPlaceTask::PickPlaceTask (const std::string& task_name, const ros::NodeHandle& nh)
43- : nh_(nh), task_name_(task_name), execute_(" execute_task_solution" , true ) {}
41+
42+ constexpr char LOGNAME [] = " moveit_task_constructor_demo" ;
43+ constexpr char PickPlaceTask::LOGNAME [];
44+
45+ void spawnObject (moveit::planning_interface::PlanningSceneInterface& psi, const moveit_msgs::CollisionObject& object) {
46+ if (!psi.applyCollisionObject (object))
47+ throw std::runtime_error (" Failed to spawn object: " + object.id );
48+ }
49+
50+ moveit_msgs::CollisionObject createTable (ros::NodeHandle& pnh) {
51+ std::string table_name, table_reference_frame;
52+ std::vector<double > table_dimensions;
53+ geometry_msgs::Pose pose;
54+ std::size_t errors = 0 ;
55+ errors += !rosparam_shortcuts::get (LOGNAME , pnh, " table_name" , table_name);
56+ errors += !rosparam_shortcuts::get (LOGNAME , pnh, " table_reference_frame" , table_reference_frame);
57+ errors += !rosparam_shortcuts::get (LOGNAME , pnh, " table_dimensions" , table_dimensions);
58+ errors += !rosparam_shortcuts::get (LOGNAME , pnh, " table_pose" , pose);
59+ rosparam_shortcuts::shutdownIfError (LOGNAME , errors);
60+
61+ moveit_msgs::CollisionObject object;
62+ object.id = table_name;
63+ object.header .frame_id = table_reference_frame;
64+ object.primitives .resize (1 );
65+ object.primitives [0 ].type = shape_msgs::SolidPrimitive::BOX ;
66+ object.primitives [0 ].dimensions = table_dimensions;
67+ pose.position .z -= 0.5 * table_dimensions[2 ]; // align surface with world
68+ object.primitive_poses .push_back (pose);
69+ return object;
70+ }
71+
72+ moveit_msgs::CollisionObject createObject (ros::NodeHandle& pnh) {
73+ std::string object_name, object_reference_frame;
74+ std::vector<double > object_dimensions;
75+ geometry_msgs::Pose pose;
76+ std::size_t error = 0 ;
77+ error += !rosparam_shortcuts::get (LOGNAME , pnh, " object_name" , object_name);
78+ error += !rosparam_shortcuts::get (LOGNAME , pnh, " object_reference_frame" , object_reference_frame);
79+ error += !rosparam_shortcuts::get (LOGNAME , pnh, " object_dimensions" , object_dimensions);
80+ error += !rosparam_shortcuts::get (LOGNAME , pnh, " object_pose" , pose);
81+ rosparam_shortcuts::shutdownIfError (LOGNAME , error);
82+
83+ moveit_msgs::CollisionObject object;
84+ object.id = object_name;
85+ object.header .frame_id = object_reference_frame;
86+ object.primitives .resize (1 );
87+ object.primitives [0 ].type = shape_msgs::SolidPrimitive::CYLINDER ;
88+ object.primitives [0 ].dimensions = object_dimensions;
89+ pose.position .z += 0.5 * object_dimensions[0 ];
90+ object.primitive_poses .push_back (pose);
91+ return object;
92+ }
93+
94+ void setupDemoScene (ros::NodeHandle& pnh) {
95+ // Add table and object to planning scene
96+ ros::Duration (1.0 ).sleep (); // Wait for ApplyPlanningScene service
97+ moveit::planning_interface::PlanningSceneInterface psi;
98+ if (pnh.param (" spawn_table" , true ))
99+ spawnObject (psi, createTable (pnh));
100+ spawnObject (psi, createObject (pnh));
101+ }
102+
103+ PickPlaceTask::PickPlaceTask (const std::string& task_name, const ros::NodeHandle& pnh)
104+ : pnh_(pnh), task_name_(task_name) {
105+ loadParameters ();
106+ }
44107
45108void PickPlaceTask::loadParameters () {
46109 /* ***************************************************
@@ -49,45 +112,44 @@ void PickPlaceTask::loadParameters() {
49112 * *
50113 ***************************************************/
51114 ROS_INFO_NAMED (LOGNAME , " Loading task parameters" );
52- ros::NodeHandle pnh (" ~" );
53115
54116 // Planning group properties
55117 size_t errors = 0 ;
56- errors += !rosparam_shortcuts::get (LOGNAME , pnh , " arm_group_name" , arm_group_name_);
57- errors += !rosparam_shortcuts::get (LOGNAME , pnh , " hand_group_name" , hand_group_name_);
58- errors += !rosparam_shortcuts::get (LOGNAME , pnh , " eef_name" , eef_name_);
59- errors += !rosparam_shortcuts::get (LOGNAME , pnh , " hand_frame" , hand_frame_);
60- errors += !rosparam_shortcuts::get (LOGNAME , pnh , " world_frame" , world_frame_);
61- errors += !rosparam_shortcuts::get (LOGNAME , pnh , " grasp_frame_transform" , grasp_frame_transform_);
118+ errors += !rosparam_shortcuts::get (LOGNAME , pnh_ , " arm_group_name" , arm_group_name_);
119+ errors += !rosparam_shortcuts::get (LOGNAME , pnh_ , " hand_group_name" , hand_group_name_);
120+ errors += !rosparam_shortcuts::get (LOGNAME , pnh_ , " eef_name" , eef_name_);
121+ errors += !rosparam_shortcuts::get (LOGNAME , pnh_ , " hand_frame" , hand_frame_);
122+ errors += !rosparam_shortcuts::get (LOGNAME , pnh_ , " world_frame" , world_frame_);
123+ errors += !rosparam_shortcuts::get (LOGNAME , pnh_ , " grasp_frame_transform" , grasp_frame_transform_);
62124
63125 // Predefined pose targets
64- errors += !rosparam_shortcuts::get (LOGNAME , pnh , " hand_open_pose" , hand_open_pose_);
65- errors += !rosparam_shortcuts::get (LOGNAME , pnh , " hand_close_pose" , hand_close_pose_);
66- errors += !rosparam_shortcuts::get (LOGNAME , pnh , " arm_home_pose" , arm_home_pose_);
126+ errors += !rosparam_shortcuts::get (LOGNAME , pnh_ , " hand_open_pose" , hand_open_pose_);
127+ errors += !rosparam_shortcuts::get (LOGNAME , pnh_ , " hand_close_pose" , hand_close_pose_);
128+ errors += !rosparam_shortcuts::get (LOGNAME , pnh_ , " arm_home_pose" , arm_home_pose_);
67129
68130 // Target object
69- errors += !rosparam_shortcuts::get (LOGNAME , pnh , " object_name" , object_name_);
70- errors += !rosparam_shortcuts::get (LOGNAME , pnh , " object_dimensions" , object_dimensions_);
71- errors += !rosparam_shortcuts::get (LOGNAME , pnh , " object_reference_frame" , object_reference_frame_);
72- errors += !rosparam_shortcuts::get (LOGNAME , pnh , " surface_link" , surface_link_);
131+ errors += !rosparam_shortcuts::get (LOGNAME , pnh_ , " object_name" , object_name_);
132+ errors += !rosparam_shortcuts::get (LOGNAME , pnh_ , " object_dimensions" , object_dimensions_);
133+ errors += !rosparam_shortcuts::get (LOGNAME , pnh_ , " object_reference_frame" , object_reference_frame_);
134+ errors += !rosparam_shortcuts::get (LOGNAME , pnh_ , " surface_link" , surface_link_);
73135 support_surfaces_ = { surface_link_ };
74136
75137 // Pick/Place metrics
76- errors += !rosparam_shortcuts::get (LOGNAME , pnh , " approach_object_min_dist" , approach_object_min_dist_);
77- errors += !rosparam_shortcuts::get (LOGNAME , pnh , " approach_object_max_dist" , approach_object_max_dist_);
78- errors += !rosparam_shortcuts::get (LOGNAME , pnh , " lift_object_min_dist" , lift_object_min_dist_);
79- errors += !rosparam_shortcuts::get (LOGNAME , pnh , " lift_object_max_dist" , lift_object_max_dist_);
80- errors += !rosparam_shortcuts::get (LOGNAME , pnh , " place_surface_offset" , place_surface_offset_);
81- errors += !rosparam_shortcuts::get (LOGNAME , pnh , " place_pose" , place_pose_);
138+ errors += !rosparam_shortcuts::get (LOGNAME , pnh_ , " approach_object_min_dist" , approach_object_min_dist_);
139+ errors += !rosparam_shortcuts::get (LOGNAME , pnh_ , " approach_object_max_dist" , approach_object_max_dist_);
140+ errors += !rosparam_shortcuts::get (LOGNAME , pnh_ , " lift_object_min_dist" , lift_object_min_dist_);
141+ errors += !rosparam_shortcuts::get (LOGNAME , pnh_ , " lift_object_max_dist" , lift_object_max_dist_);
142+ errors += !rosparam_shortcuts::get (LOGNAME , pnh_ , " place_surface_offset" , place_surface_offset_);
143+ errors += !rosparam_shortcuts::get (LOGNAME , pnh_ , " place_pose" , place_pose_);
82144 rosparam_shortcuts::shutdownIfError (LOGNAME , errors);
83145}
84146
85- void PickPlaceTask::init () {
147+ bool PickPlaceTask::init () {
86148 ROS_INFO_NAMED (LOGNAME , " Initializing task pipeline" );
87149 const std::string object = object_name_;
88150
89151 // Reset ROS introspection before constructing the new object
90- // TODO(henningkayser ): verify this is a bug, fix if possible
152+ // TODO(v4hn ): global storage for Introspection services to enable one-liner
91153 task_.reset ();
92154 task_.reset (new moveit::task_constructor::Task ());
93155
@@ -414,36 +476,40 @@ void PickPlaceTask::init() {
414476 stage->restrictDirection (stages::MoveTo::FORWARD );
415477 t.add (std::move (stage));
416478 }
417- }
418-
419- bool PickPlaceTask::plan () {
420- ROS_INFO_NAMED (LOGNAME , " Start searching for task solutions" );
421- ros::NodeHandle pnh (" ~" );
422- int max_solutions = pnh.param <int >(" max_solutions" , 10 );
423479
480+ // prepare Task structure for planning
424481 try {
425- task_-> plan (max_solutions );
482+ t. init ( );
426483 } catch (InitStageException& e) {
427484 ROS_ERROR_STREAM_NAMED (LOGNAME , " Initialization failed: " << e);
428485 return false ;
429486 }
430- if (task_->numSolutions () == 0 ) {
431- ROS_ERROR_NAMED (LOGNAME , " Planning failed" );
432- return false ;
433- }
487+
434488 return true ;
435489}
436490
491+ bool PickPlaceTask::plan () {
492+ ROS_INFO_NAMED (LOGNAME , " Start searching for task solutions" );
493+ int max_solutions = pnh_.param <int >(" max_solutions" , 10 );
494+
495+ return task_->plan (max_solutions);
496+ }
497+
437498bool PickPlaceTask::execute () {
438499 ROS_INFO_NAMED (LOGNAME , " Executing solution trajectory" );
439- moveit_task_constructor_msgs::ExecuteTaskSolutionGoal execute_goal;
440- task_->solutions ().front ()->fillMessage (execute_goal.solution );
441- execute_.sendGoal (execute_goal);
442- execute_.waitForResult ();
443- moveit_msgs::MoveItErrorCodes execute_result = execute_.getResult ()->error_code ;
500+ moveit_msgs::MoveItErrorCodes execute_result;
501+
502+ execute_result = task_->execute (*task_->solutions ().front ());
503+ // // If you want to inspect the goal message, use this instead:
504+ // actionlib::SimpleActionClient<moveit_task_constructor_msgs::ExecuteTaskSolutionAction>
505+ // execute("execute_task_solution", true); execute.waitForServer();
506+ // moveit_task_constructor_msgs::ExecuteTaskSolutionGoal execute_goal;
507+ // task_->solutions().front()->fillMessage(execute_goal.solution);
508+ // execute.sendGoalAndWait(execute_goal);
509+ // execute_result = execute.getResult()->error_code;
444510
445511 if (execute_result.val != moveit_msgs::MoveItErrorCodes::SUCCESS ) {
446- ROS_ERROR_STREAM_NAMED (LOGNAME , " Task execution failed and returned: " << execute_. getState (). toString () );
512+ ROS_ERROR_STREAM_NAMED (LOGNAME , " Task execution failed and returned: " << execute_result. val );
447513 return false ;
448514 }
449515
0 commit comments