xarm_gripper_planner.cpp
Go to the documentation of this file.
1 /* Copyright 2018 UFACTORY Inc. All Rights Reserved.
2  *
3  * Software License Agreement (BSD License)
4  *
5  * Author: Jason Peng <jason@ufactory.cc>
6  ============================================================================*/
9 
10 #include <moveit_msgs/DisplayRobotState.h>
11 #include <moveit_msgs/DisplayTrajectory.h>
12 
13 #include <moveit_msgs/AttachedCollisionObject.h>
14 #include <moveit_msgs/CollisionObject.h>
15 
17 #include <std_msgs/Bool.h>
18 #include <xarm_planner/joint_plan.h>
19 #include <xarm_planner/exec_plan.h>
20 
21 #define SPINNER_THREAD_NUM 2
22 
23 /* Used for Cartesian path computation, please modify as needed: */
24 const double jump_threshold = 0.0;
25 const double eef_step = 0.005;
26 const double maxV_scale_factor = 0.3; // check!!
27 
28 
29 namespace rvt = rviz_visual_tools;
30 
32 {
33  public:
34  XArmGripperPlanner(const std::string plan_group_name):spinner(SPINNER_THREAD_NUM), group(plan_group_name){init();};
37  void start();
38  void stop();
39 
40  static std::string PLANNING_GROUP; // declaration of static class member
41 
42  private:
46  std::vector<std::string> joint_names;
50 
52  // ros::ServiceServer plan_pose_srv;
54  // ros::ServiceServer sing_cart_srv;
55  ros::Subscriber exec_plan_sub; /* non-blocking*/
56  ros::ServiceServer exec_plan_srv; /* blocking with result feedback */
57 
58  void init();
59  // bool do_pose_plan(xarm_planner::pose_plan::Request &req, xarm_planner::pose_plan::Response &res);
60  bool do_joint_plan(xarm_planner::joint_plan::Request &req, xarm_planner::joint_plan::Response &res);
61  // bool do_single_cartesian_plan(xarm_planner::single_straight_plan::Request &req, xarm_planner::single_straight_plan::Response &res);
62  bool exec_plan_cb(xarm_planner::exec_plan::Request &req, xarm_planner::exec_plan::Response &res);
63  void execute_plan_topic(const std_msgs::Bool::ConstPtr& exec);
64 };
65 
67 {
69  ROS_INFO("Joint names(%lu): %s", joint_names.size(), joint_names[0].c_str());
70 
71  display_path = node_handle.advertise<moveit_msgs::DisplayTrajectory>("/move_group/display_planned_path", 1, true); /*necessary?*/
72 
73  ROS_INFO_NAMED("move_group_planner", "Reference frame: %s", group.getPlanningFrame().c_str());
74 
75  ROS_INFO_NAMED("move_group_planner", "End effector link: %s", group.getEndEffectorLink().c_str());
76 
77  /* Notice: the correct way to specify member function as callbacks */
79 
80  exec_plan_sub = node_handle.subscribe("gripper_planner_exec", 10, &XArmGripperPlanner::execute_plan_topic, this);
82 
83 }
84 
86 {
87  ROS_INFO("Spinning");
88  spinner.start();
89 }
90 
92 {
93  spinner.stop();
94 }
95 
96 
97 bool XArmGripperPlanner::do_joint_plan(xarm_planner::joint_plan::Request &req, xarm_planner::joint_plan::Response &res)
98 {
99  ROS_INFO("move_group_planner received new plan Request target: %lu, %lf", req.target.size(), req.target[0]);
100 
101  std::vector<double> mimic_target(6,req.target[0]);
102  group.setJointValueTarget(mimic_target);
103 
104  bool success = (group.plan(my_xarm_plan) == moveit::planning_interface::MoveItErrorCode::SUCCESS);
105  res.success = success;
106  ROS_INFO_NAMED("move_group_planner", "This plan (joint goal) %s", success ? "SUCCEEDED" : "FAILED");
107 
108  return success;
109 }
110 
111 bool XArmGripperPlanner::exec_plan_cb(xarm_planner::exec_plan::Request &req, xarm_planner::exec_plan::Response &res)
112 {
113  if(req.exec)
114  {
115  ROS_INFO("Received Execution Service Request");
116  bool finish_ok = (group.execute(my_xarm_plan) == moveit::planning_interface::MoveItErrorCode::SUCCESS); /* return after execution finish */
117  res.success = finish_ok;
118  return finish_ok;
119  }
120 
121  res.success = false;
122  return false;
123 }
124 
125 /* execution subscriber call-back function */
126 void XArmGripperPlanner::execute_plan_topic(const std_msgs::Bool::ConstPtr& exec)
127 {
128  if(exec->data)
129  {
130  ROS_INFO("Received Execution Command !!!!!");
131  group.asyncExecute(my_xarm_plan); /* return without waiting for finish */
132  }
133 }
134 
135 
136 std::string XArmGripperPlanner::PLANNING_GROUP; // Definition of static class member
137 
138 int main(int argc, char** argv)
139 {
140  ros::init(argc, argv, "xarm_gripper_planner");
141  ros::NodeHandle nh;
142  int jnt_num;
143 
144  XArmGripperPlanner::PLANNING_GROUP = "xarm_gripper";
145 
146  XArmGripperPlanner planner;
147 
148  planner.start();
149 
150  ROS_INFO("Waiting for \'pose_plan\' or \'joint_plan\' service Request ...");
151 
152  /* necessary: because AsyncSpinner is not operating in the same thread */
154  return 0;
155 }
156 
#define ROS_INFO_NAMED(name,...)
bool exec_plan_cb(xarm_planner::exec_plan::Request &req, xarm_planner::exec_plan::Response &res)
XArmGripperPlanner(const std::string plan_group_name)
ros::ServiceServer plan_joint_srv
Subscriber subscribe(const std::string &topic, uint32_t queue_size, void(T::*fp)(M), T *obj, const TransportHints &transport_hints=TransportHints())
bool setJointValueTarget(const std::vector< double > &group_variable_values)
ros::Subscriber exec_plan_sub
ROSCPP_DECL void init(int &argc, char **argv, const std::string &name, uint32_t options=0)
const double eef_step
ServiceServer advertiseService(const std::string &service, bool(T::*srv_func)(MReq &, MRes &), T *obj)
moveit::planning_interface::MoveGroupInterface group
const std::string & getPlanningFrame() const
ros::AsyncSpinner spinner
const std::string & getEndEffectorLink() const
const double maxV_scale_factor
MoveItErrorCode asyncExecute(const Plan &plan)
#define ROS_INFO(...)
const double jump_threshold
moveit_visual_tools::MoveItVisualTools * visual_tools
Publisher advertise(const std::string &topic, uint32_t queue_size, bool latch=false)
MoveItErrorCode execute(const Plan &plan)
int main(int argc, char **argv)
static std::string PLANNING_GROUP
moveit::planning_interface::PlanningSceneInterface planning_scene_interface
const std::vector< std::string > & getJointNames()
#define SPINNER_THREAD_NUM
void execute_plan_topic(const std_msgs::Bool::ConstPtr &exec)
ros::NodeHandle node_handle
std::vector< std::string > joint_names
bool do_joint_plan(xarm_planner::joint_plan::Request &req, xarm_planner::joint_plan::Response &res)
ROSCPP_DECL void waitForShutdown()
ros::ServiceServer exec_plan_srv
moveit::planning_interface::MoveGroupInterface::Plan my_xarm_plan


xarm_planner
Author(s):
autogenerated on Sat May 8 2021 02:51:51