command_list_manager.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2018 Pilz GmbH & Co. KG
3  *
4  * This program is free software: you can redistribute it and/or modify
5  * it under the terms of the GNU Lesser General Public License as published by
6  * the Free Software Foundation, either version 3 of the License, or
7  * (at your option) any later version.
8 
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  * GNU Lesser General Public License for more details.
13 
14  * You should have received a copy of the GNU Lesser General Public License
15  * along with this program. If not, see <http://www.gnu.org/licenses/>.
16  */
17 #ifndef COMMAND_LIST_MANAGER_H
18 #define COMMAND_LIST_MANAGER_H
19 
20 #include <string>
21 
22 #include <boost/optional.hpp>
23 
26 #include <moveit_msgs/MotionPlanResponse.h>
27 
28 #include "pilz_msgs/MotionSequenceRequest.h"
32 
34 {
35 
36 using RobotTrajCont = std::vector<robot_trajectory::RobotTrajectoryPtr>;
37 
38 // List of exceptions which can be thrown by the CommandListManager class.
39 CREATE_MOVEIT_ERROR_CODE_EXCEPTION(NegativeBlendRadiusException, moveit_msgs::MoveItErrorCodes::INVALID_MOTION_PLAN);
40 CREATE_MOVEIT_ERROR_CODE_EXCEPTION(LastBlendRadiusNotZeroException, moveit_msgs::MoveItErrorCodes::INVALID_MOTION_PLAN);
41 CREATE_MOVEIT_ERROR_CODE_EXCEPTION(StartStateSetException, moveit_msgs::MoveItErrorCodes::INVALID_ROBOT_STATE);
42 CREATE_MOVEIT_ERROR_CODE_EXCEPTION(OverlappingBlendRadiiException, moveit_msgs::MoveItErrorCodes::INVALID_MOTION_PLAN);
43 CREATE_MOVEIT_ERROR_CODE_EXCEPTION(PlanningPipelineException, moveit_msgs::MoveItErrorCodes::FAILURE);
44 
50 {
51 public:
52  CommandListManager(const ros::NodeHandle& nh, const robot_model::RobotModelConstPtr& model);
53 
84  RobotTrajCont solve(const planning_scene::PlanningSceneConstPtr& planning_scene,
85  const planning_pipeline::PlanningPipelinePtr& planning_pipeline,
86  const pilz_msgs::MotionSequenceRequest& req_list);
87 
88 private:
89  using MotionResponseCont = std::vector<planning_interface::MotionPlanResponse>;
90  using RobotState_OptRef = boost::optional<const robot_state::RobotState& >;
91  using RadiiCont = std::vector<double>;
92  using GroupNamesCont = std::vector<std::string>;
93 
94 private:
101  void checkForOverlappingRadii(const MotionResponseCont& resp_cont,
102  const RadiiCont &radii) const;
103 
112  MotionResponseCont solveSequenceItems(const planning_scene::PlanningSceneConstPtr& planning_scene,
113  const planning_pipeline::PlanningPipelinePtr& planning_pipeline,
114  const pilz_msgs::MotionSequenceRequest &req_list) const;
115 
122  const double radii_A,
123  const robot_trajectory::RobotTrajectory& traj_B,
124  const double radii_B) const;
125 
126 private:
131  static RobotState_OptRef getPreviousEndState(const MotionResponseCont &motion_plan_responses,
132  const std::string &group_name);
133 
138  static void setStartState(const MotionResponseCont &motion_plan_responses,
139  const std::string &group_name,
140  moveit_msgs::RobotState& start_state);
141 
151  const pilz_msgs::MotionSequenceRequest &req_list);
152 
159  static bool isInvalidBlendRadii(const moveit::core::RobotModel &model,
160  const pilz_msgs::MotionSequenceItem& item_A,
161  const pilz_msgs::MotionSequenceItem& item_B);
162 
166  static void checkForNegativeRadii(const pilz_msgs::MotionSequenceRequest &req_list);
167 
171  static void checkLastBlendRadiusZero(const pilz_msgs::MotionSequenceRequest &req_list);
172 
177  static void checkStartStatesOfGroup(const pilz_msgs::MotionSequenceRequest &req_list,
178  const std::string& group_name);
179 
184  static void checkStartStates(const pilz_msgs::MotionSequenceRequest &req_list);
185 
190  static GroupNamesCont getGroupNames(const pilz_msgs::MotionSequenceRequest &req_list);
191 
192 private:
195 
197  moveit::core::RobotModelConstPtr model_;
198 
202 };
203 
204 inline void CommandListManager::checkLastBlendRadiusZero(const pilz_msgs::MotionSequenceRequest &req_list)
205 {
206  if(req_list.items.back().blend_radius != 0.0)
207  {
208  throw LastBlendRadiusNotZeroException("The last blending radius must be zero");
209  }
210 }
211 
212 }
213 
214 #endif // COMMAND_LIST_MANAGER_H
Helper class to encapsulate the merge and blend process of trajectories.
PlanComponentsBuilder plan_comp_builder_
Builder to construct the container containing the final trajectories.
static RadiiCont extractBlendRadii(const moveit::core::RobotModel &model, const pilz_msgs::MotionSequenceRequest &req_list)
std::vector< planning_interface::MotionPlanResponse > MotionResponseCont
static bool isInvalidBlendRadii(const moveit::core::RobotModel &model, const pilz_msgs::MotionSequenceItem &item_A, const pilz_msgs::MotionSequenceItem &item_B)
bool checkRadiiForOverlap(const robot_trajectory::RobotTrajectory &traj_A, const double radii_A, const robot_trajectory::RobotTrajectory &traj_B, const double radii_B) const
boost::optional< const robot_state::RobotState & > RobotState_OptRef
std::vector< robot_trajectory::RobotTrajectoryPtr > RobotTrajCont
CommandListManager(const ros::NodeHandle &nh, const robot_model::RobotModelConstPtr &model)
static GroupNamesCont getGroupNames(const pilz_msgs::MotionSequenceRequest &req_list)
CREATE_MOVEIT_ERROR_CODE_EXCEPTION(NegativeBlendRadiusException, moveit_msgs::MoveItErrorCodes::INVALID_MOTION_PLAN)
This class orchestrates the planning of single commands and command lists.
MotionResponseCont solveSequenceItems(const planning_scene::PlanningSceneConstPtr &planning_scene, const planning_pipeline::PlanningPipelinePtr &planning_pipeline, const pilz_msgs::MotionSequenceRequest &req_list) const
Solve each sequence item individually.
moveit::core::RobotModelConstPtr model_
Robot model.
static void setStartState(const MotionResponseCont &motion_plan_responses, const std::string &group_name, moveit_msgs::RobotState &start_state)
Set start state to end state of previous calculated trajectory from group.
RobotTrajCont solve(const planning_scene::PlanningSceneConstPtr &planning_scene, const planning_pipeline::PlanningPipelinePtr &planning_pipeline, const pilz_msgs::MotionSequenceRequest &req_list)
Generates trajectories for the specified list of motion commands.
static void checkStartStatesOfGroup(const pilz_msgs::MotionSequenceRequest &req_list, const std::string &group_name)
Checks that only the first request of the specified group has a start state in the specified request ...
void checkForOverlappingRadii(const MotionResponseCont &resp_cont, const RadiiCont &radii) const
Validates that two consecutive blending radii do not overlap.
static void checkForNegativeRadii(const pilz_msgs::MotionSequenceRequest &req_list)
Checks that all blend radii are greater or equal to zero.
static RobotState_OptRef getPreviousEndState(const MotionResponseCont &motion_plan_responses, const std::string &group_name)
static void checkLastBlendRadiusZero(const pilz_msgs::MotionSequenceRequest &req_list)
Checks that last blend radius is zero.
static void checkStartStates(const pilz_msgs::MotionSequenceRequest &req_list)
Checks that each group in the specified request list has only one start state.


pilz_trajectory_generation
Author(s):
autogenerated on Mon Apr 6 2020 03:17:33