1. 24 Mar, 2021 6 commits
    • Nicolas Cadart's avatar
      [feat] Remove sorted input prior for auto angular resolution computation · 3bf69bfa
      Nicolas Cadart authored
      Before this commit, the auto angular resolution computation relied on the assumption
      that each scanline was already sorted by increasing timestamp/azimuth.
      This implied a very specific organization of input cloud.
      Now, each scanline is sorted, so this assumption is not needed anymore.
      The only relying prior is that all points must be expressed in local lidar sensor
      coordinates system (centered on (0, 0, 0) and spinning along -Z axis).
    • Nicolas Cadart's avatar
      [fix] Deal with spherical image · c1e080ff
      Nicolas Cadart authored
      - Properly manage the spherical projection to correctly get neighbor points.
      - Check that timestamp is increasing along a clockwise scanline.
      If a time gap is detected (because of rolling shutter), invalidate neighboring points.
    • Nicolas Cadart's avatar
      [refactor][deprec] Remove unnecessary SSKE members and reorganize code · 1b8171c7
      Nicolas Cadart authored
      - Remove ScanLines member variables as we now use VertexMap.
      - Remove AzimuthalResolution to use only NbFiringsPerLaserRing.
      - Remove old unused SphericityThreshold and IncertitudeCoef.
      - NbLaserRings and NbFiringsPerLaseRing are cast from unsigned to int.
      - Clean getters/setters for these 2 attributes.
      - Reset these auto-estimated parameters when resetting Slam.
      - Rename EstimateAzimuthalResolution to EstimateLaserRingsParameters.
      - Sort input pointcloud by scan line only in this method.
      - Merge ConvertAndSortScanLines and PrepareDataForNextFrame into PrepareDataForNewFrame.
      - Rename ComputeCurvature by ComputeFeatures
    • Nicolas Cadart's avatar
      [feat] Build and use vertex map in SSKE · 9b5aea01
      Nicolas Cadart authored
      - Build the vertex map from input pointcloud
      - Left and right neighbors are extracted from vertex map
      - New keypoints are added if no left/right neighbor laser beam returned to sensor
      - Points missing some (but not all) neighbors are skipped from the keypoints analysis
      - Represent point features as VertexMap
    • Nicolas Cadart's avatar
      [refactor] Use bitwise integer flags instead of std::bitset in SSKE · 2e100d69
      Nicolas Cadart authored
      In prevision of vertex map storage, it is necessary to store internal vectors as plain numeric types.
      - This drops the std::bitset usage in favor of integer type with bitwise operations.
      - This also specifies the enum Keypoint to be an uint8.
      - This also moves LineFitting to Utils namespace.
    • Nicolas Cadart's avatar
      Merge branch 'SmallFixes' into 'master' · 0b5d749d
      Nicolas Cadart authored
      Fix catch-by-value warning and fix undistortion time range
      See merge request !105
  2. 23 Mar, 2021 2 commits
  3. 12 Mar, 2021 1 commit
  4. 11 Mar, 2021 2 commits
  5. 05 Mar, 2021 4 commits
  6. 02 Mar, 2021 4 commits
  7. 01 Mar, 2021 2 commits
  8. 26 Feb, 2021 1 commit
    • Julia Sanchez's avatar
      [doc] Update comments · 2644dc72
      Julia Sanchez authored
      * Comments are updated to reflect the new ceres behaviour
      * The tangent unit vector name is changed (n->u)
  9. 25 Feb, 2021 3 commits
    • Julia Sanchez's avatar
      [feat] Adapt blob distance operator · 168c0064
      Julia Sanchez authored
      * The distance operator for blob has to be updated as A.transpose()*A /=
      * A squareout step is added
    • Julia Sanchez's avatar
      [feat] Change residual computation · 1937d20a
      Julia Sanchez authored
      * Ceres internally squares the cost function residual.
      * By now, the square of the residual is computed, then the sqrt and
      Ceres computes the square again afterwards.
      * This commit changes the dimension of the residual (1D->3D) to avoid
      this behaviour.
      * The mean point argument name is changed (C->P) to uniformize the code
    • Nicolas Cadart's avatar
      [fix] Remove MatchInfo default values to fix compilation with MSVC · 458f9ddf
      Nicolas Cadart authored
      MSVC cannot use brace initialization if on a non-aggregate type.
      From what I understand, if some default values are specified in the struct,
      then a default constructor is created, and the struct is not anymore an aggregate.
  10. 18 Feb, 2021 2 commits
  11. 09 Feb, 2021 1 commit
  12. 08 Feb, 2021 7 commits
    • Nicolas Cadart's avatar
      Merge branch 'RefactorUndistortion' into 'master' · 9e021255
      Nicolas Cadart authored
      Major undistortion refactoring
      See merge request !87
    • Nicolas Cadart's avatar
      [feat] Add ICP match quality weight as debug info · 53cfdb7f
      Nicolas Cadart authored
      Introduce KeypointsRegistration::MatchResults::MatchInfo struct.
      This can be useful to check which and how much each keypoint contributes to optimization.
    • Nicolas Cadart's avatar
      [ui][defaults] Replace LossScale param by SaturationDistance · e33e2d53
      Nicolas Cadart authored
      LossScale was the scale used by arctan loss function.
      This parameter was difficult to understand and set for user.
      By using Tukey loss, the loss reaches its saturation value at its squared scale.
      By introducing SaturationDistance = sqrt(scale), this parameter becomes much more intuitive.
      Beyond this saturation distance, the residual reaches its saturation, limiting outliers contributions.
      Saturation distances have been tweaked to lead to very similar results as before.
    • Nicolas Cadart's avatar
      [feat] Use TukeyLoss instead of ArctanLoss as ICP residuals robustifier · e8fca888
      Nicolas Cadart authored
      TukeyLoss is more agressive to outliers, and reach its saturation at the given squared scale.
    • Nicolas Cadart's avatar
      [fix] Weight each residual only once · ff416bee
      Nicolas Cadart authored
      Each residual was weighted several times :
      - In the ceres cost function itself, the squared residual was multiplied by weight.
        This resulted in the residual weighted by sqrt(weight).
      - In the scaled loss function, the robustified loss was scaled by weight.
      For small residuals, this leads to a scaling of ~weight^1.5.
      For bigger residuals, this leads to strange behavior of robustifier, as if the scale was also weighted.
      Ceres doc suggests to simply use the ScaledLoss function for such behavior.
      So this commit removes the weighting inside the ceres residual computation.
    • Nicolas Cadart's avatar
      [fix] Add undistortion support in pose graph optimization · 6c1ad2ea
      Nicolas Cadart authored
      After PGO, frames were only rigidly aggregated.
      Now, it is possible to undistort them using optimized motion.
      This also fixes a small time duration display as timers should only be reset on a hard reset.
    • Nicolas Cadart's avatar
      [feat][refactor] Split APPROXIMATED undistortion mode into ONCE and REFINED · 6694ce06
      Nicolas Cadart authored
      ONCE: undistortion is done ony once at the beginning of localization step.
      REFINED: ONCE + undistortion refined at the end of each ICP-LM iteration.
      Current*Keypoints become CurrentRaw*Keypoints, raw extracted keypoints in BASE without undistortion.
      Current*Keypoints are the keypoints clouds in BASE, with undistortion (if enabled).
      Remove check in AddFrames verifying if we deal with first frame or not.
      We need to run Localization step to update Current*Keypoints from CurrentRaw*Keypoints.
      EgoMotion and Localization steps are safe if previous pointclouds are empty.
  13. 05 Feb, 2021 2 commits
  14. 04 Feb, 2021 3 commits