path_planning.cpp
Go to the documentation of this file.
1 /************************************************
2  Path planner using bezier library.
3  This file which operate path planning represents
4  one node of the entire demonstrator
5  ************************************************/
6 
7 // ROS headers
8 #include <ros/ros.h>
9 #include <ros/package.h>
10 #include <ros/service.h>
11 #include <tf/transform_listener.h>
15 #include <moveit_msgs/ExecuteKnownTrajectory.h>
16 #include <visualization_msgs/Marker.h>
17 #include <visualization_msgs/MarkerArray.h>
18 #include <std_msgs/String.h>
20 #include "bezier_library/bezier_grinding_surfacing.hpp"
21 
22 #include <fanuc_grinding_path_planning/PathPlanningService.h> // Description of the Service we will use
23 
27 
30 
32 const std::string move_group_name("grinding_disk");
34 const std::string tcp_name("/grinding_disk_tcp");
35 
38 
40 std::string input_mesh_filename = "";
41 
48 bool pathPlanning(fanuc_grinding_path_planning::PathPlanningService::Request &req,
49  fanuc_grinding_path_planning::PathPlanningService::Response &res)
50 {
51  if (!req.SurfacingMode)
52  {
53  res.ReturnStatus = false;
54  res.ReturnMessage = "Grinding mode is not implemented yet!";
55  return true;
56  }
57 
58  std_msgs::String status;
59  std::vector<bool> is_grinding_pose;
60 
61  if (req.Compute)
62  {
63  std::string package = "fanuc_grinding_path_planning";
64  //Get package path
65  std::string mesh_ressource = "package://" + package + "/meshes/";
66  std::string mesh_ressource_file = "file://";
67 
68  // Determine lean angle axis
69  std::string lean_angle_axis;
70  BezierGrindingSurfacing::AXIS_OF_ROTATION lean_axis;
71  if (req.AngleX == true)
72  lean_axis = BezierGrindingSurfacing::X;
73  else if (req.AngleY == true)
74  lean_axis = BezierGrindingSurfacing::Y;
75  else if (req.AngleZ == true)
76  lean_axis = BezierGrindingSurfacing::Z;
77  else
78  {
79  res.ReturnStatus = false;
80  res.ReturnMessage = "Please select a lean angle axis for the effector";
81  return true;
82  }
83 
84  if (!bezier || input_mesh_filename.compare(req.CADFileName) != 0)
85  {
86  bezier.reset(
87  new BezierGrindingSurfacing(req.CADFileName, req.GrinderWidth, req.CoveringPercentage, req.ExtricationRadius,
88  req.LeanAngle, lean_axis));
89  }
90 
91  // Save the PLY file name from command line
92  input_mesh_filename = req.CADFileName;
93  status.data = "Generate Bezier trajectory";
94  status_pub->publish(status);
95  std::string error_string;
96  error_string = bezier->generateTrajectory(way_points_vector, is_grinding_pose, req.GrinderWidth,
97  req.CoveringPercentage, req.ExtricationRadius, req.LeanAngle, lean_axis);
98 
99  if (!error_string.empty())
100  {
101  res.ReturnStatus = false;
102  res.ReturnMessage = error_string;
103  return true;
104  }
105  }
106 
107  // Copy the vector of Eigen poses into a vector of ROS poses
108  std::vector<geometry_msgs::Pose> way_points_msg;
109  for (Eigen::Affine3d pose : way_points_vector)
110  {
111  geometry_msgs::Pose tmp;
112  pose.translation() += Eigen::Vector3d(0, 0, req.TrajectoryZOffset);
113  tf::poseEigenToMsg(pose, tmp);
114  way_points_msg.push_back(tmp);
115  }
116 
117  res.RobotPosesOutput = way_points_msg;
118  for (std::vector<bool>::const_iterator iter(is_grinding_pose.begin()); iter != is_grinding_pose.end(); ++iter)
119  res.IsGrindingPose.push_back(*iter);
120 
121  if (!req.Simulate)
122  {
123  res.ReturnStatus = true;
124  res.ReturnMessage = boost::lexical_cast<std::string>(way_points_msg.size()) + " poses generated";
125  return true;
126  }
127 
128  tf::TransformListener listener;
129  listener.waitForTransform("/base", tcp_name, ros::Time::now(), ros::Duration(1.0));
130 
131  // Execute this trajectory
132  moveit_msgs::ExecuteKnownTrajectory srv;
133  srv.request.wait_for_execution = true;
134  ros::ServiceClient executeKnownTrajectoryServiceClient = node->serviceClient < moveit_msgs::ExecuteKnownTrajectory
135  > ("/execute_kinematic_path");
136  double percentage = group->computeCartesianPath(way_points_msg, 0.05, 0.0, srv.request.trajectory);
137 
138  status.data = boost::lexical_cast<std::string>(percentage*100) + "% of the trajectory will be executed";
139  status_pub->publish(status);
140  executeKnownTrajectoryServiceClient.call(srv);
141 
142  if (percentage < 0.9)
143  {
144  res.ReturnStatus = false;
145  res.ReturnMessage = "Could not compute the whole trajectory!";
146  }
147  else
148  res.ReturnStatus = true;
149 
150  return true;
151 }
152 
153 int main(int argc,
154  char **argv)
155 {
156  ros::init(argc, argv, "path_planning");
157  node.reset(new ros::NodeHandle);
158 
159  status_pub.reset(new ros::Publisher);
160  *status_pub = node->advertise <std_msgs::String> ("scanning_status", 1);
161 
162  // Initialize move group
163  group.reset(new moveit::planning_interface::MoveGroupInterface("grinding_disk"));
164  group->setPoseReferenceFrame("/base_link");
165  group->setPlannerId("RRTConnectkConfigDefault");
166  group->setPlanningTime(2);
167 
168  // Create service server and wait for incoming requests
169  ros::ServiceServer service = node->advertiseService("path_planning_service", pathPlanning);
171  spinner.start();
172 
173  while (node->ok())
174  {
175  sleep(1);
176  }
177  spinner.stop();
178  return 0;
179 }
const std::string tcp_name("/grinding_disk_tcp")
std::vector< Eigen::Affine3d, Eigen::aligned_allocator< Eigen::Affine3d > > vector_Affine3d
void poseEigenToMsg(const Eigen::Affine3d &e, geometry_msgs::Pose &m)
ROSCPP_DECL void init(int &argc, char **argv, const std::string &name, uint32_t options=0)
bool call(MReq &req, MRes &res)
void spinner()
bool waitForTransform(const std::string &target_frame, const std::string &source_frame, const ros::Time &time, const ros::Duration &timeout, const ros::Duration &polling_sleep_duration=ros::Duration(0.01), std::string *error_msg=NULL) const
std::string input_mesh_filename
EigenSTL::vector_Affine3d way_points_vector
boost::shared_ptr< BezierGrindingSurfacing > bezier
bool pathPlanning(fanuc_grinding_path_planning::PathPlanningService::Request &req, fanuc_grinding_path_planning::PathPlanningService::Response &res)
boost::shared_ptr< ros::NodeHandle > node
static Time now()
boost::shared_ptr< moveit::planning_interface::MoveGroupInterface > group
boost::shared_ptr< ros::Publisher > status_pub
int main(int argc, char **argv)
const std::string move_group_name("grinding_disk")


path_planning
Author(s): Kévin Bolloré, Victor Lamoine - Institut Maupertuis
autogenerated on Thu Dec 19 2019 03:38:17