- report valid coverage and depth percentiles even when XYZ ground truth is absent
- accept depth bounds and optional color-mapped PNG output for visual inspection
- retain accuracy metrics when point_cloud.obj is available
- add a batch helper that renders Markdown tables and optional JSON and PNG artifacts
- document benchmark inputs, dataset limits, and visualization tradeoffs
- add block-averaged PLY grid decimation with validity-aware vertex generation
- validate and load ply_stride and wls_filter from cloud_point configuration
- pass matcher tuning through CloudPointClient and apply both settings in CLI exports
- cover stride averaging, sparse blocks, invalid values, and config parsing
- add configurable median and edge-aware WLS filtering to the CPU SGBM matcher
- preserve SGBM rejection holes when WLS smooths valid disparities
- detect and link OpenCV ximgproc when available, with a graceful fallback otherwise
- forward CPU tuning through the matcher factory and cover validation and hole preservation
- Configure StereoSGBM with P1/P2 penalties, 5x5 block, uniqueness ratio,
speckle filter and left-right check; previously it ran unregularised and
produced a heavy tail of low-disparity outliers reprojecting metres away
(SCARED benchmark MAE3D 44 mm -> 0.8 mm, RMSE 289 mm -> 1.4 mm)
- Pass the requested disparity count to the CUDA SGM matcher (rounded to
64/128/256) instead of a hard-coded 16
- Add optional `cloud_point` config section (algorithm, num_disparities,
depth range) consumed by CLI options 4/5; ship config.scared.yml
- write_ply now emits a binary PLY with a grid-triangulated mesh so web
viewers stop fabricating slivers from consecutive vertices
- Add config, matcher and PLY export tests; document in README
crpc_deinit() called TcpServer::join() without stop(), so with any live
TCP client the accept thread never exited and deinit blocked forever on
the caller's thread (froze the Unity main thread in OnDestroy during
e2e). Call server->stop() first, which clears running_ and unblocks
accept, then join.
- Parse port inside try block for proper error reporting instead of unhandled exception
- Make frame_counter atomic to eliminate data race under TcpServer per-client threads
- Validate num_disparities is positive multiple of 16 in StereoMatcherFactory
- Validate stereo pair dimensions match in ScaredDatasetLoader
- Silence nodiscard warnings via std::ignore in tests
TG-3 #ready-for-test
TG-2 #ready-for-test
- Remove unused stdexec dependency
- Fix dangling cv::Mat references and swapped dimensions in image/matrix factories
- Add CameraCalib, StereoCalibrationRPC, ImagePairRPC DTOs with nlohmann serialization
- Implement get-stereo-calibration and get-image-pair RPC handlers with deterministic mock data
- Extend RpcClient with typed getters and params-bearing call overload
- Restructure API.md with full JSON schemas and conventions
- 13 unit and integration tests for serialization
TG-3 #in-progress
TG-7 #ready-for-test
- add crpc_init_with_address for direct ip/port startup without yaml
- add minimal_client.cpp example using TCPConnector to send a ping
- set install_rpath '$ORIGIN' on shared libs so they find bundled deps
- ignore .worktrees/ for git worktree scratch directories
Detailed:
As base used jsonrpccxx implementation paired with TCP socket
TCP socket updated to handle dynamic sized buffers
TCP communication protocol changed to serialized packet size after
which json string is presented