collision_box_box_cast_unit.hpp
Go to the documentation of this file.
1 #ifndef TESSERACT_COLLISION_COLLISION_BOX_BOX_CAST_UNIT_H
2 #define TESSERACT_COLLISION_COLLISION_BOX_BOX_CAST_UNIT_H
3 
6 
8 {
9 namespace detail
10 {
12 {
14  // Add static box to checker
16  CollisionShapePtr static_box = std::make_shared<tesseract_geometry::Box>(1, 1, 1);
17  Eigen::Isometry3d static_box_pose;
18  static_box_pose.setIdentity();
19 
20  CollisionShapesConst obj1_shapes;
22  obj1_shapes.push_back(static_box);
23  obj1_poses.push_back(static_box_pose);
24 
25  checker.addCollisionObject("static_box_link", 0, obj1_shapes, obj1_poses, false);
26  checker.enableCollisionObject("static_box_link");
27 
29  // Add thin box to checker which is disabled
31  CollisionShapePtr thin_box = std::make_shared<tesseract_geometry::Box>(0.1, 1, 1);
32  Eigen::Isometry3d thin_box_pose;
33  thin_box_pose.setIdentity();
34 
35  CollisionShapesConst obj2_shapes;
37  obj2_shapes.push_back(thin_box);
38  obj2_poses.push_back(thin_box_pose);
39 
40  checker.addCollisionObject("thin_box_link", 0, obj2_shapes, obj2_poses);
41  checker.disableCollisionObject("thin_box_link");
42 
44  // Add static box to checker
46  CollisionShapePtr moving_box = std::make_shared<tesseract_geometry::Box>(0.25, 0.25, 0.25);
47  Eigen::Isometry3d moving_box_pose;
48  moving_box_pose.setIdentity();
49  moving_box_pose.translation() = Eigen::Vector3d(0.5, -0.5, 0);
50 
51  CollisionShapesConst obj3_shapes;
53  obj3_shapes.push_back(moving_box);
54  obj3_poses.push_back(moving_box_pose);
55 
56  checker.addCollisionObject("moving_box_link", 0, obj3_shapes, obj3_poses);
57 
59  // Add box and remove
61  CollisionShapePtr remove_box = std::make_shared<tesseract_geometry::Box>(0.1, 1, 1);
62  Eigen::Isometry3d remove_box_pose;
63  remove_box_pose.setIdentity();
64 
65  CollisionShapesConst obj4_shapes;
67  obj4_shapes.push_back(remove_box);
68  obj4_poses.push_back(remove_box_pose);
69 
70  checker.addCollisionObject("remove_box_link", 0, obj4_shapes, obj4_poses);
71  EXPECT_TRUE(checker.getCollisionObjects().size() == 4);
72  EXPECT_TRUE(checker.hasCollisionObject("remove_box_link"));
73  checker.removeCollisionObject("remove_box_link");
74  EXPECT_FALSE(checker.hasCollisionObject("remove_box_link"));
75 
77  // Try functions on a link that does not exist
79  EXPECT_FALSE(checker.removeCollisionObject("link_does_not_exist"));
80  EXPECT_FALSE(checker.enableCollisionObject("link_does_not_exist"));
81  EXPECT_FALSE(checker.disableCollisionObject("link_does_not_exist"));
82 
84  // Try to add empty Collision Object
88 
90  // Check sizes
92  EXPECT_TRUE(checker.getCollisionObjects().size() == 3);
93  const auto& co = checker.getCollisionObjects();
94  for (std::size_t i = 0; i < co.size(); ++i)
95  {
96  EXPECT_TRUE(checker.getCollisionObjectGeometries(co[i]).size() == 1);
97  EXPECT_TRUE(checker.getCollisionObjectGeometriesTransforms(co[i]).size() == 1);
98  const auto& cgt = checker.getCollisionObjectGeometriesTransforms(co[i]);
99  if (i != 2)
100  {
101  EXPECT_TRUE(cgt[0].isApprox(Eigen::Isometry3d::Identity(), 1e-5));
102  }
103  else
104  {
105  EXPECT_TRUE(cgt[0].isApprox(moving_box_pose, 1e-5));
106  }
107  }
108 }
109 } // namespace detail
110 
111 inline void runTest(ContinuousContactManager& checker)
112 {
113  // Check name which should not be empty
114  EXPECT_FALSE(checker.getName().empty());
115 
116  // Add collision objects
118 
119  // Call it again to test adding same object
121 
123  // Test when object is inside another
125  checker.setActiveCollisionObjects({ "moving_box_link", "static_box_link" });
126 
127  std::vector<std::string> active_links{ "moving_box_link" };
128  checker.setActiveCollisionObjects(active_links);
129  std::vector<std::string> check_active_links = checker.getActiveCollisionObjects();
130  EXPECT_TRUE(tesseract_common::isIdentical<std::string>(active_links, check_active_links, false));
131 
132  EXPECT_TRUE(checker.getContactAllowedValidator() == nullptr);
133 
134  checker.setDefaultCollisionMargin(0.1);
136 
137  // Set the collision object transforms
138  std::vector<std::string> names = { "static_box_link" };
139  tesseract_common::VectorIsometry3d transforms = { Eigen::Isometry3d::Identity() };
140  checker.setCollisionObjectsTransform(names, transforms);
141 
142  tesseract_common::VectorIsometry3d start_poses, end_poses;
143  Eigen::Isometry3d start_pos, end_pos;
144  start_pos.setIdentity();
145  start_pos.translation()(0) = -1.9;
146  start_pos.translation()(1) = 0.0;
147  end_pos.setIdentity();
148  end_pos.translation()(0) = 1.9;
149  end_pos.translation()(1) = 3.8;
150  start_poses.push_back(start_pos);
151  end_poses.push_back(end_pos);
152  checker.setCollisionObjectsTransform({ "moving_box_link" }, start_poses, end_poses);
153 
154  std::vector<ContactTestType> test_types = { ContactTestType::ALL, ContactTestType::CLOSEST, ContactTestType::FIRST };
155 
156  // Perform collision check
157  for (const auto& t : test_types)
158  {
159  ContactResultMap result;
160  checker.contactTest(result, ContactRequest(t));
161 
162  ContactResultVector result_vector;
163  result.flattenMoveResults(result_vector);
164 
165  EXPECT_TRUE(!result_vector.empty());
166  EXPECT_NEAR(result_vector[0].distance, -0.2475, 0.001);
167  EXPECT_NEAR(result_vector[0].cc_time[0], -1.0, 0.001);
168  EXPECT_NEAR(result_vector[0].cc_time[1], 0.25, 0.001);
169  EXPECT_TRUE(result_vector[0].cc_type[0] == ContinuousCollisionType::CCType_None);
170  EXPECT_TRUE(result_vector[0].cc_type[1] == ContinuousCollisionType::CCType_Between);
171 
172  EXPECT_NEAR(result_vector[0].nearest_points[0][0], -0.5, 0.001);
173  EXPECT_NEAR(result_vector[0].nearest_points[0][1], 0.5, 0.001);
174  EXPECT_NEAR(result_vector[0].nearest_points[0][2], 0.0, 0.001);
175 
176  EXPECT_NEAR(result_vector[0].nearest_points[1][0], -0.325, 0.001);
177  EXPECT_NEAR(result_vector[0].nearest_points[1][1], 0.325, 0.001);
178  EXPECT_NEAR(result_vector[0].nearest_points[1][2], 0.0, 0.001);
179 
180  Eigen::Vector3d p0 = result_vector[0].transform[1] * result_vector[0].nearest_points_local[1];
181  EXPECT_NEAR(p0[0], -1.275, 0.001);
182  EXPECT_NEAR(p0[1], -0.625, 0.001);
183  EXPECT_NEAR(p0[2], 0.0, 0.001);
184 
185  Eigen::Vector3d p1 = result_vector[0].cc_transform[1] * result_vector[0].nearest_points_local[1];
186  EXPECT_NEAR(p1[0], 2.525, 0.001);
187  EXPECT_NEAR(p1[1], 3.175, 0.001);
188  EXPECT_NEAR(p1[2], 0.0, 0.001);
189  }
190 }
191 } // namespace tesseract_collision::test_suite
192 
193 #endif // TESSERACT_COLLISION_COLLISION_BOX_BOX_CAST_UNIT_H
tesseract_common::VectorIsometry3d
AlignedVector< Eigen::Isometry3d > VectorIsometry3d
tesseract_common::CollisionMarginData::getMaxCollisionMargin
double getMaxCollisionMargin() const
tesseract_collision::test_suite::detail::addCollisionObjects
void addCollisionObjects(ContinuousContactManager &checker)
Definition: collision_box_box_cast_unit.hpp:11
tesseract_collision::ContinuousContactManager::getCollisionObjectGeometries
virtual const CollisionShapesConst & getCollisionObjectGeometries(const std::string &name) const =0
Get a collision objects collision geometries.
tesseract_collision::ContinuousContactManager::getContactAllowedValidator
virtual std::shared_ptr< const tesseract_common::ContactAllowedValidator > getContactAllowedValidator() const =0
Get the active function for determining if two links are allowed to be in collision.
tesseract_collision::ContinuousContactManager::getActiveCollisionObjects
virtual const std::vector< std::string > & getActiveCollisionObjects() const =0
Get which collision objects can move.
tesseract_collision::ContinuousContactManager::removeCollisionObject
virtual bool removeCollisionObject(const std::string &name)=0
Remove an object from the checker.
tesseract_collision::ContactResultVector
tesseract_common::AlignedVector< ContactResult > ContactResultVector
Definition: types.h:136
EXPECT_TRUE
#define EXPECT_TRUE(args)
tesseract_collision::ContactResultMap::flattenMoveResults
void flattenMoveResults(ContactResultVector &v)
Definition: types.cpp:270
geometries.h
tesseract_collision::ContinuousCollisionType::CCType_Between
@ CCType_Between
tesseract_collision::ContinuousContactManager
Definition: continuous_contact_manager.h:41
tesseract_collision::test_suite
Definition: large_dataset_benchmarks.hpp:17
tesseract_collision::ContactResultMap
This structure hold contact results for link pairs.
Definition: types.h:155
EXPECT_NEAR
#define EXPECT_NEAR(a, b, prec)
tesseract_collision::ContinuousContactManager::getCollisionObjects
virtual const std::vector< std::string > & getCollisionObjects() const =0
Get all collision objects.
tesseract_collision::ContinuousCollisionType::CCType_None
@ CCType_None
tesseract_collision::ContinuousContactManager::addCollisionObject
virtual bool addCollisionObject(const std::string &name, const int &mask_id, const CollisionShapesConst &shapes, const tesseract_common::VectorIsometry3d &shape_poses, bool enabled=true)=0
Add a collision object to the checker.
tesseract_collision::ContinuousContactManager::disableCollisionObject
virtual bool disableCollisionObject(const std::string &name)=0
Disable an object.
tesseract_collision::ContinuousContactManager::setCollisionObjectsTransform
virtual void setCollisionObjectsTransform(const std::string &name, const Eigen::Isometry3d &pose)=0
Set a single static collision object's tansforms.
tesseract_collision::CollisionShapePtr
std::shared_ptr< tesseract_geometry::Geometry > CollisionShapePtr
Definition: types.h:50
tesseract_collision::CollisionShapesConst
std::vector< CollisionShapeConstPtr > CollisionShapesConst
Definition: types.h:51
tesseract_collision::ContinuousContactManager::hasCollisionObject
virtual bool hasCollisionObject(const std::string &name) const =0
Find if a collision object already exists.
tesseract_collision::ContinuousContactManager::getName
virtual std::string getName() const =0
Get the name of the contact manager.
distance
template void distance(DistanceTraversalNodeBase< double > *node, BVHFrontList *front_list, int qsize)
tesseract_collision::ContinuousContactManager::getCollisionObjectGeometriesTransforms
virtual const tesseract_common::VectorIsometry3d & getCollisionObjectGeometriesTransforms(const std::string &name) const =0
Get a collision objects collision geometries transforms.
tesseract_collision::ContinuousContactManager::enableCollisionObject
virtual bool enableCollisionObject(const std::string &name)=0
Enable an object.
tesseract_collision::ContactTestType::FIRST
@ FIRST
tesseract_collision::test_suite::runTest
void runTest(ContinuousContactManager &checker)
Definition: collision_box_box_cast_unit.hpp:111
tesseract_collision::ContinuousContactManager::setDefaultCollisionMargin
virtual void setDefaultCollisionMargin(double default_collision_margin)=0
Set the default collision margin.
tesseract_collision::ContinuousContactManager::contactTest
virtual void contactTest(ContactResultMap &collisions, const ContactRequest &request)=0
Perform a contact test for all objects based.
tesseract_collision::ContactTestType::ALL
@ ALL
tesseract_collision::ContactRequest
The ContactRequest struct.
Definition: types.h:300
tesseract_collision::ContinuousContactManager::setActiveCollisionObjects
virtual void setActiveCollisionObjects(const std::vector< std::string > &names)=0
Set which collision objects can move.
EXPECT_FALSE
#define EXPECT_FALSE(args)
continuous_contact_manager.h
This is the continuous contact manager base class.
tesseract_collision::ContinuousContactManager::getCollisionMarginData
virtual const CollisionMarginData & getCollisionMarginData() const =0
Get the contact distance threshold.
tesseract_collision::ContactTestType::CLOSEST
@ CLOSEST


tesseract_collision
Author(s): Levi Armstrong
autogenerated on Sun May 18 2025 03:01:52