Tesseract
Motion Planning Environment
Loading...
Searching...
No Matches
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{
9namespace 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 thin_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
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" };
129 std::vector<std::string> check_active_links = checker.getActiveCollisionObjects();
131
132 EXPECT_TRUE(checker.getIsContactAllowedFn() == nullptr);
133
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
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);
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
This structure hold contact results for link pairs.
Definition: types.h:154
void flattenMoveResults(ContactResultVector &v)
Definition: types.cpp:215
Definition: continuous_contact_manager.h:41
virtual void setActiveCollisionObjects(const std::vector< std::string > &names)=0
Set which collision objects can move.
virtual const std::vector< std::string > & getCollisionObjects() const =0
Get all collision objects.
virtual void setDefaultCollisionMarginData(double default_collision_margin)=0
Set the default collision margin.
virtual bool hasCollisionObject(const std::string &name) const =0
Find if a collision object already exists.
virtual void setCollisionObjectsTransform(const std::string &name, const Eigen::Isometry3d &pose)=0
Set a single static collision object's tansforms.
virtual std::string getName() const =0
Get the name of the contact manager.
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.
virtual const CollisionShapesConst & getCollisionObjectGeometries(const std::string &name) const =0
Get a collision objects collision geometries.
virtual bool disableCollisionObject(const std::string &name)=0
Disable an object.
virtual bool removeCollisionObject(const std::string &name)=0
Remove an object from the checker.
virtual const std::vector< std::string > & getActiveCollisionObjects() const =0
Get which collision objects can move.
virtual bool enableCollisionObject(const std::string &name)=0
Enable an object.
virtual const tesseract_common::VectorIsometry3d & getCollisionObjectGeometriesTransforms(const std::string &name) const =0
Get a collision objects collision geometries transforms.
virtual const CollisionMarginData & getCollisionMarginData() const =0
Get the contact distance threshold.
virtual IsContactAllowedFn getIsContactAllowedFn() const =0
Get the active function for determining if two links are allowed to be in collision.
virtual void contactTest(ContactResultMap &collisions, const ContactRequest &request)=0
Perform a contact test for all objects based.
double getMaxCollisionMargin() const
Get the largest collision margin.
Definition: collision_margin_data.h:165
EXPECT_NEAR(config.contact_manager_config.margin_data.getDefaultCollisionMargin(), 5, 1e-6)
tesseract_collision::ContactResultVector result_vector
Definition: collision_core_unit.cpp:410
results distance
Definition: collision_core_unit.cpp:139
results cc_type[0]
Definition: collision_core_unit.cpp:157
results cc_time[0]
Definition: collision_core_unit.cpp:155
EXPECT_FALSE(tesseract_collision::isContactAllowed("base_link", "link_2", acm, false))
results nearest_points[0]
Definition: collision_core_unit.cpp:140
EXPECT_TRUE(tesseract_common::isIdentical< tesseract_collision::ObjectPairKey >(pairs, check_pairs, false))
This is the continuous contact manager base class.
Tesseract Geometries.
void addCollisionObjects(ContinuousContactManager &checker)
Definition: collision_box_box_cast_unit.hpp:11
Definition: large_dataset_benchmarks.hpp:17
void runTest(ContinuousContactManager &checker)
Definition: collision_box_box_cast_unit.hpp:111
tesseract_geometry::Geometry::Ptr CollisionShapePtr
Definition: types.h:49
std::vector< tesseract_geometry::Geometry::ConstPtr > CollisionShapesConst
Definition: types.h:47
tesseract_common::AlignedVector< ContactResult > ContactResultVector
Definition: types.h:134
template bool isIdentical< std::string >(const std::vector< std::string > &, const std::vector< std::string > &, bool, const std::function< bool(const std::string &, const std::string &)> &, const std::function< bool(const std::string &, const std::string &)> &)
AlignedVector< Eigen::Isometry3d > VectorIsometry3d
Definition: types.h:62
The ContactRequest struct.
Definition: types.h:294
std::vector< std::string > active_links
Definition: tesseract_environment_collision.cpp:112