00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00037 #ifndef OMPL_ROS_CONVERSIONS_
00038 #define OMPL_ROS_CONVERSIONS_
00039
00040 #include <ros/ros.h>
00041 #include <ros/console.h>
00042 #include <angles/angles.h>
00043
00044 #include <ompl/base/spaces/SO2StateSpace.h>
00045 #include <ompl/base/spaces/SO3StateSpace.h>
00046 #include <ompl/base/spaces/SE2StateSpace.h>
00047 #include <ompl/base/spaces/SE3StateSpace.h>
00048 #include <ompl/base/spaces/RealVectorStateSpace.h>
00049 #include <ompl/geometric/PathGeometric.h>
00050 #include <ompl/base/StateSpace.h>
00051 #include <ompl/base/ScopedState.h>
00052 #include <ompl/base/State.h>
00053
00054 #include <planning_models/kinematic_model.h>
00055 #include <planning_models/kinematic_state.h>
00056 #include <arm_navigation_msgs/convert_messages.h>
00057 #include <arm_navigation_msgs/RobotState.h>
00058 #include <arm_navigation_msgs/RobotTrajectory.h>
00059 #include <arm_navigation_msgs/JointConstraint.h>
00060 #include <sensor_msgs/JointState.h>
00061
00062 namespace ompl_ros_interface
00063 {
00064
00068 typedef enum{REAL_VECTOR, SO2, SO3, SE2, SE3, COMPOUND, UNKNOWN}MAPPING_TYPE;
00069
00074 class OmplStateToRobotStateMapping
00075 {
00076 public:
00077 OmplStateToRobotStateMapping():real_vector_index(-1){}
00078 std::vector<int> ompl_state_mapping;
00079 int real_vector_index;
00080 std::vector<int> real_vector_mapping;
00081 std::vector<ompl_ros_interface::MAPPING_TYPE> mapping_type;
00082 unsigned int num_joints;
00083 };
00084
00089 class RobotStateToOmplStateMapping
00090 {
00091 public:
00092 RobotStateToOmplStateMapping():real_vector_index(-1){}
00093 std::vector<int> multi_dof_mapping;
00094 int real_vector_index;
00095 std::vector<int> joint_state_mapping;
00096 std::vector<ompl_ros_interface::MAPPING_TYPE> joint_mapping_type;
00097 std::vector<ompl_ros_interface::MAPPING_TYPE> multi_dof_joint_mapping_type;
00098 };
00099
00104 class KinematicStateToOmplStateMapping
00105 {
00106 public:
00107 KinematicStateToOmplStateMapping():real_vector_index(-1){}
00108 int real_vector_index;
00109 std::vector<unsigned int> joint_state_mapping;
00110 std::vector<ompl_ros_interface::MAPPING_TYPE> joint_mapping_type;
00111 };
00112
00117 class OmplStateToKinematicStateMapping
00118 {
00119 public:
00120 OmplStateToKinematicStateMapping():real_vector_index(-1){}
00121 int real_vector_index;
00122 std::vector<unsigned int> ompl_state_mapping;
00123 std::vector<unsigned int> real_vector_mapping;
00124 std::vector<ompl_ros_interface::MAPPING_TYPE> mapping_type;
00125 };
00126
00131 class RobotStateToKinematicStateMapping
00132 {
00133 public:
00134 std::vector<int> multi_dof_mapping;
00135 std::vector<int> joint_state_mapping;
00136 };
00137
00138
00139 ompl_ros_interface::MAPPING_TYPE getMappingType(const planning_models::KinematicModel::JointModel *joint_model);
00140
00141 ompl_ros_interface::MAPPING_TYPE getMappingType(const ompl::base::StateSpace *state_space);
00142
00143 ompl_ros_interface::MAPPING_TYPE getMappingType(const ompl::base::StateSpacePtr &state_space);
00144
00153 ompl::base::StateSpacePtr jointGroupToOmplStateSpacePtr(const planning_models::KinematicModel::JointModelGroup *joint_group,
00154 ompl_ros_interface::OmplStateToKinematicStateMapping &ompl_kinematic_mapping,
00155 ompl_ros_interface::KinematicStateToOmplStateMapping &kinematic_ompl_mapping);
00156
00165 bool getRobotStateToOmplStateMapping(const arm_navigation_msgs::RobotState &robot_state,
00166 const ompl::base::ScopedState<ompl::base::CompoundStateSpace> &ompl_state,
00167 ompl_ros_interface::RobotStateToOmplStateMapping &mapping,
00168 const bool &fail_if_match_not_found = true);
00169
00178 bool getJointStateToOmplStateMapping(const sensor_msgs::JointState &joint_state,
00179 const ompl::base::ScopedState<ompl::base::CompoundStateSpace> &ompl_state,
00180 ompl_ros_interface::RobotStateToOmplStateMapping &mapping,
00181 const bool &fail_if_match_not_found = true);
00182
00191 bool getOmplStateToJointStateMapping(const ompl::base::ScopedState<ompl::base::CompoundStateSpace> &ompl_state,
00192 const sensor_msgs::JointState &joint_state,
00193 ompl_ros_interface::OmplStateToRobotStateMapping &mapping,
00194 const bool &fail_if_match_not_found = true);
00195
00204 bool getOmplStateToRobotStateMapping(const ompl::base::ScopedState<ompl::base::CompoundStateSpace> &ompl_state,
00205 const arm_navigation_msgs::RobotState &robot_state,
00206 ompl_ros_interface::OmplStateToRobotStateMapping &mapping,
00207 const bool &fail_if_match_not_found = true);
00208
00217 bool omplStateToRobotState(const ompl::base::ScopedState<ompl::base::CompoundStateSpace> &ompl_state,
00218 const ompl_ros_interface::OmplStateToRobotStateMapping &mapping,
00219 arm_navigation_msgs::RobotState &robot_state);
00220
00229 bool omplStateToRobotState(const ompl::base::State &ompl_state,
00230 const ompl_ros_interface::OmplStateToRobotStateMapping &mapping,
00231 arm_navigation_msgs::RobotState &robot_state);
00232
00241 bool omplRealVectorStateToJointState(const ompl::base::RealVectorStateSpace::StateType &ompl_state,
00242 const ompl_ros_interface::OmplStateToRobotStateMapping &mapping,
00243 sensor_msgs::JointState &joint_state);
00244
00253 bool robotStateToOmplState(const arm_navigation_msgs::RobotState &robot_state,
00254 const ompl_ros_interface::RobotStateToOmplStateMapping &mapping,
00255 ompl::base::ScopedState<ompl::base::CompoundStateSpace> &ompl_state,
00256 const bool &fail_if_match_not_found = true);
00257
00266 bool robotStateToOmplState(const arm_navigation_msgs::RobotState &robot_state,
00267 const ompl_ros_interface::RobotStateToOmplStateMapping &mapping,
00268 ompl::base::State *ompl_state,
00269 const bool &fail_if_match_not_found = true);
00270
00278 bool robotStateToOmplState(const arm_navigation_msgs::RobotState &robot_state,
00279 ompl::base::ScopedState<ompl::base::CompoundStateSpace> &ompl_scoped_state,
00280 const bool &fail_if_match_not_found = true);
00281
00282
00291 bool jointStateToRealVectorState(const sensor_msgs::JointState &joint_state,
00292 const ompl_ros_interface::RobotStateToOmplStateMapping &mapping,
00293 ompl::base::RealVectorStateSpace::StateType &real_vector_state,
00294 const bool &fail_if_match_not_found = true);
00295
00301 void SE3StateSpaceToPoseMsg(const ompl::base::SE3StateSpace::StateType &pose,
00302 geometry_msgs::Pose &pose_msg);
00303
00309 void SO3StateSpaceToQuaternionMsg(const ompl::base::SO3StateSpace::StateType &quaternion,
00310 geometry_msgs::Quaternion &quaternion_msg);
00311
00317 void SO3StateSpaceToPoseMsg(const ompl::base::SO3StateSpace::StateType &quaternion,
00318 geometry_msgs::Pose &pose_msg);
00319
00325 void SE2StateSpaceToPoseMsg(const ompl::base::SE2StateSpace::StateType &pose,
00326 geometry_msgs::Pose &pose_msg);
00327
00333 void poseMsgToSE3StateSpace(const geometry_msgs::Pose &pose_msg,
00334 ompl::base::SE3StateSpace::StateType &pose);
00335
00341 void quaternionMsgToSO3StateSpace(const geometry_msgs::Quaternion &quaternion_msg,
00342 ompl::base::SO3StateSpace::StateType &quaternion);
00343
00344
00351 bool getJointStateGroupToOmplStateMapping(planning_models::KinematicState::JointStateGroup* joint_state_group,
00352 const ompl::base::ScopedState<ompl::base::CompoundStateSpace> &ompl_state,
00353 ompl_ros_interface::KinematicStateToOmplStateMapping &mapping);
00354
00355
00362 bool getOmplStateToJointStateGroupMapping(const ompl::base::ScopedState<ompl::base::CompoundStateSpace> &ompl_state,
00363 planning_models::KinematicState::JointStateGroup* joint_state_group,
00364 ompl_ros_interface::OmplStateToKinematicStateMapping &mapping);
00365
00372 bool kinematicStateGroupToOmplState(const planning_models::KinematicState::JointStateGroup* joint_state_group,
00373 const ompl_ros_interface::KinematicStateToOmplStateMapping &mapping,
00374 ompl::base::ScopedState<ompl::base::CompoundStateSpace> &ompl_state);
00375
00382 bool omplStateToKinematicStateGroup(const ompl::base::ScopedState<ompl::base::CompoundStateSpace> &ompl_state,
00383 const ompl_ros_interface::OmplStateToKinematicStateMapping &mapping,
00384 planning_models::KinematicState::JointStateGroup* joint_state_group);
00385
00392 bool omplStateToKinematicStateGroup(const ompl::base::State *ompl_state,
00393 const ompl_ros_interface::OmplStateToKinematicStateMapping &mapping,
00394 planning_models::KinematicState::JointStateGroup* joint_state_group);
00395
00402 bool jointStateGroupToRobotTrajectory(planning_models::KinematicState::JointStateGroup* joint_state_group,
00403 arm_navigation_msgs::RobotTrajectory &robot_trajectory);
00404
00412 bool omplPathGeometricToRobotTrajectory(const ompl::geometric::PathGeometric &path,
00413 const ompl::base::StateSpacePtr &state_space,
00414 arm_navigation_msgs::RobotTrajectory &robot_trajectory);
00415
00423 bool omplPathGeometricToRobotTrajectory(const ompl::geometric::PathGeometric &path,
00424 const ompl_ros_interface::OmplStateToRobotStateMapping &mapping,
00425 arm_navigation_msgs::RobotTrajectory &robot_trajectory);
00426
00434 bool getOmplStateToRobotTrajectoryMapping(const ompl::base::StateSpacePtr &state_space,
00435 const arm_navigation_msgs::RobotTrajectory &robot_trajectory,
00436 ompl_ros_interface::OmplStateToRobotStateMapping &mapping);
00437
00445 bool getOmplStateToJointTrajectoryMapping(const ompl::base::StateSpacePtr &state_space,
00446 const trajectory_msgs::JointTrajectory &joint_trajectory,
00447 ompl_ros_interface::OmplStateToRobotStateMapping &mapping);
00448
00455 bool jointConstraintsToOmplState(const std::vector<arm_navigation_msgs::JointConstraint> &joint_constraints,
00456 ompl::base::ScopedState<ompl::base::CompoundStateSpace> &ompl_scoped_state);
00457
00464 bool jointConstraintsToOmplState(const std::vector<arm_navigation_msgs::JointConstraint> &joint_constraints,
00465 ompl::base::ScopedState<ompl::base::CompoundStateSpace> &ompl_scoped_state);
00466
00474 bool constraintsToOmplState(const arm_navigation_msgs::Constraints &constraints,
00475 ompl::base::ScopedState<ompl::base::CompoundStateSpace> &ompl_scoped_state,
00476 const bool &fail_if_match_not_found = true);
00477
00485 bool robotStateToJointStateGroup(const arm_navigation_msgs::RobotState &robot_state,
00486 const ompl_ros_interface::RobotStateToKinematicStateMapping &robot_state_to_joint_state_group_mapping,
00487 planning_models::KinematicState::JointStateGroup *joint_state_group);
00488
00496 bool getRobotStateToJointModelGroupMapping(const arm_navigation_msgs::RobotState &robot_state,
00497 const planning_models::KinematicModel::JointModelGroup *joint_model_group,
00498 ompl_ros_interface::RobotStateToKinematicStateMapping &mapping);
00499
00507 bool addToOmplStateSpace(const planning_models::KinematicModel* kinematic_model,
00508 const std::string &joint_name,
00509 ompl::base::StateSpacePtr &ompl_state_space);
00510
00511 }
00512 #endif