diff --git a/src/processor/processor_odom_icp.cpp b/src/processor/processor_odom_icp.cpp index 4bbf3903b51f348927cb143eec8c30a3745b514f..aa7be21466c868189ab38f2df91718ec16f6b57f 100644 --- a/src/processor/processor_odom_icp.cpp +++ b/src/processor/processor_odom_icp.cpp @@ -50,10 +50,10 @@ unsigned int ProcessorOdomICP::processNew(const int& _max_features) Eigen::Vector3s t_identity; t_identity << 0, 0, 0; - // XXX: Dynamic or static? - CaptureLaser2DPtr incoming_ptr = std::static_pointer_cast<CaptureLaser2D>(incoming_ptr_); - CaptureLaser2DPtr last_ptr = std::static_pointer_cast<CaptureLaser2D>(last_ptr_); - SensorLaser2DPtr laser_sen = std::static_pointer_cast<SensorLaser2D>(this->getSensor()); + // XXX: Dynamic or static? JS: static is OK. + CaptureLaser2DPtr incoming_ptr = std::static_pointer_cast<CaptureLaser2D>(incoming_ptr_); + CaptureLaser2DPtr last_ptr = std::static_pointer_cast<CaptureLaser2D>(last_ptr_); + SensorLaser2DPtr laser_sen = std::static_pointer_cast<SensorLaser2D >(this->getSensor()); laserscanutils::LaserScanParams scan_params = laser_sen->getScanParams(); @@ -133,26 +133,27 @@ void ProcessorOdomICP::resetDerived() // x1_p_y1_y2: translation vector from y1 to y2 expressed in frame x1 // Rotation composition - Eigen::Rotation2D<Scalar> w_R_ro = Eigen::Rotation2D<Scalar>(origin_ptr_->getFrame()->getState()(2)); - Eigen::Rotation2D<Scalar> r_R_s = Eigen::Rotation2D<Scalar>(origin_ptr_->getSensorO()->getState()(0)); - Eigen::Rotation2D<Scalar> so_R_sl = Eigen::Rotation2D<Scalar>(origin_last_.res_transf(2)); + Eigen::Rotation2D<Scalar> w_R_ro = Eigen::Rotation2D<Scalar>(origin_ptr_->getFrame()->getState()(2)); + Eigen::Rotation2D<Scalar> r_R_s = Eigen::Rotation2D<Scalar>(origin_ptr_->getSensorO()->getState()(0)); + Eigen::Rotation2D<Scalar>& ro_R_so = r_R_s; + Eigen::Rotation2D<Scalar> so_R_sl = Eigen::Rotation2D<Scalar>(origin_last_.res_transf(2)); // Eigen::Rotation2D<Scalar> w_R_rl = w_R_ro*r_R_s*so_R_sl*r_R_s.inverse(); // ro_R_so = rl_R_sl = r_R_s // Planar rotations are commutative - Eigen::Rotation2D<Scalar> w_R_rl = w_R_ro*so_R_sl; + Eigen::Rotation2D<Scalar> w_R_rl = w_R_ro * so_R_sl; // Translation composition - Eigen::Vector2s w_p_w_ro = origin_ptr_->getFrame()->getState().head(2); - Eigen::Vector2s w_p_ro_so = w_R_ro*origin_ptr_->getSensorP()->getState(); - Eigen::Vector2s w_p_so_sl = w_R_ro*r_R_s*origin_last_.res_transf.head(2); - Eigen::Vector2s w_p_sl_rl = w_R_rl*(-last_ptr_->getSensorP()->getState()); + Eigen::Vector2s w_p_w_ro = origin_ptr_->getFrame()->getState().head(2); + Eigen::Vector2s w_p_ro_so = w_R_ro * origin_ptr_->getSensorP()->getState(); + Eigen::Vector2s w_p_so_sl = w_R_ro * ro_R_so * origin_last_.res_transf.head(2); + Eigen::Vector2s w_p_sl_rl = w_R_rl * (-last_ptr_->getSensorP()->getState()); Eigen::Vector2s w_p_w_rl = w_p_w_ro + w_p_ro_so + w_p_so_sl + w_p_sl_rl; Eigen::Vector3s curr_state; - curr_state.head(2) = w_p_w_rl; - curr_state(2) = origin_ptr_->getFrame()->getState()(2) + origin_last_.res_transf(2); + curr_state.head(2) = w_p_w_rl; + curr_state(2) = origin_ptr_->getFrame()->getState()(2) + origin_last_.res_transf(2); last_ptr_->getFrame()->setState(curr_state); std::cout << "[KEY FRAME DONE: ]" << '\n'; diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 97154f16bd8d4785a05b1811c26b61c0c53b64b6..f2f0efedd449111031bd1d6b9e7f3863509d07d5 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -16,6 +16,9 @@ target_link_libraries(gtest_example ${PLUGIN_NAME}) # wolf_add_gtest(gtest_landmark_polyline gtest_landmark_polyline.cpp) target_link_libraries(gtest_landmark_polyline ${PLUGIN_NAME} ${wolf_LIBRARY}) +wolf_add_gtest(gtest_processor_odom_icp gtest_processor_odom_icp.cpp) +target_link_libraries(gtest_processor_odom_icp ${PLUGIN_NAME} ${wolf_LIBRARY}) + wolf_add_gtest(gtest_polyline_2D gtest_polyline_2D.cpp) target_link_libraries(gtest_polyline_2D ${PLUGIN_NAME} ${wolf_LIBRARY}) diff --git a/test/gtest_processor_odom_icp.cpp b/test/gtest_processor_odom_icp.cpp new file mode 100644 index 0000000000000000000000000000000000000000..286a03e0c7325bb59ef1deeeace9906bd04a717c --- /dev/null +++ b/test/gtest_processor_odom_icp.cpp @@ -0,0 +1,42 @@ +/** + * \file gtest_processor_odom_icp.cpp + * + * Created on: Aug 6, 2019 + * \author: jsola + */ + +#include "laser/processor/processor_odom_icp.h" + +#include "core/utils/utils_gtest.h" + +using namespace wolf; + +TEST(ProcessorParamsOdomICP, print) +{ + auto params = std::make_shared<ProcessorParamsOdomICP>(); + + ASSERT_TRUE(params); // not nullptr + + params->use_corr_tricks = 15; + + ASSERT_EQ(params->use_corr_tricks, 15); + + WOLF_INFO("params: ", params->print()); +} + +TEST(ProcessorOdomIcp, Constructor) +{ + auto params = std::make_shared<ProcessorParamsOdomICP>(); + auto prc = std::make_shared<ProcessorOdomICP>(params); + + ASSERT_TRUE(prc); // not nullptr + ASSERT_EQ(prc->getType(), "ODOM ICP"); +} + +int main(int argc, char **argv) +{ + testing::InitGoogleTest(&argc, argv); +//::testing::GTEST_FLAG(filter) = "TestGroup.DummyTestExample"; + return RUN_ALL_TESTS(); +} +