convex_decomposition_hacd.cpp
Go to the documentation of this file.
3 #include <console_bridge/console.h>
4 #include <bullet/HACD/hacdCircularList.h>
5 #include <bullet/HACD/hacdGraph.h>
6 #include <bullet/HACD/hacdHACD.h>
7 #include <bullet/HACD/hacdICHull.h>
8 #include <bullet/HACD/hacdVector.h>
10 
14 
15 namespace tesseract_collision
16 {
18 
19 std::vector<tesseract_geometry::ConvexMesh::Ptr>
20 ConvexDecompositionHACD::compute(const tesseract_common::VectorVector3d& vertices, const Eigen::VectorXi& faces) const
21 {
22  params_.print();
23 
24  std::vector<HACD::Vec3<HACD::Real>> points_local;
25  points_local.reserve(vertices.size());
26  for (const auto& v : vertices)
27  {
28  points_local.emplace_back(v.x(), v.y(), v.z());
29  }
30 
31  std::vector<HACD::Vec3<long>> triangles_local;
32  triangles_local.reserve(static_cast<std::size_t>(faces.size()) / 4);
33  for (Eigen::Index i = 0; i < faces.rows();)
34  {
35  int face_vertice_cnt = faces(i++);
36  if (face_vertice_cnt != 3)
37  throw std::runtime_error("Currently only supports triangle meshes");
38 
39  HACD::Vec3<long> triangle;
40  // triangle[0] = faces(i++);
41  // triangle[1] = faces(i++);
42  // triangle[2] = faces(i++);
43  triangles_local.push_back(triangle);
44  }
45 
46  // run HACD
47  HACD::HACD my_hacd;
48  my_hacd.SetPoints(&points_local[0]);
49  my_hacd.SetNPoints(points_local.size());
50  my_hacd.SetTriangles(&triangles_local[0]);
51  my_hacd.SetNTriangles(triangles_local.size());
52  my_hacd.SetCompacityWeight(params_.compacity_weight);
53  my_hacd.SetVolumeWeight(params_.volume_weight);
54  my_hacd.SetNClusters(params_.min_num_clusters);
55  my_hacd.SetNVerticesPerCH(params_.max_num_vertices_per_ch);
56  my_hacd.SetConcavity(params_.concavity);
57  my_hacd.SetAddExtraDistPoints(params_.add_extra_dist_points);
58  my_hacd.SetAddNeighboursDistPoints(params_.add_neighbours_dist_points);
59  my_hacd.SetAddFacesPoints(params_.add_faces_points);
60 
61  bool res = my_hacd.Compute();
62 
63  std::vector<tesseract_geometry::ConvexMesh::Ptr> output;
64  if (res)
65  {
66  std::size_t num_convex_hulls = my_hacd.GetNClusters();
67  CONSOLE_BRIDGE_logError("Convex decomposition generated %lu convex hulls!", num_convex_hulls);
68 
69  for (unsigned int p = 0; p < num_convex_hulls; ++p)
70  {
71  // generate convex result
72  size_t num_points = my_hacd.GetNPointsCH(p);
73  size_t num_triangles = my_hacd.GetNTrianglesCH(p);
74 
75  std::vector<HACD::Vec3<HACD::Real>> points_ch(num_points);
76  std::vector<HACD::Vec3<long>> triangles_ch(num_triangles);
77  my_hacd.GetCH(p, &points_ch[0], &triangles_ch[0]);
78 
79  // points
80  auto hacd_vertices = std::make_shared<tesseract_common::VectorVector3d>();
81  hacd_vertices->reserve(num_points);
82  for (size_t v = 0; v < num_points; v++)
83  {
84  Eigen::Vector3d vert(points_ch[v].X(), points_ch[v].Y(), points_ch[v].Z());
85  hacd_vertices->push_back(vert);
86  }
87 
88  auto ch_vertices = std::make_shared<tesseract_common::VectorVector3d>();
89  auto ch_faces = std::make_shared<Eigen::VectorXi>();
90  int ch_num_faces = createConvexHull(*ch_vertices, *ch_faces, *hacd_vertices);
91  output.push_back(std::make_shared<tesseract_geometry::ConvexMesh>(ch_vertices, ch_faces, ch_num_faces));
92  }
93  }
94  else
95  {
96  CONSOLE_BRIDGE_logError("Decomposition cancelled by user!");
97  }
98 
99  return output;
100 }
101 
103 {
104  std::stringstream msg;
105  msg << "+ Parameters\n";
106  msg << "\t compacity_weight " << compacity_weight << "\n";
107  msg << "\t volume_weight " << volume_weight << "\n";
108  msg << "\t max. concavity " << concavity << "\n";
109  msg << "\t min number of clusters " << min_num_clusters << "\n";
110  msg << "\t add extra dist points " << ((add_extra_dist_points) ? "true" : "false") << "\n";
111  msg << "\t add neighbours dist points " << ((add_neighbours_dist_points) ? "true" : "false") << "\n";
112  msg << "\t add faces points " << ((add_faces_points) ? "true" : "false") << "\n";
113 
114  std::cout << msg.str();
115 }
116 
117 } // namespace tesseract_collision
tesseract_collision::HACDParameters::max_num_vertices_per_ch
uint32_t max_num_vertices_per_ch
Definition: convex_decomposition_hacd.h:39
tesseract_collision::ConvexDecompositionHACD::compute
std::vector< std::shared_ptr< tesseract_geometry::ConvexMesh > > compute(const tesseract_common::VectorVector3d &vertices, const Eigen::VectorXi &faces) const override
Run convex decomposition algorithm.
Definition: convex_decomposition_hacd.cpp:20
tesseract_collision::HACDParameters::add_neighbours_dist_points
bool add_neighbours_dist_points
Definition: convex_decomposition_hacd.h:42
tesseract_collision::createConvexHull
int createConvexHull(tesseract_common::VectorVector3d &vertices, Eigen::VectorXi &faces, const tesseract_common::VectorVector3d &input, double shrink=-1, double shrinkClamp=-1)
Create a convex hull from vertices using Bullet Convex Hull Computer.
Definition: convex_hull_utils.cpp:37
tesseract_collision::HACDParameters::print
void print() const
Definition: convex_decomposition_hacd.cpp:102
TESSERACT_COMMON_IGNORE_WARNINGS_PUSH
#define TESSERACT_COMMON_IGNORE_WARNINGS_PUSH
convex_hull_utils.h
This is a collection of common methods.
tesseract_collision::HACDParameters
Definition: convex_decomposition_hacd.h:34
tesseract_collision::HACDParameters::concavity
double concavity
Definition: convex_decomposition_hacd.h:38
tesseract_collision::HACDParameters::compacity_weight
double compacity_weight
Definition: convex_decomposition_hacd.h:36
tesseract_collision::HACDParameters::add_faces_points
bool add_faces_points
Definition: convex_decomposition_hacd.h:43
tesseract_common::VectorVector3d
std::vector< Eigen::Vector3d > VectorVector3d
TESSERACT_COMMON_IGNORE_WARNINGS_POP
Definition: create_convex_hull.cpp:37
convex_decomposition_hacd.h
Convex decomposition HACD implementation.
common.h
This is a collection of common methods.
tesseract_collision::ConvexDecompositionHACD::ConvexDecompositionHACD
ConvexDecompositionHACD()=default
tesseract_collision::HACDParameters::volume_weight
double volume_weight
Definition: convex_decomposition_hacd.h:37
tesseract_collision
Definition: bullet_cast_bvh_manager.h:48
macros.h
tesseract_collision::ConvexDecompositionHACD::params_
HACDParameters params_
Definition: convex_decomposition_hacd.h:61
tesseract_collision::HACDParameters::min_num_clusters
uint32_t min_num_clusters
Definition: convex_decomposition_hacd.h:40
tesseract_collision::HACDParameters::add_extra_dist_points
bool add_extra_dist_points
Definition: convex_decomposition_hacd.h:41


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