diff --git a/src/capture_IMU.cpp b/src/capture_IMU.cpp index d497a0f77e1fbf33116f5df2a89603c4d857ca64..90e494dbfbbad1ad538065417af10b47567a47a8 100644 --- a/src/capture_IMU.cpp +++ b/src/capture_IMU.cpp @@ -11,9 +11,9 @@ CaptureIMU::CaptureIMU(const TimeStamp& _init_ts, const Eigen::Vector6s& _acc_gyro_data, const Eigen::MatrixXs& _data_cov, FrameBasePtr _origin_frame_ptr) : - CaptureMotion(_init_ts, _sensor_ptr, _acc_gyro_data, _data_cov, 10, 9, _origin_frame_ptr, nullptr, nullptr, std::make_shared<StateBlock>(6, false)) + CaptureMotion("IMU", _init_ts, _sensor_ptr, _acc_gyro_data, _data_cov, 10, 9, _origin_frame_ptr, nullptr, nullptr, std::make_shared<StateBlock>(6, false)) { - setType("IMU"); + // } CaptureIMU::CaptureIMU(const TimeStamp& _init_ts, @@ -22,9 +22,9 @@ CaptureIMU::CaptureIMU(const TimeStamp& _init_ts, const Eigen::MatrixXs& _data_cov, const Vector6s& _bias, FrameBasePtr _origin_frame_ptr) : - CaptureMotion(_init_ts, _sensor_ptr, _acc_gyro_data, _data_cov, 10, 9, _origin_frame_ptr, nullptr, nullptr, std::make_shared<StateBlock>(_bias, false)) + CaptureMotion("IMU", _init_ts, _sensor_ptr, _acc_gyro_data, _data_cov, 10, 9, _origin_frame_ptr, nullptr, nullptr, std::make_shared<StateBlock>(_bias, false)) { - setType("IMU"); + // } diff --git a/src/capture_base.cpp b/src/capture_base.cpp index 60b2858cc7a8a202016d217f209c1e6c659cca56..fdc75a7be4916f3c8e379538dac4666673bed08c 100644 --- a/src/capture_base.cpp +++ b/src/capture_base.cpp @@ -56,6 +56,8 @@ CaptureBase::CaptureBase(const std::string& _type, WOLF_ERROR("Provided sensor parameters but no sensor pointer"); } updateCalibSize(); + + WOLF_TRACE("New Capture ", id(), " -- type ", getType(), " -- t = ", getTimeStamp(), " s"); } diff --git a/src/capture_image.cpp b/src/capture_image.cpp index a198322d17f4acefc259dd8c6337a23d7519e56a..6a7950d6253696a2e3aa1def2ea67139e99c157e 100644 --- a/src/capture_image.cpp +++ b/src/capture_image.cpp @@ -3,7 +3,14 @@ namespace wolf { CaptureImage::CaptureImage(const TimeStamp& _ts, SensorCameraPtr _camera_ptr, cv::Mat _data_cv) : - CaptureBase("IMAGE", _ts, _camera_ptr), frame_(_data_cv) + CaptureBase("IMAGE", _ts, _camera_ptr), + frame_(_data_cv), + grid_features_(nullptr), + keypoints_(KeyPointVector()), + descriptors_(cv::Mat()), + matches_from_precedent_(DMatchVector()), + matches_normalized_scores_(std::vector<Scalar>()), + map_index_to_next_(std::map<int, int>()) { // } diff --git a/src/capture_image.h b/src/capture_image.h index 312735ff2918447356d06d669e6e5a0aef3502d0..dd5895338e5144879d32d80896e8880c180e7b2a 100644 --- a/src/capture_image.h +++ b/src/capture_image.h @@ -7,8 +7,8 @@ #include "sensor_camera.h" // Vision Utils includes -#include <vision_utils.h> -#include <common_class/frame.h> +#include <vision_utils/vision_utils.h> +#include <vision_utils/common_class/frame.h> namespace wolf { @@ -26,6 +26,14 @@ class CaptureImage : public CaptureBase protected: vision_utils::Frame frame_; + public: + vision_utils::FeatureIdxGridPtr grid_features_; + KeyPointVector keypoints_; + cv::Mat descriptors_; + DMatchVector matches_from_precedent_; + std::vector<Scalar> matches_normalized_scores_; + std::map<int, int> map_index_to_next_; + public: CaptureImage(const TimeStamp& _ts, SensorCameraPtr _camera_ptr, cv::Mat _data_cv); virtual ~CaptureImage(); diff --git a/src/capture_motion.cpp b/src/capture_motion.cpp index a4d74cbfbb67a5f60e9ec5debbcbbf72a6cc83ff..3c7a5158c68c98c1810042b1cdd4a69eb9ba0489 100644 --- a/src/capture_motion.cpp +++ b/src/capture_motion.cpp @@ -10,13 +10,14 @@ namespace wolf { -CaptureMotion::CaptureMotion(const TimeStamp& _ts, +CaptureMotion::CaptureMotion(const std::string & _type, + const TimeStamp& _ts, SensorBasePtr _sensor_ptr, const Eigen::VectorXs& _data, Size _delta_size, Size _delta_cov_size, FrameBasePtr _origin_frame_ptr) : - CaptureBase("MOTION", _ts, _sensor_ptr), + CaptureBase(_type, _ts, _sensor_ptr), data_(_data), data_cov_(_sensor_ptr ? _sensor_ptr->getNoiseCov() : Eigen::MatrixXs::Zero(_data.rows(), _data.rows())), // Someone should test this zero and do something smart accordingly buffer_(_data.size(), _delta_size, _delta_cov_size, computeCalibSize()), @@ -25,7 +26,8 @@ CaptureMotion::CaptureMotion(const TimeStamp& _ts, // } -CaptureMotion::CaptureMotion(const TimeStamp& _ts, +CaptureMotion::CaptureMotion(const std::string & _type, + const TimeStamp& _ts, SensorBasePtr _sensor_ptr, const Eigen::VectorXs& _data, const Eigen::MatrixXs& _data_cov, @@ -35,7 +37,7 @@ CaptureMotion::CaptureMotion(const TimeStamp& _ts, StateBlockPtr _p_ptr , StateBlockPtr _o_ptr , StateBlockPtr _intr_ptr ) : - CaptureBase("MOTION", _ts, _sensor_ptr, _p_ptr, _o_ptr, _intr_ptr), + CaptureBase(_type, _ts, _sensor_ptr, _p_ptr, _o_ptr, _intr_ptr), data_(_data), data_cov_(_data_cov), buffer_(_data.size(), _delta_size, _delta_cov_size, computeCalibSize()), diff --git a/src/capture_motion.h b/src/capture_motion.h index 6cc4f1732280192431e9e37b9b485fca82e30498..056d3c486f8f98aa8fd5d954c408a37eb77291d2 100644 --- a/src/capture_motion.h +++ b/src/capture_motion.h @@ -46,13 +46,17 @@ class CaptureMotion : public CaptureBase // public interface: public: - CaptureMotion(const TimeStamp& _ts, SensorBasePtr _sensor_ptr, + CaptureMotion(const std::string & _type, + const TimeStamp& _ts, + SensorBasePtr _sensor_ptr, const Eigen::VectorXs& _data, Size _delta_size, Size _delta_cov_size, FrameBasePtr _origin_frame_ptr); - CaptureMotion(const TimeStamp& _ts, SensorBasePtr _sensor_ptr, + CaptureMotion(const std::string & _type, + const TimeStamp& _ts, + SensorBasePtr _sensor_ptr, const Eigen::VectorXs& _data, const Eigen::MatrixXs& _data_cov, Size _delta_size, Size _delta_cov_size, diff --git a/src/capture_odom_2D.cpp b/src/capture_odom_2D.cpp index 24e9f2ee280f0e3c272f87c99acb144a2974f511..5d8eabccb3ab7e01ef77e14709778da904e43f97 100644 --- a/src/capture_odom_2D.cpp +++ b/src/capture_odom_2D.cpp @@ -14,9 +14,9 @@ CaptureOdom2D::CaptureOdom2D(const TimeStamp& _init_ts, SensorBasePtr _sensor_ptr, const Eigen::VectorXs& _data, FrameBasePtr _origin_frame_ptr): - CaptureMotion(_init_ts, _sensor_ptr, _data, 3, 3, _origin_frame_ptr) + CaptureMotion("ODOM 2D", _init_ts, _sensor_ptr, _data, 3, 3, _origin_frame_ptr) { - setType("ODOM 2D"); + // } CaptureOdom2D::CaptureOdom2D(const TimeStamp& _init_ts, @@ -24,9 +24,9 @@ CaptureOdom2D::CaptureOdom2D(const TimeStamp& _init_ts, const Eigen::VectorXs& _data, const Eigen::MatrixXs& _data_cov, FrameBasePtr _origin_frame_ptr): - CaptureMotion(_init_ts, _sensor_ptr, _data, _data_cov, 3, 3, _origin_frame_ptr) + CaptureMotion("ODOM 2D", _init_ts, _sensor_ptr, _data, _data_cov, 3, 3, _origin_frame_ptr) { - setType("ODOM 2D"); + // } CaptureOdom2D::~CaptureOdom2D() diff --git a/src/capture_odom_3D.cpp b/src/capture_odom_3D.cpp index 232f088ffa9f639e089a5c154342217a5eb80d52..f6ba1dea9e315c88cb36676c89ede40675028169 100644 --- a/src/capture_odom_3D.cpp +++ b/src/capture_odom_3D.cpp @@ -14,9 +14,9 @@ CaptureOdom3D::CaptureOdom3D(const TimeStamp& _init_ts, SensorBasePtr _sensor_ptr, const Eigen::Vector6s& _data, FrameBasePtr _origin_frame_ptr): - CaptureMotion(_init_ts, _sensor_ptr, _data, 7, 6, _origin_frame_ptr) + CaptureMotion("ODOM 3D", _init_ts, _sensor_ptr, _data, 7, 6, _origin_frame_ptr) { - setType("ODOM 3D"); + // } CaptureOdom3D::CaptureOdom3D(const TimeStamp& _init_ts, @@ -24,9 +24,9 @@ CaptureOdom3D::CaptureOdom3D(const TimeStamp& _init_ts, const Eigen::Vector6s& _data, const Eigen::MatrixXs& _data_cov, FrameBasePtr _origin_frame_ptr): - CaptureMotion(_init_ts, _sensor_ptr, _data, _data_cov, 7, 6, _origin_frame_ptr) + CaptureMotion("ODOM 3D", _init_ts, _sensor_ptr, _data, _data_cov, 7, 6, _origin_frame_ptr) { - setType("ODOM 3D"); + // } CaptureOdom3D::~CaptureOdom3D() diff --git a/src/captures/CMakeLists.txt b/src/captures/CMakeLists.txt index c856a0c217f4f7c1bc631532498358be1a279736..008619d7b78511d7deb0bbd1d9133845b667a140 100644 --- a/src/captures/CMakeLists.txt +++ b/src/captures/CMakeLists.txt @@ -5,9 +5,18 @@ INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}) SET(HDRS_CAPTURE ${HDRS_CAPTURE} ${CMAKE_CURRENT_SOURCE_DIR}/capture_velocity.h ${CMAKE_CURRENT_SOURCE_DIR}/capture_wheel_joint_position.h - PARENT_SCOPE) + ) SET(SRCS_CAPTURE ${SRCS_CAPTURE} ${CMAKE_CURRENT_SOURCE_DIR}/capture_velocity.cpp ${CMAKE_CURRENT_SOURCE_DIR}/capture_wheel_joint_position.cpp - PARENT_SCOPE) + ) + + + + + + +# These lines always at the end +SET(HDRS_CAPTURE ${HDRS_CAPTURE} PARENT_SCOPE) +SET(SRCS_CAPTURE ${SRCS_CAPTURE} PARENT_SCOPE) diff --git a/src/captures/capture_velocity.cpp b/src/captures/capture_velocity.cpp index 45384d37e0178ad2a56f0de760181b0d7d9a9fe2..49e5ce8ee313e6d0ac16096841b8a17866ed7902 100644 --- a/src/captures/capture_velocity.cpp +++ b/src/captures/capture_velocity.cpp @@ -7,10 +7,10 @@ CaptureVelocity::CaptureVelocity(const TimeStamp& _ts, const Eigen::VectorXs& _velocity, Size _delta_size, Size _delta_cov_size, FrameBasePtr _origin_frame_ptr) : - CaptureMotion(_ts, _sensor_ptr, _velocity, + CaptureMotion("VELOCITY", _ts, _sensor_ptr, _velocity, _delta_size, _delta_cov_size, _origin_frame_ptr) { - setType("VELOCITY"); + // } CaptureVelocity::CaptureVelocity(const TimeStamp& _ts, @@ -22,11 +22,11 @@ CaptureVelocity::CaptureVelocity(const TimeStamp& _ts, StateBlockPtr _p_ptr, StateBlockPtr _o_ptr, StateBlockPtr _intr_ptr) : - CaptureMotion(_ts, _sensor_ptr, _velocity, _velocity_cov, + CaptureMotion("VELOCITY", _ts, _sensor_ptr, _velocity, _velocity_cov, _delta_size, _delta_cov_size, _origin_frame_ptr, _p_ptr, _o_ptr, _intr_ptr) { - setType("VELOCITY"); + // } const Eigen::VectorXs& CaptureVelocity::getVelocity() const diff --git a/src/captures/capture_wheel_joint_position.cpp b/src/captures/capture_wheel_joint_position.cpp index 46caa2d95c6f7aaf4d81e29523b5da2a9aa7d3be..a43786df6fd0866088e0e42909acc29a9ad7017c 100644 --- a/src/captures/capture_wheel_joint_position.cpp +++ b/src/captures/capture_wheel_joint_position.cpp @@ -8,10 +8,10 @@ CaptureWheelJointPosition::CaptureWheelJointPosition(const TimeStamp& _ts, const SensorBasePtr& _sensor_ptr, const Eigen::VectorXs& _positions, FrameBasePtr _origin_frame_ptr) : - CaptureMotion(_ts, _sensor_ptr, _positions, Eigen::Matrix2s::Zero(), 3, 3, + CaptureMotion("WHEEL JOINT POSITION", _ts, _sensor_ptr, _positions, Eigen::Matrix2s::Zero(), 3, 3, _origin_frame_ptr/*, nullptr, nullptr, std::make_shared<StateBlock>(3, false)*/) { -// setType("WHEEL JOINT POSITION"); +// const IntrinsicsDiffDrive intrinsics = *(std::static_pointer_cast<SensorDiffDrive>(getSensorPtr())->getIntrinsics()); @@ -31,10 +31,10 @@ CaptureWheelJointPosition::CaptureWheelJointPosition(const TimeStamp& _ts, StateBlockPtr _p_ptr, StateBlockPtr _o_ptr, StateBlockPtr _intr_ptr) : - CaptureMotion(_ts, _sensor_ptr, _positions, _positions_cov, 3, 3, + CaptureMotion("WHEEL JOINT POSITION", _ts, _sensor_ptr, _positions, _positions_cov, 3, 3, _origin_frame_ptr, _p_ptr, _o_ptr, _intr_ptr) { -// setType("WHEEL JOINT POSITION"); +// } Eigen::VectorXs CaptureWheelJointPosition::correctDelta(const VectorXs& _delta, diff --git a/src/ceres_wrapper/ceres_manager.h b/src/ceres_wrapper/ceres_manager.h index 6486f200efd89a492cc0260258a542c2ac50823d..94c3d3dbe01e066205cd6ceb7179c22b1dc1df42 100644 --- a/src/ceres_wrapper/ceres_manager.h +++ b/src/ceres_wrapper/ceres_manager.h @@ -49,9 +49,9 @@ public: ceres::Solver::Summary getSummary(); virtual void computeCovariances(CovarianceBlocksToBeComputed _blocks - = CovarianceBlocksToBeComputed::ROBOT_LANDMARKS); + = CovarianceBlocksToBeComputed::ROBOT_LANDMARKS) override; - virtual void computeCovariances(const StateBlockList& st_list); + virtual void computeCovariances(const StateBlockList& st_list) override; ceres::Solver::Options& getSolverOptions(); diff --git a/src/constraints/CMakeLists.txt b/src/constraints/CMakeLists.txt index 1caa225ee7e3bcef9d91061097dd443441c160ba..587c9b9d99a1f12f6a6f3035801d7657defa33f7 100644 --- a/src/constraints/CMakeLists.txt +++ b/src/constraints/CMakeLists.txt @@ -6,7 +6,14 @@ SET(HDRS_CONSTRAINT ${HDRS_CONSTRAINT} ${CMAKE_CURRENT_SOURCE_DIR}/constraint_autodiff_distance_3D.h ${CMAKE_CURRENT_SOURCE_DIR}/constraint_autodiff_trifocal.h ${CMAKE_CURRENT_SOURCE_DIR}/constraint_diff_drive.h - PARENT_SCOPE) + ) SET(SRCS_CONSTRAINT ${SRCS_CONSTRAINT} - PARENT_SCOPE) + ) + + +# These lines always at the end +SET(HDRS_CONSTRAINT ${HDRS_CONSTRAINT} PARENT_SCOPE) +SET(SRCS_CONSTRAINT ${SRCS_CONSTRAINT} PARENT_SCOPE) + + \ No newline at end of file diff --git a/src/constraints/constraint_autodiff_trifocal.h b/src/constraints/constraint_autodiff_trifocal.h index 405066042531bd8f9b508830d42141371470ad4c..ac54629a62fcee98f469cce5b65f3864c3147de1 100644 --- a/src/constraints/constraint_autodiff_trifocal.h +++ b/src/constraints/constraint_autodiff_trifocal.h @@ -6,8 +6,8 @@ #include "constraint_autodiff.h" #include "sensor_camera.h" -#include <vision_utils/common_class/trifocaltensor.h> -#include <vision_utils/vision_utils.h> +#include <common_class/trifocaltensor.h> +#include <vision_utils.h> namespace wolf { @@ -172,7 +172,7 @@ ConstraintAutodiffTrifocal::ConstraintAutodiffTrifocal( Vector3s rtc = _feature_last_ptr ->getCapturePtr()->getSensorPPtr()->getState(); Quaternions rqc = Quaternions(_feature_last_ptr ->getCapturePtr()->getSensorOPtr()->getState().data() ); - // expectation + // expectation // canonical units vision_utils::TrifocalTensorBase<Scalar> tensor; Matrix3s c2Ec1; expectation(wtr1, wqr1, @@ -181,7 +181,7 @@ ConstraintAutodiffTrifocal::ConstraintAutodiffTrifocal( rtc, rqc, tensor, c2Ec1); - // error Jacobians + // error Jacobians // canonical units Matrix<Scalar,3,3> J_e_m1, J_e_m2, J_e_m3; error_jacobians(tensor, c2Ec1, J_e_m1, J_e_m2, J_e_m3); @@ -190,17 +190,21 @@ ConstraintAutodiffTrifocal::ConstraintAutodiffTrifocal( Matrix<Scalar,3,2> J_e_u2 = J_e_m2 * J_m_u; Matrix<Scalar,3,2> J_e_u3 = J_e_m3 * J_m_u; - // Error covariances induced by each of the measurement covariance + // Error covariances induced by each of the measurement covariance // canonical units Matrix3s Q1 = J_e_u1 * getFeaturePrevPtr() ->getMeasurementCovariance() * J_e_u1.transpose(); Matrix3s Q2 = J_e_u2 * getFeatureOtherPtr()->getMeasurementCovariance() * J_e_u2.transpose(); Matrix3s Q3 = J_e_u3 * getFeaturePtr() ->getMeasurementCovariance() * J_e_u3.transpose(); - // Total error covariance + // Total error covariance // canonical units Matrix3s Q = Q1 + Q2 + Q3; - // Sqrt of information matrix + // Sqrt of information matrix // canonical units Eigen::LLT<Eigen::MatrixXs> llt_of_info(Q.inverse()); // Cholesky decomposition sqrt_information_upper = llt_of_info.matrixU(); + + // Re-write info matrix (for debug only) + // Scalar pix_noise = 1.0; + // sqrt_information_upper = pow(1.0/pix_noise, 2) * Matrix3s::Identity(); // one PLP (2D) and one epipolar (1D) constraint } // Destructor diff --git a/src/examples/ACTIVESEARCH.yaml b/src/examples/ACTIVESEARCH.yaml index 4ff33b353b3921c223665c78f6d9bb8029377c78..028f69ba6321802009765d346f2e735c6a018990 100644 --- a/src/examples/ACTIVESEARCH.yaml +++ b/src/examples/ACTIVESEARCH.yaml @@ -33,7 +33,7 @@ matcher: algorithm: type: "ACTIVESEARCH" - draw results: true + draw results: false grid horiz cells: 12 grid vert cells: 8 separation: 10 diff --git a/src/examples/processor_tracker_feature_trifocal.yaml b/src/examples/processor_tracker_feature_trifocal.yaml index ec31607cfb6ecef94b4506b3fa6d9d174df1caff..67d403058fa6637a15309cb724524c1f9106778d 100644 --- a/src/examples/processor_tracker_feature_trifocal.yaml +++ b/src/examples/processor_tracker_feature_trifocal.yaml @@ -9,6 +9,10 @@ algorithm: voting active: true minimum features for keyframe: 40 maximum new features: 40 + grid horiz cells: 10 + grid vert cells: 10 + min response new features: 50 + max euclidean distance: 20 noise: pixel noise std: 1 # pixels diff --git a/src/examples/test_2_lasers_offline.cpp b/src/examples/test_2_lasers_offline.cpp index 5df1a0f01a1c57fa6d0601fb77e9c18d2870344b..5c5672c79a21e9e6b12e082ff5873565b9c3cb52 100644 --- a/src/examples/test_2_lasers_offline.cpp +++ b/src/examples/test_2_lasers_offline.cpp @@ -149,7 +149,7 @@ int main(int argc, char** argv) Problem problem(FRM_PO_2D); SensorOdom2D* odom_sensor = (SensorOdom2D*)problem.installSensor("ODOM 2D", "odometer", odom_pose, &odom_intrinsics); ProcessorParamsOdom2D odom_params; - odom_params.cov_det_th_ = 1; + odom_params.cov_det = 1; odom_params.dist_traveled_th_ = 5; odom_params.elapsed_time_th_ = 10; ProcessorOdom2D* odom_processor = (ProcessorOdom2D*)problem.installProcessor("ODOM 2D", "main odometry", odom_sensor, &odom_params); diff --git a/src/examples/test_constraint_AHP.cpp b/src/examples/test_constraint_AHP.cpp index 8be57bd098e7b0f735ff76f6363e0ed730a1e650..8e555cac0ba244dc67bde5d8ce86990672a0a244 100644 --- a/src/examples/test_constraint_AHP.cpp +++ b/src/examples/test_constraint_AHP.cpp @@ -76,7 +76,7 @@ int main() cv::KeyPoint kp; kp.pt = {10,20}; cv::Mat desc; - FeaturePointImagePtr feat_point_image_ptr = std::make_shared<FeaturePointImage>(kp, desc, Eigen::Matrix2s::Identity()); + FeaturePointImagePtr feat_point_image_ptr = std::make_shared<FeaturePointImage>(kp, 0, desc, Eigen::Matrix2s::Identity()); image_ptr->addFeature(feat_point_image_ptr); FrameBasePtr anchor_frame = std::make_shared< FrameBase>(t,std::make_shared<StateBlock>(frame_val.head(3)), std::make_shared<StateQuaternion>(frame_val.tail(4))); diff --git a/src/examples/test_diff_drive.cpp b/src/examples/test_diff_drive.cpp index 07d272178f3f622745ff8def9848d2512523a426..821f5bdd8038417b50fa0714e69b68ae58f33ede 100644 --- a/src/examples/test_diff_drive.cpp +++ b/src/examples/test_diff_drive.cpp @@ -196,8 +196,13 @@ int main(int argc, char** argv) const auto scalar_max = std::numeric_limits<Scalar>::max(); - ProcessorParamsBasePtr processor_params = - std::make_shared<ProcessorParamsDiffDrive>(period_secs/2, scalar_max, scalar_max, scalar_max); + ProcessorParamsDiffDrivePtr processor_params = std::make_shared<ProcessorParamsDiffDrive>(); + processor_params->time_tolerance = period_secs/2; + processor_params->angle_turned = scalar_max; + processor_params->dist_traveled = scalar_max; + processor_params->max_time_span = scalar_max; + processor_params->max_buff_length = 999; + processor_params->unmeasured_perturbation_std = 0.0001; SensorBasePtr sensor_ptr = wolf_problem_ptr_->installSensor("DIFF DRIVE", sensor_name, extrinsics, intrinsics); diff --git a/src/examples/test_image.cpp b/src/examples/test_image.cpp index 7f700f69760cff8b93b06daebc89014dfc73c33a..c5afcc61b462553ad01de0e4f27de31f6854d8ea 100644 --- a/src/examples/test_image.cpp +++ b/src/examples/test_image.cpp @@ -8,9 +8,9 @@ // Vision utils includes #include <vision_utils.h> -#include <vision_utils/sensors.h> -#include <vision_utils/common_class/buffer.h> -#include <vision_utils/common_class/frame.h> +#include <sensors.h> +#include <common_class/buffer.h> +#include <common_class/frame.h> //std includes #include <ctime> @@ -75,8 +75,8 @@ int main(int argc, char** argv) // tracker_params.active_search.grid_width = 12; // tracker_params.active_search.grid_height = 8; // tracker_params.active_search.separation = 1; -// tracker_params.algorithm.max_new_features =0; -// tracker_params.algorithm.min_features_for_keyframe = 20; +// tracker_params.max_new_features =0; +// tracker_params.min_features_for_keyframe = 20; // // DetectorDescriptorParamsOrb orb_params; // orb_params.type = DD_ORB; diff --git a/src/examples/test_kf_callback.cpp b/src/examples/test_kf_callback.cpp index d8becd8210492f1d07cf3826d4b29bbaa28fb9d9..2822294e75b479df9f493810c73e28bd558aa4f6 100644 --- a/src/examples/test_kf_callback.cpp +++ b/src/examples/test_kf_callback.cpp @@ -22,13 +22,17 @@ int main() SensorBasePtr sen_odo = problem->installSensor ("ODOM 2D", "main odometer", (Vector3s()<<0,0,0).finished(),""); ProcessorParamsOdom2DPtr params_odo = std::make_shared<ProcessorParamsOdom2D>(); - params_odo->elapsed_time_th_ = 2; - params_odo->theta_traveled_th_ = M_PI; // 180 degrees turn + params_odo->max_time_span = 2; + params_odo->angle_turned = M_PI; // 180 degrees turn ProcessorBasePtr prc_odo = problem->installProcessor("ODOM 2D", "odometry integrator", sen_odo, params_odo); prc_odo->setTimeTolerance(0.1); SensorBasePtr sen_ftr = problem->installSensor ("ODOM 2D", "other odometer", (Vector3s()<<0,0,0).finished(),""); - shared_ptr<ProcessorTrackerFeatureDummy> prc_ftr = make_shared<ProcessorTrackerFeatureDummy>(0.5, 7, 4); + ProcessorParamsTrackerFeaturePtr params_trk = std::make_shared<ProcessorParamsTrackerFeature>(); + params_trk->max_new_features = 4; + params_trk->min_features_for_keyframe = 7; + params_trk->time_tolerance = 0.5; + shared_ptr<ProcessorTrackerFeatureDummy> prc_ftr = make_shared<ProcessorTrackerFeatureDummy>(params_trk); prc_ftr->setName("tracker"); sen_ftr->addProcessor(prc_ftr); prc_ftr->setTimeTolerance(0.1); @@ -60,7 +64,7 @@ int main() cout << "=======================\n>> TIME: " << t.get() << endl; cout << "Motion-----------------" << endl; - sen_odo->process(make_shared<CaptureMotion>(t, sen_odo, odo_data, 3, 3, nullptr)); + sen_odo->process(make_shared<CaptureMotion>("ODOM 2D", t, sen_odo, odo_data, 3, 3, nullptr)); cout << "x(" << t.get() << ") = " << problem->getCurrentState().transpose() << endl; problem->print(2, false, true, true); // print(level, constr_by, metric, state_blocks) diff --git a/src/examples/test_processor_odom_3D.cpp b/src/examples/test_processor_odom_3D.cpp index 8cfdb9d8822347057fe30751058f253b5ea340b9..b7c2c9a9d7313387990b6a9b1b02de18707e5b37 100644 --- a/src/examples/test_processor_odom_3D.cpp +++ b/src/examples/test_processor_odom_3D.cpp @@ -66,7 +66,7 @@ int main (int argc, char** argv) Scalar dyaw = 2*M_PI/5; Vector6s data((Vector6s() << dx*cos(dyaw/2),dx*sin(dyaw/2),0,0,0,dyaw).finished()); // will integrate this data repeatedly - CaptureMotionPtr cap_odo = std::make_shared<CaptureMotion>(TimeStamp(0), sen, data, 7, 6, nullptr); + CaptureMotionPtr cap_odo = std::make_shared<CaptureMotion>("ODOM 3D", TimeStamp(0), sen, data, 7, 6, nullptr); cout << "t: " << std::setprecision(2) << 0 << " \t x = ( " << problem->getCurrentState().transpose() << ")" << endl; diff --git a/src/examples/test_processor_tracker_feature.cpp b/src/examples/test_processor_tracker_feature.cpp index fcf29c545f2cdd837f5190f0c123e8bde25835d7..943e1801078adc795409deebe50cb9b49f16dabb 100644 --- a/src/examples/test_processor_tracker_feature.cpp +++ b/src/examples/test_processor_tracker_feature.cpp @@ -31,7 +31,11 @@ int main() std::make_shared<StateBlock>(Eigen::VectorXs::Zero(1)), std::make_shared<StateBlock>(Eigen::VectorXs::Zero(2)), 2); - shared_ptr<ProcessorTrackerFeatureDummy> processor_ptr_ = make_shared<ProcessorTrackerFeatureDummy>(.25, 7, 4); + ProcessorParamsTrackerFeaturePtr params_trk = std::make_shared<ProcessorParamsTrackerFeature>(); + params_trk->max_new_features = 4; + params_trk->min_features_for_keyframe = 7; + params_trk->time_tolerance = 0.25; + shared_ptr<ProcessorTrackerFeatureDummy> processor_ptr_ = make_shared<ProcessorTrackerFeatureDummy>(params_trk); wolf_problem_ptr_->addSensor(sensor_ptr_); sensor_ptr_->addProcessor(processor_ptr_); diff --git a/src/examples/test_processor_tracker_landmark.cpp b/src/examples/test_processor_tracker_landmark.cpp index 6f828298d8147e1bba28f373558d8eda96c04276..bbf3e4132ed3dc6cae6342908a95d1c6382fe559 100644 --- a/src/examples/test_processor_tracker_landmark.cpp +++ b/src/examples/test_processor_tracker_landmark.cpp @@ -66,7 +66,11 @@ int main() std::make_shared<StateBlock>(Eigen::VectorXs::Zero(1)), std::make_shared<StateBlock>(Eigen::VectorXs::Zero(2)), 2); - std::shared_ptr<ProcessorTrackerLandmarkDummy> processor_ptr_ = std::make_shared< ProcessorTrackerLandmarkDummy>(.25, 5); + ProcessorParamsTrackerLandmarkPtr params_trk = std::make_shared<ProcessorParamsTrackerLandmark>(); + params_trk->max_new_features = 5; + params_trk->min_features_for_keyframe = 7; + params_trk->time_tolerance = 0.25; + std::shared_ptr<ProcessorTrackerLandmarkDummy> processor_ptr_ = std::make_shared< ProcessorTrackerLandmarkDummy>(params_trk); wolf_problem_ptr_->addSensor(sensor_ptr_); sensor_ptr_->addProcessor(processor_ptr_); diff --git a/src/examples/test_processor_tracker_landmark_image.cpp b/src/examples/test_processor_tracker_landmark_image.cpp index 4060656a2ac762d4bb2ac4904f047cf9ccccd163..bbd3b8ca6a72516d50e7fd4da4d70eb30aed8e45 100644 --- a/src/examples/test_processor_tracker_landmark_image.cpp +++ b/src/examples/test_processor_tracker_landmark_image.cpp @@ -1,21 +1,24 @@ //std #include <iostream> -#include "../capture_pose.h" +#include "processor_tracker_landmark_image.h" + //Wolf #include "wolf.h" #include "problem.h" #include "state_block.h" #include "processor_odom_3D.h" #include "sensor_odom_3D.h" +#include "sensor_camera.h" +#include "capture_image.h" +#include "capture_pose.h" #include "ceres_wrapper/ceres_manager.h" // Vision utils includes #include <vision_utils.h> -#include <vision_utils/sensors.h> -#include <vision_utils/common_class/buffer.h> -#include <vision_utils/common_class/frame.h> -#include "../processor_tracker_landmark_image.h" +#include <sensors.h> +#include <common_class/buffer.h> +#include <common_class/frame.h> using Eigen::Vector3s; using Eigen::Vector4s; @@ -107,7 +110,7 @@ int main(int argc, char** argv) // running CAPTURES preallocated CaptureImagePtr image; Vector6s data(Vector6s::Zero()); // will integrate this data repeatedly - CaptureMotionPtr cap_odo = std::make_shared<CaptureMotion>(t, sensor_odom, data, 7, 6, nullptr); + CaptureMotionPtr cap_odo = std::make_shared<CaptureMotion>("IMAGE", t, sensor_odom, data, 7, 6, nullptr); //===================================================== //===================================================== diff --git a/src/examples/test_projection_points.cpp b/src/examples/test_projection_points.cpp index dc63b8e2f99115a853d97a1ddda1826b8807d64a..7945c939f82355435c422c691433d9b48937ccda 100644 --- a/src/examples/test_projection_points.cpp +++ b/src/examples/test_projection_points.cpp @@ -1,6 +1,6 @@ // Vision utils -#include <vision_utils.h> +#include <vision_utils/vision_utils.h> //std includes #include <iostream> diff --git a/src/examples/test_simple_AHP.cpp b/src/examples/test_simple_AHP.cpp index 0f4d3f8eb8d7af228db27d3535c808909a780356..6a3279326aafb627e7c12a57b39aef26fb93ad4d 100644 --- a/src/examples/test_simple_AHP.cpp +++ b/src/examples/test_simple_AHP.cpp @@ -16,7 +16,7 @@ #include "ceres_wrapper/ceres_manager.h" // Vision utils -#include <vision_utils.h> +#include <vision_utils/vision_utils.h> /** * This test simulates the following situation: @@ -144,15 +144,15 @@ int main(int argc, char** argv) cv::Mat desc; cv::KeyPoint kp_0; - FeaturePointImagePtr feat_0 = std::make_shared<FeaturePointImage>(kp_0, desc, Eigen::Matrix2s::Identity()); + FeaturePointImagePtr feat_0 = std::make_shared<FeaturePointImage>(kp_0, 0, desc, Eigen::Matrix2s::Identity()); image_0->addFeature(feat_0); cv::KeyPoint kp_1; - FeaturePointImagePtr feat_1 = std::make_shared<FeaturePointImage>(kp_1, desc, Eigen::Matrix2s::Identity()); + FeaturePointImagePtr feat_1 = std::make_shared<FeaturePointImage>(kp_1, 0, desc, Eigen::Matrix2s::Identity()); image_1->addFeature(feat_1); cv::KeyPoint kp_2; - FeaturePointImagePtr feat_2 = std::make_shared<FeaturePointImage>(kp_2, desc, Eigen::Matrix2s::Identity()); + FeaturePointImagePtr feat_2 = std::make_shared<FeaturePointImage>(kp_2, 0, desc, Eigen::Matrix2s::Identity()); image_2->addFeature(feat_2); // Landmark-------------------- @@ -193,10 +193,10 @@ int main(int argc, char** argv) //======== now we want to estimate a new lmk =============== // // Features ----------------- - FeaturePointImagePtr feat_3 = std::make_shared<FeaturePointImage>(kp_1, desc, Eigen::Matrix2s::Identity()); + FeaturePointImagePtr feat_3 = std::make_shared<FeaturePointImage>(kp_1, 0, desc, Eigen::Matrix2s::Identity()); image_1->addFeature(feat_3); - FeaturePointImagePtr feat_4 = std::make_shared<FeaturePointImage>(kp_2, desc, Eigen::Matrix2s::Identity()); + FeaturePointImagePtr feat_4 = std::make_shared<FeaturePointImage>(kp_2, 0, desc, Eigen::Matrix2s::Identity()); image_2->addFeature(feat_4); diff --git a/src/examples/test_tracker_ORB.cpp b/src/examples/test_tracker_ORB.cpp index 6ad9ec638e5e2985b248322817280342fb927e3e..f695a3cb4d7bd0c2e43974c1aef81328846306fe 100644 --- a/src/examples/test_tracker_ORB.cpp +++ b/src/examples/test_tracker_ORB.cpp @@ -3,9 +3,12 @@ // Vision utils #include <vision_utils.h> -#include <vision_utils/sensors.h> -#include <vision_utils/common_class/buffer.h> -#include <vision_utils/common_class/frame.h> +#include <sensors.h> +#include <common_class/buffer.h> +#include <common_class/frame.h> +#include <detectors/orb/detector_orb.h> +#include <descriptors/orb/descriptor_orb.h> +#include <matchers/bruteforce_hamming_2/matcher_bruteforce_hamming_2.h> //Wolf #include "../processor_tracker_landmark_image.h" @@ -137,7 +140,7 @@ int main(int argc, char** argv) if(keypoints.size() != 0) { - mat_ptr->match(target_descriptor, descriptors, cv_matches); + mat_ptr->match(target_descriptor, descriptors, des_ptr->getSize(), cv_matches); Scalar normalized_score = 1 - (Scalar)(cv_matches[0].distance)/(des_ptr->getSize()*8); std::cout << "pixel: " << keypoints[cv_matches[0].trainIdx].pt + roi_up_left_corner << std::endl; std::cout << "normalized score: " << normalized_score << std::endl; diff --git a/src/examples/test_yaml.cpp b/src/examples/test_yaml.cpp index 9a74ae4bcb4abc75bf2b0297de8d64f4648afa35..2ca6eb55eca8c9d4bfddbd6a1b8c84ae5016999a 100644 --- a/src/examples/test_yaml.cpp +++ b/src/examples/test_yaml.cpp @@ -89,8 +89,8 @@ int main() p.image.height = img["height"].as<unsigned int>(); Node alg = params["algorithm"]; - p.algorithm.max_new_features = alg["maximum new features"].as<unsigned int>(); - p.algorithm.min_features_for_keyframe = alg["minimum features for new keyframe"].as<unsigned int>(); + p.max_new_features = alg["maximum new features"].as<unsigned int>(); + p.min_features_for_keyframe = alg["minimum features for new keyframe"].as<unsigned int>(); } diff --git a/src/feature_point_image.h b/src/feature_point_image.h index a1a373378d922aad93dd616d00468bcf9bd23760..43cad5398e235045b0914102dd41be749f63d766 100644 --- a/src/feature_point_image.h +++ b/src/feature_point_image.h @@ -17,6 +17,7 @@ class FeaturePointImage : public FeatureBase { private: cv::KeyPoint keypoint_; ///< Warning: every write operation to this member needs to write measurement_. See setKeypoint() as an example. + unsigned int index_keypoint_; cv::Mat descriptor_; bool is_known_; Scalar score_; @@ -26,10 +27,12 @@ class FeaturePointImage : public FeatureBase /// Constructor from Eigen measured pixel FeaturePointImage(const Eigen::Vector2s & _measured_pixel, + const unsigned int& _index_keypoint, const cv::Mat& _descriptor, const Eigen::Matrix2s& _meas_covariance) : FeatureBase("POINT IMAGE", _measured_pixel, _meas_covariance), keypoint_(_measured_pixel(0), _measured_pixel(1), 1), // Size 1 is a dummy value + index_keypoint_(_index_keypoint), descriptor_( _descriptor), is_known_(false), score_(0) @@ -40,10 +43,12 @@ class FeaturePointImage : public FeatureBase /// Constructor from OpenCV measured keypoint FeaturePointImage(const cv::KeyPoint& _keypoint, + const unsigned int& _index_keypoint, const cv::Mat& _descriptor, const Eigen::Matrix2s& _meas_covariance) : FeatureBase("POINT IMAGE", Eigen::Vector2s::Zero(), _meas_covariance), keypoint_(_keypoint), + index_keypoint_(_index_keypoint), descriptor_(_descriptor), is_known_(false), score_(0) @@ -60,6 +65,9 @@ class FeaturePointImage : public FeatureBase const cv::Mat& getDescriptor() const; void setDescriptor(const cv::Mat& _descriptor); + size_t getIndexKeyPoint() const + { return index_keypoint_; } + bool isKnown(); void setIsKnown(bool _is_known); diff --git a/src/features/CMakeLists.txt b/src/features/CMakeLists.txt index ba959f48215e7310f605e8e57673b3dc64ef6af4..dd0b75aa447b2bd2a09c127e8b7a4abc0064ee58 100644 --- a/src/features/CMakeLists.txt +++ b/src/features/CMakeLists.txt @@ -4,8 +4,15 @@ INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}) SET(HDRS_FEATURE ${HDRS_FEATURE} ${CMAKE_CURRENT_SOURCE_DIR}/feature_diff_drive.h - PARENT_SCOPE) + ) SET(SRCS_FEATURE ${SRCS_FEATURE} ${CMAKE_CURRENT_SOURCE_DIR}/feature_diff_drive.cpp - PARENT_SCOPE) + ) + + + +# These lines always at the end +SET(HDRS_FEATURE ${HDRS_FEATURE} PARENT_SCOPE) +SET(SRCS_FEATURE ${SRCS_FEATURE} PARENT_SCOPE) + \ No newline at end of file diff --git a/src/frame_base.cpp b/src/frame_base.cpp index 70016a8e60045b2edccaa871e1efc85758d3ca8c..53bd22e246d5ca0eb51d32802614f868ca5d075a 100644 --- a/src/frame_base.cpp +++ b/src/frame_base.cpp @@ -24,14 +24,8 @@ FrameBase::FrameBase(const TimeStamp& _ts, StateBlockPtr _p_ptr, StateBlockPtr _ state_block_vec_[1] = _o_ptr; state_block_vec_[2] = _v_ptr; -// if ( isKey() ) -// { -// WOLF_DEBUG("New KF", this->id() ); -// } -// else -// { -// WOLF_DEBUG("New F", this->id() ); -// } + if ( isKey() ) + registerNewStateBlocks(); } FrameBase::FrameBase(const FrameType & _tp, const TimeStamp& _ts, StateBlockPtr _p_ptr, StateBlockPtr _o_ptr, StateBlockPtr _v_ptr) : @@ -47,19 +41,13 @@ FrameBase::FrameBase(const FrameType & _tp, const TimeStamp& _ts, StateBlockPtr state_block_vec_[1] = _o_ptr; state_block_vec_[2] = _v_ptr; -// if ( isKey() ) -// { -// WOLF_DEBUG("New KF", this->id() ); -// } -// else -// { -// WOLF_DEBUG("New F", this->id() ); -// } + if ( isKey() ) + registerNewStateBlocks(); } FrameBase::~FrameBase() { - if (type_ == KEY_FRAME) + if ( isKey() ) removeStateBlocks(); } @@ -88,7 +76,7 @@ void FrameBase::remove() } // Remove Frame State Blocks - if (type_ == KEY_FRAME) + if ( isKey() ) removeStateBlocks(); if (getTrajectoryPtr()->getLastKeyFramePtr()->id() == this_F->id()) diff --git a/src/hello_wolf/CMakeLists.txt b/src/hello_wolf/CMakeLists.txt index 9f2270389436071e20df00d288e5734c2e52ba5c..96b4a4b48ba807ce96c9e2e639bb51093ad29b47 100644 --- a/src/hello_wolf/CMakeLists.txt +++ b/src/hello_wolf/CMakeLists.txt @@ -10,7 +10,6 @@ SET(HDRS_PROCESSOR ${HDRS_PROCESSOR} ${CMAKE_CURRENT_SOURCE_DIR}/landmark_point_2D.h ${CMAKE_CURRENT_SOURCE_DIR}/processor_range_bearing.h ${CMAKE_CURRENT_SOURCE_DIR}/sensor_range_bearing.h - PARENT_SCOPE ) SET(SRCS_PROCESSOR ${SRCS_PROCESSOR} @@ -20,9 +19,16 @@ SET(SRCS_PROCESSOR ${SRCS_PROCESSOR} ${CMAKE_CURRENT_SOURCE_DIR}/landmark_point_2D.cpp ${CMAKE_CURRENT_SOURCE_DIR}/processor_range_bearing.cpp ${CMAKE_CURRENT_SOURCE_DIR}/sensor_range_bearing.cpp - PARENT_SCOPE ) ADD_EXECUTABLE(hello_wolf hello_wolf.cpp) TARGET_LINK_LIBRARIES(hello_wolf ${PROJECT_NAME}) - \ No newline at end of file + + + + +# These lines always at the end +SET(HDRS_PROCESSOR ${HDRS_PROCESSOR} PARENT_SCOPE ) +SET(SRCS_PROCESSOR ${SRCS_PROCESSOR} PARENT_SCOPE ) + + diff --git a/src/hello_wolf/hello_wolf.cpp b/src/hello_wolf/hello_wolf.cpp index 653fdcc9ebd696d9774a97a60cb66d0016500227..416eca9058efde6d43073ba1e94c4af493166e65 100644 --- a/src/hello_wolf/hello_wolf.cpp +++ b/src/hello_wolf/hello_wolf.cpp @@ -123,11 +123,11 @@ int main() // processor odometer 2D ProcessorParamsOdom2DPtr params_odo = std::make_shared<ProcessorParamsOdom2D>(); - params_odo->elapsed_time_th_ = 999; - params_odo->dist_traveled_th_ = 0.95; // Will make KFs automatically every 1m displacement - params_odo->theta_traveled_th_ = 999; - params_odo->cov_det_th_ = 999; - params_odo->unmeasured_perturbation_std_ = 0.001; + params_odo->max_time_span = 999; + params_odo->dist_traveled = 0.95; // Will make KFs automatically every 1m displacement + params_odo->angle_turned = 999; + params_odo->cov_det = 999; + params_odo->unmeasured_perturbation_std = 0.001; ProcessorBasePtr processor = problem->installProcessor("ODOM 2D", "processor odo", sensor_odo, params_odo); ProcessorOdom2DPtr processor_odo = std::static_pointer_cast<ProcessorOdom2D>(processor); diff --git a/src/hello_wolf/processor_range_bearing.cpp b/src/hello_wolf/processor_range_bearing.cpp index cb17c8a8a7713b2c394084f8bfea20b307e13583..66160b20f16cb68713ef03e9dbd1cc516445d4b6 100644 --- a/src/hello_wolf/processor_range_bearing.cpp +++ b/src/hello_wolf/processor_range_bearing.cpp @@ -14,8 +14,8 @@ namespace wolf { -ProcessorRangeBearing::ProcessorRangeBearing(const SensorRangeBearingPtr _sensor_ptr, const Scalar& _time_tolerance) : - ProcessorBase("RANGE BEARING", _time_tolerance) +ProcessorRangeBearing::ProcessorRangeBearing(const SensorRangeBearingPtr _sensor_ptr, ProcessorParamsBasePtr _params) : + ProcessorBase("RANGE BEARING", _params) { H_r_s = transform(_sensor_ptr->getPPtr()->getState(), _sensor_ptr->getOPtr()->getState()); } @@ -26,7 +26,7 @@ void ProcessorRangeBearing::process(CaptureBasePtr _capture) if ( !kf_pack_buffer_.empty() ) { // Select using incoming_ptr - KFPackPtr pack = kf_pack_buffer_.selectPack( _capture->getTimeStamp(), time_tolerance_ ); + KFPackPtr pack = kf_pack_buffer_.selectPack( _capture->getTimeStamp(), params_->time_tolerance ); if (pack!=nullptr) keyFrameCallback(pack->key_frame,pack->time_tolerance); @@ -38,7 +38,7 @@ void ProcessorRangeBearing::process(CaptureBasePtr _capture) // 1. get KF -- we assume a KF is available to hold this _capture (checked in assert below) auto kf = getProblem()->closestKeyFrameToTimeStamp(capture->getTimeStamp()); - assert( (fabs(kf->getTimeStamp() - _capture->getTimeStamp()) < time_tolerance_) && "Could not find a KF close enough to _capture!"); + assert( (fabs(kf->getTimeStamp() - _capture->getTimeStamp()) < params_->time_tolerance) && "Could not find a KF close enough to _capture!"); // 2. create Capture auto cap = std::make_shared<CaptureRangeBearing>(capture->getTimeStamp(), @@ -111,7 +111,7 @@ ProcessorBasePtr ProcessorRangeBearing::create(const std::string& _unique_name, ProcessorParamsRangeBearingPtr params = std::static_pointer_cast<ProcessorParamsRangeBearing>(_params); // construct processor - ProcessorRangeBearingPtr prc = std::make_shared<ProcessorRangeBearing>(sensor_rb, params->time_tolerance); + ProcessorRangeBearingPtr prc = std::make_shared<ProcessorRangeBearing>(sensor_rb, params); // setup processor prc->setName(_unique_name); diff --git a/src/hello_wolf/processor_range_bearing.h b/src/hello_wolf/processor_range_bearing.h index 881c7d99626cb4df778013289a81fd6ce7217c8a..5a5f1c82fe5f49946a5a212c13bc6068088e9ef0 100644 --- a/src/hello_wolf/processor_range_bearing.h +++ b/src/hello_wolf/processor_range_bearing.h @@ -33,7 +33,7 @@ class ProcessorRangeBearing : public ProcessorBase public: typedef Eigen::Transform<Scalar, 2, Eigen::Affine> Trf; - ProcessorRangeBearing(const SensorRangeBearingPtr _sensor_ptr, const Scalar& _time_tolerance = 0); + ProcessorRangeBearing(const SensorRangeBearingPtr _sensor_ptr, ProcessorParamsBasePtr _params); virtual ~ProcessorRangeBearing() {/* empty */} virtual void configure(SensorBasePtr _sensor) override { } diff --git a/src/landmark_AHP.h b/src/landmark_AHP.h index 6618c58934bc4e9e614fd7ab4410c1ce54437caa..ad55a07244797f24a937e324de69a4926da412b0 100644 --- a/src/landmark_AHP.h +++ b/src/landmark_AHP.h @@ -8,7 +8,7 @@ #include <yaml-cpp/yaml.h> // Vision utils -#include <vision_utils.h> +#include <vision_utils/vision_utils.h> namespace wolf { diff --git a/src/landmark_point_3D.h b/src/landmark_point_3D.h index 1d39422edcc4daf77a8815ec2080ab6acd897fee..cb29852b8b05a04220cbe4703bffa12bf8cdd5c9 100644 --- a/src/landmark_point_3D.h +++ b/src/landmark_point_3D.h @@ -6,7 +6,7 @@ #include "landmark_base.h" // Vision Utils includes -#include <vision_utils.h> +#include <vision_utils/vision_utils.h> namespace wolf { diff --git a/src/problem.cpp b/src/problem.cpp index 2bf9ad01fa944fe8ae57dad5a325c550dff4285d..f0d56b42104eeb76aa6c6d0eb9a981310947c947 100644 --- a/src/problem.cpp +++ b/src/problem.cpp @@ -36,9 +36,9 @@ Problem::Problem(const std::string& _frame_structure) : trajectory_ptr_(std::make_shared<TrajectoryBase>(_frame_structure)), map_ptr_(std::make_shared<MapBase>()), processor_motion_ptr_(), - prior_is_set_(false), state_size_(0), - state_cov_size_(0) + state_cov_size_(0), + prior_is_set_(false) { if (_frame_structure == "PO 2D") { @@ -63,9 +63,9 @@ Problem::Problem(const std::string& _frame_structure) : void Problem::setup() { - hardware_ptr_->setProblem(shared_from_this()); - trajectory_ptr_->setProblem(shared_from_this()); - map_ptr_->setProblem(shared_from_this()); + hardware_ptr_ -> setProblem(shared_from_this()); + trajectory_ptr_-> setProblem(shared_from_this()); + map_ptr_ -> setProblem(shared_from_this()); } ProblemPtr Problem::create(const std::string& _frame_structure) @@ -287,18 +287,15 @@ void Problem::getState(const TimeStamp& _ts, Eigen::VectorXs& state) assert(state.size() == getFrameStructureSize() && "Problem::getStateAtTimeStamp: bad state size"); if (processor_motion_ptr_ != nullptr) - { processor_motion_ptr_->getState(_ts, state); - } + else { FrameBasePtr closest_frame = trajectory_ptr_->closestKeyFrameToTimeStamp(_ts); if (closest_frame != nullptr) - { closest_frame->getState(state); - }else{ + else state = zeroState(); - } } } @@ -316,7 +313,7 @@ Size Problem::getFrameStructureSize() const void Problem::getFrameStructureSize(Size& _x_size, Size& _cov_size) const { - _x_size = state_size_; + _x_size = state_size_; _cov_size = state_cov_size_; } @@ -334,6 +331,11 @@ Eigen::VectorXs Problem::zeroState() bool Problem::permitKeyFrame(ProcessorBasePtr _processor_ptr) { + // This should implement a black list of processors that have forbidden keyframe creation + // This decision is made at problem level, not at processor configuration level. + // If you want to configure a processor for not creating keyframes, see Processor::voting_active_ and its accessors. + + // Currently allowing all processors to vote: return true; } diff --git a/src/problem.h b/src/problem.h index ac69bd6c37a5d18401344bdc973bc827ae51f72b..bd02aff609d3267c59e2ae51fc7efb30c5dbe29b 100644 --- a/src/problem.h +++ b/src/problem.h @@ -50,9 +50,9 @@ class Problem : public std::enable_shared_from_this<Problem> StateBlockList state_block_list_; std::map<std::pair<StateBlockPtr, StateBlockPtr>, Eigen::MatrixXs> covariances_; std::list<ConstraintNotification> constraint_notification_list_; - bool prior_is_set_; Size state_size_, state_cov_size_; StateBlockList notified_state_block_list_; + bool prior_is_set_; private: // CAUTION: THESE METHODS ARE PRIVATE, DO NOT MAKE THEM PUBLIC !! Problem(const std::string& _frame_structure); // USE create() below !! @@ -199,18 +199,17 @@ class Problem : public std::enable_shared_from_this<Problem> FrameBasePtr emplaceFrame(FrameType _frame_key_type, // const TimeStamp& _time_stamp); - // State getters - Eigen::VectorXs getCurrentState(); - void getCurrentState(Eigen::VectorXs& state); - void getCurrentStateAndStamp(Eigen::VectorXs& state, TimeStamp& _ts); - Eigen::VectorXs getState(const TimeStamp& _ts); - void getState(const TimeStamp& _ts, Eigen::VectorXs& state); - FrameBasePtr closestKeyFrameToTimeStamp(const TimeStamp& _ts); + // Frame getters + FrameBasePtr getLastFramePtr ( ); + FrameBasePtr getLastKeyFramePtr ( ); + FrameBasePtr closestKeyFrameToTimeStamp(const TimeStamp& _ts); - // Zero state provider - Eigen::VectorXs zeroState(); /** \brief Give the permission to a processor to create a new keyFrame + * + * This should implement a black list of processors that have forbidden keyframe creation. + * - This decision is made at problem level, not at processor configuration level. + * - Therefore, if you want to permanently configure a processor for not creating keyframes, see Processor::voting_active_ and its accessors. */ bool permitKeyFrame(ProcessorBasePtr _processor_ptr); @@ -222,14 +221,15 @@ class Problem : public std::enable_shared_from_this<Problem> ProcessorBasePtr _processor_ptr, // const Scalar& _time_tolerance); - /** \brief Returns a pointer to last frame - **/ - FrameBasePtr getLastFramePtr(); - - /** \brief Returns a pointer to last key frame - */ - FrameBasePtr getLastKeyFramePtr(); - + // State getters + Eigen::VectorXs getCurrentState ( ); + void getCurrentState (Eigen::VectorXs& state); + void getCurrentStateAndStamp (Eigen::VectorXs& state, TimeStamp& _ts); + Eigen::VectorXs getState (const TimeStamp& _ts); + void getState (const TimeStamp& _ts, Eigen::VectorXs& state); + // Zero state provider + Eigen::VectorXs zeroState ( ); + bool priorIsSet() const; @@ -308,10 +308,6 @@ class Problem : public std::enable_shared_from_this<Problem> bool state_blocks = false); bool check(int verbose_level = 0); - bool priorIsSet() const - { - return prior_is_set_; - } }; } // namespace wolf @@ -321,6 +317,11 @@ class Problem : public std::enable_shared_from_this<Problem> namespace wolf { +inline bool Problem::priorIsSet() const +{ + return prior_is_set_; +} + inline ProcessorMotionPtr& Problem::getProcessorMotionPtr() { return processor_motion_ptr_; diff --git a/src/processor_GPS.cpp b/src/processor_GPS.cpp index 21940ef5ef058c3cfb06bfd0c688386e4dac7e37..9cc147a4927f2b77eabd18f43053c5779f134207 100644 --- a/src/processor_GPS.cpp +++ b/src/processor_GPS.cpp @@ -11,8 +11,8 @@ namespace wolf { -ProcessorGPS::ProcessorGPS(Scalar time_tolerance_) : - ProcessorBase("GPS", time_tolerance_), +ProcessorGPS::ProcessorGPS(ProcessorParamsBasePtr _params) : + ProcessorBase("GPS", _params), capture_gps_ptr_(nullptr) { gps_covariance_ = 10; @@ -61,7 +61,7 @@ void ProcessorGPS::keyFrameCallback(FrameBasePtr, const Scalar& _time_tol) ProcessorBasePtr ProcessorGPS::create(const std::string& _unique_name, const ProcessorParamsBasePtr _params, const SensorBasePtr sensor_ptr) { - ProcessorGPSPtr prc_ptr = std::make_shared<ProcessorGPS>(_params->time_tolerance); + ProcessorGPSPtr prc_ptr = std::make_shared<ProcessorGPS>(_params); prc_ptr->setName(_unique_name); return prc_ptr; } diff --git a/src/processor_GPS.h b/src/processor_GPS.h index bd14aa018fcdaa544507cde0f3bbcd7e6556b3ff..a490bd2c1df80b40f6719a1266b705f154c716c3 100644 --- a/src/processor_GPS.h +++ b/src/processor_GPS.h @@ -24,7 +24,7 @@ class ProcessorGPS : public ProcessorBase Scalar gps_covariance_; public: - ProcessorGPS(Scalar time_tolerance_); + ProcessorGPS(ProcessorParamsBasePtr _params); virtual ~ProcessorGPS(); virtual void configure(SensorBasePtr _sensor) { }; virtual void init(CaptureBasePtr _capture_ptr); diff --git a/src/processor_IMU.cpp b/src/processor_IMU.cpp index a3c926185c078a7775173cbe1f42d458d0bf08bb..75c30f1d9ba4070579953c62b5590e887755175c 100644 --- a/src/processor_IMU.cpp +++ b/src/processor_IMU.cpp @@ -3,19 +3,14 @@ namespace wolf { -ProcessorIMU::ProcessorIMU(const ProcessorParamsIMU& _params) : - ProcessorMotion("IMU", _params.time_tolerance, 10, 10, 9, 6, 6), - max_time_span_ (_params.max_time_span ), - max_buff_length_(_params.max_buff_length ), - dist_traveled_ (_params.dist_traveled ), - angle_turned_ (_params.angle_turned ) +ProcessorIMU::ProcessorIMU(ProcessorParamsIMUPtr _params_motion_IMU) : + ProcessorMotion("IMU", 10, 10, 9, 6, 6, _params_motion_IMU), + params_motion_IMU_(std::make_shared<ProcessorParamsIMU>(*_params_motion_IMU)) { // Set constant parts of Jacobians jacobian_delta_preint_.setIdentity(9,9); // dDp'/dDp, dDv'/dDv, all zeros jacobian_delta_.setIdentity(9,9); // jacobian_calib_.setZero(9,6); - - setVotingActive(_params.voting_active ); } ProcessorIMU::~ProcessorIMU() @@ -25,22 +20,15 @@ ProcessorIMU::~ProcessorIMU() ProcessorBasePtr ProcessorIMU::create(const std::string& _unique_name, const ProcessorParamsBasePtr _params, const SensorBasePtr _sen_ptr) { + std::shared_ptr<ProcessorParamsIMU> prc_imu_params; if (_params) - { - // cast inputs to the correct type - std::shared_ptr<ProcessorParamsIMU> prc_imu_params = std::static_pointer_cast<ProcessorParamsIMU>(_params); - - ProcessorIMUPtr prc_ptr = std::make_shared<ProcessorIMU>(*prc_imu_params); - prc_ptr->setName(_unique_name); - return prc_ptr; - } + prc_imu_params = std::static_pointer_cast<ProcessorParamsIMU>(_params); else - { - ProcessorIMUPtr prc_ptr = std::make_shared<ProcessorIMU>(); + prc_imu_params = std::make_shared<ProcessorParamsIMU>(); - prc_ptr->setName(_unique_name); - return prc_ptr; - } + ProcessorIMUPtr prc_ptr = std::make_shared<ProcessorIMU>(prc_imu_params); + prc_ptr->setName(_unique_name); + return prc_ptr; } bool ProcessorIMU::voteForKeyFrame() @@ -48,20 +36,20 @@ bool ProcessorIMU::voteForKeyFrame() if(!isVotingActive()) return false; // time span - if (getBuffer().get().back().ts_ - getBuffer().get().front().ts_ > max_time_span_) + if (getBuffer().get().back().ts_ - getBuffer().get().front().ts_ > params_motion_IMU_->max_time_span) { WOLF_DEBUG( "PM: vote: time span" ); return true; } // buffer length - if (getBuffer().get().size() > max_buff_length_) + if (getBuffer().get().size() > params_motion_IMU_->max_buff_length) { WOLF_DEBUG( "PM: vote: buffer length" ); return true; } // angle turned - Scalar angle = 2.0 * asin(delta_integrated_.segment(4,3).norm()); - if (angle > angle_turned_) + Scalar angle = 2.0 * asin(delta_integrated_.segment(3,3).norm()); + if (angle > params_motion_IMU_->angle_turned) { WOLF_DEBUG( "PM: vote: angle turned" ); return true; diff --git a/src/processor_IMU.h b/src/processor_IMU.h index 1828aab3650e7d9db508f9db58b7c890fd0eeb9f..e3810a975d66d44f859395b5e6d9bb2044ac1f16 100644 --- a/src/processor_IMU.h +++ b/src/processor_IMU.h @@ -10,12 +10,9 @@ namespace wolf { WOLF_STRUCT_PTR_TYPEDEFS(ProcessorParamsIMU); -struct ProcessorParamsIMU : public ProcessorParamsBase +struct ProcessorParamsIMU : public ProcessorParamsMotion { - Scalar max_time_span = 0.5; - Size max_buff_length = 10; - Scalar dist_traveled = 5; - Scalar angle_turned = 0.5; + // }; WOLF_PTR_TYPEDEFS(ProcessorIMU); @@ -23,7 +20,7 @@ WOLF_PTR_TYPEDEFS(ProcessorIMU); //class class ProcessorIMU : public ProcessorMotion{ public: - ProcessorIMU(const ProcessorParamsIMU& _params = ProcessorParamsIMU()); + ProcessorIMU(ProcessorParamsIMUPtr _params_motion_IMU); virtual ~ProcessorIMU(); virtual void configure(SensorBasePtr _sensor) override { }; @@ -64,21 +61,16 @@ class ProcessorIMU : public ProcessorMotion{ CaptureBasePtr _capture_origin) override; protected: + ProcessorParamsIMUPtr params_motion_IMU_; // keyframe voting parameters - Scalar max_time_span_; // maximum time between keyframes - Size max_buff_length_;// maximum buffer size before keyframe - Scalar dist_traveled_; // maximum linear motion between keyframes - Scalar angle_turned_; // maximum rotation between keyframes +// Scalar max_time_span_; // maximum time between keyframes +// Size max_buff_length_;// maximum buffer size before keyframe +// Scalar dist_traveled_; // maximum linear motion between keyframes +// Scalar angle_turned_; // maximum rotation between keyframes public: - //getters - Scalar getMaxTimeSpan() const; - Scalar getMaxBuffLength() const; - Scalar getDistTraveled() const; - Scalar getAngleTurned() const; - //for factory static ProcessorBasePtr create(const std::string& _unique_name, const ProcessorParamsBasePtr _params, const SensorBasePtr sensor_ptr = nullptr); }; @@ -103,26 +95,6 @@ inline Eigen::VectorXs ProcessorIMU::deltaZero() const return (Eigen::VectorXs(10) << 0,0,0, 0,0,0,1, 0,0,0 ).finished(); // p, q, v } -inline Scalar ProcessorIMU::getMaxTimeSpan() const -{ - return max_time_span_; -} - -inline Scalar ProcessorIMU::getMaxBuffLength() const -{ - return max_buff_length_; -} - -inline Scalar ProcessorIMU::getDistTraveled() const -{ - return dist_traveled_; -} - -inline Scalar ProcessorIMU::getAngleTurned() const -{ - return angle_turned_; -} - } // namespace wolf #endif // PROCESSOR_IMU_H diff --git a/src/processor_base.cpp b/src/processor_base.cpp index f68ef9b9f73d3fc9d84ce925e101a8b6c422959e..ed77aab55d10bf08a3bb155d58c182c31ee7b1a8 100644 --- a/src/processor_base.cpp +++ b/src/processor_base.cpp @@ -7,13 +7,12 @@ namespace wolf { unsigned int ProcessorBase::processor_id_count_ = 0; -ProcessorBase::ProcessorBase(const std::string& _type, const Scalar& _time_tolerance) : - NodeBase("PROCESSOR", _type), +ProcessorBase::ProcessorBase(const std::string& _type, ProcessorParamsBasePtr _params) : + NodeBase("PROCESSOR", _type, _params->name), processor_id_(++processor_id_count_), - time_tolerance_(_time_tolerance), + params_(_params), sensor_ptr_(), - is_removing_(false), - voting_active_(true) + is_removing_(false) { // WOLF_DEBUG("constructed +p" , id()); } @@ -48,7 +47,7 @@ FrameBasePtr ProcessorBase::emplaceFrame(FrameType _type, CaptureBasePtr _captur void ProcessorBase::keyFrameCallback(FrameBasePtr _keyframe_ptr, const Scalar& _time_tol_other) { - WOLF_DEBUG("P", isMotion() ? "M" : "T ", getName(), ": KF", _keyframe_ptr->id(), " callback received with ts = ", _keyframe_ptr->getTimeStamp()); + WOLF_DEBUG("P", isMotion() ? "M " : "T ", getName(), ": KF", _keyframe_ptr->id(), " callback received with ts = ", _keyframe_ptr->getTimeStamp()); if (_keyframe_ptr != nullptr) kf_pack_buffer_.add(_keyframe_ptr,_time_tol_other); } diff --git a/src/processor_base.h b/src/processor_base.h index d63edd93cdf79cb5381531f669fc6e5635bcfb39..0231e5465f1ed575f8a01b37e8a15ad3fa905507 100644 --- a/src/processor_base.h +++ b/src/processor_base.h @@ -141,19 +141,18 @@ class ProcessorBase : public NodeBase, public std::enable_shared_from_this<Proce { protected: unsigned int processor_id_; - Scalar time_tolerance_; ///< self time tolerance for adding a capture into a frame + ProcessorParamsBasePtr params_; KFPackBuffer kf_pack_buffer_; private: SensorBaseWPtr sensor_ptr_; bool is_removing_; ///< A flag for safely removing nodes from the Wolf tree. See remove(). - bool voting_active_; ///< A flag for allowing the processor to vote for KF or not. static unsigned int processor_id_count_; public: - ProcessorBase(const std::string& _type, const Scalar& _time_tolerance); + ProcessorBase(const std::string& _type, ProcessorParamsBasePtr _params); virtual ~ProcessorBase(); virtual void configure(SensorBasePtr _sensor) = 0; void remove(); @@ -209,12 +208,12 @@ class ProcessorBase : public NodeBase, public std::enable_shared_from_this<Proce inline bool ProcessorBase::isVotingActive() const { - return voting_active_; + return params_->voting_active; } inline void ProcessorBase::setVotingActive(bool _voting_active) { - voting_active_ = _voting_active; + params_->voting_active = _voting_active; } } @@ -246,7 +245,7 @@ inline const SensorBasePtr ProcessorBase::getSensorPtr() const inline void ProcessorBase::setTimeTolerance(Scalar _time_tolerance) { - time_tolerance_ = _time_tolerance; + params_->time_tolerance = _time_tolerance; } inline KFPackBuffer::KFPackBuffer(void) diff --git a/src/processor_capture_holder.cpp b/src/processor_capture_holder.cpp index 398f829aa397888878ed7a0ca4fee73080740315..10ded0c0b2855abb81fc50b560c161cc18772fd5 100644 --- a/src/processor_capture_holder.cpp +++ b/src/processor_capture_holder.cpp @@ -10,9 +10,10 @@ namespace wolf { -ProcessorCaptureHolder::ProcessorCaptureHolder(const Scalar& _buffer_size) : - ProcessorBase("CAPTURE HOLDER", _buffer_size/2.), - buffer_(_buffer_size) +ProcessorCaptureHolder::ProcessorCaptureHolder(ProcessorParamsCaptureHolderPtr _params_capture_holder) : + ProcessorBase("CAPTURE HOLDER", _params_capture_holder), + params_capture_holder_(_params_capture_holder), + buffer_(_params_capture_holder->buffer_size) { // } @@ -136,7 +137,7 @@ ProcessorBasePtr ProcessorCaptureHolder::create(const std::string& _unique_name, if (params == nullptr) params = std::make_shared<ProcessorParamsCaptureHolder>(); - ProcessorCaptureHolderPtr prc_ptr = std::make_shared<ProcessorCaptureHolder>(params->buffer_size_); + ProcessorCaptureHolderPtr prc_ptr = std::make_shared<ProcessorCaptureHolder>(params); prc_ptr->setName(_unique_name); return prc_ptr; diff --git a/src/processor_capture_holder.h b/src/processor_capture_holder.h index 8fa402bcf633df0780285cdf824d07ba953d6043..b79743f45e763ca630fa4fa7de31fb106cb16fd6 100644 --- a/src/processor_capture_holder.h +++ b/src/processor_capture_holder.h @@ -23,7 +23,7 @@ WOLF_STRUCT_PTR_TYPEDEFS(ProcessorParamsCaptureHolder); */ struct ProcessorParamsCaptureHolder : public ProcessorParamsBase { - Scalar buffer_size_ = 30; + Scalar buffer_size = 30; }; /** @@ -33,7 +33,7 @@ class ProcessorCaptureHolder : public ProcessorBase { public: - ProcessorCaptureHolder(const Scalar& _buffer_size = 1); + ProcessorCaptureHolder(ProcessorParamsCaptureHolderPtr _params_capture_holder); virtual ~ProcessorCaptureHolder() = default; virtual void configure(SensorBasePtr _sensor) override { }; @@ -59,6 +59,7 @@ public: protected: + ProcessorParamsCaptureHolderPtr params_capture_holder_; CaptureBuffer buffer_; public: diff --git a/src/processor_frame_nearest_neighbor_filter.cpp b/src/processor_frame_nearest_neighbor_filter.cpp index 8d23b6d4e7270db98b84778abdcf610815901d74..f705e368feebebd6991219a2472619f6cbb23b2a 100644 --- a/src/processor_frame_nearest_neighbor_filter.cpp +++ b/src/processor_frame_nearest_neighbor_filter.cpp @@ -3,18 +3,18 @@ namespace wolf { -ProcessorFrameNearestNeighborFilter::ProcessorFrameNearestNeighborFilter(const Params& _params): - ProcessorLoopClosureBase("FRAME NEAREST NEIGHBOR FILTER", _params.time_tolerance), - params_(_params) +ProcessorFrameNearestNeighborFilter::ProcessorFrameNearestNeighborFilter(ParamsPtr _params_NNF): + ProcessorLoopClosureBase("FRAME NEAREST NEIGHBOR FILTER", _params_NNF), + params_NNF(_params_NNF) { // area of ellipse based on the Chi-Square Probabilities // https://people.richland.edu/james/lecture/m170/tbl-chi.html // cover both 2D and 3D cases - if(params_.distance_type_ == DistanceType::LC_POINT_ELLIPSE || - params_.distance_type_ == DistanceType::LC_ELLIPSE_ELLIPSE) + if(params_NNF->distance_type_ == DistanceType::LC_POINT_ELLIPSE || + params_NNF->distance_type_ == DistanceType::LC_ELLIPSE_ELLIPSE) { - switch ((int)(params_.probability_*100)) + switch ((int)(params_NNF->probability_*100)) { case 900: area_ = 4.605; // 90% probability break; @@ -26,10 +26,10 @@ ProcessorFrameNearestNeighborFilter::ProcessorFrameNearestNeighborFilter(const P break; } } - if (params_.distance_type_ == DistanceType::LC_POINT_ELLIPSOID || - params_.distance_type_ == DistanceType::LC_ELLIPSOID_ELLIPSOID) + if (params_NNF->distance_type_ == DistanceType::LC_POINT_ELLIPSOID || + params_NNF->distance_type_ == DistanceType::LC_ELLIPSOID_ELLIPSOID) { - switch ((int)(params_.probability_*100)) + switch ((int)(params_NNF->probability_*100)) { case 900: area_ = 6.251; // 90% probability break; @@ -97,7 +97,7 @@ bool ProcessorFrameNearestNeighborFilter::findCandidates(const CaptureBasePtr& / // check if feame is potential candidate for loop closure with // chosen distance type - switch (params_.distance_type_) + switch (params_NNF->distance_type_) { case LoopclosureDistanceType::LC_POINT_ELLIPSE: { @@ -298,7 +298,7 @@ bool ProcessorFrameNearestNeighborFilter::computeEllipsoid3D(const FrameBasePtr& bool ProcessorFrameNearestNeighborFilter::ellipse2DIntersect(const Eigen::VectorXs& ellipse1, const Eigen::VectorXs& ellipse2) { - for (int i = 0 ; i < 360 ; i += params_.sample_step_degree_) + for (int i = 0 ; i < 360 ; i += params_NNF->sample_step_degree_) { // parameterized form of first ellipse gives point on first ellipse // https://www.uwgb.edu/dutchs/Geometry/HTMLCanvas/ObliqueEllipses5.HTM @@ -357,10 +357,10 @@ bool ProcessorFrameNearestNeighborFilter::ellipsoid3DIntersect(const Eigen::Vect Eigen::Vector4s point_hom = Eigen::Vector4s::Constant(1); Scalar omega = 0; - for (int i = 0 ; i < 360 ; i += params_.sample_step_degree_) + for (int i = 0 ; i < 360 ; i += params_NNF->sample_step_degree_) { const Scalar theta = Scalar(i) * M_PI / 180.0; - for( int j = 0 ; j < 180 ; j += params_.sample_step_degree_) + for( int j = 0 ; j < 180 ; j += params_NNF->sample_step_degree_) { omega = Scalar(j) * M_PI / 180.0; @@ -483,7 +483,7 @@ Scalar ProcessorFrameNearestNeighborFilter::MahalanobisDistance(const FrameBaseP bool ProcessorFrameNearestNeighborFilter::frameInsideBuffer(const FrameBasePtr& frame_ptr) { FrameBasePtr keyframe = getProblem()->getLastKeyFramePtr(); - if ( (int)frame_ptr->id() < ( (int)keyframe->id() - params_.buffer_size_ )) + if ( (int)frame_ptr->id() < ( (int)keyframe->id() - params_NNF->buffer_size_ )) return false; else return true; diff --git a/src/processor_frame_nearest_neighbor_filter.h b/src/processor_frame_nearest_neighbor_filter.h index b4eb2e7fb79cfde1325dbb8bc5ca764e1095a2e3..1d9fb56b6db4ac05462699b35a4ff80eeeef3f52 100644 --- a/src/processor_frame_nearest_neighbor_filter.h +++ b/src/processor_frame_nearest_neighbor_filter.h @@ -55,7 +55,7 @@ private: // depends on how many percent of data should be considered. Scalar area_; - ProcessorParamsFrameNearestNeighborFilter params_; + ProcessorParamsFrameNearestNeighborFilterPtr params_NNF; public: @@ -63,11 +63,11 @@ public: using ParamsPtr = ProcessorParamsFrameNearestNeighborFilterPtr; using DistanceType = Params::DistanceType; - ProcessorFrameNearestNeighborFilter(const Params& _params); + ProcessorFrameNearestNeighborFilter(ParamsPtr _params_NNF); virtual ~ProcessorFrameNearestNeighborFilter() = default; virtual void configure(SensorBasePtr _sensor) { }; - inline DistanceType getDistanceType() const noexcept {return params_.distance_type_;} + inline DistanceType getDistanceType() const noexcept {return params_NNF->distance_type_;} protected: diff --git a/src/processor_loopclosure_base.cpp b/src/processor_loopclosure_base.cpp index ffb3b1c8e97d56f27b5d5b016e24169acf4ce332..160185238b25ecff2d63f8103a968a0d1eeefad4 100644 --- a/src/processor_loopclosure_base.cpp +++ b/src/processor_loopclosure_base.cpp @@ -10,8 +10,9 @@ namespace wolf { -ProcessorLoopClosureBase::ProcessorLoopClosureBase(const std::string& _type, const Scalar _time_tolerance): - ProcessorBase(_type, _time_tolerance) +ProcessorLoopClosureBase::ProcessorLoopClosureBase(const std::string& _type, ProcessorParamsLoopClosurePtr _params_loop_closure): + ProcessorBase(_type, _params_loop_closure), + params_loop_closure_(_params_loop_closure) { // } diff --git a/src/processor_loopclosure_base.h b/src/processor_loopclosure_base.h index a7e07e1114c33c6b42771ed60014822e4deeeec1..78dd9afce1c87054283410e4392c78ef6602e108 100644 --- a/src/processor_loopclosure_base.h +++ b/src/processor_loopclosure_base.h @@ -6,6 +6,8 @@ namespace wolf{ +WOLF_STRUCT_PTR_TYPEDEFS(ProcessorParamsLoopClosure); + struct ProcessorParamsLoopClosure : public ProcessorParamsBase { // virtual ~ProcessorParamsLoopClosure() = default; @@ -33,6 +35,9 @@ class ProcessorLoopClosureBase : public ProcessorBase { protected: + + ProcessorParamsLoopClosurePtr params_loop_closure_; + // Frames that are possible loop closure candidates according to // findLoopClosure() std::vector<FrameBasePtr> loop_closure_candidates; @@ -45,7 +50,7 @@ protected: public: - ProcessorLoopClosureBase(const std::string& _type, const Scalar _time_tolerance); + ProcessorLoopClosureBase(const std::string& _type, ProcessorParamsLoopClosurePtr _params_loop_closure); virtual ~ProcessorLoopClosureBase() = default; virtual void configure(SensorBasePtr _sensor) override { }; diff --git a/src/processor_motion.cpp b/src/processor_motion.cpp index de044f52334c94b49688df4f2aa3d2c6150f0b3a..a4a00586e9ca0aa4abab2ec366ceac764cffa39a 100644 --- a/src/processor_motion.cpp +++ b/src/processor_motion.cpp @@ -3,13 +3,14 @@ namespace wolf { ProcessorMotion::ProcessorMotion(const std::string& _type, - Scalar _time_tolerance, Size _state_size, Size _delta_size, Size _delta_cov_size, Size _data_size, - Size _calib_size) : - ProcessorBase(_type, _time_tolerance), + Size _calib_size, + ProcessorParamsMotionPtr _params_motion) : + ProcessorBase(_type, _params_motion), + params_motion_(_params_motion), processing_step_(RUNNING_WITHOUT_PACK), x_size_(_state_size), data_size_(_data_size), @@ -244,7 +245,7 @@ void ProcessorMotion::process(CaptureBasePtr _incoming_ptr) last_ptr_ = new_capture_ptr; // callback to other processors - getProblem()->keyFrameCallback(key_frame_ptr, shared_from_this(), time_tolerance_); + getProblem()->keyFrameCallback(key_frame_ptr, shared_from_this(), params_motion_->time_tolerance); } resetDerived(); // TODO see where to put this @@ -582,11 +583,11 @@ KFPackPtr ProcessorMotion::computeProcessingStep() throw std::runtime_error("ProcessorMotion received data before being initialized."); } - KFPackPtr pack = kf_pack_buffer_.selectPackBefore(last_ptr_, time_tolerance_); + KFPackPtr pack = kf_pack_buffer_.selectPackBefore(last_ptr_, params_motion_->time_tolerance); if (pack) { - if (kf_pack_buffer_.checkTimeTolerance(pack->key_frame->getTimeStamp(), pack->time_tolerance, origin_ptr_->getTimeStamp(), time_tolerance_)) + if (kf_pack_buffer_.checkTimeTolerance(pack->key_frame->getTimeStamp(), pack->time_tolerance, origin_ptr_->getTimeStamp(), params_motion_->time_tolerance)) { WOLF_WARN("||*||"); WOLF_INFO(" ... It seems you missed something!"); @@ -594,7 +595,7 @@ KFPackPtr ProcessorMotion::computeProcessingStep() // throw std::runtime_error("Pack's KF and origin's KF have matching time stamps (i.e. below time tolerances)"); processing_step_ = RUNNING_WITH_PACK_ON_ORIGIN; } - else if (pack->key_frame->getTimeStamp() < origin_ptr_->getTimeStamp() - time_tolerance_) + else if (pack->key_frame->getTimeStamp() < origin_ptr_->getTimeStamp() - params_motion_->time_tolerance) processing_step_ = RUNNING_WITH_PACK_BEFORE_ORIGIN; else diff --git a/src/processor_motion.h b/src/processor_motion.h index df3471855ac4b030db679cfa7cd0027afc9328b9..a2706c4456fc411750ff89909e880cdffff10731 100644 --- a/src/processor_motion.h +++ b/src/processor_motion.h @@ -18,7 +18,17 @@ namespace wolf { - + +WOLF_STRUCT_PTR_TYPEDEFS(ProcessorParamsMotion); + +struct ProcessorParamsMotion : public ProcessorParamsBase +{ + Scalar max_time_span = 0.5; + Size max_buff_length = 10; + Scalar dist_traveled = 5; + Scalar angle_turned = 0.5; +}; + /** \brief class for Motion processors * * This processor integrates motion data into vehicle states. @@ -108,17 +118,18 @@ class ProcessorMotion : public ProcessorBase } ProcessingStep ; protected: + ProcessorParamsMotionPtr params_motion_; ProcessingStep processing_step_; ///< State machine controlling the processing step // This is the main public interface public: ProcessorMotion(const std::string& _type, - Scalar _time_tolerance, Size _state_size, Size _delta_size, Size _delta_cov_size, Size _data_size, - Size _calib_size = 0); + Size _calib_size, + ProcessorParamsMotionPtr _params_motion); virtual ~ProcessorMotion(); // Instructions to the processor: @@ -400,10 +411,22 @@ class ProcessorMotion : public ProcessorBase bool hasCalibration() {return calib_size_ > 0;} public: + //getters CaptureMotionPtr getOriginPtr(); CaptureMotionPtr getLastPtr(); CaptureMotionPtr getIncomingPtr(); + Scalar getMaxTimeSpan() const; + Scalar getMaxBuffLength() const; + Scalar getDistTraveled() const; + Scalar getAngleTurned() const; + + void setMaxTimeSpan(const Scalar& _max_time_span); + void setMaxBuffLength(const Scalar& _max_buff_length); + void setDistTraveled(const Scalar& _dist_traveled); + void setAngleTurned(const Scalar& _angle_turned); + + protected: // Attributes @@ -451,7 +474,6 @@ inline void ProcessorMotion::resetDerived() inline bool ProcessorMotion::voteForKeyFrame() { - return false; } @@ -549,6 +571,44 @@ inline CaptureMotionPtr ProcessorMotion::getIncomingPtr() return incoming_ptr_; } +inline Scalar ProcessorMotion::getMaxTimeSpan() const +{ + return params_motion_->max_time_span; +} + +inline Scalar ProcessorMotion::getMaxBuffLength() const +{ + return params_motion_->max_buff_length; +} + +inline Scalar ProcessorMotion::getDistTraveled() const +{ + return params_motion_->dist_traveled; +} + +inline Scalar ProcessorMotion::getAngleTurned() const +{ + return params_motion_->angle_turned; +} + +inline void ProcessorMotion::setMaxTimeSpan(const Scalar& _max_time_span) +{ + params_motion_->max_time_span = _max_time_span; +} +inline void ProcessorMotion::setMaxBuffLength(const Scalar& _max_buff_length) +{ + params_motion_->max_buff_length = _max_buff_length; +} +inline void ProcessorMotion::setDistTraveled(const Scalar& _dist_traveled) +{ + params_motion_->dist_traveled = _dist_traveled; +} +inline void ProcessorMotion::setAngleTurned(const Scalar& _angle_turned) +{ + params_motion_->angle_turned = _angle_turned; +} + + } // namespace wolf diff --git a/src/processor_odom_2D.cpp b/src/processor_odom_2D.cpp index 5ebc1bffafb2937cfb3e017e57df9af70274e4e5..5f931f44377d422bea9c416f448ef1639ac2545f 100644 --- a/src/processor_odom_2D.cpp +++ b/src/processor_odom_2D.cpp @@ -2,14 +2,15 @@ namespace wolf { -ProcessorOdom2D::ProcessorOdom2D(const ProcessorParamsOdom2D& _params) : - ProcessorMotion("ODOM 2D", _params.time_tolerance, 3, 3, 3, 2, 0), - dist_traveled_th_(_params.dist_traveled_th_), - theta_traveled_th_(_params.theta_traveled_th_), - cov_det_th_(_params.cov_det_th_), - elapsed_time_th_(_params.elapsed_time_th_) +ProcessorOdom2D::ProcessorOdom2D(ProcessorParamsOdom2DPtr _params) : + ProcessorMotion("ODOM 2D", 3, 3, 3, 2, 0, _params), + params_odom_2D_(_params) +// dist_traveled_th_(_params.dist_traveled_th_), +// theta_traveled_th_(_params.theta_traveled_th_), +// cov_det_th_(_params->cov_det_th)//, +// elapsed_time_th_(_params.elapsed_time_th_) { - unmeasured_perturbation_cov_ = _params.unmeasured_perturbation_std_ * _params.unmeasured_perturbation_std_ * Matrix3s::Identity(); + unmeasured_perturbation_cov_ = _params->unmeasured_perturbation_std * _params->unmeasured_perturbation_std * Matrix3s::Identity(); } ProcessorOdom2D::~ProcessorOdom2D() @@ -121,21 +122,22 @@ Motion ProcessorOdom2D::interpolate(const Motion& _ref, Motion& _second, TimeSta bool ProcessorOdom2D::voteForKeyFrame() { // Distance criterion - if (getBuffer().get().back().delta_integr_.head<2>().norm() > dist_traveled_th_) + if (getBuffer().get().back().delta_integr_.head<2>().norm() > params_odom_2D_->dist_traveled) { return true; } - if (getBuffer().get().back().delta_integr_.tail<1>().norm() > theta_traveled_th_) + if (getBuffer().get().back().delta_integr_.tail<1>().norm() > params_odom_2D_->angle_turned) { return true; } // Uncertainty criterion - if (getBuffer().get().back().delta_integr_cov_.determinant() > cov_det_th_) + if (getBuffer().get().back().delta_integr_cov_.determinant() > params_odom_2D_->cov_det) { return true; } // Time criterion - if (getBuffer().get().back().ts_.get() - origin_ptr_->getFramePtr()->getTimeStamp().get() > elapsed_time_th_) + WOLF_TRACE("orig t: ", origin_ptr_->getFramePtr()->getTimeStamp().get(), " current t: ", getBuffer().get().back().ts_.get() , " dt: ", getBuffer().get().back().ts_.get() - origin_ptr_->getFramePtr()->getTimeStamp().get()); + if (getBuffer().get().back().ts_.get() - origin_ptr_->getFramePtr()->getTimeStamp().get() > params_odom_2D_->max_time_span) { return true; } @@ -172,19 +174,13 @@ ProcessorBasePtr ProcessorOdom2D::create(const std::string& _unique_name, const ProcessorOdom2DPtr prc_ptr; + std::shared_ptr<ProcessorParamsOdom2D> params; if (_params) - { - std::shared_ptr<ProcessorParamsOdom2D> params = std::static_pointer_cast<ProcessorParamsOdom2D>(_params); - - prc_ptr = std::make_shared<ProcessorOdom2D>(*params); - } + params = std::static_pointer_cast<ProcessorParamsOdom2D>(_params); else - { - std::cout << __FILE__ << ":" << __FUNCTION__ << "() : No parameters provided. Using default set." << std::endl; - - prc_ptr = std::make_shared<ProcessorOdom2D>(); - } + params = std::make_shared<ProcessorParamsOdom2D>(); + prc_ptr = std::make_shared<ProcessorOdom2D>(params); prc_ptr->setName(_unique_name); return prc_ptr; diff --git a/src/processor_odom_2D.h b/src/processor_odom_2D.h index c877826af4585d64d530414f451f2d010c347518..bf797ca8b24f488234c1f7eb5a3c7cf3f317e46c 100644 --- a/src/processor_odom_2D.h +++ b/src/processor_odom_2D.h @@ -19,19 +19,16 @@ namespace wolf { WOLF_PTR_TYPEDEFS(ProcessorOdom2D); WOLF_STRUCT_PTR_TYPEDEFS(ProcessorParamsOdom2D); -struct ProcessorParamsOdom2D : public ProcessorParamsBase +struct ProcessorParamsOdom2D : public ProcessorParamsMotion { - Scalar dist_traveled_th_ = 1.0; // 1m - Scalar theta_traveled_th_ = 0.17; // 90 degrees - Scalar cov_det_th_ = 1.0; // 1 rad^2 - Scalar elapsed_time_th_ = 1.0; // 1s - Scalar unmeasured_perturbation_std_ = 0.001; // no particular dimension: the same for displacement and angle + Scalar cov_det = 1.0; // 1 rad^2 + Scalar unmeasured_perturbation_std = 0.001; // no particular dimension: the same for displacement and angle }; class ProcessorOdom2D : public ProcessorMotion { public: - ProcessorOdom2D(const ProcessorParamsOdom2D& _params = ProcessorParamsOdom2D()); + ProcessorOdom2D(ProcessorParamsOdom2DPtr _params); virtual ~ProcessorOdom2D(); virtual void configure(SensorBasePtr _sensor) override { }; @@ -74,11 +71,8 @@ class ProcessorOdom2D : public ProcessorMotion CaptureBasePtr _capture_origin) override; protected: - Scalar dist_traveled_th_; - Scalar theta_traveled_th_; - Scalar cov_det_th_; - Scalar elapsed_time_th_; - Matrix3s unmeasured_perturbation_cov_; ///< Covariance to be added to the unmeasured perturbation + ProcessorParamsOdom2DPtr params_odom_2D_; + MatrixXs unmeasured_perturbation_cov_; // Factory method public: diff --git a/src/processor_odom_3D.cpp b/src/processor_odom_3D.cpp index 6a875eebb5daf3a4b713038ad5383f7a7cce6e02..49da6be8103ab17a3a50ed75dd87492db3dedb40 100644 --- a/src/processor_odom_3D.cpp +++ b/src/processor_odom_3D.cpp @@ -2,12 +2,9 @@ namespace wolf { -ProcessorOdom3D::ProcessorOdom3D(const ProcessorParamsOdom3D& _params, SensorOdom3DPtr _sensor_ptr) : - ProcessorMotion("ODOM 3D", _params.time_tolerance, 7, 7, 6, 6, 0 ), - max_time_span_ ( _params.max_time_span ), - max_buff_length_( _params.max_buff_length ), - dist_traveled_ ( _params.dist_traveled ), - angle_turned_ ( _params.angle_turned ), +ProcessorOdom3D::ProcessorOdom3D(ProcessorParamsOdom3DPtr _params, SensorOdom3DPtr _sensor_ptr) : + ProcessorMotion("ODOM 3D", 7, 7, 6, 6, 0, _params), + params_odom_3D_(_params), p1_(nullptr), p2_(nullptr), p_out_(nullptr), q1_(nullptr), q2_(nullptr), q_out_(nullptr) { @@ -267,7 +264,7 @@ ProcessorBasePtr ProcessorOdom3D::create(const std::string& _unique_name, const SensorOdom3DPtr sen_odo =std::static_pointer_cast<SensorOdom3D>(_sen_ptr); // construct processor - ProcessorOdom3DPtr prc_odo = std::make_shared<ProcessorOdom3D>(*prc_odo_params, sen_odo); + ProcessorOdom3DPtr prc_odo = std::make_shared<ProcessorOdom3D>(prc_odo_params, sen_odo); // setup processor prc_odo->setName(_unique_name); @@ -284,27 +281,27 @@ bool ProcessorOdom3D::voteForKeyFrame() //WOLF_DEBUG( "DistTraveled: " , delta_integrated_.head(3).norm() ); //WOLF_DEBUG( "AngleTurned : " , 2.0 * acos(delta_integrated_(6)) ); // time span - if (getBuffer().get().back().ts_ - getBuffer().get().front().ts_ > max_time_span_) + if (getBuffer().get().back().ts_ - getBuffer().get().front().ts_ > params_odom_3D_->max_time_span) { WOLF_DEBUG( "PM: vote: time span" ); return true; } // buffer length - if (getBuffer().get().size() > max_buff_length_) + if (getBuffer().get().size() > params_odom_3D_->max_buff_length) { WOLF_DEBUG( "PM: vote: buffer size" ); return true; } // distance traveled Scalar dist = getMotion().delta_integr_.head(3).norm(); - if (dist > dist_traveled_) + if (dist > params_odom_3D_->dist_traveled) { WOLF_DEBUG( "PM: vote: distance traveled" ); return true; } // angle turned Scalar angle = q2v(Quaternions(getMotion().delta_integr_.data()+3)).norm(); // 2.0 * acos(getMotion().delta_integr_(6)); - if (angle > angle_turned_) + if (angle > params_odom_3D_->angle_turned) { WOLF_DEBUG( "PM: vote: angle turned" ); return true; diff --git a/src/processor_odom_3D.h b/src/processor_odom_3D.h index 67aee2680297d889eb11ec326ca212ada6c65e25..9a9828d4b2dcc8574de9b22ba8d55503e7a3875a 100644 --- a/src/processor_odom_3D.h +++ b/src/processor_odom_3D.h @@ -20,12 +20,9 @@ namespace wolf { WOLF_STRUCT_PTR_TYPEDEFS(ProcessorParamsOdom3D); -struct ProcessorParamsOdom3D : public ProcessorParamsBase +struct ProcessorParamsOdom3D : public ProcessorParamsMotion { - Scalar max_time_span = 1.0; - Size max_buff_length = 10; - Scalar dist_traveled = 1.0; - Scalar angle_turned = 0.5; + // }; @@ -56,7 +53,7 @@ WOLF_PTR_TYPEDEFS(ProcessorOdom3D); class ProcessorOdom3D : public ProcessorMotion { public: - ProcessorOdom3D(const ProcessorParamsOdom3D& _params = ProcessorParamsOdom3D(), SensorOdom3DPtr _sensor_ptr = nullptr); + ProcessorOdom3D(ProcessorParamsOdom3DPtr _params, SensorOdom3DPtr _sensor_ptr = nullptr); virtual ~ProcessorOdom3D(); virtual void configure(SensorBasePtr _sensor) override; @@ -97,6 +94,8 @@ class ProcessorOdom3D : public ProcessorMotion virtual FeatureBasePtr createFeature(CaptureMotionPtr _capture_motion) override; protected: + ProcessorParamsOdom3DPtr params_odom_3D_; + // noise parameters (stolen from owner SensorOdom3D) Scalar k_disp_to_disp_; // displacement variance growth per meter of linear motion Scalar k_disp_to_rot_; // orientation variance growth per meter of linear motion @@ -104,12 +103,6 @@ class ProcessorOdom3D : public ProcessorMotion Scalar min_disp_var_; // floor displacement variance when no motion Scalar min_rot_var_; // floor orientation variance when no motion - // keyframe voting parameters - Scalar max_time_span_; // maximum time between keyframes - Size max_buff_length_;// maximum buffer size before keyframe - Scalar dist_traveled_; // maximum linear motion between keyframes - Scalar angle_turned_; // maximum rotation between keyframes - // Eigen::Map helpers Eigen::Map<const Eigen::Vector3s> p1_, p2_; Eigen::Map<Eigen::Vector3s> p_out_; @@ -122,26 +115,6 @@ class ProcessorOdom3D : public ProcessorMotion static ProcessorBasePtr create(const std::string& _unique_name, const ProcessorParamsBasePtr _params, const SensorBasePtr sensor_ptr = nullptr); - - void setAngleTurned(Scalar angleTurned) - { - angle_turned_ = angleTurned; - } - - void setDistTraveled(Scalar distTraveled) - { - dist_traveled_ = distTraveled; - } - - void setMaxBuffLength(Size maxBuffLength) - { - max_buff_length_ = maxBuffLength; - } - - void setMaxTimeSpan(Scalar maxTimeSpan) - { - max_time_span_ = maxTimeSpan; - } }; inline Eigen::VectorXs ProcessorOdom3D::deltaZero() const diff --git a/src/processor_params_image.h b/src/processor_params_image.h index 793f2566f16c0851072e5974a65097320255c265..fde468176228453f2bd25551c6beb87617b29b67 100644 --- a/src/processor_params_image.h +++ b/src/processor_params_image.h @@ -2,36 +2,36 @@ #define PROCESSOR_IMAGE_PARAMS_H // wolf -#include "processor_base.h" -#include "wolf.h" - -// Vision utils -#include <vision_utils.h> -#include <vision_utils/detectors.h> -#include <vision_utils/descriptors.h> -#include <vision_utils/matchers.h> +#include "processor_tracker_feature.h" +#include "processor_tracker_landmark.h" namespace wolf { -struct ProcessorParamsImage : public ProcessorParamsBase +WOLF_STRUCT_PTR_TYPEDEFS(ProcessorParamsTrackerFeatureImage); + +struct ProcessorParamsTrackerFeatureImage : public ProcessorParamsTrackerFeature +{ + std::string yaml_file_params_vision_utils; + + Scalar min_response_for_new_features; ///< minimum value of the response to create a new feature + Scalar distance; + + Scalar pixel_noise_std; ///< std noise of the pixel + Scalar pixel_noise_var; ///< var noise of the pixel +}; + +WOLF_STRUCT_PTR_TYPEDEFS(ProcessorParamsTrackerLandmarkImage); + +struct ProcessorParamsTrackerLandmarkImage : public ProcessorParamsTrackerLandmark { - std::string yaml_file_params_vision_utils; - - struct Algorithm - { - unsigned int max_new_features; ///< Max nbr. of features to detect in one frame - unsigned int min_features_for_keyframe; ///< minimum nbr. of features to vote for keyframe - float min_response_for_new_features; ///< minimum value of the response to create a new feature - Scalar time_tolerance; - Scalar distance; - }algorithm; - - struct Noise - { - Scalar pixel_noise_std; ///< std noise of the pixel - Scalar pixel_noise_var; ///< var noise of the pixel - }noise; + std::string yaml_file_params_vision_utils; + + Scalar min_response_for_new_features; ///< minimum value of the response to create a new feature + Scalar distance; + + Scalar pixel_noise_std; ///< std noise of the pixel + Scalar pixel_noise_var; ///< var noise of the pixel }; } diff --git a/src/processor_tracker.cpp b/src/processor_tracker.cpp index 741eacb07aed84a327e3fe38c72210819a4d2486..c71c7f9d9d835b73e83e00880b653f7d50dcea45 100644 --- a/src/processor_tracker.cpp +++ b/src/processor_tracker.cpp @@ -14,13 +14,15 @@ namespace wolf { -ProcessorTracker::ProcessorTracker(const std::string& _type, const Scalar& _time_tolerance, const unsigned int _max_new_features) : - ProcessorBase(_type, _time_tolerance), +ProcessorTracker::ProcessorTracker(const std::string& _type, + ProcessorParamsTrackerPtr _params_tracker) : + ProcessorBase(_type, _params_tracker), + params_tracker_(_params_tracker), processing_step_(FIRST_TIME_WITHOUT_PACK), origin_ptr_(nullptr), last_ptr_(nullptr), incoming_ptr_(nullptr), - max_new_features_(_max_new_features) + number_of_tracks_(0) { // } @@ -50,7 +52,7 @@ void ProcessorTracker::process(CaptureBasePtr const _incoming_ptr) { case FIRST_TIME_WITH_PACK : { - KFPackPtr pack = kf_pack_buffer_.selectPack( incoming_ptr_, time_tolerance_); + KFPackPtr pack = kf_pack_buffer_.selectPack( incoming_ptr_, params_tracker_->time_tolerance); kf_pack_buffer_.removeUpTo( incoming_ptr_->getTimeStamp() ); WOLF_DEBUG( "PT ", getName(), ": KF" , pack->key_frame->id() , " callback unpacked with ts= " , pack->key_frame->getTimeStamp().get() ); @@ -78,7 +80,7 @@ void ProcessorTracker::process(CaptureBasePtr const _incoming_ptr) // We only process new features in Last, here last = nullptr, so we do not have anything to do. // Issue KF callback with new KF - getProblem()->keyFrameCallback(kfrm, shared_from_this(), time_tolerance_); + getProblem()->keyFrameCallback(kfrm, shared_from_this(), params_tracker_->time_tolerance); // Update pointers resetDerived(); @@ -90,7 +92,8 @@ void ProcessorTracker::process(CaptureBasePtr const _incoming_ptr) } case SECOND_TIME_WITH_PACK : { - KFPackPtr pack = kf_pack_buffer_.selectPack( incoming_ptr_, time_tolerance_); + // No-break case only for debug. Next case will be executed too. + KFPackPtr pack = kf_pack_buffer_.selectPack( incoming_ptr_, params_tracker_->time_tolerance); WOLF_DEBUG( "PT ", getName(), ": KF" , pack->key_frame->id() , " callback unpacked with ts= " , pack->key_frame->getTimeStamp().get() ); } case SECOND_TIME_WITHOUT_PACK : @@ -101,7 +104,7 @@ void ProcessorTracker::process(CaptureBasePtr const _incoming_ptr) // We have a last_ Capture with no features, so we do not process known features, and we do not vote for KF. // Process info - processNew(max_new_features_); + processNew(params_tracker_->max_new_features); // Update pointers resetDerived(); @@ -113,7 +116,7 @@ void ProcessorTracker::process(CaptureBasePtr const _incoming_ptr) } case RUNNING_WITH_PACK : { - KFPackPtr pack = kf_pack_buffer_.selectPack( last_ptr_ , time_tolerance_); + KFPackPtr pack = kf_pack_buffer_.selectPack( last_ptr_ , params_tracker_->time_tolerance); kf_pack_buffer_.removeUpTo( last_ptr_->getTimeStamp() ); WOLF_DEBUG( "PT ", getName(), ": KF" , pack->key_frame->id() , " callback unpacked with ts= " , pack->key_frame->getTimeStamp().get() ); @@ -131,7 +134,7 @@ void ProcessorTracker::process(CaptureBasePtr const _incoming_ptr) frm->addCapture(incoming_ptr_); // Detect new Features, initialize Landmarks, create Constraints, ... - processNew(max_new_features_); + processNew(params_tracker_->max_new_features); // Establish constraints establishConstraints(); @@ -148,6 +151,13 @@ void ProcessorTracker::process(CaptureBasePtr const _incoming_ptr) { processKnown(); + // eventually add more features + if (last_ptr_->getFeatureList().size() < params_tracker_->min_features_for_keyframe) + { + WOLF_TRACE("Adding more features..."); + processNew(params_tracker_->max_new_features); + } + if (voteForKeyFrame() && permittedKeyFrame()) { // We create a KF @@ -160,11 +170,11 @@ void ProcessorTracker::process(CaptureBasePtr const _incoming_ptr) frm->addCapture(incoming_ptr_); // process - processNew(max_new_features_); - - // Set key - last_ptr_->getFramePtr()->setKey(); +// processNew(params_tracker_->max_new_features); + // // Set key + // last_ptr_->getFramePtr()->setKey(); + // // Set state to the keyframe last_ptr_->getFramePtr()->setState(getProblem()->getState(last_ptr_->getTimeStamp())); @@ -172,7 +182,7 @@ void ProcessorTracker::process(CaptureBasePtr const _incoming_ptr) establishConstraints(); // Call the new keyframe callback in order to let the other processors to establish their constraints - getProblem()->keyFrameCallback(last_ptr_->getFramePtr(), std::static_pointer_cast<ProcessorBase>(shared_from_this()), time_tolerance_); + getProblem()->keyFrameCallback(last_ptr_->getFramePtr(), std::static_pointer_cast<ProcessorBase>(shared_from_this()), params_tracker_->time_tolerance); // Update pointers resetDerived(); @@ -201,6 +211,7 @@ void ProcessorTracker::process(CaptureBasePtr const _incoming_ptr) break; } + number_of_tracks_ = last_ptr_->getFeatureList().size(); postProcess(); } @@ -221,7 +232,7 @@ void ProcessorTracker::computeProcessingStep() { case FIRST_TIME : - if (kf_pack_buffer_.selectPack(incoming_ptr_, time_tolerance_)) + if (kf_pack_buffer_.selectPack(incoming_ptr_, params_tracker_->time_tolerance)) processing_step_ = FIRST_TIME_WITH_PACK; else // ! last && ! pack(incoming) processing_step_ = FIRST_TIME_WITHOUT_PACK; @@ -229,7 +240,7 @@ void ProcessorTracker::computeProcessingStep() case SECOND_TIME : - if (kf_pack_buffer_.selectPack(last_ptr_, time_tolerance_)) + if (kf_pack_buffer_.selectPack(last_ptr_, params_tracker_->time_tolerance)) processing_step_ = SECOND_TIME_WITH_PACK; else processing_step_ = SECOND_TIME_WITHOUT_PACK; @@ -238,7 +249,7 @@ void ProcessorTracker::computeProcessingStep() case RUNNING : default : - if (kf_pack_buffer_.selectPack(last_ptr_, time_tolerance_)) + if (kf_pack_buffer_.selectPack(last_ptr_, params_tracker_->time_tolerance)) { if (last_ptr_->getFramePtr()->isKey()) { diff --git a/src/processor_tracker.h b/src/processor_tracker.h index 2ed1ae6e4624af8bb359a9507598e92b58301850..957ae5a6776bdeffba152279d4aa58918019f099 100644 --- a/src/processor_tracker.h +++ b/src/processor_tracker.h @@ -13,13 +13,16 @@ namespace wolf { -WOLF_PTR_TYPEDEFS(ProcessorTracker); +WOLF_STRUCT_PTR_TYPEDEFS(ProcessorParamsTracker); struct ProcessorParamsTracker : public ProcessorParamsBase { + unsigned int min_features_for_keyframe; ///< minimum nbr. of features to vote for keyframe unsigned int max_new_features; }; +WOLF_PTR_TYPEDEFS(ProcessorTracker); + /** \brief General tracker processor * * This is an abstract class. @@ -78,16 +81,19 @@ class ProcessorTracker : public ProcessorBase } ProcessingStep ; protected: + ProcessorParamsTrackerPtr params_tracker_; ///< parameters for the tracker ProcessingStep processing_step_; ///< State machine controlling the processing step CaptureBasePtr origin_ptr_; ///< Pointer to the origin of the tracker. CaptureBasePtr last_ptr_; ///< Pointer to the last tracked capture. CaptureBasePtr incoming_ptr_; ///< Pointer to the incoming capture being processed. - unsigned int max_new_features_; ///< max features allowed to detect in one iteration. 0 = no limit FeatureBaseList new_features_last_; ///< List of new features in \b last for landmark initialization and new key-frame creation. FeatureBaseList new_features_incoming_; ///< list of the new features of \b last successfully tracked in \b incoming + size_t number_of_tracks_; + public: - ProcessorTracker(const std::string& _type, const Scalar& _time_tolerance, const unsigned int _max_new_features); + ProcessorTracker(const std::string& _type, + ProcessorParamsTrackerPtr _params_tracker); virtual ~ProcessorTracker(); /** \brief Full processing of an incoming Capture. @@ -97,9 +103,6 @@ class ProcessorTracker : public ProcessorBase */ virtual void process(CaptureBasePtr const _incoming_ptr); - void setMaxNewFeatures(const unsigned int& _max_new_features); - unsigned int getMaxNewFeatures(); - bool checkTimeTolerance(const TimeStamp& _ts1, const TimeStamp& _ts2); bool checkTimeTolerance(const CaptureBasePtr _cap, const TimeStamp& _ts); bool checkTimeTolerance(const FrameBasePtr _frm, const TimeStamp& _ts); @@ -193,6 +196,16 @@ class ProcessorTracker : public ProcessorBase FeatureBaseList& getNewFeaturesListLast(); + const size_t& previousNumberOfTracks() const + { + return number_of_tracks_; + } + + size_t& previousNumberOfTracks() + { + return number_of_tracks_; + } + protected: void computeProcessingStep(); @@ -205,16 +218,6 @@ class ProcessorTracker : public ProcessorBase }; -inline void ProcessorTracker::setMaxNewFeatures(const unsigned int& _max_new_features) -{ - max_new_features_ = _max_new_features; -} - -inline unsigned int ProcessorTracker::getMaxNewFeatures() -{ - return max_new_features_; -} - inline FeatureBaseList& ProcessorTracker::getNewFeaturesListLast() { return new_features_last_; @@ -232,7 +235,7 @@ inline FeatureBaseList& ProcessorTracker::getNewFeaturesListIncoming() inline bool ProcessorTracker::checkTimeTolerance(const TimeStamp& _ts1, const TimeStamp& _ts2) { - return (std::fabs(_ts2 - _ts2) < time_tolerance_); + return (std::fabs(_ts2 - _ts2) < params_tracker_->time_tolerance); } inline bool ProcessorTracker::checkTimeTolerance(const CaptureBasePtr _cap, const TimeStamp& _ts) diff --git a/src/processor_tracker_feature.cpp b/src/processor_tracker_feature.cpp index ad4382dbc1a27c4a9a630b866b3d7a241aab98ae..f6dee2871290f188bf3695321e205d03e9f2181d 100644 --- a/src/processor_tracker_feature.cpp +++ b/src/processor_tracker_feature.cpp @@ -10,8 +10,10 @@ namespace wolf { -ProcessorTrackerFeature::ProcessorTrackerFeature(const std::string& _type, const Scalar _time_tolerance, const unsigned int _max_new_features) : - ProcessorTracker(_type, _time_tolerance, _max_new_features) +ProcessorTrackerFeature::ProcessorTrackerFeature(const std::string& _type, + ProcessorParamsTrackerFeaturePtr _params_tracker_feature) : + ProcessorTracker(_type, _params_tracker_feature), + params_tracker_feature_(_params_tracker_feature) { } @@ -37,6 +39,7 @@ unsigned int ProcessorTrackerFeature::processNew(const unsigned int& _max_new_fe trackFeatures(new_features_last_, new_features_incoming_, matches_last_from_incoming_); for (auto ftr : new_features_incoming_) { + ftr->setProblem(this->getProblem()); size_t trk_id_from_last = matches_last_from_incoming_[ftr]->feature_ptr_->trackId(); track_matrix_.add(trk_id_from_last, incoming_ptr_, ftr); } @@ -74,7 +77,11 @@ unsigned int ProcessorTrackerFeature::processKnown() size_t track_id = feature_in_incoming->trackId(); FeatureBasePtr feature_in_last = track_matrix_.feature(track_id, last_ptr_); FeatureBasePtr feature_in_origin = track_matrix_.feature(track_id, origin_ptr_); - if (!(correctFeatureDrift(feature_in_origin, feature_in_last, feature_in_incoming))) + if (correctFeatureDrift(feature_in_origin, feature_in_last, feature_in_incoming)) + { + feature_in_incoming->setProblem(this->getProblem()); + } + else { // Remove this feature from many places: matches_last_from_incoming_ .erase (feature_in_incoming); // remove match @@ -105,8 +112,8 @@ void ProcessorTrackerFeature::advanceDerived() for (auto ftr : incoming_ptr_->getFeatureList()) ftr->setProblem(getProblem()); - // remove last from track matrix - track_matrix_.remove(last_ptr_); + // // remove last from track matrix in case you want to have only KF in the track matrix + // track_matrix_.remove(last_ptr_); } void ProcessorTrackerFeature::resetDerived() diff --git a/src/processor_tracker_feature.h b/src/processor_tracker_feature.h index 6b3b5f467a379ab019c3e08eb4f9c4a640167860..e51bd731282fa81c25d059ee23b8810041244ded 100644 --- a/src/processor_tracker_feature.h +++ b/src/processor_tracker_feature.h @@ -17,6 +17,13 @@ namespace wolf { + +WOLF_STRUCT_PTR_TYPEDEFS(ProcessorParamsTrackerFeature); + +struct ProcessorParamsTrackerFeature : public ProcessorParamsTracker +{ + // +}; WOLF_PTR_TYPEDEFS(ProcessorTrackerFeature); @@ -63,7 +70,7 @@ WOLF_PTR_TYPEDEFS(ProcessorTrackerFeature); * - establishConstraints() : which calls the pure virtual: * - createConstraint() : create constraint of the correct derived type <=== IMPLEMENT * - * Should you need extra functionality for your derived types, you can overload these two methods, + * Should you need extra functionality for your derived types, you can override these two methods, * * - preProcess() { } * - postProcess() { } @@ -77,10 +84,12 @@ class ProcessorTrackerFeature : public ProcessorTracker /** \brief Constructor with type */ - ProcessorTrackerFeature(const std::string& _type, const Scalar _time_tolerance, const unsigned int _max_new_features); + ProcessorTrackerFeature(const std::string& _type, + ProcessorParamsTrackerFeaturePtr _params_tracker_feature); virtual ~ProcessorTrackerFeature(); protected: + ProcessorParamsTrackerFeaturePtr params_tracker_feature_; TrackMatrix track_matrix_; FeatureBaseList known_features_incoming_; diff --git a/src/processor_tracker_feature_corner.cpp b/src/processor_tracker_feature_corner.cpp index 262d8cff26f19eb8901360a851c0ada831e0155a..3b0ac96a266126ed620796ec3e9acfe7b3a2658f 100644 --- a/src/processor_tracker_feature_corner.cpp +++ b/src/processor_tracker_feature_corner.cpp @@ -11,13 +11,9 @@ namespace wolf { -ProcessorTrackerFeatureCorner::ProcessorTrackerFeatureCorner( - const laserscanutils::LineFinderIterativeParams& _line_finder_params, - const Scalar& _time_tolerance, - const unsigned int& _n_corners_th) : - ProcessorTrackerFeature("TRACKER FEATURE CORNER", _time_tolerance, 0), - line_finder_(_line_finder_params), - n_tracks_th_(_n_corners_th), +ProcessorTrackerFeatureCorner::ProcessorTrackerFeatureCorner(ProcessorParamsTrackerFeatureCornerPtr _params_tracker_feature_corner) : + ProcessorTrackerFeature("TRACKER FEATURE CORNER", _params_tracker_feature_corner), + params_tracker_feature_corner_(_params_tracker_feature_corner), R_world_sensor_(Eigen::Matrix3s::Identity()), R_robot_sensor_(Eigen::Matrix3s::Identity()), extrinsics_transformation_computed_(false) @@ -89,7 +85,7 @@ unsigned int ProcessorTrackerFeatureCorner::trackFeatures(const FeatureBaseList& auto feat_out_it = feat_out_next++; // next is used to obtain the next iterator after splice while (feat_out_it != corners_incoming_.end()) //runs over extracted feature { - if (((*feat_out_it)->getMeasurement().head<3>() - expected_feature_pose).squaredNorm() > position_error_th_*position_error_th_) + if (((*feat_out_it)->getMeasurement().head<3>() - expected_feature_pose).squaredNorm() > params_tracker_feature_corner_->position_error_th*params_tracker_feature_corner_->position_error_th) { // match _feature_correspondences[*feat_out_it] = std::make_shared<FeatureMatch>(FeatureMatch({feat_in_ptr,0})); @@ -108,7 +104,7 @@ unsigned int ProcessorTrackerFeatureCorner::trackFeatures(const FeatureBaseList& bool ProcessorTrackerFeatureCorner::voteForKeyFrame() { - return incoming_ptr_->getFeatureList().size() < n_tracks_th_; + return incoming_ptr_->getFeatureList().size() < params_tracker_feature_corner_->n_corners_th; } unsigned int ProcessorTrackerFeatureCorner::detectNewFeatures(const unsigned int& _max_features, FeatureBaseList& _feature_list_out) @@ -146,13 +142,16 @@ ConstraintBasePtr ProcessorTrackerFeatureCorner::createConstraint(FeatureBasePtr } void ProcessorTrackerFeatureCorner::extractCorners(CaptureLaser2DPtr _capture_laser_ptr, - FeatureBaseList& _corner_list) + FeatureBaseList& _corner_list) { // TODO: sort corners by bearing std::list<laserscanutils::CornerPoint> corners; std::cout << "Extracting corners..." << std::endl; - corner_finder_.findCorners(_capture_laser_ptr->getScan(), (std::static_pointer_cast<SensorLaser2D>(getSensorPtr()))->getScanParams(), line_finder_, corners); + corner_finder_.findCorners(_capture_laser_ptr->getScan(), + (std::static_pointer_cast<SensorLaser2D>(getSensorPtr()))->getScanParams(), + line_finder_, + corners); Eigen::Vector4s measurement; for (auto corner : corners) diff --git a/src/processor_tracker_feature_corner.h b/src/processor_tracker_feature_corner.h index 8c0d23eacc4b1a91dc13980cc1204156798d5f80..93c4c7add4e1e2b7e6cc1b022dffa92a7a5370ea 100644 --- a/src/processor_tracker_feature_corner.h +++ b/src/processor_tracker_feature_corner.h @@ -28,19 +28,28 @@ namespace wolf { +WOLF_STRUCT_PTR_TYPEDEFS(ProcessorParamsTrackerFeatureCorner); + +struct ProcessorParamsTrackerFeatureCorner : public ProcessorParamsTrackerFeature +{ + laserscanutils::LineFinderIterativeParams line_finder_params; + unsigned int n_corners_th; + const Scalar position_error_th = 1; +}; WOLF_PTR_TYPEDEFS(ProcessorTrackerFeatureCorner); //some consts.. TODO: this tuning params should be grouped in a struct and passed to the class from ros node, at constructor level -const Scalar aperture_error_th_ = 20.0 * M_PI / 180.; //20 degrees -const Scalar angular_error_th_ = 10.0 * M_PI / 180.; //10 degrees; -const Scalar position_error_th_ = 1; -const Scalar min_features_ratio_th_ = 0.5; +//const Scalar aperture_error_th_ = 20.0 * M_PI / 180.; //20 degrees +//const Scalar angular_error_th_ = 10.0 * M_PI / 180.; //10 degrees; +//const Scalar position_error_th_ = 1; +//const Scalar min_features_ratio_th_ = 0.5; class ProcessorTrackerFeatureCorner : public ProcessorTrackerFeature { private: + ProcessorParamsTrackerFeatureCornerPtr params_tracker_feature_corner_; //laserscanutils::ScanParams scan_params_; //laserscanutils::ExtractCornerParams corner_alg_params_; //laserscanutils::LaserScan laser_data_; @@ -50,7 +59,6 @@ class ProcessorTrackerFeatureCorner : public ProcessorTrackerFeature FeatureBaseList corners_incoming_; FeatureBaseList corners_last_; - unsigned int n_tracks_th_; Eigen::Matrix3s R_world_sensor_, R_world_sensor_prev_; Eigen::Matrix3s R_robot_sensor_; @@ -64,9 +72,7 @@ class ProcessorTrackerFeatureCorner : public ProcessorTrackerFeature public: EIGEN_MAKE_ALIGNED_OPERATOR_NEW; // to guarantee alignment (see http://eigen.tuxfamily.org/dox-devel/group__TopicStructHavingEigenMembers.html) - ProcessorTrackerFeatureCorner(const laserscanutils::LineFinderIterativeParams& _line_finder_params, - const Scalar& _time_tolerance, - const unsigned int& _n_corners_th); + ProcessorTrackerFeatureCorner(ProcessorParamsTrackerFeatureCornerPtr _params_tracker_feature_corner); virtual ~ProcessorTrackerFeatureCorner(); virtual void configure(SensorBasePtr _sensor) { }; diff --git a/src/processor_tracker_feature_dummy.cpp b/src/processor_tracker_feature_dummy.cpp index e50549982884b2884fe6d423f49f3cd7d62669f4..b0679cf6ac236e21684933c3601ea7e2ca574fe5 100644 --- a/src/processor_tracker_feature_dummy.cpp +++ b/src/processor_tracker_feature_dummy.cpp @@ -42,11 +42,11 @@ bool ProcessorTrackerFeatureDummy::voteForKeyFrame() { WOLF_INFO("Nbr. of active feature tracks: " , incoming_ptr_->getFeatureList().size() ); - bool vote = incoming_ptr_->getFeatureList().size() < min_feat_for_keyframe_; + bool vote = incoming_ptr_->getFeatureList().size() < params_tracker_feature_->min_features_for_keyframe; WOLF_INFO( (vote ? "Vote ": "Do not vote ") , "for KF" ); - return incoming_ptr_->getFeatureList().size() < min_feat_for_keyframe_; + return incoming_ptr_->getFeatureList().size() < params_tracker_feature_->min_features_for_keyframe; } unsigned int ProcessorTrackerFeatureDummy::detectNewFeatures(const unsigned int& _max_features, FeatureBaseList& _feature_list_out) diff --git a/src/processor_tracker_feature_dummy.h b/src/processor_tracker_feature_dummy.h index fdfbdd9b9d3342d9561351b3b441804bbdba9f85..09ae7df58dc6b2ca628086a952ace56d72ae7702 100644 --- a/src/processor_tracker_feature_dummy.h +++ b/src/processor_tracker_feature_dummy.h @@ -22,17 +22,14 @@ class ProcessorTrackerFeatureDummy : public ProcessorTrackerFeature { public: - ProcessorTrackerFeatureDummy(const Scalar _time_tolerance, const unsigned int _max_new_features, const unsigned int _min_feat_for_keyframe); + ProcessorTrackerFeatureDummy(ProcessorParamsTrackerFeaturePtr _params_tracker_feature); virtual ~ProcessorTrackerFeatureDummy(); virtual void configure(SensorBasePtr _sensor) { }; protected: static unsigned int count_; - unsigned int n_feature_, min_feat_for_keyframe_; - -// virtual void preProcess() { } -// virtual void postProcess() { } + unsigned int n_feature_; /** \brief Track provided features from \b last to \b incoming * \param _feature_list_in input list of features in \b last to track @@ -74,9 +71,9 @@ class ProcessorTrackerFeatureDummy : public ProcessorTrackerFeature }; -inline ProcessorTrackerFeatureDummy::ProcessorTrackerFeatureDummy(const Scalar _time_tolerance, const unsigned int _max_new_features, const unsigned int _min_feat_for_keyframe) : - ProcessorTrackerFeature("TRACKER FEATURE DUMMY", _time_tolerance, _max_new_features), - n_feature_(0), min_feat_for_keyframe_(_min_feat_for_keyframe) +inline ProcessorTrackerFeatureDummy::ProcessorTrackerFeatureDummy(ProcessorParamsTrackerFeaturePtr _params_tracker_feature) : + ProcessorTrackerFeature("TRACKER FEATURE DUMMY", _params_tracker_feature), + n_feature_(0) { // } diff --git a/src/processor_tracker_feature_image.cpp b/src/processor_tracker_feature_image.cpp index 18f54e0f96a0a8f286b7ca99b80a8713abba5f82..397a39cf6e3cbf111dbecabc5041e047ae0637cb 100644 --- a/src/processor_tracker_feature_image.cpp +++ b/src/processor_tracker_feature_image.cpp @@ -2,10 +2,10 @@ #include "processor_tracker_feature_image.h" // Vision utils -#include <vision_utils/detectors.h> -#include <vision_utils/descriptors.h> -#include <vision_utils/matchers.h> -#include <vision_utils/algorithms.h> +#include <detectors.h> +#include <descriptors.h> +#include <matchers.h> +#include <algorithms.h> // standard libs #include <bitset> @@ -14,14 +14,14 @@ namespace wolf { -ProcessorTrackerFeatureImage::ProcessorTrackerFeatureImage(ProcessorParamsImage _params) : - ProcessorTrackerFeature("IMAGE", _params.time_tolerance, _params.algorithm.max_new_features), +ProcessorTrackerFeatureImage::ProcessorTrackerFeatureImage(ProcessorParamsTrackerFeatureImagePtr _params_tracker_feature_image) : + ProcessorTrackerFeature("IMAGE", _params_tracker_feature_image), cell_width_(0), cell_height_(0), // These will be initialized to proper values taken from the sensor via function configure() - params_(_params) + params_tracker_feature_image_(_params_tracker_feature_image) { // Detector - std::string det_name = vision_utils::readYamlType(params_.yaml_file_params_vision_utils, "detector"); - det_ptr_ = vision_utils::setupDetector(det_name, det_name + " detector", params_.yaml_file_params_vision_utils); + std::string det_name = vision_utils::readYamlType(params_tracker_feature_image_->yaml_file_params_vision_utils, "detector"); + det_ptr_ = vision_utils::setupDetector(det_name, det_name + " detector", params_tracker_feature_image_->yaml_file_params_vision_utils); if (det_name.compare("ORB") == 0) det_ptr_ = std::static_pointer_cast<vision_utils::DetectorORB>(det_ptr_); @@ -49,8 +49,8 @@ ProcessorTrackerFeatureImage::ProcessorTrackerFeatureImage(ProcessorParamsImage det_ptr_ = std::static_pointer_cast<vision_utils::DetectorAGAST>(det_ptr_); // Descriptor - std::string des_name = vision_utils::readYamlType(params_.yaml_file_params_vision_utils, "descriptor"); - des_ptr_ = vision_utils::setupDescriptor(des_name, des_name + " descriptor", params_.yaml_file_params_vision_utils); + std::string des_name = vision_utils::readYamlType(params_tracker_feature_image_->yaml_file_params_vision_utils, "descriptor"); + des_ptr_ = vision_utils::setupDescriptor(des_name, des_name + " descriptor", params_tracker_feature_image_->yaml_file_params_vision_utils); if (des_name.compare("ORB") == 0) des_ptr_ = std::static_pointer_cast<vision_utils::DescriptorORB>(des_ptr_); @@ -76,8 +76,8 @@ ProcessorTrackerFeatureImage::ProcessorTrackerFeatureImage(ProcessorParamsImage des_ptr_ = std::static_pointer_cast<vision_utils::DescriptorLUCID>(des_ptr_); // Matcher - std::string mat_name = vision_utils::readYamlType(params_.yaml_file_params_vision_utils, "matcher"); - mat_ptr_ = vision_utils::setupMatcher(mat_name, mat_name + " matcher", params_.yaml_file_params_vision_utils); + std::string mat_name = vision_utils::readYamlType(params_tracker_feature_image_->yaml_file_params_vision_utils, "matcher"); + mat_ptr_ = vision_utils::setupMatcher(mat_name, mat_name + " matcher", params_tracker_feature_image_->yaml_file_params_vision_utils); if (mat_name.compare("FLANNBASED") == 0) mat_ptr_ = std::static_pointer_cast<vision_utils::MatcherFLANNBASED>(mat_ptr_); @@ -91,7 +91,7 @@ ProcessorTrackerFeatureImage::ProcessorTrackerFeatureImage(ProcessorParamsImage mat_ptr_ = std::static_pointer_cast<vision_utils::MatcherBRUTEFORCE_HAMMING_2>(mat_ptr_); // Active search grid - vision_utils::AlgorithmBasePtr alg_ptr = vision_utils::setupAlgorithm("ACTIVESEARCH", "ACTIVESEARCH algorithm", params_.yaml_file_params_vision_utils); + vision_utils::AlgorithmBasePtr alg_ptr = vision_utils::setupAlgorithm("ACTIVESEARCH", "ACTIVESEARCH algorithm", params_tracker_feature_image_->yaml_file_params_vision_utils); active_search_ptr_ = std::static_pointer_cast<vision_utils::AlgorithmACTIVESEARCH>(alg_ptr); } @@ -110,10 +110,10 @@ void ProcessorTrackerFeatureImage::configure(SensorBasePtr _sensor) active_search_ptr_->initAlg(camera->getImgWidth(), camera->getImgHeight() , det_ptr_->getPatternRadius()); - params_activesearch_ptr_ = std::static_pointer_cast<vision_utils::AlgorithmParamsACTIVESEARCH>( active_search_ptr_->getParams() ); + params_tracker_feature_image_activesearch_ptr_ = std::static_pointer_cast<vision_utils::AlgorithmParamsACTIVESEARCH>( active_search_ptr_->getParams() ); - cell_width_ = image_.width_ / params_activesearch_ptr_->n_cells_h; - cell_height_ = image_.height_ / params_activesearch_ptr_->n_cells_v; + cell_width_ = image_.width_ / params_tracker_feature_image_activesearch_ptr_->n_cells_h; + cell_height_ = image_.height_ / params_tracker_feature_image_activesearch_ptr_->n_cells_v; } void ProcessorTrackerFeatureImage::preProcess() @@ -162,8 +162,10 @@ unsigned int ProcessorTrackerFeatureImage::trackFeatures(const FeatureBaseList& if ( normalized_score > mat_ptr_->getParams()->min_norm_score ) { FeaturePointImagePtr incoming_point_ptr = std::make_shared<FeaturePointImage>( - candidate_keypoints[cv_matches[0].trainIdx], (candidate_descriptors.row(cv_matches[0].trainIdx)), - Eigen::Matrix2s::Identity()*params_.noise.pixel_noise_var); + candidate_keypoints[cv_matches[0].trainIdx], + cv_matches[0].trainIdx, + (candidate_descriptors.row(cv_matches[0].trainIdx)), + Eigen::Matrix2s::Identity()*params_tracker_feature_image_->pixel_noise_var); incoming_point_ptr->setIsKnown(feature_ptr->isKnown()); _feature_list_out.push_back(incoming_point_ptr); @@ -266,13 +268,14 @@ unsigned int ProcessorTrackerFeatureImage::detectNewFeatures(const unsigned int& if(list_keypoints[i].pt == new_keypoints[0].pt) index = i; } - if(new_keypoints[0].response > params_activesearch_ptr_->min_response_new_feature) + if(new_keypoints[0].response > params_tracker_feature_image_activesearch_ptr_->min_response_new_feature) { std::cout << "response: " << new_keypoints[0].response << std::endl; FeaturePointImagePtr point_ptr = std::make_shared<FeaturePointImage>( new_keypoints[0], + 0, new_descriptors.row(index), - Eigen::Matrix2s::Identity()*params_.noise.pixel_noise_var); + Eigen::Matrix2s::Identity()*params_tracker_feature_image_->pixel_noise_var); point_ptr->setIsKnown(false); _feature_list_out.push_back(point_ptr); @@ -298,7 +301,7 @@ unsigned int ProcessorTrackerFeatureImage::detectNewFeatures(const unsigned int& Scalar ProcessorTrackerFeatureImage::match(cv::Mat _target_descriptor, cv::Mat _candidate_descriptors, DMatchVector& _cv_matches) { - mat_ptr_->match(_target_descriptor, _candidate_descriptors, _cv_matches); + mat_ptr_->match(_target_descriptor, _candidate_descriptors, des_ptr_->getSize(), _cv_matches); Scalar normalized_score = 1 - (Scalar)(_cv_matches[0].distance)/(des_ptr_->getSize()*8); return normalized_score; } @@ -382,7 +385,7 @@ void ProcessorTrackerFeatureImage::drawFeatures(cv::Mat _image) ProcessorBasePtr ProcessorTrackerFeatureImage::create(const std::string& _unique_name, const ProcessorParamsBasePtr _params, const SensorBasePtr _sensor_ptr) { - ProcessorTrackerFeatureImagePtr prc_ptr = std::make_shared<ProcessorTrackerFeatureImage>(*(std::static_pointer_cast<ProcessorParamsImage>(_params))); + ProcessorTrackerFeatureImagePtr prc_ptr = std::make_shared<ProcessorTrackerFeatureImage>(std::static_pointer_cast<ProcessorParamsTrackerFeatureImage>(_params)); prc_ptr->setName(_unique_name); return prc_ptr; } diff --git a/src/processor_tracker_feature_image.h b/src/processor_tracker_feature_image.h index 8f5c3e7ccd41e0871ede7c53e335a6e7d9528ec2..26cbaada43bc72ba89d3edb38fda48eb94eace66 100644 --- a/src/processor_tracker_feature_image.h +++ b/src/processor_tracker_feature_image.h @@ -11,11 +11,11 @@ #include "constraint_epipolar.h" #include "processor_params_image.h" -// Vision utils -#include <vision_utils/detectors/detector_base.h> -#include <vision_utils/descriptors/descriptor_base.h> -#include <vision_utils/matchers/matcher_base.h> -#include <vision_utils/algorithms/activesearch/alg_activesearch.h> + +#include <detectors/detector_base.h> +#include <descriptors/descriptor_base.h> +#include <matchers/matcher_base.h> +#include <algorithms/activesearch/alg_activesearch.h> // General includes #include <cmath> @@ -29,6 +29,7 @@ WOLF_PTR_TYPEDEFS(ProcessorTrackerFeatureImage); //class class ProcessorTrackerFeatureImage : public ProcessorTrackerFeature { + // vision utils params protected: vision_utils::DetectorBasePtr det_ptr_; @@ -38,11 +39,11 @@ class ProcessorTrackerFeatureImage : public ProcessorTrackerFeature int cell_width_; ///< Active search cell width int cell_height_; ///< Active search cell height - vision_utils::AlgorithmParamsACTIVESEARCHPtr params_activesearch_ptr_; ///< Active search parameters + vision_utils::AlgorithmParamsACTIVESEARCHPtr params_tracker_feature_image_activesearch_ptr_; ///< Active search parameters protected: - ProcessorParamsImage params_; ///< Struct with parameters of the processors + ProcessorParamsTrackerFeatureImagePtr params_tracker_feature_image_; ///< Struct with parameters of the processors cv::Mat image_last_, image_incoming_; ///< Images of the "last" and "incoming" Captures struct @@ -59,7 +60,7 @@ class ProcessorTrackerFeatureImage : public ProcessorTrackerFeature std::list<cv::Rect> detector_roi_; std::list<cv::Point> tracker_target_; - ProcessorTrackerFeatureImage(ProcessorParamsImage _params); + ProcessorTrackerFeatureImage(ProcessorParamsTrackerFeatureImagePtr _params_image); virtual ~ProcessorTrackerFeatureImage(); virtual void configure(SensorBasePtr _sensor) ; @@ -160,7 +161,7 @@ class ProcessorTrackerFeatureImage : public ProcessorTrackerFeature inline bool ProcessorTrackerFeatureImage::voteForKeyFrame() { - return (incoming_ptr_->getFeatureList().size() < params_.algorithm.min_features_for_keyframe); + return (incoming_ptr_->getFeatureList().size() < params_tracker_feature_image_->min_features_for_keyframe); } } // namespace wolf diff --git a/src/processor_tracker_landmark.cpp b/src/processor_tracker_landmark.cpp index 0098b621202dfe7f17654373ad9d3ad506ef5d70..e68101044926a208ea031fbf005421b62c1c26c8 100644 --- a/src/processor_tracker_landmark.cpp +++ b/src/processor_tracker_landmark.cpp @@ -14,9 +14,12 @@ namespace wolf { -ProcessorTrackerLandmark::ProcessorTrackerLandmark(const std::string& _type, const Scalar& _time_tolerance, const unsigned int& _max_new_features) : - ProcessorTracker(_type, _time_tolerance, _max_new_features) +ProcessorTrackerLandmark::ProcessorTrackerLandmark(const std::string& _type, + ProcessorParamsTrackerLandmarkPtr _params_tracker_landmark) : + ProcessorTracker(_type, _params_tracker_landmark), + params_tracker_landmark_(_params_tracker_landmark) { + // } ProcessorTrackerLandmark::~ProcessorTrackerLandmark() diff --git a/src/processor_tracker_landmark.h b/src/processor_tracker_landmark.h index 7c7a3e0a28c0d580367d6550ff1a7a5d4767a040..479d0d8ea68622a2b4c924425c698534a37daf5d 100644 --- a/src/processor_tracker_landmark.h +++ b/src/processor_tracker_landmark.h @@ -16,6 +16,14 @@ namespace wolf { +WOLF_STRUCT_PTR_TYPEDEFS(ProcessorParamsTrackerLandmark); + +struct ProcessorParamsTrackerLandmark : public ProcessorParamsTracker +{ + // +}; + + WOLF_PTR_TYPEDEFS(ProcessorTrackerLandmark); /** \brief Landmark tracker processor @@ -72,11 +80,13 @@ WOLF_PTR_TYPEDEFS(ProcessorTrackerLandmark); class ProcessorTrackerLandmark : public ProcessorTracker { public: - ProcessorTrackerLandmark(const std::string& _type, const Scalar& _time_tolerance, const unsigned int& _max_new_features); + ProcessorTrackerLandmark(const std::string& _type, + ProcessorParamsTrackerLandmarkPtr _params_tracker_landmark); virtual ~ProcessorTrackerLandmark(); protected: + ProcessorParamsTrackerLandmarkPtr params_tracker_landmark_; LandmarkBaseList new_landmarks_; ///< List of new detected landmarks LandmarkMatchMap matches_landmark_from_incoming_; LandmarkMatchMap matches_landmark_from_last_; diff --git a/src/processor_tracker_landmark_corner.cpp b/src/processor_tracker_landmark_corner.cpp index cbff09b2f8ef6cd26ad0def3a409f0fe498c70cc..c69b9964ed844402ba33f0781dfeeecb68ec7f9e 100644 --- a/src/processor_tracker_landmark_corner.cpp +++ b/src/processor_tracker_landmark_corner.cpp @@ -359,7 +359,7 @@ Eigen::VectorXs ProcessorTrackerLandmarkCorner::computeSquaredMahalanobisDistanc ProcessorBasePtr ProcessorTrackerLandmarkCorner::create(const std::string& _unique_name, const ProcessorParamsBasePtr _params, const SensorBasePtr sensor_ptr) { ProcessorParamsLaserPtr params = std::static_pointer_cast<ProcessorParamsLaser>(_params); - ProcessorTrackerLandmarkCornerPtr prc_ptr = std::make_shared<ProcessorTrackerLandmarkCorner>(params->line_finder_params_, _params->time_tolerance, params->new_corners_th, params->loop_frames_th); + ProcessorTrackerLandmarkCornerPtr prc_ptr = std::make_shared<ProcessorTrackerLandmarkCorner>(params); prc_ptr->setName(_unique_name); return prc_ptr; } @@ -406,15 +406,11 @@ ProcessorTrackerLandmarkCorner::~ProcessorTrackerLandmarkCorner() } } -ProcessorTrackerLandmarkCorner::ProcessorTrackerLandmarkCorner( - const laserscanutils::LineFinderIterativeParams& _line_finder_params, - const Scalar& _time_tolerance, - const unsigned int& _new_corners_th, - const unsigned int& _loop_frames_th) : - ProcessorTrackerLandmark("TRACKER LANDMARK CORNER", _time_tolerance, 0), - line_finder_(_line_finder_params), - new_corners_th_(_new_corners_th), - loop_frames_th_(_loop_frames_th), +ProcessorTrackerLandmarkCorner::ProcessorTrackerLandmarkCorner(ProcessorParamsLaserPtr _params_laser) : + ProcessorTrackerLandmark("TRACKER LANDMARK CORNER", _params_laser), + line_finder_(_params_laser->line_finder_params_), + new_corners_th_(_params_laser->new_corners_th), + loop_frames_th_(_params_laser->loop_frames_th), R_sensor_world_(Eigen::Matrix3s::Identity()), R_world_sensor_(Eigen::Matrix3s::Identity()), R_robot_sensor_(Eigen::Matrix3s::Identity()), diff --git a/src/processor_tracker_landmark_corner.h b/src/processor_tracker_landmark_corner.h index 3c8ed3a39b282f6a6442c21063d6810c4d51dcf4..56619fcf1bb724b12beab03077c786a1016c6f1e 100644 --- a/src/processor_tracker_landmark_corner.h +++ b/src/processor_tracker_landmark_corner.h @@ -41,7 +41,7 @@ typedef std::shared_ptr<ProcessorParamsLaser> ProcessorParamsLaserPtr; WOLF_PTR_TYPEDEFS(ProcessorTrackerLandmarkCorner); -struct ProcessorParamsLaser : public ProcessorParamsBase +struct ProcessorParamsLaser : public ProcessorParamsTrackerLandmark { laserscanutils::LineFinderIterativeParams line_finder_params_; //TODO: add corner_finder_params @@ -86,10 +86,7 @@ class ProcessorTrackerLandmarkCorner : public ProcessorTrackerLandmark public: EIGEN_MAKE_ALIGNED_OPERATOR_NEW; // to guarantee alignment (see http://eigen.tuxfamily.org/dox-devel/group__TopicStructHavingEigenMembers.html) - ProcessorTrackerLandmarkCorner(const laserscanutils::LineFinderIterativeParams& _line_finder_params, - const Scalar& _time_tolerance, - const unsigned int& _new_corners_th, - const unsigned int& _loop_frames_th); + ProcessorTrackerLandmarkCorner(ProcessorParamsLaserPtr _params_laser); virtual ~ProcessorTrackerLandmarkCorner(); virtual void configure(SensorBasePtr _sensor) { }; diff --git a/src/processor_tracker_landmark_dummy.cpp b/src/processor_tracker_landmark_dummy.cpp index e61548047ec712759974ae3e2bb9d366fb8e3a4b..c4a45acb259199c97018a20beccced79974dcea9 100644 --- a/src/processor_tracker_landmark_dummy.cpp +++ b/src/processor_tracker_landmark_dummy.cpp @@ -12,8 +12,8 @@ namespace wolf { -ProcessorTrackerLandmarkDummy::ProcessorTrackerLandmarkDummy(const Scalar _time_tolerance, const unsigned int& _max_new_features) : - ProcessorTrackerLandmark("TRACKER LANDMARK DUMMY", _time_tolerance, _max_new_features), +ProcessorTrackerLandmarkDummy::ProcessorTrackerLandmarkDummy(ProcessorParamsTrackerLandmarkPtr _params_tracker_landmark) : + ProcessorTrackerLandmark("TRACKER LANDMARK DUMMY", _params_tracker_landmark), n_feature_(0), landmark_idx_non_visible_(0) { @@ -44,11 +44,10 @@ unsigned int ProcessorTrackerLandmarkDummy::findLandmarks(const LandmarkBaseList } else { - _feature_list_out.push_back( - std::make_shared<FeatureBase>( - "POINT IMAGE", - landmark_in_ptr->getDescriptor(), - Eigen::MatrixXs::Ones(1, 1))); + _feature_list_out.push_back(std::make_shared<FeatureBase>( + "POINT IMAGE", + landmark_in_ptr->getDescriptor(), + Eigen::MatrixXs::Identity(1,1))); _feature_landmark_correspondences[_feature_list_out.back()] = std::make_shared<LandmarkMatch>(landmark_in_ptr, 1); std::cout << "\t\tlandmark " << landmark_in_ptr->getDescriptor() << " found!" << std::endl; } diff --git a/src/processor_tracker_landmark_dummy.h b/src/processor_tracker_landmark_dummy.h index 6d6625956e71f9f3c2bbb5fd1edcea1ba5ef2ea3..6df2393fd897bad27b1fd5398bdef10d289fcc0f 100644 --- a/src/processor_tracker_landmark_dummy.h +++ b/src/processor_tracker_landmark_dummy.h @@ -18,7 +18,7 @@ WOLF_PTR_TYPEDEFS(ProcessorTrackerLandmarkDummy); class ProcessorTrackerLandmarkDummy : public ProcessorTrackerLandmark { public: - ProcessorTrackerLandmarkDummy(const Scalar _time_tolerance, const unsigned int& _max_new_features); + ProcessorTrackerLandmarkDummy(ProcessorParamsTrackerLandmarkPtr _params_tracker_landmark); virtual ~ProcessorTrackerLandmarkDummy(); virtual void configure(SensorBasePtr _sensor) { }; diff --git a/src/processor_tracker_landmark_image.cpp b/src/processor_tracker_landmark_image.cpp index a466c6a1602c900f338b5b5adb42a5a84c8fa71b..00d90d7ff63464d075c46812275b2b3f83280245 100644 --- a/src/processor_tracker_landmark_image.cpp +++ b/src/processor_tracker_landmark_image.cpp @@ -1,20 +1,23 @@ #include "processor_tracker_landmark_image.h" -#include "landmark_corner_2D.h" -#include "landmark_AHP.h" -#include "constraint_corner_2D.h" +#include "capture_image.h" #include "constraint_AHP.h" -#include "sensor_camera.h" -#include "pinhole_tools.h" -#include "trajectory_base.h" +#include "feature_base.h" +#include "feature_point_image.h" +#include "frame_base.h" +#include "logging.h" #include "map_base.h" +#include "pinhole_tools.h" +#include "problem.h" +#include "sensor_camera.h" +#include "state_block.h" +#include "time_stamp.h" // vision_utils -#include <vision_utils/detectors.h> -#include <vision_utils/descriptors.h> -#include <vision_utils/matchers.h> -#include <vision_utils/algorithms.h> - +#include <detectors.h> +#include <descriptors.h> +#include <matchers.h> +#include <algorithms.h> #include <Eigen/Geometry> #include <iomanip> //setprecision @@ -22,16 +25,17 @@ namespace wolf { -ProcessorTrackerLandmarkImage::ProcessorTrackerLandmarkImage(const ProcessorParamsImage& _params) : - ProcessorTrackerLandmark("IMAGE LANDMARK", _params.algorithm.time_tolerance, _params.algorithm.max_new_features), - params_(_params), -// active_search_grid_(), +ProcessorTrackerLandmarkImage::ProcessorTrackerLandmarkImage(ProcessorParamsTrackerLandmarkImagePtr _params_tracker_landmark_image) : + ProcessorTrackerLandmark("IMAGE LANDMARK", _params_tracker_landmark_image), + cell_width_(0), + cell_height_(0), + params_tracker_landmark_image_(_params_tracker_landmark_image), n_feature_(0), landmark_idx_non_visible_(0) { // Detector - std::string det_name = vision_utils::readYamlType(params_.yaml_file_params_vision_utils, "detector"); - det_ptr_ = vision_utils::setupDetector(det_name, det_name + " detector", params_.yaml_file_params_vision_utils); + std::string det_name = vision_utils::readYamlType(params_tracker_landmark_image_->yaml_file_params_vision_utils, "detector"); + det_ptr_ = vision_utils::setupDetector(det_name, det_name + " detector", params_tracker_landmark_image_->yaml_file_params_vision_utils); if (det_name.compare("ORB") == 0) det_ptr_ = std::static_pointer_cast<vision_utils::DetectorORB>(det_ptr_); @@ -59,8 +63,8 @@ ProcessorTrackerLandmarkImage::ProcessorTrackerLandmarkImage(const ProcessorPara det_ptr_ = std::static_pointer_cast<vision_utils::DetectorAGAST>(det_ptr_); // Descriptor - std::string des_name = vision_utils::readYamlType(params_.yaml_file_params_vision_utils, "descriptor"); - des_ptr_ = vision_utils::setupDescriptor(des_name, des_name + " descriptor", params_.yaml_file_params_vision_utils); + std::string des_name = vision_utils::readYamlType(params_tracker_landmark_image_->yaml_file_params_vision_utils, "descriptor"); + des_ptr_ = vision_utils::setupDescriptor(des_name, des_name + " descriptor", params_tracker_landmark_image_->yaml_file_params_vision_utils); if (des_name.compare("ORB") == 0) des_ptr_ = std::static_pointer_cast<vision_utils::DescriptorORB>(des_ptr_); @@ -86,8 +90,8 @@ ProcessorTrackerLandmarkImage::ProcessorTrackerLandmarkImage(const ProcessorPara des_ptr_ = std::static_pointer_cast<vision_utils::DescriptorLUCID>(des_ptr_); // Matcher - std::string mat_name = vision_utils::readYamlType(params_.yaml_file_params_vision_utils, "matcher"); - mat_ptr_ = vision_utils::setupMatcher(mat_name, mat_name + " matcher", params_.yaml_file_params_vision_utils); + std::string mat_name = vision_utils::readYamlType(params_tracker_landmark_image_->yaml_file_params_vision_utils, "matcher"); + mat_ptr_ = vision_utils::setupMatcher(mat_name, mat_name + " matcher", params_tracker_landmark_image_->yaml_file_params_vision_utils); if (mat_name.compare("FLANNBASED") == 0) mat_ptr_ = std::static_pointer_cast<vision_utils::MatcherFLANNBASED>(mat_ptr_); @@ -101,7 +105,7 @@ ProcessorTrackerLandmarkImage::ProcessorTrackerLandmarkImage(const ProcessorPara mat_ptr_ = std::static_pointer_cast<vision_utils::MatcherBRUTEFORCE_HAMMING_2>(mat_ptr_); // Active search grid - vision_utils::AlgorithmBasePtr alg_ptr = vision_utils::setupAlgorithm("ACTIVESEARCH", "ACTIVESEARCH algorithm", params_.yaml_file_params_vision_utils); + vision_utils::AlgorithmBasePtr alg_ptr = vision_utils::setupAlgorithm("ACTIVESEARCH", "ACTIVESEARCH algorithm", params_tracker_landmark_image_->yaml_file_params_vision_utils); active_search_ptr_ = std::static_pointer_cast<vision_utils::AlgorithmACTIVESEARCH>(alg_ptr); } @@ -118,10 +122,10 @@ void ProcessorTrackerLandmarkImage::configure(SensorBasePtr _sensor) active_search_ptr_->initAlg(camera->getImgWidth(), camera->getImgHeight(), det_ptr_->getPatternRadius() ); - params_activesearch_ptr_ = std::static_pointer_cast<vision_utils::AlgorithmParamsACTIVESEARCH>( active_search_ptr_->getParams() ); + params_tracker_landmark_image_activesearch_ptr_ = std::static_pointer_cast<vision_utils::AlgorithmParamsACTIVESEARCH>( active_search_ptr_->getParams() ); - cell_width_ = image_.width_ / params_activesearch_ptr_->n_cells_h; - cell_height_ = image_.height_ / params_activesearch_ptr_->n_cells_v; + cell_width_ = image_.width_ / params_tracker_landmark_image_activesearch_ptr_->n_cells_h; + cell_height_ = image_.height_ / params_tracker_landmark_image_activesearch_ptr_->n_cells_v; } void ProcessorTrackerLandmarkImage::preProcess() @@ -181,8 +185,9 @@ unsigned int ProcessorTrackerLandmarkImage::findLandmarks(const LandmarkBaseList { FeaturePointImagePtr incoming_point_ptr = std::make_shared<FeaturePointImage>( candidate_keypoints[cv_matches[0].trainIdx], + cv_matches[0].trainIdx, candidate_descriptors.row(cv_matches[0].trainIdx), - Eigen::Matrix2s::Identity()*params_.noise.pixel_noise_var); + Eigen::Matrix2s::Identity()*params_tracker_landmark_image_->pixel_noise_var); incoming_point_ptr->setTrackId(landmark_in_ptr->id()); incoming_point_ptr->setLandmarkId(landmark_in_ptr->id()); @@ -218,7 +223,7 @@ unsigned int ProcessorTrackerLandmarkImage::findLandmarks(const LandmarkBaseList bool ProcessorTrackerLandmarkImage::voteForKeyFrame() { return false; -// return landmarks_tracked_ < params_.algorithm.min_features_for_keyframe; +// return landmarks_tracked_ < params_tracker_landmark_image_->min_features_for_keyframe; } unsigned int ProcessorTrackerLandmarkImage::detectNewFeatures(const unsigned int& _max_features, FeatureBaseList& _feature_list_out) @@ -245,13 +250,14 @@ unsigned int ProcessorTrackerLandmarkImage::detectNewFeatures(const unsigned int index = i; } - if(new_keypoints[0].response > params_activesearch_ptr_->min_response_new_feature) + if(new_keypoints[0].response > params_tracker_landmark_image_activesearch_ptr_->min_response_new_feature) { list_response_.push_back(new_keypoints[0].response); FeaturePointImagePtr point_ptr = std::make_shared<FeaturePointImage>( new_keypoints[0], + 0, new_descriptors.row(index), - Eigen::Matrix2s::Identity()*params_.noise.pixel_noise_var); + Eigen::Matrix2s::Identity()*params_tracker_landmark_image_->pixel_noise_var); point_ptr->setIsKnown(false); point_ptr->setTrackId(point_ptr->id()); point_ptr->setExpectation(Eigen::Vector2s(new_keypoints[0].pt.x,new_keypoints[0].pt.y)); @@ -284,7 +290,7 @@ LandmarkBasePtr ProcessorTrackerLandmarkImage::createLandmark(FeatureBasePtr _fe point2D[0] = feat_point_image_ptr->getKeypoint().pt.x; point2D[1] = feat_point_image_ptr->getKeypoint().pt.y; - Scalar distance = params_.algorithm.distance; // arbitrary value + Scalar distance = params_tracker_landmark_image_->distance; // arbitrary value Eigen::Vector4s vec_homogeneous; point2D = pinhole::depixellizePoint(getSensorPtr()->getIntrinsicPtr()->getState(),point2D); @@ -364,7 +370,7 @@ void ProcessorTrackerLandmarkImage::landmarkInCurrentCamera(const Eigen::VectorX // world to anchor robot frame Translation<Scalar,3> t_w_r0(_landmark->getAnchorFrame()->getPPtr()->getState()); // sadly we cannot put a Map over a translation - Map<const Quaternions> q_w_r0(_landmark->getAnchorFrame()->getOPtr()->getPtr()); + const Quaternions q_w_r0(Eigen::Vector4s(_landmark->getAnchorFrame()->getOPtr()->getState())); T_W_R0 = t_w_r0 * q_w_r0; // world to current robot frame @@ -374,12 +380,12 @@ void ProcessorTrackerLandmarkImage::landmarkInCurrentCamera(const Eigen::VectorX // anchor robot to anchor camera Translation<Scalar,3> t_r0_c0(_landmark->getAnchorSensor()->getPPtr()->getState()); - Map<const Quaternions> q_r0_c0(_landmark->getAnchorSensor()->getOPtr()->getPtr()); + const Quaternions q_r0_c0(Eigen::Vector4s(_landmark->getAnchorSensor()->getOPtr()->getState())); T_R0_C0 = t_r0_c0 * q_r0_c0; // current robot to current camera Translation<Scalar,3> t_r1_c1(this->getSensorPtr()->getPPtr()->getState()); - Map<const Quaternions> q_r1_c1(this->getSensorPtr()->getOPtr()->getPtr()); + const Quaternions q_r1_c1(Eigen::Vector4s(this->getSensorPtr()->getOPtr()->getState())); T_R1_C1 = t_r1_c1 * q_r1_c1; // Transform lmk from c0 to c1 and exit @@ -389,9 +395,8 @@ void ProcessorTrackerLandmarkImage::landmarkInCurrentCamera(const Eigen::VectorX Scalar ProcessorTrackerLandmarkImage::match(const cv::Mat _target_descriptor, const cv::Mat _candidate_descriptors, DMatchVector& _cv_matches) { - mat_ptr_->match(_target_descriptor, _candidate_descriptors, _cv_matches); - Scalar normalized_score = 1 - (Scalar)(_cv_matches[0].distance)/(des_ptr_->getSize()*8); - return normalized_score; + std::vector<Scalar> normalized_scores = mat_ptr_->match(_target_descriptor, _candidate_descriptors, des_ptr_->getSize(), _cv_matches); + return normalized_scores[0]; } unsigned int ProcessorTrackerLandmarkImage::detect(const cv::Mat _image, cv::Rect& _roi, KeyPointVector& _new_keypoints, cv::Mat& new_descriptors) @@ -493,7 +498,7 @@ void ProcessorTrackerLandmarkImage::drawLandmarks(cv::Mat _image) ProcessorBasePtr ProcessorTrackerLandmarkImage::create(const std::string& _unique_name, const ProcessorParamsBasePtr _params, const SensorBasePtr _sen_ptr) { - ProcessorTrackerLandmarkImagePtr prc_ptr = std::make_shared<ProcessorTrackerLandmarkImage>(*(std::static_pointer_cast<ProcessorParamsImage>(_params))); + ProcessorTrackerLandmarkImagePtr prc_ptr = std::make_shared<ProcessorTrackerLandmarkImage>(std::static_pointer_cast<ProcessorParamsTrackerLandmarkImage>(_params)); prc_ptr->setName(_unique_name); return prc_ptr; } diff --git a/src/processor_tracker_landmark_image.h b/src/processor_tracker_landmark_image.h index 3a97599f16ca4839e9e56535d7471bb61e26d5d2..8d8b8fd425eddf59be0272304a81c623ed571fa1 100644 --- a/src/processor_tracker_landmark_image.h +++ b/src/processor_tracker_landmark_image.h @@ -2,25 +2,26 @@ #define PROCESSOR_TRACKER_LANDMARK_IMAGE_H // Wolf includes -#include "sensor_camera.h" -#include "capture_image.h" -#include "feature_point_image.h" -#include "state_block.h" -#include "state_quaternion.h" -#include "processor_tracker_landmark.h" + #include "landmark_AHP.h" +#include "landmark_match.h" #include "processor_params_image.h" -#include "constraint_AHP.h" +#include "processor_tracker_landmark.h" +#include "wolf.h" + +#include <algorithms/activesearch/alg_activesearch.h> +#include <descriptors/descriptor_base.h> +#include <detectors/detector_base.h> +#include <matchers/matcher_base.h> -// Vision utils -#include <vision_utils/detectors/detector_base.h> -#include <vision_utils/descriptors/descriptor_base.h> -#include <vision_utils/matchers/matcher_base.h> -#include <vision_utils/algorithms/activesearch/alg_activesearch.h> +#include <opencv2/core/mat.hpp> +#include <opencv2/core/mat.inl.hpp> +#include <opencv2/core/types.hpp> -// General includes -#include <cmath> -#include <complex> // std::complex, std::norm +#include <list> +#include <memory> +#include <string> +#include <vector> namespace wolf { @@ -38,10 +39,10 @@ class ProcessorTrackerLandmarkImage : public ProcessorTrackerLandmark int cell_width_; ///< Active search cell width int cell_height_; ///< Active search cell height - vision_utils::AlgorithmParamsACTIVESEARCHPtr params_activesearch_ptr_; ///< Active search parameters + vision_utils::AlgorithmParamsACTIVESEARCHPtr params_tracker_landmark_image_activesearch_ptr_; ///< Active search parameters protected: - ProcessorParamsImage params_; // Struct with parameters of the processors + ProcessorParamsTrackerLandmarkImagePtr params_tracker_landmark_image_; // Struct with parameters of the processors cv::Mat image_last_, image_incoming_; // Images of the "last" and "incoming" Captures @@ -54,7 +55,6 @@ class ProcessorTrackerLandmarkImage : public ProcessorTrackerLandmark unsigned int landmarks_tracked_ = 0; /* pinhole params */ -// Eigen::Vector4s k_parameters_; Eigen::Vector2s distortion_; Eigen::Vector2s correction_; @@ -78,7 +78,7 @@ class ProcessorTrackerLandmarkImage : public ProcessorTrackerLandmark std::list<cv::Point> tracker_target_; FeatureBaseList feat_lmk_found_; - ProcessorTrackerLandmarkImage(const ProcessorParamsImage& _params); + ProcessorTrackerLandmarkImage(ProcessorParamsTrackerLandmarkImagePtr _params_tracker_landmark_image); virtual ~ProcessorTrackerLandmarkImage(); virtual void configure(SensorBasePtr _sensor) ; diff --git a/src/processor_tracker_landmark_polyline.cpp b/src/processor_tracker_landmark_polyline.cpp index 99e966840bf6b3813b35faa4a9e94a8d5810f211..00a4699ecc7c391a9b1c4b5aad2ad32f630df69e 100644 --- a/src/processor_tracker_landmark_polyline.cpp +++ b/src/processor_tracker_landmark_polyline.cpp @@ -167,7 +167,7 @@ unsigned int ProcessorTrackerLandmarkPolyline::findLandmarks(const LandmarkBaseL // All squared distances should be witin a threshold // Choose the most overlapped one - if ((dist2 < params_.position_error_th*params_.position_error_th).all() && (best_match == nullptr || + if ((dist2 < params_->position_error_th*params_->position_error_th).all() && (best_match == nullptr || (N_overlapped >= best_match->feature_match_to_id_-best_match->feature_match_from_id_+1 && dist2.mean() < best_match->normalized_score_ ))) { @@ -244,7 +244,7 @@ unsigned int ProcessorTrackerLandmarkPolyline::findLandmarks(const LandmarkBaseL // All squared distances should be witin a threshold // Choose the most overlapped one - if ((dist2 < params_.position_error_th*params_.position_error_th).all() && (best_match == nullptr || dist2.mean() < best_match->normalized_score_ )) + if ((dist2 < params_->position_error_th*params_->position_error_th).all() && (best_match == nullptr || dist2.mean() < best_match->normalized_score_ )) { //std::cout << "BEST MATCH" << std::endl; best_match = std::make_shared<LandmarkPolylineMatch>(); @@ -296,7 +296,7 @@ bool ProcessorTrackerLandmarkPolyline::voteForKeyFrame() //std::cout << "------------- ProcessorTrackerLandmarkPolyline::voteForKeyFrame:" << std::endl; //std::cout << "polylines_last_.size():" << polylines_last_.size()<< std::endl; // option 1: more than TH new features in last - if (polylines_last_.size() >= params_.new_features_th) + if (polylines_last_.size() >= params_->new_features_th) { std::cout << "------------- NEW KEY FRAME: Option 1 - Enough new features" << std::endl; //std::cout << "\tnew features in last = " << corners_last_.size() << std::endl; @@ -305,7 +305,7 @@ bool ProcessorTrackerLandmarkPolyline::voteForKeyFrame() // option 2: loop closure (if the newest frame from which a matched landmark was observed is old enough) for (auto new_ftr : new_features_last_) { - if (last_ptr_->getFramePtr()->id() - matches_landmark_from_last_[new_ftr]->landmark_ptr_->getConstrainedByList().back()->getCapturePtr()->getFramePtr()->id() > params_.loop_frames_th) + if (last_ptr_->getFramePtr()->id() - matches_landmark_from_last_[new_ftr]->landmark_ptr_->getConstrainedByList().back()->getCapturePtr()->getFramePtr()->id() > params_->loop_frames_th) { std::cout << "------------- NEW KEY FRAME: Option 2 - Loop closure" << std::endl; return true; @@ -609,9 +609,9 @@ void ProcessorTrackerLandmarkPolyline::establishConstraints() for (int id_lmk = lmk_last_defined_point; id_lmk > polyline_match->landmark_match_to_id_; id_lmk--) { //std::cout << "\t\tid_lmk " << id_lmk << std::endl; - //std::cout << "\t\td2 = " << (points_global.col(feat_point_id_matching)-polyline_landmark->getPointVector(id_lmk)).squaredNorm() << " (th = " << params_.position_error_th*params_.position_error_th << std::endl; + //std::cout << "\t\td2 = " << (points_global.col(feat_point_id_matching)-polyline_landmark->getPointVector(id_lmk)).squaredNorm() << " (th = " << params_->position_error_th*params_->position_error_th << std::endl; - if ((points_global.col(feat_point_id_matching)-polyline_landmark->getPointVector(id_lmk)).squaredNorm() < params_.position_error_th*params_.position_error_th) + if ((points_global.col(feat_point_id_matching)-polyline_landmark->getPointVector(id_lmk)).squaredNorm() < params_->position_error_th*params_->position_error_th) { std::cout << "CLOSING POLYLINE" << std::endl; @@ -704,9 +704,9 @@ void ProcessorTrackerLandmarkPolyline::establishConstraints() for (int id_lmk = lmk_first_defined_point; id_lmk < polyline_match->landmark_match_from_id_; id_lmk++) { //std::cout << "\t\tid_lmk " << id_lmk << std::endl; - //std::cout << "\t\td2 = " << (points_global.col(feat_point_id_matching)-polyline_landmark->getPointVector(id_lmk)).squaredNorm() << " (th = " << params_.position_error_th*params_.position_error_th << std::endl; + //std::cout << "\t\td2 = " << (points_global.col(feat_point_id_matching)-polyline_landmark->getPointVector(id_lmk)).squaredNorm() << " (th = " << params_->position_error_th*params_->position_error_th << std::endl; - if ((points_global.col(feat_point_id_matching)-polyline_landmark->getPointVector(id_lmk)).squaredNorm() < params_.position_error_th*params_.position_error_th) + if ((points_global.col(feat_point_id_matching)-polyline_landmark->getPointVector(id_lmk)).squaredNorm() < params_->position_error_th*params_->position_error_th) { std::cout << "CLOSING POLYLINE" << std::endl; @@ -892,9 +892,9 @@ void ProcessorTrackerLandmarkPolyline::classifyPolilines(LandmarkBaseList& _lmk_ for (unsigned int i = 0; i < object_L.size(); i++) { // check configuration 1 - if(fabs(dAB-object_L[i]) < params_.position_error_th && - fabs(dBC-object_W[i]) < params_.position_error_th && - fabs(dAC-object_D[i]) < params_.position_error_th) + if(fabs(dAB-object_L[i]) < params_->position_error_th && + fabs(dBC-object_W[i]) < params_->position_error_th && + fabs(dAC-object_D[i]) < params_->position_error_th) { configuration = true; classification = i; @@ -902,9 +902,9 @@ void ProcessorTrackerLandmarkPolyline::classifyPolilines(LandmarkBaseList& _lmk_ } // check configuration 2 - if(fabs(dAB-object_W[i]) < params_.position_error_th && - fabs(dBC-object_L[i]) < params_.position_error_th && - fabs(dAC-object_D[i]) < params_.position_error_th) + if(fabs(dAB-object_W[i]) < params_->position_error_th && + fabs(dBC-object_L[i]) < params_->position_error_th && + fabs(dAC-object_D[i]) < params_->position_error_th) { configuration = false; classification = i; @@ -925,9 +925,9 @@ void ProcessorTrackerLandmarkPolyline::classifyPolilines(LandmarkBaseList& _lmk_ Scalar dCD = (polyline_ptr->getPointVector(C_id) - polyline_ptr->getPointVector(D_id)).norm(); // necessary conditions - if (fabs(dAD-dBC) > params_.position_error_th || - fabs(dBD-dAC) > params_.position_error_th || - fabs(dCD-dAB) > params_.position_error_th) + if (fabs(dAD-dBC) > params_->position_error_th || + fabs(dBD-dAC) > params_->position_error_th || + fabs(dCD-dAB) > params_->position_error_th) continue; } @@ -1012,7 +1012,7 @@ ConstraintBasePtr ProcessorTrackerLandmarkPolyline::createConstraint(FeatureBase ProcessorBasePtr ProcessorTrackerLandmarkPolyline::create(const std::string& _unique_name, const ProcessorParamsBasePtr _params, const SensorBasePtr) { ProcessorParamsPolylinePtr params = std::static_pointer_cast<ProcessorParamsPolyline>(_params); - ProcessorTrackerLandmarkPolylinePtr prc_ptr = std::make_shared<ProcessorTrackerLandmarkPolyline>(*params); + ProcessorTrackerLandmarkPolylinePtr prc_ptr = std::make_shared<ProcessorTrackerLandmarkPolyline>(params); prc_ptr->setName(_unique_name); return prc_ptr; } diff --git a/src/processor_tracker_landmark_polyline.h b/src/processor_tracker_landmark_polyline.h index e4748f0f0ac9976347cf28110e843493851c2460..56d7bad9e3fe6d838901a1d70ebe0dd929a69986 100644 --- a/src/processor_tracker_landmark_polyline.h +++ b/src/processor_tracker_landmark_polyline.h @@ -78,7 +78,8 @@ struct LandmarkPolylineMatch : public LandmarkMatch } }; -struct ProcessorParamsPolyline : public ProcessorParamsTracker +WOLF_STRUCT_PTR_TYPEDEFS(ProcessorParamsPolyline); +struct ProcessorParamsPolyline : public ProcessorParamsTrackerLandmark { laserscanutils::LineFinderIterativeParams line_finder_params; Scalar position_error_th; @@ -96,7 +97,7 @@ class ProcessorTrackerLandmarkPolyline : public ProcessorTrackerLandmark { private: laserscanutils::LineFinderIterative line_finder_; - ProcessorParamsPolyline params_; + ProcessorParamsPolylinePtr params_; FeatureBaseList polylines_incoming_; FeatureBaseList polylines_last_; @@ -113,7 +114,7 @@ class ProcessorTrackerLandmarkPolyline : public ProcessorTrackerLandmark public: EIGEN_MAKE_ALIGNED_OPERATOR_NEW; // to guarantee alignment (see http://eigen.tuxfamily.org/dox-devel/group__TopicStructHavingEigenMembers.html) - ProcessorTrackerLandmarkPolyline(const ProcessorParamsPolyline& _params); + ProcessorTrackerLandmarkPolyline(ProcessorParamsPolylinePtr _params); virtual ~ProcessorTrackerLandmarkPolyline(); virtual void configure(SensorBasePtr _sensor) { }; @@ -204,9 +205,9 @@ class ProcessorTrackerLandmarkPolyline : public ProcessorTrackerLandmark static ProcessorBasePtr create(const std::string& _unique_name, const ProcessorParamsBasePtr _params, const SensorBasePtr sensor_ptr = nullptr); }; -inline ProcessorTrackerLandmarkPolyline::ProcessorTrackerLandmarkPolyline(const ProcessorParamsPolyline& _params) : - ProcessorTrackerLandmark("TRACKER LANDMARK POLYLINE", _params.time_tolerance, _params.max_new_features), - line_finder_(_params.line_finder_params), +inline ProcessorTrackerLandmarkPolyline::ProcessorTrackerLandmarkPolyline(ProcessorParamsPolylinePtr _params) : + ProcessorTrackerLandmark("TRACKER LANDMARK POLYLINE", _params), + line_finder_(_params->line_finder_params), params_(_params), extrinsics_transformation_computed_(false) { diff --git a/src/processors/CMakeLists.txt b/src/processors/CMakeLists.txt index 3caf4f20692af864e5177e78ef4662bfa62ba133..c5902ad9c399c4055ad41fd8a5ac20fe29186933 100644 --- a/src/processors/CMakeLists.txt +++ b/src/processors/CMakeLists.txt @@ -4,18 +4,24 @@ INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}) SET(HDRS_PROCESSOR ${HDRS_PROCESSOR} ${CMAKE_CURRENT_SOURCE_DIR}/processor_diff_drive.h - PARENT_SCOPE) + ) SET(SRCS_PROCESSOR ${SRCS_PROCESSOR} ${CMAKE_CURRENT_SOURCE_DIR}/processor_diff_drive.cpp - PARENT_SCOPE) + ) IF (vision_utils_FOUND) SET(HDRS_PROCESSOR ${HDRS_PROCESSOR} ${CMAKE_CURRENT_SOURCE_DIR}/processor_tracker_feature_trifocal.h - PARENT_SCOPE) + ) SET(SRCS_PROCESSOR ${SRCS_PROCESSOR} ${CMAKE_CURRENT_SOURCE_DIR}/processor_tracker_feature_trifocal.cpp - PARENT_SCOPE) + ) ENDIF (vision_utils_FOUND) + + + +# These lines always at the end +SET(HDRS_PROCESSOR ${HDRS_PROCESSOR} PARENT_SCOPE) +SET(SRCS_PROCESSOR ${SRCS_PROCESSOR} PARENT_SCOPE) diff --git a/src/processors/processor_diff_drive.cpp b/src/processors/processor_diff_drive.cpp index b6d57d918fc0c01cafc646146fc401d63d48d0d3..dba867cc3fd603cf913de574035d2e42a46a545d 100644 --- a/src/processors/processor_diff_drive.cpp +++ b/src/processors/processor_diff_drive.cpp @@ -12,14 +12,11 @@ namespace wolf { -ProcessorDiffDrive::ProcessorDiffDrive(const ProcessorParamsDiffDrive ¶ms) : - ProcessorMotion("DIFF DRIVE", 0.15, 3, 3, 3, 2, 3), - unmeasured_perturbation_cov_(Matrix3s::Identity()* - params.unmeasured_perturbation_std_* - params.unmeasured_perturbation_std_), - params_(params) +ProcessorDiffDrive::ProcessorDiffDrive(ProcessorParamsDiffDrivePtr _params) : + ProcessorMotion("DIFF DRIVE", 3, 3, 3, 2, 3, _params), + params_motion_diff_drive_(_params) { - // + unmeasured_perturbation_cov_ = Matrix3s::Identity() * params_motion_diff_drive_->unmeasured_perturbation_std * params_motion_diff_drive_->unmeasured_perturbation_std; } void ProcessorDiffDrive::computeCurrentDelta(const Eigen::VectorXs& _data, @@ -84,27 +81,17 @@ void ProcessorDiffDrive::computeCurrentDelta(const Eigen::VectorXs& _data, bool ProcessorDiffDrive::voteForKeyFrame() { // Distance criterion - if (getBuffer().get().back().delta_integr_.head<2>().norm() > params_.dist_traveled_th_) + if (getBuffer().get().back().delta_integr_.head<2>().norm() > params_motion_diff_drive_->dist_traveled) { //WOLF_PROCESSOR_DEBUG("vote for key-frame on distance criterion."); return true; } -// else -// { -// WOLF_PROCESSOR_DEBUG(getBuffer().get().back().delta_integr_.head<2>().norm(), -// " < ", params_.dist_traveled_th_); -// } - if (std::abs(getBuffer().get().back().delta_integr_.tail<1>()(0)) > params_.theta_traveled_th_) + if (std::abs(getBuffer().get().back().delta_integr_.tail<1>()(0)) > params_motion_diff_drive_->angle_turned) { //WOLF_PROCESSOR_DEBUG("vote for key-frame on rotation criterion."); return true; } -// else -// { -// WOLF_PROCESSOR_DEBUG(getBuffer().get().back().delta_integr_.tail<1>()(0), -// " < ", params_.theta_traveled_th_); -// } return false; } @@ -264,7 +251,7 @@ ProcessorBasePtr ProcessorDiffDrive::create(const std::string& _unique_name, return nullptr; } - ProcessorBasePtr prc_ptr = std::make_shared<ProcessorDiffDrive>(*params); + ProcessorBasePtr prc_ptr = std::make_shared<ProcessorDiffDrive>(params); prc_ptr->setName(_unique_name); return prc_ptr; } diff --git a/src/processors/processor_diff_drive.h b/src/processors/processor_diff_drive.h index af9e07fb604c4551e702d01ddd07ea31adca47ab..f06b5940fe4dd3b09fcf91863347a727541d61e7 100644 --- a/src/processors/processor_diff_drive.h +++ b/src/processors/processor_diff_drive.h @@ -15,25 +15,21 @@ namespace wolf { WOLF_STRUCT_PTR_TYPEDEFS(ProcessorParamsDiffDrive); -struct ProcessorParamsDiffDrive : public ProcessorParamsBase +struct ProcessorParamsDiffDrive : public ProcessorParamsMotion { - ProcessorParamsDiffDrive(const Scalar _time_tolerance, - const Scalar _dist_travel_th, - const Scalar _theta_traveled_th, - const Scalar _cov_det_th, - const Scalar _unmeasured_perturbation_std = 0.0001) : - dist_traveled_th_(_dist_travel_th), - theta_traveled_th_(_theta_traveled_th), - cov_det_th_(_cov_det_th), - unmeasured_perturbation_std_(_unmeasured_perturbation_std) - { - time_tolerance = _time_tolerance; - } - - Scalar dist_traveled_th_; - Scalar theta_traveled_th_; - Scalar cov_det_th_; - Scalar unmeasured_perturbation_std_ = 0.0001; +// ProcessorParamsDiffDrive(const Scalar _time_tolerance, +// const Scalar _dist_travel_th, +// const Scalar _theta_traveled_th, +// const Scalar _cov_det_th, +// const Scalar _unmeasured_perturbation_std = 0.0001) : +// dist_traveled_th_(_dist_travel_th), +// theta_traveled_th_(_theta_traveled_th), +// cov_det_th_(_cov_det_th), +// unmeasured_perturbation_std_(_unmeasured_perturbation_std) +// { +// time_tolerance = _time_tolerance; +// } + Scalar unmeasured_perturbation_std = 0.0001; }; /** @@ -55,7 +51,7 @@ class ProcessorDiffDrive : public ProcessorMotion { public: - ProcessorDiffDrive(const ProcessorParamsDiffDrive& params); + ProcessorDiffDrive(ProcessorParamsDiffDrivePtr _params); virtual ~ProcessorDiffDrive() = default; virtual void configure(SensorBasePtr _sensor) override { } @@ -64,11 +60,9 @@ public: protected: - /// @brief Covariance to be added to the unmeasured perturbation. - Matrix3s unmeasured_perturbation_cov_; - /// @brief Intrinsic params - ProcessorParamsDiffDrive params_; + ProcessorParamsDiffDrivePtr params_motion_diff_drive_; + MatrixXs unmeasured_perturbation_cov_; virtual void computeCurrentDelta(const Eigen::VectorXs& _data, const Eigen::MatrixXs& _data_cov, diff --git a/src/processors/processor_tracker_feature_trifocal.cpp b/src/processors/processor_tracker_feature_trifocal.cpp index e6de65c4f57b60e64e9ecbf5374bc8614269ede9..b8ef70d065b3e766bfb2b2877c5d7e26f1c3cdee 100644 --- a/src/processors/processor_tracker_feature_trifocal.cpp +++ b/src/processors/processor_tracker_feature_trifocal.cpp @@ -5,31 +5,47 @@ #include "sensor_camera.h" #include "feature_point_image.h" #include "constraints/constraint_autodiff_trifocal.h" +#include "capture_image.h" // vision_utils -#include <vision_utils/detectors.h> -#include <vision_utils/descriptors.h> -#include <vision_utils/matchers.h> -#include <vision_utils/algorithms.h> +#include <vision_utils.h> +#include <detectors.h> +#include <descriptors.h> +#include <matchers.h> +#include <algorithms.h> +#include <memory> namespace wolf { + +//// DEBUG ===================================== +//debug_tTmp = clock(); +//WOLF_TRACE("======== DetectNewFeatures ========="); +//// =========================================== +// +//// DEBUG ===================================== +//debug_comp_time_ = (double)(clock() - debug_tTmp) / CLOCKS_PER_SEC; +//WOLF_TRACE("--> TIME: Detect New Features: detect ",debug_comp_time_); +//// =========================================== + + // Constructor -ProcessorTrackerFeatureTrifocal::ProcessorTrackerFeatureTrifocal(const ProcessorParamsTrackerFeatureTrifocal& _params) : - ProcessorTrackerFeature("TRACKER FEATURE TRIFOCAL", _params.time_tolerance, _params.max_new_features ), - cell_width_(0), cell_height_(0), // These will be initialized to proper values taken from the sensor via function configure() - params_(_params), +ProcessorTrackerFeatureTrifocal::ProcessorTrackerFeatureTrifocal(ProcessorParamsTrackerFeatureTrifocalPtr _params_tracker_feature_trifocal) : + ProcessorTrackerFeature("TRACKER FEATURE TRIFOCAL", _params_tracker_feature_trifocal ), + params_tracker_feature_trifocal_(_params_tracker_feature_trifocal), + capture_last_(nullptr), + capture_incoming_(nullptr), prev_origin_ptr_(nullptr), initialized_(false) { - setName(_params.name); - assert(!(params_.yaml_file_params_vision_utils.empty()) && "Missing YAML file with vision_utils parameters!"); - assert(file_exists(params_.yaml_file_params_vision_utils) && "Cannot setup processor: vision_utils' YAML file does not exist."); + setName(_params_tracker_feature_trifocal->name); + assert(!(params_tracker_feature_trifocal_->yaml_file_params_vision_utils.empty()) && "Missing YAML file with vision_utils parameters!"); + assert(file_exists(params_tracker_feature_trifocal_->yaml_file_params_vision_utils) && "Cannot setup processor: vision_utils' YAML file does not exist."); // Detector - std::string det_name = vision_utils::readYamlType(params_.yaml_file_params_vision_utils, "detector"); - det_ptr_ = vision_utils::setupDetector(det_name, det_name + " detector", params_.yaml_file_params_vision_utils); + std::string det_name = vision_utils::readYamlType(params_tracker_feature_trifocal_->yaml_file_params_vision_utils, "detector"); + det_ptr_ = vision_utils::setupDetector(det_name, det_name + " detector", params_tracker_feature_trifocal_->yaml_file_params_vision_utils); if (det_name.compare("ORB") == 0) det_ptr_ = std::static_pointer_cast<vision_utils::DetectorORB>(det_ptr_); @@ -57,8 +73,8 @@ ProcessorTrackerFeatureTrifocal::ProcessorTrackerFeatureTrifocal(const Processor det_ptr_ = std::static_pointer_cast<vision_utils::DetectorAGAST>(det_ptr_); // Descriptor - std::string des_name = vision_utils::readYamlType(params_.yaml_file_params_vision_utils, "descriptor"); - des_ptr_ = vision_utils::setupDescriptor(des_name, des_name + " descriptor", params_.yaml_file_params_vision_utils); + std::string des_name = vision_utils::readYamlType(params_tracker_feature_trifocal_->yaml_file_params_vision_utils, "descriptor"); + des_ptr_ = vision_utils::setupDescriptor(des_name, des_name + " descriptor", params_tracker_feature_trifocal_->yaml_file_params_vision_utils); if (des_name.compare("ORB") == 0) des_ptr_ = std::static_pointer_cast<vision_utils::DescriptorORB>(des_ptr_); @@ -84,8 +100,8 @@ ProcessorTrackerFeatureTrifocal::ProcessorTrackerFeatureTrifocal(const Processor des_ptr_ = std::static_pointer_cast<vision_utils::DescriptorLUCID>(des_ptr_); // Matcher - std::string mat_name = vision_utils::readYamlType(params_.yaml_file_params_vision_utils, "matcher"); - mat_ptr_ = vision_utils::setupMatcher(mat_name, mat_name + " matcher", params_.yaml_file_params_vision_utils); + std::string mat_name = vision_utils::readYamlType(params_tracker_feature_trifocal_->yaml_file_params_vision_utils, "matcher"); + mat_ptr_ = vision_utils::setupMatcher(mat_name, mat_name + " matcher", params_tracker_feature_trifocal_->yaml_file_params_vision_utils); if (mat_name.compare("FLANNBASED") == 0) mat_ptr_ = std::static_pointer_cast<vision_utils::MatcherFLANNBASED>(mat_ptr_); @@ -98,128 +114,183 @@ ProcessorTrackerFeatureTrifocal::ProcessorTrackerFeatureTrifocal(const Processor if (mat_name.compare("BRUTEFORCE_HAMMING_2") == 0) mat_ptr_ = std::static_pointer_cast<vision_utils::MatcherBRUTEFORCE_HAMMING_2>(mat_ptr_); - // Active search grid - vision_utils::AlgorithmBasePtr alg_ptr = vision_utils::setupAlgorithm("ACTIVESEARCH", "ACTIVESEARCH algorithm", params_.yaml_file_params_vision_utils); - active_search_ptr_ = std::static_pointer_cast<vision_utils::AlgorithmACTIVESEARCH>(alg_ptr); + // DEBUG VIEW + cv::startWindowThread(); + cv::namedWindow("DEBUG VIEW", cv::WINDOW_NORMAL); } // Destructor ProcessorTrackerFeatureTrifocal::~ProcessorTrackerFeatureTrifocal() { +// cv::destroyAllWindows(); } -unsigned int ProcessorTrackerFeatureTrifocal::detectNewFeatures(const unsigned int& _max_new_features, FeatureBaseList& _feature_list_out) +bool ProcessorTrackerFeatureTrifocal::isInlier(const cv::KeyPoint& _kp_last, const cv::KeyPoint& _kp_incoming) { - unsigned int n_new_features = 0; + // List of conditions + bool inlier = true; + + // A. Check euclidean norm + inlier = inlier && (cv::norm(_kp_incoming.pt-_kp_last.pt) < params_tracker_feature_trifocal_->max_euclidean_distance); + + return inlier; +} - KeyPointVector kps; - cv::Mat desc; - cv::Rect roi; - KeyPointVector new_keypoints; - cv::Mat new_descriptors; - cv::KeyPointsFilter keypoint_filter; - for (unsigned int n_iterations = 0; _max_new_features == 0 || n_iterations < _max_new_features; n_iterations++) +unsigned int ProcessorTrackerFeatureTrifocal::detectNewFeatures(const unsigned int& _max_new_features, FeatureBaseList& _feature_list_out) +{ +// // DEBUG ===================================== +// clock_t debug_tStart; +// double debug_comp_time_; +// debug_tStart = clock(); +// WOLF_TRACE("======== DetectNewFeatures ========="); +// // =========================================== + + for (unsigned int n_iterations = 0; n_iterations < _max_new_features; ++n_iterations) { - if (active_search_ptr_->pickEmptyRoi(roi)) + Eigen::Vector2i cell_last; + if (capture_last_->grid_features_->pickEmptyTrackingCell(cell_last)) { - kps = det_ptr_->detect (image_last_, roi); - desc = des_ptr_->getDescriptor(image_last_, kps); + // Get best keypoint in cell + vision_utils::FeatureIdxMap cell_feat_map = capture_last_->grid_features_->getFeatureIdxMap(cell_last(0), cell_last(1)); + bool found_feature_in_cell = false; - if (kps.size() > 0) + for (auto target_last_pair_response_idx : cell_feat_map) { - KeyPointVector list_keypoints = kps; - unsigned int index = 0; - keypoint_filter.retainBest(kps,1); - for(unsigned int i = 0; i < list_keypoints.size(); i++) - { - if(list_keypoints[i].pt == kps[0].pt) - index = i; - } - if(kps[0].response > params_activesearch_ptr_->min_response_new_feature) + // Get last KeyPoint + unsigned int index_last = target_last_pair_response_idx.second; + cv::KeyPoint kp_last = capture_last_->keypoints_.at(index_last); + assert(target_last_pair_response_idx.first == kp_last.response && "[ProcessorTrackerFeatureTrifocal::detectNewFeatures]: response mismatch."); + + // Check if there is match with incoming, if not we do not want it + if (capture_last_->map_index_to_next_.count(index_last)) { - std::cout << "response: " << kps[0].response << std::endl; - FeaturePointImagePtr point = std::make_shared<FeaturePointImage>( - kps[0], - desc.row(index), - Eigen::Matrix2s::Identity() * params_.pixel_noise_std * params_.pixel_noise_std); - point->setIsKnown(false); - _feature_list_out.push_back(point); + unsigned int index_incoming = capture_last_->map_index_to_next_[index_last]; + cv::KeyPoint kp_incoming = capture_incoming_->keypoints_.at(index_incoming); + + if (isInlier( kp_incoming, kp_last)) + { + // Create WOLF feature + FeaturePointImagePtr last_point_ptr = std::make_shared<FeaturePointImage>( + kp_last, + index_last, + capture_last_->descriptors_.row(index_last), + Eigen::Matrix2s::Identity() * params_tracker_feature_trifocal_->pixel_noise_std * params_tracker_feature_trifocal_->pixel_noise_std); + + _feature_list_out.push_back(last_point_ptr); - active_search_ptr_->hitCell(kps[0]); + // hit cell to acknowledge there's a tracked point in that cell + capture_last_->grid_features_->hitTrackingCell(kp_last); - n_new_features++; + found_feature_in_cell = true; + + break; // Good kp found for this grid. + } } } - else - active_search_ptr_->blockCell(roi); + if (!found_feature_in_cell) + capture_last_->grid_features_->blockTrackingCell(cell_last); } else - break; + break; // There are no empty cells } - WOLF_DEBUG( "DetectNewFeatures - Number of new features detected: " , n_new_features ); - return n_new_features; -} + WOLF_TRACE("DetectNewFeatures - Number of new features detected: " , _feature_list_out.size() ); -bool ProcessorTrackerFeatureTrifocal::voteForKeyFrame() -{ - bool vote = true; - - // list of conditions with AND logic (all need to be satisfied) - - // 1. vote if we had enough features before - vote = vote && getNewFeaturesListLast().size() >= params_.min_features_for_keyframe; - // 2. vote if we have not enough features now - vote = vote && getNewFeaturesListIncoming().size() < params_.min_features_for_keyframe; +// // DEBUG +// debug_comp_time_ = (double)(clock() - debug_tStart) / CLOCKS_PER_SEC; +// WOLF_TRACE("--> TIME: detect new features: TOTAL ",debug_comp_time_); +// WOLF_TRACE("======== ========= ========="); - return vote; -} - -bool ProcessorTrackerFeatureTrifocal::correctFeatureDrift(const FeatureBasePtr _origin_feature, const FeatureBasePtr _last_feature, FeatureBasePtr _incoming_feature) -{ - return true; + return _feature_list_out.size(); } unsigned int ProcessorTrackerFeatureTrifocal::trackFeatures(const FeatureBaseList& _feature_list_in, FeatureBaseList& _feature_list_out, FeatureMatchMap& _feature_matches) { - KeyPointVector kps; - cv::Mat desc; - KeyPointVector candidate_keypoints; - cv::Mat candidate_descriptors; - cv::DMatch cv_match; - - for (auto feature_base_ptr : _feature_list_in) +// // DEBUG ===================================== +// clock_t debug_tStart; +// double debug_comp_time_; +// debug_tStart = clock(); +// WOLF_TRACE("======== TrackFeatures ========="); +// // =========================================== + + for (auto feature_base_last_ : _feature_list_in) { - FeaturePointImagePtr feature_ptr = std::static_pointer_cast<FeaturePointImage>(feature_base_ptr); + FeaturePointImagePtr feature_last_ = std::static_pointer_cast<FeaturePointImage>(feature_base_last_); - cv::Rect roi = vision_utils::setRoi(feature_ptr->getKeypoint().pt.x, feature_ptr->getKeypoint().pt.y, cell_width_, cell_height_); + if ( capture_last_->map_index_to_next_.count(feature_last_->getIndexKeyPoint()) ) + { + int index_kp_incoming = capture_last_->map_index_to_next_[feature_last_->getIndexKeyPoint()]; - active_search_ptr_->hitCell(feature_ptr->getKeypoint()); + if (capture_incoming_->matches_normalized_scores_.at(index_kp_incoming) > mat_ptr_->getParams()->min_norm_score ) + { + // Check Euclidean distance between keypoints + cv::KeyPoint kp_incoming = capture_incoming_->keypoints_.at(index_kp_incoming); + cv::KeyPoint kp_last = capture_last_->keypoints_.at(feature_last_->getIndexKeyPoint()); - cv::Mat target_descriptor = feature_ptr->getDescriptor(); + if (isInlier(kp_last, kp_incoming)) + { + FeaturePointImagePtr incoming_point_ptr = std::make_shared<FeaturePointImage>( + kp_incoming, + index_kp_incoming, + capture_incoming_->descriptors_.row(index_kp_incoming), + Eigen::Matrix2s::Identity() * params_tracker_feature_trifocal_->pixel_noise_std * params_tracker_feature_trifocal_->pixel_noise_std); - kps = det_ptr_->detect(image_incoming_, roi); + _feature_list_out.push_back(incoming_point_ptr); - if (kps.size() > 0) - { - desc = des_ptr_->getDescriptor(image_incoming_, kps); - Scalar normalized_score = mat_ptr_->match(target_descriptor, desc, des_ptr_->getSize(), cv_match); - if ( normalized_score > mat_ptr_->getParams()->min_norm_score ) - { - FeaturePointImagePtr incoming_point_ptr = std::make_shared<FeaturePointImage>( - candidate_keypoints[cv_match.trainIdx], (candidate_descriptors.row(cv_match.trainIdx)), - Eigen::Matrix2s::Identity() * params_.pixel_noise_std * params_.pixel_noise_std); - incoming_point_ptr->setIsKnown(feature_ptr->isKnown()); - _feature_list_out.push_back(incoming_point_ptr); + _feature_matches[incoming_point_ptr] = std::make_shared<FeatureMatch>(FeatureMatch({feature_last_, capture_incoming_->matches_normalized_scores_.at(index_kp_incoming)})); - _feature_matches[incoming_point_ptr] = std::make_shared<FeatureMatch>(FeatureMatch({feature_base_ptr, normalized_score})); + // hit cell to acknowledge there's a tracked point in that cell + capture_incoming_->grid_features_->hitTrackingCell(kp_incoming); + } } } } + +// // DEBUG +// debug_comp_time_ = (double)(clock() - debug_tStart) / CLOCKS_PER_SEC; +// WOLF_TRACE("--> TIME: track: ",debug_comp_time_); +// WOLF_TRACE("======== ========= ========="); + + WOLF_TRACE("TrAckFeatures - Number of features tracked: " , _feature_list_out.size() ); + return _feature_list_out.size(); } +bool ProcessorTrackerFeatureTrifocal::correctFeatureDrift(const FeatureBasePtr _origin_feature, const FeatureBasePtr _last_feature, FeatureBasePtr _incoming_feature) +{ + return true; +} + +bool ProcessorTrackerFeatureTrifocal::voteForKeyFrame() +{ + // A. crossing voting threshold with ascending number of features + bool vote_up = true; + // 1. vote if we did not have enough features before + vote_up = vote_up && (previousNumberOfTracks() < params_tracker_feature_trifocal_->min_features_for_keyframe); + // 2. vote if we have enough features now + vote_up = vote_up && (incoming_ptr_->getFeatureList().size() >= params_tracker_feature_trifocal_->min_features_for_keyframe); + + // B. crossing voting threshold with descending number of features + bool vote_down = true; + // 1. vote if we had enough features before + vote_down = vote_down && (last_ptr_->getFeatureList().size() >= params_tracker_feature_trifocal_->min_features_for_keyframe); + // 2. vote if we have not enough features now + vote_down = vote_down && (incoming_ptr_->getFeatureList().size() < params_tracker_feature_trifocal_->min_features_for_keyframe); + + if (vote_up) + WOLF_TRACE("VOTE UP"); + if (vote_down) + WOLF_TRACE("VOTE DOWN"); + + return vote_up || vote_down; +} + +void ProcessorTrackerFeatureTrifocal::advanceDerived() +{ + ProcessorTrackerFeature::advanceDerived(); +} + void ProcessorTrackerFeatureTrifocal::resetDerived() { // Call parent class method @@ -229,7 +300,6 @@ void ProcessorTrackerFeatureTrifocal::resetDerived() if (initialized_) prev_origin_ptr_ = origin_ptr_; - // // Print resulting list // TrackMatches matches_prevorig_origin = track_matrix_.matches(prev_origin_ptr_, origin_ptr_); // for (auto const & pair_trkid_pair : matches_prevorig_origin) @@ -241,11 +311,12 @@ void ProcessorTrackerFeatureTrifocal::resetDerived() // " prev: ", feature_in_prev->id(), // " origin: ", feature_in_origin->id()); // } - } void ProcessorTrackerFeatureTrifocal::preProcess() { + WOLF_TRACE("-------- Image ", getIncomingPtr()->id(), " -- t = ", getIncomingPtr()->getTimeStamp(), " s ----------"); + if (!initialized_) { if (origin_ptr_ && last_ptr_ && (last_ptr_ != origin_ptr_) && prev_origin_ptr_ == nullptr) @@ -254,6 +325,66 @@ void ProcessorTrackerFeatureTrifocal::preProcess() if (prev_origin_ptr_ && origin_ptr_ && last_ptr_ && prev_origin_ptr_ != origin_ptr_) initialized_ = true; } + + // Get capture + capture_incoming_ = std::static_pointer_cast<CaptureImage>(incoming_ptr_); + + // Detect INC KeyPoints + capture_incoming_->keypoints_ = det_ptr_->detect(capture_incoming_->getImage()); + + // Get INC descriptors + capture_incoming_->descriptors_ = des_ptr_->getDescriptor(capture_incoming_->getImage(), capture_incoming_->keypoints_); + + // Create and fill incoming grid + capture_incoming_->grid_features_ = std::make_shared<vision_utils::FeatureIdxGrid>(capture_incoming_->getImage().rows, capture_incoming_->getImage().cols, params_tracker_feature_trifocal_->n_cells_v, params_tracker_feature_trifocal_->n_cells_h); + + capture_incoming_->grid_features_->insert(capture_incoming_->keypoints_); + + // If last_ptr_ is not null, then we can do some computation here. + if (last_ptr_ != nullptr) + { + // Get capture + capture_last_ = std::static_pointer_cast<CaptureImage>(last_ptr_); + + // Match full image (faster) + // We exchange the order of the descriptors to fill better the map hereafter (map does not allow a single key) + DMatchVector matches_incoming_from_last; + + capture_incoming_->matches_normalized_scores_ = mat_ptr_->robustMatch(capture_incoming_->keypoints_, + capture_last_->keypoints_, + capture_incoming_->descriptors_, + capture_last_->descriptors_, + des_ptr_->getSize(), + matches_incoming_from_last); + + capture_incoming_->matches_from_precedent_ = matches_incoming_from_last; + + // Set capture map of match indices + for (auto match : capture_incoming_->matches_from_precedent_) + capture_last_->map_index_to_next_[match.trainIdx] = match.queryIdx; // map[last] = incoming + } +} + +void ProcessorTrackerFeatureTrifocal::postProcess() +{ + // DEBUG + std::vector<vision_utils::KeyPointEnhanced> kps_e; + + for (auto const & feat_base : last_ptr_->getFeatureList()) + { + FeaturePointImagePtr feat = std::static_pointer_cast<FeaturePointImage>(feat_base); + unsigned int id = feat->id(); + unsigned int track_id = feat->trackId(); + vision_utils::KeyPointEnhanced kp_e(feat->getKeypoint(), id, track_id, track_matrix_.trackSize(track_id), feat->getMeasurementCovariance()); + kps_e.push_back(kp_e); + } + + // DEBUG + cv::Mat img = (std::static_pointer_cast<CaptureImage>(last_ptr_))->getImage(); + cv::Mat img_proc = vision_utils::buildImageProcessed(img, kps_e); + + cv::imshow("DEBUG VIEW", img_proc); + cv::waitKey(1); } ConstraintBasePtr ProcessorTrackerFeatureTrifocal::createConstraint(FeatureBasePtr _feature_ptr, FeatureBasePtr _feature_other_ptr) @@ -274,41 +405,41 @@ void ProcessorTrackerFeatureTrifocal::establishConstraints() TrackMatches matches = track_matrix_.matches(prev_origin_ptr_, last_ptr_); // it's guaranteed by construction that the track also includes origin for (auto pair_trkid_match : matches) // OMG this will add potentially a loooot of constraints! TODO see a smarter way of adding constraints - { + { // Currently reduced by creating constraints for large tracks // get track ID size_t trk_id = pair_trkid_match.first; - // get the three features for this track - // FeatureBasePtr ftr_prev = track_matrix_.feature(trk_id, prev_origin_ptr_); // left here for ref, but implemented in a quicker way below - // FeatureBasePtr ftr_last = track_matrix_.feature(trk_id, last_ptr_); // same here - FeatureBasePtr ftr_prev = pair_trkid_match.second.first; - FeatureBasePtr ftr_orig = track_matrix_.feature(trk_id, origin_ptr_); // because it's a tracker, this feature in the middle of prev and last exists for sure! - FeatureBasePtr ftr_last = pair_trkid_match.second.second; - - // make constraint - ConstraintAutodiffTrifocalPtr ctr = std::make_shared<ConstraintAutodiffTrifocal>(ftr_prev, ftr_orig, ftr_last, shared_from_this(), false, CTR_ACTIVE); - - // link to wolf tree - ftr_last->addConstraint(ctr); - ftr_orig->addConstrainedBy(ctr); - ftr_prev->addConstrainedBy(ctr); + if (track_matrix_.trackSize(trk_id)>params_tracker_feature_trifocal_->min_track_length_for_constraint) + { + // get the three features for this track + // FeatureBasePtr ftr_prev = track_matrix_.feature(trk_id, prev_origin_ptr_); // left here for ref, but implemented in a quicker way below + // FeatureBasePtr ftr_last = track_matrix_.feature(trk_id, last_ptr_); // same here + FeatureBasePtr ftr_prev = pair_trkid_match.second.first; + FeatureBasePtr ftr_orig = track_matrix_.feature(trk_id, origin_ptr_); // because it's a tracker, this feature in the middle of prev and last exists for sure! + FeatureBasePtr ftr_last = pair_trkid_match.second.second; + + // make constraint + ConstraintAutodiffTrifocalPtr ctr = std::make_shared<ConstraintAutodiffTrifocal>(ftr_prev, ftr_orig, ftr_last, shared_from_this(), false, CTR_ACTIVE); + + // link to wolf tree + ftr_last->addConstraint(ctr); + ftr_orig->addConstrainedBy(ctr); + ftr_prev->addConstrainedBy(ctr); + } } } } +void ProcessorTrackerFeatureTrifocal::setParams(const ProcessorParamsTrackerFeatureTrifocalPtr _params) +{ + params_tracker_feature_trifocal_ = _params; +} + void ProcessorTrackerFeatureTrifocal::configure(SensorBasePtr _sensor) { SensorCameraPtr camera = std::static_pointer_cast<SensorCamera>(_sensor); - camera->setNoiseStd(Vector2s::Ones() * params_.pixel_noise_std); - - active_search_ptr_->initAlg(camera->getImgWidth(), camera->getImgHeight() , det_ptr_->getPatternRadius()); - - params_activesearch_ptr_ = std::static_pointer_cast<vision_utils::AlgorithmParamsACTIVESEARCH>( active_search_ptr_->getParams() ); - - cell_width_ = camera->getImgWidth() / params_activesearch_ptr_->n_cells_h; - cell_height_ = camera->getImgHeight() / params_activesearch_ptr_->n_cells_v; - + camera->setNoiseStd(Vector2s::Ones() * params_tracker_feature_trifocal_->pixel_noise_std); } ProcessorBasePtr ProcessorTrackerFeatureTrifocal::create(const std::string& _unique_name, @@ -317,7 +448,7 @@ ProcessorBasePtr ProcessorTrackerFeatureTrifocal::create(const std::string& _uni { const auto params = std::static_pointer_cast<ProcessorParamsTrackerFeatureTrifocal>(_params); - ProcessorBasePtr prc_ptr = std::make_shared<ProcessorTrackerFeatureTrifocal>(*params); + ProcessorBasePtr prc_ptr = std::make_shared<ProcessorTrackerFeatureTrifocal>(params); prc_ptr->setName(_unique_name); prc_ptr->configure(_sensor_ptr); return prc_ptr; diff --git a/src/processors/processor_tracker_feature_trifocal.h b/src/processors/processor_tracker_feature_trifocal.h index e7a648308ddec03bb6a20b00c7f94386d779875b..e31ee6f5f439d8cc51eec4ebad2250ff94c6d8fb 100644 --- a/src/processors/processor_tracker_feature_trifocal.h +++ b/src/processors/processor_tracker_feature_trifocal.h @@ -3,53 +3,48 @@ //Wolf includes #include "../processor_tracker_feature.h" +#include "../capture_image.h" // Vision utils -#include <vision_utils/detectors/detector_base.h> -#include <vision_utils/descriptors/descriptor_base.h> -#include <vision_utils/matchers/matcher_base.h> -#include <vision_utils/algorithms/activesearch/alg_activesearch.h> +#include <vision_utils.h> +#include <detectors/detector_base.h> +#include <descriptors/descriptor_base.h> +#include <matchers/matcher_base.h> +#include <algorithms/activesearch/alg_activesearch.h> namespace wolf { WOLF_STRUCT_PTR_TYPEDEFS(ProcessorParamsTrackerFeatureTrifocal); -struct ProcessorParamsTrackerFeatureTrifocal : public ProcessorParamsTracker +struct ProcessorParamsTrackerFeatureTrifocal : public ProcessorParamsTrackerFeature { std::string yaml_file_params_vision_utils; - unsigned int min_features_for_keyframe; ///< minimum nbr. of features to vote for keyframe - + int n_cells_h; + int n_cells_v; + int min_response_new_feature; + Scalar max_euclidean_distance; Scalar pixel_noise_std; ///< std noise of the pixel + int min_track_length_for_constraint; ///< Minimum track length of a matched feature to create a constraint }; WOLF_PTR_TYPEDEFS(ProcessorTrackerFeatureTrifocal); class ProcessorTrackerFeatureTrifocal : public ProcessorTrackerFeature { - // Parameters for vision_utils protected: vision_utils::DetectorBasePtr det_ptr_; vision_utils::DescriptorBasePtr des_ptr_; vision_utils::MatcherBasePtr mat_ptr_; - vision_utils::AlgorithmACTIVESEARCHPtr active_search_ptr_; // Active Search - - int cell_width_; ///< Active search cell width - int cell_height_; ///< Active search cell height - vision_utils::AlgorithmParamsACTIVESEARCHPtr params_activesearch_ptr_; ///< Active search parameters protected: - ProcessorParamsTrackerFeatureTrifocal params_; ///< Configuration parameters - cv::Mat image_last_, image_incoming_; ///< Images of the "last" and "incoming" Captures + ProcessorParamsTrackerFeatureTrifocalPtr params_tracker_feature_trifocal_; ///< Configuration parameters - struct - { - unsigned int width_; ///< width of the image - unsigned int height_; ///< height of the image - } image_; + CaptureImagePtr capture_last_; + CaptureImagePtr capture_incoming_; private: CaptureBasePtr prev_origin_ptr_; ///< Capture previous to origin_ptr_ for the third focus of the trifocal. @@ -59,7 +54,7 @@ class ProcessorTrackerFeatureTrifocal : public ProcessorTrackerFeature /** \brief Class constructor */ - ProcessorTrackerFeatureTrifocal( const ProcessorParamsTrackerFeatureTrifocal& _params ); + ProcessorTrackerFeatureTrifocal( ProcessorParamsTrackerFeatureTrifocalPtr _params_tracker_feature_trifocal ); /** \brief Class Destructor */ @@ -112,6 +107,11 @@ class ProcessorTrackerFeatureTrifocal : public ProcessorTrackerFeature ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** \brief advance pointers + * + */ + virtual void advanceDerived() override; + /** \brief reset pointers and match lists at KF creation * */ @@ -122,12 +122,21 @@ class ProcessorTrackerFeatureTrifocal : public ProcessorTrackerFeature */ virtual void preProcess() override; + /** \brief Post-process + * + */ + virtual void postProcess() override; + /** \brief Establish constraints between features in Captures \b last and \b origin */ virtual void establishConstraints() override; CaptureBasePtr getPrevOriginPtr(); + bool isInlier(const cv::KeyPoint& _kp_incoming, const cv::KeyPoint& _kp_last); + + void setParams(const ProcessorParamsTrackerFeatureTrifocalPtr _params); + public: /// @brief Factory method diff --git a/src/sensor_GPS_fix.cpp b/src/sensor_GPS_fix.cpp index 4398d8e3f2250ce31184579ec4c530425c1c3ac9..8c448046228b32bf79494fd77d3995e8bab854f8 100644 --- a/src/sensor_GPS_fix.cpp +++ b/src/sensor_GPS_fix.cpp @@ -28,11 +28,6 @@ SensorGPSFix::~SensorGPSFix() // } -Scalar SensorGPSFix::getNoise() const -{ - return noise_std_(0); -} - // Define the factory method SensorBasePtr SensorGPSFix::create(const std::string& _unique_name, const Eigen::VectorXs& _extrinsics, const IntrinsicsBasePtr _intrinsics) diff --git a/src/sensor_GPS_fix.h b/src/sensor_GPS_fix.h index 3291aa538a7f7cd7a8fa838df8190a4b70ab4acb..c319d159f0adce4734f832a24c40ba361c8ba64b 100644 --- a/src/sensor_GPS_fix.h +++ b/src/sensor_GPS_fix.h @@ -38,14 +38,7 @@ class SensorGPSFix : public SensorBase SensorGPSFix(const Eigen::VectorXs & _extrinsics, IntrinsicsGPSFixPtr _intrinsics_ptr); virtual ~SensorGPSFix(); - - /** \brief Returns noise standard deviation - * - * Returns noise standard deviation - * - **/ - Scalar getNoise() const; - + public: static SensorBasePtr create(const std::string& _unique_name, const Eigen::VectorXs& _extrinsics_pq, const IntrinsicsBasePtr _intrinsics); diff --git a/src/sensor_base.h b/src/sensor_base.h index cfacfbc7d23bd17eb34b0ef3bff6fa3cc95ae207..beb4924e9dbb0de83a8426b2b89af3a26bd65478 100644 --- a/src/sensor_base.h +++ b/src/sensor_base.h @@ -149,6 +149,8 @@ class SensorBase : public NodeBase, public std::enable_shared_from_this<SensorBa void setNoiseCov(const Eigen::MatrixXs & _noise_std); Eigen::VectorXs getNoiseStd(); Eigen::MatrixXs getNoiseCov(); + void setExtrinsicDynamic(bool _extrinsic_dynamic); + void setIntrinsicDynamic(bool _intrinsic_dynamic); protected: Size computeCalibSize() const; @@ -260,6 +262,16 @@ inline void SensorBase::updateCalibSize() calib_size_ = computeCalibSize(); } +inline void SensorBase::setExtrinsicDynamic(bool _extrinsic_dynamic) +{ + extrinsic_dynamic_ = _extrinsic_dynamic; +} + +inline void SensorBase::setIntrinsicDynamic(bool _intrinsic_dynamic) +{ + intrinsic_dynamic_ = _intrinsic_dynamic; +} + } // namespace wolf diff --git a/src/sensors/CMakeLists.txt b/src/sensors/CMakeLists.txt index 5b634817ee7ef1b81e67cdf29af8ed8a227b131a..48a27e6003eeba7d9bff033c682a187057d61789 100644 --- a/src/sensors/CMakeLists.txt +++ b/src/sensors/CMakeLists.txt @@ -6,8 +6,15 @@ SET(HDRS_SENSOR ${HDRS_SENSOR} ${CMAKE_CURRENT_SOURCE_DIR}/diff_drive_tools.h ${CMAKE_CURRENT_SOURCE_DIR}/diff_drive_tools.hpp ${CMAKE_CURRENT_SOURCE_DIR}/sensor_diff_drive.h - PARENT_SCOPE) + ) SET(SRCS_SENSOR ${SRCS_SENSOR} ${CMAKE_CURRENT_SOURCE_DIR}/sensor_diff_drive.cpp - PARENT_SCOPE) + ) + + + +# These lines always at the end +SET(HDRS_SENSOR ${HDRS_SENSOR} PARENT_SCOPE) +SET(SRCS_SENSOR ${SRCS_SENSOR} PARENT_SCOPE) + \ No newline at end of file diff --git a/src/serialization/cereal/serialization_processor_odom2d_params.h b/src/serialization/cereal/serialization_processor_odom2d_params.h index 109fa6c54f8ab5a4f583fb3c3e360124a967dc40..4e34becad92d9918c9d8cfb7b8d571a343ef4b82 100644 --- a/src/serialization/cereal/serialization_processor_odom2d_params.h +++ b/src/serialization/cereal/serialization_processor_odom2d_params.h @@ -14,12 +14,12 @@ void serialize(Archive& ar, wolf::ProcessorParamsOdom2D& o, ar( cereal::make_nvp("ProcessorParamsBase", cereal::base_class<wolf::ProcessorParamsBase>(&o)) ); - ar( cereal::make_nvp("cov_det_th_", o.cov_det_th_) ); + ar( cereal::make_nvp("cov_det_th_", o.cov_det) ); ar( cereal::make_nvp("dist_traveled_th_", o.dist_traveled_th_) ); ar( cereal::make_nvp("elapsed_time_th_", o.elapsed_time_th_) ); ar( cereal::make_nvp("theta_traveled_th_", o.theta_traveled_th_) ); ar( cereal::make_nvp("unmeasured_perturbation_std_", - o.unmeasured_perturbation_std_) ); + o.unmeasured_perturbation_std) ); } } // namespace cereal diff --git a/src/test/CMakeLists.txt b/src/test/CMakeLists.txt index 078d304265420ff86f7c43d5c079fcd2aaae2779..d69f8fd098651d6162e61d470cacb61390561199 100644 --- a/src/test/CMakeLists.txt +++ b/src/test/CMakeLists.txt @@ -48,6 +48,10 @@ target_link_libraries(gtest_capture_base ${PROJECT_NAME}) #wolf_add_gtest(gtest_constraint_sparse gtest_constraint_sparse.cpp) #target_link_libraries(gtest_constraint_sparse ${PROJECT_NAME}) +# ConstraintAutodiff class test +wolf_add_gtest(gtest_constraint_autodiff gtest_constraint_autodiff.cpp) +target_link_libraries(gtest_constraint_autodiff ${PROJECT_NAME}) + # FeatureBase classes test wolf_add_gtest(gtest_eigen_predicates gtest_eigen_predicates.cpp) target_link_libraries(gtest_eigen_predicates ${PROJECT_NAME}) @@ -184,10 +188,6 @@ target_link_libraries(gtest_odom_2D ${PROJECT_NAME}) wolf_add_gtest(gtest_odom_3D gtest_odom_3D.cpp) target_link_libraries(gtest_odom_3D ${PROJECT_NAME}) -# ConstraintAutodiff class test -wolf_add_gtest(gtest_constraint_autodiff gtest_constraint_autodiff.cpp) -target_link_libraries(gtest_constraint_autodiff ${PROJECT_NAME}) - # ------- Now Core classes Serialization ---------- add_subdirectory(serialization) diff --git a/src/test/gtest_IMU.cpp b/src/test/gtest_IMU.cpp index 38dfbc223a2e3137c503eef65ff343e379265365..5aa518eb9475a0fd1a05daf938c5443cc9658a3b 100644 --- a/src/test/gtest_IMU.cpp +++ b/src/test/gtest_IMU.cpp @@ -631,14 +631,16 @@ class Process_Constraint_IMU_ODO : public Process_Constraint_IMU SensorBasePtr sensor = problem->installSensor ("ODOM 3D", "Odometer", (Vector7s()<<0,0,0,0,0,0,1).finished(), wolf_root + "/src/examples/sensor_odom_3D.yaml" ); ProcessorBasePtr processor = problem->installProcessor("ODOM 3D", "Odometer", "Odometer" , wolf_root + "/src/examples/processor_odom_3D.yaml"); sensor_odo = static_pointer_cast<SensorOdom3D>(sensor); + processor_odo = static_pointer_cast<ProcessorOdom3D>(processor); + processor_odo->setTimeTolerance(dt/2); // prevent this processor from voting by setting high thresholds : - processor_odo->setAngleTurned(2.0); - processor_odo->setDistTraveled(1.0); - processor_odo->setMaxBuffLength(10); - processor_odo->setMaxTimeSpan(1.0); + processor_odo->setAngleTurned(999); + processor_odo->setDistTraveled(999); + processor_odo->setMaxBuffLength(999); + processor_odo->setMaxTimeSpan(999); } virtual void integrateAll() override diff --git a/src/test/gtest_constraint_absolute.cpp b/src/test/gtest_constraint_absolute.cpp index 80a6579ae459d7932e7c0e4df9b95e48a76ce326..a0587e29ce96207c1e7bdaa05fb4f7e4a9b5cbc4 100644 --- a/src/test/gtest_constraint_absolute.cpp +++ b/src/test/gtest_constraint_absolute.cpp @@ -41,7 +41,7 @@ CeresManager ceres_mgr(problem); FrameBasePtr frm0 = problem->emplaceFrame(KEY_FRAME, problem->zeroState(), TimeStamp(0)); // Capture, feature and constraint -CaptureBasePtr cap0 = frm0->addCapture(std::make_shared<CaptureMotion>(0, nullptr, pose10, 10, 9, nullptr)); +CaptureBasePtr cap0 = frm0->addCapture(std::make_shared<CaptureMotion>("IMU ABS", 0, nullptr, pose10, 10, 9, nullptr)); //////////////////////////////////////////////////////// /* In the tests below, we check that ConstraintBlockAbsolute and ConstraintQuaternionAbsolute are working fine @@ -51,7 +51,7 @@ CaptureBasePtr cap0 = frm0->addCapture(std::make_shared<CaptureMotion>(0, nullpt TEST(ConstraintBlockAbs, ctr_block_abs_p_check) { - FeatureBasePtr fea0 = cap0->addFeature(std::make_shared<FeatureBase>("POSE", pose10.head<3>(), data_cov.topLeftCorner<3,3>())); + FeatureBasePtr fea0 = cap0->addFeature(std::make_shared<FeatureBase>("POSITION", pose10.head<3>(), data_cov.topLeftCorner<3,3>())); ConstraintBlockAbsolutePtr ctr0 = std::static_pointer_cast<ConstraintBlockAbsolute>( fea0->addConstraint(std::make_shared<ConstraintBlockAbsolute>(fea0->getFramePtr()->getPPtr())) ); @@ -60,7 +60,7 @@ TEST(ConstraintBlockAbs, ctr_block_abs_p_check) TEST(ConstraintBlockAbs, ctr_block_abs_p_solve) { - FeatureBasePtr fea0 = cap0->addFeature(std::make_shared<FeatureBase>("POSE", pose10.head<3>(), data_cov.topLeftCorner<3,3>())); + FeatureBasePtr fea0 = cap0->addFeature(std::make_shared<FeatureBase>("POSITION", pose10.head<3>(), data_cov.topLeftCorner<3,3>())); ConstraintBlockAbsolutePtr ctr0 = std::static_pointer_cast<ConstraintBlockAbsolute>( fea0->addConstraint(std::make_shared<ConstraintBlockAbsolute>(fea0->getFramePtr()->getPPtr())) ); @@ -78,7 +78,7 @@ TEST(ConstraintBlockAbs, ctr_block_abs_p_solve) TEST(ConstraintBlockAbs, ctr_block_abs_v_check) { - FeatureBasePtr fea0 = cap0->addFeature(std::make_shared<FeatureBase>("POSE", pose10.tail<3>(), data_cov.bottomRightCorner<3,3>())); + FeatureBasePtr fea0 = cap0->addFeature(std::make_shared<FeatureBase>("VELOCITY", pose10.tail<3>(), data_cov.bottomRightCorner<3,3>())); ConstraintBlockAbsolutePtr ctr0 = std::static_pointer_cast<ConstraintBlockAbsolute>( fea0->addConstraint(std::make_shared<ConstraintBlockAbsolute>(fea0->getFramePtr()->getVPtr())) ); @@ -87,7 +87,7 @@ TEST(ConstraintBlockAbs, ctr_block_abs_v_check) TEST(ConstraintBlockAbs, ctr_block_abs_v_solve) { - FeatureBasePtr fea0 = cap0->addFeature(std::make_shared<FeatureBase>("POSE", pose10.tail<3>(), data_cov.bottomRightCorner<3,3>())); + FeatureBasePtr fea0 = cap0->addFeature(std::make_shared<FeatureBase>("VELOCITY", pose10.tail<3>(), data_cov.bottomRightCorner<3,3>())); ConstraintBlockAbsolutePtr ctr0 = std::static_pointer_cast<ConstraintBlockAbsolute>( fea0->addConstraint(std::make_shared<ConstraintBlockAbsolute>(fea0->getFramePtr()->getVPtr())) ); @@ -105,7 +105,7 @@ TEST(ConstraintBlockAbs, ctr_block_abs_v_solve) TEST(ConstraintQuatAbs, ctr_block_abs_o_check) { - FeatureBasePtr fea0 = cap0->addFeature(std::make_shared<FeatureBase>("POSE", pose10.segment<4>(3), data_cov.block<3,3>(3,3))); + FeatureBasePtr fea0 = cap0->addFeature(std::make_shared<FeatureBase>("QUATERNION", pose10.segment<4>(3), data_cov.block<3,3>(3,3))); ConstraintBlockAbsolutePtr ctr0 = std::static_pointer_cast<ConstraintBlockAbsolute>( fea0->addConstraint(std::make_shared<ConstraintQuaternionAbsolute>(fea0->getFramePtr()->getOPtr())) ); @@ -114,7 +114,7 @@ TEST(ConstraintQuatAbs, ctr_block_abs_o_check) TEST(ConstraintQuatAbs, ctr_block_abs_o_solve) { - FeatureBasePtr fea0 = cap0->addFeature(std::make_shared<FeatureBase>("POSE", pose10.segment<4>(3), data_cov.block<3,3>(3,3))); + FeatureBasePtr fea0 = cap0->addFeature(std::make_shared<FeatureBase>("QUATERNION", pose10.segment<4>(3), data_cov.block<3,3>(3,3))); ConstraintBlockAbsolutePtr ctr0 = std::static_pointer_cast<ConstraintBlockAbsolute>( fea0->addConstraint(std::make_shared<ConstraintQuaternionAbsolute>(fea0->getFramePtr()->getOPtr())) ); diff --git a/src/test/gtest_constraint_autodiff_trifocal.cpp b/src/test/gtest_constraint_autodiff_trifocal.cpp index f4c8bc89905b7263105ab75e7197f3989dd00096..aa34b7ea76b6efb83d3cbf69b75057af5fc66e38 100644 --- a/src/test/gtest_constraint_autodiff_trifocal.cpp +++ b/src/test/gtest_constraint_autodiff_trifocal.cpp @@ -114,27 +114,20 @@ class ConstraintAutodiffTrifocalTest : public testing::Test{ // Build problem problem = Problem::create("PO 3D"); ceres::Solver::Options options; -// options.function_tolerance = 1e-16; -// options.max_num_iterations = 500; -// options.parameter_tolerance = 1e-16; -// options.max_linear_solver_iterations = 500; -// options.min_linear_solver_iterations = 20; -// options.use_inner_iterations = true; -// options.gradient_tolerance = 1e-16; ceres_manager = std::make_shared<CeresManager>(problem, options); // Install sensor and processor S = problem->installSensor("CAMERA", "canonical", pose_cam, wolf_root + "/src/examples/camera_params_canonical.yaml"); camera = std::static_pointer_cast<SensorCamera>(S); - ProcessorParamsTrackerFeatureTrifocalPtr params_trifocal = std::make_shared<ProcessorParamsTrackerFeatureTrifocal>(); - params_trifocal->time_tolerance = 1.0/2; - params_trifocal->max_new_features = 5; - params_trifocal->min_features_for_keyframe = 5; - params_trifocal->yaml_file_params_vision_utils = wolf_root + "/src/examples/vision_utils_active_search.yaml"; + ProcessorParamsTrackerFeatureTrifocalPtr params_tracker_feature_trifocal_trifocal = std::make_shared<ProcessorParamsTrackerFeatureTrifocal>(); + params_tracker_feature_trifocal_trifocal->time_tolerance = 1.0/2; + params_tracker_feature_trifocal_trifocal->max_new_features = 5; + params_tracker_feature_trifocal_trifocal->min_features_for_keyframe = 5; + params_tracker_feature_trifocal_trifocal->yaml_file_params_vision_utils = wolf_root + "/src/examples/vision_utils_active_search.yaml"; - proc_trifocal = std::make_shared<ProcessorTrackerFeatureTrifocal>(*params_trifocal); - camera->addProcessor(proc_trifocal); + ProcessorBasePtr proc = problem->installProcessor("TRACKER FEATURE TRIFOCAL", "trifocal", camera, params_tracker_feature_trifocal_trifocal); + proc_trifocal = std::static_pointer_cast<ProcessorTrackerFeatureTrifocal>(proc); // Add three viewpoints with frame, capture and feature Vector2s pix(0,0); @@ -346,10 +339,19 @@ TEST_F(ConstraintAutodiffTrifocalTest, solve_F1) Vector3s res; - c123->operator ()(F1->getPPtr()->getPtr(), F1->getOPtr()->getPtr(), - F2->getPPtr()->getPtr(), F2->getOPtr()->getPtr(), - F3->getPPtr()->getPtr(), F3->getOPtr()->getPtr(), - S ->getPPtr()->getPtr(), S ->getOPtr()->getPtr(), + Eigen::VectorXs F1_p = F1->getPPtr()->getState(); + Eigen::VectorXs F1_o = F1->getOPtr()->getState(); + Eigen::VectorXs F2_p = F2->getPPtr()->getState(); + Eigen::VectorXs F2_o = F2->getOPtr()->getState(); + Eigen::VectorXs F3_p = F3->getPPtr()->getState(); + Eigen::VectorXs F3_o = F3->getOPtr()->getState(); + Eigen::VectorXs S_p = S ->getPPtr()->getState(); + Eigen::VectorXs S_o = S ->getOPtr()->getState(); + + c123->operator ()(F1_p.data(), F1_o.data(), + F2_p.data(), F2_o.data(), + F3_p.data(), F3_o.data(), + S_p. data(), S_o. data(), res.data()); WOLF_DEBUG("Initial state: ", F1->getState().transpose()); @@ -362,10 +364,13 @@ TEST_F(ConstraintAutodiffTrifocalTest, solve_F1) pose_perturbated.segment(3,4).normalize(); F1->setState(pose_perturbated); - c123->operator ()(F1->getPPtr()->getPtr(), F1->getOPtr()->getPtr(), - F2->getPPtr()->getPtr(), F2->getOPtr()->getPtr(), - F3->getPPtr()->getPtr(), F3->getOPtr()->getPtr(), - S ->getPPtr()->getPtr(), S ->getOPtr()->getPtr(), + F1_p = F1->getPPtr()->getState(); + F1_o = F1->getOPtr()->getState(); + + c123->operator ()(F1_p.data(), F1_o.data(), + F2_p.data(), F2_o.data(), + F3_p.data(), F3_o.data(), + S_p. data(), S_o. data(), res.data()); WOLF_DEBUG("perturbed state: ", pose_perturbated.transpose()); @@ -378,12 +383,21 @@ TEST_F(ConstraintAutodiffTrifocalTest, solve_F1) F2->fix(); F3->fix(); - std::string report = ceres_manager->solve(1); - - c123->operator ()(F1->getPPtr()->getPtr(), F1->getOPtr()->getPtr(), - F2->getPPtr()->getPtr(), F2->getOPtr()->getPtr(), - F3->getPPtr()->getPtr(), F3->getOPtr()->getPtr(), - S ->getPPtr()->getPtr(), S ->getOPtr()->getPtr(), + std::string report = ceres_manager->solve(SolverManager::ReportVerbosity::BRIEF); + + F1_p = F1->getPPtr()->getState(); + F1_o = F1->getOPtr()->getState(); + F2_p = F2->getPPtr()->getState(); + F2_o = F2->getOPtr()->getState(); + F3_p = F3->getPPtr()->getState(); + F3_o = F3->getOPtr()->getState(); + S_p = S ->getPPtr()->getState(); + S_o = S ->getOPtr()->getState(); + + c123->operator ()(F1_p.data(), F1_o.data(), + F2_p.data(), F2_o.data(), + F3_p.data(), F3_o.data(), + S_p. data(), S_o. data(), res.data()); WOLF_DEBUG("solved state: ", F1->getState().transpose()); @@ -407,10 +421,19 @@ TEST_F(ConstraintAutodiffTrifocalTest, solve_F2) Vector3s res; - c123->operator ()(F1->getPPtr()->getPtr(), F1->getOPtr()->getPtr(), - F2->getPPtr()->getPtr(), F2->getOPtr()->getPtr(), - F3->getPPtr()->getPtr(), F3->getOPtr()->getPtr(), - S ->getPPtr()->getPtr(), S ->getOPtr()->getPtr(), + Eigen::VectorXs F1_p = F1->getPPtr()->getState(); + Eigen::VectorXs F1_o = F1->getOPtr()->getState(); + Eigen::VectorXs F2_p = F2->getPPtr()->getState(); + Eigen::VectorXs F2_o = F2->getOPtr()->getState(); + Eigen::VectorXs F3_p = F3->getPPtr()->getState(); + Eigen::VectorXs F3_o = F3->getOPtr()->getState(); + Eigen::VectorXs S_p = S ->getPPtr()->getState(); + Eigen::VectorXs S_o = S ->getOPtr()->getState(); + + c123->operator ()(F1_p.data(), F1_o.data(), + F2_p.data(), F2_o.data(), + F3_p.data(), F3_o.data(), + S_p. data(), S_o. data(), res.data()); WOLF_DEBUG("Initial state: ", F2->getState().transpose()); @@ -423,10 +446,13 @@ TEST_F(ConstraintAutodiffTrifocalTest, solve_F2) pose_perturbated.segment(3,4).normalize(); F2->setState(pose_perturbated); - c123->operator ()(F1->getPPtr()->getPtr(), F1->getOPtr()->getPtr(), - F2->getPPtr()->getPtr(), F2->getOPtr()->getPtr(), - F3->getPPtr()->getPtr(), F3->getOPtr()->getPtr(), - S ->getPPtr()->getPtr(), S ->getOPtr()->getPtr(), + F2_p = F2->getPPtr()->getState(); + F2_o = F2->getOPtr()->getState(); + + c123->operator ()(F1_p.data(), F1_o.data(), + F2_p.data(), F2_o.data(), + F3_p.data(), F3_o.data(), + S_p. data(), S_o. data(), res.data()); WOLF_DEBUG("perturbed state: ", pose_perturbated.transpose()); @@ -439,12 +465,21 @@ TEST_F(ConstraintAutodiffTrifocalTest, solve_F2) F2->unfix(); F3->fix(); - std::string report = ceres_manager->solve(1); - - c123->operator ()(F1->getPPtr()->getPtr(), F1->getOPtr()->getPtr(), - F2->getPPtr()->getPtr(), F2->getOPtr()->getPtr(), - F3->getPPtr()->getPtr(), F3->getOPtr()->getPtr(), - S ->getPPtr()->getPtr(), S ->getOPtr()->getPtr(), + std::string report = ceres_manager->solve(SolverManager::ReportVerbosity::BRIEF); + + F1_p = F1->getPPtr()->getState(); + F1_o = F1->getOPtr()->getState(); + F2_p = F2->getPPtr()->getState(); + F2_o = F2->getOPtr()->getState(); + F3_p = F3->getPPtr()->getState(); + F3_o = F3->getOPtr()->getState(); + S_p = S ->getPPtr()->getState(); + S_o = S ->getOPtr()->getState(); + + c123->operator ()(F1_p.data(), F1_o.data(), + F2_p.data(), F2_o.data(), + F3_p.data(), F3_o.data(), + S_p. data(), S_o. data(), res.data()); WOLF_DEBUG("solved state: ", F2->getState().transpose()); @@ -468,10 +503,19 @@ TEST_F(ConstraintAutodiffTrifocalTest, solve_F3) Vector3s res; - c123->operator ()(F1->getPPtr()->getPtr(), F1->getOPtr()->getPtr(), - F2->getPPtr()->getPtr(), F2->getOPtr()->getPtr(), - F3->getPPtr()->getPtr(), F3->getOPtr()->getPtr(), - S ->getPPtr()->getPtr(), S ->getOPtr()->getPtr(), + Eigen::VectorXs F1_p = F1->getPPtr()->getState(); + Eigen::VectorXs F1_o = F1->getOPtr()->getState(); + Eigen::VectorXs F2_p = F2->getPPtr()->getState(); + Eigen::VectorXs F2_o = F2->getOPtr()->getState(); + Eigen::VectorXs F3_p = F3->getPPtr()->getState(); + Eigen::VectorXs F3_o = F3->getOPtr()->getState(); + Eigen::VectorXs S_p = S ->getPPtr()->getState(); + Eigen::VectorXs S_o = S ->getOPtr()->getState(); + + c123->operator ()(F1_p.data(), F1_o.data(), + F2_p.data(), F2_o.data(), + F3_p.data(), F3_o.data(), + S_p. data(), S_o. data(), res.data()); WOLF_DEBUG("Initial state: ", F3->getState().transpose()); @@ -484,10 +528,13 @@ TEST_F(ConstraintAutodiffTrifocalTest, solve_F3) pose_perturbated.segment(3,4).normalize(); F3->setState(pose_perturbated); - c123->operator ()(F1->getPPtr()->getPtr(), F1->getOPtr()->getPtr(), - F2->getPPtr()->getPtr(), F2->getOPtr()->getPtr(), - F3->getPPtr()->getPtr(), F3->getOPtr()->getPtr(), - S ->getPPtr()->getPtr(), S ->getOPtr()->getPtr(), + F3_p = F3->getPPtr()->getState(); + F3_o = F3->getOPtr()->getState(); + + c123->operator ()(F1_p.data(), F1_o.data(), + F2_p.data(), F2_o.data(), + F3_p.data(), F3_o.data(), + S_p. data(), S_o. data(), res.data()); WOLF_DEBUG("perturbed state: ", pose_perturbated.transpose()); @@ -501,12 +548,21 @@ TEST_F(ConstraintAutodiffTrifocalTest, solve_F3) F2->fix(); F3->unfix(); - std::string report = ceres_manager->solve(1); - - c123->operator ()(F1->getPPtr()->getPtr(), F1->getOPtr()->getPtr(), - F2->getPPtr()->getPtr(), F2->getOPtr()->getPtr(), - F3->getPPtr()->getPtr(), F3->getOPtr()->getPtr(), - S ->getPPtr()->getPtr(), S ->getOPtr()->getPtr(), + std::string report = ceres_manager->solve(SolverManager::ReportVerbosity::BRIEF); + + F1_p = F1->getPPtr()->getState(); + F1_o = F1->getOPtr()->getState(); + F2_p = F2->getPPtr()->getState(); + F2_o = F2->getOPtr()->getState(); + F3_p = F3->getPPtr()->getState(); + F3_o = F3->getOPtr()->getState(); + S_p = S ->getPPtr()->getState(); + S_o = S ->getOPtr()->getState(); + + c123->operator ()(F1_p.data(), F1_o.data(), + F2_p.data(), F2_o.data(), + F3_p.data(), F3_o.data(), + S_p. data(), S_o. data(), res.data()); WOLF_DEBUG("solved state: ", F3->getState().transpose()); @@ -530,10 +586,19 @@ TEST_F(ConstraintAutodiffTrifocalTest, solve_S) Vector3s res; - c123->operator ()(F1->getPPtr()->getPtr(), F1->getOPtr()->getPtr(), - F2->getPPtr()->getPtr(), F2->getOPtr()->getPtr(), - F3->getPPtr()->getPtr(), F3->getOPtr()->getPtr(), - S ->getPPtr()->getPtr(), S ->getOPtr()->getPtr(), + Eigen::VectorXs F1_p = F1->getPPtr()->getState(); + Eigen::VectorXs F1_o = F1->getOPtr()->getState(); + Eigen::VectorXs F2_p = F2->getPPtr()->getState(); + Eigen::VectorXs F2_o = F2->getOPtr()->getState(); + Eigen::VectorXs F3_p = F3->getPPtr()->getState(); + Eigen::VectorXs F3_o = F3->getOPtr()->getState(); + Eigen::VectorXs S_p = S ->getPPtr()->getState(); + Eigen::VectorXs S_o = S ->getOPtr()->getState(); + + c123->operator ()(F1_p.data(), F1_o.data(), + F2_p.data(), F2_o.data(), + F3_p.data(), F3_o.data(), + S_p. data(), S_o. data(), res.data()); WOLF_DEBUG("Initial state: ", S->getPPtr()->getState().transpose(), " ", S->getOPtr()->getState().transpose()); @@ -549,10 +614,13 @@ TEST_F(ConstraintAutodiffTrifocalTest, solve_S) S->getPPtr()->setState(pos_perturbated); S->getOPtr()->setState(ori_perturbated); - c123->operator ()(F1->getPPtr()->getPtr(), F1->getOPtr()->getPtr(), - F2->getPPtr()->getPtr(), F2->getOPtr()->getPtr(), - F3->getPPtr()->getPtr(), F3->getOPtr()->getPtr(), - S ->getPPtr()->getPtr(), S ->getOPtr()->getPtr(), + S_p = S->getPPtr()->getState(); + S_o = S->getOPtr()->getState(); + + c123->operator ()(F1_p.data(), F1_o.data(), + F2_p.data(), F2_o.data(), + F3_p.data(), F3_o.data(), + S_p. data(), S_o. data(), res.data()); WOLF_DEBUG("perturbed state: ", pose_perturbated.transpose()); @@ -565,12 +633,21 @@ TEST_F(ConstraintAutodiffTrifocalTest, solve_S) F2->fix(); F3->fix(); - std::string report = ceres_manager->solve(1); - - c123->operator ()(F1->getPPtr()->getPtr(), F1->getOPtr()->getPtr(), - F2->getPPtr()->getPtr(), F2->getOPtr()->getPtr(), - F3->getPPtr()->getPtr(), F3->getOPtr()->getPtr(), - S ->getPPtr()->getPtr(), S ->getOPtr()->getPtr(), + std::string report = ceres_manager->solve(SolverManager::ReportVerbosity::BRIEF); + + F1_p = F1->getPPtr()->getState(); + F1_o = F1->getOPtr()->getState(); + F2_p = F2->getPPtr()->getState(); + F2_o = F2->getOPtr()->getState(); + F3_p = F3->getPPtr()->getState(); + F3_o = F3->getOPtr()->getState(); + S_p = S ->getPPtr()->getState(); + S_o = S ->getOPtr()->getState(); + + c123->operator ()(F1_p.data(), F1_o.data(), + F2_p.data(), F2_o.data(), + F3_p.data(), F3_o.data(), + S_p. data(), S_o. data(), res.data()); WOLF_DEBUG("solved state: ", S->getPPtr()->getState().transpose(), " ", S->getOPtr()->getState().transpose()); @@ -676,7 +753,7 @@ TEST_F(ConstraintAutodiffTrifocalMultiPointTest, solve_multi_point) F3->getPPtr()->setState( pos3 + 0.2*Vector3s::Random()); F3->getOPtr()->setState((vquat3 + 0.2*Vector4s::Random()).normalized()); - std::string report = ceres_manager->solve(1); + std::string report = ceres_manager->solve(SolverManager::ReportVerbosity::BRIEF); // Print results WOLF_DEBUG("report: ", report); @@ -688,14 +765,23 @@ TEST_F(ConstraintAutodiffTrifocalMultiPointTest, solve_multi_point) ASSERT_MATRIX_APPROX(F3->getPPtr()->getState(), pos3 , 1e-10); ASSERT_MATRIX_APPROX(F3->getOPtr()->getState(), vquat3, 1e-10); + Eigen::VectorXs F1_p = F1->getPPtr()->getState(); + Eigen::VectorXs F1_o = F1->getOPtr()->getState(); + Eigen::VectorXs F2_p = F2->getPPtr()->getState(); + Eigen::VectorXs F2_o = F2->getOPtr()->getState(); + Eigen::VectorXs F3_p = F3->getPPtr()->getState(); + Eigen::VectorXs F3_o = F3->getOPtr()->getState(); + Eigen::VectorXs S_p = S ->getPPtr()->getState(); + Eigen::VectorXs S_o = S ->getOPtr()->getState(); + // evaluate residuals Vector3s res; for (size_t i=0; i<cv123.size(); i++) { - cv123.at(i)->operator ()(F1->getPPtr()->getPtr(), F1->getOPtr()->getPtr(), - F2->getPPtr()->getPtr(), F2->getOPtr()->getPtr(), - F3->getPPtr()->getPtr(), F3->getOPtr()->getPtr(), - S ->getPPtr()->getPtr(), S ->getOPtr()->getPtr(), + cv123.at(i)->operator ()(F1_p.data(), F1_o.data(), + F2_p.data(), F2_o.data(), + F3_p.data(), F3_o.data(), + S_p. data(), S_o. data(), res.data()); ASSERT_MATRIX_APPROX(res, Vector3s::Zero(), 1e-10); @@ -733,7 +819,7 @@ TEST_F(ConstraintAutodiffTrifocalMultiPointTest, solve_multi_point_scale) F3->getPPtr()->setState( 2 * pos3 + 0.2*Vector3s::Random()); F3->getOPtr()->setState(( vquat3 + 0.2*Vector4s::Random()).normalized()); - std::string report = ceres_manager->solve(1); + std::string report = ceres_manager->solve(SolverManager::ReportVerbosity::BRIEF); // Print results WOLF_DEBUG("report: ", report); @@ -745,14 +831,23 @@ TEST_F(ConstraintAutodiffTrifocalMultiPointTest, solve_multi_point_scale) ASSERT_MATRIX_APPROX(F3->getPPtr()->getState(), 2 * pos3, 1e-8); ASSERT_MATRIX_APPROX(F3->getOPtr()->getState(), vquat3, 1e-8); + Eigen::VectorXs F1_p = F1->getPPtr()->getState(); + Eigen::VectorXs F1_o = F1->getOPtr()->getState(); + Eigen::VectorXs F2_p = F2->getPPtr()->getState(); + Eigen::VectorXs F2_o = F2->getOPtr()->getState(); + Eigen::VectorXs F3_p = F3->getPPtr()->getState(); + Eigen::VectorXs F3_o = F3->getOPtr()->getState(); + Eigen::VectorXs S_p = S ->getPPtr()->getState(); + Eigen::VectorXs S_o = S ->getOPtr()->getState(); + // evaluate residuals Vector3s res; for (size_t i=0; i<cv123.size(); i++) { - cv123.at(i)->operator ()(F1->getPPtr()->getPtr(), F1->getOPtr()->getPtr(), - F2->getPPtr()->getPtr(), F2->getOPtr()->getPtr(), - F3->getPPtr()->getPtr(), F3->getOPtr()->getPtr(), - S ->getPPtr()->getPtr(), S ->getOPtr()->getPtr(), + cv123.at(i)->operator ()(F1_p.data(), F1_o.data(), + F2_p.data(), F2_o.data(), + F3_p.data(), F3_o.data(), + S_p. data(), S_o. data(), res.data()); ASSERT_MATRIX_APPROX(res, Vector3s::Zero(), 1e-8); @@ -804,13 +899,13 @@ TEST_F(ConstraintAutodiffTrifocalMultiPointTest, solve_multi_point_distance) F1->addConstrainedBy(cd); cd->setStatus(CTR_INACTIVE); - std::string report = ceres_manager->solve(1); + std::string report = ceres_manager->solve(SolverManager::ReportVerbosity::BRIEF); WOLF_DEBUG("DISTANCE CONSTRAINT INACTIVE: \n", report); problem->print(1,0,1,0); cd->setStatus(CTR_ACTIVE); - report = ceres_manager->solve(1); + report = ceres_manager->solve(SolverManager::ReportVerbosity::BRIEF); // Print results WOLF_DEBUG("DISTANCE CONSTRAINT ACTIVE: \n", report); @@ -822,15 +917,23 @@ TEST_F(ConstraintAutodiffTrifocalMultiPointTest, solve_multi_point_distance) ASSERT_MATRIX_APPROX(F3->getPPtr()->getState(), pos3 , 1e-8); ASSERT_MATRIX_APPROX(F3->getOPtr()->getState(), vquat3, 1e-8); + Eigen::VectorXs F1_p = F1->getPPtr()->getState(); + Eigen::VectorXs F1_o = F1->getOPtr()->getState(); + Eigen::VectorXs F2_p = F2->getPPtr()->getState(); + Eigen::VectorXs F2_o = F2->getOPtr()->getState(); + Eigen::VectorXs F3_p = F3->getPPtr()->getState(); + Eigen::VectorXs F3_o = F3->getOPtr()->getState(); + Eigen::VectorXs S_p = S ->getPPtr()->getState(); + Eigen::VectorXs S_o = S ->getOPtr()->getState(); // evaluate residuals Vector3s res; for (size_t i=0; i<cv123.size(); i++) { - cv123.at(i)->operator ()(F1->getPPtr()->getPtr(), F1->getOPtr()->getPtr(), - F2->getPPtr()->getPtr(), F2->getOPtr()->getPtr(), - F3->getPPtr()->getPtr(), F3->getOPtr()->getPtr(), - S ->getPPtr()->getPtr(), S ->getOPtr()->getPtr(), + cv123.at(i)->operator ()(F1_p.data(), F1_o.data(), + F2_p.data(), F2_o.data(), + F3_p.data(), F3_o.data(), + S_p. data(), S_o. data(), res.data()); ASSERT_MATRIX_APPROX(res, Vector3s::Zero(), 1e-8); diff --git a/src/test/gtest_constraint_odom_3D.cpp b/src/test/gtest_constraint_odom_3D.cpp index f3b9e0cca1770a6b06d6f2a51c408d54d982a69b..68408277551644f6e04abd3a1bb3894ef0bb57af 100644 --- a/src/test/gtest_constraint_odom_3D.cpp +++ b/src/test/gtest_constraint_odom_3D.cpp @@ -43,7 +43,7 @@ FrameBasePtr frm0 = problem->emplaceFrame(KEY_FRAME, problem->zeroState(), TimeS FrameBasePtr frm1 = problem->emplaceFrame(KEY_FRAME, delta, TimeStamp(1)); // Capture, feature and constraint from frm1 to frm0 -CaptureBasePtr cap1 = frm1->addCapture(std::make_shared<CaptureMotion>(1, nullptr, delta, 7, 6, nullptr)); +CaptureBasePtr cap1 = frm1->addCapture(std::make_shared<CaptureMotion>("ODOM 3D", 1, nullptr, delta, 7, 6, nullptr)); FeatureBasePtr fea1 = cap1->addFeature(std::make_shared<FeatureBase>("ODOM 3D", delta, data_cov)); ConstraintOdom3DPtr ctr1 = std::static_pointer_cast<ConstraintOdom3D>(fea1->addConstraint(std::make_shared<ConstraintOdom3D>(fea1, frm0, nullptr))); // create and add ConstraintBasePtr dummy = frm0->addConstrainedBy(ctr1); diff --git a/src/test/gtest_constraint_pose_2D.cpp b/src/test/gtest_constraint_pose_2D.cpp index c98de12b0f2dd05628ff905b8877e40daa80ba16..dd95c82d83a69a9e979e1dc3f5f5f26f9d6ea0cc 100644 --- a/src/test/gtest_constraint_pose_2D.cpp +++ b/src/test/gtest_constraint_pose_2D.cpp @@ -35,7 +35,7 @@ CeresManager ceres_mgr(problem); FrameBasePtr frm0 = problem->emplaceFrame(KEY_FRAME, problem->zeroState(), TimeStamp(0)); // Capture, feature and constraint from frm1 to frm0 -CaptureBasePtr cap0 = frm0->addCapture(std::make_shared<CaptureMotion>(0, nullptr, pose, 3, 3, nullptr)); +CaptureBasePtr cap0 = frm0->addCapture(std::make_shared<CaptureMotion>("ODOM 2D", 0, nullptr, pose, 3, 3, nullptr)); FeatureBasePtr fea0 = cap0->addFeature(std::make_shared<FeatureBase>("ODOM 2D", pose, data_cov)); ConstraintPose2DPtr ctr0 = std::static_pointer_cast<ConstraintPose2D>(fea0->addConstraint(std::make_shared<ConstraintPose2D>(fea0))); diff --git a/src/test/gtest_constraint_pose_3D.cpp b/src/test/gtest_constraint_pose_3D.cpp index 77604701ad57fc9851169a599822d10e6beb7c77..48fbedebd3b2a9a1f2932d8b18ef0979552d3ce3 100644 --- a/src/test/gtest_constraint_pose_3D.cpp +++ b/src/test/gtest_constraint_pose_3D.cpp @@ -42,7 +42,7 @@ CeresManager ceres_mgr(problem); FrameBasePtr frm0 = problem->emplaceFrame(KEY_FRAME, problem->zeroState(), TimeStamp(0)); // Capture, feature and constraint -CaptureBasePtr cap0 = frm0->addCapture(std::make_shared<CaptureMotion>(0, nullptr, pose7, 7, 6, nullptr)); +CaptureBasePtr cap0 = frm0->addCapture(std::make_shared<CaptureMotion>("ODOM 3D", 0, nullptr, pose7, 7, 6, nullptr)); FeatureBasePtr fea0 = cap0->addFeature(std::make_shared<FeatureBase>("ODOM 3D", pose7, data_cov)); ConstraintPose3DPtr ctr0 = std::static_pointer_cast<ConstraintPose3D>(fea0->addConstraint(std::make_shared<ConstraintPose3D>(fea0))); diff --git a/src/test/gtest_feature_IMU.cpp b/src/test/gtest_feature_IMU.cpp index 9f7e9c444d28dbc28efa29d8a7c01806731a9f26..b01de0dda778aa917c9b528aa1a880b0e4a1bfce 100644 --- a/src/test/gtest_feature_IMU.cpp +++ b/src/test/gtest_feature_IMU.cpp @@ -40,6 +40,10 @@ class FeatureIMU_test : public testing::Test IntrinsicsIMUPtr sen_imu_params = std::make_shared<IntrinsicsIMU>(); SensorBasePtr sensor_ptr = problem->installSensor("IMU", "Main IMU", IMU_extrinsics, sen_imu_params); ProcessorParamsIMUPtr prc_imu_params = std::make_shared<ProcessorParamsIMU>(); + prc_imu_params->max_time_span = 0.5; + prc_imu_params->max_buff_length = 10; + prc_imu_params->dist_traveled = 5; + prc_imu_params->angle_turned = 0.5; processor_ptr_ = problem->installProcessor("IMU", "IMU pre-integrator", sensor_ptr, prc_imu_params); // Time and data variables diff --git a/src/test/gtest_frame_base.cpp b/src/test/gtest_frame_base.cpp index 96d9edc8490face675cedfe654d18328ab1b579f..cc8e029033d1d8c331458aaeb0765401228dd3f1 100644 --- a/src/test/gtest_frame_base.cpp +++ b/src/test/gtest_frame_base.cpp @@ -73,10 +73,10 @@ TEST(FrameBase, LinksToTree) T->addFrame(F1); FrameBasePtr F2 = make_shared<FrameBase>(1, make_shared<StateBlock>(2), make_shared<StateBlock>(1)); T->addFrame(F2); - CaptureMotionPtr C = make_shared<CaptureMotion>(1, S, Vector3s::Zero(), 3, 3, nullptr); + CaptureMotionPtr C = make_shared<CaptureMotion>("MOTION", 1, S, Vector3s::Zero(), 3, 3, nullptr); F1->addCapture(C); /// @todo link sensor & proccessor - ProcessorBasePtr p = std::make_shared<ProcessorOdom2D>(); + ProcessorBasePtr p = std::make_shared<ProcessorOdom2D>(make_shared<ProcessorParamsOdom2D>()); FeatureBasePtr f = make_shared<FeatureBase>("f", Vector1s(1), Matrix<Scalar,1,1>::Identity()*.01); C->addFeature(f); ConstraintOdom2DPtr c = make_shared<ConstraintOdom2D>(f, F2, p); diff --git a/src/test/gtest_odom_2D.cpp b/src/test/gtest_odom_2D.cpp index b8bb7388cad12f319a37e053d747df66ce0b63a5..2f3da744717fa0c9a8d99e6d163a09f0a16ea77c 100644 --- a/src/test/gtest_odom_2D.cpp +++ b/src/test/gtest_odom_2D.cpp @@ -193,12 +193,13 @@ TEST(Odom2D, VoteForKfAndSolve) ProblemPtr problem = Problem::create("PO 2D"); SensorBasePtr sensor_odom2d = problem->installSensor("ODOM 2D", "odom", Vector3s(0,0,0)); ProcessorParamsOdom2DPtr params(std::make_shared<ProcessorParamsOdom2D>()); - params->dist_traveled_th_ = 100; - params->theta_traveled_th_ = 6.28; - params->elapsed_time_th_ = 2.5*dt; // force KF at every third process() - params->cov_det_th_ = 100; - params->unmeasured_perturbation_std_ = 0.001; - Matrix3s unmeasured_cov = params->unmeasured_perturbation_std_*params->unmeasured_perturbation_std_*Matrix3s::Identity(); + params->voting_active = true; + params->dist_traveled = 100; + params->angle_turned = 6.28; + params->max_time_span = 2.5*dt; // force KF at every third process() + params->cov_det = 100; + params->unmeasured_perturbation_std = 0.00; + Matrix3s unmeasured_cov = params->unmeasured_perturbation_std*params->unmeasured_perturbation_std*Matrix3s::Identity(); ProcessorBasePtr prc_base = problem->installProcessor("ODOM 2D", "odom", sensor_odom2d, params); ProcessorOdom2DPtr processor_odom2d = std::static_pointer_cast<ProcessorOdom2D>(prc_base); @@ -262,6 +263,10 @@ TEST(Odom2D, VoteForKfAndSolve) integrated_delta_cov = Jx * integrated_delta_cov * Jx.transpose() + Ju * data_cov * Ju.transpose() + unmeasured_cov; } + WOLF_DEBUG("n: ", n, " t:", t); + WOLF_DEBUG("wolf delta: ", processor_odom2d->getMotion().delta_integr_.transpose()); + WOLF_DEBUG("test delta: ", integrated_delta .transpose()); + ASSERT_POSE2D_APPROX(processor_odom2d->getMotion().delta_integr_, integrated_delta, 1e-6); ASSERT_MATRIX_APPROX(odom2d_delta_cov, integrated_delta_cov, 1e-6); @@ -314,12 +319,12 @@ TEST(Odom2D, KF_callback) ProblemPtr problem = Problem::create("PO 2D"); SensorBasePtr sensor_odom2d = problem->installSensor("ODOM 2D", "odom", Vector3s(0,0,0)); ProcessorParamsOdom2DPtr params(std::make_shared<ProcessorParamsOdom2D>()); - params->dist_traveled_th_ = 100; - params->theta_traveled_th_ = 6.28; - params->elapsed_time_th_ = 100; - params->cov_det_th_ = 100; - params->unmeasured_perturbation_std_ = 0.001; - Matrix3s unmeasured_cov = params->unmeasured_perturbation_std_*params->unmeasured_perturbation_std_*Matrix3s::Identity(); + params->dist_traveled = 100; + params->angle_turned = 6.28; + params->max_time_span = 100; + params->cov_det = 100; + params->unmeasured_perturbation_std = 0.001; + Matrix3s unmeasured_cov = params->unmeasured_perturbation_std*params->unmeasured_perturbation_std*Matrix3s::Identity(); ProcessorBasePtr prc_base = problem->installProcessor("ODOM 2D", "odom", sensor_odom2d, params); ProcessorOdom2DPtr processor_odom2d = std::static_pointer_cast<ProcessorOdom2D>(prc_base); processor_odom2d->setTimeTolerance(dt/2); @@ -347,7 +352,7 @@ TEST(Odom2D, KF_callback) // std::cout << "\nIntegrating data..." << std::endl; // Capture to use as container for all incoming data - CaptureMotionPtr capture = std::make_shared<CaptureMotion>(t, sensor_odom2d, data, data_cov, 3, 3, nullptr); + CaptureMotionPtr capture = std::make_shared<CaptureMotion>("ODOM 2D", t, sensor_odom2d, data, data_cov, 3, 3, nullptr); for (int n=1; n<=N; n++) { diff --git a/src/test/gtest_odom_3D.cpp b/src/test/gtest_odom_3D.cpp index 06dac12a7e45639a059a815f920d728b535aa07a..bc36ac8457f36b9747ff16e46e89bdc5e8e6f8cc 100644 --- a/src/test/gtest_odom_3D.cpp +++ b/src/test/gtest_odom_3D.cpp @@ -60,7 +60,7 @@ class ProcessorOdom3DTest : public ProcessorOdom3D Scalar& dvar_min() {return min_disp_var_;} Scalar& rvar_min() {return min_rot_var_;} }; -ProcessorOdom3DTest::ProcessorOdom3DTest() : ProcessorOdom3D() +ProcessorOdom3DTest::ProcessorOdom3DTest() : ProcessorOdom3D(std::make_shared<ProcessorParamsOdom3D>()) { dvar_min() = 0.5; rvar_min() = 0.25; @@ -165,7 +165,7 @@ TEST(ProcessorOdom3D, Interpolate0) // basic test * fin D = id */ - ProcessorOdom3D prc; + ProcessorOdom3D prc(std::make_shared<ProcessorParamsOdom3D>()); Motion ref(0.0,6,7,6,0), final(0.0,6,7,6,0), interpolated(0.0,6,7,6,0); @@ -205,7 +205,7 @@ TEST(ProcessorOdom3D, Interpolate0) // basic test TEST(ProcessorOdom3D, Interpolate1) // delta algebra test { - ProcessorOdom3D prc; + ProcessorOdom3D prc(std::make_shared<ProcessorParamsOdom3D>()); /* * We create several poses: origin, ref, int, second, final, as follows: @@ -375,7 +375,7 @@ TEST(ProcessorOdom3D, Interpolate1) // delta algebra test TEST(ProcessorOdom3D, Interpolate2) // timestamp out of bounds test { - ProcessorOdom3D prc; + ProcessorOdom3D prc(std::make_shared<ProcessorParamsOdom3D>()); /* * We create several poses: origin, ref, int, second, final, as follows: diff --git a/src/test/gtest_problem.cpp b/src/test/gtest_problem.cpp index 420e9b271a16e70c41bd72df083f9ae6137cf5eb..2852598e3ba3d4b082b577e6a9f148e46cc86087 100644 --- a/src/test/gtest_problem.cpp +++ b/src/test/gtest_problem.cpp @@ -58,7 +58,7 @@ TEST(Problem, Processor) P->addSensor(Sm); // add motion processor - ProcessorMotionPtr Pm = std::make_shared<ProcessorOdom3D>(); + ProcessorMotionPtr Pm = std::make_shared<ProcessorOdom3D>(std::make_shared<ProcessorParamsOdom3D>()); Sm->addProcessor(Pm); // check motion processor IS NOT set by addSensor <-- using InstallProcessor it should, see test Installers @@ -79,7 +79,11 @@ TEST(Problem, Installers) SensorBasePtr S = P->installSensor ("ODOM 3D", "odometer", xs, wolf_root + "/src/examples/sensor_odom_3D.yaml"); // install processor tracker (dummy installation under an Odometry sensor -- it's OK for this test) - ProcessorBasePtr pt = std::make_shared<ProcessorTrackerFeatureDummy>(0.1, 5, 10); + ProcessorParamsTrackerFeaturePtr params = std::make_shared<ProcessorParamsTrackerFeature>(); + params->time_tolerance = 0.1; + params->max_new_features = 5; + params->min_features_for_keyframe = 10; + ProcessorBasePtr pt = std::make_shared<ProcessorTrackerFeatureDummy>(ProcessorTrackerFeatureDummy(params)); S->addProcessor(pt); // check motion processor IS NOT set @@ -217,7 +221,12 @@ TEST(Problem, StateBlocks) ASSERT_EQ(P->getStateBlockList().size(), 2 + 3); ASSERT_EQ(P->getNotifiedStateBlockList().size(), 2 + 3); - ProcessorBasePtr pt = std::make_shared<ProcessorTrackerFeatureDummy>(0.1, 5, 10); + ProcessorParamsTrackerFeaturePtr params = std::make_shared<ProcessorParamsTrackerFeature>(); + params->time_tolerance = 0.1; + params->max_new_features = 5; + params->min_features_for_keyframe = 10; + ProcessorBasePtr pt = std::make_shared<ProcessorTrackerFeatureDummy>(ProcessorTrackerFeatureDummy(params)); + St->addProcessor(pt); ProcessorBasePtr pm = P->installProcessor("ODOM 3D", "odom integrator", "odometer", wolf_root + "/src/examples/processor_odom_3D.yaml"); @@ -246,7 +255,13 @@ TEST(Problem, Covariances) SensorBasePtr Sm = P->installSensor ("ODOM 3D", "odometer",xs, wolf_root + "/src/examples/sensor_odom_3D.yaml"); SensorBasePtr St = P->installSensor ("CAMERA", "camera", xs, wolf_root + "/src/examples/camera_params_ueye_sim.yaml"); - ProcessorBasePtr pt = std::make_shared<ProcessorTrackerFeatureDummy>(0.1, 5, 10); + + ProcessorParamsTrackerFeaturePtr params = std::make_shared<ProcessorParamsTrackerFeature>(); + params->time_tolerance = 0.1; + params->max_new_features = 5; + params->min_features_for_keyframe = 10; + ProcessorBasePtr pt = std::make_shared<ProcessorTrackerFeatureDummy>(ProcessorTrackerFeatureDummy(params)); + St->addProcessor(pt); ProcessorBasePtr pm = P->installProcessor("ODOM 3D", "odom integrator", "odometer", wolf_root + "/src/examples/processor_odom_3D.yaml"); diff --git a/src/test/gtest_processor_IMU.cpp b/src/test/gtest_processor_IMU.cpp index 38552b3334d5e0798f29aed417355e11d4ce94f7..b9751b42f939e5b6321f84134643273415145e40 100644 --- a/src/test/gtest_processor_IMU.cpp +++ b/src/test/gtest_processor_IMU.cpp @@ -51,7 +51,7 @@ class ProcessorIMUt : public testing::Test problem = Problem::create("POV 3D"); Vector7s extrinsics = (Vector7s() << 0,0,0, 0,0,0,1).finished(); sensor_ptr = problem->installSensor("IMU", "Main IMU", extrinsics, wolf_root + "/src/examples/sensor_imu.yaml"); - ProcessorBasePtr processor_ptr = problem->installProcessor("IMU", "IMU pre-integrator", "Main IMU", ""); + ProcessorBasePtr processor_ptr = problem->installProcessor("IMU", "IMU pre-integrator", "Main IMU", wolf_root + "/src/examples/processor_imu.yaml"); // Time and data variables data = Vector6s::Zero(); @@ -83,13 +83,6 @@ TEST(ProcessorIMU_constructors, ALL) { using namespace wolf; - //constructor without any argument - ProcessorIMUPtr prc0 = std::make_shared<ProcessorIMU>(); - ProcessorParamsIMU params_default; - ASSERT_EQ(prc0->getMaxTimeSpan(), params_default.max_time_span); - ASSERT_EQ(prc0->getMaxBuffLength(), params_default.max_buff_length); - ASSERT_EQ(prc0->getDistTraveled(), params_default.dist_traveled); - ASSERT_EQ(prc0->getAngleTurned(), params_default.angle_turned); //constructor with ProcessorIMUParamsPtr argument only ProcessorParamsIMUPtr param_ptr = std::make_shared<ProcessorParamsIMU>(); @@ -98,7 +91,7 @@ TEST(ProcessorIMU_constructors, ALL) param_ptr->dist_traveled = 2.0; param_ptr->angle_turned = 2.0; - ProcessorIMUPtr prc1 = std::make_shared<ProcessorIMU>(*param_ptr); + ProcessorIMUPtr prc1 = std::make_shared<ProcessorIMU>(param_ptr); ASSERT_EQ(prc1->getMaxTimeSpan(), param_ptr->max_time_span); ASSERT_EQ(prc1->getMaxBuffLength(), param_ptr->max_buff_length); ASSERT_EQ(prc1->getDistTraveled(), param_ptr->dist_traveled); @@ -110,6 +103,7 @@ TEST(ProcessorIMU_constructors, ALL) Vector7s extrinsics = (Vector7s()<<1,0,0, 0,0,0,1).finished(); SensorBasePtr sensor_ptr = problem->installSensor("IMU", "Main IMU", extrinsics, wolf_root + "/src/examples/sensor_imu.yaml"); ProcessorBasePtr processor_ptr = problem->installProcessor("IMU", "IMU pre-integrator", "Main IMU", ""); + ProcessorParamsIMU params_default; ASSERT_EQ(std::static_pointer_cast<ProcessorIMU>(processor_ptr)->getMaxTimeSpan(), params_default.max_time_span); ASSERT_EQ(std::static_pointer_cast<ProcessorIMU>(processor_ptr)->getMaxBuffLength(), params_default.max_buff_length); ASSERT_EQ(std::static_pointer_cast<ProcessorIMU>(processor_ptr)->getDistTraveled(), params_default.dist_traveled); @@ -238,9 +232,10 @@ TEST_F(ProcessorIMUt, interpolate) // problem->getProcessorMotionPtr()->getBuffer().print(0,1,1,0); -class P : wolf::ProcessorIMU +class P : public wolf::ProcessorIMU { public: + P() : ProcessorIMU(std::make_shared<ProcessorParamsIMU>()) {} Motion interp(const Motion& ref, Motion& sec, TimeStamp ts) { return ProcessorIMU::interpolate(ref, sec, ts); diff --git a/src/test/gtest_processor_base.cpp b/src/test/gtest_processor_base.cpp index 9738bff9e33a605891e4b24fb3cac75b6084bfd0..23baef7b289909e86555b96e160f8823910523f9 100644 --- a/src/test/gtest_processor_base.cpp +++ b/src/test/gtest_processor_base.cpp @@ -42,7 +42,12 @@ TEST(ProcessorBase, KeyFrameCallback) SensorBasePtr sens_trk = make_shared<SensorBase>("FEATURE", std::make_shared<StateBlock>(Eigen::VectorXs::Zero(2)), std::make_shared<StateBlock>(Eigen::VectorXs::Zero(1)), std::make_shared<StateBlock>(Eigen::VectorXs::Zero(2)), 2); - shared_ptr<ProcessorTrackerFeatureDummy> proc_trk = make_shared<ProcessorTrackerFeatureDummy>(dt/2, 5, 5); + + ProcessorParamsTrackerFeaturePtr params = std::make_shared<ProcessorParamsTrackerFeature>(); + params->time_tolerance = dt/2; + params->max_new_features = 5; + params->min_features_for_keyframe = 5; + shared_ptr<ProcessorTrackerFeatureDummy> proc_trk = make_shared<ProcessorTrackerFeatureDummy>(params); problem->addSensor(sens_trk); sens_trk->addProcessor(proc_trk); diff --git a/src/test/gtest_processor_frame_nearest_neighbor_filter_2D.cpp b/src/test/gtest_processor_frame_nearest_neighbor_filter_2D.cpp index 47c79e0f137b1e2911575b0c74b640fb03e3c896..f114f3d8d506405f6b7d76a58d1ac52de04a45da 100644 --- a/src/test/gtest_processor_frame_nearest_neighbor_filter_2D.cpp +++ b/src/test/gtest_processor_frame_nearest_neighbor_filter_2D.cpp @@ -18,7 +18,7 @@ // Dummy class so that it is no pur virtual struct DummyLoopCloser : public wolf::ProcessorFrameNearestNeighborFilter { - DummyLoopCloser(const Params& _params) : + DummyLoopCloser(ParamsPtr _params) : wolf::ProcessorFrameNearestNeighborFilter(_params) { } bool confirmLoopClosure() override { return false; } @@ -217,7 +217,7 @@ int main(int argc, char **argv) processor_params_point2d->buffer_size_ = 0; // just exclude identical frameIDs processor_params_point2d->distance_type_ = wolf::LoopclosureDistanceType::LC_POINT_ELLIPSE; - processor_ptr_point2d = std::make_shared<DummyLoopCloser>(*processor_params_point2d); + processor_ptr_point2d = std::make_shared<DummyLoopCloser>(processor_params_point2d); processor_ptr_point2d->setName("processor2Dpoint"); sensor_ptr->addProcessor(processor_ptr_point2d); @@ -226,7 +226,7 @@ int main(int argc, char **argv) processor_params_ellipse2d->buffer_size_ = 0; // just exclude identical frameIDs processor_params_ellipse2d->distance_type_ = wolf::LoopclosureDistanceType::LC_ELLIPSE_ELLIPSE; - processor_ptr_ellipse2d = std::make_shared<DummyLoopCloser>(*processor_params_ellipse2d); + processor_ptr_ellipse2d = std::make_shared<DummyLoopCloser>(processor_params_ellipse2d); processor_ptr_ellipse2d->setName("processor2Dellipse"); sensor_ptr->addProcessor(processor_ptr_ellipse2d); diff --git a/src/test/gtest_processor_motion.cpp b/src/test/gtest_processor_motion.cpp index 6cd5e06450c0a99ab691c27081db20cd28f92cbd..77d2a55186ae6084f54e6832c71bc88067edc081 100644 --- a/src/test/gtest_processor_motion.cpp +++ b/src/test/gtest_processor_motion.cpp @@ -29,19 +29,21 @@ class ProcessorMotion_test : public ProcessorOdom2D, public testing::Test{ Vector2s data; Matrix2s data_cov; + ProcessorMotion_test() : ProcessorOdom2D(std::make_shared<ProcessorParamsOdom2D>()) { } + virtual void SetUp() { dt = 1.0; problem = Problem::create("PO 2D"); ProcessorParamsOdom2DPtr params(std::make_shared<ProcessorParamsOdom2D>()); - params->dist_traveled_th_ = 100; - params->theta_traveled_th_ = 6.28; - params->elapsed_time_th_ = 2.5*dt; // force KF at every third process() - params->cov_det_th_ = 100; - params->unmeasured_perturbation_std_ = 0.001; + params->dist_traveled = 100; + params->angle_turned = 6.28; + params->max_time_span = 2.5*dt; // force KF at every third process() + params->cov_det = 100; + params->unmeasured_perturbation_std = 0.001; sensor = static_pointer_cast<SensorOdom2D>(problem->installSensor("ODOM 2D", "odom", Vector3s(0,0,0))); processor = static_pointer_cast<ProcessorOdom2D>(problem->installProcessor("ODOM 2D", "odom", sensor, params)); - capture = std::make_shared<CaptureMotion>(0.0, sensor, data, data_cov, 3, 3, nullptr); + capture = std::make_shared<CaptureMotion>("ODOM 2D", 0.0, sensor, data, data_cov, 3, 3, nullptr); Vector3s x0; x0 << 0, 0, 0; Matrix3s P0; P0.setIdentity(); diff --git a/src/test/gtest_processor_tracker_feature_trifocal.cpp b/src/test/gtest_processor_tracker_feature_trifocal.cpp index 669c61566da78b8d09e71e73299eab81f6430586..71a8e7f469ceee695ae6da01fd6743949895ff2e 100644 --- a/src/test/gtest_processor_tracker_feature_trifocal.cpp +++ b/src/test/gtest_processor_tracker_feature_trifocal.cpp @@ -3,7 +3,7 @@ #include "wolf.h" #include "logging.h" -#include "vision_utils/vision_utils.h" +#include "vision_utils.h" #include "processors/processor_tracker_feature_trifocal.h" #include "processor_odom_3D.h" @@ -12,7 +12,6 @@ using namespace Eigen; using namespace wolf; -using std::static_pointer_cast; // Use the following in case you want to initialize tests with predefines variables or methods. //class ProcessorTrackerFeatureTrifocal_class : public testing::Test{ @@ -23,7 +22,6 @@ using std::static_pointer_cast; //}; - //TEST(ProcessorTrackerFeatureTrifocal, Constructor) //{ // std::cout << "\033[1;33m [WARN]:\033[0m gtest for ProcessorTrackerFeatureTrifocal Constructor is empty." << std::endl; @@ -77,20 +75,26 @@ TEST(ProcessorTrackerFeatureTrifocal, KeyFrameCallback) ProblemPtr problem = Problem::create("PO 3D"); // Install tracker (sensor and processor) - IntrinsicsCameraPtr intr = std::make_shared<IntrinsicsCamera>(); // TODO init params or read from YAML + IntrinsicsCameraPtr intr = make_shared<IntrinsicsCamera>(); // TODO init params or read from YAML intr->width = 640; intr->height = 480; SensorCameraPtr sens_trk = make_shared<SensorCamera>((Eigen::Vector7s()<<0,0,0, 0,0,0,1).finished(), intr); - ProcessorParamsTrackerFeatureTrifocal params_trifocal; - params_trifocal.name = "trifocal"; - params_trifocal.time_tolerance = dt/2; - params_trifocal.max_new_features = 5; - params_trifocal.min_features_for_keyframe = 5; - params_trifocal.yaml_file_params_vision_utils = wolf_root + "/src/examples/ACTIVESEARCH.yaml"; - - ProcessorTrackerFeatureTrifocalPtr proc_trk = make_shared<ProcessorTrackerFeatureTrifocal>(params_trifocal); + ProcessorParamsTrackerFeatureTrifocalPtr params_tracker_feature_trifocal = std::make_shared<ProcessorParamsTrackerFeatureTrifocal>(); + params_tracker_feature_trifocal->name = "trifocal"; + params_tracker_feature_trifocal->pixel_noise_std = 1.0; + params_tracker_feature_trifocal->voting_active = true; + params_tracker_feature_trifocal->min_features_for_keyframe = 5; + params_tracker_feature_trifocal->time_tolerance = dt/2; + params_tracker_feature_trifocal->max_new_features = 5; + params_tracker_feature_trifocal->min_response_new_feature = 25; + params_tracker_feature_trifocal->n_cells_h = 10; + params_tracker_feature_trifocal->n_cells_v = 10; + params_tracker_feature_trifocal->max_euclidean_distance = 20; + params_tracker_feature_trifocal->yaml_file_params_vision_utils = wolf_root + "/src/examples/ACTIVESEARCH.yaml"; + + ProcessorTrackerFeatureTrifocalPtr proc_trk = make_shared<ProcessorTrackerFeatureTrifocal>(params_tracker_feature_trifocal); proc_trk->configure(sens_trk); problem->addSensor(sens_trk); @@ -116,7 +120,8 @@ TEST(ProcessorTrackerFeatureTrifocal, KeyFrameCallback) CaptureOdom3DPtr capt_odo = make_shared<CaptureOdom3D>(t, sens_odo, Vector6s::Zero(), P); // Track - cv::Mat image(640,480, CV_32F); + cv::Mat image(intr->height, intr->width, CV_8UC3); // OpenCV cv::Mat(rows, cols) + image *= 0; // TODO see if we want to use a real image CaptureImagePtr capt_trk = make_shared<CaptureImage>(t, sens_trk, image); proc_trk->process(capt_trk); diff --git a/src/test/processor_IMU_UnitTester.cpp b/src/test/processor_IMU_UnitTester.cpp index a37a50ece9b0084df96b0bd2f214289c33ff27e2..927b9dd91d15e14303ce21e6aa61bee5763d97d5 100644 --- a/src/test/processor_IMU_UnitTester.cpp +++ b/src/test/processor_IMU_UnitTester.cpp @@ -3,7 +3,7 @@ namespace wolf { ProcessorIMU_UnitTester::ProcessorIMU_UnitTester() : - ProcessorIMU(), + ProcessorIMU(std::make_shared<ProcessorParamsIMU>()), Dq_out_(nullptr) {} diff --git a/src/test/serialization/cereal/gtest_serialization_processor_odom2d_params.cpp b/src/test/serialization/cereal/gtest_serialization_processor_odom2d_params.cpp index 9ca83b3d32366ac7b84b048a2c5d80aa1a474564..89fbef3d69dff80688dd234b0cec3742233b9220 100644 --- a/src/test/serialization/cereal/gtest_serialization_processor_odom2d_params.cpp +++ b/src/test/serialization/cereal/gtest_serialization_processor_odom2d_params.cpp @@ -25,9 +25,9 @@ public: nb_.dist_traveled_th_ = 0.17; nb_.theta_traveled_th_ = 0.3; - nb_.cov_det_th_ = 0.4; + nb_.cov_det = 0.4; nb_.elapsed_time_th_ = 1.5; - nb_.unmeasured_perturbation_std_ = 1e-5; + nb_.unmeasured_perturbation_std = 1e-5; } const std::string path_to_io = "/tmp/"; @@ -58,9 +58,9 @@ TEST_F(WolfTestCerealSerializationProcessorParamsOdom2D, ASSERT_EQ(nb_load.name, nb_.name) << full_path; ASSERT_EQ(nb_load.dist_traveled_th_, nb_.dist_traveled_th_) << full_path; ASSERT_EQ(nb_load.theta_traveled_th_, nb_.theta_traveled_th_) << full_path; - ASSERT_EQ(nb_load.cov_det_th_, nb_.cov_det_th_) << full_path; - ASSERT_EQ(nb_load.unmeasured_perturbation_std_, - nb_.unmeasured_perturbation_std_) << full_path; + ASSERT_EQ(nb_load.cov_det, nb_.cov_det) << full_path; + ASSERT_EQ(nb_load.unmeasured_perturbation_std, + nb_.unmeasured_perturbation_std) << full_path; /// Testing BasePtr @@ -90,9 +90,9 @@ TEST_F(WolfTestCerealSerializationProcessorParamsOdom2D, ASSERT_EQ(nb_cast->name, nb_.name) << full_path; ASSERT_EQ(nb_cast->dist_traveled_th_, nb_.dist_traveled_th_) << full_path; ASSERT_EQ(nb_cast->theta_traveled_th_, nb_.theta_traveled_th_) << full_path; - ASSERT_EQ(nb_cast->cov_det_th_, nb_.cov_det_th_) << full_path; - ASSERT_EQ(nb_cast->unmeasured_perturbation_std_, - nb_.unmeasured_perturbation_std_) << full_path; + ASSERT_EQ(nb_cast->cov_det, nb_.cov_det) << full_path; + ASSERT_EQ(nb_cast->unmeasured_perturbation_std, + nb_.unmeasured_perturbation_std) << full_path; } } diff --git a/src/track_matrix.h b/src/track_matrix.h index b31771403721ac874e789eda4b415ee350f50e49..7198b84e22dd7cbf109884e893d0af99163a0694 100644 --- a/src/track_matrix.h +++ b/src/track_matrix.h @@ -85,8 +85,8 @@ class TrackMatrix void remove (CaptureBasePtr _cap); size_t numTracks (); size_t trackSize (size_t _track_id); - Track track (size_t _track_id); - Snapshot snapshot (CaptureBasePtr _capture); + Track track (size_t _track_id); + Snapshot snapshot (CaptureBasePtr _capture); vector<FeatureBasePtr> trackAsVector(size_t _track_id); list<FeatureBasePtr> @@ -104,7 +104,7 @@ class TrackMatrix // Along track: maps of Feature pointers indexed by time stamp. map<size_t, Track > tracks_; // map indexed by track_Id of ( maps indexed by TimeStamp of ( features ) ) - // Across track: maps of Feature pointers indexed by Feature Id. + // Across track: maps of Feature pointers indexed by track_Id. map<size_t, Snapshot > snapshots_; // map indexed by capture_Id of ( maps indexed by track_Id of ( features ) ) }; diff --git a/src/yaml/processor_image_yaml.cpp b/src/yaml/processor_image_yaml.cpp index 4c633baaf32265c9e7ba33c79905de7dd768fb01..7de4b1587de6fd5dbe5aa4b86e00ac46d68dbbb2 100644 --- a/src/yaml/processor_image_yaml.cpp +++ b/src/yaml/processor_image_yaml.cpp @@ -9,12 +9,13 @@ #include "yaml_conversion.h" // wolf -#include "../processor_params_image.h" #include "../factory.h" // yaml-cpp library #include <yaml-cpp/yaml.h> +#include "../processor_params_image.h" + namespace wolf { namespace @@ -24,7 +25,7 @@ static ProcessorParamsBasePtr createProcessorParamsImage(const std::string & _fi using std::string; using YAML::Node; - std::shared_ptr<ProcessorParamsImage> p = std::make_shared<ProcessorParamsImage>(); + std::shared_ptr<ProcessorParamsTrackerFeatureImage> p = std::make_shared<ProcessorParamsTrackerFeatureImage>(); Node params = YAML::LoadFile(_filename_dot_yaml); @@ -45,15 +46,15 @@ static ProcessorParamsBasePtr createProcessorParamsImage(const std::string & _fi } Node alg = params["algorithm"]; - p->algorithm.max_new_features = alg["maximum new features"].as<unsigned int>(); - p->algorithm.min_features_for_keyframe = alg["minimum features for new keyframe"].as<unsigned int>(); - p->algorithm.min_response_for_new_features = alg["minimum response for new features"].as<float>(); - p->algorithm.time_tolerance= alg["time tolerance"].as<Scalar>(); - p->algorithm.distance= alg["distance"].as<Scalar>(); + p->max_new_features = alg["maximum new features"].as<unsigned int>(); + p->min_features_for_keyframe = alg["minimum features for new keyframe"].as<unsigned int>(); + p->min_response_for_new_features = alg["minimum response for new features"].as<float>(); + p->time_tolerance= alg["time tolerance"].as<Scalar>(); + p->distance= alg["distance"].as<Scalar>(); Node noi = params["noise"]; - p->noise.pixel_noise_std = noi["pixel noise std"].as<Scalar>(); - p->noise.pixel_noise_var = p->noise.pixel_noise_std * p->noise.pixel_noise_std; + p->pixel_noise_std = noi["pixel noise std"].as<Scalar>(); + p->pixel_noise_var = p->pixel_noise_std * p->pixel_noise_std; } return p; diff --git a/src/yaml/processor_tracker_feature_trifocal_yaml.cpp b/src/yaml/processor_tracker_feature_trifocal_yaml.cpp index cb77aac131a61229e4d556426f6b19481f6cfea0..9e339d41aee83258fc9ecc2aaa0e9c76efdb8311 100644 --- a/src/yaml/processor_tracker_feature_trifocal_yaml.cpp +++ b/src/yaml/processor_tracker_feature_trifocal_yaml.cpp @@ -47,12 +47,17 @@ static ProcessorParamsBasePtr createProcessorParamsTrackerFeatureTrifocal(const std::string strNew = _filename_dot_yaml.substr (first,last-first); params->yaml_file_params_vision_utils = _filename_dot_yaml.substr (first,last-first) + "/" + params->yaml_file_params_vision_utils; - YAML::Node algorithm = config ["algorithm"]; - params->time_tolerance = algorithm["time tolerance"] .as<Scalar>(); - params->voting_active = algorithm["voting active"] .as<bool>(); + YAML::Node algorithm = config ["algorithm"]; + params->time_tolerance = algorithm["time tolerance"] .as<Scalar>(); + params->voting_active = algorithm["voting active"] .as<bool>(); + params->min_features_for_keyframe = algorithm["minimum features for keyframe"] .as<unsigned int>(); + params->max_new_features = algorithm["maximum new features"] .as<unsigned int>(); + params->n_cells_h = algorithm["grid horiz cells"] .as<int>(); + params->n_cells_v = algorithm["grid vert cells"] .as<int>(); + params->min_response_new_feature = algorithm["min response new features"] .as<int>(); + params->max_euclidean_distance = algorithm["max euclidean distance"] .as<Scalar>(); + params->min_track_length_for_constraint = algorithm["min track length for constraint"].as<int>(); - params->min_features_for_keyframe = algorithm["minimum features for keyframe"].as<unsigned int>(); - params->max_new_features = algorithm["maximum new features"] .as<unsigned int>(); YAML::Node noise = config["noise"]; params->pixel_noise_std = noise ["pixel noise std"].as<Scalar>();