Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

WIP: Add Axis-Aligned Bounding Box option to Plane-Slicer Planner #123

Open
wants to merge 76 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 8 commits
Commits
Show all changes
76 commits
Select commit Hold shift + click to select a range
812f52e
Add Axis-Aligned Bounding Box option to Plane-Slicer Planner
DavidMerzJr Dec 11, 2020
4e32857
Clang fixes and PlaneSlicerConfig Serialization
DavidMerzJr Dec 14, 2020
4e5c022
implemented simple max_edge_segment function
steviedale Dec 9, 2020
a52ac5a
added max_segment_length msg params
steviedale Dec 17, 2020
12181b3
fixed lenth->length typo and made splitSegments turn off for max_segm…
steviedale Dec 18, 2020
40551b3
added generate_extra_rasters capability to the plane slicer raster pl…
drchrislewis Jan 15, 2021
54dffd5
clang format
drchrislewis Jan 15, 2021
7dd640d
Merge pull request #2 from drchrislewis/generate_extra_rasters
DavidMerzJr Jan 19, 2021
0a88246
inprogress, but rebasing
drchrislewis Jan 19, 2021
8693919
first compile of bug fix for raster across holes switching directions…
drchrislewis Jan 22, 2021
08c6a00
Fix plane slicer axes for vertical parts and offsets for first slice
Jan 22, 2021
3ac6cf9
reordered, but now all returned rasters flow in same order. TODO, add…
drchrislewis Jan 25, 2021
308194e
added function to reverse odd rasters, and a config to enable/disable…
drchrislewis Jan 25, 2021
f804f23
clang
drchrislewis Jan 25, 2021
4ffd272
removed some code between if(0)
drchrislewis Jan 25, 2021
14746af
minor changes to catch zero length cases
drchrislewis Jan 26, 2021
acf9da4
minor improvement
drchrislewis Jan 26, 2021
37ccd05
clang
drchrislewis Jan 26, 2021
80d33a4
Merge pull request #3 from drchrislewis/reorder_planeslice_segs
DavidMerzJr Jan 26, 2021
7b03eae
Update cmake_common_scripts to ros_industrial_cmake_boilerplate
Jan 27, 2021
5d0911f
Merge pull request #4 from Levi-Armstrong/feature/axis-aligned-boundi…
DavidMerzJr Jan 28, 2021
c698b1c
fixed bug in utility to add extra raster
Feb 10, 2021
4999eae
first compile no testing yet
drchrislewis Apr 9, 2021
d76613e
implemented segmentByAxes
steviedale Apr 16, 2021
9f8c123
added testing script (should probably delete this before merging)
steviedale Apr 16, 2021
327acf9
addingExtraWaypoints is now working under gtest examples
drchrislewis Apr 20, 2021
f58ccca
updated segmentByAxes with major axis detection
steviedale Apr 22, 2021
2b1527f
added gtest unit test for segmentByAxes, viz not working and needs mo…
steviedale Apr 23, 2021
bf3547d
updated addWaypoints to prefer the original over the shifted. This pr…
drchrislewis Apr 28, 2021
6bee60f
modified prunning to use dot product as method.
drchrislewis Apr 29, 2021
4ccb86a
replaces splitSegements() with segmentByAxes() in edge generators
steviedale Apr 29, 2021
725267d
modified conditions for adding extra waypoints. This should eliminate…
drchrislewis May 4, 2021
d423984
fixed a few bugs in addExtraWaypoints, added a test that loads a mesh…
drchrislewis May 5, 2021
d8ab78e
edge path points are condsidered in a centroid frame to improve behavior
May 6, 2021
e3bc666
removed debug data structure
May 6, 2021
694c15a
Merge pull request #2 from colin-lewis-19/feature/segment_by_axes
steviedale May 6, 2021
510511a
refactored segementByAxes to splitByAxes
steviedale May 6, 2021
2b26ffa
Merge pull request #5 from drchrislewis/addExtraWaypoints
DavidMerzJr May 12, 2021
793fdb4
Reset Value in Utest
DavidMerzJr May 12, 2021
2320237
Merge branch 'feature/axis-aligned-bounding-box' into feature/segment…
DavidMerzJr May 12, 2021
2861348
Fix specification of raster direction to be more consistent
DavidMerzJr May 3, 2021
f28beac
Fix repeated uses causing changes in behavior
DavidMerzJr May 3, 2021
a3bea86
Fix Vector Math
DavidMerzJr May 4, 2021
734f27c
Fix Strange Deflection when Specifying Raster Direction Directly
DavidMerzJr May 12, 2021
f805353
Appease Clang and Fixup Unit Test
DavidMerzJr May 12, 2021
9ef7316
Merge pull request #7 from DavidMerzJr/fix/raster-direction-specifica…
DavidMerzJr May 12, 2021
7b64064
Merge branch 'feature/axis-aligned-bounding-box' into feature/segment…
DavidMerzJr May 12, 2021
d845ba5
removed test node
steviedale May 12, 2021
e9671a0
fixed fail cases
steviedale May 12, 2021
3688fa4
removed unused dependency from CMakeLists.txt
steviedale May 12, 2021
78b6fc2
support for splitting ToolPath objects with multiple ToolPathSegment …
steviedale May 12, 2021
01bec84
Merge pull request #6 from steviedale/feature/segment_by_axes
DavidMerzJr May 20, 2021
ef6fa61
Trying to Correct Malformed Post-Filtering Meshes
DavidMerzJr Oct 25, 2021
49837e1
reinstated a heat_raster interface and made a few minor simplifying c…
drchrislewis May 27, 2021
8cc8584
clang tidy
drchrislewis May 27, 2021
b79f539
added call to smoother and a utility function to generate interleaved…
drchrislewis Jun 28, 2021
6419c78
added search_radius to service so that we average the normals over so…
drchrislewis Jun 29, 2021
ef05d02
fixed quite a few bugs in the plane slicer. These caused crashes. Thi…
drchrislewis Jul 9, 2021
b53758d
added parameters to service call to plane slicer for smoothing, and i…
drchrislewis Jul 13, 2021
8ea64ab
updated utilities to allow normal estimation using MLS
drchrislewis Jul 22, 2021
07e3f7f
updated method for setting x-direction of pose
drchrislewis Jul 23, 2021
caad679
added MLS normal estimation and other utility functions(e.g. compute …
drchrislewis Jul 28, 2021
d6a59f1
removed include file no longer necessary
drchrislewis Jul 29, 2021
189eef2
clang, removed unnecessary and complex if(), renamed a static functio…
drchrislewis Jul 29, 2021
224d6fb
text of error message corrected
drchrislewis Jul 29, 2021
4f0a139
Fixed extra raster_directions param that slipped through on rebase
marrts Feb 1, 2022
fdbf72e
Merge pull request #12 from marrts/smoothing_and_interleaving_rebase
DavidMerzJr Feb 1, 2022
74246a1
Fixed default raster direction to be zero vector rather than unit Y s…
marrts Feb 7, 2022
e41a18e
Merge pull request #13 from marrts/fix/raster_direction_default
DavidMerzJr Feb 8, 2022
5899b4d
Reorganizing and Missing Headers
DavidMerzJr Mar 8, 2022
41a65ae
Sequencer: Guard against disallowed front() back()
DavidMerzJr Mar 11, 2022
e751fc6
Added ability to hop inlets and peninsulas
marrts May 10, 2022
958d584
Clang formatting and renamed variables to be clearer
marrts May 10, 2022
f033397
Clarified param units and better infinite loop check
marrts May 10, 2022
6713141
Ensures monotonically decreasing toolpath sizes
marrts May 10, 2022
0135230
Merge pull request #14 from marrts/feature/peninsula_and_inlet_hopper
DavidMerzJr May 10, 2022
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions noether_msgs/msg/EigenValueEdgeGeneratorConfig.msg
Original file line number Diff line number Diff line change
Expand Up @@ -27,3 +27,6 @@ int32 max_intersecting_voxels

# Any two consecutive points with a shortest distance smaller than this value are merged
float64 merge_dist

# maximum segment length
float64 max_segment_length
3 changes: 3 additions & 0 deletions noether_msgs/msg/HalfedgeEdgeGeneratorConfig.msg
Original file line number Diff line number Diff line change
Expand Up @@ -20,3 +20,6 @@ int32 point_spacing_method

# Point distance parameter used in conjunction with the spacing method
float64 point_dist

# maximum segment length
float64 max_segment_length
24 changes: 18 additions & 6 deletions noether_msgs/msg/PlaneSlicerRasterGeneratorConfig.msg
Original file line number Diff line number Diff line change
@@ -1,6 +1,18 @@
float64 raster_spacing # Offset between two rasters
float64 point_spacing # Required spacing between path points
float64 raster_rot_offset # Specifies the direction of the raster path in radians
float64 min_segment_size # The minimum segment size to allow when finding intersections; small segments will be discarded
float64 min_hole_size # A path may pass over holes smaller than this, but must be broken when larger holes are encounterd.
float64 tool_offset # How far off the surface the tool needs to be
float64 raster_spacing # Offset between two rasters
float64 point_spacing # Required spacing between path points
float64 raster_rot_offset # Specifies the direction of the raster path in radians. Rotates about short dimension of bounding box.
float64 min_segment_size # The minimum segment size to allow when finding intersections; small segments will be discarded
float64 min_hole_size # A path may pass over holes smaller than this, but must be broken when larger holes are encounterd.
float64 tool_offset # How far off the surface the tool needs to be
bool generate_extra_rasters # Whether an extra raster stroke should be added to the beginning and end of the raster pattern
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This perhaps could be made to be num_of_extra_rasters so that more than one could be added if needed. Zero would be the default case

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is a good idea. thanks


# When set to TRUE: initial cuts are determined using an axis-aligned bounding box. (global axes)
# When set to FALSE: initial cuts are determined using an object-oriented bounding box and the
# principal axes of the part. (Note that ROS sets message fields to 0/False by default.)
bool raster_wrt_global_axes

# Normal of the cutting planes. Points from the first raster to the second raster, not the
# direction from the first point in one raster to the second point of the same raster. X is the
# longest direction of the bounding box, Z is the shortest, Y is middle, following right hand rule.
# If left as 0 (magnitude < 0.000001), defaults to [0,1,0], the mid direction of the bounding box.
geometry_msgs/Vector3 raster_direction
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,8 @@ class EigenValueEdgeGenerator : public PathGenerator

double merge_dist =
0.01; /** @brief any two consecutive points with a shortest distance smaller than this value are merged */

double max_segment_length = 1.0; /** @brief maximum segment length */
};

EigenValueEdgeGenerator() = default;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,9 @@ class HalfedgeEdgeGenerator : public PathGenerator

/**@brief point distance parameter used in conjunction with the spacing method */
double point_dist = 0.01;

/** @brief maximum segment length */
double max_segment_length = 1.0;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What is this parameter used for in the Plane Slicer?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is in the halfedge edge generator header, which is used for generating edge paths. I assume based on the description that it is the max allows edge segment size. @drchrislewis Is this correct?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, this controls the maximum length of an edge segment. There are alternate parameters and methods for subdividing edges that may result in better performance, but each had corner cases that were more complex, so I went with the simplest method to get us going. For example, since exterior edges always start and end at the same point, we could simply sub-divide by some number whenever there was a circuit. It would be really nice to find the best places to subdivide rather than do it evenly. Again these are complex. One could also classify edges and horizontal-left, hor-rt, ver-up and vert-down. and break them up into 4. Once again this is complex to implement, but may be necessary for some applications/customers.

};

HalfedgeEdgeGenerator() = default;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
#include <vtkSmartPointer.h>
#include <vtkPolyData.h>
#include <boost/optional.hpp>
#include <Eigen/Dense>
#include <pcl/PolygonMesh.h>
#include <shape_msgs/Mesh.h>
#include <vtkCellLocator.h>
Expand All @@ -45,6 +46,8 @@ class PlaneSlicerRasterGenerator : public PathGenerator
static constexpr double DEFAULT_MIN_SEGMENT_SIZE = 0.01;
static constexpr double DEFAULT_SEARCH_RADIUS = 0.01;
static constexpr double DEFAULT_MIN_HOLE_SIZE = 1e-2;
static constexpr bool DEFAULT_RASTER_WRT_GLOBAL_AXES = false;
static constexpr bool DEFAULT_GENERATE_EXTRA_RASTERS = true;

public:
struct Config
Expand All @@ -55,7 +58,9 @@ class PlaneSlicerRasterGenerator : public PathGenerator
double min_segment_size{ DEFAULT_MIN_SEGMENT_SIZE };
double search_radius{ DEFAULT_SEARCH_RADIUS };
double min_hole_size{ DEFAULT_MIN_HOLE_SIZE };

bool raster_wrt_global_axes{ DEFAULT_RASTER_WRT_GLOBAL_AXES };
Eigen::Vector3d raster_direction{ Eigen::Vector3d::UnitY() };
bool generate_extra_rasters{ DEFAULT_GENERATE_EXTRA_RASTERS };
Json::Value toJson() const
{
Json::Value jv(Json::ValueType::objectValue);
Expand All @@ -65,6 +70,12 @@ class PlaneSlicerRasterGenerator : public PathGenerator
jv["min_segment_size"] = min_segment_size;
jv["search_radius"] = search_radius;
jv["min_hole_size"] = min_hole_size;
jv["raster_wrt_global_axes"] = raster_wrt_global_axes;
Json::Value raster_dir(Json::ValueType::objectValue);
raster_dir["x"] = raster_direction.x();
raster_dir["y"] = raster_direction.y();
raster_dir["z"] = raster_direction.z();
jv["raster_direction"] = raster_dir;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this will work, yaml might've been a better choice as it can directly casts to std vectors and maps


return jv;
}
Expand Down Expand Up @@ -100,6 +111,26 @@ class PlaneSlicerRasterGenerator : public PathGenerator
DEFAULT_SEARCH_RADIUS;
min_hole_size = validate(jv, "min_hole_size", Json::ValueType::realValue) ? jv["min_hole_size"].asDouble() :
DEFAULT_MIN_HOLE_SIZE;
raster_wrt_global_axes = validate(jv, "raster_wrt_global_axes", Json::ValueType::booleanValue) ?
jv["raster_wrt_global_axes"].asBool() :
DEFAULT_RASTER_WRT_GLOBAL_AXES;
if (jv["raster_direction"].isNull() || jv["raster_direction"].type() != Json::ValueType::objectValue)
{
ROS_ERROR("Malformed Raster Direction in Json value");
return false;
}
if (validate(jv["raster_direction"], "x", Json::ValueType::objectValue) &&
validate(jv["raster_direction"], "y", Json::ValueType::objectValue) &&
validate(jv["raster_direction"], "z", Json::ValueType::objectValue))
{
raster_direction.x() = jv["raster_direction"]["x"].asDouble();
raster_direction.y() = jv["raster_direction"]["y"].asDouble();
raster_direction.z() = jv["raster_direction"]["z"].asDouble();
}
else
{
raster_direction = Eigen::Vector3d::UnitY();
}
return true;
}

Expand All @@ -121,6 +152,11 @@ class PlaneSlicerRasterGenerator : public PathGenerator
ss << "raster_rot_offset: " << raster_rot_offset << std::endl;
ss << "min_segment_size: " << min_segment_size << std::endl;
ss << "search_radius: " << search_radius << std::endl;
ss << "raster_wrt_global_axes: " << raster_wrt_global_axes << std::endl;
ss << "raster_direction: " << std::endl;
ss << " x: " << raster_direction.x() << std::endl;
ss << " y: " << raster_direction.y() << std::endl;
ss << " z: " << raster_direction.z() << std::endl;
return ss.str();
}
};
Expand Down
5 changes: 5 additions & 0 deletions tool_path_planner/include/tool_path_planner/utilities.h
Original file line number Diff line number Diff line change
Expand Up @@ -118,6 +118,11 @@ static std::string getClassName()
return (status == 0) ? res.get() : mangled_name;
}

ToolPaths splitSegments(ToolPaths tool_paths, double max_segment_length);

// duplicates first and last segment of each toolpath in tool_paths offset by the offset distance
ToolPaths addExtraPaths(ToolPaths tool_paths, double offset_distance);

} // namespace tool_path_planner

#endif /* INCLUDE_TOOL_PATH_PLANNER_UTILITIES_H_ */
8 changes: 8 additions & 0 deletions tool_path_planner/src/eigen_value_edge_generator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -330,6 +330,14 @@ boost::optional<ToolPaths> EigenValueEdgeGenerator::generate()
edge_paths.push_back({ edge_segment });
}
}

if (config_.max_segment_length > 0)
{
edge_paths = tool_path_planner::splitSegments(edge_paths, config_.max_segment_length);
}

CONSOLE_BRIDGE_logInform("Found %lu valid edge segments", edge_paths.size());

return edge_paths;
}

Expand Down
6 changes: 6 additions & 0 deletions tool_path_planner/src/halfedge_edge_generator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -580,7 +580,13 @@ boost::optional<ToolPaths> HalfedgeEdgeGenerator::generate()
return boost::none;
}

if (config_.max_segment_length > 0)
{
edge_paths = tool_path_planner::splitSegments(edge_paths, config_.max_segment_length);
}

CONSOLE_BRIDGE_logInform("Found %lu valid edge segments", edge_paths.size());

return edge_paths;
}

Expand Down
59 changes: 50 additions & 9 deletions tool_path_planner/src/plane_slicer_raster_generator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -409,7 +409,6 @@ void PlaneSlicerRasterGenerator::setInput(vtkSmartPointer<vtkPolyData> mesh)
}
else
{
CONSOLE_BRIDGE_logWarn("%s generating normal data", getName().c_str());
vtkSmartPointer<vtkPolyDataNormals> normal_generator = vtkSmartPointer<vtkPolyDataNormals>::New();
normal_generator->SetInputData(mesh_data_);
normal_generator->ComputePointNormalsOn();
Expand Down Expand Up @@ -453,10 +452,43 @@ boost::optional<ToolPaths> PlaneSlicerRasterGenerator::generate()
{
CONSOLE_BRIDGE_logDebug("%s No mesh data has been provided", getName().c_str());
}
// computing mayor axis using oob
vtkSmartPointer<vtkOBBTree> oob = vtkSmartPointer<vtkOBBTree>::New();
Vector3d corner, x_dir, y_dir, z_dir, sizes; // x is longest, y is mid and z is smallest
oob->ComputeOBB(mesh_data_, corner.data(), x_dir.data(), y_dir.data(), z_dir.data(), sizes.data());
// Assign the longest axis of the bounding box to x, middle to y, and shortest to z.
Vector3d corner, x_dir, y_dir, z_dir, sizes;
if (config_.raster_wrt_global_axes)
{
// Determine extent of mesh along axes of current coordinate frame
VectorXd bounds(6);
std::vector<Vector3d> extents;
mesh_data_->GetBounds(bounds.data());
extents.push_back(Vector3d::UnitX() * (bounds[1] - bounds[0])); // Extent in x-direction of supplied mesh
// coordinate frame
extents.push_back(Vector3d::UnitY() * (bounds[3] - bounds[2])); // Extent in y-direction of supplied mesh
// coordinate frame
extents.push_back(Vector3d::UnitZ() * (bounds[5] - bounds[4])); // Extent in z-direction of supplied mesh
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It might be good to call cwise.abs() to ensure that the values of extends only have positive values even though theoretically it should always be positive

// coordinate frame

// find min and max magnitude.
int max = 0;
int min = 0;
for (std::size_t i = 1; i < extents.size(); ++i)
{
if (extents[max].squaredNorm() < extents[i].squaredNorm())
max = i;
else if (extents[min].squaredNorm() > extents[i].squaredNorm())
min = i;
}

// Assign the axes in order. Computing y saves comparisons and guarantees right-handedness.
x_dir = extents[max].normalized();
z_dir = extents[min].normalized();
y_dir = z_dir.cross(x_dir).normalized();
}
else
{
// computing major axes using oob and assign to x_dir, y_dir, z_dir
vtkSmartPointer<vtkOBBTree> oob = vtkSmartPointer<vtkOBBTree>::New();
oob->ComputeOBB(mesh_data_, corner.data(), x_dir.data(), y_dir.data(), z_dir.data(), sizes.data());
}

// Compute the center of mass
Vector3d origin;
Expand Down Expand Up @@ -492,10 +524,11 @@ boost::optional<ToolPaths> PlaneSlicerRasterGenerator::generate()
half_ext = sizes / 2.0;
center = Eigen::Vector3d(bounds[0], bounds[2], bounds[3]) + half_ext;

// now cutting the mesh with planes along the y axis
// @todo This should be calculated instead of being fixed along the y-axis
// Apply the rotation offset about the short direction (new Z axis) of the bounding box
Isometry3d rotation_offset = Isometry3d::Identity() * AngleAxisd(config_.raster_rot_offset, Vector3d::UnitZ());
Vector3d raster_dir = (rotation_offset * Vector3d::UnitY()).normalized();

// Calculate direction of raster strokes, rotated by the above-specified amount
Vector3d raster_dir = (rotation_offset * config_.raster_direction).normalized();
Copy link
Member

@jrgnicho jrgnicho Jan 19, 2021

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not sure what kind of results you would get if your raster_direction vector has more than one non-zero component or if it is (0, 0, 1)? Perhaps we should impose some restrictions on what values the raster_dir vector can take


// Calculate all 8 corners projected onto the raster direction vector
Eigen::VectorXd dist(8);
Expand Down Expand Up @@ -681,7 +714,15 @@ boost::optional<ToolPaths> PlaneSlicerRasterGenerator::generate()
}

// converting to poses msg now
rasters = convertToPoses(rasters_data_vec);
if (config_.generate_extra_rasters)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If generate_extra_rasters was an integer you could run a subsequent for loop that generates the requested number of "extra rasters"

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

TODO: make extra_rasters an unsigned integer, defaulted to zero, when non-zero, generate as many as requested

{
ToolPaths temp_rasters = convertToPoses(rasters_data_vec);
rasters = addExtraPaths(temp_rasters, config_.raster_spacing);
}
else
{
rasters = convertToPoses(rasters_data_vec);
}
return rasters;
}

Expand Down
6 changes: 5 additions & 1 deletion tool_path_planner/src/surface_walk_raster_generator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -496,7 +496,11 @@ int findClosestPoint(const std::vector<double>& pt, const std::vector<std::vecto
return index;
}

bool SurfaceWalkRasterGenerator::setConfiguration(const Config& config) { config_ = config; }
bool SurfaceWalkRasterGenerator::setConfiguration(const Config& config)
{
config_ = config;
return true;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good catch

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

newer compiler seems to flag these as errors

}

void SurfaceWalkRasterGenerator::setInput(pcl::PolygonMesh::ConstPtr mesh)
{
Expand Down
Loading