As of PDAL v2.6.0, the ground command is marked as DEPRECATED. It will be removed from the default install in PDAL v2.7 and removed completely in PDAL v2.8.

The basic pipeline detailed in the kernel is given below in JSON.

        "type": "filters.assign",
        "value": "Classification=0"
        "type": "filters.outlier"
        "type": "filters.smrf",
        "window": 18.0,
        "threshold": 0.5,
        "slope": 0.15,
        "cell": 1.0,
        "cut": 0.0,
        "scalar": 1.25,
        "returns": "last, only"
        "type": "filters.expression",
        "expression": "Classification==2"

Written programmatically in Python, as shown below, resetting of Classification labels, denoising, and extraction of ground returns only can all be conditionally included.

pipeline = pdal.Reader("input.laz").pipeline()
if reset:
    pipeline |= pdal.Filter.assign(value="Classification=0")
if denoise:
    pipeline |= pdal.Filter.outlier()
pipeline |= pdal.Filter.smrf(window=18.0,
                             returns="last, only")
if extract:
    pipeline |= pdal.Filter.expression(expression="Classification==2")
pipeline |= pdal.Writer("output.laz")

The ground command is used to segment the input point cloud into ground versus non-ground returns using filters.smrf and filters.outlier.

$ pdal ground [options] <input> <output>
--input, -i         Input filename
--output, -o        Output filename
--max_window_size   Max window size
--slope             Slope
--max_distance      Max distance
--initial_distance  Initial distance
--cell_size         Cell size
--extract           Extract ground returns?
--reset             Reset classifications prior to segmenting?
--denoise           Apply statistical outlier removal prior to segmenting?
--returns           Include last returns?
--scalar            Elevation scalar?
--threshold         Elevation threshold?
--cut               Cut net size?
--ignore            A range query to ignore when processing