The repository package is named bb_filters.
Two APIs are available:
ClusterTfActionandClusterTfSrvsample transforms from TF and broadcast a stable output transform.ClusterPosesActionandClusterPosesSrvcluster pose topics directly and returnClusterPoseResultArray.
Both use spatial clustering to reject outliers before selecting a stable result.
- Use simulated time when clustering simulated messages or transforms.
- A TF clustering request needs a live broadcaster for every input child
frame. Repeated
LookupExceptionerrors normally mean the upstream pose estimator is not publishing.
We implement separate cluster poses nodes to:
- Control time alignment explicitly. We can ensure each detected pose is paired with an odometry sample within a chosen tolerance, rather than relying on latest available transforms.
- Produce physically meaningful clustering inputs. Each data point corresponds to a real detection event transformed using the odometry state at approximately the same time, rather than "virtual" points created by mixing a detection at time t1 with odometry at time t2. (When clustering transforms, you may feed in multiple copies of the same detection transformed with different odometry readings.)
- Achieve higher efficiency from not having to subscribe to a (potentially) high frequency dynamic transforms topic
/tfand not having to usetflookups. (But this is balanced out by the overhead from managing the time synchronization ourselves instead of using atf2_ros.Buffer.)