1.3.77
 
Loading...
Searching...
No Matches
ScanMetadata Struct Reference

Structure containing metadata for a scan. More...

#include <LiDAR.h>

Public Member Functions

 ScanMetadata ()
 Default LiDAR scan data structure.
 
 ScanMetadata (const helios::vec3 &origin, uint Ntheta, float thetaMin, float thetaMax, uint Nphi, float phiMin, float phiMax, float exitDiameter, float beamDivergence, float rangeNoiseStdDev, float angleNoiseStdDev, const std::vector< std::string > &columnFormat, float scanTiltRoll=0.f, float scanTiltPitch=0.f, float scanAzimuthOffset=0.f)
 Create a LiDAR scan data structure.
 
 ScanMetadata (const helios::vec3 &origin, const std::vector< float > &beamZenithAngles, uint Nphi, float phiMin, float phiMax, float exitDiameter, float beamDivergence, float rangeNoiseStdDev, float angleNoiseStdDev, const std::vector< std::string > &columnFormat, float scanTiltRoll=0.f, float scanTiltPitch=0.f, float scanAzimuthOffset=0.f)
 Create a spinning multibeam LiDAR scan data structure (e.g. Velodyne/Ouster/Hesai rotating multi-channel sensor)
 
helios::SphericalCoord rc2direction (uint row, uint column) const
 Convert the (row,column) of hit point in a scan to a direction vector.
 
helios::int2 direction2rc (const helios::SphericalCoord &direction) const
 Convert the scan ray direction into (row,column) table index.
 
void poseAt (double t, helios::vec3 &pos, helios::vec4 &quat) const
 Interpolate the platform pose at trajectory time t (moving-platform scans only)
 

Data Fields

std::string data_file
 File containing hit point data.
 
uint Ntheta
 Number of zenithal angles in scan (rows)
 
float thetaMin
 Minimum zenithal angle of scan in radians.
 
float thetaMax
 Maximum zenithal angle of scan in radians.
 
uint Nphi
 Number of azimuthal angles in scan (columns)
 
float phiMin
 Minimum azimuthal angle of scan in radians.
 
float phiMax
 Maximum azimuthal angle of scan in radians.
 
helios::vec3 origin
 (x,y,z) coordinate of scanner location
 
float exitDiameter
 Diameter of laser pulse at exit from the scanner.
 
float beamDivergence
 Divergence angle of the laser beam in radians.
 
float rangeNoiseStdDev
 Standard deviation of Gaussian range (along-beam) measurement noise in meters.
 
float angleNoiseStdDev
 Standard deviation of Gaussian angular (beam-pointing) jitter in radians.
 
ReturnMode returnMode = RETURN_MODE_MULTI
 Return-reporting mode for analytic-waveform synthetic scans.
 
SingleReturnSelection singleReturnSelection = SINGLE_RETURN_STRONGEST
 Which return(s) to keep in single/limited-return mode (see SingleReturnSelection)
 
int maxReturns = 1
 Maximum number of returns reported per pulse in single/limited-return mode.
 
float pulseWidth = 0.f
 Range resolution (transmit pulse range-extent) in meters, used to merge sub-ray hits into discrete returns.
 
float detectionThreshold = 0.05f
 Minimum return energy fraction for a return to be detected (noise floor)
 
float scanTilt_roll
 Global scanner tilt roll angle in radians (right-hand rotation about the body lateral axis)
 
float scanTilt_pitch
 Global scanner tilt pitch angle in radians (right-hand rotation about the body forward/azimuth-zero axis)
 
float scanTilt_azimuth
 Global scanner azimuth (heading) offset in radians (right-hand rotation about the world vertical +z axis)
 
std::vector< std::string > columnFormat
 Vector of strings specifying the columns of the scan ASCII file for input/output.
 
ScanPattern scanPattern
 Geometric pattern that maps scan-table (row,column) indices to beam directions.
 
std::vector< float > beamZenithAngles
 Per-channel zenith angles for a spinning multibeam scan, in radians.
 
std::vector< RisleyPrismrisley_prisms
 Rotating wedge prisms of a Risley-prism (Livox-style rosette) scan.
 
double risley_refractive_index_air = 1.0
 Refractive index of the medium surrounding the Risley prisms (air)
 
bool isMoving = false
 Whether this scan uses a moving-platform trajectory (true) or a single static origin (false)
 
std::vector< double > traj_t
 Monotonically increasing trajectory sample times in seconds (size M)
 
std::vector< helios::vec3traj_pos
 Trajectory platform (body-frame origin) positions in world coordinates, one per traj_t entry (size M)
 
std::vector< helios::vec4traj_quat
 Trajectory platform orientations as quaternions (qx,qy,qz,qw), one per traj_t entry (size M)
 
helios::vec3 lever_arm = helios::make_vec3(0, 0, 0)
 Position of the sensor optical center in the platform body frame, in meters (lever arm)
 
helios::vec3 boresight_rpy = helios::make_vec3(0, 0, 0)
 Fixed sensor rotational misalignment (boresight) as roll/pitch/yaw in radians, in the body frame.
 
double pulse_period = 1.0
 
double t0 = 0.0
 Time of the first pulse (pulse ordinal 0) in seconds. Relative time; no absolute GPS epoch.
 
ScanMode scanMode = SCAN_MODE_STATIC_RASTER
 High-level acquisition-mode descriptor (see ScanMode)
 
uint steps_per_rev = 0
 Number of azimuth firing steps per full 360-degree revolution (spinning multibeam scans only; 0 otherwise)
 
double rotation_rate = 0.0
 Sensor-head rotation rate in revolutions per second (spinning multibeam scans only; 0 otherwise)
 
double n_revolutions = 0.0
 Total number of full 360-degree revolutions collected (spinning multibeam scans only; may be fractional; 0 otherwise)
 

Detailed Description

Structure containing metadata for a scan.

A static raster scan is initialized by providing 1) the origin of the scan (see origin), 2) the number of zenithal scan directions (see Ntheta), 3) the range of zenithal scan angles (see thetaMin, thetaMax), 4) the number of azimuthal scan directions (see Nphi), 5) the range of azimuthal scan angles (see phiMin, phiMax). This creates a grid of Ntheta x Nphi scan points which are all initialized as misses. Points are set as hits using the addHitPoint() function. There are various functions to query the scan data.

Note
During synthetic scan generation the raster pattern models the continuous azimuth rotation of a real terrestrial scanner: the azimuth drifts across each zenith column by one column step ((phiMax-phiMin)/(Nphi-1)), so the emitted zenith columns are slightly skewed (tilted) rather than perfectly vertical. The drift is sub-cell ((phiMax-phiMin)/((Nphi-1)*Ntheta) per zenith step) and is not reflected in the nominal (row,column) grid mapping used by rc2direction() / direction2rc(). The same Ntheta x Nphi grid storage backs the other scan patterns and modes (see ScanPattern and ScanMode): a spinning multibeam scan stores per-channel zenith angles in beamZenithAngles, and a moving-platform scan additionally carries a 6-DOF trajectory (traj_t, traj_pos, traj_quat) with the derived rotation rate and revolution count (rotation_rate, n_revolutions). Prefer the high-level entry points LiDARcloud::addScanSpinning() and LiDARcloud::addScanMovingRaster() to set up moving/spinning scans from physical instrument parameters.

Definition at line 326 of file LiDAR.h.

Constructor & Destructor Documentation

◆ ScanMetadata() [1/3]

ScanMetadata::ScanMetadata ( )

Default LiDAR scan data structure.

Definition at line 203 of file LiDAR.cpp.

◆ ScanMetadata() [2/3]

ScanMetadata::ScanMetadata ( const helios::vec3 origin,
uint  Ntheta,
float  thetaMin,
float  thetaMax,
uint  Nphi,
float  phiMin,
float  phiMax,
float  exitDiameter,
float  beamDivergence,
float  rangeNoiseStdDev,
float  angleNoiseStdDev,
const std::vector< std::string > &  columnFormat,
float  scanTiltRoll = 0.f,
float  scanTiltPitch = 0.f,
float  scanAzimuthOffset = 0.f 
)

Create a LiDAR scan data structure.

Parameters
[in]origin(x,y,z) position of the scanner
[in]NthetaNumber of scan points in the theta (zenithal) direction
[in]thetaMinMinimum scan angle in the theta (zenithal) direction in radians
[in]thetaMaxMaximum scan angle in the theta (zenithal) direction in radians
[in]NphiNumber of scan points in the phi (azimuthal) direction
[in]phiMinMinimum scan angle in the phi (azimuthal) direction in radians
[in]phiMaxMaximum scan angle in the phi (azimuthal) direction in radians
[in]exitDiameterDiameter of the laser pulse at exit from the scanner in meters
[in]beamDivergenceDivergence angle of the laser beam in radians
[in]rangeNoiseStdDevStandard deviation of Gaussian range (along-beam) measurement noise in meters (0 disables noise)
[in]angleNoiseStdDevStandard deviation of Gaussian angular (beam-pointing) jitter in radians (0 disables jitter)
[in]columnFormatVector of strings specifying the columns of the scan ASCII file for input/output
[in]scanTiltRollGlobal scanner tilt roll angle in radians (right-hand rotation about the body lateral axis; 0 = perfectly level) [optional]
[in]scanTiltPitchGlobal scanner tilt pitch angle in radians (right-hand rotation about the body forward/azimuth-zero axis; 0 = perfectly level) [optional]
[in]scanAzimuthOffsetGlobal scanner azimuth (heading) offset in radians (right-hand rotation about the world +z axis applied on top of the azimuth sweep; 0 = no offset) [optional]

◆ ScanMetadata() [3/3]

ScanMetadata::ScanMetadata ( const helios::vec3 origin,
const std::vector< float > &  beamZenithAngles,
uint  Nphi,
float  phiMin,
float  phiMax,
float  exitDiameter,
float  beamDivergence,
float  rangeNoiseStdDev,
float  angleNoiseStdDev,
const std::vector< std::string > &  columnFormat,
float  scanTiltRoll = 0.f,
float  scanTiltPitch = 0.f,
float  scanAzimuthOffset = 0.f 
)

Create a spinning multibeam LiDAR scan data structure (e.g. Velodyne/Ouster/Hesai rotating multi-channel sensor)

Each laser channel is fired at a fixed zenith angle (taken from beamZenithAngles) as the sensor head rotates through a uniform sequence of azimuth angles. The scan is stored as an Ntheta x Nphi table where Ntheta equals the number of channels (rows) and Nphi is the number of azimuth steps (columns), so all downstream processing is shared with raster scans. The scanPattern is set to SCAN_PATTERN_SPINNING_MULTIBEAM and thetaMin / thetaMax are set to the minimum and maximum of beamZenithAngles.

Note
This is the low-level grid primitive. To set up a spinning multibeam scan from physical instrument parameters (channel elevations, azimuth resolution, PRF, trajectory) with the azimuth grid, rotation rate, and revolution count derived internally, use LiDARcloud::addScanSpinning() instead.
Parameters
[in]origin(x,y,z) position of the scanner
[in]beamZenithAnglesPer-channel zenith angles in radians (zenith convention: 0 = upward, pi/2 = horizontal, pi = downward). Its size sets Ntheta. Manufacturer spec sheets typically list channel angles as elevation above the horizon; zenith = pi/2 - elevation.
[in]NphiNumber of azimuth steps (columns) per rotation
[in]phiMinMinimum scan angle in the phi (azimuthal) direction in radians
[in]phiMaxMaximum scan angle in the phi (azimuthal) direction in radians
[in]exitDiameterDiameter of the laser pulse at exit from the scanner in meters
[in]beamDivergenceDivergence angle of the laser beam in radians
[in]rangeNoiseStdDevStandard deviation of Gaussian range (along-beam) measurement noise in meters (0 disables noise)
[in]angleNoiseStdDevStandard deviation of Gaussian angular (beam-pointing) jitter in radians (0 disables jitter)
[in]columnFormatVector of strings specifying the columns of the scan ASCII file for input/output
[in]scanTiltRollGlobal scanner tilt roll angle in radians (right-hand rotation about the body lateral axis; 0 = perfectly level) [optional]
[in]scanTiltPitchGlobal scanner tilt pitch angle in radians (right-hand rotation about the body forward/azimuth-zero axis; 0 = perfectly level) [optional]
[in]scanAzimuthOffsetGlobal scanner azimuth (heading) offset in radians (right-hand rotation about the world +z axis applied on top of the azimuth sweep; 0 = no offset) [optional]

Member Function Documentation

◆ direction2rc()

helios::int2 ScanMetadata::direction2rc ( const helios::SphericalCoord direction) const

Convert the scan ray direction into (row,column) table index.

Parameters
[in]directionSpherical vector corresponding to the ray direction for the given hit point.
Returns
(row,column) table index for the given hit point

Definition at line 409 of file LiDAR.cpp.

◆ poseAt()

void ScanMetadata::poseAt ( double  t,
helios::vec3 pos,
helios::vec4 quat 
) const

Interpolate the platform pose at trajectory time t (moving-platform scans only)

Brackets t in traj_t by binary search, linearly interpolates traj_pos, and spherically interpolates (SLERP) traj_quat. Times outside [traj_t.front(), traj_t.back()] are clamped to the nearest endpoint. Throws via helios_runtime_error if the trajectory is empty, the three trajectory vectors differ in length, or traj_t is not strictly increasing.

Parameters
[in]tQuery time in seconds.
[out]posInterpolated platform position in world coordinates.
[out]quatInterpolated platform orientation quaternion (qx,qy,qz,qw), Hamilton body->world.

Definition at line 454 of file LiDAR.cpp.

◆ rc2direction()

helios::SphericalCoord ScanMetadata::rc2direction ( uint  row,
uint  column 
) const

Convert the (row,column) of hit point in a scan to a direction vector.

Parameters
[in]rowIndex of hit point in the theta (zenithal) direction.
[in]columnIndex of hit point in the phi (azimuthal) direction.
Returns
Spherical vector corresponding to the ray direction for the given hit point.

Definition at line 386 of file LiDAR.cpp.

Field Documentation

◆ angleNoiseStdDev

float ScanMetadata::angleNoiseStdDev

Standard deviation of Gaussian angular (beam-pointing) jitter in radians.

Real LiDAR instruments have a small random error in the pointing direction of each emitted pulse. This contributes the across-beam (lateral) component of the per-point positional error, which grows with range as approximately range times this standard deviation, and is distinct from the within-beam spread produced by beam divergence. During synthetic scan generation the nominal beam direction of each pulse is perturbed by an independent zero-mean Gaussian angular offset with this standard deviation before ray tracing, so the whole beam (including any divergence cone and finite aperture) is rotated together. A value of 0 disables angular jitter.

Note
This is only used for synthetic scan generation.

Definition at line 444 of file LiDAR.h.

◆ beamDivergence

float ScanMetadata::beamDivergence

Divergence angle of the laser beam in radians.

Note
This is not needed for single-return instruments, and is only used for synthetic scan generation.

Definition at line 422 of file LiDAR.h.

◆ beamZenithAngles

std::vector<float> ScanMetadata::beamZenithAngles

Per-channel zenith angles for a spinning multibeam scan, in radians.

Used only when scanPattern is SCAN_PATTERN_SPINNING_MULTIBEAM. The number of entries equals Ntheta (one per laser channel / row) and the values need not be uniformly spaced. Zenith convention: 0 = upward, pi/2 = horizontal, pi = downward. Manufacturer spec sheets typically list channel angles as elevation above the horizon, so zenith = pi/2 - elevation. Empty for SCAN_PATTERN_RASTER scans.

Definition at line 560 of file LiDAR.h.

◆ boresight_rpy

helios::vec3 ScanMetadata::boresight_rpy = helios::make_vec3(0, 0, 0)

Fixed sensor rotational misalignment (boresight) as roll/pitch/yaw in radians, in the body frame.

Definition at line 616 of file LiDAR.h.

◆ columnFormat

std::vector<std::string> ScanMetadata::columnFormat

Vector of strings specifying the columns of the scan ASCII file for input/output.

Definition at line 546 of file LiDAR.h.

◆ data_file

std::string ScanMetadata::data_file

File containing hit point data.

Definition at line 381 of file LiDAR.h.

◆ detectionThreshold

float ScanMetadata::detectionThreshold = 0.05f

Minimum return energy fraction for a return to be detected (noise floor)

A detected return whose intensity (range-normalized echo amplitude, expressed as a fraction of the total per-pulse beam energy) is below this value is discarded, modeling the minimum detectable signal above the noise floor of a real instrument. Set to 0 to disable suppression so every return is reported.

The default of 0.05 models a realistic ~5% noise floor and pairs with the recommended ~40 rays/pulse: with N sub-rays the weakest possible return is 1/N of pulse energy (a single sub-ray), so a 0.05 threshold at N=40 keeps only returns supported by at least ~2 sub-rays. This suppresses the single-sub-ray "phantom" returns whose Bernoulli appearance/disappearance otherwise forces very high ray counts to converge, letting ~40 rays/pulse reach a stable multi-return statistic. Raise N if you lower this threshold below ~1/N (a threshold under 1/N has no effect, since no return can be weaker than one sub-ray); a value of 0 reproduces the previous "report every return" behavior.

Note
This is only used for synthetic scan generation.

Definition at line 501 of file LiDAR.h.

◆ exitDiameter

float ScanMetadata::exitDiameter

Diameter of laser pulse at exit from the scanner.

Note
This is not needed for single-return instruments, and is only used for synthetic scan generation.

Definition at line 416 of file LiDAR.h.

◆ isMoving

bool ScanMetadata::isMoving = false

Whether this scan uses a moving-platform trajectory (true) or a single static origin (false)

Definition at line 597 of file LiDAR.h.

◆ lever_arm

helios::vec3 ScanMetadata::lever_arm = helios::make_vec3(0, 0, 0)

Position of the sensor optical center in the platform body frame, in meters (lever arm)

Definition at line 613 of file LiDAR.h.

◆ maxReturns

int ScanMetadata::maxReturns = 1

Maximum number of returns reported per pulse in single/limited-return mode.

Used only when returnMode is RETURN_MODE_SINGLE. 1 = classic single-return (the default), 2 = dual-return, N = N-return; the kept returns are the subset chosen by singleReturnSelection, always ordered nearest-first. Ignored when returnMode is RETURN_MODE_MULTI (which reports every detected return), and also ignored when singleReturnSelection is SINGLE_RETURN_STRONGEST_PLUS_LAST (which intrinsically reports 1 or 2 returns). Must be >= 1.

Note
This is only used for synthetic scan generation.

Definition at line 475 of file LiDAR.h.

◆ n_revolutions

double ScanMetadata::n_revolutions = 0.0

Total number of full 360-degree revolutions collected (spinning multibeam scans only; may be fractional; 0 otherwise)

Derived internally as rotation_rate * trajectory_duration.

Definition at line 643 of file LiDAR.h.

◆ Nphi

uint ScanMetadata::Nphi

Number of azimuthal angles in scan (columns)

Definition at line 397 of file LiDAR.h.

◆ Ntheta

uint ScanMetadata::Ntheta

Number of zenithal angles in scan (rows)

Definition at line 384 of file LiDAR.h.

◆ origin

helios::vec3 ScanMetadata::origin

(x,y,z) coordinate of scanner location

Definition at line 410 of file LiDAR.h.

◆ phiMax

float ScanMetadata::phiMax

Maximum azimuthal angle of scan in radians.

Note
Azimuthal angles start at 0 (x=+,y=0) to 2pi (x=0,y=+) through 2pi.

Definition at line 407 of file LiDAR.h.

◆ phiMin

float ScanMetadata::phiMin

Minimum azimuthal angle of scan in radians.

Note
Azimuthal angles start at 0 (x=+,y=0) to 2pi (x=0,y=+) through 2pi.

Definition at line 402 of file LiDAR.h.

◆ pulse_period

double ScanMetadata::pulse_period = 1.0

Time between consecutive pulses in seconds (= 1 / pulse_rate_hz). For static scans this defaults to 1.0 so per-pulse timestamps equal the historical pulse ordinal (i.e. no change to existing behavior).

Definition at line 620 of file LiDAR.h.

◆ pulseWidth

float ScanMetadata::pulseWidth = 0.f

Range resolution (transmit pulse range-extent) in meters, used to merge sub-ray hits into discrete returns.

Two surfaces separated by less than this distance fall within one transmit pulse and merge into a single detected return at the energy-weighted range, reproducing the range-resolution / dead-zone limit of a real instrument (roughly c*pulse_duration/2). When 0 the synthetic scanner falls back to the pulse_distance_threshold argument of LiDARcloud::syntheticScan.

Note
This is only used for synthetic scan generation.

Definition at line 485 of file LiDAR.h.

◆ rangeNoiseStdDev

float ScanMetadata::rangeNoiseStdDev

Standard deviation of Gaussian range (along-beam) measurement noise in meters.

Realistic LiDAR positional error is anisotropic: it is dominated by an error in the measured range (distance), which displaces the hit point along the beam direction rather than isotropically in (x,y,z). During synthetic scan generation the measured range of each return is perturbed by a zero-mean Gaussian draw with this standard deviation, and the hit point is reconstructed along the nominal beam direction. A value of 0 disables range noise.

Note
This is only used for synthetic scan generation.

Definition at line 432 of file LiDAR.h.

◆ returnMode

ReturnMode ScanMetadata::returnMode = RETURN_MODE_MULTI

Return-reporting mode for analytic-waveform synthetic scans.

Selects whether a pulse reports all detected returns (RETURN_MODE_MULTI, the default) or a single detector-selected return (RETURN_MODE_SINGLE). Only takes effect when more than one ray per pulse is fired (see LiDARcloud::syntheticScan); a single ray per pulse always produces an idealized exact intersection.

Note
This is only used for synthetic scan generation.

Definition at line 453 of file LiDAR.h.

◆ risley_prisms

std::vector<RisleyPrism> ScanMetadata::risley_prisms

Rotating wedge prisms of a Risley-prism (Livox-style rosette) scan.

Used only when scanPattern is SCAN_PATTERN_RISLEY_PRISM. The beam is refracted in order through each prism in this stack (a Livox sensor uses two counter-rotating prisms; the underlying model supports any number). The per-pulse body-frame beam direction is computed by full Snell's-law refraction through the rotating prisms at the pulse's time (see rc2direction). Empty for the other scan patterns.

Definition at line 568 of file LiDAR.h.

◆ risley_refractive_index_air

double ScanMetadata::risley_refractive_index_air = 1.0

Refractive index of the medium surrounding the Risley prisms (air)

Used only when scanPattern is SCAN_PATTERN_RISLEY_PRISM. Defaults to 1.0 (vacuum/air).

Definition at line 572 of file LiDAR.h.

◆ rotation_rate

double ScanMetadata::rotation_rate = 0.0

Sensor-head rotation rate in revolutions per second (spinning multibeam scans only; 0 otherwise)

Derived internally as PRF / (channels * steps_per_rev).

Definition at line 639 of file LiDAR.h.

◆ scanMode

ScanMode ScanMetadata::scanMode = SCAN_MODE_STATIC_RASTER

High-level acquisition-mode descriptor (see ScanMode)

Definition at line 632 of file LiDAR.h.

◆ scanPattern

ScanPattern ScanMetadata::scanPattern

Geometric pattern that maps scan-table (row,column) indices to beam directions.

Defaults to SCAN_PATTERN_RASTER (uniform angular grid). When set to SCAN_PATTERN_SPINNING_MULTIBEAM the per-channel zenith angles in beamZenithAngles define the row directions instead of uniform [thetaMin,thetaMax] spacing.

Definition at line 552 of file LiDAR.h.

◆ scanTilt_azimuth

float ScanMetadata::scanTilt_azimuth

Global scanner azimuth (heading) offset in radians (right-hand rotation about the world vertical +z axis)

Yaw component of the global scanner orientation that completes the roll/pitch/yaw (scanTilt_roll, scanTilt_pitch, azimuth) triad used by real instruments. While roll and pitch come from the dual-axis inclinometer, the azimuth (heading) is the compass orientation of the scanner about the local vertical. This field applies a right-hand rotation of the entire scan frame (the fan of ray directions and the tilt body axes) about the world +z axis, about the scanner origin, during synthetic scan generation. It is applied as a heading offset on top of the per-scan azimuth sweep [phiMin, phiMax]: the rotation order is yaw (azimuth) first, then pitch, then roll. A value of 0 leaves the azimuth-zero (phiMin) direction unchanged.

Note
The sign convention is right-handed (counter-clockwise about +z when viewed from above). Commercial scanners do not share a universal heading sign convention, so when matching a specific instrument the sign should be verified against that instrument's reported azimuth.
This is only used for synthetic scan generation. See also scanTilt_roll and scanTilt_pitch.

Definition at line 543 of file LiDAR.h.

◆ scanTilt_pitch

float ScanMetadata::scanTilt_pitch

Global scanner tilt pitch angle in radians (right-hand rotation about the body forward/azimuth-zero axis)

Pitch component of the global scanner tilt (see scanTilt_roll): a right-hand rotation of the entire scan frame about the body forward axis (the horizontal projection of the azimuth-zero / phiMin scan direction), applied about the scanner origin during synthetic scan generation. When phiMin is 0 the forward axis is the world +y axis. Together scanTilt_roll and scanTilt_pitch model the two angles reported by a real dual-axis inclinometer. A value of 0 corresponds to a perfectly level scanner. Roll is applied before pitch.

Note
This is only used for synthetic scan generation.

Definition at line 527 of file LiDAR.h.

◆ scanTilt_roll

float ScanMetadata::scanTilt_roll

Global scanner tilt roll angle in radians (right-hand rotation about the body lateral axis)

Real terrestrial laser scanners are never perfectly leveled; a dual-axis inclinometer reports the residual tilt of the scanner spin axis away from true vertical (plumb) as two orthogonal angles. This field is the roll component: a right-hand rotation of the entire scan frame (the fan of ray directions) about the body lateral axis, applied about the scanner origin during synthetic scan generation. The body frame is right-handed and Z-up, matching commercial scanners (e.g. RIEGL SOCS): the forward axis is the horizontal projection of the azimuth-zero (phiMin) scan direction, and the lateral axis completes the right-handed frame. When phiMin is 0 the lateral axis is the world +x axis. A value of 0 corresponds to a perfectly level scanner.

Note
The sign convention is right-handed; commercial scanners do not share a universal inclinometer sign convention, so when matching a specific instrument the sign should be verified against that instrument's reported tilt.
This is only used for synthetic scan generation. See also scanTilt_pitch.

Definition at line 516 of file LiDAR.h.

◆ singleReturnSelection

SingleReturnSelection ScanMetadata::singleReturnSelection = SINGLE_RETURN_STRONGEST

Which return(s) to keep in single/limited-return mode (see SingleReturnSelection)

Used only when returnMode is RETURN_MODE_SINGLE. When a pulse resolves more returns than maxReturns, this policy selects which subset to keep (SINGLE_RETURN_FIRST keeps the nearest, SINGLE_RETURN_LAST the farthest, SINGLE_RETURN_STRONGEST the highest-amplitude). SINGLE_RETURN_STRONGEST_PLUS_LAST is special: it keeps the strongest return plus the last (farthest) return (deduplicated to one when they coincide) and ignores maxReturns, reporting 1 or 2 returns.

Note
This is only used for synthetic scan generation.

Definition at line 464 of file LiDAR.h.

◆ steps_per_rev

uint ScanMetadata::steps_per_rev = 0

Number of azimuth firing steps per full 360-degree revolution (spinning multibeam scans only; 0 otherwise)

Definition at line 635 of file LiDAR.h.

◆ t0

double ScanMetadata::t0 = 0.0

Time of the first pulse (pulse ordinal 0) in seconds. Relative time; no absolute GPS epoch.

Definition at line 623 of file LiDAR.h.

◆ thetaMax

float ScanMetadata::thetaMax

Maximum zenithal angle of scan in radians.

Note
Zenithal angles range from 0 (upward) to pi (downward).

Definition at line 394 of file LiDAR.h.

◆ thetaMin

float ScanMetadata::thetaMin

Minimum zenithal angle of scan in radians.

Note
Zenithal angles range from 0 (upward) to pi (downward).

Definition at line 389 of file LiDAR.h.

◆ traj_pos

std::vector<helios::vec3> ScanMetadata::traj_pos

Trajectory platform (body-frame origin) positions in world coordinates, one per traj_t entry (size M)

Definition at line 603 of file LiDAR.h.

◆ traj_quat

std::vector<helios::vec4> ScanMetadata::traj_quat

Trajectory platform orientations as quaternions (qx,qy,qz,qw), one per traj_t entry (size M)

Hamilton convention, body->world: the quaternion rotates a vector expressed in the platform body frame into the world frame. Stored as (x,y,z,w) in a helios::vec4.

Definition at line 610 of file LiDAR.h.

◆ traj_t

std::vector<double> ScanMetadata::traj_t

Monotonically increasing trajectory sample times in seconds (size M)

Definition at line 600 of file LiDAR.h.


The documentation for this struct was generated from the following files: