diff --git a/src/processor/processor_odom_icp.cpp b/src/processor/processor_odom_icp.cpp index 5f4b73184c337e9ea3f8135162e7882d8f417f14..da6d7d2b1426d81605d1803305375c03d4e1fb00 100644 --- a/src/processor/processor_odom_icp.cpp +++ b/src/processor/processor_odom_icp.cpp @@ -41,8 +41,14 @@ void ProcessorOdomIcp::preProcess() else if (params_odom_icp_->initial_guess == "state" ) { odom_incoming_ = getProblem()->getState("PO").vector("PO"); - odom_last_ = getProblem()->getState(last_ptr_->getTimeStamp(), "PO").vector("PO"); - odom_origin_ = getProblem()->getState(origin_ptr_->getTimeStamp(), "PO").vector("PO"); + if(last_ptr_) + { + odom_last_ = getProblem()->getState(last_ptr_->getTimeStamp(), "PO").vector("PO"); + } + if(origin_ptr_) + { + odom_origin_ = getProblem()->getState(origin_ptr_->getTimeStamp(), "PO").vector("PO"); + } } assert(odom_incoming_.size() == 3); @@ -63,15 +69,14 @@ unsigned int ProcessorOdomIcp::processKnown() CaptureLaser2dPtr origin_ptr = std::static_pointer_cast<CaptureLaser2d>(origin_ptr_); CaptureLaser2dPtr incoming_ptr = std::static_pointer_cast<CaptureLaser2d>(incoming_ptr_); - Eigen::Vector3d initial_guess; + Eigen::Vector3d initial_guess = this->trf_origin_last_.res_transf; if (params_odom_icp_->initial_guess == "odom" or params_odom_icp_->initial_guess == "state" ) { - initial_guess.head(2) = Eigen::Rotation2Dd(-odom_incoming_(2)) * (odom_origin_.head(2) - odom_incoming_.head(2)); - initial_guess(2) = -(odom_incoming_(2) - odom_origin_(2)); + //TODO: Add sensor extrinsics + initial_guess.head(2) += Eigen::Rotation2Dd(-odom_origin_(2)) * (odom_last_.head(2) - odom_incoming_.head(2)); + initial_guess(2) += -(odom_incoming_(2) - odom_last_(2)); } - else if (params_odom_icp_->initial_guess == "zero") - initial_guess = this->trf_origin_last_.res_transf; - else + else if (params_odom_icp_->initial_guess != "zero") throw std::runtime_error("unknown value for param 'initial_guess'. Should be 'odom', 'state' or 'zero'"); trf_origin_incoming_ = icp_tools_ptr_->align(incoming_ptr->getScan(), @@ -102,6 +107,8 @@ unsigned int ProcessorOdomIcp::processNew(const int& _max_features) initial_guess.head(2) = Eigen::Rotation2Dd(-odom_incoming_(2)) * (odom_last_.head(2) - odom_incoming_.head(2)); initial_guess(2) = -(odom_incoming_(2) - odom_last_(2)); } + else if (params_odom_icp_->initial_guess != "zero") + throw std::runtime_error("unknown value for param 'initial_guess'. Should be 'odom', 'state' or 'zero'"); trf_last_incoming_ = icp_tools_ptr_->align(incoming_ptr->getScan(), last_ptr->getScan(),