collision_octomap_mesh_unit.hpp
Go to the documentation of this file.
1 #ifndef TESSERACT_COLLISION_COLLISION_OCTOMAP_MESH_UNIT_HPP
2 #define TESSERACT_COLLISION_COLLISION_OCTOMAP_MESH_UNIT_HPP
3 
6 #include <octomap/octomap.h>
7 #include <console_bridge/console.h>
10 
15 
17 {
18 namespace detail
19 {
20 inline void addCollisionObjects(DiscreteContactManager& checker)
21 {
23  // Add Octomap
26  std::string path = locator.locateResource("package://tesseract_support/meshes/box_2m.bt")->getFilePath();
27  auto ot = std::make_shared<octomap::OcTree>(path);
28  CollisionShapePtr dense_octomap =
29  std::make_shared<tesseract_geometry::Octree>(ot, tesseract_geometry::OctreeSubType::BOX);
30  Eigen::Isometry3d octomap_pose;
31  octomap_pose.setIdentity();
32 
33  CollisionShapesConst obj1_shapes;
35  obj1_shapes.push_back(dense_octomap);
36  obj1_poses.push_back(octomap_pose);
37 
38  checker.addCollisionObject("octomap_link", 0, obj1_shapes, obj1_poses);
39 
41  // Add plane mesh to checker.
43  CollisionShapePtr sphere = tesseract_geometry::createMeshFromPath<tesseract_geometry::Mesh>(
44  locator.locateResource("package://tesseract_support/meshes/plane_4m.stl")->getFilePath(),
45  Eigen::Vector3d(1, 1, 1),
46  true)[0];
47 
48  Eigen::Isometry3d sphere_pose;
49  sphere_pose.setIdentity();
50 
51  CollisionShapesConst obj2_shapes;
53  obj2_shapes.push_back(sphere);
54  obj2_poses.push_back(sphere_pose);
55 
56  checker.addCollisionObject("plane_link", 0, obj2_shapes, obj2_poses);
57 
58  EXPECT_TRUE(checker.getCollisionObjects().size() == 2);
59  for (const auto& co : checker.getCollisionObjects())
60  {
61  EXPECT_TRUE(checker.getCollisionObjectGeometries(co).size() == 1);
62  EXPECT_TRUE(checker.getCollisionObjectGeometriesTransforms(co).size() == 1);
63  for (const auto& cgt : checker.getCollisionObjectGeometriesTransforms(co))
64  {
65  EXPECT_TRUE(cgt.isApprox(Eigen::Isometry3d::Identity(), 1e-5));
66  }
67  }
68 }
69 } // namespace detail
70 
71 inline void runTest(DiscreteContactManager& checker, const std::string& file_path)
72 {
73  // Add collision object
75 
76  // Call it again to test adding same object
78 
80  // Test when object is in collision
82  std::vector<std::string> active_links{ "octomap_link", "plane_link" };
83  checker.setActiveCollisionObjects(active_links);
84  std::vector<std::string> check_active_links = checker.getActiveCollisionObjects();
85  EXPECT_TRUE(tesseract_common::isIdentical<std::string>(active_links, check_active_links, false));
86 
87  EXPECT_TRUE(checker.getContactAllowedValidator() == nullptr);
88 
91 
92  checker.setCollisionMarginPair("octomap_link", "plane_link", 0.1);
93 
94  // Set the collision object transforms
96  location["octomap_link"] = Eigen::Isometry3d::Identity();
97  location["plane_link"] = Eigen::Isometry3d::Identity();
98  location["plane_link"].translation() = Eigen::Vector3d(0, 0, 0);
99  checker.setCollisionObjectsTransform(location);
100 
101  // Perform collision check
102  ContactResultMap result;
104 
105  ContactResultVector result_vector;
106  result.flattenMoveResults(result_vector);
107 
109  const auto& mesh = std::static_pointer_cast<const tesseract_geometry::Mesh>(geom.at(0));
110  const auto& mesh_vertices = mesh->getVertices();
111  const auto& mesh_triangles = mesh->getFaces();
112 
113  // default color is green
114  std::vector<Eigen::Vector3i> mesh_vertices_color(mesh_vertices->size(), Eigen::Vector3i(0, 128, 0));
115 
116  for (auto& r : result_vector)
117  {
118  int idx = 0;
119  if (r.link_names[0] != "plane_link")
120  idx = 1;
121 
122  mesh_vertices_color[static_cast<std::size_t>(
123  (*mesh_triangles)[4 * r.subshape_id[static_cast<std::size_t>(idx)] + 1])] = Eigen::Vector3i(255, 0, 0);
124  mesh_vertices_color[static_cast<std::size_t>(
125  (*mesh_triangles)[4 * r.subshape_id[static_cast<std::size_t>(idx)] + 2])] = Eigen::Vector3i(255, 0, 0);
126  mesh_vertices_color[static_cast<std::size_t>(
127  (*mesh_triangles)[4 * r.subshape_id[static_cast<std::size_t>(idx)] + 3])] = Eigen::Vector3i(255, 0, 0);
128  }
129 
130  writeSimplePlyFile(file_path, *mesh_vertices, mesh_vertices_color, *mesh_triangles, mesh->getFaceCount());
131 
132  EXPECT_TRUE(!result_vector.empty());
133  EXPECT_TRUE(result_vector.size() == 2712);
134 }
135 } // namespace tesseract_collision::test_suite
136 
137 #endif // TESSERACT_COLLISION_COLLISION_OCTOMAP_MESH_UNIT_HPP
tesseract_common::VectorIsometry3d
AlignedVector< Eigen::Isometry3d > VectorIsometry3d
tesseract_collision::DiscreteContactManager::setCollisionMarginPair
virtual void setCollisionMarginPair(const std::string &name1, const std::string &name2, double collision_margin)=0
Set the margin for a given contact pair.
tesseract_common::CollisionMarginData::getMaxCollisionMargin
double getMaxCollisionMargin() const
mesh_parser.h
tesseract_collision::DiscreteContactManager::getActiveCollisionObjects
virtual const std::vector< std::string > & getActiveCollisionObjects() const =0
Get which collision objects can move.
tesseract_collision::DiscreteContactManager::setCollisionMarginData
virtual void setCollisionMarginData(CollisionMarginData collision_margin_data)=0
Set the contact distance threshold.
tesseract_collision::test_suite::detail::addCollisionObjects
void addCollisionObjects(ContinuousContactManager &checker)
Definition: collision_box_box_cast_unit.hpp:11
resource_locator.h
tesseract_common::TransformMap
AlignedMap< std::string, Eigen::Isometry3d > TransformMap
discrete_contact_manager.h
This is the discrete contact manager base class.
TESSERACT_COMMON_IGNORE_WARNINGS_PUSH
#define TESSERACT_COMMON_IGNORE_WARNINGS_PUSH
tesseract_collision::ContactResultVector
tesseract_common::AlignedVector< ContactResult > ContactResultVector
Definition: types.h:136
tesseract_collision::DiscreteContactManager::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::DiscreteContactManager
Definition: discrete_contact_manager.h:41
EXPECT_TRUE
#define EXPECT_TRUE(args)
tesseract_collision::ContactResultMap::flattenMoveResults
void flattenMoveResults(ContactResultVector &v)
Definition: types.cpp:270
geometries.h
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::DiscreteContactManager::contactTest
virtual void contactTest(ContactResultMap &collisions, const ContactRequest &request)=0
Perform a contact test for all objects based.
tesseract_collision::DiscreteContactManager::setCollisionObjectsTransform
virtual void setCollisionObjectsTransform(const std::string &name, const Eigen::Isometry3d &pose)=0
Set a single collision object's transforms.
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
r
S r
TESSERACT_COMMON_IGNORE_WARNINGS_POP
Definition: create_convex_hull.cpp:37
tesseract_common::GeneralResourceLocator::locateResource
std::shared_ptr< Resource > locateResource(const std::string &url) const override
common.h
This is a collection of common methods.
tesseract_collision::test_suite::runTest
void runTest(ContinuousContactManager &checker)
Definition: collision_box_box_cast_unit.hpp:111
tesseract_collision::DiscreteContactManager::setActiveCollisionObjects
virtual void setActiveCollisionObjects(const std::vector< std::string > &names)=0
Set which collision objects can move.
octomap.h
tesseract_common::GeneralResourceLocator
tesseract_collision::DiscreteContactManager::getCollisionObjectGeometries
virtual const CollisionShapesConst & getCollisionObjectGeometries(const std::string &name) const =0
Get a collision objects collision geometries.
tesseract_collision::DiscreteContactManager::getCollisionMarginData
virtual const CollisionMarginData & getCollisionMarginData() const =0
Get the contact distance threshold.
macros.h
tesseract_collision::ContactTestType::ALL
@ ALL
tesseract_collision::ContactRequest
The ContactRequest struct.
Definition: types.h:300
tesseract_collision::writeSimplePlyFile
bool writeSimplePlyFile(const std::string &path, const tesseract_common::VectorVector3d &vertices, const std::vector< Eigen::Vector3i > &vectices_color, const Eigen::VectorXi &faces, int num_faces)
Write a simple ply file given vertices and faces.
Definition: common.cpp:174
tesseract_geometry::OctreeSubType::BOX
@ BOX
tesseract_collision::CollisionMarginData
tesseract_common::CollisionMarginData CollisionMarginData
Definition: types.h:52


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