diff --git a/src/capture_laser_2D.cpp b/src/capture_laser_2D.cpp index 91026341ed8d4a78b8dd6dd9ade25e4e2e902d46..432bb2234aa2517b941258babcb5470a6f188f03 100644 --- a/src/capture_laser_2D.cpp +++ b/src/capture_laser_2D.cpp @@ -50,15 +50,15 @@ void CaptureLaser2D::processCapture() //extract corners from range data extractCorners(corners); - std::cout << corners.size() << " corners extracted" << std::endl; + //std::cout << corners.size() << " corners extracted" << std::endl; //generate a feature for each corner createFeatures(corners); - std::cout << getFeatureListPtr()->size() << " Features created" << std::endl; + //std::cout << getFeatureListPtr()->size() << " Features created" << std::endl; //Establish constraints for each feature establishConstraints(); - std::cout << "Constraints created" << std::endl; + //std::cout << "Constraints created" << std::endl; } unsigned int CaptureLaser2D::extractCorners(std::list<laserscanutils::Corner> & _corner_list) const diff --git a/src/capture_odom_2D.cpp b/src/capture_odom_2D.cpp index 5c7b366cf74c8e300bdaff56688abf2e303fbaa3..c784db7bb02ae5b323d52e8862ec269268ddd7d6 100644 --- a/src/capture_odom_2D.cpp +++ b/src/capture_odom_2D.cpp @@ -6,16 +6,17 @@ CaptureOdom2D::CaptureOdom2D(const TimeStamp& _ts, SensorBase* _sensor_ptr) : // } -CaptureOdom2D::CaptureOdom2D(const TimeStamp& _ts, SensorBase* _sensor_ptr, const Eigen::VectorXs& _data) : +CaptureOdom2D::CaptureOdom2D(const TimeStamp& _ts, SensorBase* _sensor_ptr, const Eigen::Vector3s& _data) : CaptureRelative(_ts, _sensor_ptr, _data) { - data_covariance_ = Eigen::Matrix2s::Zero(); + data_covariance_ = Eigen::Matrix3s::Zero(); data_covariance_(0,0) = (_data(0) == 0 ? 1e-6 : _data(0))*((SensorOdom2D*)_sensor_ptr)->getDisplacementNoiseFactor(); - data_covariance_(1,1) = (_data(1) == 0 ? 1e-6 : _data(1))*((SensorOdom2D*)_sensor_ptr)->getRotationNoiseFactor(); + data_covariance_(1,1) = (_data(1) == 0 ? 1e-6 : _data(1))*((SensorOdom2D*)_sensor_ptr)->getDisplacementNoiseFactor(); + data_covariance_(2,2) = (_data(2) == 0 ? 1e-6 : _data(2))*((SensorOdom2D*)_sensor_ptr)->getRotationNoiseFactor(); // std::cout << data_covariance_ << std::endl; } -CaptureOdom2D::CaptureOdom2D(const TimeStamp& _ts, SensorBase* _sensor_ptr, const Eigen::VectorXs& _data, const Eigen::MatrixXs& _data_covariance) : +CaptureOdom2D::CaptureOdom2D(const TimeStamp& _ts, SensorBase* _sensor_ptr, const Eigen::Vector3s& _data, const Eigen::Matrix3s& _data_covariance) : CaptureRelative(_ts, _sensor_ptr, _data, _data_covariance) { // @@ -28,13 +29,13 @@ CaptureOdom2D::~CaptureOdom2D() inline void CaptureOdom2D::processCapture() { - //std::cout << "CaptureOdom2D::addFeature..." << std::endl; + //std::cout << "CaptureOdom2D::addFeature..." << std::endl; // ADD FEATURE - addFeature(new FeatureOdom2D(data_,data_covariance_)); + addFeature(new FeatureOdom2D(data_,data_covariance_)); - //std::cout << "CaptureOdom2D::addConstraints..." << std::endl; - // ADD CONSTRAINT - addConstraints(); + //std::cout << "CaptureOdom2D::addConstraints..." << std::endl; + // ADD CONSTRAINT + addConstraints(); } Eigen::VectorXs CaptureOdom2D::computePrior() const @@ -43,29 +44,43 @@ Eigen::VectorXs CaptureOdom2D::computePrior() const if (getFramePtr()->getOPtr()->getStateType() == ST_COMPLEX_ANGLE) { - Eigen::VectorXs prior(4); - Eigen::Map<Eigen::VectorXs> initial_pose(getFramePtr()->getPPtr()->getPtr(), 4); - - double prior_2 = initial_pose(2) * cos(data_(1)) - initial_pose(3) * sin(data_(1)); - double prior_3 = initial_pose(2) * sin(data_(1)) + initial_pose(3) * cos(data_(1)); - prior(0) = initial_pose(0) + data_(0) * prior_2; - prior(1) = initial_pose(1) + data_(0) * prior_3; - prior(2) = prior_2; - prior(3) = prior_3; + Eigen::Vector4s prior; + Eigen::Map<Eigen::Vector4s> initial_pose(getFramePtr()->getPPtr()->getPtr()); + ///std::cout << "initial_pose: " << initial_pose.transpose() << std::endl; +// WolfScalar prior_2 = initial_pose(2) * cos(data_(1)) - initial_pose(3) * sin(data_(1)); +// WolfScalar prior_3 = initial_pose(2) * sin(data_(1)) + initial_pose(3) * cos(data_(1)); +// prior(0) = initial_pose(0) + data_(0) * prior_2; +// prior(1) = initial_pose(1) + data_(0) * prior_3; +// prior(2) = prior_2; +// prior(3) = prior_3; + prior(0) = initial_pose(0) + data_(0) * initial_pose(2) - data_(1) * initial_pose(3); + prior(1) = initial_pose(1) + data_(0) * initial_pose(3) + data_(1) * initial_pose(2); + prior(2) = initial_pose(2) * cos(data_(2)) - initial_pose(3) * sin(data_(2)); + prior(3) = initial_pose(2) * sin(data_(2)) + initial_pose(3) * cos(data_(2)); + //std::cout << "data_: " << data_.transpose() << std::endl; + //std::cout << "prior: " << prior.transpose() << std::endl; return prior; } else { - Eigen::VectorXs prior(3); - Eigen::Map<Eigen::VectorXs> initial_pose(getFramePtr()->getPPtr()->getPtr(), 3); - - prior(0) = initial_pose(0) + data_(0) * cos(initial_pose(2) + (data_(1))); - prior(1) = initial_pose(1) + data_(0) * sin(initial_pose(2) + (data_(1))); - prior(2) = initial_pose(2) + data_(1); + Eigen::Vector3s prior; + Eigen::Map<Eigen::Vector3s> initial_pose(getFramePtr()->getPPtr()->getPtr()); + //std::cout << "initial_pose: " << initial_pose.transpose() << std::endl; + +// prior(0) = initial_pose(0) + data_(0) * cos(initial_pose(2) + (data_(1))); +// prior(1) = initial_pose(1) + data_(0) * sin(initial_pose(2) + (data_(1))); +// prior(2) = initial_pose(2) + data_(1); + prior(0) = initial_pose(0) + data_(0) * cos(initial_pose(2)) - data_(1) * sin(initial_pose(2)); + prior(1) = initial_pose(1) + data_(0) * sin(initial_pose(2)) + data_(1) * cos(initial_pose(2)); + prior(2) = initial_pose(2) + data_(2); + //std::cout << "data_: " << data_.transpose() << std::endl; + //std::cout << "prior: " << prior.transpose() << std::endl; return prior; } + + } void CaptureOdom2D::addConstraints() @@ -75,18 +90,18 @@ void CaptureOdom2D::addConstraints() if (getFramePtr()->getOPtr()->getStateType() == ST_COMPLEX_ANGLE) { getFeatureListPtr()->front()->addConstraint(new ConstraintOdom2DComplexAngle(getFeatureListPtr()->front(), - getFramePtr()->getPPtr(), - getFramePtr()->getOPtr(), - getFramePtr()->getNextFrame()->getPPtr(), - getFramePtr()->getNextFrame()->getOPtr())); + getFramePtr()->getPPtr(), + getFramePtr()->getOPtr(), + getFramePtr()->getNextFrame()->getPPtr(), + getFramePtr()->getNextFrame()->getOPtr())); } else { getFeatureListPtr()->front()->addConstraint(new ConstraintOdom2DTheta(getFeatureListPtr()->front(), - getFramePtr()->getPPtr(), - getFramePtr()->getOPtr(), - getFramePtr()->getNextFrame()->getPPtr(), - getFramePtr()->getNextFrame()->getOPtr())); + getFramePtr()->getPPtr(), + getFramePtr()->getOPtr(), + getFramePtr()->getNextFrame()->getPPtr(), + getFramePtr()->getNextFrame()->getOPtr())); } } @@ -94,8 +109,18 @@ void CaptureOdom2D::integrateCapture(CaptureRelative* _new_capture) { //std::cout << "Trying to integrate CaptureOdom2D" << std::endl; assert(dynamic_cast<CaptureOdom2D*>(_new_capture) && "Trying to integrate with a CaptureOdom2D a CaptureRelativePtr which is not CaptureOdom2D"); - data_(0) += _new_capture->getData()(0); - data_(1) += _new_capture->getData()(1); + +// data_(0) += _new_capture->getData()(0); +// data_(1) += _new_capture->getData()(1); + + //std::cout << "Integrate odoms: " << std::endl << data_.transpose() << std::endl << _new_capture->getData().transpose() << std::endl; + + data_(0) += (_new_capture->getData()(0) * cos(data_(2)) - _new_capture->getData()(1) * sin(data_(2))); + data_(1) += (_new_capture->getData()(0) * sin(data_(2)) + _new_capture->getData()(1) * cos(data_(2))); + data_(2) += _new_capture->getData()(2); + + //std::cout << "Integrated odoms: " << std::endl << data_.transpose() << std::endl; + data_covariance_ += _new_capture->getDataCovariance(); //std::cout << "integrated!" << std::endl; } diff --git a/src/capture_odom_2D.h b/src/capture_odom_2D.h index 035804e614c9a7c4b774b866e47c705e5db3d86f..11ac37349be6e527d4e6e1bdf473359029fd8686 100644 --- a/src/capture_odom_2D.h +++ b/src/capture_odom_2D.h @@ -16,9 +16,9 @@ class CaptureOdom2D : public CaptureRelative public: CaptureOdom2D(const TimeStamp& _ts, SensorBase* _sensor_ptr); - CaptureOdom2D(const TimeStamp& _ts, SensorBase* _sensor_ptr, const Eigen::VectorXs& _data); + CaptureOdom2D(const TimeStamp& _ts, SensorBase* _sensor_ptr, const Eigen::Vector3s& _data); - CaptureOdom2D(const TimeStamp& _ts, SensorBase* _sensor_ptr, const Eigen::VectorXs& _data, const Eigen::MatrixXs& _data_covariance); + CaptureOdom2D(const TimeStamp& _ts, SensorBase* _sensor_ptr, const Eigen::Vector3s& _data, const Eigen::Matrix3s& _data_covariance); virtual ~CaptureOdom2D(); diff --git a/src/constraint_odom_2D_complex_angle.h b/src/constraint_odom_2D_complex_angle.h index 320e86f0ac4f54db8f1b4ddf76a9f4e5baf6da9b..928df9f4947396c5e5eb13cb71d254f6470023c6 100644 --- a/src/constraint_odom_2D_complex_angle.h +++ b/src/constraint_odom_2D_complex_angle.h @@ -6,19 +6,19 @@ #include "wolf.h" #include "constraint_sparse.h" -class ConstraintOdom2DComplexAngle: public ConstraintSparse<2,2,2,2,2> +class ConstraintOdom2DComplexAngle: public ConstraintSparse<3,2,2,2,2> { public: - static const unsigned int N_BLOCKS = 2; + static const unsigned int N_BLOCKS = 4; ConstraintOdom2DComplexAngle(FeatureBase* _ftr_ptr, WolfScalar* _block0Ptr, WolfScalar* _block1Ptr, WolfScalar* _block2Ptr, WolfScalar* _block3Ptr) : - ConstraintSparse<2,2,2,2,2>(_ftr_ptr,CTR_ODOM_2D_COMPLEX_ANGLE, _block0Ptr, _block1Ptr, _block2Ptr, _block3Ptr) + ConstraintSparse<3,2,2,2,2>(_ftr_ptr,CTR_ODOM_2D_COMPLEX_ANGLE, _block0Ptr, _block1Ptr, _block2Ptr, _block3Ptr) { // } ConstraintOdom2DComplexAngle(FeatureBase* _ftr_ptr, StateBase* _state0Ptr, StateBase* _state1Ptr, StateBase* _state2Ptr, StateBase* _state3Ptr) : - ConstraintSparse<2,2,2,2,2>(_ftr_ptr,CTR_ODOM_2D_COMPLEX_ANGLE, _state0Ptr->getPtr(), _state1Ptr->getPtr(),_state2Ptr->getPtr(), _state3Ptr->getPtr()) + ConstraintSparse<3,2,2,2,2>(_ftr_ptr,CTR_ODOM_2D_COMPLEX_ANGLE, _state0Ptr->getPtr(), _state1Ptr->getPtr(),_state2Ptr->getPtr(), _state3Ptr->getPtr()) { // } @@ -32,12 +32,22 @@ class ConstraintOdom2DComplexAngle: public ConstraintSparse<2,2,2,2,2> bool operator()(const T* const _p1, const T* const _o1, const T* const _p2, const T* const _o2, T* _residuals) const { // Expected measurement - T expected_range = (_p2[0]-_p1[0])*(_p2[0]-_p1[0]) + (_p2[1]-_p1[1])*(_p2[1]-_p1[1]); //square of the range - T expected_rotation = atan2(_o2[1]*_o1[0] - _o2[0]*_o1[1], _o1[0]*_o2[0] + _o1[1]*_o2[1]); + // rotar per menys l'angle de primer _o1 + T expected_longitudinal = _o1[0]*(_p2[0]-_p1[0])+_o1[1]*(_p2[1]-_p1[1]); // cos(-o1)(x2-x1) - sin(-o1)(y2-y1) + T expected_lateral = -_o1[1]*(_p2[0]-_p1[0])+_o1[0]*(_p2[1]-_p1[1]); // sin(-o1)(x2-x1) + cos(-o1)(y2-y1) + T expected_rotation = atan2(_o2[1]*_o1[0] - _o2[0]*_o1[1], _o1[0]*_o2[0] + _o1[1]*_o2[1]); + + // Residuals + _residuals[0] = (expected_longitudinal - T(measurement_(0))) / T(measurement_covariance_(0,0)); + _residuals[1] = (expected_lateral - T(measurement_(1))) / T(measurement_covariance_(1,1)); + _residuals[2] = (expected_rotation - T(measurement_(2))) / T(measurement_covariance_(2,2)); + +// T expected_longitudinal = (_p2[0]-_p1[0])*(_p2[0]-_p1[0]) + (_p2[1]-_p1[1])*(_p2[1]-_p1[1]); //square of the range +// T expected_rotation = atan2(_o2[1]*_o1[0] - _o2[0]*_o1[1], _o1[0]*_o2[0] + _o1[1]*_o2[1]); // Residuals - _residuals[0] = (expected_range - T(measurement_(0))*T(measurement_(0))) / T(measurement_covariance_(0,0)); - _residuals[1] = (expected_rotation - T(measurement_(1))) / T(measurement_covariance_(1,1)); +// _residuals[0] = (expected_longitudinal - T(measurement_(0))*T(measurement_(0))) / T(measurement_covariance_(0,0)); +// _residuals[1] = (expected_rotation - T(measurement_(1))) / T(measurement_covariance_(1,1)); return true; } diff --git a/src/constraint_odom_2D_theta.h b/src/constraint_odom_2D_theta.h index f637169c3156d499f82f147c7f1f3259d21bbad8..f632e1b0e0cf7a6b0c08da076fdc7eca2fb43acd 100644 --- a/src/constraint_odom_2D_theta.h +++ b/src/constraint_odom_2D_theta.h @@ -6,19 +6,19 @@ #include "wolf.h" #include "constraint_sparse.h" -class ConstraintOdom2DTheta: public ConstraintSparse<2,2,1,2,1> +class ConstraintOdom2DTheta: public ConstraintSparse<3,2,1,2,1> { public: - static const unsigned int N_BLOCKS = 2; + static const unsigned int N_BLOCKS = 4; ConstraintOdom2DTheta(FeatureBase*_ftr_ptr, WolfScalar* _block0Ptr, WolfScalar* _block1Ptr, WolfScalar* _block2Ptr, WolfScalar* _block3Ptr) : - ConstraintSparse<2,2,1,2,1>(_ftr_ptr,CTR_ODOM_2D_THETA, _block0Ptr, _block1Ptr, _block2Ptr, _block3Ptr) + ConstraintSparse<3,2,1,2,1>(_ftr_ptr,CTR_ODOM_2D_THETA, _block0Ptr, _block1Ptr, _block2Ptr, _block3Ptr) { // } ConstraintOdom2DTheta(FeatureBase* _ftr_ptr, StateBase* _state0Ptr, StateBase* _state1Ptr, StateBase* _state2Ptr, StateBase* _state3Ptr) : - ConstraintSparse<2,2,1,2,1>(_ftr_ptr,CTR_ODOM_2D_THETA, _state0Ptr->getPtr(), _state1Ptr->getPtr(),_state2Ptr->getPtr(), _state3Ptr->getPtr()) + ConstraintSparse<3,2,1,2,1>(_ftr_ptr,CTR_ODOM_2D_THETA, _state0Ptr->getPtr(), _state1Ptr->getPtr(),_state2Ptr->getPtr(), _state3Ptr->getPtr()) { // } @@ -32,12 +32,23 @@ class ConstraintOdom2DTheta: public ConstraintSparse<2,2,1,2,1> bool operator()(const T* const _p1, const T* const _o1, const T* const _p2, const T* const _o2, T* _residuals) const { // Expected measurement - T expected_range = (_p2[0]-_p1[0])*(_p2[0]-_p1[0]) + (_p2[1]-_p1[1])*(_p2[1]-_p1[1]); //square of the range - T expected_rotation = _o2[0]-_o1[0]; - - // Residuals - _residuals[0] = (expected_range - T(measurement_(0))*T(measurement_(0))) / T(measurement_covariance_(0,0)); - _residuals[1] = (expected_rotation - T(measurement_(1))) / T(measurement_covariance_(1,1)); + // rotar per menys l'angle de primer _o1 + T expected_longitudinal = cos(_o1[0])*(_p2[0]-_p1[0])+sin(_o1[0])*(_p2[1]-_p1[1]); // cos(-o1)(x2-x1) - sin(-o1)(y2-y1) + T expected_lateral = -sin(_o1[0])*(_p2[0]-_p1[0])+cos(_o1[0])*(_p2[1]-_p1[1]); // sin(-o1)(x2-x1) + cos(-o1)(y2-y1) + T expected_rotation = _o2[0]-_o1[0]; + + // Residuals + _residuals[0] = (expected_longitudinal - T(measurement_(0))) / T(measurement_covariance_(0,0)); + _residuals[1] = (expected_lateral - T(measurement_(1))) / T(measurement_covariance_(1,1)); + _residuals[2] = (expected_rotation - T(measurement_(2))) / T(measurement_covariance_(2,2)); + + // Expected measurement +// T expected_range = (_p2[0]-_p1[0])*(_p2[0]-_p1[0]) + (_p2[1]-_p1[1])*(_p2[1]-_p1[1]); //square of the range +// T expected_rotation = _o2[0]-_o1[0]; +// +// // Residuals +// _residuals[0] = (expected_range - T(measurement_(0))*T(measurement_(0))) / T(measurement_covariance_(0,0)); +// _residuals[1] = (expected_rotation - T(measurement_(1))) / T(measurement_covariance_(1,1)); return true; } diff --git a/src/examples/CMakeLists.txt b/src/examples/CMakeLists.txt index 849bbf0537273a806af510f5c3d4b6b7f548280b..5f0cafb7e9d06ac6e6ff7043ec6942b8772067cc 100644 --- a/src/examples/CMakeLists.txt +++ b/src/examples/CMakeLists.txt @@ -49,11 +49,11 @@ TARGET_LINK_LIBRARIES(test_ceres_covariance ${PROJECT_NAME}) IF(faramotics_FOUND) IF (laser_scan_utils_FOUND) - ADD_EXECUTABLE(test_ceres_laser test_ceres_laser.cpp) - TARGET_LINK_LIBRARIES(test_ceres_laser - ${pose_state_time_LIBRARIES} - ${faramotics_LIBRARIES} - ${PROJECT_NAME}) +# ADD_EXECUTABLE(test_ceres_laser test_ceres_laser.cpp) +# TARGET_LINK_LIBRARIES(test_ceres_laser +# ${pose_state_time_LIBRARIES} +# ${faramotics_LIBRARIES} +# ${PROJECT_NAME}) ADD_EXECUTABLE(test_ceres_2_lasers test_ceres_2_lasers.cpp) TARGET_LINK_LIBRARIES(test_ceres_2_lasers diff --git a/src/examples/test_ceres_2_lasers.cpp b/src/examples/test_ceres_2_lasers.cpp index bf0a8a8cc349257129574792818b0fb3f9ca7ec3..6ca7d84363634c8e9e4dea24c97c0582bfa31345 100644 --- a/src/examples/test_ceres_2_lasers.cpp +++ b/src/examples/test_ceres_2_lasers.cpp @@ -154,7 +154,8 @@ int main(int argc, char** argv) myScanner->loadAssimpModel(modelFileName); //variables - Eigen::Vector2s odom_reading, gps_fix_reading; + Eigen::Vector3s odom_reading; + Eigen::Vector2s gps_fix_reading; Eigen::VectorXs pose_odom(3); //current odometry integred pose Eigen::VectorXs ground_truth(n_execution*3); //all true poses Eigen::VectorXs odom_trajectory(n_execution*3); //open loop trajectory @@ -175,9 +176,9 @@ int main(int argc, char** argv) ground_truth.head(3) = pose_odom; odom_trajectory.head(3) = pose_odom; - WolfManager* wolf_manager = new WolfManager(&odom_sensor, complex_angle, 1e9, pose_odom, 0.1, window_size); + WolfManager* wolf_manager = new WolfManager(&odom_sensor, complex_angle, 1e9, pose_odom, 0.3, window_size); - std::cout << "START TRAJECTORY..." << std::endl; + //std::cout << "START TRAJECTORY..." << std::endl; // START TRAJECTORY ============================================================================================ for (uint step=1; step < n_execution; step++) { @@ -188,7 +189,8 @@ int main(int argc, char** argv) //std::cout << "ROBOT MOVEMENT..." << std::endl; // moves the device position t1=clock(); - motionCampus(step, devicePose, odom_reading(0), odom_reading(1)); + motionCampus(step, devicePose, odom_reading(0), odom_reading(2)); + odom_reading(1) = 0; devicePoses.push_back(devicePose); @@ -198,12 +200,13 @@ int main(int argc, char** argv) ground_truth.segment(step*3,3) << devicePose.pt(0), devicePose.pt(1), devicePose.rt.head(); // compute odometry - odom_reading(0) += distribution_odom(generator)*(odom_reading(0) == 0 ? 1e-6 : odom_reading(0)); - odom_reading(1) += distribution_odom(generator)*(odom_reading(1) == 0 ? 1e-6 : odom_reading(1)); + odom_reading(0) += distribution_odom(generator)*(odom_reading(0) == 0 ? 1e-6 : odom_reading(0)); + odom_reading(1) += distribution_odom(generator)*1e-6; + odom_reading(2) += distribution_odom(generator)*(odom_reading(2) == 0 ? 1e-6 : odom_reading(2)); // odometry integration - pose_odom(0) = pose_odom(0) + odom_reading(0) * cos(pose_odom(2)); - pose_odom(1) = pose_odom(1) + odom_reading(0) * sin(pose_odom(2)); + pose_odom(0) = pose_odom(0) + odom_reading(0) * cos(pose_odom(2)) - odom_reading(1) * sin(pose_odom(2)); + pose_odom(1) = pose_odom(1) + odom_reading(0) * sin(pose_odom(2)) + odom_reading(1) * cos(pose_odom(2)); pose_odom(2) = pose_odom(2) + odom_reading(1); odom_trajectory.segment(step*3,3) = pose_odom; diff --git a/src/frame_base.cpp b/src/frame_base.cpp index 2068eb45f079f296abfda6951367b38358c717fe..4d539d6752a2929c3795dbff4ca93f3e6b2d9a27 100644 --- a/src/frame_base.cpp +++ b/src/frame_base.cpp @@ -114,15 +114,18 @@ StateStatus FrameBase::getStatus() const void FrameBase::setState(const Eigen::VectorXs& _st) { - assert(_st.size() == ((!p_ptr_ ? 0 : p_ptr_->getStateSize()) + - (!o_ptr_ ? 0 : o_ptr_->getStateSize()) + - (!v_ptr_ ? 0 : v_ptr_->getStateSize()) + - (!w_ptr_ ? 0 : w_ptr_->getStateSize())) && - "In FrameBase::setState wrong state size"); + + assert(_st.size() == ((p_ptr_==nullptr ? 0 : p_ptr_->getStateSize()) + + (o_ptr_==nullptr ? 0 : o_ptr_->getStateSize()) + + (v_ptr_==nullptr ? 0 : v_ptr_->getStateSize()) + + (w_ptr_==nullptr ? 0 : w_ptr_->getStateSize())) && + "In FrameBase::setState wrong state size"); assert(p_ptr_!=nullptr && "in FrameBase::setState(), p_ptr_ is nullptr"); Eigen::Map<Eigen::VectorXs> state_map(p_ptr_->getPtr(), _st.size()); + //std::cout << "setting state\noriginal: " << state_map.transpose() << "\nnew: " << _st.transpose() << std::endl; state_map = _st; + //std::cout << "setted state: " << *p_ptr_->getPtr() << " " << *(p_ptr_->getPtr()+1) << std::endl; } void FrameBase::addCapture(CaptureBase* _capt_ptr) diff --git a/src/wolf_manager.h b/src/wolf_manager.h index ddee86ca39a23d045a463a0a7ca33bfc63a4e985..8e5e30f862b4491a03741aa364879964e06c6805 100644 --- a/src/wolf_manager.h +++ b/src/wolf_manager.h @@ -49,6 +49,7 @@ class WolfManager unsigned int window_size_; FrameBaseIter first_window_frame_; CaptureRelative* last_capture_relative_; + CaptureRelative* second_last_capture_relative_; WolfScalar new_frame_elapsed_time_; public: @@ -57,7 +58,9 @@ class WolfManager problem_(new WolfProblem(_state_length)), sensor_prior_(_sensor_prior), window_size_(_w_size), - new_frame_elapsed_time_(_new_frame_elapsed_time) + new_frame_elapsed_time_(_new_frame_elapsed_time), + last_capture_relative_(nullptr), + second_last_capture_relative_(nullptr) { createFrame(_init_frame, TimeStamp(0)); problem_->getTrajectoryPtr()->getFrameListPtr()->back()->fix(); @@ -85,11 +88,10 @@ class WolfManager problem_->getTrajectoryPtr()->addFrame(new FrameBase(_time_stamp, new_position, new_orientation)); // add a zero odometry capture (in order to integrate) - problem_->getTrajectoryPtr()->getFrameListPtr()->back()->addCapture(new CaptureOdom2D(_time_stamp, - sensor_prior_, - Eigen::Vector2s::Zero(), - Eigen::Matrix2s::Zero())); - last_capture_relative_ = (CaptureRelative*)(problem_->getTrajectoryPtr()->getFrameListPtr()->back()->getCaptureListPtr()->front()); + CaptureOdom2D* empty_odom = new CaptureOdom2D(_time_stamp,sensor_prior_,Eigen::Vector3s::Zero(),Eigen::Matrix3s::Zero()); + problem_->getTrajectoryPtr()->getFrameListPtr()->back()->addCapture(empty_odom); + second_last_capture_relative_ = last_capture_relative_; + last_capture_relative_ = (CaptureRelative*)(empty_odom); } void addCapture(CaptureBase* _capture) @@ -109,27 +111,32 @@ class WolfManager // ODOMETRY SENSOR if (new_capture->getSensorPtr() == sensor_prior_) { - // INTEGRATING ODOMETRY CAPTURE & COMPUTING PRIOR - //std::cout << "integrating captures " << last_capture_relative_->nodeId() << " " << new_capture->nodeId() << std::endl; + // UPDATE LAST STATE FROM SECOND LAST (optimized) + if (second_last_capture_relative_ != nullptr) + problem_->getTrajectoryPtr()->getFrameListPtr()->back()->setState(second_last_capture_relative_->computePrior()); + + // INTEGRATE NEW ODOMETRY TO LAST FRAME last_capture_relative_->integrateCapture((CaptureRelative*)(new_capture)); - // NEW KEY FRAME (if enough time from last frame) + // INITIALIZE STAMP OF FIRST FRAME //std::cout << "new TimeStamp - last Frame TimeStamp = " << new_capture->getTimeStamp().get() - problem_->getTrajectoryPtr()->getFrameListPtr()->back()->getTimeStamp().get() << std::endl; if (problem_->getTrajectoryPtr()->getFrameListPtr()->back()->getTimeStamp().get() == 0) problem_->getTrajectoryPtr()->getFrameListPtr()->back()->setTimeStamp(new_capture->getTimeStamp()); - else if (new_capture->getTimeStamp().get() - problem_->getTrajectoryPtr()->getFrameListPtr()->back()->getTimeStamp().get() > new_frame_elapsed_time_) + + // NEW KEY FRAME (if enough time from last frame) + if (new_capture->getTimeStamp().get() - problem_->getTrajectoryPtr()->getFrameListPtr()->back()->getTimeStamp().get() > new_frame_elapsed_time_) { //std::cout << "store prev frame" << std::endl; - auto previous_frame_ptr = problem_->getTrajectoryPtr()->getFrameListPtr()->back(); + auto second_last_frame_ptr = problem_->getTrajectoryPtr()->getFrameListPtr()->back(); - // NEW FRAME + // NEW CURRENT FRAME //std::cout << "new frame" << std::endl; createFrame(last_capture_relative_->computePrior(), new_capture->getTimeStamp()); // COMPUTE PREVIOUS FRAME CAPTURES //std::cout << "compute prev frame" << std::endl; - for (auto capture_it = previous_frame_ptr->getCaptureListPtr()->begin(); capture_it != previous_frame_ptr->getCaptureListPtr()->end(); capture_it++) - (*capture_it)->processCapture(); + for (auto capture_it = second_last_frame_ptr->getCaptureListPtr()->begin(); capture_it != second_last_frame_ptr->getCaptureListPtr()->end(); capture_it++) + (*capture_it)->processCapture(); // WINDOW of FRAMES (remove or fix old frames) //std::cout << "frame window" << std::endl; @@ -168,6 +175,9 @@ class WolfManager Eigen::VectorXs getVehiclePose() { + if (second_last_capture_relative_ != nullptr) + problem_->getTrajectoryPtr()->getFrameListPtr()->back()->setState(second_last_capture_relative_->computePrior()); + //std::cout << "getVehiclePose +++++++++++++++++++++++++\n"; return last_capture_relative_->computePrior(); } @@ -175,4 +185,14 @@ class WolfManager { return problem_; } + + void setWindowSize(const unsigned int& _size) + { + window_size_ = _size; + } + + void setNewFrameElapsedTime( const WolfScalar& _dt) + { + new_frame_elapsed_time_ = _dt; + } };