#pragma once #include #include #include #include #include #include namespace basalt { template class ImuBlock; template class LinearizationAbsQR : public LinearizationBase { public: using Scalar = Scalar_; static constexpr int POSE_SIZE = POSE_SIZE_; using Base = LinearizationBase; using Vec2 = Eigen::Matrix; using Vec3 = Eigen::Matrix; using Vec4 = Eigen::Matrix; using VecP = Eigen::Matrix; using VecX = Eigen::Matrix; using Mat36 = Eigen::Matrix; using Mat4 = Eigen::Matrix; using Mat6 = Eigen::Matrix; using MatX = Eigen::Matrix; using LandmarkBlockPtr = std::unique_ptr>; using ImuBlockPtr = std::unique_ptr>; using typename Base::Options; LinearizationAbsQR( BundleAdjustmentBase* estimator, const AbsOrderMap& aom, const Options& options, const MargLinData* marg_lin_data = nullptr, const ImuLinData* imu_lin_data = nullptr, const std::set* used_frames = nullptr, const std::unordered_set* lost_landmarks = nullptr, int64_t last_state_to_marg = std::numeric_limits::max()); // destructor defined in cpp b/c of unique_ptr destructor (ImuBlock) // copy/move constructor/assignment-operator for rule-of-five ~LinearizationAbsQR(); LinearizationAbsQR(const LinearizationAbsQR&) = default; LinearizationAbsQR(LinearizationAbsQR&&) = default; LinearizationAbsQR& operator=(const LinearizationAbsQR&) = default; LinearizationAbsQR& operator=(LinearizationAbsQR&&) = default; void log_problem_stats(ExecutionStats& stats) const override; Scalar linearizeProblem(bool* numerically_valid = nullptr) override; void performQR() override; void setPoseDamping(const Scalar lambda); bool hasPoseDamping() const { return pose_damping_diagonal > 0; } Scalar backSubstitute(const VecX& pose_inc) override; VecX getJp_diag2() const; void scaleJl_cols(); void scaleJp_cols(const VecX& jacobian_scaling); void setLandmarkDamping(Scalar lambda); void get_dense_Q2Jp_Q2r(MatX& Q2Jp, VecX& Q2r) const override; void get_dense_H_b(MatX& H, VecX& b) const override; protected: // types using PoseLinMapType = Eigen::aligned_unordered_map, RelPoseLin>; using PoseLinMapTypeConstIter = typename PoseLinMapType::const_iterator; using HostLandmarkMapType = std::unordered_map*>>; protected: // helper void get_dense_Q2Jp_Q2r_pose_damping(MatX& Q2Jp, size_t start_idx) const; void get_dense_Q2Jp_Q2r_marg_prior(MatX& Q2Jp, VecX& Q2r, size_t start_idx) const; void add_dense_H_b_pose_damping(MatX& H) const; void add_dense_H_b_marg_prior(MatX& H, VecX& b) const; void add_dense_H_b_imu(DenseAccumulator& accum) const; void add_dense_H_b_imu(MatX& H, VecX& b) const; protected: Options options_; std::vector landmark_ids; std::vector landmark_blocks; std::vector imu_blocks; std::unordered_map host_to_idx_; HostLandmarkMapType host_to_landmark_block; std::vector landmark_block_idx; const BundleAdjustmentBase* estimator; LandmarkDatabase& lmdb_; const Eigen::aligned_map>& frame_poses; const Calibration& calib; const AbsOrderMap& aom; const std::set* used_frames; const MargLinData* marg_lin_data; const ImuLinData* imu_lin_data; PoseLinMapType relative_pose_lin; std::vector> relative_pose_per_host; Scalar pose_damping_diagonal; Scalar pose_damping_diagonal_sqrt; VecX marg_scaling; size_t num_cameras; size_t num_rows_Q2r; }; } // namespace basalt