Migrating to v1.0.0
v1.0.0 changes the recording format and tidies the Python and C++ surfaces. This guide shows how to move existing recordings, scripts, and code; the complete change list is in the v1.0.0 release notes.
You are affected if you have recordings made before v1.0.0, scripts that call the shipped tools, or code on the v0.x Python or C++ APIs. Update the whole toolchain together — pre-v1.0.0 tools open v1.0.0 recordings as empty, with no error explaining why.
Recordings
Convert each pre-v1.0.0 recording once:
- Visualizer: open the old recording — the visualizer offers the conversion, then opens the converted file.
-
Command line (scriptable) — see
voyant_recording_migrate:voyant_recording_migrate --input my_capture.bin # writes my_capture.vynt next to the input # --output <path> to choose the destination, --force to replace an existing file
New recordings use the .vynt extension, and the recorder enforces it — output paths ending in anything else are rejected. Recording to a path that already exists now fails unless you opt in (--force on voyant_logger_binary, overwrite=True in Python, the overwrite config field in C++).
Old raw-peak CSV captures have no converter — re-capture, or reach out to Voyant support about updating existing captures.
Command-line tools
The shipped tools dropped their carbon qualifier (voyant_carbon_client_check → voyant_client_check, voyant_carbon_simulator → voyant_simulator, and so on). Update scripts to the new names; the Retired Tools page maps every old name.
The CSV converters are now internal-only and no longer documented (see Retired Tools). For analysis exports, use the Python bindings’ points() matrix — the Python table below maps the old CSV column names to their points() equivalents — or the voyant-ros repository.
Python
| v0.x | v1.0.0 |
|---|---|
points() / valid_points() — (N, 7) float32: x, y, z, radial_vel, snr_linear, nanosecs_since_frame, drop_reason | (N, 12) float64, spherical by default: range_m, azimuth_rad, elevation_rad, doppler_mps, snr, calibrated_reflectance, timestamp_nanosecs, azimuth_idx, elevation_idx, drop_reason, combine_method, user_data. points(cartesian=True) swaps the first three columns to x, y, z. |
points_extended(), special_test(), spherical() accessor families | Removed — select columns from points() by name instead |
xyzv() fourth column radial_vel | Renamed doppler_mps (same data) |
valid_mask() returns list[bool] | Returns a NumPy boolean array |
describe() prints | Returns a string |
VoyantPlayback(filter_points=...) | keep_invalid_points=... |
PCD helpers’ valid_only=... | keep_invalid_points=... |
config.set_keep_invalid_points(...) | config.set_diagnostic_mode(...) |
VoyantRecorder(buffer_size_mb=...) | Removed (the buffer sizes itself); overwrite= added |
start_peak_dump() / stop_peak_dump() / is_peak_dumping() | Diagnostic capture — see below |
VoyantClient | Removed — use CarbonClient |
voyant_api.utils compatibility shim | Removed |
set_missing_elevations(), set_interp_range_threshold(), set_interp_doppler_threshold() | Removed (elevation interpolation is gone; it was off by default) |
Column-name-keyed access is the order-proof way to consume and edit points:
df = pd.DataFrame(frame.points(), columns=frame.points_columns())
edited = frame.with_points(df[frame.points_columns()].to_numpy())
drop_reason codes are renumbered in v1.0.0 — treat 1 as valid and any other value as dropped, and do not carry v0.x code meanings forward.
Peak dump → diagnostic capture
The peak-dump API is replaced by diagnostic capture, which writes the raw peak stream to a .vynt sidecar while the point cloud keeps running (the old dump required the client to be stopped):
config.set_diagnostic_mode(True) # before client.start()
client.start_diagnostic_capture("capture_peaks.vynt")
# record frames alongside with VoyantRecorder — together they form the support bundle
client.stop_diagnostic_capture() # requests the stop; returns immediately
while client.is_diagnostic_capturing(): # wait before reading the file
time.sleep(0.1)
C++
| v0.x | v1.0.0 |
|---|---|
bool tryReceiveFrame() + VoyantFrameWrapper& latestFrame() | std::optional<VoyantFrame> tryReceiveFrame() — the frame is the new native VoyantFrame class: points(), xyz(), sensorState(), hostState() |
VoyantClient, PointsClient | Removed — use CarbonClient |
VoyantPlayback(..., bool filter_points = false) | VoyantPlayback(..., bool keep_invalid_points = false) — invalid points are now removed by default; pass true to keep them |
CarbonConfig::setKeepInvalidPoints(...) | setDiagnosticMode(...) |
startPeakDump() / stopPeakDump() / isPeakDumping() | startDiagnosticCapture(path) / stopDiagnosticCapture() / isDiagnosticCapturing(), with setDiagnosticMode(true) set before start(). stopDiagnosticCapture() returns immediately — poll isDiagnosticCapturing() before reading the file |
Recorder config bufferSizeMb | Removed (the buffer sizes itself); overwrite field added |
setMissingElevations(), setInterpRangeThreshold(), setInterpDopplerThreshold() | Removed (elevation interpolation is gone; it was off by default) |
C FFI voyant_playback_is_file_open | Removed, no C++ replacement (Python keeps is_open) |
C FFI voyant_recorder_create | Gained error output parameters |