diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 88bcfc88a48286994ec38aee96c3cb44eb25a200..b05f5636dd989dc18fed2a63d8b4b92047cffa55 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -139,6 +139,10 @@ target_link_libraries(gtest_shared_from_this ${PLUGIN_NAME}) wolf_add_gtest(gtest_solver_manager gtest_solver_manager.cpp) target_link_libraries(gtest_solver_manager ${PLUGIN_NAME}) +# SolverManagerMultithread test +wolf_add_gtest(gtest_solver_manager_multithread gtest_solver_manager_multithread.cpp) +target_link_libraries(gtest_solver_manager_multithread ${PLUGIN_NAME}) + # StateBlock class test wolf_add_gtest(gtest_state_block gtest_state_block.cpp) target_link_libraries(gtest_state_block ${PLUGIN_NAME}) @@ -250,9 +254,13 @@ wolf_add_gtest(gtest_sensor_diff_drive gtest_sensor_diff_drive.cpp) target_link_libraries(gtest_sensor_diff_drive ${PLUGIN_NAME}) IF (Ceres_FOUND) -# SolverCeres test -wolf_add_gtest(gtest_solver_ceres gtest_solver_ceres.cpp) -target_link_libraries(gtest_solver_ceres ${PLUGIN_NAME}) + # SolverCeres test + wolf_add_gtest(gtest_solver_ceres gtest_solver_ceres.cpp) + target_link_libraries(gtest_solver_ceres ${PLUGIN_NAME}) + + # SolverCeresMultithread test + wolf_add_gtest(gtest_solver_ceres_multithread gtest_solver_ceres_multithread.cpp) + target_link_libraries(gtest_solver_ceres_multithread ${PLUGIN_NAME}) ENDIF(Ceres_FOUND) # TreeManagerSlidingWindow class test diff --git a/test/gtest_solver_ceres.cpp b/test/gtest_solver_ceres.cpp index 9fe0e4306704919bcd7ab234716a3acf107e0227..e5efa2dff18a27131a13cb173e064edad2d0a3c2 100644 --- a/test/gtest_solver_ceres.cpp +++ b/test/gtest_solver_ceres.cpp @@ -1514,49 +1514,6 @@ TEST(SolverCeres, OnlyFactor_AddRemove) EXPECT_TRUE(solver_ptr->check()); } -//////////////////////////////////////////////////////// -// MULTITHREADING - -TEST(SolverCeres, MultiThreadingTruncatedNotifications) -{ - double Dt = 5.0; - ProblemPtr P = Problem::create("PO", 2); - auto solver_ptr = std::make_shared<SolverCeres>(P); - - // loop updating (without sleep) - std::thread t([&](){ - auto start_t = std::chrono::high_resolution_clock::now(); - while (true) - { - solver_ptr->update(); - ASSERT_TRUE(solver_ptr->check()); - if (std::chrono::duration_cast<std::chrono::duration<double>>(std::chrono::high_resolution_clock::now() - start_t).count() > Dt) - break; - }}); - - // loop emplacing and removing frames (window of 10 KF) - auto start = std::chrono::high_resolution_clock::now(); - TimeStamp ts(0); - while (true) - { - // Emplace Frame, Capture, feature and factor pose 2d - FrameBasePtr F = P->emplaceKeyFrame(ts, P->stateZero()); - auto C = CaptureBase::emplace<CaptureVoid>(F, ts, nullptr); - auto f = FeatureBase::emplace<FeatureBase>(C, "FeaturePose2d", Vector3d::Zero(), Matrix3d::Identity()); - auto c = FactorBase::emplace<FactorPose2d>(f, f, nullptr, false); - - ts += 1.0; - - if (P->getTrajectory()->getFrameMap().size() > 10) - (*P->getTrajectory()->begin())->remove(); - - if (std::chrono::duration_cast<std::chrono::duration<double>>(std::chrono::high_resolution_clock::now() - start).count() > Dt) - break; - } - - t.join(); -} - int main(int argc, char **argv) { testing::InitGoogleTest(&argc, argv); diff --git a/test/gtest_solver_ceres_multithread.cpp b/test/gtest_solver_ceres_multithread.cpp new file mode 100644 index 0000000000000000000000000000000000000000..91fa716cb45d02c14bf9dad6068c4d6f4bae6780 --- /dev/null +++ b/test/gtest_solver_ceres_multithread.cpp @@ -0,0 +1,81 @@ +/* + * gtest_solver_ptr.cpp + * + * Created on: Jun, 2018 + * Author: jvallve + */ + +#include "core/utils/utils_gtest.h" + +#include "core/problem/problem.h" +#include "core/sensor/sensor_base.h" +#include "core/state_block/state_block.h" +#include "core/capture/capture_void.h" +#include "core/factor/factor_pose_2d.h" +#include "core/factor/factor_quaternion_absolute.h" +#include "core/factor/factor_block_absolute.h" +#include "core/state_block/local_parametrization_angle.h" +#include "core/state_block/local_parametrization_quaternion.h" + +#include "core/solver/solver_manager.h" +#include "core/ceres_wrapper/solver_ceres.h" +#include "core/ceres_wrapper/local_parametrization_wrapper.h" + +#include "ceres/ceres.h" + +#include <iostream> + +using namespace wolf; +using namespace Eigen; + +/* + * Following tests are the same as in gtest_solver_manager_multithread.cpp + * (modifications should be applied to both tests) + */ + +TEST(SolverCeresMultithread, MultiThreadingTruncatedNotifications) +{ + double Dt = 5.0; + ProblemPtr P = Problem::create("PO", 2); + auto solver_ptr = std::make_shared<SolverCeres>(P); + + // loop updating (without sleep) + std::thread t([&](){ + auto start_t = std::chrono::high_resolution_clock::now(); + while (true) + { + solver_ptr->update(); + ASSERT_TRUE(solver_ptr->check()); + if (std::chrono::duration_cast<std::chrono::duration<double>>(std::chrono::high_resolution_clock::now() - start_t).count() > Dt) + break; + }}); + + // loop emplacing and removing frames (window of 10 KF) + auto start = std::chrono::high_resolution_clock::now(); + TimeStamp ts(0); + while (true) + { + // Emplace Frame, Capture, feature and factor pose 2d + FrameBasePtr F = P->emplaceKeyFrame(ts, P->stateZero()); + auto C = CaptureBase::emplace<CaptureVoid>(F, ts, nullptr); + auto f = FeatureBase::emplace<FeatureBase>(C, "FeaturePose2d", Vector3d::Zero(), Matrix3d::Identity()); + auto c = FactorBase::emplace<FactorPose2d>(f, f, nullptr, false); + + ts += 1.0; + + if (P->getTrajectory()->getFrameMap().size() > 10) + (*P->getTrajectory()->begin())->remove(); + + if (std::chrono::duration_cast<std::chrono::duration<double>>(std::chrono::high_resolution_clock::now() - start).count() > Dt) + break; + } + + t.join(); +} + +int main(int argc, char **argv) +{ + testing::InitGoogleTest(&argc, argv); + return RUN_ALL_TESTS(); +} + diff --git a/test/gtest_solver_manager.cpp b/test/gtest_solver_manager.cpp index 5226e125d79e059b29fbbfc3a432ce72452ef43c..2eb3f46e927270a7e61abb03734d01898722f471 100644 --- a/test/gtest_solver_manager.cpp +++ b/test/gtest_solver_manager.cpp @@ -1509,49 +1509,6 @@ TEST(SolverManager, OnlyFactor_AddRemove) EXPECT_TRUE(solver_ptr->check()); } -//////////////////////////////////////////////////////// -// MULTITHREADING - -TEST(SolverManager, MultiThreadingTruncatedNotifications) -{ - double Dt = 5.0; - ProblemPtr P = Problem::create("PO", 2); - auto solver_ptr = std::make_shared<SolverManagerDummy>(P); - - // loop updating (without sleep) - std::thread t([&](){ - auto start_t = std::chrono::high_resolution_clock::now(); - while (true) - { - solver_ptr->update(); - ASSERT_TRUE(solver_ptr->check()); - if (std::chrono::duration_cast<std::chrono::duration<double>>(std::chrono::high_resolution_clock::now() - start_t).count() > Dt) - break; - }}); - - // loop emplacing and removing frames (window of 10 KF) - auto start = std::chrono::high_resolution_clock::now(); - TimeStamp ts(0); - while (true) - { - // Emplace Frame, Capture, feature and factor pose 2d - FrameBasePtr F = P->emplaceKeyFrame(ts, P->stateZero()); - auto C = CaptureBase::emplace<CaptureVoid>(F, ts, nullptr); - auto f = FeatureBase::emplace<FeatureBase>(C, "FeaturePose2d", Vector3d::Zero(), Matrix3d::Identity()); - auto c = FactorBase::emplace<FactorPose2d>(f, f, nullptr, false); - - ts += 1.0; - - if (P->getTrajectory()->getFrameMap().size() > 10) - (*P->getTrajectory()->begin())->remove(); - - if (std::chrono::duration_cast<std::chrono::duration<double>>(std::chrono::high_resolution_clock::now() - start).count() > Dt) - break; - } - - t.join(); -} - int main(int argc, char **argv) { testing::InitGoogleTest(&argc, argv); diff --git a/test/gtest_solver_manager_multithread.cpp b/test/gtest_solver_manager_multithread.cpp new file mode 100644 index 0000000000000000000000000000000000000000..0770b33aed43e5ebbc9a204e68428f7a0022c870 --- /dev/null +++ b/test/gtest_solver_manager_multithread.cpp @@ -0,0 +1,75 @@ +/* + * gtest_solver_manager.cpp + * + * Created on: Jun, 2018 + * Author: jvallve + */ + +#include "core/utils/utils_gtest.h" + + +#include "core/problem/problem.h" +#include "core/sensor/sensor_base.h" +#include "core/state_block/state_block.h" +#include "core/capture/capture_void.h" +#include "core/factor/factor_pose_2d.h" +#include "core/factor/factor_block_absolute.h" +#include "core/state_block/local_parametrization_quaternion.h" +#include "dummy/solver_manager_dummy.h" + +#include <iostream> +#include <thread> + +using namespace wolf; +using namespace Eigen; + +/* + * Following tests are the same as in gtest_solver_ceres_multithread.cpp + * (modifications should be applied to both tests) + */ + +TEST(SolverManagerMultithread, MultiThreadingTruncatedNotifications) +{ + double Dt = 5.0; + ProblemPtr P = Problem::create("PO", 2); + auto solver_ptr = std::make_shared<SolverManagerDummy>(P); + + // loop updating (without sleep) + std::thread t([&](){ + auto start_t = std::chrono::high_resolution_clock::now(); + while (true) + { + solver_ptr->update(); + ASSERT_TRUE(solver_ptr->check()); + if (std::chrono::duration_cast<std::chrono::duration<double>>(std::chrono::high_resolution_clock::now() - start_t).count() > Dt) + break; + }}); + + // loop emplacing and removing frames (window of 10 KF) + auto start = std::chrono::high_resolution_clock::now(); + TimeStamp ts(0); + while (true) + { + // Emplace Frame, Capture, feature and factor pose 2d + FrameBasePtr F = P->emplaceKeyFrame(ts, P->stateZero()); + auto C = CaptureBase::emplace<CaptureVoid>(F, ts, nullptr); + auto f = FeatureBase::emplace<FeatureBase>(C, "FeaturePose2d", Vector3d::Zero(), Matrix3d::Identity()); + auto c = FactorBase::emplace<FactorPose2d>(f, f, nullptr, false); + + ts += 1.0; + + if (P->getTrajectory()->getFrameMap().size() > 10) + (*P->getTrajectory()->begin())->remove(); + + if (std::chrono::duration_cast<std::chrono::duration<double>>(std::chrono::high_resolution_clock::now() - start).count() > Dt) + break; + } + + t.join(); +} + +int main(int argc, char **argv) +{ + testing::InitGoogleTest(&argc, argv); + return RUN_ALL_TESTS(); +}