|
2 | 2 |
|
3 | 3 | ## Purpose
|
4 | 4 |
|
5 |
| -The `ground_segmentation` is a node that filters the ground points from the input pointcloud. |
| 5 | +The `ground_segmentation` is a node that remove the ground points from the input pointcloud. |
6 | 6 |
|
7 | 7 | ## Inner-workings / Algorithms
|
8 | 8 |
|
9 |
| -### Ransac Ground Filter |
| 9 | +Detail description of each ground segmentation algorithm is in the following links. |
10 | 10 |
|
11 |
| -This algorithm is SAC-based ground segmentation. |
12 |
| - |
13 |
| -See: <https://pcl.readthedocs.io/projects/tutorials/en/latest/planar_segmentation.html> |
14 |
| - |
15 |
| -### Ray Ground Filter |
16 |
| - |
17 |
| -This algorithm is deprecated in current architecture. |
18 |
| - |
19 |
| -### Scan Ground Filter |
20 |
| - |
21 |
| -This algorithm works by following steps, |
22 |
| - |
23 |
| -1. Divide whole pointclouds into groups by horizontal angle and sort by xy-distance. |
24 |
| -2. Check the distance and vertical angle of the point one by one. |
25 |
| -3. Set a center of the ground contact point of the rear or front wheels as the initial point. |
26 |
| -4. Check vertical angle between the points. If the angle from the initial point is larger than "global_slope_max", the point is classified as "no ground". |
27 |
| -5. If the angle from the previous point is larger than "local_max_slope", the point is classified as "no ground". |
28 |
| -6. Otherwise the point is labeled as "ground point". |
29 |
| -7. If the distance from the last checked point is close, ignore any vertical angle and set current point attribute to the same as the last point. |
| 11 | +| Filter Name | Description | Detail | |
| 12 | +| -------------------- | ---------------------------------------------------------------------------------------------------------- | ------------------------------------ | |
| 13 | +| ray_ground_filter | A method of removing the ground based on the geometrical relationship between points lined up on radiation | [link](docs/ray-ground-filter.md) | |
| 14 | +| scan_ground_filter | Almost the same method as `ray_ground_filter`, but with slightly improved performance | [link](docs/scan-ground-filter.md) | |
| 15 | +| ransac_ground_filter | A method of removing the ground by approximating the ground to a plane | [link](docs/ransac-ground-filter.md) | |
30 | 16 |
|
31 | 17 | ## Inputs / Outputs
|
32 | 18 |
|
33 | 19 | ### Input
|
34 | 20 |
|
35 |
| -| Name | Type | Description | |
36 |
| -| -------- | -------------------------- | --------------------------- | |
37 |
| -| `~input` | `sensor_msgs::PointCloud2` | outlier filtered pointcloud | |
| 21 | +| Name | Type | Description | |
| 22 | +| ----------------- | ------------------------------- | ----------------- | |
| 23 | +| `~/input/points` | `sensor_msgs::msg::PointCloud2` | reference points | |
| 24 | +| `~/input/indices` | `pcl_msgs::msg::Indices` | reference indices | |
38 | 25 |
|
39 | 26 | ### Output
|
40 | 27 |
|
41 |
| -| Name | Type | Description | |
42 |
| -| --------- | -------------------------- | -------------------- | |
43 |
| -| `~output` | `sensor_msgs::PointCloud2` | no ground pointcloud | |
| 28 | +| Name | Type | Description | |
| 29 | +| ----------------- | ------------------------------- | --------------- | |
| 30 | +| `~/output/points` | `sensor_msgs::msg::PointCloud2` | filtered points | |
44 | 31 |
|
45 | 32 | ## Parameters
|
46 | 33 |
|
47 |
| -### Ransac Ground Filter |
48 |
| - |
49 |
| -#### Core Parameters |
50 |
| - |
51 |
| -| Name | Type | Default Value | Description | |
52 |
| -| ----------------------- | ------ | ------------- | --------------------------------------------------------------- | |
53 |
| -| `base_frame` | string | "base_link" | base_link frame | |
54 |
| -| `unit_axis` | string | "z" | The axis which we need to search ground plane | |
55 |
| -| `max_iterations` | int | 1000 | The maximum number of iterations | |
56 |
| -| `outlier_threshold` | double | 0.01 | The distance threshold to the model [m] | |
57 |
| -| `plane_slope_threshold` | double | 10.0 | The slope threshold to prevent mis-fitting [deg] | |
58 |
| -| `voxel_size_x` | double | 0.04 | voxel size x [m] | |
59 |
| -| `voxel_size_y` | double | 0.04 | voxel size y [m] | |
60 |
| -| `voxel_size_z` | double | 0.04 | voxel size z [m] | |
61 |
| -| `height_threshold` | double | 0.01 | The height threshold from ground plane for no ground points [m] | |
62 |
| -| `debug` | bool | false | whether to output debug information | |
63 |
| - |
64 |
| -### Scan Ground Filter |
65 |
| - |
66 |
| -#### Core Parameters |
67 |
| - |
68 |
| -| Name | Type | Default Value | Description | |
69 |
| -| --------------------------------- | ------ | ------------- | ----------------------------------------------------------------------------- | |
70 |
| -| `base_frame` | string | "base_link" | base_link frame | |
71 |
| -| `global_slope_max` | double | 8.0 | The global angle to classify as the ground or object [deg] | |
72 |
| -| `local_max_slope` | double | 6.0 | The local angle to classify as the ground or object [deg] | |
73 |
| -| `radial_divider_angle` | double | 1.0 | The angle which divide the whole pointcloud to sliced group [deg] | |
74 |
| -| `split_points_distance_tolerance` | double | 0.2 | The xy-distance threshold to to distinguishing far and near [m] | |
75 |
| -| `split_height_distance` | double | 0.2 | The height threshold to distinguishing far and near [m] | |
76 |
| -| `use_virtual_ground_point` | bool | true | whether to use the ground center of front wheels as the virtual ground point. | |
77 |
| - |
78 |
| -## Assumptions / Known limits |
| 34 | +### Node Parameters |
79 | 35 |
|
80 |
| -## (Optional) Error detection and handling |
| 36 | +| Name | Type | Default Value | Description | |
| 37 | +| ------------------ | ------ | ------------- | ------------------------------------- | |
| 38 | +| `input_frame` | string | " " | input frame id | |
| 39 | +| `output_frame` | string | " " | output frame id | |
| 40 | +| `max_queue_size` | int | 5 | max queue size of input/output topics | |
| 41 | +| `use_indices` | bool | false | flag to use pointcloud indices | |
| 42 | +| `latched_indices` | bool | false | flag to latch pointcloud indices | |
| 43 | +| `approximate_sync` | bool | false | flag to use approximate sync option | |
81 | 44 |
|
82 |
| -## (Optional) Performance characterization |
| 45 | +## Assumptions / Known limits |
83 | 46 |
|
84 |
| -## (Optional) References/External links |
| 47 | +`pointcloud_preprocessor::Filter` is implemented based on pcl_perception [1] because of [this issue](https://github.com/ros-perception/perception_pcl/issues/9). |
85 | 48 |
|
86 |
| -## (Optional) Future extensions / Unimplemented parts |
| 49 | +## References/External links |
87 | 50 |
|
88 |
| -- Horizontal check for classification is not implemented yet. |
89 |
| -- Output ground visibility for diagnostic is not implemented yet. |
| 51 | +[1] <https://github.com/ros-perception/perception_pcl/blob/ros2/pcl_ros/src/pcl_ros/filters/filter.cpp> |
0 commit comments