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
00035
00036
00037 #ifndef MOVEIT_COLLISION_DISTANCE_FIELD_COLLISION_ROBOT_DISTANCE_FIELD_
00038 #define MOVEIT_COLLISION_DISTANCE_FIELD_COLLISION_ROBOT_DISTANCE_FIELD_
00039
00040 #include <moveit/collision_detection/collision_robot.h>
00041 #include <moveit/collision_distance_field/collision_distance_field_types.h>
00042 #include <moveit/collision_distance_field/collision_common_distance_field.h>
00043 #include <moveit/planning_scene/planning_scene.h>
00044 #include <boost/thread/mutex.hpp>
00045
00046 namespace collision_detection
00047 {
00048 static const double DEFAULT_SIZE_X = 3.0;
00049 static const double DEFAULT_SIZE_Y = 3.0;
00050 static const double DEFAULT_SIZE_Z = 4.0;
00051 static const bool DEFAULT_USE_SIGNED_DISTANCE_FIELD = false;
00052 static const double DEFAULT_RESOLUTION = .02;
00053 static const double DEFAULT_COLLISION_TOLERANCE = 0.0;
00054 static const double DEFAULT_MAX_PROPOGATION_DISTANCE = .25;
00055
00056 class CollisionRobotDistanceField : public CollisionRobot
00057 {
00058 friend class CollisionWorldDistanceField;
00059
00060 public:
00061 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
00062
00063 CollisionRobotDistanceField(const robot_model::RobotModelConstPtr& kmodel);
00064
00065 CollisionRobotDistanceField(const CollisionRobot& col_robot, const Eigen::Vector3d& size,
00066 const Eigen::Vector3d& origin, bool use_signed_distance_field, double resolution,
00067 double collision_tolerance, double max_propogation_distance, double padding);
00068
00069 CollisionRobotDistanceField(const robot_model::RobotModelConstPtr& kmodel,
00070 const std::map<std::string, std::vector<CollisionSphere> >& link_body_decompositions,
00071 double size_x = DEFAULT_SIZE_X, double size_y = DEFAULT_SIZE_Y,
00072 double size_z = DEFAULT_SIZE_Z,
00073 bool use_signed_distance_field = DEFAULT_USE_SIGNED_DISTANCE_FIELD,
00074 double resolution = DEFAULT_RESOLUTION,
00075 double collision_tolerance = DEFAULT_COLLISION_TOLERANCE,
00076 double max_propogation_distance = DEFAULT_MAX_PROPOGATION_DISTANCE, double padding = 0.0,
00077 double scale = 1.0);
00078
00079 CollisionRobotDistanceField(const CollisionRobotDistanceField& other);
00080
00081 void initialize(const std::map<std::string, std::vector<CollisionSphere> >& link_body_decompositions,
00082 const Eigen::Vector3d& size, const Eigen::Vector3d& origin, bool use_signed_distance_field,
00083 double resolution, double collision_tolerance, double max_propogation_distance);
00084
00085 virtual void checkSelfCollision(const collision_detection::CollisionRequest& req,
00086 collision_detection::CollisionResult& res,
00087 const moveit::core::RobotState& state) const;
00088
00089 void checkSelfCollision(const collision_detection::CollisionRequest& req, collision_detection::CollisionResult& res,
00090 const moveit::core::RobotState& state,
00091 boost::shared_ptr<GroupStateRepresentation>& gsr) const;
00092
00093 virtual void checkSelfCollision(const collision_detection::CollisionRequest& req,
00094 collision_detection::CollisionResult& res, const moveit::core::RobotState& state,
00095 const collision_detection::AllowedCollisionMatrix& acm) const;
00096
00097 void checkSelfCollision(const collision_detection::CollisionRequest& req, collision_detection::CollisionResult& res,
00098 const moveit::core::RobotState& state, const collision_detection::AllowedCollisionMatrix& acm,
00099 boost::shared_ptr<GroupStateRepresentation>& gsr) const;
00100
00101 virtual void checkSelfCollision(const collision_detection::CollisionRequest& req,
00102 collision_detection::CollisionResult& res, const moveit::core::RobotState& state1,
00103 const moveit::core::RobotState& state2) const
00104 {
00105 logWarn("Not implemented");
00106 };
00107
00108 virtual void checkSelfCollision(const collision_detection::CollisionRequest& req,
00109 collision_detection::CollisionResult& res, const moveit::core::RobotState& state1,
00110 const moveit::core::RobotState& state2,
00111 const collision_detection::AllowedCollisionMatrix& acm) const
00112 {
00113 logWarn("Not implemented");
00114 };
00115
00116 virtual void checkOtherCollision(const collision_detection::CollisionRequest& req,
00117 collision_detection::CollisionResult& res, const moveit::core::RobotState& state,
00118 const CollisionRobot& other_robot, const moveit::core::RobotState& other_state) const
00119 {
00120 logWarn("Not implemented");
00121 };
00122
00123 virtual void checkOtherCollision(const collision_detection::CollisionRequest& req,
00124 collision_detection::CollisionResult& res, const moveit::core::RobotState& state,
00125 const CollisionRobot& other_robot, const moveit::core::RobotState& other_state,
00126 const collision_detection::AllowedCollisionMatrix& acm) const
00127 {
00128 logWarn("Not implemented");
00129 };
00130
00131 virtual void checkOtherCollision(const collision_detection::CollisionRequest& req,
00132 collision_detection::CollisionResult& res, const moveit::core::RobotState& state1,
00133 const moveit::core::RobotState& state2, const CollisionRobot& other_robot,
00134 const moveit::core::RobotState& other_state1,
00135 const moveit::core::RobotState& other_state2) const
00136 {
00137 logWarn("Not implemented");
00138 };
00139
00140 virtual void checkOtherCollision(const collision_detection::CollisionRequest& req,
00141 collision_detection::CollisionResult& res, const moveit::core::RobotState& state1,
00142 const moveit::core::RobotState& state2, const CollisionRobot& other_robot,
00143 const moveit::core::RobotState& other_state1,
00144 const moveit::core::RobotState& other_state2,
00145 const collision_detection::AllowedCollisionMatrix& acm) const
00146 {
00147 logWarn("Not implemented");
00148 };
00149
00150 void createCollisionModelMarker(const moveit::core::RobotState& state,
00151 visualization_msgs::MarkerArray& model_markers) const;
00152
00153 virtual double distanceSelf(const moveit::core::RobotState& state) const
00154 {
00155 return 0.0;
00156 };
00157 virtual double distanceSelf(const moveit::core::RobotState& state,
00158 const collision_detection::AllowedCollisionMatrix& acm) const
00159 {
00160 return 0.0;
00161 };
00162 virtual double distanceOther(const moveit::core::RobotState& state, const CollisionRobot& other_robot,
00163 const moveit::core::RobotState& other_state) const
00164 {
00165 return 0.0;
00166 };
00167 virtual double distanceOther(const moveit::core::RobotState& state, const CollisionRobot& other_robot,
00168 const moveit::core::RobotState& other_state,
00169 const collision_detection::AllowedCollisionMatrix& acm) const
00170 {
00171 return 0.0;
00172 };
00173
00174 boost::shared_ptr<const DistanceFieldCacheEntry> getLastDistanceFieldEntry() const
00175 {
00176 return distance_field_cache_entry_;
00177 }
00178
00179
00180
00181
00182
00183
00184
00185
00186 protected:
00187 bool getSelfProximityGradients(boost::shared_ptr<GroupStateRepresentation>& gsr) const;
00188
00189 bool getIntraGroupProximityGradients(boost::shared_ptr<GroupStateRepresentation>& gsr) const;
00190
00191 bool getSelfCollisions(const collision_detection::CollisionRequest& req, collision_detection::CollisionResult& res,
00192 boost::shared_ptr<GroupStateRepresentation>& gsr) const;
00193
00194 bool getIntraGroupCollisions(const collision_detection::CollisionRequest& req,
00195 collision_detection::CollisionResult& res,
00196 boost::shared_ptr<GroupStateRepresentation>& gsr) const;
00197
00198 void checkSelfCollisionHelper(const collision_detection::CollisionRequest& req,
00199 collision_detection::CollisionResult& res, const moveit::core::RobotState& state,
00200 const collision_detection::AllowedCollisionMatrix* acm,
00201 boost::shared_ptr<GroupStateRepresentation>& gsr) const;
00202
00203 void updateGroupStateRepresentationState(const moveit::core::RobotState& state,
00204 boost::shared_ptr<GroupStateRepresentation>& gsr) const;
00205
00206 void generateCollisionCheckingStructures(const std::string& group_name, const moveit::core::RobotState& state,
00207 const collision_detection::AllowedCollisionMatrix* acm,
00208 boost::shared_ptr<GroupStateRepresentation>& gsr,
00209 bool generate_distance_field) const;
00210
00211 boost::shared_ptr<const DistanceFieldCacheEntry>
00212 getDistanceFieldCacheEntry(const std::string& group_name, const moveit::core::RobotState& state,
00213 const collision_detection::AllowedCollisionMatrix* acm) const;
00214
00215 boost::shared_ptr<DistanceFieldCacheEntry> generateDistanceFieldCacheEntry(
00216 const std::string& group_name, const moveit::core::RobotState& state,
00217 const collision_detection::AllowedCollisionMatrix* acm, bool generate_distance_field) const;
00218
00219 void addLinkBodyDecompositions(double resolution);
00220
00221 void addLinkBodyDecompositions(double resolution,
00222 const std::map<std::string, std::vector<CollisionSphere> >& link_body_decompositions);
00223
00224 PosedBodySphereDecompositionPtr getPosedLinkBodySphereDecomposition(const moveit::core::LinkModel* ls,
00225 unsigned int ind) const;
00226
00227 PosedBodyPointDecompositionPtr getPosedLinkBodyPointDecomposition(const moveit::core::LinkModel* ls) const;
00228
00229 void getGroupStateRepresentation(const boost::shared_ptr<const DistanceFieldCacheEntry>& dfce,
00230 const moveit::core::RobotState& state,
00231 boost::shared_ptr<GroupStateRepresentation>& gsr) const;
00232
00233 bool compareCacheEntryToState(const boost::shared_ptr<const DistanceFieldCacheEntry>& dfce,
00234 const moveit::core::RobotState& state) const;
00235
00236 bool compareCacheEntryToAllowedCollisionMatrix(const boost::shared_ptr<const DistanceFieldCacheEntry>& dfce,
00237 const collision_detection::AllowedCollisionMatrix& acm) const;
00238
00239 virtual void updatedPaddingOrScaling(const std::vector<std::string>& links){};
00240
00241 Eigen::Vector3d size_;
00242 Eigen::Vector3d origin_;
00243 bool use_signed_distance_field_;
00244 double resolution_;
00245 double collision_tolerance_;
00246 double max_propogation_distance_;
00247
00248 std::vector<BodyDecompositionConstPtr> link_body_decomposition_vector_;
00249 std::map<std::string, unsigned int> link_body_decomposition_index_map_;
00250
00251 mutable boost::mutex update_cache_lock_;
00252 boost::shared_ptr<DistanceFieldCacheEntry> distance_field_cache_entry_;
00253 std::map<std::string, std::map<std::string, bool> > in_group_update_map_;
00254 std::map<std::string, boost::shared_ptr<GroupStateRepresentation> > pregenerated_group_state_representation_map_;
00255
00256 planning_scene::PlanningScenePtr planning_scene_;
00257 };
00258 }
00259
00260 #endif