LiDAR Orbital
Debris Characterization
Detecting and characterizing space debris spin-rates using high-resolution point cloud analysis.
The Kessler Syndrome
With over 4,000 active satellites and countless fragments of defunct rockets in orbit, space debris poses a catastrophic risk to future missions. To capture or de-orbit this debris, we first need to know exactly how it is moving.
Our customer, Clean Space LLC, is developing a debris-capture mission and needed a way to measure a target's dimensions and rotational velocity before attempting to grapple it. LASER (LiDAR And Sensor Engineering Researchers) built a LiDAR-based system to derive those metrics and produce a 3D rendering of the debris for use in a subsequent capture mission.

Capturing a tumbling object requires precise knowledge of its rotational velocity (RPM) and physical dimensions. The LASER project utilizes LiDAR to derive these metrics in near real-time.
Hardware Architecture
The system integrates commercial off-the-shelf components with a custom-built, motorized test stand to create a cost-effective sensing and validation platform.
Intel RealSense L515 solid-state LiDAR camera capturing depth data at ~30 FPS.
Raspberry Pi 5 (8GB) + 512GB SSD handles data acquisition, .bag recording, and PLY conversion.
Custom plastic/steel/aluminum rig, adjustable rotation up to ~5 RPM, 12.07 × 26.6 cm base.
Fig. 9, Recording / Testing SetupPoint Cloud Processing
Raw LiDAR data is noisy. The pipeline runs rs-data-capture to record a 15-second .bag (~424 frames), then a custom ConversionScript.sh converts it to per-frame .ply + metadata.txt using the RealSense library.
Each frame is then filtered with Open3D: a dynamic Z-axis filter, statistical outlier removal, radius outlier removal, and Euclidean clustering isolate the object from background noise.
Fig. 7, Unfiltered PCD
Fig. 8, Filtered PCDdef get_plane_normal(pcd):
# Segment the largest plane using RANSAC
plane_model, inliers = pcd.segment_plane(
distance_threshold=0.01,
ransac_n=3,
num_iterations=1000
)
# Extract normal vector [a, b, c]
[a, b, c, d] = plane_model
normal_vector = np.array([a, b, c])
# Normalize
return normal_vector / np.linalg.norm(normal_vector)For dimensions, an oriented bounding box is fit to the filtered cloud, then scaled using a linear regression against known test distances:
For rotational velocity, the normal vector of the object's largest RANSAC-fit plane is tracked across consecutive frames, the change in phase angle (Δθ) over the change in timestamp (Δt) gives angular velocity, converted to RPM.
Fig. 20, Cleaned PCD FrameGround Truth & Validation
The test object's true dimensions were measured with a caliper (±0.002 cm): 15.134 × 11.307 × 2.540 cm (W × H × D). Its rotation was held constant at a measured 5.22 RPM, verified independently by filming the stand at 59.96 fps on an iPhone (±0.0083 RPM error).
Below is the cleaned point cloud of that same test object spinning at 5.22 RPM, rendered from the filtered .ply sequence.
// PCD animation, cleaned triangular test object spinning at 5.22 RPMMeasured vs. Truth
The requirements called for ≤5% dimension and RPM error at 90% likelihood. Across n=9–10 trials, the system met that bar on width but fell short on height, depth, and RPM, an honest result, not a polished one.
| METRIC | TRUTH | AVG DEVIATION | % ERROR | REQ. (≤5%) |
|---|---|---|---|---|
Width | 15.1 cm | 0.31 cm | ~2.1% | MET |
Height | 11.3 cm | 2.77 cm | ~24.5% | MISSED |
Depth | 2.54 cm | 0.41 cm | ~16.1% | MISSED |
RPM | 5.22 rpm | 0.70 rpm | ~13.4% | MISSED |
Width vs. Truth (n=10)
RPM vs. Truth (n=9)Width (measured off the object's widest, most consistently-visible face) held tightly to truth. Height and depth suffered from the test stand itself bleeding into the bounding box, and RPM estimation degraded sharply near edge-on frames where the tracked plane briefly vanished (see the raw per-frame spikes in Fig. 21).
Challenges & Future Work
3D-printing tolerances on the test object
Constant redesign of the stand legs
Achieving smooth, constant rotation
Motor swaps for driver compatibility
Isolating the LiDAR from background clutter
RealSense library quirks and edge cases
Deriving the depth-to-scaling-factor relationship
Accurately isolating RPM from noisy frames
Tuning the PCD filtering chain
Building the C++ Point Cloud Library toolchain
Improved Accuracy
Better edge-case handling and filtering, a higher-accuracy camera, a refined test setup, and dual-camera splicing to eliminate blind spots.
Faster Data Pipeline
.bag → .ply conversion currently takes ~20 min per 1 min recorded, plus ~15 min to transfer. A direct USB-to-USB link and leaner output formats could roughly halve both.
Better Test Simulation
A larger, black 4×4×2 m test volume (the current background is too close and the stand itself gets picked up in the size estimate); explored magnetic levitation or a plastic-thread suspension to remove the stand from frame entirely.
Broader Testing Scope
Only the one extruded triangle has been tested so far. Next: more basic geometric shapes, more realistic "debris," and a CV pipeline to dynamically detect and isolate the object of interest instead of a fixed stand.
The LASER team, shot on their own LiDAR cameraDr. Yu Takahashi
Clean Space LLC
Luke Bray
Alex Olson
Gavin Wakefield
Martin Coba
L.A.S.E.R. (LiDAR And Sensor Engineering Researchers), Fort Lewis College Capstone, December 2024.