Phase 1, Milestone 6: Integration & Docker
M6 closes Phase 1 by wiring all five components into a single runnable pipeline and packaging it in Docker so anyone can evaluate the project without installing ROS2, Eigen, or Python dependencies.
What was built
scripts/run_pipeline.sh — chains the full Phase 1 stack on a single frame:
- Sector RANSAC → ground/obstacle split
- Traversability grid → BEV risk + confidence map
- SegFormer cam-LiDAR fusion → semantic risk update
- Safety supervisor → TTC-based intervention log
scripts/smoke_test.sh — runs the pipeline on bundled sample data and verifies three output artifacts are produced in under 2 minutes.
data/sample/ — 8 matched RELLIS-3D frames (LiDAR + camera + calibration, 25MB) bundled directly in the Docker image so no data download is needed.
src/safety_runner.cpp — standalone C++ binary that loads a traversability grid, simulates a synthetic worker scenario (starts at 15m, approaches at 1.2 m/s), and writes the intervention log to CSV.
Running it
mkdir -p output
docker pull nishantzfyii/terra-perceive:phase1
docker run --rm \
-v $(pwd)/output:/ws/src/construction_perception/output \
nishantzfyii/terra-perceive:phase1
Output
After ~45 seconds:
| Artifact | Description |
|---|---|
bev_traversability.png |
Color-coded BEV: green=safe, yellow=caution, red=hazard, gray=unknown |
safety_events.csv |
Per-timestep: d_worker, d_stop, TTC, friction_mu, vel_before, vel_after |
timing_report.txt |
Per-stage wall-clock time |
Pipeline in motion
The animation below shows the full pipeline running across 100 RELLIS-3D frames — BEV traversability on the left, all six feature channels on the right.

Smoke test timing
| Stage | Time |
|---|---|
| Sector RANSAC + Traversability | ~7s |
| BEV Visualisation | ~3s |
| Cam-LiDAR Fusion | ~16s |
| Safety Supervisor | <1s |
| Total | ~27s |
All 52 unit tests pass inside the container.