This package was designed to remove simple geometric shapes from pointclouds. E.g. A cube or a sphere. Several of these filters can be applied to a pointcloud in one shot. For more details on the types of filters and their parameters see Filters.
This package includes a full node and a ros interface for one's own node. For more details about the node, like topic names and parameters, see Node.
The package can handle three different input types of pointclouds:
Additionaly the input data can be throttled to reduce the cpu load.
|"~/in_cloud"||sensor_msgs/PointCloud2||Input as new pointcloud type.|
|"~/in_cloud_old"||sensor_msgs/PointCloud||Input as old pointloud type. Will be converted to new pointcloud type.|
|"~/in_laser"||sensor_msgs/LaserScan||Input as single laser scan. Will be converted to new pointcloud type by package "laser_geometry".|
|"~/out_cloud"||sensor_msgs/PointCloud2||Output of filtering node.|
All topics can be remapped using parameters (see below).
|"~/filter"||pcdfilter_pa/PcdFilterPaCloud||Forced filtering via service call. No throttling is done and input/output cloud is part of service message.|
|"~/add_filters"||pcdfilter_pa/PcdFilterPaFilter||Adding new filters. Old filters are kept.|
|"~/change_filters"||pcdfilter_pa/PcdFilterPaFilter||Adding new filters, but removing all old filters before adding.|
|"~/enable"||std_srvs/Empty||Disables this node. This also disconnects the node from all input messages.|
|"~/disable"||std_srvs/Empty||Enables this node.|
|"~/filters"||vector of strings||All pointcloud filters as an array of strings.|
|"~/skip_count"||integer||Input throttling. Number of skipped messages after each processed message.|
|"~/skip_time"||double||Input throttling. Time intervall in seconds. After each processed message, this intervall starts and all input messages will be skipped.|
|"~/tf_lookup_time"||double||Maximum time in seconds for waiting for a specific TF transform.|
|"~/buffer_pointcloud"||bool||Flag for buffering the last received pointcloud. This can be used to test different filters without resending the some pointcloud.|
|"~/debugging"||bool||Flag for enabling extented output.|
|"~/enabled"||bool||Flag for setting start up behaviour. Indicates if node is filtering at startup, or not.|
|"~/laser_nan_replacement_value"||double||If a nan-value is represented within the laser scan, it might indicate "no obstacle within range". Therefore this parameters will replace those values with a fixed number.|
|"~/topic_in_cloud"||string||Name of input topic for new pointclouds.|
|"~/topic_in_cloud_old"||string||Name of input topic for old pointclouds.|
|"~/topic_in_laser"||string||Name of input topic for laser scans.|
|"~/topic_out_cloud"||string||Name of output topic for filtered pointcloud.|
See also this config file. It contains all parameters and their default value.
This is the definition of every single filter as a string.
|"" (none)||normal behaviour; points within the volume will be filtered out; all points outside will be kept|
|"!"||reversed behaviour; points within the volume will be kept; all points outside will be filtered out|
|Type||Description||Nr Parameters||Nr TF ids|
|"cube"||specified by its sidelength||1 parameter||1 TF|
|"sphere"||specified by its radius||1 parameter||1 TF|
|"block"||cuboid specified by its three sidelengths in x,y and z direction||3 parameters||1 TF|
|"cylinder"||specified by its radius and its height||2 parameters||1 TF|
|"link"||cylinder centered around the two given tfs; specified by its radius and its overshoot||2 parameters||2 TF|
|"cone"||cone headed at fist tf and pointing to second tf; specified by its height and its ratio (radius/height)||2 parameters||2 TF|
|":"||current filter is required; if some tf is missing the whole filtering is aborted and no output pointcloud is generated|
|"?"||current filter may be skipped; if some tf is missing then the current filter is not applied; but in any case the whole filtering and output process is continued|
To control how long the filter should wait for the necessary tf there exists a parameter "~/tf_lookup_time" - see also Node.
Number of dimensions depends on the type of the current filter(see above). At least one dimension is always needed, e.g. for a cube. Three dimensions must be set for a cuboid. \ Each dimension is a single number seperated by spaces.
ROS frame id for the filtered objects.
This allows for an additional offset relative to the given frame id. Order of parameters:
x y z qx qy qz qw
Missing parameters will be set to "0". If qw is not set then it will be set to
sqrt(1 - qx^2 - qy^2 - qz^2)
Only valid for type "link" and "cone".
For description see above (tf and tf_offset).
Every character following '#' is ignored. This can be used to give a short comment.
Filters every point within the following cube - the cube is removed from the pointcloud. \ The sidelength is 3 [meters]. \ The center is aligned with TF frame "base_footprint". \ Corners will be at [+/-1.5 , +/- 1.5, +/- 1.5].
Only points within sphere will stay.
The center of sphere is aligned with TF frame "map".
The radius is 2.3 [meters] and the diameter is 4.6 [meters].
Removes every point within the cuboid.
One corner of the cuboid is at center of TF frame "base_link".
This is due to the additional offset of [0.5, 1 1.5].
Two opposite corners are at [0, 0, 0] and [1, 2, 3].
Removes every point within the cylinder, which is attached to both TF frames. \ The center of the top and bottom surface is exactly at origin of one frame (zero overshoot). \ The radius is 0.2 [meters]. \ The height depends only the relative position of the two frames. \ Also the orientation of the cylinder is not fixed to any frame.
Removes every point outside the cone. \ The top of cone will be at the origin of the TF frame "laser" and the centerline will go straight through the origin of the TF frame "pan_tilt_tilt_link". \ The height is 10 [meters]. \ The angle at the top is 90 degrees (ratio of radius to height is 1:1).
|Indigo||EOL April 2019||docs.ros.org/indigo|
|Jade||EOL May 2017||docs.ros.org/jade|
|Lunar||EOL May 2019||docs.ros.org/lunar|