trajopt
 All Classes Namespaces Files Functions Variables Typedefs Pages
collision_checker.hpp
1 #pragma once
2 #include "typedefs.hpp"
3 #include <set>
4 #include <utility>
5 #include <iostream>
6 #include <openrave/openrave.h>
7 #include "configuration_space.hpp"
8 #include "macros.h"
9 
10 namespace trajopt {
11 
12 enum CastCollisionType {
13  CCType_None,
14  CCType_Time0,
15  CCType_Time1,
16  CCType_Between
17 };
18 
19 struct Collision {
20  const OR::KinBody::Link* linkA;
21  const OR::KinBody::Link* linkB;
22  OR::Vector ptA, ptB, normalB2A; /* normal points from 2 to 1 */
23  OR::Vector ptB1;
24  double distance; /* pt1 = pt2 + normal*dist */
25  float weight, time;
26  CastCollisionType cctype;
27  Collision(const KinBody::Link* linkA, const KinBody::Link* linkB, const OR::Vector& ptA, const OR::Vector& ptB, const OR::Vector& normalB2A, double distance, float weight=1, float time=0) :
28  linkA(linkA), linkB(linkB), ptA(ptA), ptB(ptB), normalB2A(normalB2A), distance(distance), weight(weight), time(0), cctype(CCType_None) {}
29 };
30 TRAJOPT_API std::ostream& operator<<(std::ostream&, const Collision&);
31 
32 enum CollisionFilterGroups {
33  RobotFilter = 1,
34  KinBodyFilter = 2,
35 };
36 
40 class TRAJOPT_API CollisionChecker : public OR::UserData {
41 public:
42 
44  virtual void AllVsAll(vector<Collision>& collisions)=0;
46  virtual void LinkVsAll(const KinBody::Link& link, vector<Collision>& collisions, short filterMask)=0;
47  virtual void LinksVsAll(const vector<KinBody::LinkPtr>& links, vector<Collision>& collisions, short filterMask)=0;
48 
50  void BodyVsAll(const KinBody& body, vector<Collision>& collisions, short filterMask=-1) {
51  LinksVsAll(body.GetLinks(), collisions, filterMask);
52  }
54  virtual void SetContactDistance(float distance) = 0;
55  virtual double GetContactDistance() = 0;
56 
57  virtual void PlotCollisionGeometry(vector<OpenRAVE::GraphHandlePtr>&) {throw std::runtime_error("not implemented");}
58 
59  virtual void ContinuousCheckTrajectory(const TrajArray& traj, Configuration& rad, vector<Collision>& collisions) {throw std::runtime_error("not implemented");}
60 
62  virtual void CastVsAll(Configuration& rad, const vector<KinBody::LinkPtr>& links, const DblVec& startjoints, const DblVec& endjoints, vector<Collision>& collisions) {throw std::runtime_error("not implemented");}
63 
65  void IgnoreZeroStateSelfCollisions();
66  void IgnoreZeroStateSelfCollisions(OpenRAVE::KinBodyPtr body);
67 
69  virtual void ExcludeCollisionPair(const KinBody::Link& link0, const KinBody::Link& link1) = 0;
70 
71 
72  OpenRAVE::EnvironmentBaseConstPtr GetEnv() {return m_env;}
73 
74  virtual ~CollisionChecker() {}
76  static boost::shared_ptr<CollisionChecker> GetOrCreate(OR::EnvironmentBase& env);
77 protected:
78  CollisionChecker(OpenRAVE::EnvironmentBaseConstPtr env) : m_env(env) {}
79  OpenRAVE::EnvironmentBaseConstPtr m_env;
80 };
81 typedef boost::shared_ptr<CollisionChecker> CollisionCheckerPtr;
82 
83 CollisionCheckerPtr TRAJOPT_API CreateCollisionChecker(OR::EnvironmentBaseConstPtr env);
84 
85 TRAJOPT_API void PlotCollisions(const std::vector<Collision>& collisions, OR::EnvironmentBase& env, vector<OR::GraphHandlePtr>& handles, double safe_dist);
86 
87 }
88