Highlights
- Models defined outside NCore are now supported end to end. 19.6.0 introduced
register_camera_modeland its lidar and external distortion counterparts, but registration only reached half way: an out-of-tree model could be constructed, then rejected by
IdealPinholeCameraModelParameters.from_source/natural_fov, which dispatched over a hard-coded chain of the four in-tree models, and could never be read back, becausedecode_camera_model_parametersdispatched over a hard-coded table of the four in-tree identifiers. Both are now open. CameraModelParameters.paraxial_pinhole_geometryis the single extension point behind the ideal pinhole helpers. A model declares the pinhole that agrees with it to first order about the optical axis, as aParaxialPinholeGeometry, and the helpers work on it without knowing which model they were handed. A model with no meaningful paraxial pinhole opts out by raisingTypeError.decode_camera_model_parametersanddecode_lidar_model_parametersresolve the serialized identifier through a registry, withregister_camera_model_parametersandregister_lidar_model_parametersas the deserialization counterparts to the model factories'
registration hooks. No serialized format changed: the identifier was already written fromtype(), so existing data reads exactly as before, including payloads using the retiredpinholeidentifier.- Serialized external distortion parameters carry their concrete type inside the nested object, which is what lets
CameraModelParameters.external_distortion_parametersbe declared against the abstract base. Untagged payloads written before this are still read, as the bivariate windshield model. - The reader and writer APIs are typed against the abstract parameter bases rather than closed unions of the concrete classes. Callers of
decode_*and of themodel_parametersaccessors now receive the abstract base and may need anisinstancenarrow before reading a model-specific field. - The abstract lidar parameter bases are exported as
LidarModelParameters,SpinningLidarModelParametersandStructuredSpinningLidarModelParameters, restoring symmetry with the camera side, which has exported its abstract base since 19.6.0. - Concrete parameter classes must now implement
type, and concrete camera parametersparaxial_pinhole_geometry; both are abstract on their bases rather than defaulted. Subclasses that do not will raiseTypeErroron instantiation. Every model in NCore does, and the requirement is stated now, while no out-of-tree model exists to be broken by it.
v19.7.0 - 2026-09-14
➕ Added
- (data) open the model parameter hierarchies to out-of-tree implementations - (81b4f10) - Janick Martinez Esturo
- (data) export the abstract lidar model parameter bases - (6ba9b56) - Janick Martinez Esturo
- (data) carry the concrete type inside serialized external distortion parameters - (d59ba59) - Janick Martinez Esturo
- (skills) add the ncore-data-conversion agent skill - (b5d3b8a) - Sanchit Garg
🪲 Fixed
- (data) apply --start-time-sec to COLMAP camera frame timestamps - (5fcd482) - Janick Martinez Esturo
🔄 Changed
- (data) type the reader and writer APIs against the abstract parameter bases - (11b0cd3) - Janick Martinez Esturo
📚 Documentation
- (conversions) correct stale converter test targets, defaults and revision - (cd81809) - Janick Martinez Esturo
🧪 Tests
- (sensors) cover the abstract-typed source contract for the ideal pinhole helpers - (a3131ae) - Janick Martinez Esturo