|
| | 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)
|
| |
|
| 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< RisleyPrism > | risley_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::vec3 > | traj_pos |
| | Trajectory platform (body-frame origin) positions in world coordinates, one per traj_t entry (size M)
|
| |
| std::vector< helios::vec4 > | traj_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)
|
| |
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.
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] | t | Query time in seconds. |
| [out] | pos | Interpolated platform position in world coordinates. |
| [out] | quat | Interpolated platform orientation quaternion (qx,qy,qz,qw), Hamilton body->world. |
Definition at line 454 of file LiDAR.cpp.
| 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.
| 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.
| 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.
| 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.
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.